From 4744bd907e6750c26bba4354d986e342406147ca Mon Sep 17 00:00:00 2001 From: jlovell Date: Sat, 4 Mar 2006 15:56:42 +0000 Subject: [PATCH] Load cups into easysw/current. git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@75 a1ca3aef-8c08-0410-bb20-df032aa958be --- CGI.txt | 81 - ENCRYPTION.txt | 142 - INSTALL.txt | 244 +- LICENSE.txt | 4 +- Makefile | 28 +- README.txt | 352 +- cgi-bin/classes.c | 9 +- cgi-bin/help.c | 26 +- cgi-bin/printers.c | 9 +- cups/http.c | 6 +- doc/Makefile | 167 +- doc/cmp.html | 755 -- doc/cmp.pdf | Bin 300850 -> 0 bytes doc/cmp.shtml | 737 -- doc/cups-printable.css | 126 + doc/cups.css | 11 +- doc/cupsdoc.css | 9 - doc/figures.sc | Bin 75144 -> 0 bytes doc/glossary.shtml | 73 - doc/help/glossary.html | 219 + LICENSE.html => doc/help/license.html | 107 +- doc/help/options.html | 474 + doc/help/overview.html | 592 +- ...log-reference.html => ref-access_log.html} | 4 +- ...f-reference.html => ref-classes-conf.html} | 4 +- ...nf-reference.html => ref-client-conf.html} | 0 ...onf-reference.html => ref-cupsd-conf.html} | 0 ..._log-reference.html => ref-error_log.html} | 2 +- ...e_log-reference.html => ref-page_log.html} | 0 ...-reference.html => ref-printers-conf.html} | 4 +- ...rence.html => ref-subscriptions-conf.html} | 0 doc/help/security.html | 168 + doc/help/spec-cmp.html | 1277 ++ doc/help/spec-command.html | 2 +- doc/help/spec-design.html | 170 + doc/help/spec-ipp.html | 2 +- doc/help/spec-ppd.html | 91 +- doc/help/spec-raster.html | 513 + doc/help/spec-stp.html | 130 + doc/help/standard.html.in | 38 +- doc/help/translation.html | 1050 ++ doc/idd.html | 1083 -- doc/idd.pdf | Bin 395751 -> 0 bytes ...accept-jobs.gif => button-accept-jobs.gif} | Bin .../{add-class.gif => button-add-class.gif} | Bin ...add-printer.gif => button-add-printer.gif} | Bin ...rinter.gif => button-add-this-printer.gif} | Bin ...ll-jobs.gif => button-cancel-all-jobs.gif} | Bin .../{cancel-job.gif => button-cancel-job.gif} | Bin ...ettings.gif => button-change-settings.gif} | Bin ...heads.gif => button-clean-print-heads.gif} | Bin doc/images/button-clear.gif | Bin 0 -> 359 bytes .../{continue.gif => button-continue.gif} | Bin ...lete-class.gif => button-delete-class.gif} | Bin ...-printer.gif => button-delete-printer.gif} | Bin ...gif => button-edit-configuration-file.gif} | Bin ...port-samba.gif => button-export-samba.gif} | Bin doc/images/{help.gif => button-help.gif} | Bin .../{hold-job.gif => button-hold-job.gif} | Bin ...-classes.gif => button-manage-classes.gif} | Bin ...manage-jobs.gif => button-manage-jobs.gif} | Bin ...rinters.gif => button-manage-printers.gif} | Bin ...ge-server.gif => button-manage-server.gif} | Bin ...dify-class.gif => button-modify-class.gif} | Bin ...-printer.gif => button-modify-printer.gif} | Bin .../{move-job.gif => button-move-job.gif} | Bin .../{move-jobs.gif => button-move-jobs.gif} | Bin ...ge.gif => button-print-self-test-page.gif} | Bin ...st-page.gif => button-print-test-page.gif} | Bin ...printer.gif => button-publish-printer.gif} | Bin ...reject-jobs.gif => button-reject-jobs.gif} | Bin ...release-job.gif => button-release-job.gif} | Bin ...restart-job.gif => button-restart-job.gif} | Bin ...ve-changes.gif => button-save-changes.gif} | Bin doc/images/{search.gif => button-search.gif} | Bin ...users.gif => button-set-allowed-users.gif} | Bin ...-default.gif => button-set-as-default.gif} | Bin ...ons.gif => button-set-printer-options.gif} | Bin ...show-active.gif => button-show-active.gif} | Bin .../{show-all.gif => button-show-all.gif} | Bin ...ompleted.gif => button-show-completed.gif} | Bin .../{show-next.gif => button-show-next.gif} | Bin ...-previous.gif => button-show-previous.gif} | Bin ...scending.gif => button-sort-ascending.gif} | Bin ...cending.gif => button-sort-descending.gif} | Bin ...start-class.gif => button-start-class.gif} | Bin ...t-printer.gif => button-start-printer.gif} | Bin .../{stop-class.gif => button-stop-class.gif} | Bin ...op-printer.gif => button-stop-printer.gif} | Bin ...inter.gif => button-unpublish-printer.gif} | Bin ...nfig.gif => button-use-default-config.gif} | Bin ...ess-log.gif => button-view-access-log.gif} | Bin ...rror-log.gif => button-view-error-log.gif} | Bin ...-page-log.gif => button-view-page-log.gif} | Bin doc/images/button-view-printable-version.gif | Bin 0 -> 743 bytes doc/images/cancel.gif | Bin 383 -> 0 bytes doc/images/classes.gif | Bin 591 -> 3970 bytes doc/images/classes.svg | 121 + doc/images/cups-black-button.scm | 80 + doc/images/cups-block-diagram.gif | Bin 11637 -> 41582 bytes doc/images/cups-block-diagram.svg | 820 ++ doc/images/cups-green-button.scm | 80 + doc/images/cups-red-button.scm | 80 + doc/images/cups-standard-button.scm | 80 + doc/images/printer-idle.gif | Bin 706 -> 2546 bytes doc/images/printer-idle.svg | 37 + doc/images/printer-processing.gif | Bin 805 -> 2737 bytes doc/images/printer-processing.svg | 52 + doc/images/printer-stopped.gif | Bin 794 -> 2933 bytes doc/images/printer-stopped.svg | 52 + doc/images/web-add-this-printer.gif | Bin 0 -> 23429 bytes doc/images/web-password.gif | Bin 0 -> 20956 bytes doc/images/web-printer-driver.gif | Bin 0 -> 20917 bytes doc/images/web-printer-status.gif | Bin 0 -> 24271 bytes doc/images/web-set-printer-options.gif | Bin 0 -> 19998 bytes doc/images/web-test-page.gif | Bin 0 -> 19005 bytes doc/index.html.in | 4 +- doc/ipp.html | 1473 --- doc/ipp.pdf | Bin 111519 -> 0 bytes doc/ipp.shtml | 1994 --- ...accept-jobs.gif => button-accept-jobs.gif} | Bin .../{add-class.gif => button-add-class.gif} | Bin ...add-printer.gif => button-add-printer.gif} | Bin ...rinter.gif => button-add-this-printer.gif} | Bin ...ll-jobs.gif => button-cancel-all-jobs.gif} | Bin .../{cancel-job.gif => button-cancel-job.gif} | Bin ...ettings.gif => button-change-settings.gif} | Bin .../{continue.gif => button-continue.gif} | Bin ...lete-class.gif => button-delete-class.gif} | Bin ...-printer.gif => button-delete-printer.gif} | Bin ...gif => button-edit-configuration-file.gif} | Bin ...port-samba.gif => button-export-samba.gif} | Bin doc/ja/images/{help.gif => button-help.gif} | Bin .../{hold-job.gif => button-hold-job.gif} | Bin ...-classes.gif => button-manage-classes.gif} | Bin ...manage-jobs.gif => button-manage-jobs.gif} | Bin ...rinters.gif => button-manage-printers.gif} | Bin ...ge-server.gif => button-manage-server.gif} | Bin ...dify-class.gif => button-modify-class.gif} | Bin ...-printer.gif => button-modify-printer.gif} | Bin .../{move-job.gif => button-move-job.gif} | Bin .../{move-jobs.gif => button-move-jobs.gif} | Bin ...st-page.gif => button-print-test-page.gif} | Bin ...printer.gif => button-publish-printer.gif} | Bin ...reject-jobs.gif => button-reject-jobs.gif} | Bin ...release-job.gif => button-release-job.gif} | Bin ...restart-job.gif => button-restart-job.gif} | Bin ...ve-changes.gif => button-save-changes.gif} | Bin .../images/{search.gif => button-search.gif} | Bin ...users.gif => button-set-allowed-users.gif} | Bin ...-default.gif => button-set-as-default.gif} | Bin ...ons.gif => button-set-printer-options.gif} | Bin ...show-active.gif => button-show-active.gif} | Bin .../{show-all.gif => button-show-all.gif} | Bin ...ompleted.gif => button-show-completed.gif} | Bin .../{show-next.gif => button-show-next.gif} | Bin ...-previous.gif => button-show-previous.gif} | Bin ...scending.gif => button-sort-ascending.gif} | Bin ...cending.gif => button-sort-descending.gif} | Bin ...start-class.gif => button-start-class.gif} | Bin ...t-printer.gif => button-start-printer.gif} | Bin .../{stop-class.gif => button-stop-class.gif} | Bin ...op-printer.gif => button-stop-printer.gif} | Bin ...inter.gif => button-unpublish-printer.gif} | Bin ...nfig.gif => button-use-default-config.gif} | Bin ...ess-log.gif => button-view-access-log.gif} | Bin ...rror-log.gif => button-view-error-log.gif} | Bin ...-page-log.gif => button-view-page-log.gif} | Bin doc/ja/images/cancel.gif | Bin 496 -> 0 bytes doc/ja/index.html.in | 4 +- doc/overview.html | 598 - doc/overview.pdf | Bin 50052 -> 0 bytes doc/ppd.shtml | 334 - doc/references.shtml | 42 - doc/sam.html | 5281 -------- doc/sam.pdf | Bin 273391 -> 0 bytes doc/sam.shtml | 5062 -------- doc/sdd.html | 591 - doc/sdd.pdf | Bin 71633 -> 0 bytes doc/spm.html | 8919 -------------- doc/spm.pdf | Bin 689586 -> 0 bytes doc/spm.shtml | 10202 ---------------- doc/sps.html | 297 - doc/sps.pdf | Bin 41182 -> 0 bytes doc/ssr.html | 275 - doc/ssr.pdf | Bin 39878 -> 0 bytes doc/ssr.shtml | 167 - doc/stp.html | 262 - doc/stp.pdf | Bin 43329 -> 0 bytes doc/stp.shtml | 144 - doc/sum.html | 1732 --- doc/sum.pdf | Bin 106950 -> 0 bytes doc/sum.shtml | 933 -- doc/svd.html | 296 - doc/svd.pdf | Bin 45647 -> 0 bytes doc/svd.shtml | 212 - doc/translation.html | 605 - doc/translation.pdf | Bin 50787 -> 0 bytes doc/translation.shtml | 734 -- filter/pstops.c | 6 +- locale/Makefile | 10 +- packaging/cups.list.in | 21 +- packaging/cups.readme | 290 + packaging/cups.spec.in | 12 +- pstoraster/README.pstoraster | 73 - pstoraster/cups.mak | 53 - pstoraster/gdevcups.c | 4464 ------- pstoraster/gs707-lib.patch | 110 - pstoraster/gs811-lib.patch | 110 - pstoraster/pstopxl | 67 - pstoraster/pstopxl.in | 67 - pstoraster/pstoraster | 52 - pstoraster/pstoraster.convs | 29 - pstoraster/pstoraster.in | 62 - pstoraster/pxlcolor.ppd | 205 - pstoraster/pxlmono.ppd | 199 - scheduler/auth.c | 6 +- scheduler/auth.h | 8 +- scheduler/cert.c | 6 +- scheduler/client.c | 236 +- scheduler/conf.c | 36 +- scheduler/conf.h | 6 +- scheduler/cups-lpd.c | 6 +- scheduler/dirsvc.c | 13 +- scheduler/main.c | 35 +- standards/rfc4122.txt | 1795 +++ standards/wake-on-lan.pdf | Bin 0 -> 37276 bytes systemv/Makefile | 12 +- templates/Makefile | 7 +- templates/add-class.tmpl | 2 +- templates/add-printer.tmpl | 2 +- templates/admin.tmpl | 24 +- templates/choose-device.tmpl | 2 +- templates/choose-make.tmpl | 4 +- templates/choose-model.tmpl | 2 +- templates/choose-serial.tmpl | 2 +- templates/choose-uri.tmpl | 2 +- templates/class-confirm.tmpl | 2 +- templates/classes.tmpl | 24 +- templates/edit-config.tmpl.in | 6 +- templates/help-header.tmpl | 25 +- templates/help-printable.tmpl | 11 + templates/ja/add-class.tmpl | 2 +- templates/ja/add-printer.tmpl | 2 +- templates/ja/admin.tmpl | 24 +- templates/ja/choose-device.tmpl | 2 +- templates/ja/choose-make.tmpl | 4 +- templates/ja/choose-model.tmpl | 2 +- templates/ja/choose-serial.tmpl | 2 +- templates/ja/choose-uri.tmpl | 2 +- templates/ja/class-confirm.tmpl | 2 +- templates/ja/classes.tmpl | 24 +- templates/ja/help-header.tmpl | 2 +- templates/ja/job-move.tmpl | 2 +- templates/ja/jobs-header.tmpl | 12 +- templates/ja/jobs.tmpl | 10 +- templates/ja/modify-class.tmpl | 2 +- templates/ja/modify-printer.tmpl | 2 +- templates/ja/option-trailer.tmpl | 2 +- templates/ja/pager.tmpl | 6 +- templates/ja/printer-confirm.tmpl | 2 +- templates/ja/printers.tmpl | 28 +- templates/ja/samba-export.tmpl | 2 +- templates/ja/search.tmpl | 2 +- templates/ja/users.tmpl | 2 +- templates/job-move.tmpl | 2 +- templates/jobs-header.tmpl | 12 +- templates/jobs.tmpl | 10 +- templates/modify-class.tmpl | 2 +- templates/modify-printer.tmpl | 2 +- templates/option-trailer.tmpl | 2 +- templates/pager.tmpl | 6 +- templates/printer-confirm.tmpl | 2 +- templates/printers.tmpl | 32 +- templates/samba-export.tmpl | 2 +- templates/search.tmpl | 5 +- templates/users.tmpl | 2 +- 277 files changed, 8743 insertions(+), 49852 deletions(-) delete mode 100644 CGI.txt delete mode 100644 ENCRYPTION.txt delete mode 100644 doc/cmp.html delete mode 100644 doc/cmp.pdf delete mode 100644 doc/cmp.shtml create mode 100644 doc/cups-printable.css delete mode 100644 doc/cupsdoc.css delete mode 100644 doc/figures.sc delete mode 100644 doc/glossary.shtml create mode 100644 doc/help/glossary.html rename LICENSE.html => doc/help/license.html (95%) create mode 100644 doc/help/options.html rename doc/help/{access_log-reference.html => ref-access_log.html} (96%) rename doc/help/{classes-conf-reference.html => ref-classes-conf.html} (98%) rename doc/help/{client-conf-reference.html => ref-client-conf.html} (100%) rename doc/help/{cupsd-conf-reference.html => ref-cupsd-conf.html} (100%) rename doc/help/{error_log-reference.html => ref-error_log.html} (95%) rename doc/help/{page_log-reference.html => ref-page_log.html} (100%) rename doc/help/{printers-conf-reference.html => ref-printers-conf.html} (99%) rename doc/help/{subscriptions-conf-reference.html => ref-subscriptions-conf.html} (100%) create mode 100644 doc/help/security.html create mode 100644 doc/help/spec-cmp.html create mode 100644 doc/help/spec-design.html create mode 100644 doc/help/spec-raster.html create mode 100644 doc/help/spec-stp.html create mode 100644 doc/help/translation.html delete mode 100644 doc/idd.html delete mode 100644 doc/idd.pdf rename doc/images/{accept-jobs.gif => button-accept-jobs.gif} (100%) rename doc/images/{add-class.gif => button-add-class.gif} (100%) rename doc/images/{add-printer.gif => button-add-printer.gif} (100%) rename doc/images/{add-this-printer.gif => button-add-this-printer.gif} (100%) rename doc/images/{cancel-all-jobs.gif => button-cancel-all-jobs.gif} (100%) rename doc/images/{cancel-job.gif => button-cancel-job.gif} (100%) rename doc/images/{change-settings.gif => button-change-settings.gif} (100%) rename doc/images/{clean-print-heads.gif => button-clean-print-heads.gif} (100%) create mode 100644 doc/images/button-clear.gif rename doc/images/{continue.gif => button-continue.gif} (100%) rename doc/images/{delete-class.gif => button-delete-class.gif} (100%) rename doc/images/{delete-printer.gif => button-delete-printer.gif} (100%) rename doc/images/{edit-configuration-file.gif => button-edit-configuration-file.gif} (100%) rename doc/images/{export-samba.gif => button-export-samba.gif} (100%) rename doc/images/{help.gif => button-help.gif} (100%) rename doc/images/{hold-job.gif => button-hold-job.gif} (100%) rename doc/images/{manage-classes.gif => button-manage-classes.gif} (100%) rename doc/images/{manage-jobs.gif => button-manage-jobs.gif} (100%) rename doc/images/{manage-printers.gif => button-manage-printers.gif} (100%) rename doc/images/{manage-server.gif => button-manage-server.gif} (100%) rename doc/images/{modify-class.gif => button-modify-class.gif} (100%) rename doc/images/{modify-printer.gif => button-modify-printer.gif} (100%) rename doc/images/{move-job.gif => button-move-job.gif} (100%) rename doc/images/{move-jobs.gif => button-move-jobs.gif} (100%) rename doc/images/{print-self-test-page.gif => button-print-self-test-page.gif} (100%) rename doc/images/{print-test-page.gif => button-print-test-page.gif} (100%) rename doc/images/{publish-printer.gif => button-publish-printer.gif} (100%) rename doc/images/{reject-jobs.gif => button-reject-jobs.gif} (100%) rename doc/images/{release-job.gif => button-release-job.gif} (100%) rename doc/images/{restart-job.gif => button-restart-job.gif} (100%) rename doc/images/{save-changes.gif => button-save-changes.gif} (100%) rename doc/images/{search.gif => button-search.gif} (100%) rename doc/images/{set-allowed-users.gif => button-set-allowed-users.gif} (100%) rename doc/images/{set-as-default.gif => button-set-as-default.gif} (100%) rename doc/images/{set-printer-options.gif => button-set-printer-options.gif} (100%) rename doc/images/{show-active.gif => button-show-active.gif} (100%) rename doc/images/{show-all.gif => button-show-all.gif} (100%) rename doc/images/{show-completed.gif => button-show-completed.gif} (100%) rename doc/images/{show-next.gif => button-show-next.gif} (100%) rename doc/images/{show-previous.gif => button-show-previous.gif} (100%) rename doc/images/{sort-ascending.gif => button-sort-ascending.gif} (100%) rename doc/images/{sort-descending.gif => button-sort-descending.gif} (100%) rename doc/images/{start-class.gif => button-start-class.gif} (100%) rename doc/images/{start-printer.gif => button-start-printer.gif} (100%) rename doc/images/{stop-class.gif => button-stop-class.gif} (100%) rename doc/images/{stop-printer.gif => button-stop-printer.gif} (100%) rename doc/images/{unpublish-printer.gif => button-unpublish-printer.gif} (100%) rename doc/images/{use-default-config.gif => button-use-default-config.gif} (100%) rename doc/images/{view-access-log.gif => button-view-access-log.gif} (100%) rename doc/images/{view-error-log.gif => button-view-error-log.gif} (100%) rename doc/images/{view-page-log.gif => button-view-page-log.gif} (100%) create mode 100644 doc/images/button-view-printable-version.gif delete mode 100644 doc/images/cancel.gif create mode 100644 doc/images/classes.svg create mode 100644 doc/images/cups-black-button.scm create mode 100644 doc/images/cups-block-diagram.svg create mode 100644 doc/images/cups-green-button.scm create mode 100644 doc/images/cups-red-button.scm create mode 100644 doc/images/cups-standard-button.scm create mode 100644 doc/images/printer-idle.svg create mode 100644 doc/images/printer-processing.svg create mode 100644 doc/images/printer-stopped.svg create mode 100644 doc/images/web-add-this-printer.gif create mode 100644 doc/images/web-password.gif create mode 100644 doc/images/web-printer-driver.gif create mode 100644 doc/images/web-printer-status.gif create mode 100644 doc/images/web-set-printer-options.gif create mode 100644 doc/images/web-test-page.gif delete mode 100644 doc/ipp.html delete mode 100644 doc/ipp.pdf delete mode 100644 doc/ipp.shtml rename doc/ja/images/{accept-jobs.gif => button-accept-jobs.gif} (100%) rename doc/ja/images/{add-class.gif => button-add-class.gif} (100%) rename doc/ja/images/{add-printer.gif => button-add-printer.gif} (100%) rename doc/ja/images/{add-this-printer.gif => button-add-this-printer.gif} (100%) rename doc/ja/images/{cancel-all-jobs.gif => button-cancel-all-jobs.gif} (100%) rename doc/ja/images/{cancel-job.gif => button-cancel-job.gif} (100%) rename doc/ja/images/{change-settings.gif => button-change-settings.gif} (100%) rename doc/ja/images/{continue.gif => button-continue.gif} (100%) rename doc/ja/images/{delete-class.gif => button-delete-class.gif} (100%) rename doc/ja/images/{delete-printer.gif => button-delete-printer.gif} (100%) rename doc/ja/images/{edit-configuration-file.gif => button-edit-configuration-file.gif} (100%) rename doc/ja/images/{export-samba.gif => button-export-samba.gif} (100%) rename doc/ja/images/{help.gif => button-help.gif} (100%) rename doc/ja/images/{hold-job.gif => button-hold-job.gif} (100%) rename doc/ja/images/{manage-classes.gif => button-manage-classes.gif} (100%) rename doc/ja/images/{manage-jobs.gif => button-manage-jobs.gif} (100%) rename doc/ja/images/{manage-printers.gif => button-manage-printers.gif} (100%) rename doc/ja/images/{manage-server.gif => button-manage-server.gif} (100%) rename doc/ja/images/{modify-class.gif => button-modify-class.gif} (100%) rename doc/ja/images/{modify-printer.gif => button-modify-printer.gif} (100%) rename doc/ja/images/{move-job.gif => button-move-job.gif} (100%) rename doc/ja/images/{move-jobs.gif => button-move-jobs.gif} (100%) rename doc/ja/images/{print-test-page.gif => button-print-test-page.gif} (100%) rename doc/ja/images/{publish-printer.gif => button-publish-printer.gif} (100%) rename doc/ja/images/{reject-jobs.gif => button-reject-jobs.gif} (100%) rename doc/ja/images/{release-job.gif => button-release-job.gif} (100%) rename doc/ja/images/{restart-job.gif => button-restart-job.gif} (100%) rename doc/ja/images/{save-changes.gif => button-save-changes.gif} (100%) rename doc/ja/images/{search.gif => button-search.gif} (100%) rename doc/ja/images/{set-allowed-users.gif => button-set-allowed-users.gif} (100%) rename doc/ja/images/{set-as-default.gif => button-set-as-default.gif} (100%) rename doc/ja/images/{set-printer-options.gif => button-set-printer-options.gif} (100%) rename doc/ja/images/{show-active.gif => button-show-active.gif} (100%) rename doc/ja/images/{show-all.gif => button-show-all.gif} (100%) rename doc/ja/images/{show-completed.gif => button-show-completed.gif} (100%) rename doc/ja/images/{show-next.gif => button-show-next.gif} (100%) rename doc/ja/images/{show-previous.gif => button-show-previous.gif} (100%) rename doc/ja/images/{sort-ascending.gif => button-sort-ascending.gif} (100%) rename doc/ja/images/{sort-descending.gif => button-sort-descending.gif} (100%) rename doc/ja/images/{start-class.gif => button-start-class.gif} (100%) rename doc/ja/images/{start-printer.gif => button-start-printer.gif} (100%) rename doc/ja/images/{stop-class.gif => button-stop-class.gif} (100%) rename doc/ja/images/{stop-printer.gif => button-stop-printer.gif} (100%) rename doc/ja/images/{unpublish-printer.gif => button-unpublish-printer.gif} (100%) rename doc/ja/images/{use-default-config.gif => button-use-default-config.gif} (100%) rename doc/ja/images/{view-access-log.gif => button-view-access-log.gif} (100%) rename doc/ja/images/{view-error-log.gif => button-view-error-log.gif} (100%) rename doc/ja/images/{view-page-log.gif => button-view-page-log.gif} (100%) delete mode 100644 doc/ja/images/cancel.gif delete mode 100644 doc/overview.html delete mode 100644 doc/overview.pdf delete mode 100644 doc/ppd.shtml delete mode 100644 doc/references.shtml delete mode 100644 doc/sam.html delete mode 100644 doc/sam.pdf delete mode 100644 doc/sam.shtml delete mode 100644 doc/sdd.html delete mode 100644 doc/sdd.pdf delete mode 100644 doc/spm.html delete mode 100644 doc/spm.pdf delete mode 100644 doc/spm.shtml delete mode 100644 doc/sps.html delete mode 100644 doc/sps.pdf delete mode 100644 doc/ssr.html delete mode 100644 doc/ssr.pdf delete mode 100644 doc/ssr.shtml delete mode 100644 doc/stp.html delete mode 100644 doc/stp.pdf delete mode 100644 doc/stp.shtml delete mode 100644 doc/sum.html delete mode 100644 doc/sum.pdf delete mode 100644 doc/sum.shtml delete mode 100644 doc/svd.html delete mode 100644 doc/svd.pdf delete mode 100644 doc/svd.shtml delete mode 100644 doc/translation.html delete mode 100644 doc/translation.pdf delete mode 100644 doc/translation.shtml create mode 100644 packaging/cups.readme delete mode 100644 pstoraster/README.pstoraster delete mode 100644 pstoraster/cups.mak delete mode 100644 pstoraster/gdevcups.c delete mode 100644 pstoraster/gs707-lib.patch delete mode 100644 pstoraster/gs811-lib.patch delete mode 100644 pstoraster/pstopxl delete mode 100755 pstoraster/pstopxl.in delete mode 100755 pstoraster/pstoraster delete mode 100644 pstoraster/pstoraster.convs delete mode 100755 pstoraster/pstoraster.in delete mode 100644 pstoraster/pxlcolor.ppd delete mode 100644 pstoraster/pxlmono.ppd create mode 100644 standards/rfc4122.txt create mode 100644 standards/wake-on-lan.pdf create mode 100644 templates/help-printable.tmpl diff --git a/CGI.txt b/CGI.txt deleted file mode 100644 index 337acb891..000000000 --- a/CGI.txt +++ /dev/null @@ -1,81 +0,0 @@ -CGI - CUPS v1.1.21 - 06/29/2004 -------------------------------- - -This file describes the experimental scripting/CGI support -provided by CUPS starting with CUPS 1.1.19. - -WARNING: CGI support is not complete; you may run into problems -and limitations in the implementation of CGI in CUPS that are -not present in full-featured web servers like Apache. - - -OVERVIEW OF CGI SUPPORT IN CUPS - -CUPS has traditionally provided a dynamic web interface through -four CGI programs that are executed when users open special -directories on the CUPS server. Each CGI performs -administration, class, job, and printer functions as directed by -the user, but the actual programs that are run and functions -that are available are limited to those that were originally -designed into the scheduler. - -Starting with CUPS 1.1.19, support is now available for CGI -programs and specific scripting languages, currently Java, Perl, -PHP, and Python. The interpreters for these languages are -currently configured at compile time. Future versions may -expand the interface to allow for generic support of scripting -languages similar to the Apache "AddHandler" directive, but with -external programs instead of modules. - -The following MIME types are reserved for the CGI support in -CUPS (the names have been chosen to mirror those used by -Apache): - - application/x-httpd-cgi CGI script/program - application/x-httpd-java Java program - application/x-httpd-perl Perl script - application/x-httpd-php PHP script - application/x-httpd-python Python script - -In order to enable the corresponding type, you must create a new -/etc/cups/cgi.types file which maps the filename extensions to -the appropriate MIME type, for example: - - application/x-httpd-cgi cgi - application/x-httpd-php php - -CGI scripts/programs (application/x-httpd-cgi) also must have -execution permissions to be treated as a CGI script or program. - - -LIMITATIONS - -CUPS implements most of the CGI/1.1 specification, with the -following limitations: - - - No Location: redirection support. - - No PATH_INFO or PATH_TRANSLATED support. - - 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. - - -REPORTING PROBLEMS - -If you have problems, READ THE DOCUMENTATION FIRST! If the -documentation does not solve your problems please send an email -to "cups-support@cups.org". Include your operating system and -version, compiler and version, and any errors or problems you've -run into. The "/var/log/cups/error_log" file should also be sent, -as it often helps to determine the cause of your problem. - -If you are running a version of Linux, be sure to provide the -Linux distribution you have, too. - -Please note that the "cups-support@cups.org" email address goes -to the CUPS developers; they are busy people, so your email may -go unanswered for days or weeks. In general, only general build -or distribution problems will actually get answered - for -end-user support see the "README.txt" for a summary of the -resources available. diff --git a/ENCRYPTION.txt b/ENCRYPTION.txt deleted file mode 100644 index e0e3ba9ff..000000000 --- a/ENCRYPTION.txt +++ /dev/null @@ -1,142 +0,0 @@ -ENCRYPTION - CUPS v1.1.20 - 11/24/2003 --------------------------------------- - -This file describes the encryption support provided by CUPS. - -WARNING: CLIENTS CURRENTLY TRUST ALL CERTIFICATES FROM SERVERS. -This makes the CUPS client applications vulnerable to "man in -the middle" attacks, so we don't recommend using this to do -remote administration over WANs at this time. - -Future versions of CUPS will keep track of server certificates -and provide a callback/confirmation interface for accepting new -certificates and warning when a certificate has changed. - - -LEGAL STUFF - -BEFORE USING THE ENCRYPTION SUPPORT, PLEASE VERIFY THAT IT IS -LEGAL TO DO SO IN YOUR COUNTRY. CUPS by itself doesn't include -any encryption code, but it can link against the OpenSSL, GNU -TLS, or CDSA libraries which do. - - -OVERVIEW OF ENCRYPTION SUPPORT IN CUPS - -CUPS supports SSL/2.0, SSL/3.0, and TLS/1.0 encryption using -keys as large as 128-bits. Encryption support is provided via -the OpenSSL, GNU TLS, or CDSA libraries and some new hooks in -the CUPS code. - -CUPS provides support for dedicated (https) and "upgrade" (TLS) -encryption of sessions. The "HTTP Upgrade" method is described -in RFC 2817; basically, the client can be secure or unsecure, -and the client or server initiates an upgrade to a secure -connection via some new HTTP fields and status codes. The HTTP -Upgrade method is new and no browsers we know of support it yet. -Stick with "https" for web browsers. - -The current implementation is very basic. The CUPS client -software (lp, lpr, etc.) uses encryption as requested by the -user or server. - -The user can specify the "-E" option with the printing commands -to force encryption of the connection. Encryption can also be -specified using the Encryption directive in the client.conf file -or in the CUPS_ENCRYPTION environment variable: - - Never - - Never do encryption. - - Always - - Always do SSL/TLS encryption using the https scheme. - - IfRequested - - Upgrade to TLS encryption if the server asks for it. - This is the default setting. - - Required - - Always upgrade to TLS encryption as soon as the - connection is made. This is different than the "Always" - mode above since the connection is initially unsecure - and the client initiates the upgrade to TLS encryption. - (same as using the "-E" option) - -These keywords are also used in the cupsd.conf file to secure -particular locations. To secure all traffic on the server, listen -on port 443 (https port) instead of port 631 and change the "ipp" -service listing (or add it if you don't have one) in /etc/services -to 443. To provide both secure and normal methods, add a line -reading: - - SSLPort 443 - -to /etc/cups/cupsd.conf. - - -BEFORE YOU BEGIN - -You'll need the OpenSSL, GNU TLS, or CDSA libraries from: - - http://www.openssl.org/ - http://www.gnutls.org/ - http://www.intel.com/labs/archive/cdsa.htm - - -CONFIGURING WITH ENCRYPTION SUPPORT - -Once you have the OpenSSL, GNU TLS, or CDSA libraries installed, -you'll need to configure CUPS to use it with the "--enable-ssl" -option: - - ./configure --enable-ssl - -If the library stuff is not in a standard location, make sure to -define the CFLAGS, CXXFLAGS, and LDFLAGS environment variables -with the appropriate compiler and linker options first. - - -GENERATING A SERVER CERTIFICATE AND KEY - -The following OpenSSL command will generate a server certificate -and key that you can play with. Since the certificate is not -properly signed it will generate all kinds of warnings in -Netscape and MSIE: - - openssl req -new -x509 -keyout /etc/cups/ssl/server.key \ - -out /etc/cups/ssl/server.crt -days 365 -nodes - - chmod 600 /etc/cups/ssl/server.* - -The "-nodes" option prevents the certificate and key from being -encrypted. The cupsd process runs in the background, detached -from any input source; if you encrypt these files then cupsd -will not be able to load them! - -Send all rants about non-encrypted certificate and key files to -/dev/null. It makes sense to encrypt user files, but not for -files used by system processes/daemons... - - -REPORTING PROBLEMS - -If you have problems, READ THE DOCUMENTATION FIRST! If the -documentation does not solve your problems please send an email -to "cups-support@cups.org". Include your operating system and -version, compiler and version, and any errors or problems you've -run into. The "/var/log/cups/error_log" file should also be sent, -as it often helps to determine the cause of your problem. - -If you are running a version of Linux, be sure to provide the -Linux distribution you have, too. - -Please note that the "cups-support@cups.org" email address goes -to the CUPS developers; they are busy people, so your email may -go unanswered for days or weeks. In general, only general build -or distribution problems will actually get answered - for -end-user support see the "README.txt" for a summary of the -resources available. diff --git a/INSTALL.txt b/INSTALL.txt index fd2e5ec57..86b6c66aa 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,190 +1,174 @@ -INSTALL - CUPS v1.2.0a1 - 01/07/2003 ------------------------------------- +INSTALL - CUPS v1.2b1 - 2006-03-03 +---------------------------------- This file describes how to compile and install CUPS from source code. For more information on CUPS see the file called "README.txt". A complete change log can be found in "CHANGES.txt". -**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO **** -**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION **** -**** OF THE STANDARD GHOSTSCRIPT RELEASES. **** +**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO **** +**** NEED TO INSTALL ESP GHOSTSCRIPT AFTER YOU INSTALL CUPS **** BEFORE YOU BEGIN -You'll need ANSI-compliant C and C++ compilers, plus a make -program and Bourne shell. The GNU compiler tools work well - -we've tested the current CUPS code against GCC 2.95.x with -excellent results. + You'll need ANSI-compliant C and C++ compilers, plus a make + program and Bourne shell. The GNU compiler tools work well - + we've tested the current CUPS code against several versions + of GCC with excellent results. -The makefiles used by the project should work with all versions -of make. We've tested them with GNU make as well as the make -programs shipped by Compaq, HP, SGI, and Sun. FreeBSD users -should use GNU make (gmake). + The makefiles used by the project should work with all + versions of make. We've tested them with GNU make as well as + the make programs shipped by Compaq, HP, SGI, and Sun. + FreeBSD users should use GNU make (gmake). -Besides these tools you'll want the following libraries: + 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, and the OpenLDAP and + OpenSLP libraries for directory services support. CUPS will + compile and run without these, however you'll miss out on + many of the features provided by CUPS. - - JPEG 6b or higher - - PNG 1.0.6 or higher - - TIFF 3.4 or higher - - ZLIB 1.1.3 or higher + Also, please note that CUPS no longer includes the + Ghostscript- based pstoraster filter. You *must* download + ESP Ghostscript separately from the CUPS web site if you want + to print PostScript files to non-PostScript printers. -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 no longer includes the Ghostscript- -based pstoraster filter. You *must* download Ghostscript -separately and patch it using the files in the pstoraster -subdirectory, or download the ESP Ghostscript distribution from -the CUPS web site. For more information see the README file in -the pstoraster subdirectory. +COMPILING FROM SUBVERSION + The CUPS Subversion repository doesn't hold a copy of the + pre-built configure script. You'll need to run the GNU + autoconf software (2.52 or higher) before compiling the + software from Subversion: -COMPILING FROM CVS - -The CUPS CVS repository doesn't hold a copy of the pre-built -configure script. You'll need to run the GNU autoconf software -(2.52 or higher) before compiling the software from CVS: - - autoconf ENTER + autoconf -f CONFIGURATION -CUPS uses GNU autoconf, so you should find the usual "configure" -script in the main CUPS source directory. To configure CUPS for -your system, type: - - ./configure ENTER - -The default installation will put the CUPS software in the -"/etc", "/usr", and "/var" directories on your system, which -will overwrite any existing printing commands on your system. -Use the "--prefix" option to install the CUPS software in -another location: - - ./configure --prefix=/some/directory ENTER + CUPS uses GNU autoconf, so you should find the usual + "configure" script in the main CUPS source directory. To + configure CUPS for your system, type: -If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in -a system default location (typically "/usr/include" and -"/usr/lib") you'll need to set the CFLAGS, CXXFLAGS, DSOFLAGS, -and LDFLAGS environment variables prior to running configure: + ./configure - setenv CFLAGS "-I/some/directory" ENTER - setenv CXXFLAGS "-I/some/directory" ENTER - setenv DSOFLAGS "-L/some/directory" ENTER - setenv LDFLAGS "-L/some/directory" ENTER - ./configure ... ENTER + The default installation will put the CUPS software in the + "/etc", "/usr", and "/var" directories on your system, which + will overwrite any existing printing commands on your system. + Use the "--prefix" option to install the CUPS software in + another location: -or: + ./configure --prefix=/some/directory - CFLAGS="-I/some/directory"; export CFLAGS ENTER - CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER - DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER - LDFLAGS="-L/some/directory"; export LDFLAGS ENTER - ./configure ... ENTER + To see a complete list of configuration options, use the + --help option: -To enable support for encryption, you'll also want to add the -"--enable-ssl" option: + ./configure --help - ./configure --enable-ssl + If any of the dependent libraries are not installed in a + system default location (typically "/usr/include" and + "/usr/lib") you'll need to set the CFLAGS, CPPFLAGS, + CXXFLAGS, DSOFLAGS, and LDFLAGS environment variables prior + to running configure: -SSL and TLS support require the OpenSSL library, available at: + setenv CFLAGS "-I/some/directory" + setenv CPPFLAGS "-I/some/directory" + setenv CXXFLAGS "-I/some/directory" + setenv DSOFLAGS "-L/some/directory" + setenv LDFLAGS "-L/some/directory" + ./configure ... - http://www.openssl.org + or: -If the OpenSSL header files and libraries are not in a standard -location, specify the locations of these files using the ---with-openssl-includes and --with-openssl-libs directives: + CFLAGS="-I/some/directory" \ + CPPFLAGS="-I/some/directory" \ + CXXFLAGS="-I/some/directory" \ + DSOFLAGS="-L/some/directory" \ + LDFLAGS="-L/some/directory" \ + ./configure ... - ./configure --enable-ssl \ - --with-openssl-includes=/foo/bar/include \ - --with-openssl-libs=/foo/bar/lib + Once you have configured things, just type: -See the file "ENCRYPTION.txt" for information on using the -encryption support in CUPS. + make ENTER -Once you have configured things, just type: + or if you have FreeBSD, NetBSD, or OpenBSD type: - make ENTER + gmake ENTER -or if you have FreeBSD, NetBSD, or OpenBSD type: - - gmake ENTER - -to build the software. + to build the software. INSTALLING THE SOFTWARE -Once you have built the software you need to install it. The -"install" target provides a quick way to install the software on -your local system: + Once you have built the software you need to install it. The + "install" target provides a quick way to install the software + on your local system: - make install ENTER + make install ENTER -or for FreeBSD, NetBSD, or OpenBSD: + or for FreeBSD, NetBSD, or OpenBSD: - gmake install ENTER + gmake install ENTER -You can also build binary packages that can be installed on other -machines using the RPM spec file ("cups.spec") or EPM list file -("cups.list"). The latter also supports building of binary RPMs, -so it may be more convenient to use - we use EPM to build all of -our binary distributions. + You can also build binary packages that can be installed on + other machines using the RPM spec file + ("packaging/cups.spec") or EPM list file + ("packaging/cups.list"). The latter also supports building + of binary RPMs, so it may be more convenient to use - we use + EPM to build all of our binary distributions. -You can find the RPM software at: + You can find the RPM software at: - http://www.rpm.org + http://www.rpm.org/ -The EPM software is at: + The EPM software is available at: - http://www.easysw.com/epm/ + http://www.easysw.com/epm/ CREATING BINARY DISTRIBUTIONS WITH EPM -The top level makefile supports generation of many types of binary -distributions using EPM. To build a binary distribution type: + The top level makefile supports generation of many types of binary + distributions using EPM. To build a binary distribution type: - make ENTER + make ENTER -or + or - gmake ENTER + gmake ENTER -for FreeBSD, NetBSD, and OpenBSD. The target is one of -the following: + for FreeBSD, NetBSD, and OpenBSD. The target is one of + the following: - epm - Builds a portable shell script and tar file based - distribution. This format will also backup your - existing printing system if you decide to remove - CUPS at some future time. - aix - Builds an AIX binary distribution. - bsd - Builds a *BSD binary distribution. - deb - Builds a Debian binary distribution. - depot - Builds a HP-UX binary distribution. - pkg - Builds a Solaris binary distribution. - rpm - Builds a RPM binary distribution. - tardist - Builds an IRIX binary distribution. + 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) + osx - Builds a MacOS X package + 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) REPORTING PROBLEMS -If you have problems, READ THE DOCUMENTATION FIRST! If the -documentation does not solve your problems please send an email -to "cups-support@cups.org". Include your operating system and -version, compiler and version, and any errors or problems you've -run into. The "/var/log/cups/error_log" file should also be sent, -as it often helps to determine the cause of your problem. - -If you are running a version of Linux, be sure to provide the -Linux distribution you have, too. - -Please note that the "cups-support@cups.org" email address goes -to the CUPS developers; they are busy people, so your email may -go unanswered for days or weeks. In general, only general build -or distribution problems will actually get answered - for -end-user support see the "README.txt" for a summary of the -resources available. + 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: + + http://www.cups.org/newsgroups.php + + Include your operating system and version, compiler and + version, and any errors or problems you've run into. The + "config.log" file and the output from the configure script + and make should also be sent, as it often helps to determine + the cause of your problem. + + If you are running a version of Linux, be sure to provide the + Linux distribution you have, too. diff --git a/LICENSE.txt b/LICENSE.txt index 12e4af6bc..797ee5db9 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -128,8 +128,8 @@ is based on the Xpdf software. For binary distribution licensing of this software, please contact: Derek B. Noonburg - Email: derekn@foolabs.com - WWW: http://www.foolabs.com/xpdf/ + Email: derekn@glyphandcog.com + WWW: http://www.glyphandcog.com/ SUPPORT diff --git a/Makefile b/Makefile index 053f65f7f..3535a9fde 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5185 2006-02-26 15:27:14Z mike $" +# "$Id: Makefile 5217 2006-03-02 21:24:01Z mike $" # # Top-level Makefile for the Common UNIX Printing System (CUPS). # @@ -146,36 +146,18 @@ check test: all # -# Make software distributions using EPM (http://www.easysw.com/epm)... +# Make software distributions using EPM (http://www.easysw.com/epm/)... # EPMFLAGS = -v -aix: - epm $(EPMFLAGS) -f aix cups packaging/cups.list - -bsd: - epm $(EPMFLAGS) -f bsd cups packaging/cups.list +aix bsd deb depot inst osx pkg rpm setld slackware swinstall tardist: + epm $(EPMFLAGS) -f $@ cups packaging/cups.list epm: epm $(EPMFLAGS) cups packaging/cups.list -rpm: - epm $(EPMFLAGS) -f rpm cups packaging/cups.list - -deb: - epm $(EPMFLAGS) -f deb cups packaging/cups.list - -depot: - epm $(EPMFLAGS) -f depot cups packaging/cups.list - -pkg: - epm $(EPMFLAGS) -f pkg cups packaging/cups.list - -tardist: - epm $(EPMFLAGS) -f tardist cups packaging/cups.list - # -# End of "$Id: Makefile 5185 2006-02-26 15:27:14Z mike $". +# End of "$Id: Makefile 5217 2006-03-02 21:24:01Z mike $". # diff --git a/README.txt b/README.txt index c2f964832..28c192d36 100644 --- a/README.txt +++ b/README.txt @@ -1,290 +1,204 @@ -README - CUPS v1.2.0b1 - 01/10/2006 ------------------------------------ - -***************************************************************** -***************************************************************** -**** **** -**** WARNING: THIS IS BETA RELEASE SOFTWARE AND MAY BE **** -**** TOTALLY UNSTABLE. DO NOT USE IN ENVIRONMENTS **** -**** WHERE RELIABLE SOFTWARE IS REQUIRED! **** -**** **** -***************************************************************** -***************************************************************** +README - CUPS v1.2b1 - 2006-03-03 +--------------------------------- Looking for compile instructions? Read the file "INSTALL.txt" instead... -***************************************************************** -***************************************************************** -**** **** -**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO **** -**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION **** -**** OF A STANDARD GHOSTSCRIPT RELEASE. **** -**** **** -***************************************************************** -***************************************************************** - INTRODUCTION -CUPS provides a portable printing layer for UNIX(r)-based -operating systems. It has been developed by Easy Software -Products to promote a standard printing solution for all UNIX -vendors and users. CUPS provides the System V and Berkeley -command-line interfaces. - -CUPS uses the Internet Printing Protocol ("IPP") as the basis -for managing print jobs and queues. The Line Printer Daemon -("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a. -JetDirect) protocols are also supported with reduced -functionality. CUPS adds network printer browsing and -PostScript Printer Description ("PPD") based printing options to -support real-world printing under UNIX. - -CUPS includes an image file RIP that supports printing of image -files to non-PostScript printers. A customized version of GNU -Ghostscript for CUPS called ESP Ghostscript is available -separately to support printing of PostScript files within the -CUPS driver framework. Sample drivers for Dymo, EPSON, HP, and -OKIDATA printers are included that use these filters. - -Drivers for thousands of printers are provided with our ESP -Print Pro software, available at: - - http://www.easysw.com/printpro/ - -CUPS is licensed under the GNU General Public License and GNU -Library General Public License. Please contact Easy Software -Products for commercial support and "binary distribution" -rights. - - -SYSTEM REQUIREMENTS - -Binary distributions require a minimum of 10MB of free disk -space. We do not recommend using CUPS on a workstation with less -than 32MB of RAM or a PC with less than 16MB of RAM. - -If you are installing from source you'll need ANSI-compliant C -and C++ compilers and optionally one or more image file support -libraries. Complete source installation instructions can be -found in the file "INSTALL.txt". - - -SOFTWARE REQUIREMENTS - -The following operating system software is required to install -one of the binary distributions from Easy Software Products: + CUPS provides a portable printing layer for UNIX(r)-based + operating systems. It has been developed by Easy Software + Products to promote a standard printing solution for all UNIX + vendors and users. CUPS provides the System V and Berkeley + command-line interfaces. - - AIX 4.3 or higher - - HP-UX 11.00 or higher - - IRIX 6.5 or higher - - Linux 2.4 with glibc 2.2 or higher - - Solaris 7 or higher (SPARC or Intel) + CUPS uses the Internet Printing Protocol ("IPP") as the basis + for managing print jobs and queues. The Line Printer Daemon + ("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a. + JetDirect) protocols are also supported with reduced + functionality. CUPS adds network printer browsing and + PostScript Printer Description ("PPD") based printing options + to support real-world printing under UNIX. + CUPS includes an image file RIP that supports printing of + image files to non-PostScript printers. A customized version + of GPL Ghostscript for CUPS called ESP Ghostscript is + available separately to support printing of PostScript files + within the CUPS driver framework. Sample drivers for Dymo, + EPSON, HP, and OKIDATA printers are included that use these + filters. -INSTALLING "PORTABLE" CUPS DISTRIBUTIONS + Drivers for thousands of printers are provided with our ESP + Print Pro software, available at: -We are currently distributing "portable" CUPS binary -distributions in TAR format with installation and removal -scripts generated by our ESP Package Manager (EPM) software, -which is available from: + http://www.easysw.com/printpro/ - http://www.easysw.com/epm - -WARNING: Installing CUPS will overwrite your existing printing -system. Backup files are made by the installation script and -restored by the removal script, so if you experience problems -you should be able to remove the CUPS software to restore your -previous configuration. However, Easy Software Products makes -no warranty for this and will not be liable for any lost -revenues, etc. - -To install the CUPS software you will need to be logged in as -root (doing an "su" is good enough). Once you are the root -user, run the installation script with: - - ./cups.install ENTER - -After asking you a few yes/no questions the CUPS software will -be installed and the scheduler will be started automatically. - - -INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS - -The host-specific distributions use the operating system -software installation tools. To install a host-specific -distribution please consult the CUPS Software Administrators -Manual or your operating system documentation. + CUPS is licensed under the GNU General Public License and GNU + Library General Public License. Please contact Easy Software + Products for commercial support and "binary distribution" + rights. READING THE DOCUMENTATION -Once you have installed the software you can access the -documentation (and a bunch of other stuff) on-line at: + Once you have installed the software you can access the + documentation (and a bunch of other stuff) on-line at: - http://localhost:631 + http://localhost:631/ -If you're having trouble getting that far, the documentation is -located in the "/usr/share/doc/cups" directory in the binary -distributions, and under the "doc" directory in the source -archives. + If you're having trouble getting that far, the documentation + is located under the "doc/help" directory. -Please read the documentation before asking questions. + Please read the documentation before asking questions. 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 many discussion forums which are available at: - http://www.cups.org/newsgroups.php + http://www.cups.org/newsgroups.php -Commercial support (with a guaranteed response time) is available -from Easy Software Products. For more information see: + Commercial support (with a guaranteed response time) is + available from Easy Software Products. For more information + see: - http://www.easysw.com/cups/ + http://www.easysw.com/cups/ -See the CUPS web site at "http://www.cups.org/" for other site -links. + See the CUPS web site at "http://www.cups.org/" for other + site links. SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER -CUPS 1.2 includes a web-based administration tool that allows you -to manage printers, classes, and jobs on your server. To access -the printer administration tools open the following URL in your -browser: + CUPS 1.2 includes a web-based administration tool that allows + you to manage printers, classes, and jobs on your server. + Open the following URL in your browser to access the printer + administration tools: - http://localhost:631/admin + http://localhost:631/admin/ -You will be asked for the administration password (root or any -other user in the sys/system/root group on your system) and then -shown a menu of available functions. + DO NOT use the hostname for your machine - it will not work + with the default CUPS configuration. To enable + administration access on other addresses, check the "Allow + Remote Administration" box and click on the "Change Settings" + button. -DO NOT use the hostname for your machine - it will not work with -the default CUPS configuration. To enable administration access -on other addresses, consult the CUPS Software Administrators -Manual. + You will be asked for the administration password (root or + any other user in the sys/system/root group on your system) + when performing any administrative function. SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE -CUPS works best with PPD (PostScript Printer Description) -files. In a pinch you can also use System V style printer -interface scripts. - -Six sample PPD files are provided with this distribution that -utilize the PostScript and image file RIPs and the sample EPSON -and HP printer drivers. To add the sample DeskJet driver to the -system for a printer connected to the parallel port, use one of -the following commands: - - HP-UX: + CUPS works best with PPD (PostScript Printer Description) + files. In a pinch you can also use System V style printer + interface scripts. - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E + CUPS includes several sample PPD files you can use: - IRIX: + Driver PPD File + ----------------------------- ------------ + Dymo Label Printers dymo.ppd + EPSON Stylus Color Series stcolor.ppd + EPSON Stylus Photo Series stphoto.ppd + EPSON Stylus New Color Series stcolor2.ppd + EPSON Stylus New Photo Series stphoto2.ppd + EPSON 9-pin Series epson9.ppd + EPSON 24-pin Series epson24.ppd + HP DeskJet Series deskjet.ppd + HP LaserJet Series laserjet.ppd + OKIDATA 9-Pin Series okidata9.ppd + OKIDATA 24-Pin Series okidat24.ppd + Zebra EPL1 Label Printer zebraep1.ppd + Zebra EPL2 Label Printer zebraep2.ppd + Zebra ZPL Label Printer zebra.ppd - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E + Run the "lpinfo" command to list the available printers: - Linux: + lpinfo -v - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E + Then use the correct URI to add the printer using the + "lpadmin" command: - Solaris: + lpadmin -p printername -E -v URI -m filename.ppd - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E - /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E + Network printers typically use "socket" or "lpd" URIs: -Similarly, for the other sample drivers you can use: + lpadmin -p printername -E -v socket://11.22.33.44 -m filename.ppd + lpadmin -p printername -E -v lpd://11.22.33.44/ -m filename.ppd - Driver PPD File - ----------------------------- ------------ - Dymo Label Printers dymo.ppd - EPSON Stylus Color Series stcolor.ppd - EPSON Stylus Photo Series stphoto.ppd - EPSON Stylus New Color Series stcolor2.ppd - EPSON Stylus New Photo Series stphoto2.ppd - EPSON 9-pin Series epson9.ppd - EPSON 24-pin Series epson24.ppd - HP DeskJet Series deskjet.ppd - HP New DeskJet Series deskjet2.ppd - HP LaserJet Series laserjet.ppd - OKIDATA 9-Pin Series okidata9.ppd - OKIDATA 24-Pin Series okidat24.ppd + The sample drivers provide basic printing capabilities, but + generally do not exercise the full potential of the printers + or CUPS. For fully-functional commercial printer drivers + check out our ESP Print Pro software at: -These sample drivers provide basic printing capabilities, but -generally do not exercise the full potential of the printers or -CUPS. For commercial printer drivers check out our ESP Print -Pro software at: - - http://www.easysw.com/printpro/ + http://www.easysw.com/printpro/ PRINTING FILES -CUPS provides both the System V "lp" and Berkeley "lpr" commands -for printing: + CUPS provides both the System V "lp" and Berkeley "lpr" + commands for printing: - lp filename - lpr filename + lp filename + lpr filename -Both the "lp" and "lpr" commands support printing options for -the driver: + Both the "lp" and "lpr" commands support printing options for + the driver: - lp -omedia=A4 -oresolution=600dpi filename - lpr -omedia=A4 -oresolution=600dpi filename + lp -omedia=A4 -oresolution=600dpi filename + lpr -omedia=A4 -oresolution=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. + 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. -If you have an application that generates output specifically -for your printer then you need to use the "-oraw" or "-l" -options: + If you have an application that generates output specifically + for your printer then you need to use the "-oraw" or "-l" + options: - lp -oraw filename - lpr -l filename + lp -oraw 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 1993-2006 by Easy Software Products. CUPS, -the CUPS logo, and the Common UNIX Printing System are the -trademark property of Easy Software Products. + CUPS is Copyright 1993-2006 by Easy Software Products. CUPS, + the CUPS logo, and the Common UNIX Printing System are the + trademark property of Easy Software Products. -The MD5 Digest code is Copyright 1999 Aladdin Enterprises. + The MD5 Digest code is Copyright 1999 Aladdin Enterprises. -The PDF filter (pdftops) is based on the Xpdf software, -Copyright 1996-2005 by Derek B. Noonburg. + The PDF filter (pdftops) is based on the Xpdf software, + Copyright 1996-2005 by Derek B. Noonburg. -This software is based in part on the work of the Independent -JPEG Group. + This software is based in part on the work of the Independent + JPEG Group. -CUPS is provided under the terms 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 "LICENSE.html", -"LICENSE.txt", or "cups.license" files for more information. + CUPS is provided under the terms 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. -For commercial licensing information, please contact: + For commercial licensing information, please contact: - Attn: CUPS Licensing Information - Easy Software Products - 44141 Airport View Drive, Suite 204 - Hollywood, Maryland 20636 USA + Attn: CUPS Licensing Information + Easy Software Products + 44141 Airport View Drive, Suite 204 + Hollywood, Maryland 20636 USA - Voice: +1.301.373.9600 - Email: cups-info@cups.org - WWW: http://www.cups.org + Voice: +1.301.373.9600 + Email: cups-info@cups.org + WWW: http://www.cups.org/ -Note that commercial licensors may also require a license from -Derek B. Noonburg who developed the Xpdf software used to print -PDF files. + Note that commercial licensors may also require a license from + Derek B. Noonburg who developed the Xpdf software used to print + PDF files. diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c index 2aa9bed78..d7fd569e7 100644 --- a/cgi-bin/classes.c +++ b/cgi-bin/classes.c @@ -1,5 +1,5 @@ /* - * "$Id: classes.c 5160 2006-02-24 01:14:18Z mike $" + * "$Id: classes.c 5202 2006-02-28 19:37:03Z mike $" * * Class status CGI for the Common UNIX Printing System (CUPS). * @@ -84,8 +84,13 @@ main(int argc, /* I - Number of command-line arguments */ */ if ((pclass = getenv("PATH_INFO")) != NULL) + { pclass ++; + if (!*pclass) + pclass = NULL; + } + /* * See who is logged in... */ @@ -458,5 +463,5 @@ show_class(http_t *http, /* I - Connection to server */ /* - * End of "$Id: classes.c 5160 2006-02-24 01:14:18Z mike $". + * End of "$Id: classes.c 5202 2006-02-28 19:37:03Z mike $". */ diff --git a/cgi-bin/help.c b/cgi-bin/help.c index efee0fe5b..6dc512ead 100644 --- a/cgi-bin/help.c +++ b/cgi-bin/help.c @@ -56,6 +56,7 @@ main(int argc, /* I - Number of command-line arguments */ directory[1024]; /* Directory */ cups_file_t *fp; /* Help file */ char line[1024]; /* Line from file */ + int printable; /* Show printable version? */ /* @@ -64,6 +65,8 @@ main(int argc, /* I - Number of command-line arguments */ cgiInitialize(); + printable = cgiGetVariable("PRINTABLE") != NULL; + /* * Set the web interface section... */ @@ -92,7 +95,7 @@ main(int argc, /* I - Number of command-line arguments */ { perror(filename); - cgiStartHTML("Help"); + cgiStartHTML(cgiText(_("Help"))); cgiSetVariable("ERROR", "Unable to load help index!"); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -133,7 +136,7 @@ main(int argc, /* I - Number of command-line arguments */ { perror(filename); - cgiStartHTML("Help"); + cgiStartHTML(cgiText(_("Help"))); cgiSetVariable("ERROR", "Unable to access help file!"); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -143,7 +146,7 @@ main(int argc, /* I - Number of command-line arguments */ if ((n = helpFindNode(hi, helpfile, NULL)) == NULL) { - cgiStartHTML("Help"); + cgiStartHTML(cgiText(_("Help"))); cgiSetVariable("ERROR", "Help file not in index!"); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -162,7 +165,10 @@ main(int argc, /* I - Number of command-line arguments */ * Send a standard page header... */ - cgiStartHTML(n->text); + if (printable) + puts("Content-Type: text/html;charset=utf-8\n"); + else + cgiStartHTML(n->text); } else { @@ -170,7 +176,7 @@ main(int argc, /* I - Number of command-line arguments */ * Send a standard page header... */ - cgiStartHTML("Help"); + cgiStartHTML(cgiText(_("Help"))); } /* @@ -311,7 +317,10 @@ main(int argc, /* I - Number of command-line arguments */ * Show the search and bookmark content... */ - cgiCopyTemplateLang("help-header.tmpl"); + if (!helpfile || !printable) + cgiCopyTemplateLang("help-header.tmpl"); + else + cgiCopyTemplateLang("help-printable.tmpl"); /* * If we are viewing a file, copy it in now... @@ -353,7 +362,10 @@ main(int argc, /* I - Number of command-line arguments */ * Send a standard trailer... */ - cgiEndHTML(); + if (!printable) + cgiEndHTML(); + else + puts("\n"); /* * Delete the index... diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c index 0b4a3a8cb..74b950d56 100644 --- a/cgi-bin/printers.c +++ b/cgi-bin/printers.c @@ -1,5 +1,5 @@ /* - * "$Id: printers.c 5160 2006-02-24 01:14:18Z mike $" + * "$Id: printers.c 5202 2006-02-28 19:37:03Z mike $" * * Printer status CGI for the Common UNIX Printing System (CUPS). * @@ -87,8 +87,13 @@ main(int argc, /* I - Number of command-line arguments */ */ if ((printer = getenv("PATH_INFO")) != NULL) + { printer ++; + if (!*printer) + printer = NULL; + } + /* * See who is logged in... */ @@ -633,5 +638,5 @@ show_printer(http_t *http, /* I - Connection to server */ /* - * End of "$Id: printers.c 5160 2006-02-24 01:14:18Z mike $". + * End of "$Id: printers.c 5202 2006-02-28 19:37:03Z mike $". */ diff --git a/cups/http.c b/cups/http.c index da2279344..dc0da3892 100644 --- a/cups/http.c +++ b/cups/http.c @@ -1,5 +1,5 @@ /* - * "$Id: http.c 5200 2006-02-28 00:10:32Z mike $" + * "$Id: http.c 5222 2006-03-03 18:57:56Z mike $" * * HTTP routines for the Common UNIX Printing System (CUPS). * @@ -2278,7 +2278,7 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */ gnutls_init(&(conn->session), GNUTLS_CLIENT); gnutls_set_default_priority(conn->session); gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials); - gnutls_transport_set_ptr(conn->session, http->fd); + gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)http->fd); if ((gnutls_handshake(conn->session)) != GNUTLS_E_SUCCESS) { @@ -2754,5 +2754,5 @@ http_write_ssl(http_t *http, /* I - HTTP connection */ /* - * End of "$Id: http.c 5200 2006-02-28 00:10:32Z mike $". + * End of "$Id: http.c 5222 2006-03-03 18:57:56Z mike $". */ diff --git a/doc/Makefile b/doc/Makefile index 443fda185..ddfe235a3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5192 2006-02-27 03:08:47Z mike $" +# "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $" # # Documentation makefile for the Common UNIX Printing System (CUPS). # @@ -29,64 +29,71 @@ include ../Makedefs # LANGUAGES = ja -WEBPAGES = cups.css cupsdoc.css index.html robots.txt +WEBPAGES = \ + cups.css \ + cups-printable.css \ + favicon.ico \ + index.html \ + robots.txt WEBBUTTONS = \ - images/accept-jobs.gif \ - images/add-class.gif \ - images/add-printer.gif \ - images/add-this-printer.gif \ - images/cancel.gif \ - images/cancel-all-jobs.gif \ - images/cancel-job.gif \ - images/change-settings.gif \ - images/clean-print-heads.gif \ - images/continue.gif \ - images/delete-class.gif \ - images/delete-printer.gif \ - images/edit-configuration-file.gif \ - images/export-samba.gif \ - images/help.gif \ - images/hold-job.gif \ - images/manage-classes.gif \ - images/manage-jobs.gif \ - images/manage-printers.gif \ - images/manage-server.gif \ - images/modify-class.gif \ - images/modify-printer.gif \ - images/move-job.gif \ - images/move-jobs.gif \ - images/print-self-test-page.gif \ - images/print-test-page.gif \ - images/publish-printer.gif \ - images/reject-jobs.gif \ - images/release-job.gif \ - images/restart-job.gif \ - images/save-changes.gif \ - images/search.gif \ - images/set-allowed-users.gif \ - images/set-as-default.gif \ - images/set-printer-options.gif \ - images/show-active.gif \ - images/show-all.gif \ - images/show-completed.gif \ - images/show-next.gif \ - images/show-previous.gif \ - images/sort-ascending.gif \ - images/sort-descending.gif \ - images/start-class.gif \ - images/start-printer.gif \ - images/stop-class.gif \ - images/stop-printer.gif \ - images/unpublish-printer.gif \ - images/use-default-config.gif \ - images/view-access-log.gif \ - images/view-error-log.gif \ - images/view-page-log.gif + images/button-accept-jobs.gif \ + images/button-add-class.gif \ + images/button-add-printer.gif \ + images/button-add-this-printer.gif \ + images/button-cancel.gif \ + images/button-cancel-all-jobs.gif \ + images/button-cancel-job.gif \ + images/button-change-settings.gif \ + images/button-clean-print-heads.gif \ + images/button-clear.gif \ + images/button-continue.gif \ + images/button-delete-class.gif \ + images/button-delete-printer.gif \ + images/button-edit-configuration-file.gif \ + images/button-export-samba.gif \ + images/button-help.gif \ + images/button-hold-job.gif \ + images/button-manage-classes.gif \ + images/button-manage-jobs.gif \ + images/button-manage-printers.gif \ + images/button-manage-server.gif \ + images/button-modify-class.gif \ + images/button-modify-printer.gif \ + images/button-move-job.gif \ + images/button-move-jobs.gif \ + images/button-print-self-test-page.gif \ + images/button-print-test-page.gif \ + images/button-publish-printer.gif \ + images/button-reject-jobs.gif \ + images/button-release-job.gif \ + images/button-restart-job.gif \ + images/button-save-changes.gif \ + images/button-search.gif \ + images/button-set-allowed-users.gif \ + images/button-set-as-default.gif \ + images/button-set-printer-options.gif \ + images/button-show-active.gif \ + images/button-show-all.gif \ + images/button-show-completed.gif \ + images/button-show-next.gif \ + images/button-show-previous.gif \ + images/button-sort-ascending.gif \ + images/button-sort-descending.gif \ + images/button-start-class.gif \ + images/button-start-printer.gif \ + images/button-stop-class.gif \ + images/button-stop-printer.gif \ + images/button-unpublish-printer.gif \ + images/button-use-default-config.gif \ + images/button-view-access-log.gif \ + images/button-view-error-log.gif \ + images/button-view-page-log.gif \ + images/button-view-printable-version.gif WEBIMAGES = \ - favicon.ico \ images/bottom-left.gif \ images/bottom-right.gif \ images/classes.gif \ + images/cups-block-diagram.gif \ images/esp-logo.gif \ images/happy.gif \ images/logo.gif \ @@ -97,9 +104,14 @@ WEBIMAGES = \ images/tab-right.gif \ images/top-left.gif \ images/top-middle.gif \ - images/top-right.gif + images/top-right.gif \ + images/web-add-this-printer.gif \ + images/web-password.gif \ + images/web-printer-driver.gif \ + images/web-printer-status.gif \ + images/web-set-printer-options.gif \ + images/web-test-page.gif HELPFILES = \ - help/access_log-reference.html \ help/api-array.html \ help/api-cups.html \ help/api-filedir.html \ @@ -107,30 +119,26 @@ HELPFILES = \ help/api-httpipp.html \ help/api-ppd.html \ help/api-raster.html \ - help/classes-conf-reference.html \ - help/client-conf-reference.html \ - help/cupsd-conf-reference.html \ - help/error_log-reference.html \ - help/page_log-reference.html \ - help/printers-conf-reference.html \ - help/subscriptions-conf-reference.html \ + help/cgi.html \ + help/glossary.html \ + help/license.html \ help/man-accept.html \ help/man-backend.html \ help/man-cancel.html \ help/man-classes.conf.html \ help/man-client.conf.html \ - help/man-cupsaddsmb.html \ help/man-cups-config.html \ - help/man-cupsd.html \ - help/man-cupsd.conf.html \ - help/man-cupsenable.html \ help/man-cups-lpd.html \ help/man-cups-polld.html \ + help/man-cupsaddsmb.html \ + help/man-cupsd.conf.html \ + help/man-cupsd.html \ + help/man-cupsenable.html \ help/man-cupstestppd.html \ help/man-filter.html \ + help/man-lp.html \ help/man-lpadmin.html \ help/man-lpc.html \ - help/man-lp.html \ help/man-lpinfo.html \ help/man-lpmove.html \ help/man-lpoptions.html \ @@ -143,11 +151,26 @@ HELPFILES = \ help/man-mime.types.html \ help/man-printers.conf.html \ help/network.html \ + help/options.html \ help/overview.html \ + help/ref-access_log.html \ + help/ref-classes-conf.html \ + help/ref-client-conf.html \ + help/ref-cupsd-conf.html \ + help/ref-error_log.html \ + help/ref-page_log.html \ + help/ref-printers-conf.html \ + help/ref-subscriptions-conf.html \ + help/security.html \ + help/spec-cmp.html \ help/spec-command.html \ + help/spec-design.html \ help/spec-ipp.html \ help/spec-ppd.html \ + help/spec-raster.html \ + help/spec-stp.html \ help/standard.html \ + help/translation.html \ help/whatsnew.html @@ -184,9 +207,13 @@ install: all done for lang in $(LANGUAGES); do \ $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang/images; \ - $(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \ + if test -f $$lang/index.html; then \ + $(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \ + fi \ for file in $(WEBBUTTONS); do \ - $(INSTALL_MAN) $$lang/$$file $(DOCDIR)/$$lang/images; \ + if test -f $$lang/$$file; then \ + $(INSTALL_MAN) $$lang/$$file $(DOCDIR)/$$lang/images; \ + fi \ done \ done diff --git a/doc/cmp.html b/doc/cmp.html deleted file mode 100644 index 7bd293c56..000000000 --- a/doc/cmp.html +++ /dev/null @@ -1,755 +0,0 @@ - - - -CUPS Configuration Management Plan - - - - - - - -
CUPS Configuration Management Plan
-

CUPS Configuration Management Plan


-CUPS-CMP-1.1
-Easy Software Products
-Copyright 1997-2005, All Rights Reserved
-
-
-

Table of Contents

-
-
1 Scope - -2 References - -3 File Management - -4 Trouble Report Processing - -5 Software Releases - -A Glossary - -B Coding Requirements - -C Software Trouble Report Form
-

1 Scope

-

1.1 Identification

-

This configuration management plan document provides the guidelines - for development and maintenance of the Common UNIX Printing System - ("CUPS") Version 1.1 software.

-

1.2 System Overview

-

CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

-

CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

-

CUPS includes an image file RIP that supports printing of image files - to non-PostScript printers. A customized version of GNU Ghostscript - 7.05 for CUPS called ESP Ghostscript is available separately to support - printing of PostScript files within the CUPS driver framework. Sample - drivers for Dymo, EPSON, HP, and OKIDATA printers are included that use - these filters.

-

Drivers for thousands of printers are provided with our ESP Print Pro - software, available at:

-
-    http://www.easysw.com/printpro/
-
-

CUPS is licensed under the GNU General Public License and GNU Library - General Public License. Please contact Easy Software Products for - commercial support and "binary distribution" rights.

-

1.3 Document Overview

-

This configuration management document is organized into the - following sections:

-
    -
  • 1 - Scope
  • -
  • 2 - References
  • -
  • 3 - File Management
  • -
  • 4 - Trouble Report Processing
  • -
  • 5 - Software Releases
  • -
  • A - Glossary
  • -
  • B - Coding Requirements
  • -
-

2 References

-

2.1 CUPS Documentation

-

The following CUPS documentation is referenced by this document:

-
    -
  • CUPS-CMP-1.1: CUPS Configuration Management Plan
  • -
  • CUPS-IDD-1.1: CUPS System Interface Design Description
  • -
  • CUPS-IPP-1.1: CUPS Implementation of IPP
  • -
  • CUPS-SAM-1.1.x: CUPS Software Administrators Manual
  • -
  • CUPS-SDD-1.1: CUPS Software Design Description
  • -
  • CUPS-SPM-1.1.x: CUPS Software Programming Manual
  • -
  • CUPS-SSR-1.1: CUPS Software Security Report
  • -
  • CUPS-STP-1.1: CUPS Software Test Plan
  • -
  • CUPS-SUM-1.1.x: CUPS Software Users Manual
  • -
  • CUPS-SVD-1.1: CUPS Software Version Description
  • -
-

2.2 Other Documents

-

The following non-CUPS documents are referenced by this document:

- -

3 File Management

-

3.1 Directory Structure

-

Each source file shall be placed a sub-directory corresponding to the - software sub-system it belongs to ("scheduler", "cups", etc.) To remain - compatible with older UNIX filesystems, directory names shall not - exceed 16 characters in length.

-

3.2 Source Files

-

Source files shall be documented and formatted as described in - Appendix B, Coding Requirements. To remain compatible with older UNIX - filesystems, source file names shall not exceed 16 characters in - length.

-

3.3 Configuration Management

-

Source files shall be placed under the control of the Concurrent - Versions System ("CVS") software. Source files shall be "checked in" - with each change so that modifications can be tracked.

-

Documentation on the CVS software is included with the whitepaper, - "CVS II: Parallelizing Software Development".

-

4 Trouble Report Processing

-

A Software Trouble Report ("STR") shall be submitted every time a - user or vendor experiences a problem with the CUPS software. Trouble - reports are maintained in a database with one of the following states:

-
    -
  1. STR is closed with complete resolution
  2. -
  3. STR is closed without resolution
  4. -
  5. STR is active
  6. -
  7. STR is pending (new STR or additional information available)
  8. -
-

Trouble reports shall be processed using the following steps.

-

4.1 Classification

-

When a trouble report is received it must be classified at one of the - following priority levels:

-
    -
  1. Request for enhancement, e.g. asking for a feature
  2. -
  3. Low, e.g. a documentation error or undocumented side-effect
  4. -
  5. Moderate, e.g. unable to print a file or unable to compile the - software
  6. -
  7. High, e.g. unable to print to a printer or key functionality not - working
  8. -
  9. Critical, e.g. unable to print at all
  10. -
-

Level 4 and 5 trouble reports must be resolved in the next software - release. Level 1 to 3 trouble reports are scheduled for resolution in a - specific release at the discretion of the release coordinator.

-

The scope of the problem should also be determined as:

-
    -
  1. Specific to a machine or printer
  2. -
  3. Specific to an operating system
  4. -
  5. Applies to all machines, printers, and operating systems
  6. -
-

4.2 Identification

-

Once the level and scope of the trouble report is determined the - software sub-system(s) involved with the problem are determined. This - may involve additional communication with the user or vendor to isolate - the problem to a specific cause.

-

When the sub-system(s) involved have been identified, an engineer - will then determine the change(s) needed and estimate the time required - for the change(s).

-

4.3 Correction

-

Corrections are scheduled based upon the severity and complexity of - the problem. Once all changes have been made, documented, and tested - successfully a new software release snapshot is generated. Additional - tests are added as necessary for proper testing of the changes.

-

4.4 Notification

-

The user or vendor is notified when the fix is available or if the - problem was caused by user error.

-

5 Software Releases

-

5.1 Version Numbering

-

CUPS uses a three-part version number separated by periods to - represent the major, minor, and patch release numbers:

-
-    MAJOR.MINOR.PATCH
-    1.1.0
-
-

Beta-test releases are indentified by appending the letter B followed - by the build number:

-
-    MAJOR.MINOR.PATCHbBUILD
-    1.1.0b1
-
-

Release candidates are indentified by appending the letters RC - followed by the build number:

-
-    MAJOR.MINOR.PATCHrcBUILD
-    1.1.0rc1
-
-

A CVS snapshot is generated for every beta and final release and uses - the version number preceded by the letter "v" and with the decimal - points replaced by underscores:

-
-    v1_1_0b1
-    v1_1_0rc1
-    v1_1_0
-
-

Each change that corrects a fault in a software sub-system increments - the patch release number. If a change affects the overall software - design of CUPS then the minor release number will be incremented and - the patch release number reset to 0. If CUPS is completely redesigned - the major release number will be incremented and the minor and patch - release numbers reset to 0:

-
-    1.1.0b1    First beta release
-    1.1.0b2    Second beta release
-    1.1.0rc1   First release candidate
-    1.1.0rc2   Second release candidate
-    1.1.0      First production release
-    1.1.1b1    First beta of 1.1.1
-    1.1.1rc1   First release candidate of 1.1.1
-    1.1.1      Production release of 1.1.1
-    1.1.2b1    First beta of 1.1.2
-    1.1.2rc1   First release candidate of 1.1.2
-    1.1.2      Production release of 1.1.2
-    2.0.0b1    First beta of 2.0.0
-    2.0.0rc1   First release candidate of 2.0.0
-    2.0.0      Production release of 2.0.0
-
-

5.2 Generation

-

Software releases shall be generated for each successfully completed - software trouble report. All object and executable files shall be - deleted prior to performing a full build to ensure that source files - are recompiled.

-

5.3 Testing

-

Software testing shall be conducted according to the CUPS Software - Test Plan, CUPS-STP-1.1. Failed tests cause STRs to be generated to - correct the problems found.

-

5.4 Releases

-

When testing has been completed successfully a new distribution image - is created from the current CVS code "snapshot". No release shall - contain software that has not passed the appropriate software tests. - Three types of releases are used, beta, release candidate, and - production, and are released using the following basic schedule: -

- - - - - - - - -
WeekVersionDescription
T-6 weeks1.1.0b1First beta
T-5 weeks1.1.0b2Second beta
T-4 weeks1.1.0b3Third beta
T-3 weeks1.1.0rc1First release candidate
T-2 weeks1.1.0rc2Second release candidate
T-0 weeks1.1.0Production
-
-

-

Beta releases are typically used prior to new major and minor version - releases. At least one release candidate is generated prior to each - production release.

-

5.4.1 Beta Releases

-

Beta releases are generated when substantial changes have been made - that may affect the reliability of the software. Beta releases may - cause loss of data, functionality, or services and are provided for - testing by qualified individuals.

-

Beta releases are an OPTIONAL part of the release process and are - generated as deemed appropriate by the release coordinator. Functional - changes may be included in subsequent beta releases until the first - release candidate.

-

5.4.2 Release Candidates

-

Release candidates are generated at least two weeks prior to a - production release. Release candidates are targeted for end-users that - wish to test new functionality or bug fixes prior to the production - release. While release candidates are intended to be substantially - bug-free, they may still contain defects and/or not compile on specific - platforms.

-

At least one release candidate is REQUIRED prior to any production - release. The distribution of a release candidate marks the end of any - functional improvements. Release candidates are generated at weekly - intervals until all level 4/5 trouble reports are resolved.

-

5.4.3 Production Releases

-

Production releases are generated after a successful release - candidate and represent a stable release of the software suitable for - all users.

-

A Glossary

-

A.1 Terms

-
-
C
-
A computer language.
-
parallel
-
Sending or receiving data more than 1 bit at a time.
-
pipe
-
A one-way communications channel between two programs.
-
serial
-
Sending or receiving data 1 bit at a time.
-
socket
-
A two-way network communications channel.
-
-

A.2 Acronyms

-
-
ASCII
-
American Standard Code for Information Interchange
-
CUPS
-
Common UNIX Printing System
-
ESC/P
-
EPSON Standard Code for Printers
-
FTP
-
File Transfer Protocol
-
HP-GL
-
Hewlett-Packard Graphics Language
-
HP-PCL
-
Hewlett-Packard Page Control Language
-
HP-PJL
-
Hewlett-Packard Printer Job Language
-
IETF
-
Internet Engineering Task Force
-
IPP
-
Internet Printing Protocol
-
ISO
-
International Standards Organization
-
LPD
-
Line Printer Daemon
-
MIME
-
Multimedia Internet Mail Exchange
-
PPD
-
PostScript Printer Description
-
SMB
-
Server Message Block
-
TFTP
-
Trivial File Transfer Protocol
-
-

B Coding Requirements

-

These coding requirements provide detailed information on source file - formatting and documentation content. These guidelines shall be applied - to all C and C++ source files provided with CUPS. Source code for other - languages should conform to these requirements as allowed by the - language.

-

B.1 Source Files

-

B.1.1 Naming

-

All source files names shall be 16 characters or less in length to - ensure compatibility with older UNIX filesystems. Source files - containing functions shall have an extension of ".c" for ANSI C and - ".cxx" for C++ source files. All other "include" files shall have an - extension of ".h".

-

B.1.2 Documentation

-

The top of each source file shall contain 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 CVS "$Id$" tag:

-
-    /*
-     * "$Id$"
-     *
-     *   Description of file contents.
-     *
-     *   Copyright 1997-2005 by Easy Software Products, all rights
-     *   reserved.
-     *
-     *   These coded instructions, statements, and computer programs are
-     *   the property of Easy Software Products and are protected by
-     *   Federal copyright law.  Distribution and use rights are outlined
-     *   in the file "LICENSE.txt" which should have been included with
-     *   this file.  If this file is missing or damaged please contact
-     *   Easy Software Products at:
-     *
-     *       Attn: CUPS Licensing Information
-     *       Easy Software Products
-     *       44141 Airport View Drive, Suite 204
-     *       Hollywood, Maryland 20636 USA
-     *
-     *       Voice: (301) 373-9600
-     *       EMail: cups-info@cups.org
-     *         WWW: http://www.cups.org
-     *
-     * Contents:
-     *
-     *   function1() - Description 1.
-     *   function2() - Description 2.
-     *   function3() - Description 3.
-     */
-
- - -

For source files that are subject to the Apple OS-Developed Software - exception, the following additional comment should appear after the - contact information:

-
-     *   This file is subject to the Apple OS-Developed Software exception.
-
-

The bottom of each source file shall contain a trailer giving the - name of the file using the CVS "$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:

-
-    /*
-     * End of "$Id$".
-     */
-
-

B.2 Functions

-

B.2.1 Naming

-

Functions with a global scope shall be capitalized ("DoThis", - "DoThat", "DoSomethingElse", etc.) The only exception to this rule - shall be the CUPS interface library functions which may begin with a - prefix word in lowercase ("cupsDoThis", "cupsDoThat", etc.)

-

Functions with a local scope shall be declared "static" and be - lowercase with underscores between words ("do_this", "do_that", - "do_something_else", etc.)

-

B.2.2 Documentation

-

Each function shall begin with a comment header describing what the - function does, the possible input limits (if any), and the possible - output values (if any), and any special information needed:

-
-    /*
-     * 'do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    static float     /* O - Inverse power value, 0.0 <= y <= 1.1 */
-    do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */
-    {
-      ...
-      return (y);
-    }
-
-

Return/output values are indicated using an "O" prefix, input values - are indicated using the "I" prefix, and values that are both input and - output use the "IO" prefix for the corresponding in-line comment.

-

B.3 Methods

-

B.3.1 Naming

-

Methods shall be in lowercase with underscores between words - ("do_this", "do_that", "do_something_else", etc.)

-

B.3.2 Documentation

-

Each method shall begin with a comment header describing what the - method does, the possible input limits (if any), and the possible - output values (if any), and any special information needed:

-
-    /*
-     * 'class::do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    float                   /* O - Inverse power value, 0.0 <= y <= 1.0 */
-    class::do_this(float x) /* I - Power value (0.0 <= x <= 1.0) */
-    {
-      ...
-      return (y);
-    }
-
-

Return/output values are indicated using an "O" prefix, input values - are indicated using the "I" prefix, and values that are both input and - output use the "IO" prefix for the corresponding in-line comment.

-

B.4 Variables

-

B.4.1 Naming

-

Variables with a global scope shall be capitalized ("ThisVariable", - "ThatVariable", "ThisStateVariable", etc.) The only exception to this - rule shall be the CUPS interface library global variables which must - begin with the prefix "cups" ("cupsThisVariable", "cupsThatVariable", - etc.) Global variables shall be replaced by function arguments whenever - possible.

-

Variables with a local scope shall be lowercase with underscores - between words ("this_variable", "that_variable", etc.) Any local - variables shared by functions within a source file shall be declared - "static".

-

B.4.2 Documentation

-

Each variable shall be declared on a separate line and shall be - immediately followed by a comment block describing the variable:

-
-    int this_variable;   /* The current state of this */
-    int that_variable;   /* The current state of that */
-
-

B.5 Types

-

B.5.1 Naming

-

All type names shall be lowercase with underscores between words and - "_t" appended to the end of the name ("this_type_t", "that_type_t", - etc.)

-

B.5.2 Documentation

-

Each type shall have a comment block immediately before the typedef:

-
-    /*
-     * This type is for CUPS foobar options.
-     */
-    typedef int cups_this_type_t;
-
-

B.6 Structures

-

B.6.1 Naming

-

All structure names shall be lowercase with underscores between words - and "_str" appended to the end of the name ("this_struct_str", - "that_struct_str", etc.)

-

B.6.2 Documentation

-

Each structure shall have a comment block immediately before the - struct and each member shall be documented in accordance with the - variable naming policy above:

-
-    /*
-     * This structure is for CUPS foobar options.
-     */
-    struct cups_this_struct_str
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-
-

B.7 Classes

-

B.7.1 Naming

-

All class names shall be lowercase with underscores between words - ("this_class", "that_class", etc.)

-

B.7.2 Documentation

-

Each class shall have a comment block immediately before the class - and each member shall be documented in accordance with the variable - naming policy above:

-
-    /*
-     * This class is for CUPS foobar options.
-     */
-    class cups_this_class
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-
-

B.8 Constants

-

B.8.1 Naming

-

All constant names shall be uppercase with underscored between words - ("THIS_CONSTANT", "THAT_CONSTANT", etc.) Constants defined for the CUPS - interface library must begin with an uppercase prefix - ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.)

-

Typed enumerations shall be used whenever possible to allow for type - checking by the compiler.

-

B.8.2 Documentation

-

Comment blocks shall immediately follow each constant:

-
-    enum
-    {
-      CUPS_THIS_TRAY,   /* This tray */
-      CUPS_THAT_TRAY    /* That tray */
-    };
-
-

B.9 Code

-

B.9.1 Documentation

-

All source code shall utilize block comments within functions to - describe the operations being performed by a group of statements:

-
-    /*
-     * Clear the state array before we begin...
-     */
-
-    for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-      array[i] = STATE_IDLE;
-
-    /*
-     * Wait for state changes...
-     */
-
-    do
-    {
-      for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-	if (array[i] != STATE_IDLE)
-	  break;
-
-      if (i == (sizeof(array) / sizeof(array[0])))
-	sleep(1);
-    } while (i == (sizeof(array) / sizeof(array[0])));
-
-

B.9.2 Style

-

B.9.2.a Indentation

-

All code blocks enclosed by brackets shall begin with the opening - brace on a new line. The code then follows starting on a new line after - the brace and is indented 2 spaces. The closing brace is then placed on - a new line following the code at the original indentation:

-
-    {
-      int i; /* Looping var */
-
-     /*
-      * Process foobar values from 0 to 999...
-      */
-
-      for (i = 0; i < 1000; i ++)
-      {
-	do_this(i);
-	do_that(i);
-      }
-    }
-
-

Single-line statements following "do", "else", "for", "if", and - "while" shall be indented 2 spaces as well. Blocks of code in a - "switch" block shall be indented 4 spaces after each "case" and - "default" case:

-
-    switch (array[i])
-    {
-      case STATE_IDLE :
-	  do_this(i);
-	  do_that(i);
-	  break;
-      default :
-	  do_nothing(i);
-	  break;
-    }
-
-

B.9.2.b Spacing

-

A space shall follow each reserved word ("if", "while", etc.) Spaces - shall not be inserted between a function name and the arguments in - parenthesis.

-

B.9.2.c Return Values

-

Parenthesis shall surround values returned from a function using - "return":

-
-    return (STATE_IDLE);
-
-

B.9.2.d Loops

-

Whenever convenient loops should count downward to zero to improve - program performance:

-
-    for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
-      array[i] = STATE_IDLE;
-
-

C Software Trouble Report Form

-
- - - - - - - - - - - - - - -
Summary of Problem: -_____________________________________________
 
Problem Severity: -__1Request for enhancement, e.g. asking for a feature
__2Low, e.g. a documentation error or undocumented - side-effect
__3Moderate, e.g. unable to print a file or unable to - compile the software
__4High, e.g. unable to print to a printer or key - functionality not working
__5Critical, e.g. unable to print at all
 
Problem Scope: -__1Machine or printer
__2Operating System
__3All machines, printers, or operating systems
 
Detailed Description of Problem:_____________________________________________ -
_____________________________________________ -
_____________________________________________ -
_____________________________________________ -
_____________________________________________
-
- - diff --git a/doc/cmp.pdf b/doc/cmp.pdf deleted file mode 100644 index 47b50ffe31b3197cbe1d18a300263e6834f75448..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 300850 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 ^W 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

YTI64rftzkGAJu{}fbG;}yzQx=$#G35-uxVH(pE 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 diff --git a/doc/cmp.shtml b/doc/cmp.shtml deleted file mode 100644 index 360d985ef..000000000 --- a/doc/cmp.shtml +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - CUPS Configuration Management Plan - - - -

Scope

- -

Identification

- -

This configuration management plan document provides the -guidelines for development and maintenance of the Common UNIX -Printing System ("CUPS") Version 1.2 software. - - - -

Document Overview

- -

This configuration management document is organized into the -following sections: - -

    -
  • 1 - Scope
  • -
  • 2 - References
  • -
  • 3 - File Management
  • -
  • 4 - Trouble Report Processing
  • -
  • 5 - Software Releases
  • -
  • A - Glossary
  • -
  • B - Coding Requirements
  • -
- - - -

File Management

- -

Directory Structure

- -

Each source file shall be placed a sub-directory -corresponding to the software sub-system it belongs to -("scheduler", "cups", etc.) To remain compatible with older UNIX -filesystems, directory names shall not exceed 16 characters in -length. - -

Source Files

- -

Source files shall be documented and formatted as described -in Appendix B, Coding Requirements. To remain compatible with -older UNIX filesystems, source file names shall not exceed 16 -characters in length. - -

Configuration Management

- -

Source files shall be placed under the control of the -Concurrent Versions System ("CVS") software. Source files shall -be "checked in" with each change so that modifications can be -tracked. - -

Documentation on the CVS software is included with the -whitepaper, "CVS II: Parallelizing Software Development". - -

Trouble Report Processing

- -

A Software Trouble Report ("STR") shall be submitted every -time a user or vendor experiences a problem with the CUPS -software. Trouble reports are maintained in a database with one -of the following states: - -

    -
  1. STR is closed with complete resolution
  2. -
  3. STR is closed without resolution
  4. -
  5. STR is active, waiting on information from submitter
  6. -
  7. STR is pending with additional information from submitter
  8. -
  9. STR is newly submitted
  10. -
- -

Trouble reports shall be processed using the following steps. - -

Classification

- -

When a trouble report is received it must be classified at -one of the following priority levels: - -

    - -
  1. Request for enhancement, e.g. asking for a - feature
  2. - -
  3. Low, e.g. a documentation error or undocumented - side-effect
  4. - -
  5. Moderate, e.g. unable to print a file or unable to - compile the software
  6. - -
  7. High, e.g. unable to print to a printer or key - functionality not working
  8. - -
  9. Critical, e.g. unable to print at all
  10. - -
- -

Level 4 and 5 trouble reports must be resolved in the next -software release. Level 1 to 3 trouble reports are scheduled for -resolution in a specific release at the discretion of the -release coordinator. - -

The scope of the problem should also be determined as: - -

    -
  1. Specific to a machine or printer
  2. -
  3. Specific to an operating system
  4. -
  5. Applies to all machines, printers, and operating systems
  6. -
- -

Identification

- -

Once the level and scope of the trouble report is determined -the software sub-system(s) involved with the problem are -determined. This may involve additional communication with the -user or vendor to isolate the problem to a specific cause. - -

When the sub-system(s) involved have been identified, an -engineer will then determine the change(s) needed and estimate -the time required for the change(s). - -

Correction

- -

Corrections are scheduled based upon the severity and -complexity of the problem. Once all changes have been made, -documented, and tested successfully a new software release -snapshot is generated. Additional tests are added as necessary -for proper testing of the changes. - -

Notification

- -

The user or vendor is notified when the fix is available or -if the problem was caused by user error. - -

Software Releases

- -

Version Numbering

- -

CUPS uses a three-part version number separated by periods to -represent the major, minor, and patch release numbers: - -

-    MAJOR.MINOR.PATCH
-    1.1.0
-
- -

Beta-test releases are indentified by appending the letter B -followed by the build number: - -

-    MAJOR.MINOR.PATCHbBUILD
-    1.1.0b1
-
- -

Release candidates are indentified by appending the letters -RC followed by the build number: - -

-    MAJOR.MINOR.PATCHrcBUILD
-    1.1.0rc1
-
- -

A CVS snapshot is generated for every beta and final release -and uses the version number preceded by the letter "v" and with -the decimal points replaced by underscores: - -

-    v1_1_0b1
-    v1_1_0rc1
-    v1_1_0
-
- -

Each change that corrects a fault in a software sub-system -increments the patch release number. If a change affects the -overall software design of CUPS then the minor release number -will be incremented and the patch release number reset to 0. If -CUPS is completely redesigned the major release number will be -incremented and the minor and patch release numbers reset to 0: - -

-    1.1.0b1    First beta release
-    1.1.0b2    Second beta release
-    1.1.0rc1   First release candidate
-    1.1.0rc2   Second release candidate
-    1.1.0      First production release
-    1.1.1b1    First beta of 1.1.1
-    1.1.1rc1   First release candidate of 1.1.1
-    1.1.1      Production release of 1.1.1
-    1.1.2b1    First beta of 1.1.2
-    1.1.2rc1   First release candidate of 1.1.2
-    1.1.2      Production release of 1.1.2
-    2.0.0b1    First beta of 2.0.0
-    2.0.0rc1   First release candidate of 2.0.0
-    2.0.0      Production release of 2.0.0
-
- -

Generation

- -

Software releases shall be generated for each successfully -completed software trouble report. All object and executable -files shall be deleted prior to performing a full build to -ensure that source files are recompiled.

- -

Testing

- -

Software testing shall be conducted according to the CUPS -Software Test Plan, CUPS-STP-1.1. Failed tests cause STRs to be -generated to correct the problems found.

- -

Releases

- -

When testing has been completed successfully a new -distribution image is created from the current CVS code -"snapshot". No release shall contain software that has not -passed the appropriate software tests. Three types of releases -are used, beta, release candidate, and production, and are -released using the following basic schedule: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WeekVersionDescription
T-6 weeks1.1.0b1First beta
T-5 weeks1.1.0b2Second beta
T-4 weeks1.1.0b3Third beta
T-3 weeks1.1.0rc1First release candidate
T-2 weeks1.1.0rc2Second release candidate
T-0 weeks1.1.0Production
- -

Beta releases are typically used prior to new major and minor -version releases. At least one release candidate is generated -prior to each production release.

- -

Beta Releases

- -

Beta releases are generated when substantial changes have -been made that may affect the reliability of the software. Beta -releases may cause loss of data, functionality, or services and -are provided for testing by qualified individuals.

- -

Beta releases are an OPTIONAL part of the release process and -are generated as deemed appropriate by the release coordinator. -Functional changes may be included in subsequent beta releases -until the first release candidate.

- -

Release Candidates

- -

Release candidates are generated at least two weeks prior to -a production release. Release candidates are targeted for -end-users that wish to test new functionality or bug fixes prior -to the production release. While release candidates are intended -to be substantially bug-free, they may still contain defects -and/or not compile on specific platforms. - -

At least one release candidate is REQUIRED prior to any -production release. The distribution of a release candidate -marks the end of any functional improvements. Release candidates -are generated at weekly intervals until all level 4/5 trouble -reports are resolved. - -

Production Releases

- -

Production releases are generated after a successful release -candidate and represent a stable release of the software -suitable for all users. - - - -

Coding Requirements

- -

These coding requirements provide detailed information on -source file formatting and documentation content. These -guidelines shall be applied to all C and C++ source files -provided with CUPS. Source code for other languages should -conform to these requirements as allowed by the language. - -

Source Files

- -

Naming

- -

All source files names shall be 16 characters or less in -length to ensure compatibility with older UNIX filesystems. -Source files containing functions shall have an extension of -".c" for ANSI C and ".cxx" for C++ source files. All other -"include" files shall have an extension of ".h". - -

Documentation

- -

The top of each source file shall contain 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 CVS "$Id$" tag: - -

-    /*
-     * "$Id$"
-     *
-     *   Description of file contents.
-     *
-     *   Copyright 1997-2005 by Easy Software Products, all rights
-     *   reserved.
-     *
-     *   These coded instructions, statements, and computer programs are
-     *   the property of Easy Software Products and are protected by
-     *   Federal copyright law.  Distribution and use rights are outlined
-     *   in the file "LICENSE.txt" which should have been included with
-     *   this file.  If this file is missing or damaged please contact
-     *   Easy Software Products at:
-     *
-     *       Attn: CUPS Licensing Information
-     *       Easy Software Products
-     *       44141 Airport View Drive, Suite 204
-     *       Hollywood, Maryland 20636 USA
-     *
-     *       Voice: (301) 373-9600
-     *       EMail: cups-info@cups.org
-     *         WWW: http://www.cups.org
-     *
-     * Contents:
-     *
-     *   function1() - Description 1.
-     *   function2() - Description 2.
-     *   function3() - Description 3.
-     */
-
- - -

For source files that are subject to the Apple OS-Developed Software -exception, the following additional comment should appear after the -contact information: - -

-     *   This file is subject to the Apple OS-Developed Software exception.
-
- -

The bottom of each source file shall contain a trailer giving -the name of the file using the CVS "$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: - -

-    /*
-     * End of "$Id$".
-     */
-
- -

Functions

- -

Naming

- -

Functions with a global scope shall be capitalized ("DoThis", -"DoThat", "DoSomethingElse", etc.) The only exception to this -rule shall be the CUPS interface library functions which may -begin with a prefix word in lowercase ("cupsDoThis", -"cupsDoThat", etc.) - -

Functions with a local scope shall be declared "static" and -be lowercase with underscores between words ("do_this", -"do_that", "do_something_else", etc.) - -

Documentation

- -

Each function shall begin with a comment header describing -what the function does, the possible input limits (if any), and -the possible output values (if any), and any special information -needed: - -

-    /*
-     * 'do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    static float     /* O - Inverse power value, 0.0 <= y <= 1.1 */
-    do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */
-    {
-      ...
-      return (y);
-    }
-
- -

Return/output values are indicated using an "O" prefix, input -values are indicated using the "I" prefix, and values that are -both input and output use the "IO" prefix for the corresponding -in-line comment. - -

Methods

- -

Naming

- -

Methods shall be in lowercase with underscores between words -("do_this", "do_that", "do_something_else", etc.) - -

Documentation

- -

Each method shall begin with a comment header describing what -the method does, the possible input limits (if any), and the -possible output values (if any), and any special information -needed: - -

-    /*
-     * 'class::do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    float                   /* O - Inverse power value, 0.0 <= y <= 1.0 */
-    class::do_this(float x) /* I - Power value (0.0 <= x <= 1.0) */
-    {
-      ...
-      return (y);
-    }
-
- -

Return/output values are indicated using an "O" prefix, input -values are indicated using the "I" prefix, and values that are -both input and output use the "IO" prefix for the corresponding -in-line comment. - -

Variables

- -

Naming

- -

Variables with a global scope shall be capitalized -("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The -only exception to this rule shall be the CUPS interface library -global variables which must begin with the prefix "cups" -("cupsThisVariable", "cupsThatVariable", etc.) Global variables -shall be replaced by function arguments whenever possible. - -

Variables with a local scope shall be lowercase with -underscores between words ("this_variable", "that_variable", -etc.) Any local variables shared by functions within a source -file shall be declared "static". - -

Documentation

- -

Each variable shall be declared on a separate line and shall -be immediately followed by a comment block describing the -variable: - -

-    int this_variable;   /* The current state of this */
-    int that_variable;   /* The current state of that */
-
- -

Types

- -

Naming

- -

All type names shall be lowercase with underscores between -words and "_t" appended to the end of the name ("this_type_t", -"that_type_t", etc.) - -

Documentation

- -

Each type shall have a comment block immediately before the -typedef: - -

-    /*
-     * This type is for CUPS foobar options.
-     */
-    typedef int cups_this_type_t;
-
- -

Structures

- -

Naming

- -

All structure names shall be lowercase with underscores -between words and "_str" appended to the end of the name -("this_struct_str", "that_struct_str", etc.) - -

Documentation

- -

Each structure shall have a comment block immediately before -the struct and each member shall be documented in accordance -with the variable naming policy above: - -

-    /*
-     * This structure is for CUPS foobar options.
-     */
-    struct cups_this_struct_str
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-
- -

Classes

- -

Naming

- -

All class names shall be lowercase with underscores between -words ("this_class", "that_class", etc.) - -

Documentation

- -

Each class shall have a comment block immediately before the -class and each member shall be documented in accordance with the -variable naming policy above: - -

-    /*
-     * This class is for CUPS foobar options.
-     */
-    class cups_this_class
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-
- -

Constants

- -

Naming

- -

All constant names shall be uppercase with underscored -between words ("THIS_CONSTANT", "THAT_CONSTANT", etc.) Constants -defined for the CUPS interface library must begin with an -uppercase prefix ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", -etc.) - -

Typed enumerations shall be used whenever possible to allow -for type checking by the compiler. - -

Documentation

- -

Comment blocks shall immediately follow each constant: - -

-    enum
-    {
-      CUPS_THIS_TRAY,   /* This tray */
-      CUPS_THAT_TRAY    /* That tray */
-    };
-
- -

Code

- -

Documentation

- -

All source code shall utilize block comments within functions -to describe the operations being performed by a group of -statements: - -

-    /*
-     * Clear the state array before we begin...
-     */
-
-    for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-      array[i] = STATE_IDLE;
-
-    /*
-     * Wait for state changes...
-     */
-
-    do
-    {
-      for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-	if (array[i] != STATE_IDLE)
-	  break;
-
-      if (i == (sizeof(array) / sizeof(array[0])))
-	sleep(1);
-    } while (i == (sizeof(array) / sizeof(array[0])));
-
- -

Style

- -

Indentation

- -

All code blocks enclosed by brackets shall begin with the -opening brace on a new line. The code then follows starting on a -new line after the brace and is indented 2 spaces. The closing -brace is then placed on a new line following the code at the -original indentation: - -

-    {
-      int i; /* Looping var */
-
-     /*
-      * Process foobar values from 0 to 999...
-      */
-
-      for (i = 0; i < 1000; i ++)
-      {
-	do_this(i);
-	do_that(i);
-      }
-    }
-
- -

Single-line statements following "do", "else", "for", "if", -and "while" shall be indented 2 spaces as well. Blocks of code -in a "switch" block shall be indented 4 spaces after each "case" -and "default" case: - -

-    switch (array[i])
-    {
-      case STATE_IDLE :
-	  do_this(i);
-	  do_that(i);
-	  break;
-      default :
-	  do_nothing(i);
-	  break;
-    }
-
- -

Spacing

- -

A space shall follow each reserved word ("if", "while", etc.) -Spaces shall not be inserted between a function name and the -arguments in parenthesis. - -

Return Values

- -

Parenthesis shall surround values returned from a function -using "return": - -

-    return (STATE_IDLE);
-
- -

Loops

- -

Whenever convenient loops should count downward to zero to -improve program performance: - -

-    for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
-      array[i] = STATE_IDLE;
-
- -

Software Trouble Report Form

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Summary of Problem:_____________________________________________
 
Problem Severity:__1Request for enhancement, e.g. asking for a - feature
__2Low, e.g. a documentation error or undocumented - side-effect
__3Moderate, e.g. unable to print a file or unable to - compile the software
__4High, e.g. unable to print to a printer or key - functionality not working
__5Critical, e.g. unable to print at all
 
Problem Scope:__1Machine or printer
__2Operating System
__3All machines, printers, or operating systems
 
Detailed Description of Problem:_____________________________________________ -
_____________________________________________ -
_____________________________________________ -
_____________________________________________ -
_____________________________________________
- - - diff --git a/doc/cups-printable.css b/doc/cups-printable.css new file mode 100644 index 000000000..5019a4aaf --- /dev/null +++ b/doc/cups-printable.css @@ -0,0 +1,126 @@ +BODY { + font-family: sans-serif; +} + +H1, H2, H3, H4, H5, H6, P, TD, TH { + font-family: sans-serif; +} + +KBD { + font-family: monospace; + font-weight: bold; +} + +PRE { + font-family: monospace; +} + +PRE.command { + margin-left: 36pt; +} + +P.command { + font-family: monospace; + margin-left: 36pt; +} + +P.formula { + font-style: italic; + margin-left: 36pt; +} + +BLOCKQUOTE { + background: #cccccc; + border: solid thin #999999; + padding: 10pt; +} + +A:link, A:visited { + text-decoration: none; + font-weight: bold; +} + +A:link:hover, A:visited:hover, A:active { + text-decoration: underline; + font-weight: bold; +} + +SUB, SUP { + font-size: 50%; +} + +DIV.table TABLE { + border: solid thin #999999; + border-spacing: 0; + margin-left: auto; + margin-right: auto; +} + +DIV.table CAPTION { + caption-side: top; + font-size: 120%; + font-style: italic; + font-weight: bold; + margin-left: auto; + margin-right: auto; +} + +DIV.table TABLE TD { + border: solid thin #cccccc; + padding-top: 5pt; +} + +DIV.table TABLE TH { + background: #cccccc; + border: none; + border-bottom: solid thin #999999; +} + +TH.label { + padding-top: 5pt; + text-align: right; + vertical-align: top; +} + +HR { + border: solid thin; +} + +SPAN.info { + background: #000000; + border: thin solid #000000; + color: #ffffff; + font-size: 80%; + font-style: italic; + font-weight: bold; + white-space: nowrap; +} + +H3 SPAN.info { + float: right; + font-size: 100%; +} + +H2.title, H3.title { + border-bottom: solid 2pt #000000; + page-break-before: always; +} + +DT { + margin-left: 36pt; + margin-top: 12pt; +} + +DD { + margin-left: 54pt; +} + +P.summary { + margin-left: 54pt; + font-family: monospace; +} + +SPAN.message { + font-style: italic; + font-size: smaller; +} diff --git a/doc/cups.css b/doc/cups.css index 329c1f5b0..298e66f39 100644 --- a/doc/cups.css +++ b/doc/cups.css @@ -33,8 +33,13 @@ P.command { margin-left: 36pt; } +P.formula { + font-style: italic; + margin-left: 36pt; +} + BLOCKQUOTE { - background: #cccc99; + background: #bbbb88; border: solid thin #999966; padding: 10pt; } @@ -60,7 +65,7 @@ TR.sel TD { padding: 4pt; } -A.unsel { +A.unsel, A.unsel:visited { background-color: #666633; color: #e8e8b8; } @@ -135,7 +140,7 @@ DIV.table TABLE TH { } TH.label { - padding-top: 10pt; + padding-top: 5pt; text-align: right; vertical-align: top; } diff --git a/doc/cupsdoc.css b/doc/cupsdoc.css deleted file mode 100644 index 333f20144..000000000 --- a/doc/cupsdoc.css +++ /dev/null @@ -1,9 +0,0 @@ -H1 { font-family: sans-serif } -H2 { font-family: sans-serif } -H3 { font-family: sans-serif } -H4 { font-family: sans-serif } -H5 { font-family: sans-serif } -H6 { font-family: sans-serif } -SUP { font-family: sans-serif; font-size: 6pt } -PRE { margin-left: 2em } -CODE { font-weight: bold } diff --git a/doc/figures.sc b/doc/figures.sc deleted file mode 100644 index f51e814a63256737793741a4c9ffcd0c294da8b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 75144 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 - -

Terms

- -
- -
C -
A computer language. - -
parallel -
Sending or receiving data more than 1 bit at a time. - -
pipe -
A one-way communications channel between two programs. - -
serial -
Sending or receiving data 1 bit at a time. - -
socket -
A two-way network communications channel. - -
- -

Acronyms

- -
- -
ASCII -
American Standard Code for Information Interchange - -
CUPS -
Common UNIX Printing System - -
ESC/P -
EPSON Standard Code for Printers - -
FTP -
File Transfer Protocol - -
HP-GL -
Hewlett-Packard Graphics Language - -
HP-PCL -
Hewlett-Packard Page Control Language - -
HP-PJL -
Hewlett-Packard Printer Job Language - -
IETF -
Internet Engineering Task Force - -
IPP -
Internet Printing Protocol - -
ISO -
International Standards Organization - -
LPD -
Line Printer Daemon - -
MIME -
Multimedia Internet Mail Exchange - -
PPD -
PostScript Printer Description - -
SMB -
Server Message Block - -
TFTP -
Trivial File Transfer Protocol - -
diff --git a/doc/help/glossary.html b/doc/help/glossary.html new file mode 100644 index 000000000..44dba31c7 --- /dev/null +++ b/doc/help/glossary.html @@ -0,0 +1,219 @@ + + + + Glossary + + + +

A

+ +
+ +
ASCII +
American Standard Code for Information Interchange + +
+ + +

C

+ +
+ +
C +
A computer language + +
Character Set +
The association of numbers with specific printed or + displayed characters or symbols + +
CUPS +
Common UNIX Printing System + +
+ + +

E

+ +
+ +
ESC/P +
EPSON Standard Code for Printers + +
+ + +

F

+ +
+ +
FTP +
File Transfer Protocol + +
+ + +

G

+ +
+ +
GIF +
Graphics Interchange Format + +
+ + +

H

+ +
+ +
HP-GL +
Hewlett-Packard Graphics Language + +
HP-PCL +
Hewlett-Packard Page Control Language + +
HP-PJL +
Hewlett-Packard Printer Job Language + +
+ + +

I

+ +
+ +
IETF +
Internet Engineering Task Force + +
IP +
Internet Protocol + +
IPv4 +
Internet Protocol, version 4; IPv4 addresses are 32-bits in + length and often look like "nnn.nnn.nnn.nnn" and "127.0.0.1" + +
IPv6 +
Internet Protocol, version 6: IPv6 addresses are 128-bits in + length and look like "xxxx::xxxx:xxxx:xxxx:xxxx" and "::1" + +
IPP +
Internet Printing Protocol + +
ISO +
International Standards Organization + +
+ + +

J

+ +
+ +
JFIF +
JPEG File Interchange Format + +
JPEG +
Joint Photographic Experts Group + +
+ + +

L

+ +
+ +
LPD +
Line Printer Daemon + +
+ + +

M

+ +
+ +
MIME +
Multimedia Internet Mail Exchange + +
+ + +

P

+ +
+ +
parallel +
Sending or receiving data more than 1 bit at a time + +
PDF +
Portable Document Format + +
pipe +
A one-way communications channel between two programs + +
PNG +
Portable Network Graphics + +
PostScript +
A page description language that is most often used + for printing + +
PPD +
PostScript Printer Description + +
+ + +

S

+ +
+ +
SCSI +
Small Computer Systems Interface + +
serial +
Sending or receiving data 1 bit at a time + +
SMB +
Server Message Block + +
socket +
A two-way network communications channel + +
+ + +

T

+ +
+ +
TCP +
Transmission Control Protocol + +
TFTP +
Trivial File Transfer Protocol + +
TIFF +
Tagged Image File Format + +
+ + +

U

+ +
+ +
UDP +
Unicast Datagram Protocol + +
Unicode +
A universal character set for all languages of the + world + +
UTF-8 +
Unicode Transfer Format 8-Bit + +
+ + + diff --git a/LICENSE.html b/doc/help/license.html similarity index 95% rename from LICENSE.html rename to doc/help/license.html index 2008a6312..888da5fc7 100644 --- a/LICENSE.html +++ b/doc/help/license.html @@ -1,11 +1,9 @@ + - Software License Agreement - Common UNIX Printing System + Software License Agreement - - - -

Common UNIX Printing System License Agreement

+

Copyright 1997-2006 by Easy Software Products
44141 AIRPORT VIEW DR STE 204
@@ -15,24 +13,24 @@ Voice: +1.301.373.9600
Email: cups-info@cups.org
WWW: http://www.cups.org -

Introduction

+

Introduction

The Common UNIX Printing SystemTM, ("CUPSTM"), 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. +this introduction.

The GNU LGPL applies to the CUPS API library, located in the "cups" subdirectory of the CUPS source distribution and in the "cups" include directory and library files in the binary distributions. The GNU GPL applies to the remainder of the CUPS distribution, including the "pdftops" filter which is based upon -Xpdf and the CUPS imaging library. +Xpdf and the CUPS imaging library.

For those not familiar with the GNU GPL, the license basically -allows you to: +allows you to:

    @@ -50,24 +48,25 @@ allows you to:
-

What this license does not allow you to do is make +

What this license does not allow you to do is make changes or add features to CUPS and then sell a binary -distribution without source code. You must provide source for -any new drivers, changes, or additions to the software, and all -code must be provided under the GPL or LGPL as appropriate. The -only exceptions to this are the portions of the CUPS software -covered by the Apple operating system license exceptions -outlined later in this license agreement. +distribution without source code. You must provide source for any +new drivers, changes, or additions to the software, and all code +must be provided under the GPL or LGPL as appropriate. The only +exceptions to this are the portions of the CUPS software covered +by the Apple operating system license exceptions outlined later +in this license agreement.

The GNU LGPL relaxes the "link-to" restriction, allowing you -to develop applications that use the CUPS API library under -other licenses and/or conditions as appropriate for your -application. +to develop applications that use the CUPS API library under other +licenses and/or conditions as appropriate for your +application.

-

License Exceptions

+ +

License Exceptions

In addition, as the copyright holder of CUPS, Easy Software -Products grants the following special exceptions: +Products grants the following special exceptions:

    @@ -133,48 +132,51 @@ Products grants the following special exceptions:

No developer is required to provide these exceptions in a -derived work. +derived work.

+ -

Trademarks

+

Trademarks

Easy Software Products has trademarked the Common UNIX -Printing System, CUPS, and CUPS logo. You may use these names -and logos in any direct port or binary distribution of CUPS. -Please contact Easy Software Products for written permission to -use them in derivative products. Our intention is to protect the -value of these trademarks and ensure that any derivative product -meets the same high-quality standards as the original. +Printing System, CUPS, and CUPS logo. You may use these names and +logos in any direct port or binary distribution of CUPS. Please +contact Easy Software Products for written permission to use them +in derivative products. Our intention is to protect the value of +these trademarks and ensure that any derivative product meets the +same high-quality standards as the original.

-

Binary Distribution Rights

+ +

Binary Distribution Rights

Easy Software Products also sells rights to the CUPS source code under a binary distribution license for vendors that are unable to release source code for their drivers, additions, and -modifications to CUPS under the GNU GPL and LGPL. For -information please contact us at the address shown above. +modifications to CUPS under the GNU GPL and LGPL. For information +please contact us at the address shown above.

The Common UNIX Printing System provides a "pdftops" filter that is based on the Xpdf software. For binary distribution -licensing of this software, please contact: +licensing of this software, please contact:

Derek B. Noonburg
-Email: derekn@foolabs.com
-WWW: http://www.foolabs.com/xpdf/ +Email: derekn@glyphandcog.com
+WWW: http://www.glyphandcog.com/
-

Support

-

Easy Software Products sells software support for CUPS as -well as a commercial printing product based on CUPS called ESP -Print Pro. You can find out more at our web site: +

Support

+ +

Easy Software Products sells software support for CUPS as well +as a commercial printing product based on CUPS called ESP Print +Pro. You can find out more at our web site:

- -

GNU GENERAL PUBLIC LICENSE

+ +

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991 @@ -186,7 +188,7 @@ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -

Preamble

+

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -236,8 +238,8 @@ patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow. -

GNU GENERAL PUBLIC LICENSE
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+

GNU GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    @@ -447,7 +449,7 @@ of promoting the sharing and reuse of software generally.
-

NO WARRANTY

+

NO WARRANTY

    @@ -473,9 +475,9 @@ POSSIBILITY OF SUCH DAMAGES.
-

END OF TERMS AND CONDITIONS

+

END OF TERMS AND CONDITIONS

-

How to Apply These Terms to Your New Programs

+

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -538,8 +540,7 @@ by James Hacker. Ty Coon, President of Vice - -

GNU LIBRARY GENERAL PUBLIC LICENSE

+

GNU LIBRARY GENERAL PUBLIC LICENSE

Version 2, June 1991 @@ -553,7 +554,7 @@ of this license document, but changing it is not allowed. numbered 2 because it goes with version 2 of the ordinary GPL.] -

Preamble

+

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -643,7 +644,7 @@ works together with the library.

Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. -

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License Agreement applies to any software library which @@ -1013,9 +1014,9 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -

END OF TERMS AND CONDITIONS

+

END OF TERMS AND CONDITIONS

-

How to Apply These Terms to Your New Libraries

+

How to Apply These Terms to Your New Libraries

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that diff --git a/doc/help/options.html b/doc/help/options.html new file mode 100644 index 000000000..8602247eb --- /dev/null +++ b/doc/help/options.html @@ -0,0 +1,474 @@ + + + + Printing and Options + + + +

CUPS provides both the System V (lp(1)) and Berkeley (lpr(1)) printing commands for printing +files. In addition, it supported a large number of standard and +printer-specific options that allow you to control how and where +files are printed.

+ + +

Printing Files

+ +

CUPS understands many different types of files directly, +including text, PostScript, PDF, and image files. This allows you +to print from inside your applications or at the command-line, +whichever is most convenient! Type either of the following +commands to print a file to the default (or only) printer on the +system:

+ +
+lp filename
+lpr filename
+
+ +

Choosing a Printer

+ +

Many systems will have more than one printer available to the +user. These printers can be attached to the local system via a +parallel, serial, or USB port, or available over the network. Use +the lpstat(1) command to see a list +of available printers:

+ +
+lpstat -p -d
+
+ +

The -p option specifies that you want to see a +list of printers, and the -d option reports the +current default printer or class.

+ +

Use the -d option with the lp command to +print to a specific printer:

+ +
+lp -d printer filename
+
+ +

or the -P option with the lpr command:

+ +
+lpr -P printer filename
+
+ +

Setting the Default Printer

+ +

If you normally use a particular printer, you can tell CUPS to +use it by default using the lpoptions(1) command:

+ +
+lpoptions -d printer
+
+ +

Printing the Output of a Program

+ +

Both the lp and lpr commands support printing +from the standard input:

+ +
+program | lp
+program | lp -d printer
+program | lpr
+program | lpr -P printer
+
+ +

If the program does not provide any output, then nothing will +be queued for printing.

+ +

Specifying Printer Options

+ +

For many types of files, the default printer options may be +sufficient for your needs. However, there may be times when you +need to change the options for a particular file you are +printing.

+ +

The lp and lpr commands allow you to pass +printer options using the -o option:

+ +
+lp -o landscape -o scaling=75 -o media=A4 filename.jpg
+lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
+
+ +

The available printer options vary depending on the printer. +The standard options are described in the "Standard Printing Options" section +below.

+ +

Printing Multiple Copies

+ +

Both the lp and lpr commands have options for +printing more than one copy of a file:

+ +
+lp -n num-copies filename
+lpr -#num-copies filename
+
+ +

Copies are normally not collated for you. Use the +-o Collate=True option to get collated copies:

+ +
+lp -n num-copies -o Collate=True filename
+lpr -#num-copies -o Collate=True filename
+
+ + +

Canceling a Print Job

+ +

The cancel(1) and lprm(1) commands cancel a print job:

+ +
+cancel job-id
+lprm job-id
+
+ +

The job-id is the number that was reported to you by +the lp command. You can also get the job ID using the lpq(1) or lpstat commands:

+ +
+lpq
+lpstat
+
+ + +

Standard Printing Options

+ +

The following options apply when printing all types of +files.

+ +

Selecting the Media Size, Type, and Source

+ +

The -o media=xyz option sets the media size, +type, and/or source:

+ +
+lp -o media=Letter filename
+lp -o media=Letter,MultiPurpose filename
+lpr -o media=Letter,Transparency filename
+lpr -o media=Letter,MultiPurpose,Transparency filename
+
+ +

The available media sizes, types, and sources depend on the +printer, but most support the following options (case is not +significant):

+ +
    + +
  • Letter - US Letter (8.5x11 inches, or 216x279mm) + +
  • Legal - US Legal (8.5x14 inches, or 216x356mm) + +
  • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm) + +
  • COM10 - US #10 Envelope (9.5x4.125 inches, or + 241x105mm) + +
  • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm) + +
  • Transparency - Transparency media type or source + +
  • Upper - Upper paper tray + +
  • Lower - Lower paper tray + +
  • MultiPurpose - Multi-purpose paper tray + +
  • LargeCapacity - Large capacity paper tray + +
+ +

The actual options supported are defined in the printer's PPD +file in the PageSize, InputSlot, and +MediaType options. You can list them using the +lpoptions(1) command:

+ +
+lpoptions -p printer -l
+
+ +

Setting the Orientation

+ +

The -o landscape option will rotate the page 90 +degrees to print in landscape orientation:

+ +
+lp -o landscape filename
+lpr -o landscape filename
+
+ +

The -o orientation-requested=N option rotates the +page depending on the value of N:

+ +
    + +
  • -o orientation-requested=3 - portrait + orientation (no rotation)
  • + +
  • -o orientation-requested=4 - landscape + orientation (90 degrees)
  • + +
  • -o orientation-requested=5 - reverse + landscape or seascape orientation (270 degrees)
  • + +
  • -o orientation-requested=6 - reverse + portrait or upside-down orientation (180 degrees)
  • + +
+ +

Printing On Both Sides of the Paper

+ +

The -o sides=two-sided-short-edge and -o +sides=two-sided-long-edge options will enable two-sided +printing on the printer if the printer supports it. The -o +sides=two-sided-short-edge option is suitable for +landscape pages, while the -o +sides=two-sided-long-edge option is suitable for portrait +pages:

+ +
+lp -o sides=two-sided-short-edge filename
+lp -o sides=two-sided-long-edge filename
+lpr -o sides=two-sided-long-edge filename
+
+ +

The default is to print single-sided:

+ +
+lp -o sides=one-sided filename
+lpr -o sides=one-sided filename
+
+ +

Selecting the Banner Page(s)

+ +

The -o jobsheets=start,end option sets the banner +page(s) to use for a job:

+ +
+lp -o job-sheets=none filename
+lp -o job-sheets=standard filename
+lpr -o job-sheets=classified,classified filename
+
+ +

If only one banner file is specified, it will be printed +before the files in the job. If a second banner file is +specified, it is printed after the files in the job.

+ +

The available banner pages depend on the local system +configuration; CUPS includes the following banner files:

+ +
    + +
  • none - Do not produce a banner page. + +
  • classified - A banner page with a "classified" + label at the top and bottom. + +
  • confidential - A banner page with a + "confidential" label at the top and bottom. + +
  • secret - A banner page with a "secret" label + at the top and bottom. + +
  • standard - A banner page with no label at the + top and bottom. + +
  • topsecret - A banner page with a "top secret" + label at the top and bottom. + +
  • unclassified - A banner page with an + "unclassified" label at the top and bottom. + +
+ +

Selecting a Range of Pages

+ +

The -o page-ranges=pages option selects a range +of pages for printing:

+ +
+lp -o page-ranges=1 filename
+lp -o page-ranges=1-4 filename
+lp -o page-ranges=1-4,7,9-12 filename
+lpr -o page-ranges=1-4,7,9-12 filename
+
+ +

As shown above, the pages value can be a single page, a +range of pages, or a collection of page numbers and ranges separated by +commas. The pages will always be printed in ascending order, regardless +of the order of the pages in the page-ranges option. + +

The default is to print all pages. + +

Selecting Even or Odd Pages

+ +

Use the -o page-set=set option to select the even or odd pages:

+ +
+lp -o page-set=odd filename
+lp -o page-set=even filename
+lpr -o page-set=even filename
+
+ +

The default is to print all pages. + +

N-Up Printing

+ +

The -o number-up=value option selects N-Up +printing. N-Up printing places multiple document pages on a +single printed page. CUPS supports 1, 2, 4, 6, 9, and 16-Up +formats; the default format is 1-Up:

+ +
+lp -o number-up=1 filename
+lp -o number-up=2 filename
+lp -o number-up=4 filename
+lpr -o number-up=16 filename
+
+ +

The -o page-border=value option chooses the +border to draw around each page:

+ +
    +
  • -o page-border=double; draw two hairline borders around each page
  • +
  • -o page-border=double-thick; draw two 1pt borders around each page
  • +
  • -o page-border=none; do not draw a border (default)
  • +
  • -o page-border=single; draw one hairline border around each page
  • +
  • -o page-border=single-thick; draw one 1pt border around each page
  • +
+ +

The -o number-up-layout=value option chooses the +layout of the pages on each output page:

+ +
    +
  • -o number-up-layout=btlr; Bottom to top, left to right
  • +
  • -o number-up-layout=btrl; Bottom to top, right to left
  • +
  • -o number-up-layout=lrbt; Left to right, bottom to top
  • +
  • -o number-up-layout=lrtb; Left to right, top to bottom (default)
  • +
  • -o number-up-layout=rlbt; Right to left, bottom to top
  • +
  • -o number-up-layout=rltb; Right to left, top to bottom
  • +
  • -o number-up-layout=tblr; Top to bottom, left to right
  • +
  • -o number-up-layout=tbrl; Top to bottom, right to left
  • +
+ +

Scaling to Fit

+ +

The -o fitplot option specifies that the document +should be scaled to fit on the page:

+ +
+lp -o fitplot filename
+lpr -o fitplot filename
+
+ +

The default is to use the size specified in the file.

+ +
Note: This feature depends upon an accurate size in +the print file. If no size is given in the file, the page may be +scaled incorrectly!
+ +

Raw or Unfiltered Output

+ +

The -o raw option allows you to send files +directly to a printer without filtering. This is sometimes +required when printing from applications that provide their own +"printer drivers" for your printer:

+ +
+lp -o raw filename
+lpr -o raw filename
+
+ +

The -l option can also be used with the +lpr command to send files directly to a printer:

+ +
+lpr -l filename
+
+ + +

Text Options

+ +

CUPS supports several options that are only used when printing +plain text files. These options have absolutely no effect on +PostScript, PDF, HP-GL/2, or image files.

+ +

Setting the Number of Characters Per Inch

+ +

The -o cpi=value option sets the number of +characters per inch:

+ +
+lp -o cpi=10 filename
+lp -o cpi=12 filename
+lpr -o cpi=17 filename
+
+ +

The default characters per inch is 10.

+ +

Setting the Number of Lines Per Inch

+ +

The -o lpi=value option sets the number of lines +per inch:

+ +
+lp -o lpi=6 filename
+lpr -o lpi=8 filename
+
+ +

The default lines per inch is 6.

+ +

Setting the Number of Columns

+ +

The -o columns=value option sets the number of +text columns:

+ +
+lp -o columns=2 filename
+lpr -o columns=3 filename
+
+ +

The default number of columns is 1.

+ +

Setting the Page Margins

+ +

Normally the page margins are set to the hard limits of the +printer. Use the -o page-left=value, -o +page-right=value, -o page-top=value, and +-o page-bottom=value options to adjust the page +margins:

+ +
+lp -o page-left=value filename
+lp -o page-right=value filename
+lp -o page-top=value filename
+lp -o page-bottom=value filename
+lpr -o page-left=value -o page-right=value -o page-top=value -o page-bottom=value filename
+
+ +

The value argument is the margin in points; each +point is 1/72 inch or 0.35mm.

+ +

Pretty Printing

+ +

The -o prettyprint option puts a header at the +top of each page with the page number, job title (usually the +filename), and the date. Also, C and C++ keywords are +highlighted, and comment lines are italicized:

+ +
+lp -o prettyprint filename
+lpr -o prettyprint filename
+
+ + + diff --git a/doc/help/overview.html b/doc/help/overview.html index 20641e04c..38f57eb3d 100644 --- a/doc/help/overview.html +++ b/doc/help/overview.html @@ -5,500 +5,104 @@ -

Printing within UNIX has historically been done using one of -two printing systems - the Berkeley Line Printer Daemon (LPD) -[RFC1179] and the AT&T Line Printer system. These printing -systems were designed in the 70's for printing text to line -printers; vendors have since added varying levels of support for -other types of printers.

- -

Replacements for these printing systems have emerged [LPRng, -Palladin, PLP], however none of the replacements change the -fundamental capabilities of these systems.

- -

Over the years several attempts at developing a standard -printing interface have been made, including the draft POSIX -Printing standard developed by the Institute of Electrical and -Electronics Engineers, Inc. (IEEE) [IEEE-1387.4] and Internet -Printing Protocol (IPP) developed by the Internet Engineering -Task Force (IETF) through the Printer Working Group (PWG) -[IETF-IPP]. The POSIX printing standard defines a common set of -command-line tools as well as a C interface for printer -administration and print jobs, but has been shelved by the -IEEE.

- -

The Internet Printing Protocol defines extensions to the -HyperText Transport Protocol 1.1 [RFC2616] to provide support -for remote printing services. IPP/1.1 was accepted by the IETF -as a proposed standard in ??? of ???. Unlike POSIX Printing, IPP -enjoys widespread industry support and has become the standard -network printing solution for all operating systems.

- -

CUPS uses IPP/1.1 to provide a complete, modern printing -system for UNIX that can be extended to support new printers, -devices, and protocols while providing compatibility with -existing UNIX applications. CUPS is free software provided under -the terms of the GNU General Public License and GNU Library -General Public License.

- -

History

- -

The first production release of CUPS (based on IPP/1.0) was -released in October of 1999. Version 1.1 of CUPS was released in -August of 2002 ???? and added support for IPP/1.1.

- -

CUPS 1.2 is based on IPP/1.1 and adds many of the functional -enhancements that have been requested by our users. As with CUPS -1.1, CUPS 1.2 will be followed by patch releases that address -any problems found with the software. New features will be put -in the 1.3 release to follow.

- -

Design Overview

- -

Like most printing systems, CUPS is designed around a central -print scheduling process that dispatches print jobs, processes -administrative commands, provides printer status information to -local and remote programs, and informs users as needed. Figure 1 -shows the basic organization of CUPS.

- -

CUPS Block Diagram
-Figure 1 - CUPS Block Diagram

- -

Scheduler

- -

The scheduler is a HTTP/1.1 server application that handles -HTTP requests. Besides handling printer requests via IPP POST -requests, the scheduler also acts as a full-featured web server -for documentation, status monitoring, and administration.

- -

The scheduler also manages a list of available printers on -the LAN and dispatches print jobs as needed using the -appropriate filters and backends.

- -

Configuration Files

- -

The configuration files consist of:

- -
    - -
  • The HTTP server configuration file.
  • - -
  • Printer and class definition files.
  • - -
  • MIME type and conversion rule files.
  • - -
  • PostScript Printer Description (PPD) files.
  • - -
- -

The HTTP server configuration file is purposely similar to -the Apache server configuration file and defines all of the -access control properties for the server.

- -

The printer and class definition files list the available -printer queues and classes. Printer classes are collections of -printers. Jobs sent to a class are forwarded to the first -available printer in the class, round-robin fashion.

- -

The MIME type files list the supported MIME types -(text/plain, application/postscript, etc.) and "magic' rules for -automatically detecting the format of a file. These are used by -the HTTP server to determine the Content-Type field for -GET and HEAD requests and by the IPP request -handler to determine the file type when a Print-Job or -Send-File request is received with a -document-format of -application/octet-stream.

- -

The MIME conversion rule files list the available filters. -The filters are used when a job is dispatched so that an -application can send a convenient file format to the printing -system which then converts the document into a printable format -as needed. Each filter has a relative cost associated with it, -and the filtering algorithm chooses the set of filters that will -convert the file to the needed format with the lowest total -"cost".

- -

The PPD files describe the capabilities of all printers, not -just PostScript printers. There is one PPD file for each -printer. PPD files for non-PostScript printers define additional -filters through cupsFilter attributes to support -printer drivers.

- -

CUPS API

- -

The CUPS API contains CUPS-specific convenience functions for -queuing print jobs, getting printer information, accessing -resources via HTTP and IPP, and manipulating PPD files. Unlike -the rest of CUPS, the CUPS API is provided under the terms of -the GNU LGPL so it may be used by non-GPL applications.

- -

Berkeley and System V Commands

- -

CUPS provides the System V and Berkeley command-line -interfaces for submitting jobs and checking the printer status. -The lpstat and lpc status commands -also show network printers ("printer@server") when printer -browsing is enabled.

- -

The System V administation commands are supplied for managing -printers and classes. The Berkeley printer administration tool -(lpc) is only supported in a "read-only' mode to -check the current status of the printer queues and -scheduler.

- -

Filters

- -

A filter program reads from the standard input or from a file -if a filename is supplied. All filters must support a common set -of options including printer name, job ID, username, job title, -number of copies, and job options. All output is sent to the -standard output.

- -

Filters are provided for many file formats and include image -file and PostScript raster filters that support non-PostScript -printers. Multiple filters are run in parallel to produce the -required output format.

- -

The PostScript raster filter is based on the ESP Ghostscript -core. Instead of using the Ghostscript printer drivers, the CUPS -filter uses a generic CUPS raster printer driver and -CUPS-compliant front-end to support any kind of raster printer. -This allows the same printer driver filter to be used for -printing raster data from any filter.

- -
Talk about Apple's use of CUPS...
- -

CUPS Imaging

- -

The CUPS Imaging library provides functions for managing -large images, doing colorspace conversion and color management, -scaling images for printing, and managing raster page streams. -It is used by the CUPS image file filters, the PostScript RIP, -and all raster printers drivers.

- -

Backends

- -

A backend program is a special filter that sends print data -to a device or network connection. Backends for parallel, -serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are -provided in CUPS 1.2.

- -

SAMBA version 2.0.6 and higher includes a SMB backend -(smbspool(1)) that can be used for printing to -Windows.

- -

Network Printing

- -

Traditionally, network printing has been one of the hardest -things to get working under UNIX. One reason is because each -vendor added their own extensions to the LPD protocol (the -previous standard for network printing), making cross-platform -printing difficult if not impossible.

- -

Another reason is that you have to administer every network -printer on every client machine. In some cases you can "clone' -the printer configuration from a "master' client to each of the -others, but even that can be time-consuming and error-prone. -Something better is needed.

- -

CUPS provides "printer browsing", which allows clients to -automatically see and use printers from any server on a LAN. -This means that you only need to configure the server and the -clients will automatically see the printers and classes on -it.

- -

In addition, CUPS can automatically merge multiple identical -network printers into "implicit classes". This allows clients to -send jobs to the implicit class and have them print on the first -available printer or server. In addition, failsafe and -load-balancing functions are enabled simply by defining the same -printer on multiple servers!

- -

New Features in CUPS 1.2

- -

CUPS 1.2 includes many new features and capabilities: - -

    - -
  1. Backends - -
  2. Banner Page Support - -
  3. Digest Authentication - -
  4. Directory Services - -
  5. Directory Structure Changes - -
  6. Documentation - -
  7. Drivers - -
  8. Filters - -
  9. IPP Support - -
  10. Job Persistence - -
  11. LPD Client Support - -
  12. User-Defined Printers and Options - -
  13. Web Administration Interface - -
- -

1. Backends

- -

CUPS 1.2 implements a new backend interface for retrieving a -list of available devices for CUPS clients. This allows -administration interfaces to query the CUPS scheduler for a list -of available devices, automatically configure printers if the -device identification information is available, and present the -user with a list of available devices rather than relying on the -user to know what devices are configured on the system.

- -

The new release also includes a backend for USB printers -under *BSD and Linux. Support for USB under Solaris 8 will be -provided in a subsequent patch release.

- -

2. Banner Page Support

- -

CUPS 1.2 includes support for banner pages at the beginning -and end of a job. Banner pages may be of any file format and -support variable substitution for job titles, usernames, etc. -Default banner pages are associated with each printer and can be -overridden with command-line options by the user.

- -

3. Digest Authentication

- -

Digest authentication provides a more secure method of -authenticating access to the printing system. Unlike Basic -authentication, Digest authentication does not send passwords -"in the clear' so it is more difficult to gain unauthorized -access to your system.

- -

CUPS 1.2 implements Digest authentication using a special MD5 -password file instead of the UNIX password file. This file is -managed using the new lppasswd command.

- -

4. Directory Services

- -

CUPS 1.2 adds new directory service ("printer browsing") -features to make using CUPS on large LANs and WANs easier. You -can now poll a remote server for printer information and relay -it to the LAN as well as restrict what printer information is -processed (e.g. to "hide" servers, domains, or networks that you -don't want to see.)

- -

5. Directory Structure Changes

- -

CUPS 1.2 now uses a directory structure that complies with -the Filesystem Hierarchy Standard (FHS), version 2.0. This -should make integration into existing Linux and *BSD -distributions a lot easier.

- -

6. Documentation

- -

The CUPS 1.2 documentation has gone through many revisions, -including a completely rewritten administrators manual, a new -programmers manual, and an IPP implementation reference -manual.

- -

7. Drivers

- -

CUPS 1.2 includes drivers for EPSON dot-matrix and inkjet -printers. As with the HP PCL drivers, the EPSON drivers don't -necessarily provide the best possible output for each printer -but should provide adequate printing quality for general -day-to-day printing.

- -

8. Filters

- -

CUPS 1.2 includes new image, PostScript, PDF, and text -filters. The image filters have been upgraded to support Windows -BMP and Alias PIX files.

- -

The PostScript filter is now based off ESP Ghostscript. The -new filter provides much better performance with -higher-resolution printers and supports all Level 3 PostScript -language features.

- -

The new PDF filter is based off the excellent Xpdf software -from Derek Noonburg and supports automatic page scaling. The new -filter is a faster, smaller, more reliable replacement for the -GNU Ghostscript PDF filtering that was used in CUPS 1.0.

- -

The new text filter now supports bidirectional text and can -embed fonts as needed.

- -

9. IPP Support

- -

Probably the least visible portion of CUPS is the IPP -support. CUPS 1.1 implements all of the required IPP/1.1 -operations and attributes and most of the optional ones. The -optional Create-Job and Send-File operations are now -implemented, allowing for better System V printing system -compatibility (one job ID per lp command) and support -for banner pages.

- -

10. Job Persistence

- -

CUPS 1.2 supports job persistence. This means that jobs are -preserved even after a reboot, a feature that was sorely missing -from CUPS 1.0.

- -

In addition, CUPS 1.2 allows you to keep job information -after the job has printed. The basic post-job persistence mode -provides a job history (number of pages printed, time job was -printed, etc.) but does not preserve the actual job files. This -can be changed to discard all information after a job is printed -or keep the job files after printing so you can reprint a job at -some later time.

- -

11. LPD Client Support

- -

By popular request, CUPS 1.2 supports LPD-based clients using -a new mini-daemon that handles LPD requests and passes them on -to the main server.

- -

12. User-Defined Printers and Options

- -

CUPS 1.2 includes support for user-defined printers and -options via a new lpoptions command. User-defined -printers are special instances of the available printers (e.g. -"printer/instance" or "printer@server/instance") that can have -their own default options such as media size, resolution, and so -forth. The lpoptions command can also be used to set a -different default printer queue.

- -

13. Web Administration Interface

- -

CUPS 1.0 provided a simple class, job, and printer monitoring -interface for web browsers. CUPS 1.2 replaces this interface -with an enhanced administration interface that allows you to -add, modify, delete, configure, and control classes, jobs, and -printers.

- -

Software Using CUPS

- -

A lot has happened since CUPS 1.0 came out, and many software -packages are supporting CUPS. We have contributed code to the -SAMBA team to support CUPS, and parts of that are already -available in SAMBA 2.0.6 and 2.0.7. With any luck the final -pieces that provide a complete integration with SAMBA will be -available in the next release of SAMBA.

- -

Two graphical interfaces have appeared on the scene that use -CUPS as well. The KUPS project provides a KDE-based interface -for CUPS and can be found at:

- -
-    http://kups.sourceforge.net
-
- -

The X Printing Panel (XPP) project provides a graphical -printing panel for CUPS and can be found at:

- -
-    http://www.phy.uni-bayreuth.de/till/xpp/
-
- -

Numerous other filters, drivers, tutorials, etc. have been -made available on the CUPS Links web page, available at:

- -
-    http://www.cups.org/links.php
-
- -

Finally, our own ESP Print Pro software uses CUPS to provide -drivers for thousands of printers and can be found at:

- -
-    http://www.easysw.com/printpro
-
- -

Operating Systems Using CUPS

- -

One of our goals has always been to get as many UNIX/Linux -distributions using CUPS as possible. Debian is currently -providing CUPS as part of its stable distribution, and many -other distributions are considering it in their next -releases.

- -

Summary

- -

The Common UNIX Printing System provides a modern printing -interface for UNIX applications that is both flexible and -user-friendly. The software provides System V and Berkeley -compatible command-line interfaces to ensure compatibility with -existing applications. CUPS 1.2 adds many new features that make -it an even better choice for printing under UNIX.

- -

Who to Contact

- -

For more information on CUPS please contact us at: - -

-    Attn: CUPS Information
-    Easy Software Products
-    44141 Airport View Drive Suite 204
-    Hollywood, Maryland 20636-3142 USA
-
-    +1.301.373.9600
-
-    cups-info@cups.org
-
- -

References

- -
- -
IEEE-1387.4
- -
System Administration - Part 4: Printing Interfaces - (draft)
- -
IETF-IPP
- -
Internet Printing Protocol/1.1
- -
LPRng
- -
An enhanced, extended, and portable implementation - of the Berkeley LPR print spooler functionality
- -
Palladin
- -
A printing system developed at the Massachussetts - Institute of Technology
- -
PLP
- -
The Portable Line Printer spooler system
- -
RFC1179
- -
Line Printer Daemon Protocol
- -
RFC2046
- -
Multipurpose Internet Mail Extensions (MIME) Part - Two: Media Types
- -
RFC2616
- -
Hypertext Transfer Protocol -- HTTP/1.1
- -
- -

Trademarks

- -

The Common UNIX Printing System, CUPS, and the CUPS logo are -the trademark property of Easy Software Products. All other -trademarks are the property of their respective owners.

+

The Common UNIX Printing SystemTM, or CUPS, is the +software you use to print from applications like the web browser +you are using to read this page. It converts the page +descriptions produced by your application (put a paragraph +here, draw a line there, and so forth) into something your +printer can understand and then sends the information to the +printer for printing.

+ +

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

+ +

How Does It Work?

+ +

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

+ +

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

+ +

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

+ +

Where Do I Begin?

+ +

Click on the Administration tab at the +top of this page. If you have a printer connected to a USB or +parallel port, you will see it listed as a new printer - click on +the Add This Printer button, verify the printer driver +CUPS has chosen for you, and click on the Add Printer +button. If you do not see your printer listed, or if you have a +network printer, click on the Add Printer button and +follow the prompts.

+ +
If 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 name in lowercase.
+ +

After the printer is added, CUPS will ask you to set the +default printer options (paper size, output mode, etc.) for the +printer. Make any changes as needed and then click on the +Set Printer Options button to save them.

+ +

Finally, click on the Print Test Page button to +print a simple test page and verify that everything is working +properly.

+ +

Once you have added the printer, you can print to it from any +application.

+ + + + + + + + + + + + + + +
CUPS Administration Web Page
+Figure 1: The CUPS Administration Web Page
CUPS Driver Selection Web Page
+Figure 2: The CUPS Driver Selection Web Page
CUPS Password Dialog
+Figure 3: The CUPS Password Dialog
CUPS Set Printer Options Web Page
+Figure 4: The CUPS Set Printer Options Web Page
CUPS Printer Status Page
+Figure 5: The CUPS Printer Status Page
CUPS Printer Test Page
+Figure 6: The CUPS Printer Test Page
diff --git a/doc/help/access_log-reference.html b/doc/help/ref-access_log.html similarity index 96% rename from doc/help/access_log-reference.html rename to doc/help/ref-access_log.html index e4ce813b1..5ed47821b 100644 --- a/doc/help/access_log-reference.html +++ b/doc/help/ref-access_log.html @@ -38,7 +38,7 @@ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"

The host field will normally only be an IP address unless you have enabled the HostNameLookups +HREF="ref-cupsd-conf.html#HostNameLookups">HostNameLookups directive in the cupsd.conf file or if the IP address corresponds to your local machine.

@@ -101,7 +101,7 @@ request, as follows:

  • 413 - Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize + HREF="ref-cupsd-conf.html#MaxRequestSize">MaxRequestSize allows.
  • 426 - Upgrading to TLS-encrypted diff --git a/doc/help/classes-conf-reference.html b/doc/help/ref-classes-conf.html similarity index 98% rename from doc/help/classes-conf-reference.html rename to doc/help/ref-classes-conf.html index eba834d18..24622b08b 100644 --- a/doc/help/classes-conf-reference.html +++ b/doc/help/ref-classes-conf.html @@ -176,7 +176,7 @@ error policy:

  • retry-job - Retry the job after waiting for N seconds; the cupsd.conf JobRetryInterval + HREF="ref-cupsd-conf.html#JobRetryInterval">JobRetryInterval directive controls the value of N
  • stop-printer - Stop the printer and keep @@ -343,7 +343,7 @@ sets the current operation policy:

    The default policy is named "default". All policies correspond to those defined using the cupsd.conf Policy +HREF="ref-cupsd-conf.html#Policy">Policy directive.

    This directive must appear inside a The error_log file lists messages from the scheduler - errors, warnings, etc. The LogLevel +HREF="ref-cupsd-conf.html#LogLevel">LogLevel directive controls which messages are logged:

    diff --git a/doc/help/page_log-reference.html b/doc/help/ref-page_log.html similarity index 100% rename from doc/help/page_log-reference.html rename to doc/help/ref-page_log.html diff --git a/doc/help/printers-conf-reference.html b/doc/help/ref-printers-conf.html similarity index 99% rename from doc/help/printers-conf-reference.html rename to doc/help/ref-printers-conf.html index 226a766d0..bb9754bdc 100644 --- a/doc/help/printers-conf-reference.html +++ b/doc/help/ref-printers-conf.html @@ -180,7 +180,7 @@ error policy:

  • retry-job - Retry the job after waiting for N seconds; the cupsd.conf JobRetryInterval + HREF="ref-cupsd-conf.html#JobRetryInterval">JobRetryInterval directive controls the value of N
  • stop-printer - Stop the printer and keep @@ -347,7 +347,7 @@ sets the current operation policy:

    The default policy is named "default". All policies correspond to those defined using the cupsd.conf Policy +HREF="ref-cupsd-conf.html#Policy">Policy directive.

    This directive must appear inside a + + + Server Security + + + +

    In the default "standalone" configuration, there are few +potential security risks - the CUPS server does not accept remote +connections, and only accepts shared printer information from the +local subnet. When you share printers and/or enable remote +adminstration, you expose your system to potential unauthorized +access. This help page provides an analysis of possible CUPS +security concerns and describes how to better secure your +server.

    + +

    Authentication Issues

    + +

    When you enable remote administration, the server will use +Basic authentication for adminstration tasks. The current CUPS +server supports Basic, Digest, and local certificate +authentication:

    + +
      + +
    1. Basic authentication essentially places the clear + text of the username and password on the network. + +

      Since CUPS uses the system username and password + account information, the authentication information could + be used to gain access to possibly privileged accounts on + the server.

      + +

      Recommendation: Enable encryption to hide the + username and password information.

    2. + +
    3. 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. + +

      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.

      + +

      Recommendation: Enable encryption to hide the + username and password information.

    4. + +
    5. Local certificate authentication passes 128-bit + "certificates" that identify an authenticated user. + Certificates are created on-the-fly from random data and + stored in files under /var/run/cups/certs. + They have restricted read permissions: root + + system-group(s) for the root certificate, and lp + + system-group(s) for CGI certificates. + +

      Because certificates are only available on the local + system, the CUPS server does not accept local + authentication unless the client is connected to the + loopback interface (127.0.0.1 or ::1) or domain + socket.

      + +

      Recommendation: Ensure that unauthorized users + are not added to the system group(s).

    6. + +
    + +

    Denial of Service Attacks

    + +

    When printer sharing or remote administration is enabled, the +CUPS server, like all Internet services, is vulnerable to a +variety of denial of service attacks:

    + +
      + +
    1. Establishing multiple connections to the server until + the server will accept no more. + +

      This cannot be protected against by any known + software. The MaxClientsPerHost directive + can be used to configure CUPS to limit the number of + connections allowed from a single host, however that does + not prevent a distributed attack.

      + +

      Recommendation: Limit access to trusted systems + and networks.

    2. + +
    3. Repeatedly opening and closing connections to the + server as fast as possible. + +

      There is no easy way of protecting against this in the + CUPS software. If the attack is coming from outside the + local network, it may be possible to filter such an + attack. However, once the connection request has been + received by the server it must at least accept the + connection to find out who is connecting.

      + +

      Recommendation: None.

    4. + +
    5. Flooding the network with broadcast packets on port + 631. + +

      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.

      + +

      Recommendation: Block browse packets from + foreign or untrusted networks using a router or + firewall.

    6. + +
    7. Sending partial IPP requests; specifically, sending + part of an attribute value and then stopping + transmission. + +

      The current code will wait up to 1 second before + timing out the partial value and closing the connection. + This will slow the server responses to valid requests and + may lead to dropped browsing packets, but will otherwise + not affect the operation of the server.

      + +

      Recommendation: Block IPP packets from foreign + or untrusted networks using a router or + firewall.

    8. + +
    9. Sending large/long print jobs to printers, preventing + other users from printing. + +

      There are limited facilities for protecting against + large print jobs (the MaxRequestSize + attribute), however this will not protect printers from + malicious users and print files that generate hundreds or + thousands of pages.

      + +

      Recommendation: Restrict printer access to + known hosts or networks, and add user-level access + controls as needed for expensive printers.

    10. + +
    + +

    Encryption Issues

    + +

    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:

    + +
      + +
    1. 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. + +

      Recommendation: Do not depend on encryption for + security when connecting to servers over the Internet or + untrusted WAN links.

    2. + +
    + + + diff --git a/doc/help/spec-cmp.html b/doc/help/spec-cmp.html new file mode 100644 index 000000000..b4e798286 --- /dev/null +++ b/doc/help/spec-cmp.html @@ -0,0 +1,1277 @@ + + + + CUPS Configuration Management Plan + + + +

    This configuration management plan documents the guidelines +and processes we use when developing and maintaining the Common +UNIX Printing System ("CUPS") and related software. Our goal is +to provide reliable and efficient software and documentation that +addresses the needs of our users.

    + +

    Communication

    + +

    How to Contact the Developers

    + +

    The CUPS +Forums are the primary means of asking questions and +informally discussing issues and feature requests with the CUPS +developers. Table 1 shows the available forums and their +focus:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1: CUPS Forums
    ForumFocus/Purpose
    cups.bugsDiscussion of bugs and issues in the CUPS + software
    cups.commitReport of all commits to the Subversion repository + (read-only)
    cups.ddkUsage and development questions for the CUPS Driver + Development Kit
    cups.developmentDevelopment questions and discussion of new features + in the CUPS software
    cups.generalUsage questions for the CUPS software
    + +

    How to Submit a Bug Report or Feature Request

    + +

    The CUPS "Bugs & +Features" page provides access to the CUPS software +trouble report database and is the formal way to submit a +bug report or feature request to the CUPS developers. Please +note, however, that we do not provide answers to usage +questions or resolve problems in third-party software on this +page - use the CUPS Forums for that instead.

    + +

    Unlike discussions that occur on the CUPS Forums, 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.

    + +
    Please use the search feature of the Bugs & +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.
    + +

    How to Prepare a Patch

    + +

    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 trunk branch, which can +be generated easily using the following Subversion command:

    + +
    +svn diff >filename.patch
    +
    + +

    If you produce a patch using a released source archive, use +one of the following commands instead:

    + +
    +diff -u oldfilename filename >filename.patch
    +
    +diff -urN olddirectory directory >filename.patch
    +
    + +

    New files and files with significant changes can be submitted +in their entirety, however that may delay the adoption of your +changes.

    + +
    Patches and files must conform to the standards +outlined in the "Coding Guidelines" and "Makefile Guidelines" sections in this +document. In addition, since Easy Software Products provides CUPS +under multiple licenses, we require that you assign the copyright +for your changes and files to us for inclusion in +CUPS.
    + + +

    Software Development Practices

    + +

    Version Numbering

    + +

    CUPS uses a three-part version number separated by periods to +represent the major, minor, and patch release numbers. Major +release numbers indicate large design changes or +backwards-incompatible changes to the CUPS API or CUPS Imaging +API. Minor release numbers indicate new features and other +smaller changes which are backwards-compatible with previous CUPS +releases. Patch numbers indicate bug fixes to the previous +release.

    + +
    When we talk about compatibility, we are talking +about binary compatibility for public APIs and output format +compatibility for program interfaces. Changes to configuration +file formats or the default behavior of programs are not +generally considered incompatible as the upgrade process can +normally address such changes gracefully.
    + +

    Production releases use the plain version numbers:

    + +
    +MAJOR.MINOR.PATCH
    +1.0.0
    +1.0.1
    +1.0.2
    +...
    +1.1.0
    +...
    +1.1.23
    +1.2.0
    +1.2.1
    +...
    +1.3.0
    +...
    +2.0.0
    +
    + +

    The first production release in a MAJOR.MINOR series +(MAJOR.MINOR.0) is called a feature release. Feature releases are +the only releases that may contain new features. Subsequent +production releases in a MAJOR.MINOR series may only contain bug +fixes.

    + +
    We did not hold to this limitation in the CUPS 1.1 +series for a variety of reasons. Starting with CUPS 1.2, the "no +new features in a patch release" policy will be strictly +enforced. This should yield more frequent minor releases with +fewer new features (and interactions!) to +validate/test.
    + +

    Beta-test releases are identified by appending the letter B +to the major and minor version numbers followed by the beta +release number:

    + +
    +MAJOR.MINORbNUMBER
    +1.2b1
    +
    + +

    Release candidates are identified by appending the letters RC +to the major and minor version numbers followed by the release +candidate number:

    + +
    +MAJOR.MINORrcNUMBER
    +1.2rc1
    +
    + +

    Developer snapshots are identified by appending the letters +SVN-R to the major and minor version numbers followed by the +revision number:

    + +
    +MAJOR.MINORsvn-rREV
    +1.2svn-r1234
    +
    + +

    Beta-test releases, release candidates, and developer +snapshots are only created for new minor releases. Once a +production release has been made (MAJOR.MINOR.0), subsequent +patch releases are issues without preliminary beta or release +testing.

    + +

    Version Control (Subversion)

    + +

    The CUPS source files are managed by the Subversion ("SVN") +software, available at:

    + +
    +subversion.tigris.org
    +
    + +

    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 must be used for +commit log messages:

    + +
    +Summary of the change ("fix PostScript printing bug") along
    +with corresponding STRs ("STR #1, STR #6")
    +
    +foo.cxx:
    +    - function(): Detailed list of changes
    +    - function2(): Detailed list of changes
    +    - Summary of design changes ("added new foo struct")
    +
    +bar.h:
    +    - More detailed changes
    +
    + +

    Primary development occurs on the trunk branch, +with changes merged back to release branches as needed. Table 2 +shows the URLs developers use for the various CUPS subprojects +and branches:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2: CUPS Subversion URLs
    URLPurpose
    https://svn.easysw.com/public/cups/trunk/Primary CUPS development branch
    https://svn.easysw.com/public/cups/branches/CUPS maintenance branches (merge-only)
    https://svn.easysw.com/public/cups/tags/CUPS release tags (read-only)
    https://svn.easysw.com/public/cupsddk/trunk/Primary CUPS DDK development branch
    https://svn.easysw.com/public/cupsddk/branches/CUPS DDK maintenance branches (merge-only)
    https://svn.easysw.com/public/cupsddk/tags/CUPS DDK release tags (read-only)
    https://svn.easysw.com/public/espgs/trunk/Primary ESP Ghostscript development branch
    https://svn.easysw.com/public/espgs/branches/ESP Ghostscript maintenance branches (merge-only)
    https://svn.easysw.com/public/espgs/tags/ESP Ghostscript release tags (read-only)
    https://svn.easysw.com/public/windows/trunk/Primary CUPS Windows Driver development branch
    https://svn.easysw.com/public/windows/branches/CUPS Windows Driver maintenance branches (merge-only)
    https://svn.easysw.com/public/windows/tags/CUPS Windows Driver release tags (read-only)
    + +

    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.MINOR.PATCHbNUMBER", +"release-MAJOR.MINOR.PATCHrcNUMBER", or +"release-MAJOR.MINOR.PATCH", respectively. No release tags are +created for developer snapshots.

    + + +

    Files and Directories

    + +

    File and directory names may not exceed 16 characters in +length to ensure compability with older UNIX filesystems. In +addition, to avoid problems with case-insensitive filesystems, +you may not use names which differ only by case, for example +"ReadMe" and "README" are not allowed in the same directory.

    + +

    Source files must be documented and formatted as described in +"Coding Requirements". Make files must +follow the guidelines in "Makefile +Guidelines".

    + + +

    Build System

    + +

    The CUPS build system uses GNU autoconf to +tailor the library to the local operating system. Project files +for major IDEs are also provided for Microsoft +Windows®. To improve portability, makefiles must +not make use of the unique features offered by GNU make. See the Makefile Guidelines section for a +description of the allowed make features and makefile +guidelines.

    + +

    Additional GNU build programs such as GNU automake and +GNU libtool +must not be used. GNU automake produces non-portable makefiles +which depend on GNU-specific extensions, and GNU libtool is not +portable or reliable enough for CUPS.

    + + +

    Packaging

    + +

    Source packages are created using the +tools/makesrcdist script in the Subversion repository. +The script optionally uses a version number argument:

    + +
    +tools/makesrcdist
    +tools/makesrcdist version
    +
    + +

    When run with no arguments, the script creates a snapshot of +the current working copy and names it using the highest revision +number in the WC, for example +"/tmp/cups-1.2svn-r1234-source.tar.bz2" and +"/tmp/cups-1.2svn-r1234-source.tar.gz". When run with two +arguments, the script creates a release tag in the repository and +exports that tag, creating the files +"/tmp/cups-version-source.tar.bz2" and +"/tmp/cups-version-source.tar.gz".

    + +

    Binary packages are not generally distributed by the CUPS +team, however the packaging/cups.spec and +packaging/cups.list files may be used to create binary +packages on Linux, MacOS X, and UNIX. The +packaging/cups.spec file produces a binary package +using the rpmbuild(8) software:

    + +
    +rpmbuild -ta cups-version-source.tar.gz
    +
    + +

    The cups.list file is generated by the +configure script and produces binary packages for many +platforms using the EPM software. Table 3 shows the targets that +are available for each type of binary package:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 3: Binary Package Targets
    TargetType of Package
    aixAIX installp
    bsd*BSD pkg_install
    debDebian dpkg
    depotHP-UX swinstall
    epmPortable tarball with install script
    instIRIX inst/tardist
    osxMacOS X Install
    pkgSolaris pkgadd
    rpmRPM binary
    setldTru64 UNIX setld
    slackwareSlackware install
    swinstallHP-UX swinstall
    tardistIRIX inst/tardist
    + +

    Finally, the tools/testrpm and +tools/testosx scripts can be used to create binary +packages from the current working copy for testing on Linux and +MacOS X, respectively:

    + +
    +tools/testrpm
    +sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
    +
    +sudo tools/testosx
    +open cups.pkg
    +
    + + +

    Testing

    + +

    Software testing is conducted according to the CUPS Software Test Plan. This testing is +automated via the top-level makefile test target:

    + +
    +make test
    +
    + +

    The test environment allows for both short-term automated +testing and long-term testing and development without the +automated test script.

    + + +

    Trouble Report Processing

    + +

    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 Bugs & +Features page with one of the following states:

    + +
      + +
    1. STR is closed with complete resolution
    2. + +
    3. STR is closed without resolution
    4. + +
    5. STR is active, waiting on information from submitter
    6. + +
    7. STR is pending with additional information from submitter
    8. + +
    9. STR is newly submitted
    10. + +
    + +

    Trouble reports are processed using the following steps.

    + +
      + +
    1. Classification + +

      When a trouble report is received it must be classified at one +of the following priority levels:

      + +
        + +
      1. Request for enhancement, e.g. asking for a + feature + +
      2. Low, e.g. a documentation error or undocumented + side-effect + +
      3. Moderate, e.g. unable to print a file or unable to + compile the software + +
      4. High, e.g. unable to print to a printer or key + functionality not working + +
      5. Critical, e.g. unable to print at all + +
      + +

      Level 4 and 5 trouble reports must be resolved in the next +software release. Level 2 and 3 trouble reports are scheduled for +resolution in a specific release at the discretion of the release +coordinator. Level 1 trouble reports are scheduled for resolution +in a future feature release.

      + +

      The scope of the problem is also determined as:

      + +
        + +
      1. Specific to a machine or printer + +
      2. Specific to an operating system + +
      3. Applies to all machines, printers, and operating systems + +
      + +
    2. Identification + +

      Once the level and scope of the trouble report is determined +the software sub-system(s) involved with the problem are +determined. This may involve additional communication with the +user or vendor to isolate the problem to a specific cause.

      + +

      When the sub-system(s) involved have been identified, an +engineer will then determine the change(s) needed and estimate +the time required for the change(s).

      + +
    3. Correction + +

      Corrections are scheduled based upon the severity and +complexity of the problem. Once all changes have been made, +documented, and tested successfully a new software release +snapshot is generated. Additional tests are added as necessary +for proper testing of the changes.

      + +
    4. Notification + +

      The user or vendor is notified when the fix is available or if +the problem was caused by user error.

      + +
    + + +

    Release Management

    + +

    When testing has been completed successfully, a new source +package is created using the tools/makesrcdist script. +Three types of releases, beta, candidate, and production, are +created and released to the public using the basic schedule in +Table 4. At least one beta and one release candidate must be +created prior to a production release, and there must be at least +two weeks between the last beta and first candidate and last +candidate and first production release.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: CUPS Basic Release Schedule
    WeekVersionDescription
    T-6 weeks1.2b1First beta release
    T-5 weeks1.2b2Second beta release
    T-3 weeks1.2rc1First release candidate
    T-2 weeks1.2rc2Second release candidate
    T-0 weeks1.2.0Production (feature) release
    + + +

    Coding Guidelines

    + +

    These coding guidelines provide detailed information on source +file formatting and documentation content and must be applied to +all C and C++ source files provided with CUPS. Source code for +other languages should conform to these guidelines as allowed by +the language.

    + +

    Source Files

    + +

    All source files names shall be 16 characters or less in +length to ensure compatibility with older UNIX filesystems. +Source files containing functions shall have an extension of ".c" +for ANSI C and ".cxx" for C++ source files. All other "include" +files shall have an extension of ".h".

    + +

    The top of each source file shall contain 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 "$Id$" tag:

    + +
    +/*
    + * "$Id$"
    + *
    + *   Description of file contents.
    + *
    + *   Copyright yyyy-YYYY by Easy Software Products, all rights
    + *   reserved.
    + *
    + *   These coded instructions, statements, and computer programs are
    + *   the property of Easy Software Products and are protected by
    + *   Federal copyright law.  Distribution and use rights are outlined
    + *   in the file "LICENSE.txt" which should have been included with
    + *   this file.  If this file is missing or damaged please contact
    + *   Easy Software Products at:
    + *
    + *       Attn: CUPS Licensing Information
    + *       Easy Software Products
    + *       44141 Airport View Drive, Suite 204
    + *       Hollywood, Maryland 20636 USA
    + *
    + *       Voice: (301) 373-9600
    + *       EMail: cups-info@cups.org
    + *         WWW: http://www.cups.org/
    + *
    + * Contents:
    + *
    + *   function1() - Description 1.
    + *   function2() - Description 2.
    + *   function3() - Description 3.
    + */
    +
    + +

    For source files that are subject to the Apple OS-Developed +Software exception, the following additional comment should +appear after the contact information:

    + +
    + *   This file is subject to the Apple OS-Developed Software exception.
    +
    + +

    The bottom of each source file shall contain a trailer giving +the name of the file using the Subversion "$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:

    + +
    +/*
    + * End of "$Id$".
    + */
    +
    + +

    Functions

    + +

    Functions with a global scope shall have a lowercase prefix +followed by capitalized words ("cupsDoThis", "cupsDoThat", +"cupsDoSomethingElse", etc.) Private global functions shall begin +with a leading underscore ("_cupsDoThis", "_cupsDoThat", +etc.)

    + +

    Functions with a local scope shall be declared "static" and be +lowercase with underscores between words ("do_this", "do_that", +"do_something_else", etc.)

    + +

    Each function shall begin with a comment header describing +what the function does, the possible input limits (if any), and +the possible output values (if any), and any special information +needed:

    + +
    +/*
    + * 'do_this()' - Compute y = this(x).
    + *
    + * Notes: none.
    + */
    +
    +static float                            /* O - Inverse power value, 0.0 <= y <= 1.1 */
    +do_this(float x)                        /* I - Power value (0.0 <= x <= 1.1) */
    +{
    +  ...
    +  return (y);
    +}
    +
    + +

    Return/output values are indicated using an "O" prefix, input +values are indicated using the "I" prefix, and values that are +both input and output use the "IO" prefix for the corresponding +in-line comment.

    + +

    The Mini-XML documentation generator also understands the following +special text in the function description comment:

    + +
      + +
    • @since CUPS version@ - Marks the + function as new in the specified version of CUPS.
    • + +
    • @deprecated@ - Marks the function as + deprecated (not recommended for new development and + scheduled for removal)
    • + +
    + +

    Variables

    + +

    Variables with a global scope shall be capitalized +("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The +only exception to this rule shall be the CUPS interface library +global variables which must begin with the prefix "cups" +("cupsThisVariable", "cupsThatVariable", etc.) Global variables +shall be replaced by function arguments whenever possible.

    + +

    Variables with a local scope shall be lowercase with +underscores between words ("this_variable", "that_variable", +etc.) Any local variables shared by functions within a source +file shall be declared "static".

    + +

    Each variable shall be declared on a separate line and shall +be immediately followed by a comment block describing the +variable:

    + +
    +int this_variable;   /* The current state of this */
    +int that_variable;   /* The current state of that */
    +
    + +

    Types

    + +

    All type names shall be lowercase with underscores between +words and "_t" appended to the end of the name +("cups_this_type_t", "cups_that_type_t", etc.) Type names must +start with a prefix, typically "cups" or the name of the program, +to avoid conflicts with system types. Private type names must +start with an underscore ("_cups_this_t", "_cups_that_t", +etc.)

    + +

    Each type shall have a comment block immediately after the +typedef:

    + +
    +typedef int cups_this_type_t;           /* This type is for CUPS foobar options. */
    +
    + +

    Structures

    + +

    All structure names shall be lowercase with underscores +between words and "_s" appended to the end of the name +("cups_this_s", "cups_that_s", etc.) Structure names must start +with a prefix, typically "cups" or the name of the program, to +avoid conflicts with system types. Private structure names must +start with an underscore ("_cups_this_s", "_cups_that_s", +etc.)

    + +

    Each structure shall have a comment block immediately after +the struct and each member shall be documented in accordance with +the variable naming policy above:

    + +
    +struct cups_this_struct_s               /* This structure is for CUPS foobar options. */
    +{
    +  int this_member;                      /* Current state for this */
    +  int that_member;                      /* Current state for that */
    +};
    +
    + +

    Constants

    + +

    All constant names shall be uppercase with underscored between +words ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.) +Constants must begin with an uppercase prefix, typically "CUPS" +or the program name.

    + +

    Typed enumerations shall be used whenever possible to allow +for type checking by the compiler.

    + +

    Comment blocks shall immediately follow each constant:

    + +
    +enum
    +{
    +  CUPS_THIS_TRAY,                       /* This tray */
    +  CUPS_THAT_TRAY                        /* That tray */
    +};
    +
    + +

    Code

    + +

    All source code shall utilize 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:

    + +
    +/*
    + * Clear the state array before we begin...
    + */
    +
    +for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
    +  array[i] = STATE_IDLE;
    +
    +/*
    + * Wait for state changes...
    + */
    +
    +do
    +{
    +  for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
    +    if (array[i] != STATE_IDLE)
    +      break;
    +
    +  if (i == (sizeof(array) / sizeof(array[0])))
    +    sleep(1);
    +} while (i == (sizeof(array) / sizeof(array[0])));
    +
    + +

    Indentation

    + +

    All code blocks enclosed by brackets shall begin with the +opening brace on a new line. The code then follows starting on a +new line after the brace and is indented 2 spaces. The closing +brace is then placed on a new line following the code at the +original indentation:

    + +
    +{
    +  int i; /* Looping var */
    +
    + /*
    +  * Process foobar values from 0 to 999...
    +  */
    +
    +  for (i = 0; i < 1000; i ++)
    +  {
    +    do_this(i);
    +    do_that(i);
    +  }
    +}
    +
    + +

    Single-line statements following "do", "else", "for", "if", +and "while" shall be indented 2 spaces as well. Blocks of code +in a "switch" block shall be indented 4 spaces after each "case" +and "default" case:

    + +
    +switch (array[i])
    +{
    +  case STATE_IDLE :
    +      do_this(i);
    +      do_that(i);
    +      break;
    +  default :
    +      do_nothing(i);
    +      break;
    +}
    +
    + +

    Spacing

    + +

    A space shall follow each reserved word ("if", "while", etc.) +Spaces shall not be inserted between a function name and the +arguments in parenthesis.

    + +

    Return Values

    + +

    Parenthesis shall surround values returned from a function +using "return":

    + +
    +return (CUPS_STATE_IDLE);
    +
    + +

    Loops

    + +

    Whenever convenient loops should count downward to zero to +improve program performance:

    + +
    +for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
    +  array[i] = CUPS_STATE_IDLE;
    +
    + +

    Makefile Guidelines

    + +

    The following is a guide to the makefile-based build system +used by CUPS. These standards have been developed over the years +to allow CUPS to be built on as many systems and environments as +possible.

    + +

    General Organization

    + +

    The CUPS source code is organized functionally into a +top-level makefile, include file, and subdirectories each with +their own makefile and dependencies files. The ".in" files are +template files for the autoconf software and are +used to generate a static version of the corresponding file.

    + +

    Makefile Documentation

    + +

    Each make file must start with the standard CUPS header +containing the Subversion "$Id$" keyword, description of the +file, and CUPS copyright and license notice:

    + +
    +#
    +# "$Id$"
    +#
    +#   Makefile for ...
    +#
    +#   Copyright yyyy-YYYY by Easy Software Products, all rights
    +#   reserved.
    +#
    +#   These coded instructions, statements, and computer programs are
    +#   the property of Easy Software Products and are protected by
    +#   Federal copyright law.  Distribution and use rights are outlined
    +#   in the file "LICENSE.txt" which should have been included with
    +#   this file.  If this file is missing or damaged please contact
    +#   Easy Software Products at:
    +#
    +#       Attn: CUPS Licensing Information
    +#       Easy Software Products
    +#       44141 Airport View Drive, Suite 204
    +#       Hollywood, Maryland 20636 USA
    +#
    +#       Voice: (301) 373-9600
    +#       EMail: cups-info@cups.org
    +#         WWW: http://www.cups.org/
    +#
    +
    + +

    The end of each makefile must have a comment saying:

    + +
    +#
    +# End of "$Id$".
    +#
    +
    + +

    The purpose of the trailer is to indicate the end of the +makefile so that truncations are immediately obvious.

    + +

    Portable Makefile Construction

    + +

    CUPS uses a common subset of make program syntax to ensure +that the software can be compiled "out of the box" on as many +systems as possible. The following is a list of assumptions we +follow when constructing makefiles:

    + +
      + +
    • Targets; we assume that the make program + supports the notion of simple targets of the form + "name:" that perform tab-indented commands that follow + the target, e.g.: +
      +target:
      +→ target commands
    • + +
    • Dependencies; we assume that the make program + supports recursive dependencies on targets, e.g.: +
      +target: foo bar
      +→ target commands
      +
      +foo: bla
      +→ foo commands
      +
      +bar:
      +→ bar commands
      +
      +bla:
      +→ bla commands
    • + +
    • Variable Definition; we assume that the make program + supports variable definition on the command-line or in the makefile + using the following form: +
      +name=value
      + +
    • Variable Substitution; we assume that the make program + supports variable substitution using the following forms: +
        +
      • $(name); substitutes the value of "name",
      • +
      • ($name:.old=.new); substitutes the value of "name" + with the filename extensions ".old" changed to ".new",
      • +
      • $(MAKEFLAGS); substitutes the + command-line options passed to the program + without the leading hyphen (-),
      • +
      • $$; substitutes a single $ character,
      • +
      • $<; substitutes the current source file or dependency, and
      • +
      • $@; substitutes the current target name.
      • +
    • + +
    • Suffixes; we assume that the make program + supports filename suffixes with assumed dependencies, e.g.: +
      +.SUFFIXES: .c .o
      +.c.o:
      +→ $(CC) $(CFLAGS) -o $@ -c $<
    • + +
    • Include Files; we assume that the make program + supports the include directive, e.g.: +
      +include ../Makedefs
      +include Dependencies
    • + +
    • Comments; we assume that comments begin with + a # character and proceed to the end of the + current line.
    • + +
    • Line Length; we assume that there is no + practical limit to the length of lines.
    • + +
    • Continuation of long lines; we assume that + the \ character may be placed at the end of a + line to concatenate two or more lines in a + makefile to form a single long line.
    • + +
    • Shell; we assume a POSIX-compatible shell is + present on the build system.
    • + +
    + +

    Standard Variables

    + +

    The following variables are defined in the "Makedefs" file +generated by the autoconf software:

    + +
      + +
    • AR; the library archiver command,
    • + +
    • ARFLAGS; options for the library archiver command,
    • + +
    • BUILDROOT; optional installation prefix,
    • + +
    • MAN1EXT; extension for man pages in section 1,
    • + +
    • MAN3EXT; extension for man pages in section 3,
    • + +
    • MAN5EXT; extension for man pages in section 5,
    • + +
    • MAN7EXT; extension for man pages in section 7,
    • + +
    • MAN8DIR; subdirectory for man pages in section 8,
    • + +
    • MAN8EXT; extension for man pages in section 8,
    • + +
    • CC; the C compiler command,
    • + +
    • CFLAGS; options for the C compiler command,
    • + +
    • CXX; the C++ compiler command,
    • + +
    • CXXFLAGS; options for the C++ compiler command,
    • + +
    • DSOCOMMAND; the shared library building command,
    • + +
    • DSOFLAGS; options for the shared library building command,
    • + +
    • INSTALL; the install command,
    • + +
    • INSTALL_BIN; the program installation command,
    • + +
    • INSTALL_DATA; the data file installation command,
    • + +
    • INSTALL_DIR; the directory installation command,
    • + +
    • INSTALL_LIB; the library installation command,
    • + +
    • INSTALL_MAN; the documentation installation command,
    • + +
    • INSTALL_SCRIPT; the shell script installation command,
    • + +
    • LDFLAGS; options for the linker,
    • + +
    • LIBS; libraries for all programs,
    • + +
    • LN; the ln command,
    • + +
    • OPTIM; common compiler optimization options,
    • + +
    • RM; the rm command,
    • + +
    • SHELL; the sh (POSIX shell) command,
    • + +
    • STRIP; the strip command,
    • + +
    • bindir; the binary installation directory,
    • + +
    • datadir; the data file installation directory,
    • + +
    • exec_prefix; the installation prefix for executable files,
    • + +
    • libdir; the library installation directory,
    • + +
    • mandir; the man page installation directory,
    • + +
    • prefix; the installation prefix for non-executable files, and
    • + +
    • srcdir; the source directory.
    • + +
    + +

    Standard Targets

    + +

    The following standard targets must be defined in each +makefile:

    + +
      + +
    • all; creates all target programs, + libraries, and documentation files,
    • + +
    • clean; removes all target programs, + libraries, documentation files, and object files,
    • + +
    • depend; generates automatic dependencies + for any C or C++ source files (also see "Dependencies"),
    • + +
    • distclean; removes autoconf-generated files + in addition to those removed by the "clean" target,
    • + +
    • install; installs all distribution files in + their corresponding locations (also see "Install/Uninstall Support"),
    • + +
    • uninstall; removes all distribution files from + their corresponding locations (also see "Install/Uninstall Support"), and
    • + +
    + + +

    Object Files

    + +

    Object files (the result of compiling a C or C++ source file) +have the extension ".o".

    + +

    Programs

    + +

    Program files are the result of linking object files and +libraries together to form an executable file. A typical +program target looks like:

    + +
    +program: $(OBJS)
    +→ echo Linking $@...
    +→ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
    +
    + +

    Static Libraries

    + +

    Static libraries have a prefix of "lib" and the extension +".a". A typical static library target looks like:

    + +
    +libname.a: $(OBJECTS)
    +→ echo Creating $@...
    +→ $(RM) $@
    +→ $(AR) $(ARFLAGS) $@ $(OBJECTS)
    +→ $(RANLIB) $@
    +
    + +

    Shared Libraries

    + +

    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:

    + +
    +libname.so: $(OBJECTS)
    +→ echo $(DSOCOMMAND) libname.so.$(DSOVERSION) ...
    +→ $(DSOCOMMAND) libname.so.$(DSOVERSION) $(OBJECTS)
    +→ $(RM) libname.so libname.so.$(DSOMAJOR)
    +→ $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
    +→ $(LN) libname.so.$(DSOVERSION) libname.so
    +
    +libname.sl: $(OBJECTS)
    +→ echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
    +→ $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
    +→ $(RM) libname.sl libname.sl.$(DSOMAJOR)
    +→ $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
    +→ $(LN) libname.sl.$(DSOVERSION) libname.sl
    +
    +libname.dylib: $(OBJECTS)
    +→ echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
    +→ $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
    +→ → -install_name $(libdir)/libname.$(DSOMAJOR).dylib \
    +→ → -current_version libname.$(DSOVERSION).dylib \
    +→ → -compatibility_version $(DSOMAJOR).0 \
    +→ → $(OBJECTS) $(LIBS)
    +→ $(RM) libname.dylib
    +→ $(RM) libname.$(DSOMAJOR).dylib
    +→ $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
    +→ $(LN) libname.$(DSOVERSION).dylib libname.dylib
    +
    +libname_s.a: $(OBJECTS)
    +→ echo $(DSOCOMMAND) libname_s.o ...
    +→ $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
    +→ echo $(LIBCOMMAND) libname_s.a libname_s.o
    +→ $(RM) $@
    +→ $(LIBCOMMAND) libname_s.a libname_s.o
    +→ $(CHMOD) +x libname_s.a
    +
    + + +

    Dependencies

    + +

    Static dependencies are expressed in each makefile following the +target, for example:

    + +
    +foo: bar
    +
    + +

    Static dependencies shall only be used when it is not +possible to automatically generate them. Automatic dependencies +are stored in a file named "Dependencies" and included at the +end of the makefile. The following "depend" target rule shall be +used to create the automatic dependencies: + +

    +depend:
    +→ $(MAKEDEPEND) -Y -I.. -f Dependencies $(OBJS:.o=.c)
    +
    + +

    We only regenerate the automatic dependencies on a Linux +system and express any non-Linux dependencies statically in the +makefile.

    + +

    Install/Uninstall Support

    + +

    All makefiles must contain install and uninstall rules which +install or remove the corresponding software. These rules must +use the $(BUILDROOT) variable as a prefix to any +installation directory so that CUPS can be installed in a +temporary location for packaging by programs like +rpmbuild.

    + +

    The $(INSTALL_BIN), $(INSTALL_DATA), +$(INSTALL_DIR), $(INSTALL_LIB), +$(INSTALL_MAN), and $(INSTALL_SCRIPT) +variables must be used when installing files so that the proper +ownership and permissions are set on the installed files.

    + +

    The $(RANLIB) command must be run on any static +libraries after installation since the symbol table is +invalidated when the library is copied on some platforms.

    + + + diff --git a/doc/help/spec-command.html b/doc/help/spec-command.html index a9f74f098..8847203d2 100644 --- a/doc/help/spec-command.html +++ b/doc/help/spec-command.html @@ -1,6 +1,6 @@ - + CUPS Command File Format diff --git a/doc/help/spec-design.html b/doc/help/spec-design.html new file mode 100644 index 000000000..cfec31882 --- /dev/null +++ b/doc/help/spec-design.html @@ -0,0 +1,170 @@ + + + + CUPS Design Description + + + +

    Like most printing systems, CUPS is designed around a central +print scheduling process that dispatches print jobs, processes +administrative commands, provides printer status information to +local and remote programs, and informs users as needed. Figure 1 +shows the basic organization of CUPS.

    + +

    Scheduler

    + +

    The scheduler is a HTTP/1.1 server application that handles +HTTP requests. Besides handling printer requests via IPP POST +requests, the scheduler also acts as a full-featured web server +for documentation, status monitoring, and administration.

    + +

    The scheduler also manages a list of available printers on +the LAN and dispatches print jobs as needed using the +appropriate filters and backends.

    + +

    Configuration Files

    + +

    The configuration files consist of:

    + +
      + +
    • The HTTP server configuration file.
    • + +
    • Printer and class definition files.
    • + +
    • MIME type and conversion rule files.
    • + +
    • PostScript Printer Description (PPD) files.
    • + +
    + +

    The HTTP server configuration file is purposely similar to +the Apache server configuration file and defines all of the +access control properties for the server.

    + +

    The printer and class definition files list the available +printer queues and classes. Printer classes are collections of +printers. Jobs sent to a class are forwarded to the first +available printer in the class, round-robin fashion.

    + +

    The MIME type files list the supported MIME types +(text/plain, application/postscript, etc.) and "magic' rules for +automatically detecting the format of a file. These are used by +the HTTP server to determine the Content-Type field for +GET and HEAD requests and by the IPP request +handler to determine the file type when a Print-Job or +Send-File request is received with a +document-format of +application/octet-stream.

    + +

    The MIME conversion rule files list the available filters. +The filters are used when a job is dispatched so that an +application can send a convenient file format to the printing +system which then converts the document into a printable format +as needed. Each filter has a relative cost associated with it, +and the filtering algorithm chooses the set of filters that will +convert the file to the needed format with the lowest total +"cost".

    + +

    The PPD files describe the capabilities of all printers, not +just PostScript printers. There is one PPD file for each +printer. PPD files for non-PostScript printers define additional +filters through cupsFilter attributes to support +printer drivers.

    + +

    CUPS Block Diagram
    +Figure 1 - CUPS Block Diagram

    + +

    CUPS API

    + +

    The CUPS API contains CUPS-specific convenience functions for +queuing print jobs, getting printer information, accessing +resources via HTTP and IPP, and manipulating PPD files. Unlike +the rest of CUPS, the CUPS API is provided under the terms of +the GNU LGPL so it may be used by non-GPL applications.

    + +

    Berkeley and System V Commands

    + +

    CUPS provides the System V and Berkeley command-line +interfaces for submitting jobs and checking the printer status. +The lpstat and lpc status commands +also show network printers ("printer@server") when printer +browsing is enabled.

    + +

    The System V administation commands are supplied for managing +printers and classes. The Berkeley printer administration tool +(lpc) is only supported in a "read-only' mode to +check the current status of the printer queues and +scheduler.

    + +

    Filters

    + +

    A filter program reads from the standard input or from a file +if a filename is supplied. All filters must support a common set +of options including printer name, job ID, username, job title, +number of copies, and job options. All output is sent to the +standard output.

    + +

    Filters are provided for many file formats and include image +file and PostScript raster filters that support non-PostScript +printers. Multiple filters are run in parallel to produce the +required output format.

    + +

    The PostScript raster filter is based on the ESP Ghostscript +core. Instead of using the Ghostscript printer drivers, the CUPS +filter uses a generic CUPS raster printer driver and +CUPS-compliant front-end to support any kind of raster printer. +This allows the same printer driver filter to be used for +printing raster data from any filter.

    + +
    Talk about Apple's use of CUPS...
    + +

    CUPS Imaging

    + +

    The CUPS Imaging library provides functions for managing +large images, doing colorspace conversion and color management, +scaling images for printing, and managing raster page streams. +It is used by the CUPS image file filters, the PostScript RIP, +and all raster printers drivers.

    + +

    Backends

    + +

    A backend program is a special filter that sends print data +to a device or network connection. Backends for parallel, +serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are +provided in CUPS 1.2.

    + +

    SAMBA version 2.0.6 and higher includes a SMB backend +(smbspool(1)) that can be used for printing to +Windows.

    + +

    Network Printing

    + +

    Traditionally, network printing has been one of the hardest +things to get working under UNIX. One reason is because each +vendor added their own extensions to the LPD protocol (the +previous standard for network printing), making cross-platform +printing difficult if not impossible.

    + +

    Another reason is that you have to administer every network +printer on every client machine. In some cases you can "clone' +the printer configuration from a "master' client to each of the +others, but even that can be time-consuming and error-prone. +Something better is needed.

    + +

    CUPS provides "printer browsing", which allows clients to +automatically see and use printers from any server on a LAN. +This means that you only need to configure the server and the +clients will automatically see the printers and classes on +it.

    + +

    In addition, CUPS can automatically merge multiple identical +network printers into "implicit classes". This allows clients to +send jobs to the implicit class and have them print on the first +available printer or server. In addition, failsafe and +load-balancing functions are enabled simply by defining the same +printer on multiple servers!

    + + + diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html index 24991a90d..47a2a5ac5 100644 --- a/doc/help/spec-ipp.html +++ b/doc/help/spec-ipp.html @@ -1,6 +1,6 @@ - + CUPS Implementation of IPP diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html index 51c35b925..4ef176c09 100644 --- a/doc/help/spec-ppd.html +++ b/doc/help/spec-ppd.html @@ -1,6 +1,6 @@ - + CUPS PPD Extensions @@ -8,7 +8,7 @@ + + CUPS Raster Format + + + +

    CUPS raster files are device-dependent raster image files that +contain a PostScript page device dictionary and device-dependent +raster imagery for each page in the document. These files are +used to transfer raster data from the PostScript and image file +RIPs to device-dependent filters that convert the raster data to +a printable format.

    + +

    CUPS 1.0 and 1.1 used a version 1 raster format. CUPS 1.2 +introduces a version 2 format that is a superset of the version 1 +format. Applications using the CUPS Imaging API (the cupsRaster* +functions) can read both formats without code changes.

    + +

    The registered MIME media type for CUPS raster files is +application/vnd.cups-raster.

    + + +

    Version 1 Raster File Format

    + +

    A version 1 raster file begins with a 32-bit synchronization +word: 0x52615374 ("RaSt") for big-endian architectures and +0x74536152 ("tSaR") for little-endian architectures. The writer +of the raster file will use the native word order, and the reader +is responsible for detecting a reversed word order file and +swapping bytes as needed. The CUPS Imaging API raster functions +perform this function automatically.

    + +

    Following the synchronization word are a series of raster +pages. Each page starts with a page device dictionary header and +is followed immediately by the (uncompressed, raw) raster data +for that page.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1: CUPS Version 1 Raster Page Device Dictionary
    BytesTypeDescriptionValues
    0-63C StringMediaClassMedia class string
    64-127C StringMediaColorMedia color string
    128-191C StringMediaTypeMedia type string
    192-255C StringOutputTypeOutput type string
    256-259Unsigned IntegerAdvanceDistance0 to 232 - 1 points
    260-263Unsigned IntegerAdvanceMedia0 = Never advance roll
    + 1 = Advance roll after file
    + 2 = Advance roll after job
    + 3 = Advance roll after set
    + 4 = Advance roll after page
    264-267Unsigned IntegerCollate0 = do not collate copies
    + 1 = collate copies
    268-271Unsigned IntegerCutMedia0 = Never cut media
    + 1 = Cut roll after file
    + 2 = Cut roll after job
    + 3 = Cut roll after set
    + 4 = Cut roll after page
    272-275Unsigned IntegerDuplex0 = Print single-sided
    + 1 = Print double-sided
    276-283Unsigned Integers (2)HWResolutionHorizontal and vertical resolution in dots-per-inch.
    284-299Unsigned Integers (4)ImagingBoundingBoxFour integers giving the left, bottom, right, and top positions + of the page bounding box in points
    300-303Unsigned IntegerInsertSheet0 = Do not insert separator sheets
    + 1 = Insert separator sheets
    304-307Unsigned IntegerJog0 = Do no jog pages
    + 1 = Jog pages after file
    + 2 = Jog pages after job
    + 3 = Jog pages after set
    308-311Unsigned IntegerLeadingEdge0 = Top edge is first
    + 1 = Right edge is first
    + 2 = Bottom edge is first
    + 3 = Left edge is first
    312-319Unsigned Integers (2)MarginsLeft and bottom origin of image in points
    320-323Unsigned IntegerManualFeed0 = Do not manually feed media
    + 1 = Manually feed media
    324-327Unsigned IntegerMediaPositionInput slot position from 0 to N
    328-331Unsigned IntegerMediaWeightMedia weight in grams per meter squared
    332-335Unsigned IntegerMirrorPrint0 = Do not mirror prints
    + 1 = Mirror prints
    336-339Unsigned IntegerNegativePrint0 = Do not invert prints
    + 1 = Invert prints
    340-343Unsigned IntegerNumCopies1 to 232 - 1
    344-347Unsigned IntegerOrientation0 = Do not rotate page
    + 1 = Rotate page counter-clockwise
    + 2 = Turn page upside down
    + 3 = Rotate page clockwise
    348-351Unsigned IntegerOutputFaceUp0 = Output face down
    + 1 = Output face up
    352-359Unsigned Integers (2)PageSizeWidth and length in points
    360-363Unsigned IntegerSeparations0 = Print composite image
    + 1 = Print color separations
    364-367Unsigned IntegerTraySwitch0 = Do not change trays if selected tray is empty
    + 1 = Change trays if selected tray is empty
    368-371Unsigned IntegerTumble0 = Do not rotate even pages when duplexing
    + 1 = Rotate even pages when duplexing
    372-375Unsigned IntegercupsWidthWidth of page image in pixels
    376-379Unsigned IntegercupsHeightHeight of page image in pixels
    380-383Unsigned IntegercupsMediaTypeDriver-specific 0 to 232 - 1
    384-387Unsigned IntegercupsBitsPerColor1, 2, 4, 8 bits for version 1 raster files
    + 1, 2, 4, 8, and 16 bits for version 2 raster files
    388-391Unsigned IntegercupsBitsPerPixel1 to 32 bits for version 1 raster files
    + 1 to 64 bits for version 2 raster files
    392-395Unsigned IntegercupsBytesPerLine1 to 232 - 1 bytes
    396-399Unsigned IntegercupsColorOrder0 = chunky pixels (CMYK CMYK CMYK)
    + 1 = banded pixels (CCC MMM YYY KKK)
    + 2 = planar pixels (CCC... MMM... YYY... KKK...)
    400-403Unsigned IntegercupsColorSpace0 = white
    + 1 = RGB
    + 2 = RGBA
    + 3 = black
    + 4 = CMY
    + 5 = YMC
    + 6 = CMYK
    + 7 = YMCK
    + 8 = KCMY
    + 9 = KCMYcm
    + 10 = GMCK
    + 11 = GMCS
    + 12 = WHITE
    + 13 = GOLD
    + 14 = SILVER
    + 15 = CIE XYZ
    + 16 = CIE Lab
    + 17 = RGBW
    + 32 = ICC1
    + 33 = ICC2
    + 34 = ICC3
    + 35 = ICC4
    + 36 = ICC5
    + 37 = ICC6
    + 38 = ICC7
    + 39 = ICC8
    + 40 = ICC9
    + 41 = ICCA (10)
    + 42 = ICCB (11)
    + 43 = ICCC (12)
    + 44 = ICCD (13)
    + 45 = ICCE (14)
    + 46 = ICCF (15)
    +
    404-407Unsigned IntegercupsCompressionDriver-specific 0 to 232 - 1
    408-411Unsigned IntegercupsRowCountDriver-specific 0 to 232 - 1
    412-415Unsigned IntegercupsRowFeedDriver-specific 0 to 232 - 1
    416-419Unsigned IntegercupsRowStepDriver-specific 0 to 232 - 1
    + + +

    Version 2 Raster File Format

    + +

    A version 2 raster file begins with a 32-bit synchronization +word: 0x52615332 ("RaS2") for big-endian architectures and +0x32536152 ("2SaR") for little-endian architectures. The writer +of the raster file will use the native word order, and the reader +is responsible for detecting a reversed word order file and +swapping bytes as needed. The CUPS Imaging API raster functions +perform this function automatically.

    + +

    Following the synchronization word are a series of raster +pages. Each page starts with a version 2 page device dictionary +header and is followed immediately by the compressed raster data +for that page.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2: CUPS Version 2 Raster Page Device Dictionary
    BytesTypeDescriptionValues
    0-419Version 1 header dataSee Table 1
    420-423Unsigned IntegercupsNumColors1 to 6 colors
    424-427IEEE Single PrecisioncupsBorderlessScalingFactor0.0 or 1.0 or greater
    428-435IEEE Single Precision (2)cupsPageSizeWidth and length in points
    436-451IEEE Single Precision (4)cupsImagingBBoxFour floating point numbers giving the left, bottom, + right, and top positions of the page bounding box in + points
    452-515Unsigned Integers (16)cupsInteger16 driver-defined integer values
    516-579IEEE Single Precision (16)cupsReal16 driver-defined floating point values
    580-1603C Strings (16x64)cupsString16 driver-defined strings
    1604-1667C StringcupsMarkerTypeInk/toner type string
    1668-1731C StringcupsRenderingIntentColor rendering intent string
    1732-1795C StringcupsPageSizeNamePage size name/keyword string from PPD
    + +

    Compressed Raster Data Format

    + +

    The version 2 raster data is compressed using a modified TIFF +packbits algorithm. Lines are grouped into an integral number of +color values based upon the cupsColorOrder +setting:

    + +
    + + + + + + + + + + + + + + + + +
    cupsColorOrderBytes per color value
    0 (chunky)(cupsBitsPerPixel + 7) / 8
    1 (banded)(cupsBitsPerColor + 7) / 8
    2 (planar)(cupsBitsPerColor + 7) / 8
    + +

    Each line of raster data begins with a repetition count from 1 +to 256 that is encoded using a single byte of "count - 1".

    + +

    After the repetition count, whole color values for that line +are run-length encoded using the TIFF packbits algorithm. 1 to +128 repeated colors are encoded using an initial byte of "count - +1" followed by the color value byte(s). 2 to 128 non-repeating +colors are encoded using an initial byte of "257 - count" +followed by the color value bytes.

    + + + +

    Change History

    + +

    Changes in CUPS 1.2

    + +
      + +
    • Bumped raster version to 2
    • + +
    • Added RGBW colorspace
    • + +
    • Added 16 bit per color support
    • + +
    • Added cupsNumColors, cupsBorderlessScalingFactor, + cupsPageSize, cupsImagingBBox, cupsInteger, cupsReal, + cupsString, cupsMarkerType, cupsRenderingIntent, and + cupsPageSizeName attributes to the page device + dictionary
    • + +
    • Added raster data compression
    • + +
    • Added data type column to device dictionary + documentation.
    • + +
    + +

    Changes in CUPS 1.1.19

    + +
      + +
    • Added ICC and CIE colorspaces.
    • + +
    + + + diff --git a/doc/help/spec-stp.html b/doc/help/spec-stp.html new file mode 100644 index 000000000..5884690c2 --- /dev/null +++ b/doc/help/spec-stp.html @@ -0,0 +1,130 @@ + + + + CUPS Software Test Plan + + + +

    This software test plan provides detailed tests that are used +to evaluate the stability and compliance of the Common UNIX +Printing System ("CUPS") Version 1.2.

    + + +

    Test Procedure

    + +

    The test software and data files are located in the +test subdirectory of the source distribution. A script +is provided to compile the ipptest program and run +all of the tests that follow, producing a success/fail +report.

    + +

    The test target of the top-level makefile can be +used to run this script:

    + +
    +make test
    +
    + +

    or you can run the test script directly:

    + +
    +cd test
    +./run-stp-tests
    +
    + +

    A Software Test Report is stored in a HTML file in the +test subdirectory at the conclusion of the test.

    + + +

    IPP Compliance Tests

    + +

    This section describes the tests used to validate the IPP +standards compliance of the CUPS server.

    + +

    Request Tests

    + +

    These tests verify that the CUPS scheduler only accepts valid +IPP requests that start with the attributes-charset +and attributes-natural-language attributes and also +contain a printer-uri or job-uri +attribute.

    + +

    It also verifies that the CUPS scheduler always responds with +attributes-charset and +attributes-natural-language attributes, using +default values if they are not provided by the client.

    + +

    CUPS Printer Operation Tests

    + +

    These tests verify that the CUPS printer operations are +supported and function properly. Two printers called +Test1 and Test2 are created, one as a +PostScript printer and one as a raster printer.

    + +

    Job Operation Tests

    + +

    These test verify that the CUPS scheduler accepts print jobs +for all supported file formats and that the +cancel-job, hold-job, and +resume-job operations work.

    + +

    Subscription Operation Tests

    + +

    These test verify that the CUPS scheduler accepts +subscriptions with print jobs and that all subscription +operations work as required by the IPP notification and mailto +specifications.

    + + +

    Command Tests

    + +

    This section describes the tests used to validate the Berkeley +and System V commands included with CUPS.

    + +

    lpadmin

    + +

    This test verifies that printers can be added, modified, and +defaulted using the lpadmin command.

    + +

    lpc

    + +

    This test verifies that the lpc command can show +the current status of all print queues.

    + +

    lpq

    + +

    This test verifies that the lpq command lists +any jobs in the queue.

    + +

    lpstat

    + +

    This test verifies that the lpstat command works +with all reports using the "-t" option.

    + +

    lp

    + +

    This test verifies that the lp command works with +both the default destination and a specific destination.

    + +

    lpr

    + +

    This test verifies that the lpr command works +with both the default destination and a specific destination.

    + +

    lprm

    + +

    This test verifies that the lprm command can +properly cancel a job.

    + +

    cancel

    + +

    This test verifies that the cancel command can +properly cancel a job or all jobs.

    + +

    lpinfo

    + +

    This test verifies that the lpinfo command +returns a list of available printer drivers and devices.

    + + + diff --git a/doc/help/standard.html.in b/doc/help/standard.html.in index 699239bc3..94b4473d1 100644 --- a/doc/help/standard.html.in +++ b/doc/help/standard.html.in @@ -39,39 +39,39 @@ Basic authentication with membership in the group Value - Browsing + Browsing @CUPS_BROWSING@ - BrowseLocalProtocols + BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ - BrowseRemoteProtocols + BrowseRemoteProtocols @CUPS_BROWSE_REMOTE_PROTOCOLS@ - BrowseShortNames + BrowseShortNames @CUPS_BROWSE_SHORT_NAMES@ - ConfigFilePerm + ConfigFilePerm @CUPS_CONFIG_FILE_PERM@ - DefaultShared + DefaultShared @CUPS_DEFAULT_SHARED@ - ImplicitClasses + ImplicitClasses @CUPS_IMPLICIT_CLASSES@ - LogFilePerm + LogFilePerm @CUPS_LOG_FILE_PERM@ - UseNetworkDefault + UseNetworkDefault @CUPS_USE_NETWORK_DEFAULT@ @@ -88,7 +88,7 @@ Basic authentication with membership in the group @CUPS_SERVERROOT@ The location of configuration files such as printers.conf. Overridden by the ServerRoot + HREF="ref-cupsd-conf.html#ServerRoot">ServerRoot directive in cupsd.conf. @@ -107,7 +107,7 @@ Basic authentication with membership in the group @CUPS_SERVERBIN@ The location of server programs such as backends and filters. Overridden by the ServerBin + HREF="ref-cupsd-conf.html#ServerBin">ServerBin directive in cupsd.conf. @@ -118,14 +118,14 @@ Basic authentication with membership in the group @CUPS_DATADIR@ The location of data files such as fonts. Overridden by the DataDir + HREF="ref-cupsd-conf.html#DataDir">DataDir directive in cupsd.conf. @CUPS_DOCROOT@ The location of documentation files. Overridden by the DocumentRoot + HREF="ref-cupsd-conf.html#DocumentRoot">DocumentRoot directive in cupsd.conf. @@ -137,7 +137,7 @@ Basic authentication with membership in the group The location of cache files such as ppds.dat and remote.cache. Overridden by the CacheDir + HREF="ref-cupsd-conf.html#CacheDir">CacheDir directive in cupsd.conf. @@ -145,25 +145,25 @@ Basic authentication with membership in the group The location of the access_log, error_log, and page_log files. Overridden by the AccessLog, + HREF="ref-cupsd-conf.html#AccessLog">AccessLog, ErrorLog, + HREF="ref-cupsd-conf.html#ErrorLog">ErrorLog, PageLog, + HREF="ref-cupsd-conf.html#PageLog">PageLog, directive in cupsd.conf. @CUPS_STATEDIR@ The location of the domain socket file and state data such as authentication certificates. Overridden by the StateDir + HREF="ref-cupsd-conf.html#StateDir">StateDir directive in cupsd.conf. @CUPS_REQUESTS@ The location of spooled print jobs. Overridden by the RequestRoot + HREF="ref-cupsd-conf.html#RequestRoot">RequestRoot directive in cupsd.conf. diff --git a/doc/help/translation.html b/doc/help/translation.html new file mode 100644 index 000000000..3ffb2de61 --- /dev/null +++ b/doc/help/translation.html @@ -0,0 +1,1050 @@ + + + + Translating CUPS + + + +

    Thanks to its extensive use of templates, images, and message +catalogs, CUPS can be easily translated (or customized!) to suit +your needs. This help file will guide you through the CUPS +localization files so you can get the most out of it.

    + +

    Getting Started

    + +

    Start by downloading the CUPS source code from www.cups.org. After you extract the files +from the source archive, you will want to copy the following +files and directories:

    + +
      + +
    • doc/images/button-*.gif - the web + interface button images
    • + +
    • doc/images/button-*.scm - the Gimp scripts + we use to generate the web interface button images
    • + +
    • doc/index.html - the web interface home + page
    • + +
    • locale/cups.pot - the message catalog
    • + +
    • templates/*.tmpl - the web interface + template files
    • + +
    + +

    With the exception of the message catalogs, localization files +are placed in subdirectories under the doc and +templates using the locale name. Locale names are +either ll or ll_CC, where "ll" is the +2-letter language code and "CC" is the 2-letter country code.

    + +

    All non-image files must be encoded using the UTF-8 character +set.

    + + +

    Submitting a Translation for CUPS

    + +

    To submit a translation for inclusion in CUPS, translate all +of the button images, template files, the +index.html.in file, and the message catalog. Place +these files in the correct subdirectory in the CUPS source code +archive and run the following command to create an archive with +your files:

    + +
    +tar cvf ll_CC.tar.gz doc/ll_CC locale/ll_CC.po templates/ll_CC
    +
    + +

    Replace "ll_CC" with the locale name for your translation. +Once you have created the archive, go to the CUPS Bugs +& Features page and submit a bug report, attaching the +translation to the report.

    + + +

    Button Images

    + +

    The web interface button images are used to activate functions +on the CUPS web pages. Table 1 lists the button images and the +English text labels for those buttons. Use the supplied Gimp +scripts to create button images that match the CUPS web interface +and save them in the doc/ll_CC/images subdirectory. +The Gimp button scripts can be installed using the following +command:

    + +
    +cp doc/images/button*.scm ~/.gimp-2.2/scripts
    +
    + +

    If you have already started the Gimp application, choose +Refresh Scripts from the Xtns->Script-Fu +sub-menu. The button scripts will be available under a new +Btns + +

    When you have created all of the button images, edit the +doc/Makefile file and add the locale name to the +LANGUAGES variable. You can then run "make +install" in the doc subdirectory to test the +translated buttons.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1: Web Interface Buttons
    FilenameText
    button-accept-jobs.gifAccept Jobs
    button-add-class.gifAdd Class
    button-add-printer.gifAdd Printer
    button-add-this-printer.gifAdd This Printer
    button-cancel-all-jobs.gifCancel All Jobs
    button-cancel-job.gifCancel Job
    button-change-settings.gifChange Settings
    button-clean-print-heads.gifClean Print Heads
    button-clear.gifClear
    button-continue.gifContinue
    button-delete-class.gifDelete Class
    button-delete-printer.gifDelete Printer
    button-edit-configuration-file.gifEdit Configuration File
    button-export-samba.gifExport Printers to Samba
    button-help.gifHelp
    button-hold-job.gifHold Job
    button-manage-classes.gifManage Classes
    button-manage-jobs.gifManage Jobs
    button-manage-printers.gifManage Printers
    button-manage-server.gifManage Server
    button-modify-class.gifModify Class
    button-modify-printer.gifModify Printer
    button-move-job.gifMove Job
    button-move-jobs.gifMove All Jobs
    button-print-self-test-page.gifPrint Self-Test Page
    button-print-test-page.gifPrint Test Page
    button-publish-printer.gifPublish Printer
    button-reject-jobs.gifReject Jobs
    button-release-job.gifRelease Job
    button-restart-job.gifReprint Job
    button-save-changes.gifSave Changes
    button-search.gifSearch
    button-set-allowed-users.gifSet Allowed Users
    button-set-as-default.gifSet As Default
    button-set-printer-options.gifSet Printer Options
    button-show-active.gifShow Active Jobs
    button-show-all.gifShow All Jobs
    button-show-completed.gifShow Completed Jobs
    button-show-next.gifShow Next
    button-show-previous.gifShow Previous
    button-sort-ascending.gifShow Ascending
    button-sort-descending.gifShow Descending
    button-start-class.gifStart Class
    button-start-printer.gifStart Printer
    button-stop-class.gifStop Class
    button-stop-printer.gifStop Printer
    button-unpublish-printer.gifUnpublish Printer
    button-use-default-config.gifUse Default Configuration File
    button-view-access-log.gifView Access Log
    button-view-error-log.gifView Error Log
    button-view-page-log.gifView Page Log
    button-view-printable-version.gifView Printable Version
    + + +

    The Home Page

    + +

    The index.html file is a complete HTML file that is +displayed when the user visits "http://localhost:631/". Edit the +existing doc/index.html and save it in the +doc/ll_CC subdirectory so that the makefile can +install it. Run "make install" in the doc subdirectory +to test the new home page.

    + + +

    Message Catalogs

    + +

    CUPS message catalogs are GNU gettext ".po" text files that +provide a list of localized message strings for the CUPS +software. Message catalogs are named cups_ll.po or +cups_ll_CC.po, where "ll" is the standard 2-letter +abbreviation for the language and "CC" is the standard 2-letter +abbreviation for the country.

    + +

    When translating a new message catalog, copy the +cups.pot message catalog file in the locale +subdirectory of the CUPS source code. For example, to start +translating the message catalog to Canadian French, you would +type the following commands:

    + +
    +cd locale
    +cp cups.pot fr_CA.po
    +
    + +

    Alternatively, you can copy the existing fr.po +message catalog and then make any necessary changes.

    + +

    Once you have make your copy of the file, edit it using your +favorite text editor or translation program to translate the text +to the desired language.

    + +

    Finally, add your locale to the LANGUAGES +variable in the locale/Makefile file and run the "make +install" command in the locale subdirectory to test +the translation.

    + + +

    Template Files

    + +

    The CUPS scheduler provides a web interface that can be used +to do many common printing and administration tasks. The built-in +web server supports localization of web pages through the use of +subdirectories for each locale, e.g. "fr" for French, "de" for +German, "fr_ca" for French in Canada, and so forth.

    + +

    Template files are HTML files with special formatting +characters in them that allow substition of variables and arrays. +The CUPS CGI programs (admin.cgi, +classes.cgi, help.cgi, +jobs.cgi, and printers.cgi) use these +template file to provide dynamic content for the web interface. +Template files are installed in the +/usr/share/cups/templates directory by default. Table +2 lists the various template files and their purpose.

    + +

    Translated versions of the template files should be saved in +the templates/ll_CC subdirectory. For example, +Canadian French template files should be saved in the +templates/fr_CA subdirectory. After you have +translated all of the templates, add the locale to the +LANGUAGES variable in the +templates/Makefile and run "make install" in the +templates subdirectory to test the translation.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2: Web Interface Template Files
    FilenamePurpose
    add-class.tmplThis is the initial form that is shown to add a new + printer class.
    add-printer.tmplThis is the initial form that is shown to add a new + printer.
    admin.tmplThis is the main administration page.
    choose-device.tmplThis is the form that shows the list of available + devices.
    choose-make.tmplThis is the form that shows the list of available + manufacturers.
    choose-model.tmplThis is the form that shows the list of available + printer models/drivers.
    choose-serial.tmplThis is the form that allows the user to choose + a serial port and any options.
    choose-uri.tmplThis is the form that allows the user to enter + a device URI for network printers.
    class-added.tmplThis template shows the "class added" message.
    class-confirm.tmplThis is the template used to confirm the + deletion of a class.
    class-deleted.tmplThis template shows the "class deleted" message.
    class-jobs-header.tmplThis template shows the "jobs" header for jobs in a + class.
    class-modified.tmplThis template shows the "class modified" message.
    classes.tmplThis template shows one or more printer classes.
    classes-header.tmplThis template shows the "showing N of M classes" header in + the class list.
    edit-config.tmplThis is the cupsd.conf editor page.
    error.tmplThis template displays a generic error message.
    error-op.tmplThis is the "unknown operation" error page.
    header.tmplThis template is used as the standard header on all dynamic + content.
    help-header.tmplThis is the top part of the help page.
    help-printable.tmplThis is the standard page header for the printable + version of help files.
    job-cancel.tmplThis template shows "job cancelled".
    job-hold.tmplThis template shows "job held".
    job-move.tmplThis template shows the move-job form.
    job-moved.tmplThis template shows "job moved".
    job-release.tmplThis template shows "job released".
    job-restart.tmplThis template shows "job reprinted".
    jobs.tmplThis template is used to list the print jobs on a server, + class, or printer.
    jobs-header.tmplThis template shows the "showing N or M jobs" header in the + jobs list.
    maintenance.tmplThis template shows "maintenance commands sent".
    modify-class.tmplThis template is used as the first form when modifying a + class.
    modify-printer.tmplThis template is used as the first form when modifying a + printer.
    option-boolean.tmplThis template is used to select a boolean PPD option.
    option-conflict.tmplThis template shows the conflicting options.
    option-header.tmplThis template is used to start a PPD option group.
    option-pickmany.tmplThis template is used to select a multi-valued PPD option.
    option-pickone.tmplThis template is used to select a single-valued PPD option.
    option-trailer.tmplThis template is used to end a PPD option group.
    pager.tmplThis template shows the previous/next pager bar.
    printer-accept.tmplThis template shows "printer now accepting jobs".
    printer-added.tmplThis template shows "printer added".
    printer-configured.tmplThis template shows "printer configured".
    printer-confirm.tmplThis template asks the user to confirm the deletion + of a printer.
    printer-default.tmplThis template shows "default printer set".
    printer-deleted.tmplThis template shows "printer deleted".
    printer-jobs-header.tmplThis templates shows the "jobs" header for jobs on a + printer.
    printer-modified.tmplThis template shows "printer modified".
    printer-purge.tmplThis template shows "printer has been purged of all jobs".
    printer-reject.tmplThis template shows "printer now rejecting jobs".
    printer-start.tmplThis template shows "printer started".
    printer-stop.tmplThis template shows "printer stopped".
    printers.tmplThis template is used to list information on one or more + printers.
    printers-header.tmplThis template shows the "showing printer N of M" header in + the printers list.
    restart.tmplThis template shows "server restarting".
    samba-export.tmplThis template shows the export printers to Samba form.
    samba-exported.tmplThis template shows "printers exported to Samba".
    search.tmplThis template shows the search form.
    set-printer-options-header.tmplThis template shows the first part of the set printer options + form.
    set-printer-options-trailer.tmplThis template shows the last part of the set printer options + form.
    test-page.tmplThis template shows "test page printed".
    trailer.tmplThis template is used as the standard trailer on all dynamic + content.
    users.tmplThis template shows the set allowed users form.
    + +

    Inserting Attributes and Values

    + +

    Template files consist of HTML with variable substitutions for +named inside curley braces "{name}". Variable names are generally +the IPP attribute names with the hyphen ("-") replaced by the +underscore ("_") character. For example, the +job-printer-uri attribute is renamed to +job_printer_uri.

    + +

    Curley braces ("{" and "}") to indicate substitutions, and the +backslash ("\") character for quoting. To insert any of these +special characters as-is you need to use the HTML +&name; mechanism or prefix each special +character with the backslash ("\".)

    + +

    You substitute the value of a variable using +{NAME} in your template file. If the variable is +undefined then the {NAME} string is output +as-is.

    + +

    To substitute an empty string if the variable is undefined, +use {?NAME} instead.

    + +

    Array Substitutions

    + +

    The number of array elements can be inserted using +{#NAME}. If the array is undefined then 0 is output. +The current array element (starting at 1) is inserted with +{#}.

    + +

    Arrays are handled using {[NAME] at the beginning +of a section and } at the end. The information +between the closing bracket ("]") and closing brace ("}") is +repeated for as many elements as are in the named array. For +example, the following template will display a list of each job +in the job_id array:

    + +
    +<TABLE>
    +<TR>
    +	<TH>Job ID</TH>
    +	<TH>Destination</TH>
    +	<TH>Title</TH>
    +</TR>
    +
    +{[job_id]
    +<TR>
    +	<TD>{?job_id}</TD>
    +	<TD>{?job_printer_name}</TD>
    +	<TD>{?job_name}</TD>
    +</TR>
    +}
    +</TABLE>
    +
    + +

    Arrays can be nested, however all elements within the curley +braces ("{" and "}") are indexed using the innermost array.

    + +

    Conditional Tests

    + +

    Templates can also test variables against specific values and +conditionally include text in the template. The format is:

    + +
    +{variable?true:false}
    +{variable=value?true:false}
    +{variable!value?true:false}
    +{variable<value?true:false}
    +{variable>value?true:false}
    +
    + +

    where true is the text that is included if the +condition is true and false is the text that is +included if the condition is false. A value of # is +replaced with the current element number (starting at 1.) The +character after the variable name specifies the condition to +test. Table 3 shows the available test conditions.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 3: Template Substitution Conditions
    CharCondition
    ?True if variable exists.
    =True if variable is equal to value.
    !True if variable is not equal to value.
    <True if variable is less than value.
    >True if variable is greater than value.
    + +

    CGI Programs

    + +

    CUPS uses five CGI programs to manage the dynamic web +interfaces:

    + +
      + +
    • admin.cgi
    • +
    • classes.cgi
    • +
    • help.cgi
    • +
    • jobs.cgi
    • +
    • printers.cgi
    • + +
    + +

    Each CGI program accepts standard form variables such as +OP for the operation to perform, +PRINTER_NAME for the printer or class name to +operate on, QUERY for any search words, +FIRST for the first class, job, or printer to +display, and ORDER to control the order that +classes, jobs, or printers are displayed.

    + +

    In addition, the classes.cgi, +jobs.cgi, and printers.cgi programs +support a WHICH_JOBS variable to control which jobs +are displayed. Table 4 lists the supported values.

    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 4: WHICH_JOBS Values
    OP ValueDescription
    allShow all jobs
    completedShow completed jobs
    not-completedShow active jobs
    + +

    admin.cgi

    + +

    The admin.cgi program handles all of the printer +and class administration functions and is run for all direct +accesses to the /admin resource. For most operations +it uses the PRINTER_NAME and OP form +variables to specify the action requested. Table 5 shows the +supported OP values.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 5: admin.cgi OP Values
    OP ValueDescription
    accept-jobsAccepts jobs on the named destination.
    add-classAdds a new printer class.
    add-printerAdds a new printer.
    config-serverConfigures the server.
    delete-classDeletes a printer class. The form variable CONFIRM + may be set to any value to bypass the confirmation page.
    delete-printerDeletes a printer. The form variable CONFIRM + may be set to any value to bypass the confirmation page.
    export-sambaExports printers to Samba.
    modify-classModifies a printer class.
    modify-printerModifies a printer.
    purge-jobsPurges all jobs on the named destination.
    redirectRedirects the web browser to the location referenced by + the URL form variable.
    reject-jobsRejects new jobs on the named destination.
    set-allowed-usersSets the allowed users for a destination.
    set-as-defaultSets the default destination.
    set-printer-optionsSets the default options for a printer.
    set-sharingSets the printer-is-shared attribute for a destination.
    start-classStarts the named class.
    start-printerStarts the named printer.
    stop-classStops the named class.
    stop-printerStops the named printer.
    + +

    classes.cgi

    + +

    The classes.cgi program is responsible for +listing class information, including jobs destined for that +class. It is for all direct accesses to the /classes +resource and supports the optional form variables OP +and WHICH_JOBS. If no form variables are supplied +then the CGI lists all or a specific class and the active jobs on +each class. Table 6 shows the supported OP +values.

    + +
    + + + + + + + + + + + + + + + + + +
    Table 6: classes.cgi OP Values
    OP ValueDescription
    move-jobsMoves the jobs on this class to another destination.
    print-test-pagePrints the standard PostScript test page.
    + + +

    help.cgi

    + +

    The help.cgi program handles all of the on-line +help functions and is run for all direct accesses to the +/help resource.

    + + +

    jobs.cgi

    + +

    The jobs.cgi program handles all of the job +functions and is run for all direct accesses to the +/jobs resource. For most operations it uses the +JOB_ID, OP, and WHICH_JOBS +form variables to specify the action requested. Table 7 shows the +supported OP values.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 7: jobs.cgi OP Values
    OP ValueDescription
    cancel-jobCancels a job.
    hold-jobHolds a job indefinitely.
    move-jobMoves a job to another destination.
    release-jobReleases a job for printing.
    restart-jobRestarts/reprints a stopped, cancelled, completed, or aborted + print job.
    + + +

    printers.cgi

    + +

    The printers.cgi program is responsible for +listing printer information, including jobs destined for that +printer. It is for all direct accesses to the +/printers resource and supports the optional form +variables OP and WHICH_JOBS. If no form +variables are supplied then the CGI lists all printers or a +specific printer and the active jobs on that printer. Table 8 +shows the supported OP values.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 8: printers.cgi OP Values
    OP ValueDescription
    clean-print-headsClean the print heads.
    move-jobsMove all jobs to a different destination.
    print-self-test-pagePrint a printer self-test page.
    print-test-pagePrint a PostScript test page.
    + + + diff --git a/doc/idd.html b/doc/idd.html deleted file mode 100644 index dc52454ee..000000000 --- a/doc/idd.html +++ /dev/null @@ -1,1083 +0,0 @@ - - - -CUPS Interface Design Description - - - - - - - -

    -

    CUPS Interface Design Description


    -CUPS-IDD-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Internal Interfaces - -4 External Interfaces - -5 Directories -
    -
    A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This interface design description document provides detailed file - formats, message formats, and program conventions for the Common UNIX - Printing System ("CUPS") Version 1.2.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This interface design description document is organized into the - following sections:

    -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Internal Interfaces
    • -
    • 4 - External Interfaces
    • -
    • 5 - Directories
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Internal Interfaces

    -

    3.1 Character Set Files

    -

    The character set files define a mapping between 8-bit characters and - the Unicode character set, or between Unicode and printer fonts. They - are named using the IETF charset names defined in RFCnnnn. These files - are ASCII text, the content of which is described below. Comments can - be included by using the # character in the first column of a - line.

    -

    3.1.1 8-Bit Character Set Files

    -

    8-bit character set files start with a line reading:

    -
      -
      -charset 8bit
      -
      -
    -

    Following this are lines that define the font information:

    -
      -
      -first last direction width normal bold italic bold-italic
      -
      -
    -

    First and last are the first and last glyphs in - the font mapping that correspond to that font; a maximum of 256 - characters can be mapped within each group, with a maximum of 256 - mappings (this is a PostScript limitation.) The glyph values are - hexadecimal.

    -

    Direction is the string "ltor", "rtol", or "rtola" - indicating left-to-right, right-to-left, or right-to-left Arabic text.

    -

    Width is the string "single" or "double"; double means - that the glyphs are twice as wide as ASCII characters in the Courier - typeface.

    -

    Normal, bold, italic, and bold-italic are the - typefaces to use for each presentation. If characters are only - available in a single style then only one typeface should be listed - (e.g. "Symbol".) Each font that is listed will be used (and downloaded - if needed) when printing.

    -

    The remaining lines define a character to Unicode glyph mapping for - the character set. The character and glyph values are hexadecimal:

    -
      -
      -xx yyyy
      -
      -
    -

    3.1.2 Unicode Character Set Files

    -

    Unicode character set files start with a line reading:

    -
      -
      -charset encoding
      -
      -
    -

    Encoding is the encoding to use for the text; currently - only the string "utf8" is supported.

    -

    Following this are lines defining the font information:

    -
      -
      -first last direction width normal bold italic bold-italic
      -
      -
    -

    First and last are the first and last glyphs in - the font mapping that correspond to that font; a maximum of 256 - characters can be mapped within each group, with a maximum of 256 - mappings (this is a PostScript limitation.) The glyph values are - hexadecimal.

    -

    Direction is the string "ltor", "rtol", or "rtola" - indicating left-to-right, right-to-left, or right-to-left Arabic text.

    -

    Width is the string "single" or "double"; double means - that the glyphs are twice as wide as ASCII characters in the Courier - typeface.

    -

    Normal, bold, italic, and bold-italic are the - typefaces to use for each presentation. If characters are only - available in a single style then only one typeface should be listed - (e.g. "Symbol".) Each font that is listed will be used (and downloaded - if needed) when printing.

    -

    3.2 Language Files

    -

    The language files define the default character set and a collection - of text messages in that language. They are named by prefixing the - string "cups_" to the front of the language specifier (e.g. "cups_en", - "cups_fr", etc.) Each file consists of two or more lines of ASCII text.

    -

    The first line identifies the character set to be used for the - messages. The currently recognized values are:

    -
      -
    • iso-8859-1
    • -
    • iso-8859-2
    • -
    • iso-8859-3
    • -
    • iso-8859-4
    • -
    • iso-8859-5
    • -
    • iso-8859-6
    • -
    • iso-8859-7
    • -
    • iso-8859-8
    • -
    • iso-8859-9
    • -
    • iso-8859-10
    • -
    • iso-8859-13
    • -
    • iso-8859-14
    • -
    • iso-8859-15
    • -
    • us-ascii
    • -
    • utf-8
    • -
    • windows-874
    • -
    • windows-1250
    • -
    • windows-1251
    • -
    • windows-1252
    • -
    • windows-1253
    • -
    • windows-1254
    • -
    • windows-1255
    • -
    • windows-1256
    • -
    • windows-1257
    • -
    • windows-1258
    • -
    • koi8-r
    • -
    • koi8-u
    • -
    -

    The second and succeeding lines define text messages. If the message - text is preceded by a number, then the current message number is - updated and the text after the number is used.

    -

    3.3 MIME Files

    -

    CUPS uses two MIME files in its standard configuration.

    -

    3.3.1 mime.types

    -

    The mime.types file defines the recognized file types and consists of - 1 or more lines of ASCII text. Comment lines start with the pound ("#") - character. The backslash ("\") character can be used at the end of a - line to continue that line to the next.

    -

    Each non-blank line starts with a MIME type identifier ("super/type") - as registered with the IANA. All text following the MIME type is - treated as a series of type recognition rules:

    -
      -
      -mime-type := super "/" type { SP rule }*
      -super := { "a-z" | "A-Z" }*
      -type := { "a-z" | "A-Z" | "-" | "." | "0-9" }*
      -rule := { extension | match | operator | "(" rule ")" }*
      -extension := { "a-z" | "A-Z" | "0-9" }*
      -match := "match(" regexp ")" |
      -         "ascii(" offset "," length ")" |
      -	 "printable(" offset "," length ")" |
      -	 "string(" offset "," string ")" |
      -	 "contains(" offset "," length "," string ")" |
      -	 "char(" offset "," value ")" |
      -	 "short(" offset "," value ")" |
      -	 "int(" offset "," value ")" |
      -	 "locale(" string ")"
      -operator := "+" |	[ logical AND ]
      -            "," | SP    [ logical OR ]
      -	    "!"         [ unary NOT ]
      -
      -
    -

    The int and short rules match look for - integers in network byte order (a.k.a. big-endian) with the - most-significant byte first.

    -

    3.3.2 mime.convs

    -

    The mime.types file defines the recognized file filters and consists - of 1 or more lines of ASCII text. Comment lines start with the pound - ("#") character.

    -

    Each non-blank line starts with two MIME type identifiers - ("super/type") representing the source and destination types. Following - the MIME types are a cost value (0 to 100) and the filter program to - use. If the filter program is not specified using the full path then it - must reside in the CUPS filter directory:

    -
      -
      -super/type SP super/type2 SP cost SP program
      -
      -
    -

    3.4 Option Files

    -

    CUPS maintains user-defined printer and option files for each printer - and user on the system. The printers and options defined in the system - option file (/etc/cups/lpoptions) are loaded first, - followed by the user option file ($HOME/.lpoptions). - Options in the user file replace those defined in the system file for - the same destination. Each line in the files can be one of the - following:

    -
      -
      -Dest name option=value option=value ... option=value
      -Dest name/instance option=value option=value ... option=value
      -Default name option=value option=value ... option=value
      -Default name/instance option=value option=value ... option=value
      -
      -
    -

    The line beginning with "Default" indicates the default destination - for print jobs; a default line in the user option file overrides the - default defined in the system option file.

    -

    Name is the name of a printer known to the local server.

    -

    Instance can be any string of letters, numbers, and the - underscore up to 127 characters in length.

    -

    The remainder of the line contains a list of space-separated options - and their values.

    -

    3.5 PostScript Printer Description Files

    -

    PostScript Printer Description ("PPD") files describe the - capabilities of each printer and are used by CUPS to support - printer-specific features and intelligent filtering.

    -

    3.5.1 PPD Specification

    -

    The PPD file format is described in - Adobe TechNote #5003: PostScript Printer Description File Format - Specification Version 4.3.

    -

    3.5.2 CUPS Extensions to PPD Files

    -

    CUPS adds several new attributes that are described below.

    -

    3.5.2.1 cupsFilter

    -

    This string attribute provides a conversion rule of the form:

    -
      -
      -source/type cost program
      -
      -
    -

    The destination type is assumed to the printer's type. If a printer - supports the source type directly the special filter program "-" may be - specified.

    -

    3.5.2.2 cupsManualCopies

    -

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

    -

    3.5.2.3 cupsModelNumber

    -

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

    -

    3.5.2.4 cupsProfile

    -

    This string attribute specifies a color profile of the form:

    -
      -
      -resolution/type density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22
      -
      -
    -

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

    -

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

    -
      -
      -f(x) = density * xgamma
      -
      -
    -

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

    -

    3.5.2.5 cupsVersion

    -

    This required attribute describes which version of the CUPS IDD was - used for the PPD file extensions. Currently it must be the string - "1.0", "1.1", or "1.2".

    -

    3.6 Scheduler Configuration Files

    -

    The scheduler reads three configuration files that define the - available printers, classes, and services:

    -
    -
    classes.conf
    -
    This file defines all of the printer classes known to the system.
    -
    cupsd.conf
    -
    This file defines the files, directories, passwords, etc. used by - the scheduler.
    -
    printers.conf
    -
    This file defines all of the printers known to the system.
    -
    -

    3.6.1 classes.conf

    -

    The classes.conf file consists of 1 or more lines of ASCII text. - Comment lines start with the pound ("#") character.

    -

    Each non-blank line starts with the name of a configuration directive - followed by its value. The following directives are understood: -

    - - - - - - - - - - - - - - -
    DirectiveDescription
    <Class name> -
    </Class>
    Surrounds a class definition.
    <DefaultClass name> -
    </Class>
    Surrounds a class definition for the default - destination.
    AcceptingSpecifies whether the class is accepting new - jobs. May be the names "Yes" or "No".
    AllowUsersSpecifies a list of users that are allowed to - access the class.
    BannerStartSpecifies the banner that is printed before - other files in a job.
    BannerEndSpecifies the banner that is printed after - other files in a job.
    DenyUsersSpecifies a list of users that are not allowed - to access the class.
    InfoA textual description of the class.
    LocationA textual location of the class.
    PrinterSpecifies a printer that is a member of the - class.
    StateSpecifies the initial state of the class; can be - "Idle" or "Stopped".
    StateMessageSpecifies a textual message for the current - class state.
    -
    -

    -

    3.6.2 cupsd.conf

    -

    The cupsd.conf file consists of 1 or more lines of ASCII text. - Comment lines start with the pound ("#") character.

    -

    Each non-blank line starts with the name of a configuration directive - followed by its value. The following directives are understood: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DirectiveDefaultDescription
    AccessLogaccess_logSpecifies the location of - the access log file. The special name "syslog" can be used to send - access log information to the system log.
    Allow-Allows connections from the specified - host, network, or domain.
    AuthClass-Specifies what level of - authentication is required; may be "User", "System", or "Group".
    AuthTypeNoneSpecifies the type of - authentication to perform; may be "None", "Basic", or "Digest".
    BrowseAddress255.255.255.255Specifies a - broadcast address to send CUPS browsing packets to.
    BrowseAllow-Specifies hosts or addresses from - which browsing information should be used.
    BrowseDeny-Specifies hosts or addresses from - which browsing information should not be used.
    BrowseInterval30Specifies the number of - seconds between browsing updates. A browse interval of 0 seconds - disables outgoing packets.
    BrowseOrderAllow,DenySpecifies the order of - BrowseAllow and BrowseDeny directive processing; can be "Deny,Allow" to - implicitly deny hosts unless they are allowed by a BrowseAllow line, or - "Allow,Deny" to implicitly allow hosts unless they are denied by a - BrowseDeny line.
    BrowsePoll-Specifies a server to poll for - available printers and classes.
    BrowsePort631Specifies the UDP port number to - use for browse packets.
    BrowseRelay-Specifies a source and destination - address for relaying browser information from one subnet to another.
    BrowseShortNamesyesSpecifies whether or not to - provide short names (without the "@server" part) for remote printers.
    BrowseTimeout300Specifies the number of - seconds to wait until remote destinations are removed from the local - destination list.
    BrowsingOnSpecifies whether or not printer and - class browsing is enabled; can be "On" or "Off".
    DataDir/usr/share/cupsSpecifies the directory - where CUPS data files are stored.
    DefaultCharsetiso-8859-1Specifies the default - character set.
    DefaultLanguagecurrent localeSpecifies the - default language.
    Deny-Refuses connections from the specified - host, network, or domain.
    DocumentRoot/usr/share/doc/cupsSpecifies the - document data root directory.
    ErrorLogerror_logSpecifies the error log file - location. The special name "syslog" can be used to send error log - information to the system log.
    Grouproot, sys, systemSpecifies the group name - or ID that is used when running external programs.
    HostNameLookupsOffSpecifies whether or not to - perform reverse IP address lookups to get the actual hostname; may be - "On" or "Off". Hostname lookups can significantly degrade the - performance of the CUPS server if one or more DNS servers is not - functioning properly.
    ImplicitClassesOnSpecifies whether or not to - automatically create printer classes when more than one printer or - class of the same name is detected on the network; may be "On" or - "Off".
    KeepAliveOnSpecifies whether or not to use the - HTTP Keep-Alive feature; may be "On" or "Off".
    KeepAliveTimeout30Specifies the amount of time - to keep the HTTP connection alive before closing it.
    <Location path> -
    </Location>
    -Specifies a location to restrict - access to.
    LogLevelinfoControls the amount of information - that is logged in the error log file. Can be one of "debug", "info", - "warn", "error", or "none", in decreasing order or verbosity.
    MaxClients100Specifies the maximum number of - simultaneous active clients. This value is internally limited to 1/3 of - the total number of available file descriptors.
    MaxLogSize0Specifies the maximum size of the - access, error, and page log files in bytes. If set to 0 then no maximum - size is set. Log files are rotated automatically when this size is - exceeded.
    MaxRequestSize0Specifies the maximum size of - HTTP requests in bytes. If set to 0 then there is no maximum.
    OrderAllow,DenySpecifies the order of Allow - and Deny directive processing; can be "Deny,Allow" to implicitly deny - hosts unless they are allowed by an Allow line, or "Allow,Deny" to - implicitly allow hosts unless they are denied by a Deny line.
    PageLogpage_logSpecifies the location of the - page log file. The special name "syslog" can be used to send page log - information to the system log.
    Port631Specifies a port number to listen to - for HTTP connections.
    Printcap/etc/printcapSpecifies the location of - a Berkeley printcap file to update with a list of current printers and - classes. If no filename is supplied then this automatic generation is - disabled.
    RequestRoot/var/spool/cupsSpecifies the - location of request files.
    RIPCache8mSpecifies the size of the memory - cache in bytes that is used by RIP filters.
    ServerAdminroot@ServerNameSpecifies the person - to contact with problems.
    ServerNamehostnameSpecifies the hostname that - is supplied to HTTP clients. This is also used to determine the default - CUPS server for the CUPS IPP client applications.
    ServerRoot/etc/cupsSpecifies the root - directory for server configuration files.
    SystemGrouproot, sys, systemSpecifies the - group name used for System class authentication.
    TempDir/var/tmpSpecifies the temporary - directory to use.
    Timeout300The timeout in seconds before client - connections are closed in the middle of a request.
    UserlpSpecifies the user that is used when - running external programs.
    -
    -

    -

    3.6.3 printers.conf

    -

    The printers.conf file consists of 1 or more lines of ASCII text. - Comment lines start with the pound ("#") character.

    -

    Each non-blank line starts with the name of a configuration directive - followed by its value. The following directives are understood: -

    - - - - - - - - - - - - - - -
    DirectiveDescription
    AcceptingSpecifies whether the printer is accepting new - jobs. May be the names "Yes" or "No".
    <DefaultPrinter name> -
    </Printer>
    Surrounds the printer definition for a default - destination.
    AllowUsersSpecifies a list of users that are allowed to - access the printer.
    BannerStartSpecifies the banner that is printed before - other files in a job.
    BannerEndSpecifies the banner that is printed after - other files in a job.
    DenyUsersSpecifies a list of users that are not allowed - to access the printer.
    DeviceURISpecifies the device-uri attribute for the - printer.
    InfoA textual description of the printer.
    LocationA textual location of the printer.
    <Printer name> -
    </Printer>
    Surrounds the printer definition.
    StateSpecifies the initial state of the printer; can be - "Idle" or "Stopped".
    StateMessageSpecifies a textual message for the current - printer state.
    -
    -

    -

    4 External Interfaces

    -

    4.1 AppSocket Protocol

    -

    The AppSocket protocol is an 8-bit clean TCP/IP socket connection. - The default IP service port is 9100. The URI method name is "socket".

    -

    The AppSocket protocol is used by the Hewlett Packard JetDirect - network interfaces and print servers, as well as many other vendors' - products. See the CUPS Software Administrators Manual for a list of - supported products.

    -

    4.2 CUPS Browsing Protocol

    -

    The CUPS Browsing Protocol is a UDP/IP-based broadcast service. By - default this service operates on IP service port 631.

    -

    Each broadcast packet describes the state of a single printer or - class and is an ASCII text string of up to 1450 bytes ending with a - newline (0x0a). The string is formatted as follows:

    -
      -
      -type SP state SP uri SP "location" SP "info" SP "make-and-model" NL
      -
      -
    -

    State, uri, location, info, and make-and-model, - correspond to the IPP printer-state, -printer-uri-supported, printer-location, -printer-info, and printer-make-and-model attributes.

    -

    Type is a hexadecimal number string representing - capability/type bits: -

    - - - - - - - - - - - - - - - - - - -
    BitDescription
    00 = printer -
    1 = class
    10 = local -
    1 = remote -
    (always 1)
    21 = can print B
    31 = can print color
    41 = can duplex
    51 = can staple
    61 = can do fast copies
    71 = can do fast collating
    81 = can punch holes
    91 = can cover
    101 = can bind
    111 = can sort
    121 = can print up to 9x14 inches
    131 = can print up to 18x24 inches
    141 = can print up to 36x48 inches
    151 = can print variable sizes
    -
    -

    -

    4.3 CUPS Form File

    -

    CUPS Form files are XML files used by the CUPS formtops - filter to produce dynamic banner pages and support preprinted forms.

    -

    The MIME type for CUPS Form files is application/vnd.cups-form -.

    -

    4.3.1 CUPS Form DTD

    -

    The following DTD describes the available elements and attributes in - a CUPS Form file: -

    - - -
    -
    -<!ENTITY % Angle "CDATA" -- angle in degrees -->
    -
    -<!ENTITY % Color "CDATA" -- a color using sRGB: #RRGGBB as Hex values -->
    -
    -<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
    -
    -<!ENTITY % Lengths "CDATA" -- comma-separated Length values -->
    -
    -<!ENTITY % Text "CDATA">
    -
    -<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
    -
    -<!ENTITY % preformatted "PRE">
    -
    -<!ENTITY % i18n
    - "lang        %LanguageCode; #IMPLIED  -- language code --
    -  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
    -  >
    -
    -<!ENTITY % attrs "%i18n;">
    -
    -<!ENTITY % fontstyle
    - "B | FONT | I | TT">
    -
    -<!ENTITY % graphics
    - "BOX | RECT | LINE | POLY | ARC | PIE | TEXT">
    -
    -<!ENTITY % insert
    - "IMG | VAR">
    -
    -<!-- %inline; covers inline or "text-level" elements -->
    -<!ENTITY % inline "#PCDATA | %fontstyle; | %graphics; | %insert;">
    -
    -<!ELEMENT (%fontstyle;) - - (%inline;)*>
    -<!ATTLIST (%fontstyle;)
    -  %attrs;                              -- %i18n --
    -  >
    -
    -<!ELEMENT BR - O EMPTY                 -- forced line break -->
    -<!ATTLIST BR
    -  %attrs;                              -- %i18n --
    -  >
    -
    -<!ENTITY % block
    -     "P | %heading; | %preformatted;">
    -
    -<!ENTITY % flow "%block; | %inline;">
    -
    -<!ELEMENT PAGE O O (%flow;)+           -- document body -->
    -<!ATTLIST PAGE
    -  %attrs;                              -- %i18n --
    -  align       (left|center|right) #IMPLIED -- horizontal alignment --
    -  valign      (top|middle|center|bottom) #IMPLIED -- vertical alignment --
    -  >
    -
    -<!ELEMENT P - O (%inline;)*            -- paragraph -->
    -<!ATTLIST P
    -  %attrs;                              -- %i18n --
    -  align       (left|center|right) #IMPLIED -- horizontal alignment --
    -  >
    -
    -<!ELEMENT (%heading;)  - - (%inline;)* -- heading -->
    -<!ATTLIST (%heading;)
    -  %attrs;                              -- %i18n --
    -  align       (left|center|right) #IMPLIED -- horizontal alignment --
    -  >
    -
    -<!ELEMENT PRE - - (%inline;)*          -- preformatted text -->
    -<!ATTLIST PRE
    -  %attrs;                              -- %i18n --
    -  align       (left|center|right) #IMPLIED -- horizontal alignment --
    -  >
    -
    -<!ELEMENT BOX - O EMPTY                -- unfilled box -->
    -<!ATTLIST BOX
    -  color       %Color;        #IMPLIED  -- override color --
    -  height      %Length;       #REQUIRED -- height of box --
    -  thickness   %Length;       #IMPLIED  -- override line thickness --
    -  width       %Length;       #REQUIRED -- width of box --
    -  x           %Length;       #REQUIRED -- horizontal position --
    -  y           %Length;       #REQUIRED -- vertical position --
    -  >
    -
    -<!ELEMENT RECT - O EMPTY               -- filled box -->
    -<!ATTLIST RECT
    -  color       %Color;        #IMPLIED  -- override color --
    -  height      %Length;       #REQUIRED -- height of box --
    -  width       %Length;       #REQUIRED -- width of box --
    -  x           %Length;       #REQUIRED -- horizontal position --
    -  y           %Length;       #REQUIRED -- vertical position --
    -  >
    -
    -<!ELEMENT LINE - O EMPTY               -- polyline -->
    -<!ATTLIST LINE
    -  color       %Color;        #IMPLIED  -- override color --
    -  thickness   %Length;       #IMPLIED  -- override line thickness --
    -  x           %Lengths;      #REQUIRED -- horizontal positions --
    -  y           %Lengths;      #REQUIRED -- vertical positions --
    -  >
    -
    -<!ELEMENT POLY - O EMPTY               -- polygon (filled) -->
    -<!ATTLIST POLY
    -  color       %Color;        #IMPLIED  -- override color --
    -  x           %Lengths;      #REQUIRED -- horizontal positions --
    -  y           %Lengths;      #REQUIRED -- vertical positions --
    -  >
    -
    -<!ELEMENT ARC - O EMPTY                -- unfilled arc -->
    -<!ATTLIST ARC
    -  color       %Color;        #IMPLIED  -- override color --
    -  end         %Angle;        #IMPLIED  -- override end angle --
    -  height      %Length;       #REQUIRED -- height of arc --
    -  start       %Angle;        #IMPLIED  -- override start angle --
    -  thickness   %Length;       #IMPLIED  -- override line thickness --
    -  width       %Length;       #REQUIRED -- width of arc --
    -  x           %Length;       #REQUIRED -- horizontal position --
    -  y           %Length;       #REQUIRED -- vertical position --
    -  >
    -
    -<!ELEMENT PIE - O EMPTY                -- filled arc -->
    -<!ATTLIST PIE
    -  color       %Color;        #IMPLIED  -- override color --
    -  end         %Angle;        #IMPLIED  -- override end angle --
    -  height      %Length;       #REQUIRED -- height of arc --
    -  start       %Angle;        #IMPLIED  -- override start angle --
    -  width       %Length;       #REQUIRED -- width of arc --
    -  x           %Length;       #REQUIRED -- horizontal position --
    -  y           %Length;       #REQUIRED -- vertical position --
    -  >
    -
    -<!ELEMENT TEXT - - (%flow;)*           -- text box -->
    -<!ATTLIST RECT
    -  align       (left|center|right) #IMPLIED -- horizontal alignment --
    -  height      %Length;       #REQUIRED -- height of box --
    -  valign      (top|middle|center|bottom) #IMPLIED -- vertical alignment --
    -  width       %Length;       #REQUIRED -- width of box --
    -  x           %Length;       #REQUIRED -- horizontal position --
    -  y           %Length;       #REQUIRED -- vertical position --
    -  >
    -
    -
    -<!ELEMENT IMG - O EMPTY                -- Embedded image -->
    -<!ATTLIST IMG
    -  %attrs;                              -- %coreattrs, %i18n, %events --
    -  src         %URI;          #REQUIRED -- URI of image to embed --
    -  height      %Length;       #IMPLIED  -- override height --
    -  width       %Length;       #IMPLIED  -- override width --
    -  >
    -
    -<!ELEMENT HEAD O O (DEFVAR)*           -- document head -->
    -<!ATTLIST HEAD
    -  %i18n;                               -- lang, dir --
    -  >
    -
    -<!ELEMENT DEFVAR - O EMPTY             -- variable definition -->
    -<!ATTLIST DEFVAR
    -  name        CDATA          #REQUIRED -- name
    -  value       CDATA          #REQUIRED -- value
    -  >
    -
    -
    -<!ENTITY % html.content "HEAD, PAGE">
    -
    -<!ELEMENT CUPSFORM - - (HEAD) (PAGE)+  -- document root element -->
    -<!ATTLIST CUPSFORM
    -  %i18n;                               -- lang, dir --
    -  >
    -
    -
    -
    -

    -

    4.4 CUPS PostScript File

    -

    CUPS PostScript files are device-dependent Adobe PostScript program - files. The PostScript language is described in the - Adobe PostScript Language Reference Manual, Third Edition.

    -

    The MIME type for CUPS PostScript files is -application/vnd.cups-postscript.

    -

    4.5 CUPS Raster File

    -

    CUPS raster files are device-dependent raster image files that - contain a PostScript page device dictionary and device-dependent raster - imagery for each page in the document. These files are used to transfer - raster data from the PostScript and image file RIPs to device-dependent - filters that convert the raster data to a printable format.

    -

    A raster file begins with a four byte synchronization word: - 0x52615374 ("RaSt") for big-endian architectures and 0x74536152 - ("tSaR") for little-endian architectures. The writer of the raster file - will use the native word order, and the reader is responsible for - detecting a reversed word order file and swapping bytes as needed. The - CUPS Image Library raster functions perform this function - automatically.

    -

    Following the synchronization word are a series of raster pages. Each - page starts with a page device dictionary header and is followed - immediately by the raster data for that page. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BytesDescriptionValues
    0-63MediaClassNul-terminated ASCII string
    64-127MediaColorNul-terminated ASCII string
    128-191MediaTypeNul-terminated ASCII string
    192-255OutputTypeNul-terminated ASCII string
    256-259AdvanceDistance0 to 232 - 1 - points
    260-263AdvanceMedia0 = Never advance roll -
    1 = Advance roll after file -
    2 = Advance roll after job -
    3 = Advance roll after set -
    4 = Advance roll after page
    264-267Collate0 = do not collate copies -
    1 = collate copies
    268-271CutMedia0 = Never cut media -
    1 = Cut roll after file -
    2 = Cut roll after job -
    3 = Cut roll after set -
    4 = Cut roll after page
    272-275Duplex0 = Print single-sided -
    1 = Print double-sided
    276-283HWResolutionHorizontal and vertical - resolution in dots-per-inch.
    284-299ImagingBoundingBoxFour integers giving - the left, bottom, right, and top positions of the page bounding box in - points
    300-303InsertSheet0 = Do not insert separator - sheets -
    1 = Insert separator sheets
    304-307Jog0 = Do no jog pages -
    1 = Jog pages after file -
    2 = Jog pages after job -
    3 = Jog pages after set
    308-311LeadingEdge0 = Top edge is first -
    1 = Right edge is first -
    2 = Bottom edge is first -
    3 = Left edge is first
    312-319MarginsLeft and bottom origin of image - in points
    320-323ManualFeed0 = Do not manually feed - media -
    1 = Manually feed media
    324-327MediaPositionInput slot position from 0 - to N
    328-331MediaWeightMedia weight in grams per - meter squared
    332-335MirrorPrint0 = Do not mirror prints -
    1 = Mirror prints
    336-339NegativePrint0 = Do not invert prints -
    1 = Invert prints
    340-343NumCopies1 to 232 - 1
    344-347Orientation0 = Do not rotate page -
    1 = Rotate page counter-clockwise -
    2 = Turn page upside down -
    3 = Rotate page clockwise
    348-351OutputFaceUp0 = Output face down -
    1 = Output face up
    352-359PageSizeWidth and length in points
    360-363Separations0 = Print composite image -
    1 = Print color separations
    364-367TraySwitch0 = Do not change trays if - selected tray is empty -
    1 = Change trays if selected tray is empty
    368-371Tumble0 = Do not rotate even pages when - duplexing -
    1 = Rotate even pages when duplexing
    372-375cupsWidthWidth of page image in pixels
    376-379cupsHeightHeight of page image in - pixels
    380-383cupsMediaTypeDriver-specific 0 to 2 -32 - 1
    384-387cupsBitsPerColor1, 2, 4, 8 bits
    388-391cupsBitsPerPixel1 to 32 bits
    392-395cupsBytesPerLine1 to 232 - 1 - bytes
    396-399cupsColorOrder0 = chunky pixels (CMYK - CMYK CMYK) -
    1 = banded pixels (CCC MMM YYY KKK) -
    2 = planar pixels (CCC... MMM... YYY... KKK...)
    400-403cupsColorSpace0 = white -
    1 = RGB -
    2 = RGBA -
    3 = black -
    4 = CMY -
    5 = YMC -
    6 = CMYK -
    7 = YMCK -
    8 = KCMY -
    9 = KCMYcm
    404-407cupsCompressionDriver-specific 0 to 2 -32 - 1
    408-411cupsRowCountDriver-specific 0 to 2 -32 - 1
    412-415cupsRowFeedDriver-specific 0 to 2 -32 - 1
    416-419cupsRowStepDriver-specific 0 to 2 -32 - 1
    -
    -

    -

    The MIME type for CUPS Raster files is -application/vnd.cups-raster.

    -

    4.6 CUPS Raw Files

    -

    Raw files are printer-dependent print files that are in a format - suitable to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The - MIME type for CUPS Raw files is application/vnd.cups-raw.

    -

    4.7 Internet Printing Protocol

    -

    The Internet Printing Protocol and the CUPS extensions to it are - described in the CUPS Implementation of IPP document.

    -

    4.8 Line Printer Daemon Protocol

    -

    The Line Printer Daemon (LPD) protocol is described by - RFC 1179: Line Printer Daemon Protocol.

    -

    The URI method name for LPD is "lpd".

    -

    4.9 Server Message Block Protocol

    -

    The Server Message Block (SMB) and related Common Internet File - System (CIFS) protocols are described at - http://anu.samba.org/cifs.

    -

    The URI method name for SMB is "smb". Support for this protocol is - provided via the SAMBA smbspool(1) program provided with - SAMBA 2.0.6 and higher.

    -

    5 Directories

    -
    -
    /etc/cups
    -
    The scheduler configuration and MIME files reside here.
    -
    /etc/cups/certs
    -
    The authentication certificates reside here.
    -
    /etc/cups/interfaces
    -
    System V interface scripts reside here.
    -
    /etc/cups/ppd
    -
    This directory contains PPD files for each printer.
    -
    /usr/bin
    -
    The cancel, lp, lpq, -lpr, lprm, and lpstat commands reside - here.
    -
    /usr/lib, /usr/lib32
    -
    The shared libraries (DSOs) reside here.
    -
    /usr/lib/cups/backend
    -
    The backend filters reside here.
    -
    /usr/lib/cups/cgi-bin
    -
    The CGI programs reside here.
    -
    /usr/lib/cups/daemon
    -
    The polling and LPD daemons reside here.
    -
    /usr/lib/cups/filter
    -
    The file filters reside here.
    -
    /usr/sbin
    -
    The accept, cupsd, lpadmin, -lpc, and reject commands reside here.
    -
    /usr/share/cups
    -
    This is the root directory of the CUPS static data.
    -
    /usr/share/cups/charsets
    -
    The character set files reside here.
    -
    /usr/share/cups/data
    -
    The filter data files reside here.
    -
    /usr/share/cups/fonts
    -
    The pstoraster font files reside here.
    -
    /usr/share/cups/model
    -
    The sample PPD files reside here.
    -
    /usr/share/cups/pstoraster
    -
    The pstoraster data files reside here.
    -
    /usr/share/doc/cups
    -
    The scheduler documentation files reside here.
    -
    /var/log/cups
    -
    The access_log, error_log, and -page_log files reside here.
    -
    /var/spool/cups
    -
    This directory contains print job files.
    -
    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/idd.pdf b/doc/idd.pdf deleted file mode 100644 index ad1fc130be9fdf498eef99dbcc28ec82cba9a498..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 395751 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 ^Wn2D0P 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 z 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 + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + Scheduler (cupsd) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Filter + Filter + Backend + PortMonitor + + + + + + + JobFiles + + Web Interface(CGI) + + + + + BerkeleyCommands + CUPSCommands + System VCommands + + + + + + + ConfigFiles + + + + + + + LogFiles + + Notifiers + EMail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LPD Support(cups-lpd) + + diff --git a/doc/images/cups-green-button.scm b/doc/images/cups-green-button.scm new file mode 100644 index 000000000..4993bdd79 --- /dev/null +++ b/doc/images/cups-green-button.scm @@ -0,0 +1,80 @@ +; CUPS Green Button +; Create a flat rounded button + +(define (script-fu-cups-green-button text text-color button-height button-color bg-color) + (let* ( + (img (car (gimp-image-new 256 256 RGB))) + (old-fg (car (gimp-palette-get-foreground))) + (old-bg (car (gimp-palette-get-background))) + (font-size (+ (/ (* 3 button-height) 5) 1)) + (dummy (gimp-palette-set-foreground text-color)) + (text-layer (car (gimp-text-fontname img -1 0 0 text 0 + TRUE font-size PIXELS + "Sans L,"))) + (text-width (car (gimp-drawable-width text-layer))) + (text-height (car (gimp-drawable-height text-layer))) + (button-width (+ text-width button-height)) + (bg-layer (car (gimp-layer-new img button-width button-height + RGBA-IMAGE "Background" 100 + NORMAL-MODE))) + ) + + ; Disable undo while we do our work... + (gimp-image-undo-disable img) + + ; Resize the image as needed... + (gimp-image-resize img button-width button-height 0 0) + (gimp-image-add-layer img bg-layer 1) + (gimp-layer-set-preserve-trans text-layer TRUE) + + ; Clear the background... + (gimp-selection-clear img) + (gimp-palette-set-background bg-color) + (gimp-edit-fill bg-layer 1) + + ; Make selections as needed for a rounded box. + (gimp-rect-select img (* 0.5 button-height) 0 + (- button-width button-height) button-height + REPLACE 0 0) + (gimp-ellipse-select img (- button-width button-height) 0 + button-height button-height ADD 1 0 0) + (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0) + + ; Fill in the background... + (gimp-palette-set-background button-color) + (gimp-edit-fill bg-layer 1) + + ; Clear the border around the button image... + (gimp-selection-invert img) + (gimp-edit-clear bg-layer) + (gimp-selection-clear img) + + ; Restore original colors... + (gimp-palette-set-foreground old-fg) + (gimp-palette-set-background old-bg) + + ; Translate the text later to center it... + (gimp-layer-translate text-layer (* 0.5 button-height) + (- (* 0.5 (- button-height text-height)) 1)) + + ; Then flatten the image... + (gimp-image-merge-visible-layers img CLIP-TO-IMAGE) + (gimp-convert-indexed img 0 0 16 0 1 "") + (gimp-image-undo-enable img) + (gimp-display-new img) + ) +) + +(script-fu-register "script-fu-cups-green-button" + "/Btns/CUPS Green Button" + "CUPS Green Button" + "Michael Sweet " + "Michael Sweet " + "2000" + "" + SF-VALUE "Text String" "\"Button\"" + SF-COLOR "Text Color" '(255 255 255) + SF-VALUE "Button Size (in pixels)" "20" + SF-COLOR "Button Color" '(0 153 0) + SF-COLOR "Background Color" '(212 212 164) +) diff --git a/doc/images/cups-red-button.scm b/doc/images/cups-red-button.scm new file mode 100644 index 000000000..e608db5f0 --- /dev/null +++ b/doc/images/cups-red-button.scm @@ -0,0 +1,80 @@ +; CUPS Red Button +; Create a flat rounded button + +(define (script-fu-cups-red-button text text-color button-height button-color bg-color) + (let* ( + (img (car (gimp-image-new 256 256 RGB))) + (old-fg (car (gimp-palette-get-foreground))) + (old-bg (car (gimp-palette-get-background))) + (font-size (+ (/ (* 3 button-height) 5) 1)) + (dummy (gimp-palette-set-foreground text-color)) + (text-layer (car (gimp-text-fontname img -1 0 0 text 0 + TRUE font-size PIXELS + "Sans L,"))) + (text-width (car (gimp-drawable-width text-layer))) + (text-height (car (gimp-drawable-height text-layer))) + (button-width (+ text-width button-height)) + (bg-layer (car (gimp-layer-new img button-width button-height + RGBA-IMAGE "Background" 100 + NORMAL-MODE))) + ) + + ; Disable undo while we do our work... + (gimp-image-undo-disable img) + + ; Resize the image as needed... + (gimp-image-resize img button-width button-height 0 0) + (gimp-image-add-layer img bg-layer 1) + (gimp-layer-set-preserve-trans text-layer TRUE) + + ; Clear the background... + (gimp-selection-clear img) + (gimp-palette-set-background bg-color) + (gimp-edit-fill bg-layer 1) + + ; Make selections as needed for a rounded box. + (gimp-rect-select img (* 0.5 button-height) 0 + (- button-width button-height) button-height + REPLACE 0 0) + (gimp-ellipse-select img (- button-width button-height) 0 + button-height button-height ADD 1 0 0) + (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0) + + ; Fill in the background... + (gimp-palette-set-background button-color) + (gimp-edit-fill bg-layer 1) + + ; Clear the border around the button image... + (gimp-selection-invert img) + (gimp-edit-clear bg-layer) + (gimp-selection-clear img) + + ; Restore original colors... + (gimp-palette-set-foreground old-fg) + (gimp-palette-set-background old-bg) + + ; Translate the text later to center it... + (gimp-layer-translate text-layer (* 0.5 button-height) + (- (* 0.5 (- button-height text-height)) 1)) + + ; Then flatten the image... + (gimp-image-merge-visible-layers img CLIP-TO-IMAGE) + (gimp-convert-indexed img 0 0 16 0 1 "") + (gimp-image-undo-enable img) + (gimp-display-new img) + ) +) + +(script-fu-register "script-fu-cups-red-button" + "/Btns/CUPS Red Button" + "CUPS Red Button" + "Michael Sweet " + "Michael Sweet " + "2000" + "" + SF-VALUE "Text String" "\"Button\"" + SF-COLOR "Text Color" '(255 255 255) + SF-VALUE "Button Size (in pixels)" "20" + SF-COLOR "Button Color" '(204 0 0) + SF-COLOR "Background Color" '(212 212 164) +) diff --git a/doc/images/cups-standard-button.scm b/doc/images/cups-standard-button.scm new file mode 100644 index 000000000..565c3221e --- /dev/null +++ b/doc/images/cups-standard-button.scm @@ -0,0 +1,80 @@ +; CUPS Standard Button +; Create a flat rounded button + +(define (script-fu-cups-standard-button text text-color button-height button-color bg-color) + (let* ( + (img (car (gimp-image-new 256 256 RGB))) + (old-fg (car (gimp-palette-get-foreground))) + (old-bg (car (gimp-palette-get-background))) + (font-size (+ (/ (* 3 button-height) 5) 1)) + (dummy (gimp-palette-set-foreground text-color)) + (text-layer (car (gimp-text-fontname img -1 0 0 text 0 + TRUE font-size PIXELS + "Sans L,"))) + (text-width (car (gimp-drawable-width text-layer))) + (text-height (car (gimp-drawable-height text-layer))) + (button-width (+ text-width button-height)) + (bg-layer (car (gimp-layer-new img button-width button-height + RGBA-IMAGE "Background" 100 + NORMAL-MODE))) + ) + + ; Disable undo while we do our work... + (gimp-image-undo-disable img) + + ; Resize the image as needed... + (gimp-image-resize img button-width button-height 0 0) + (gimp-image-add-layer img bg-layer 1) + (gimp-layer-set-preserve-trans text-layer TRUE) + + ; Clear the background... + (gimp-selection-clear img) + (gimp-palette-set-background bg-color) + (gimp-edit-fill bg-layer 1) + + ; Make selections as needed for a rounded box. + (gimp-rect-select img (* 0.5 button-height) 0 + (- button-width button-height) button-height + REPLACE 0 0) + (gimp-ellipse-select img (- button-width button-height) 0 + button-height button-height ADD 1 0 0) + (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0) + + ; Fill in the background... + (gimp-palette-set-background button-color) + (gimp-edit-fill bg-layer 1) + + ; Clear the border around the button image... + (gimp-selection-invert img) + (gimp-edit-clear bg-layer) + (gimp-selection-clear img) + + ; Restore original colors... + (gimp-palette-set-foreground old-fg) + (gimp-palette-set-background old-bg) + + ; Translate the text later to center it... + (gimp-layer-translate text-layer (* 0.5 button-height) + (- (* 0.5 (- button-height text-height)) 1)) + + ; Then flatten the image... + (gimp-image-merge-visible-layers img CLIP-TO-IMAGE) + (gimp-convert-indexed img 0 0 16 0 1 "") + (gimp-image-undo-enable img) + (gimp-display-new img) + ) +) + +(script-fu-register "script-fu-cups-standard-button" + "/Btns/CUPS Standard Button" + "CUPS Standard Button" + "Michael Sweet " + "Michael Sweet " + "2000" + "" + SF-VALUE "Text String" "\"Button\"" + SF-COLOR "Text Color" '(255 255 255) + SF-VALUE "Button Size (in pixels)" "20" + SF-COLOR "Button Color" '(102 102 51) + SF-COLOR "Background Color" '(212 212 164) +) diff --git a/doc/images/printer-idle.gif b/doc/images/printer-idle.gif index 68d990c628dedbf4326390527ef72f2e90aa9841..61e6c5d5d2c3f854b4e62da61efa2e7c43340318 100644 GIT binary patch literal 2546 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/images/printer-processing.gif b/doc/images/printer-processing.gif index a9a23f7951cfed1735c8945a78039d877d00878d..073be268739fe3ae44229f79ae0c57c3cd3bb9a4 100644 GIT binary patch literal 2737 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 r#xO%z|4`O5trir9LGSmv!_jvfB*nHg`LCU literal 805 zc-jFa1KRvYNk%w1VOjuC0P+9;f7*Yls;c$%_2A&(00940RaF200DqCcA^8LW000L7 zEC2ui09pW0073))c)HyFFv>}*wI++r^T@^^jv{DWCws3gD8=aCR3G_lbf6jnVq1aqNAh{ODr@msT`{UV~RXa zb|9cdbtSI`sH!zhz8kV)B833O#aR`3i#xZty1;+Jjb~JacFD}j%SVjU-XDP2+p*dK zeBV&f;AMi7hp^*EQtE!0h@tlH+VmOukfogbDLI z6u`|b))n)fk!G4+fU%3!vgav2879Rp@fd}_GxTc(nAWJ z9e*AbdbDXnrc(x{OOD=pkAS@z@ztpvHjzaIt{&cubs z;yQA&y$zTrab7GZzJxB>Y%X@P*KC&P^ZNDKs^mw4WnkgPw59do|` ztnAKQ#LZWp6HV1LR8dE*F%mz^4M-q^n;i&Mf~G9fl!MTf#EyhSwRaa<3^J7lTTdNh z%^4piRp5wfVPaQVUP*`CTtSe9RE%Jlg9c&fOqWb|IHpA-J2omv4vx(1HDrx+q^Kia zN-pVFlQ8DEjgV3<=3|v_eHCSoe{6XpUdmwk4OX+H0HlgZ#&RZ!b+tnql6tx62V<3$ zl0{-@Y51l+0YS26pFx3HS_PT$Ne-T&dFD=JS87$6WqL+-)>fQRijZYxrqk$Zi86!B jr?YWNDsBxl`U$Fts>&*41HCGWVY1e0>#evxlmGxb6oz`@ diff --git a/doc/images/printer-processing.svg b/doc/images/printer-processing.svg new file mode 100644 index 000000000..e4e2e5594 --- /dev/null +++ b/doc/images/printer-processing.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/images/printer-stopped.gif b/doc/images/printer-stopped.gif index 76f45649b132bde80d5a90530f0cf990aa4f5278..f29f5b14884fc2801b1e490c391df3e8bf545e40 100644 GIT binary patch literal 2933 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 YPqX2ntm^8kuqFTiJFzuv761SM diff --git a/doc/images/printer-stopped.svg b/doc/images/printer-stopped.svg new file mode 100644 index 000000000..07c03ce6a --- /dev/null +++ b/doc/images/printer-stopped.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/images/web-add-this-printer.gif b/doc/images/web-add-this-printer.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4bd2f2ca8797879c83195df1fe04d8dd624423f GIT binary patch literal 23429 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 literal 0 Hc-jL100001 diff --git a/doc/images/web-password.gif b/doc/images/web-password.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59c3764c21dd093c58d40a16cef6ecb9acdd886 GIT binary patch literal 20956 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 D9|Y(< literal 0 Hc-jL100001 diff --git a/doc/images/web-printer-status.gif b/doc/images/web-printer-status.gif new file mode 100644 index 0000000000000000000000000000000000000000..9202291ed06209101d0b1aa322de38ea3da98a27 GIT binary patch literal 24271 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 literal 0 Hc-jL100001 diff --git a/doc/images/web-set-printer-options.gif b/doc/images/web-set-printer-options.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1b9bcf08dec74e5298fb4e0de6eb175b213d829 GIT binary patch literal 19998 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 NE#WdQ$1)%Q06Tzo_D28! literal 0 Hc-jL100001 diff --git a/doc/images/web-test-page.gif b/doc/images/web-test-page.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d33e6114954bd1d8c2f4f248af998b82bd15d8d GIT binary patch literal 19005 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 z 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 z z^PAxuXF1QA&ULo)o$;J!J-c}cZ0Lg~gkfQqjELD6nlSXC5uIp7FPhPfcJ!km9cf8V zn$nfF^rbNkX - + - - +

    Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@

    +
    - - -CUPS Implementation of IPP - - - - - - - -

    -

    CUPS Implementation of IPP


    -CUPS-IPP-1.2
    -Easy Software Products
    -Copyright 1997-2003 All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Overview - -4 Operations - -5 Attributes - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This document provides an overview of the Internet Printing Protocol - ("IPP") version 1.1 as implemented in the Common UNIX Printing System - ("CUPS") version 1.2.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This document is organized into the following sections:

    - -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Overview

    -

    CUPS 1.1 implements IPP/1.1 and the operations and attributes defined - in the "IPP: Job and Printer Set Operations", "IPP/1.1: Output-bin - Attribute Extension", and "IPP/1.1: finishings 'fold',' trim', and - 'bale' attribute values extension" specifications.

    -

    CUPS also provides 13 new operations and many new attributes to - support multiple IPP printers and printer classes on a single host.

    -

    3.1 IPP URIs

    -

    CUPS supports both the "http" and "ipp" methods. The following - resource names are used:

    -
    -
    method://hostname:port/
    -
    Can be used for all "get" operations.
    -
    method://hostname:port/admin
    -
    Used for all administrative operations.
    -
    method://hostname:port/classes/name
    -
    Specifies a printer class.
    -
    method://hostname:port/jobs/id
    -
    Specifies a job.
    -
    method://hostname:port/printers/name
    -
    Specifies a printer.
    -
    -

    So a typical printer URI would be - "ipp://foo.bar.com/printers/LaserJet".

    -

    In addition, the CUPS server also supports normal browser access to - "method://hostname:port/admin/", "method://hostname:port/classes/", - "method://hostname:port/jobs/", and "method://hostname:port/printers/" - to view and manage resources on the server dynamically.

    -

    3.2 CUPS IPP Operations

    -

    CUPS provides 13 extension operations in addition to most of the - standard IPP and registered extension operations: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Operation NameCUPS -CodeBrief Description
    Print-Job1.0 -0x0002Print a file.
    Validate-Job1.0 -0x0004Validate job attributes.
    Create-Job1.2 -0x0005Create a print job.
    Send-Document1.2 -0x0006Send a file for a print job.
    Cancel-Job1.0 -0x0008Cancel a print job.
    Get-Job-Attributes1.0 -0x0009Get job attributes.
    Get-Jobs1.0 -0x000AGet all jobs.
    Get-Printer-Attributes1.00x000BGet printer attributes.
    Hold-Job1.2 -0x000CHold a job for printing.
    Release-Job1.2 -0x000DRelease a job for printing.
    Pause-Printer1.0 -0x0010Pause printing on a printer.
    Resume-Printer1.0 -0x0011Resume printing on a printer.
    Purge-Jobs1.0 -0x0012Purge all jobs.
    Set-Job-Attributes1.2 -0x0014Set attributes for a pending or held job.
    CUPS-Get-Default1.0 -0x4001Get the default destination.
    CUPS-Get-Printers1.0 -0x4002Get all of the available printers.
    CUPS-Add-Modify-Printer1.00x4003Add or modify a printer.
    CUPS-Delete-Printer1.00x4004Delete a printer.
    CUPS-Get-Classes1.0 -0x4005Get all of the available printer classes.
    CUPS-Add-Modify-Class1.00x4006Add or modify a printer class.
    CUPS-Delete-Class1.0 -0x4007Delete a printer class.
    CUPS-Accept-Jobs1.0 -0x4008Accept jobs on a printer or printer class.
    CUPS-Reject-Jobs1.0 -0x4009Reject jobs on a printer or printer class.
    CUPS-Set-Default1.0 -0x400ASet the default destination.
    CUPS-Get-Devices1.2 -0x400BGet all of the available devices.
    CUPS-Get-PPDs1.2 -0x400CGet all of the available PPDs.
    CUPS-Move-Job1.2 -0x400DMove a job to a different printer.
    -
    -

    -

    4 Operations

    -

    The following sections describe the operations supported by CUPS. In - the interest of brevity, operations which use only the standard IPP - attributes are not described.

    -

    4.1 Print-Job Operation

    -

    The Print-Job operation (0x0002) prints a file.

    -

    4.1.1 Print-Job Request

    -

    The following groups of attributes are supplied as part of the - Print-Job request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer.

      -
    -

    Group 2: Job Template Attributes

    -
      -

      "job-billing" (text(MAX)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a billing string that is logged with - the page accounting information.

      -

      "job-sheets" (1setof type3 keyword | name(MAX)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies one or two banner pages that are - printed before and after any files in the print job. The name of "none" - is reserved to indicate that no banner page should be printed. If the - client does not specify this attribute then the value of the - "job-sheets-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value.

      -

      "media" (1setof type3 keyword | name(MAX)):

      -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output media. If - the client does not specify this attribute then the value of the - "media-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single media - attribute value.

      -

      Other Job Template Attributes

      -
    -

    The Print-Job request is followed by a file to be printed.

    -

    4.1.2 Print-Job Response

    -

    The following groups of attributes are send as part of the Print-Job - Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Job Attributes

    -
      -

      Standard Job Attributes

      -
    -

    4.2 Create-Job Operation

    -

    The Create-Job operation (0x0005) creates a new, empty print job.

    -

    4.2.1 Create-Job Request

    -

    The following groups of attributes are supplied as part of the - Create-Job request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer.

      -
    -

    Group 2: Job Template Attributes

    -
      -

      "job-billing" (text(MAX)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a billing string that is logged with - the page accounting information.

      -

      "job-sheets" (1setof type3 keyword | name(MAX)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies one or two banner pages that are - printed before and after any files in the print job. The name of "none" - is reserved to indicate that no banner page should be printed. If the - client does not specify this attribute then the value of the - "job-sheets-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value.

      -

      "media" (1setof type3 keyword | name(MAX)):

      -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output media. If - the client does not specify this attribute then the value of the - "media-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single media - attribute value.

      -

      Standard Job Template Attributes

      -
    -

    4.2.2 Create-Job Response

    -

    The following groups of attributes are send as part of the Create-Job - Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Job Attributes

    -
      -

      Standard Job Attributes

      -
    -

    4.3 Set-Job-Attributes Operation

    -

    The Set-Job-Attributes operation (0x0014) changes the attributes of - an active (not completed) job.

    -

    4.3.1 Set-Job-Attributes Request

    -

    The following groups of attributes are supplied as part of the - Set-Job-Attributes request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri) and "job-id" (integer)

      -

      OR

      -

      "job-uri":

      -

      The client MUST supply a URI for the specified printer and a job ID - number, or the job URI.

      -
    -

    Group 2: Job Template Attributes

    -
      -

      "job-sheets" (1setof type3 keyword | name(MAX)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies one or two banner pages that are - printed before and after any files in the print job. The name of "none" - is reserved to indicate that no banner page should be printed. If the - client does not specify this attribute then the value of the - "job-sheets-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value.

      -

      "media" (1setof type3 keyword | name(MAX)):

      -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output media. If - the client does not specify this attribute then the value of the - "media-default" printer object attribute is used.

      -

      Note: Standard IPP only allows specification of a single media - attribute value.

      -

      Other Job Template Attributes

      -
    -

    4.3.2 Set-Job-Attributes Response

    -

    The following groups of attributes are send as part of the - Set-Job-Attributes Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.4 CUPS-Get-Default Operation

    -

    The CUPS-Get-Default operation (0x4001) returns the default printer - URI and attributes.

    -

    4.4.1 CUPS-Get-Default Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Get-Default request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "requested-attributes" (1setOf keyword) :

      -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'.

      -
    -

    4.4.2 CUPS-Get-Default Response

    -

    The following groups of attributes are send as part of the - CUPS-Get-Default Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Printer Object Attributes

    -
      -

      The set of requested attributes and their current values.

      -
    -

    4.5 CUPS-Get-Printers Operation

    -

    The CUPS-Get-Printers operation (0x4002) returns the printer - attributes for every printer known to the system. This may include - printers that are not served directly by the server.

    -

    4.5.1 CUPS-Get-Printers Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Get-Printers request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "limit" (integer (1:MAX)):

      -

      The client OPTIONALLY supplies this attribute limiting the number of - printers that are returned.

      -

      "printer-info" (text(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies this attribute to select which - printers are returned.

      -

      "printer-location" (text(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies this attribute to select which - printers are returned.

      -

      "printer-type" (type2 enum):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a printer type enumeration to select - which printers are returned.

      -

      "printer-type-mask" (type2 enum):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a printer type mask enumeration to - select which bits are used in the "printer-type" attribute.

      -

      "requested-attributes" (1setOf keyword) :

      -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'.

      -
    -

    4.5.2 CUPS-Get-Printers Response

    -

    The following groups of attributes are send as part of the - CUPS-Get-Printers Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Printer Object Attributes

    -
      -

      The set of requested attributes and their current values for each - printer.

      -
    -

    4.6 CUPS-Add-Modify-Printer Operation

    -

    The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or - modifies an existing printer on the system.

    -

    4.6.1 CUPS-Add-Modify-Printer Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Add-Modify-Printer request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer.

      -
    -

    Group 2: Printer Object Attributes

    -
      -

      "banner-end-default" (name(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a banner page name that is printed - after files in a job. The reserved name "none" is used to specify that - no banner page should be printed.

      -

      "banner-start-default" (name(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a banner page name that is printed - before files in a job. The reserved name "none" is used to specify that - no banner page should be printed.

      -

      "device-uri" (uri):

      -

      The client OPTIONALLY supplies a device URI for the specified - printer.

      -

      "ppd-name" (name(127)):

      -

      The client OPTIONALLY supplies a PPD name for the specified printer.

      -

      "printer-is-accepting-jobs" (boolean):

      -

      The client OPTIONALLY supplies this boolean attribute indicating - whether or not the printer object should accept new jobs.

      -

      "printer-info" (text(127)):

      -

      The client OPTIONALLY supplies this attribute indicating the printer - information string.

      -

      "printer-location" (text(127)):

      -

      The client OPTIONALLY supplies this attribute indicating a textual - location of the printer.

      -

      "printer-more-info" (uri):

      -

      The client OPTIONALLY supplies this attribute indicating a URI for - additional printer information.

      -

      "printer-state" (type2 enum):

      -

      The client OPTIONALLY supplies this attribute indicating the - initial/current state of the printer. Only the "idle" and "stopped" - enumerations are recognized.

      -

      "printer-state-message" (text(MAX)):

      -

      The client OPTIONALLY supplies this attribute indicating a textual - reason for the current printer state.

      -

      "requesting-user-name-allowed" (1setof name(127) | delete)

      -

      OR

      -

      "requesting-user-name-denied" (1setof name(127) | delete):

      -

      The client OPTIONALLY supplies one of these attributes to specify an - access control list for incoming print jobs. To allow all users access - to a printer, use the delete tag for the attribute value.

      -
    -

    The CUPS-Add-Modify-Printer request can optionally be followed by a - PPD file or System V interface script to be used for the printer. The - "ppd-name" attribute overrides any file that is attached to the end of - the request with a local CUPS PPD file.

    -

    4.6.2 CUPS-Add-Modify-Printer Response

    -

    The following groups of attributes are send as part of the - CUPS-Add-Modify-Printer Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.7 CUPS-Delete-Printer Operation

    -

    The CUPS-Delete-Printer operation (0x4004) removes an existing - printer from the system.

    -

    4.7.1 CUPS-Delete-Printer Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Delete-Printer request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer.

      -
    -

    4.7.2 CUPS-Delete-Printer Response

    -

    The following groups of attributes are send as part of the - CUPS-Delete-Printer Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.8 CUPS-Get-Classes Operation

    -

    The CUPS-Get-Classes operation (0x4005) returns the printer - attributes for every printer class known to the system. This may - include printer classes that are not served directly by the server.

    -

    4.8.1 CUPS-Get-Classes Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Get-Classes request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "limit" (integer (1:MAX)):

      -

      The client OPTIONALLY supplies this attribute limiting the number of - printer classes that are returned.

      -

      "printer-info" (text(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies this attribute to select which printer - classes are returned.

      -

      "printer-location" (text(127)):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies this attribute to select which printer - classes are returned.

      -

      "printer-type" (type2 enum):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a printer type enumeration to select - which printer classes are returned.

      -

      "printer-type-mask" (type2 enum):

      -

      (CUPS 1.1 and higher)

      -

      The client OPTIONALLY supplies a printer type mask enumeration to - select which bits are used in the "printer-type" attribute.

      -

      "requested-attributes" (1setOf keyword) :

      -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'.

      -
    -

    4.8.2 CUPS-Get-Classes Response

    -

    The following groups of attributes are send as part of the - CUPS-Get-Classes Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Printer Class Object Attributes

    -
      -

      The set of requested attributes and their current values for each - printer class.

      -
    -

    4.9 CUPS-Add-Modify-Class Operation

    -

    The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class - or modifies and existing printer class on the system.

    -

    4.9.1 CUPS-Add-Modify-Class Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Add-Modify-Class request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer class.

      -
    -

    Group 2: Printer Object Attributes

    -
      -

      "member-uris" (1setof uri):

      -

      The client OPTIONALLY supplies the "member-uris" set specifying the - printers and printer classes that are part of the class.

      -

      "printer-is-accepting-jobs" (boolean):

      -

      The client OPTIONALLY supplies this boolean attribute indicating - whether or not the class object should accept new jobs.

      -

      "printer-info" (text(127)):

      -

      The client OPTIONALLY supplies this attribute indicating the printer - information string.

      -

      "printer-location" (text(127)):

      -

      The client OPTIONALLY supplies this attribute indicating a textual - location of the class.

      -

      "printer-more-info" (uri):

      -

      The client OPTIONALLY supplies this attribute indicating a URI for - additional class information.

      -

      "printer-state" (type2 enum):

      -

      The client OPTIONALLY supplies this attribute indicating the - initial/current state of the class. Only the "idle" and "stopped" - enumerations are recognized.

      -

      "printer-state-message" (text(MAX)):

      -

      The client OPTIONALLY supplies this attribute indicating a textual - reason for the current class state.

      -

      "requesting-user-name-allowed" (1setof name(127))

      -

      OR

      -

      "requesting-user-name-denied" (1setof name(127)):

      -

      The client OPTIONALLY supplies one of these attributes to specify an - access control list for incoming print jobs. To allow all users access - to a class, use the delete tag for the attribute value.

      -
    -

    4.9.2 CUPS-Add-Modify-Class Response

    -

    The following groups of attributes are send as part of the - CUPS-Add-Modify-Class Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.10 CUPS-Delete-Class Operation

    -

    The CUPS-Delete-Class operation (0x4007) removes an existing printer - class from the system.

    -

    4.10.1 CUPS-Delete-Class Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Delete-Class request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer class.

      -
    -

    4.10.2 CUPS-Delete-Class Response

    -

    The following groups of attributes are send as part of the - CUPS-Delete-Class Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.11 CUPS-Accept-Jobs Operation

    -

    The CUPS-Accept-Jobs operation (0x4008) sets the - "printer-is-accepting-jobs" attribute to true for the specified printer - or printer class.

    -

    4.11.1 CUPS-Accept-Jobs Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Accept-Jobs request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer or printer - class.

      -
    -

    4.11.2 CUPS-Accept-Jobs Response

    -

    The following groups of attributes are send as part of the - CUPS-Accept-Jobs Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.12 CUPS-Reject-Jobs Operation

    -

    The CUPS-Reject-Jobs operation (0x4009) sets - the"printer-is-accepting-jobs" attribute to false for the specified - printer or printer class.

    -

    4.12.1 CUPS-Reject-Jobs Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Reject-Jobs request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer or printer - class.

      -
    -

    Group 2: Printer Object Attributes

    -
      -

      "printer-state-message" (text(MAX)):

      -

      The client OPTIONALLY supplies this attribute indicating a textual - reason for the current printer state.

      -
    -

    4.12.2 CUPS-Reject-Jobs Response

    -

    The following groups of attributes are send as part of the - CUPS-Reject-Jobs Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.13 CUPS-Set-Default Operation

    -

    The CUPS-Set-Default operation (0x400A) sets the default printer - destination for all clients when a resource name of "/printers" is - specified.

    -

    4.13.1 CUPS-Set-Default Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Set-Default request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri):

      -

      The client MUST supply a URI for the specified printer or printer - class.

      -
    -

    4.13.2 CUPS-Set-Default Response

    -

    The following groups of attributes are send as part of the - CUPS-Set-Default Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    4.14 CUPS-Get-Devices Operation

    -

    The CUPS-Get-Devices operation (0x400B) returns all of the supported - device-uri's for the server (CUPS 1.1 and higher).

    -

    4.14.1 CUPS-Get-Devices Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Get-Devices request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "device-class" (type1 keyword):

      -

      The client OPTIONALLY supplies a device class keyword to select which - devices are returned.

      -

      "limit" (integer (1:MAX)):

      -

      The client OPTIONALLY supplies this attribute limiting the number of - devices that are returned.

      -

      "requested-attributes" (1setOf keyword) :

      -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'.

      -
    -

    4.14.2 CUPS-Get-Devices Response

    -

    The following groups of attributes are send as part of the - CUPS-Get-Devices Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: Device Object Attributes

    -
      -

      The set of requested attributes and their current values for each - device.

      -
    -

    4.15 CUPS-Get-PPDs Operation

    -

    The CUPS-Get-PPDs operation (0x400C) returns all of the locally - available PPD files on the system (CUPS 1.1 and higher).

    -

    4.15.1 CUPS-Get-PPDs Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Get-PPDs request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "limit" (integer (1:MAX)):

      -

      The client OPTIONALLY supplies this attribute limiting the number of - PPDs that are returned.

      -

      "ppd-make" (text(127)):

      -

      The client OPTIONALLY supplies a printer manufacturer to select which - PPDs are returned.

      -

      "requested-attributes" (1setOf keyword) :

      -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'.

      -
    -

    4.15.2 CUPS-Get-PPDs Response

    -

    The following groups of attributes are send as part of the - CUPS-Get-PPDs Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    Group 2: PPD Attributes

    -
      -

      The set of requested attributes and their current values for each PPD - file.

      -
    -

    4.16 CUPS-Move-Job Operation

    -

    The CUPS-Move-Job operation (0x400D) moves an active print job to a - different printer (CUPS 1.1 and higher).

    -

    4.16.1 CUPS-Move-Job Request

    -

    The following groups of attributes are supplied as part of the - CUPS-Move-Job request:

    -

    Group 1: Operation Attributes

    -
      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.1 of the IPP Model and Semantics - document.

      -

      "printer-uri" (uri) and "job-id" (integer)

      -

      OR

      -

      "job-uri":

      -

      The client MUST supply a URI for the specified printer and a job ID - number, or the job URI.

      -
    -

    Group 2: Job Template Attributes

    -
      -

      "job-printer-uri" (uri)

      -

      The client MUST supply a URI for a printer on the same server.

      -
    -

    4.16.2 CUPS-Move-Job Response

    -

    The following groups of attributes are send as part of the - CUPS-Move-Job Response:

    -

    Group 1: Operation Attributes

    -
      -

      Status Message:

      -

      The standard response status message.

      -

      Natural Language and Character Set:

      -

      The "attributes-charset" and "attributes-natural-language" attributes - as described in section 3.1.4.2 of the IPP Model and Semantics - document.

      -
    -

    5 Attributes

    -

    CUPS provides many extension attributes to support multiple devices, - PPD files, standard job filters, printers, and printer classes.

    -

    5.1 Device Attributes

    -

    Device attributes are returned by the CUPS-Get-Devices operation and - enumerate all of the available hardware devices and network protocols - that are supported by the server.

    -

    5.1.1 device-class (type2 keyword)

    -

    The device-class attribute specifies the class of device and can be - one of the following:

    -
      -
    • "file" - a disk file.
    • -
    • "direct" - a parallel or fixed-rate serial data port, currently used - for Centronics, IEEE-1284, and USB printer ports.
    • -
    • "serial" - a variable-rate serial port.
    • -
    • "network" - a network connection, typically via AppSocket, HTTP, - IPP, LPD, or SMB/CIFS protocols.
    • -
    -

    5.1.2 device-info (text(127))

    -

    The device-info attribute specifies a human-readable string - describing the device, e.g. "Parallel Port #1".

    -

    5.1.3 device-make-and-model (text(127))

    -

    The device-makr-and-model attribute specifies a device identification - string provided by the printer connected to the device. If the device - or printer does not support identification then this attribute contains - the string "unknown".

    -

    5.1.4 device-uri (uri)

    -

    The device-uri attribute specifies a unique identifier for the - device. The actual format of the device-uri string depends on the value - of the device-class attribute:

    -
      -
    • "file" - The device-uri will be of the form - "file:/path/to/filename".
    • -
    • "direct" - The device-uri will be of the form - "method:/dev/filename", where method may be "parallel" or "usb" in the - current implementation.
    • -
    • "serial" - The device-uri will be of the form - "serial:/dev/filename?baud=value+parity=value+flow=value". The baud - value is the data rate in bits per second; the supported values depend - on the underlying hardware. The parity value can be one of "none", - "even", or "odd". The flow value can be one of "none", "soft" (XON/XOFF - handshaking), "hard" or "rts/cts" (RTS/CTS handshaking), or "dtrdsr" - (DTR/DSR handshaking). -

      The URI returned by CUPS-Get-Devices will contain the maximum baud - rate supported by the device and the best type of flow control - available ("soft" or "hard").

      -
    • "network" - The device-uri will be of the form - "method://[username:password@]hostname[:port]/[resource]", where method - may be "http", "ipp", "lpd", "smb", or "socket" in the current - implementation. -

      The URI returned by CUPS-Get-Devices will only contain the method - name followed by two slashes ("method://"). It is up to the client - application to add the appropriate host and other information when - adding a new printer.

      -

      The URI returned by Get-Printer-Attributes and CUPS-Get-Printers has - any username and password information stripped; the information is - still stored and used by the server internally to perform any needed - authentication.

      -
    • - -
    -

    5.2 Job Template Attributes

    -

    5.2.1 blackplot (boolean)

    -

    The blackplot attribute specifies whether HP-GL/2 plot files should - be rendered entirely in black ink (blackplot=true) or using the colors - and shades specified in the file (blackplot=false). The default value - is false.

    -

    5.2.2 brightness (integer(0:200))

    -

    The brightness attribute specifies the overall brightness of the - printed output in percent. A brightness of 100 is normal, while 200 is - twice as bright and 50 is half as bright. The default value is 100.

    -

    Brightness is applied to the Cyan, Magenta, Yellow, and Black values - using the function "f(x) = brightness / 100 * x".

    -

    5.2.3 columns (integer(1:4))

    -

    The columns attribute specifies the number of columns to generate - when printing text files. The default value is 1.

    -

    5.2.4 cpi (type2 enum)

    -

    The cpi attribute specifies the number of characters per inch when - printing text files. Only the values 10, 12, and 17 are currently - supported. The default value is 10.

    -

    5.2.5 fitplot (boolean)

    -

    The fitplot attribute specifies whether to scale HP-GL/2 plot files - to fit on the selected media (fitplot=true) or use the physical scale - specified in the plot file (fitplot=false). The default value is false.

    -

    5.2.6 gamma (integer(1:10000))

    -

    The gamma attribute specifies the luminance correction for the - output. A value of 1000 specifies no correction, while values of 2000 - and 500 will generate lighter and darker output, respectively. The - default value is 1000.

    -

    Gamma is applied to the Red, Green, and Blue values (or luminance for - grayscale output) using the function "f(x) = x(1000/gamma)".

    -

    5.2.7 hue (integer(-180:180))

    -

    The hue attribute specifies a color hue rotation when printing image - files. The default value is 0.

    -

    5.2.8 job-billing (text(MAX))

    -

    (CUPS 1.1 and higher)

    -

    The job-billing attribute provides a text value to associate with a - job for billing purposes.

    -

    5.2.9 job-hold-until (keyword | name(MAX))

    -

    (CUPS 1.1 and higher)

    -

    The job-hold-until attribute specifies a hold time. In addition to - the standard IPP/1.1 keyword names, CUPS supports name values of the - form "HH:MM" and "HH:MM:SS" that specify a hold time. The hold time is - in Greenwich Mean Time (GMT) and not in the local time zone. If - the specified time is less than the current time, the job is held until - the next day.

    -

    5.2.10 job-sheets (1setof type3 keyword | - name(MAX))

    -

    (CUPS 1.1 and higher)

    -

    The job-sheets attribute specifies one or two banner files that are - printed before and after a job. The reserved value of "none" disables - banner printing. The default value is stored in the job-sheets-default - attribute.

    -

    If only one value is supplied, the banner file is printed before the - job. If two values are supplied, the first value is used as the - starting banner file and the second as the ending banner file.

    -

    5.2.11 job-originating-host-name (name(MAX))

    -

    (CUPS 1.1.5 and higher)

    -

    The job-originating-host-name attribute specifies the host from which - the job was queued. The value will be the hostname or IP address of the - client depending on whether hostname resolution is enabled. The - localhost address (127.0.0.1) is always resolved to the name - "localhost".

    -

    This attribute is read-only.

    -

    5.2.12 lpi (type2 enum)

    -

    The lpi attribute specifies the number of lines per inch when - printing text files. Only the values 6 and 8 are currently supported. - The default value is 6.

    -

    5.2.13 natural-scaling (integer(1:1000))

    -

    (CUPS 1.1.9 and higher)

    -

    The natural-scaling attribute specifies the scaling of image files - with respect to the natural image size. A value of 100 specifies that - the image file should exactly the natural size, while 50 is half the - natural size and 200 is twice the natural size. The default value is - 100.

    -

    The ppi option can be used to override the natural resolution of the - image, which controls the natural size.

    -

    5.2.14 number-up-layout (type2 keyword)

    -

    (CUPS 1.1.15 and higher)

    -

    The number-up-layout attribute specifies the order each input page is - placed on each output page. The following keywords are presently - defined:

    -
      -
    • btlr - Bottom to top, left to right
    • -
    • btrl - Bottom to top, right to left
    • -
    • lrbt - Left to right, bottom to top
    • -
    • lrtb - Left to right, top to bottom (default)
    • -
    • rlbt - Right to left, bottom to top
    • -
    • rltb - Right to left, top to bottom
    • -
    • tblr - Top to bottom, left to right
    • -
    • tbrl - Top to bottom, right to left
    • -
    -

    5.2.15 page-border (type2 keyword)

    -

    (CUPS 1.1.15 and higher)

    -

    The page-border attribute specifies whether a border is draw around - each page. The following keywords are presently defined:

    -
      -
    • double - Two hairline borders are drawn
    • -
    • double-thick - Two 1pt borders are drawn
    • -
    • none - No border is drawn (default)
    • -
    • single - A single hairline border is drawn
    • -
    • single-thick - A single 1pt border is drawn
    • -
    -

    5.2.16 page-bottom (integer(0:MAX))

    -

    The page-bottom attribute specifies the bottom margin in points (72 - points equals 1 inch). The default value is the device physical margin.

    -

    5.2.17 page-label (text(MAX))

    -

    (CUPS 1.1.7 and higher)

    -

    The page-label attribute provides a text value to place in the header - and footer on each page. If a classification level is set on the - server, then this classification is printed before the page label.

    -

    5.2.18 page-left (integer(0:MAX))

    -

    The page-left attribute specifies the left margin in points (72 - points equals 1 inch). The default value is the device physical margin.

    -

    5.2.19 page-right (integer(0:MAX))

    -

    The page-right attribute specifies the right margin in points (72 - points equals 1 inch). The default value is the device physical margin.

    -

    5.2.20 page-set (type2 keyword)

    -

    The page-set attribute specifies which pages to print in a file. The - supported keywords are "all", "even", and "odd". The default value is - "all".

    -

    5.2.21 page-top (integer(0:MAX))

    -

    The page-top attribute specifies the top margin in points (72 points - equals 1 inch). The default value is the device physical margin.

    -

    5.2.22 penwidth (integer(0:MAX))

    -

    The penwidth attribute specifies the default pen width in micrometers - when printing HP-GL/2 plot files. The default value is 1000 (1 - millimeter).

    -

    5.2.23 position (type2 keyword)

    -

    The position attribute specifies the location of image files on the - media. The following keyword values are recognized:

    -
      -
    • center - Center the image on the page (default)
    • -
    • top - Print the image centered at the top of the page
    • -
    • left - Print the image centered on the left of page
    • -
    • right - Print the image centered on the right of the - page
    • -
    • top-left - Print the image at the top left corner of - the page
    • -
    • top-right - Print the image at the top right corner of - the page
    • -
    • bottom - Print the image centered at the bottom of the - page
    • -
    • bottom-left - Print the image at the bottom left corner - of the page
    • -
    • bottom-right - Print the image at the bottom right - corner of the page
    • -
    -

    5.2.24 ppi (integer(1:MAX))

    -

    The ppi attribute specifies the resolution of an image file in pixels - per inch. The default value is the resolution included with the file or - 128 if no resolution information is available.

    -

    5.2.25 prettyprint (boolean)

    -

    The prettyprint attribute specifies whether text files should be - printed with a shaded header and keyword highlighting - (prettyprint=true) or without additional formatting - (prettyprint=false). The default value is false.

    -

    5.2.26 saturation (integer(0:200))

    -

    The saturation attribute specifies the color saturation when printing - image files. A saturation of 100 is normal, while values of 50 and 200 - will be half and twice as colorful, respectively. The default value is - 100.

    -

    5.2.27 scaling (integer(1:1000))

    -

    The scaling attribute specifies the scaling of image files with - respect to the selected media. A value of 100 specifies that the image - file should fit 100% of the page, or as much as possible given the - image dimensions. The default value is unspecified.

    -

    The scaling attribute overrides the ppi attribute if specified.

    -

    5.2.28 wrap (boolean)

    -

    The wrap attribute specifies whether long lines should be wrapped - (wrap=true) or not (wrap=false) when printing text files. The default - value is true.

    -

    5.3 PPD Attributes

    -

    5.3.1 ppd-natural-language (naturalLanguage)

    -

    The ppd-natural-language attribute specifies the language encoding of - the PPD file (the LanguageVersion attribute in the PPD file). If the - language is unknown or undefined then "en" (English) is assumed.

    -

    5.3.2 ppd-make (text(127))

    -

    The ppd-make attribute specifies the manufacturer of the printer (the - Manufacturer attribute in the PPD file). If the manufacturer is not - specified in the PPD file then an educated guess is made using the - NickName attribute in the PPD file.

    -

    5.3.3 ppd-make-and-model (text(127))

    -

    The ppd-make-and-model attribute specifies the manufacturer and model - name of the PPD file (the NickName attribute in the PPD file). If the - make and model is not specified in the PPD file then the ModelName or - ShortNickName attributes are used instead.

    -

    5.3.4 ppd-name (name(255))

    -

    The ppd-name attribute specifies the PPD filename on the server - relative to the model directory. The forward slash (/) is used to - delineate directories.

    -

    5.4 Printer Attributes

    -

    5.4.1 job-k-limit (integer)

    -

    (CUPS 1.1 and higher)

    -

    The job-k-limit attribute specifies the maximum number of kilobytes - that may be printed by a user, including banner files. The default - value of 0 specifies that there is no limit.

    -

    5.4.2 job-page-limit (integer)

    -

    (CUPS 1.1 and higher)

    -

    The job-page-limit attribute specifies the maximum number of pages - that may be printed by a user, including banner files. The default - value of 0 specifies that there is no limit.

    -

    5.4.3 job-quota-period (integer)

    -

    (CUPS 1.1 and higher)

    -

    The job-quota-period attribute specifies the time period used for - quota calculations, in seconds. The default value of 0 specifies that - the limits apply to all jobs that have been printed by a user that are - still known to the system.

    -

    5.4.4 job-sheets-supported (1setof type3 keyword | - name(MAX))

    -

    (CUPS 1.1 and higher)

    -

    The job-sheets-supported attribute specifies the available banner - files. There will always be at least one banner file available called - "none".

    -

    5.4.5 printer-type (type2 enum)

    -

    The printer-type attribute specifies printer type and capability bits - for the printer or class. The default value is computed from internal - state information and the PPD file for the printer. The following bits - are defined: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitDescription
    0x00000001Is a printer class.
    0x00000002Is a remote - destination.
    0x00000004Can print in black.
    0x00000008Can print in color.
    0x00000010Can print on both - sides of the page in hardware.
    0x00000020Can staple output.
    0x00000040Can do fast copies - in hardware.
    0x00000080Can do fast copy - collation in hardware.
    0x00000100Can punch output.
    0x00000200Can cover output.
    0x00000400Can bind output.
    0x00000800Can sort output.
    0x00001000Can handle media up - to US-Legal/A4.
    0x00002000Can handle media - from US-Legal/A4 to ISO-C/A2.
    0x00004000Can handle media - larger than ISO-C/A2.
    0x00008000Can handle - user-defined media sizes.
    0x00010000Is an implicit - (server-generated) class.
    -
    -

    -

    5.4.6 printer-type-mask (type2 enum)

    -

    (CUPS 1.1 and higher)

    -

    The printer-type-mask attribute is used to choose printers or classes - with the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits - are defined identically to the printer-type attribute and default to - all 1's.

    -

    5.4.7 requesting-user-name-allowed (1setof - name(127))

    -

    (CUPS 1.1 and higher)

    -

    The requesting-user-name-allowed attribute lists all of the users - that are allowed to access a printer or class. Either this attribute or - the requesting-user-name-denied attribute will be defined, but not - both.

    -

    5.4.8 requesting-user-name-denied (1setof name(127)) -

    -

    (CUPS 1.1 and higher)

    -

    The requesting-user-name-denied attribute lists all of the users that - are not allowed to access a printer or class. Either this attribute or - the requesting-user-name-allowed attribute will be defined, but not - both.

    -

    5.5 Printer Class Attributes

    -

    5.5.1 member-names (1setof name(127))

    -

    The member-names attribute specifies each of the printer-name - attributes of the member printers and classes. Each name corresponds to - the same element of the member-uris attribute.

    -

    5.5.2 member-uris (1setof uri)

    -

    The member-uris attribute specifies each of the printer-uri - attributes of the member printers and classes. Each URI corresponds to - the same element of the member-names attribute.

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/ipp.pdf b/doc/ipp.pdf deleted file mode 100644 index 84771cd3fff5b5e1e8f94dec2ea0b75d1436ac29..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 111519 zc-pMJ2|QHa|398e3o7rdA)GqcbG z^g)S5uRH1=NdW3tb*7i!k|h{B7SlV7&R}V72n`JIX42IGeUd&1sGBl_BUrxcH-xGK zWHM0?#9~2pa~eBB-GS*7x{=0WsH0bgvUSys0|L}3h%8&3!eBF4;S6tmEsQCPK@0U| z2AR=98JcDWNDWvLfX8BS5Jc9&!UtLyN8iu@hNh{LorAhnU~m8s#T>*K>F6Fq%k zAF*jc-l#Aet}}pv35K-|3SjtzqDLG}F*J54gXPQi#{>t2u`zUJU?2?>=oeCg1Y?RZ!O+9^=57i!f-|-GQt9oVNDNXA%i*s69EquFBa3E5rlLin?dJ{ zg7IqTV}68Tvb=rZ5yTl#2srGNOw`^1%=Nx>T0jsp6tf{BcmrG^i?QApfns=L0%>$a zU2n#EWS}A=8y(W{;AMw##x)Ba#N#CzJuH-g2@FGAg9eX|;0@gIkF6l99=*8yf#pZupY(9RK6)Ize%2@p&V>K>g9=ZXu3WZyZimyh+SN|ct znkz7VRbW^^sBdsU1ZFkre@^J7PUxjhe_ZM`e$5*6OGh}G!lR183WP_sR{$GB<2ok# zHSLdUX(%jhyb2np8)$H#8S4fHdNBjNnDNKOjPa{{Q5j!U#`g~y-*FiR+zmk}91|61 zqTT3nuJK z4q;xQNC7zmU`*iX!8vUT$71;U@fk!NnOP{~HQ^^-lcR4SgRMtl!WI!!8}xsz&4d}? zEvPcW|Ftr!P+EX5T~KwziC1UI2nc6{!a+n(U8Mhqx`eisJn;%0A_Bdb0pnK!Sl&xr zS9|%vQFHuit3cX%20RMj$;APQ!D}&A@MO0M4qIl7a9=uuvcg0iT7u>L;W&Q;&L5fc zXUh4r;QSf6!k=vdAdhnMv^XvJUns;j_?TNl$&R*JUQmI$ToTg~gzUAKJ5n{5# zUwt!Jwbzs` zY`wV9)oS(LkcbxJ)t=JCmK8sWXC!MLT4;gYMVZn3g&v-_Cg0UFf3ogu#T>D{V$$G!Ip5Wam9kr>sGY@r7?77*V07y}xhV18hebzYdzhD&KbhL?ci6mU|1GL}fs}%= ztVT@ydf(|e#uD?|#B>^@-pi)5!|t8wl--l53+x3Ec-4Ue#`U7tCc6WB>wZ`hpJh=*tSoVNvjr)?7fzZ zoigq8&YmaN9f!KNh6lei*fCE#qG{koW#kMJb$dU(yl$3JLGk0$)AZbrSzUd_3Nf7( z85vaV1~%E~cLf(TW|2*g;EG*imk^Z?0p42svuCFFs_y)7>$P^*rScm@of6BX-`ksm zt)jXYDj!p%b_O`?JsFYosQ9{g{#{S4<9l_#WS!JGbnY_ChOM{VeCkuX;xzGn2k3jC zgV|Jxy)&++hlF`7S*VZ`%%Z(yzWSCv=;rp1=~U*ylJ&Zcz1j2Qvp-8eASI<&?%eiI zv!(wp>UPzpP5Q4?&lVp^WbX3OcMWB^-(PoCBQ9BPWy^H!MXl21J8P$(cr8{Pwy#2B=F)p1)W0@p*cwn|U2f#B@X>rc zvohYLvSf}&@Z76+g5^SXO*8MoO?A0Hr}l_)e%k}5JAW(vD`xn(c#kFiMAOMC$NM)= z^52oN=1@=Z*0&`Y#jFLb%>$RJ)xA&rYxIbnWY!JUC8ZXtx@l-;tM=ojTLf>q#fnx+ z-qCZqSMP-suyS2bk%6BS<5kg%cQ4S^+}k%>XV-EM zf1T4M@vsVo*KRi3*GdEStobg+cvGF$^1ERpIlbRpzUvug=Lh1caeh0T^Pbg)l}t|R zz&W1pz3N!mOsRWVlayARr#7&Ps(QuJctjf|KrVKzSRXyef$i3dODX0D&}Y>KgLtL?j4RJ}f_^jnsM17{NU-3@byoZ@ol z>4$4ee&wQ*L-H3p+>6@>0ktmV1&%eKW8cP})bI*7(9=b?0^M(i4)k zJ}>31vZ!+O$S1}6D=&6yr=}WC?nsH9Yu*`}w>QkCE3ESbZ5JWdP>Y&l%7Csm2D?YD zdta0nj#1QDvHR^}yEBeW$wD%5BO^>_}2mJ7|>kDXqw)^U$c5RbsSt z)Yci_-v;meyyz+5lK$$DgT3}84b@(mX`fh|DmFMQ?Rt-=UV3rmjk)5>;zZpiicfB5 zsIi|1IK9$-Gt=5*`|iPae}^Q&=U3GZ_b#ow?%GAcok& z%lD!W4V&98UYO+Eb=irPRHCUJnHQ&Ee&@j=>Km+A-UIvD^iIFx2HG2Hoy*}$WtTgN zvpc#BzNA-X7S~){{FRvZI{V(MguR!co0IiFcY2T3G{=xrt68}wU7hCYFQ2h~Hk1^_ ztiAWu>h*=kAf`3K=v~awC8gR=WA;CP(GX@7cqP!^`?0s!v9(6(MXJMu%6n`4i^Em& zj-RkTVYTcdbGp@I+f6_FZYAEn3c#&HkWy{A~?N=I} zW@{0{9^RR|AybQYWGgPSsHeJYgE}9~x}FkJbO~rZ zzv1laJI_Cgbsk~kTaD|J-WTm?{b5HaEH>%c7|A!kkeRh0V+$c>=>)9NxZ<`+e z)^kv;Qx5xz*7X2tnN=5NWSIPJwrAd2%s(+j+hcn&TO;6eQ(KGd&xPf0otggSh54Ml zQ4ez4?tDg1XN8$*=IQOpZXUkaBE7;l@2f^pRl+`M?mu}em6;_=D-IYdRJZ<+rgm7w zxBPXwC|pth;6B+1*6}mN4|c-s1zFHf?8^6*y*f&B-iDp)GEm#$-(;CL`rS;nHESbv zOYaqT75DDS-~^?4#aq=Zz753!A1)+b-y{>L)S7>Aip&14ny{O;{-z2$5d&0OSmf0# zXti3lr?6~qWzS~KJlcW94?CA$bo)`6ia7G})}Iy3J#uL{X({c(VrX1JB5 zu-`Q=SH@-ip6)(lhSeL2GE|vGp%$BY>eGtuoQAstK22;Zp@50roD_1q0sF| zrmkF|F?gx8T3P@8$~n}y%5wy5weEGl=1z8*f5^J*!OkuiI{j;nVv*A9O&T5|=V42aHy?1<6^M;R3l5&?t2IQ7T=k3$;Hq|^`^y|~j>f!EOs{g%Mxi80! z^O=`(^{)-qIK{A|*}1X)U(JiZgt6q>sbl}aUPEjpx@^k3eY}U>xvk7)W!4Sd)|>YY zYa3l`Hfn__bVbhdSm&^gu&|W2%E4ue(y3)xEAa~F_LZ``v{$@S_B&Cwc?pzv|D{3J z(bKU-qlqr~_xDS#SJSH3)h1}`v>HdBq7`lLGP8<4O=GveR>(ZM!a47`3iZ@lx8yHV zmCrJz-h)L~OF^hISnhf{c%a+(^x1n-Jzx>5nGzQqc5?da)hzcP&4v3PMFzT0bII5o zs+iXmW2YHorKWB5a={IgwaN9(JKkJ4E7Q|adBak_=iug`%~NlLiC=!DDYJXODt zlb*S0XLGZyU$;F|tFAtLultps>ayn!p37|;TbdVzbbd*HdOc)KkKW^ z-Iscq)e$}uarWq&(KFXQsi|IT-z`ke(vO$S zOQty}C*LnUO8L>vqI92!t4iysORGKJgDw5pcCY6^!a@HFaA!u7zIjp;mYk?Aua+_} zbV{yhUg|vMFjaq0`eNXtW&2HYx509G@W6U;by1Up@$|go-&6)dX83yOu4+CPY}FS( ztJ=vnr+Eie2Db5{#QX0&!in}_cOm=aa;F>Yz>s%@%77m9!mqV?kxA5nS&5Id zi>dOp?bNSqvYxI>U7`D;d$qBlUhH+$3=ag z$vKB4;V-|6Pcf_RgVtVn>@jei{ZsY&xjnh}r#~B9JR3l9F^s`n;`B%4^x{m058LnF(Npe$Z zeP6b}tYG#O&ojAiRdBB7XL;5_2GyId)TnsAS!6KX+3opU&u7M=vvcwjC!hLGXL}Ch z&#@a&N}ba4!Ecgg^zH!0leT7MyHRy;ddp)&$;|1}sZ+8)REcYDO9&7Tzp^5F>z)M* z*q-Oy-%R@FSjfz!XD)7KhuY7K-kGm=D?AjM88v0by0pS{VPaeT^|ME&A>#!vjFzrIbiduLd) zQ0%oOCbR$SeBV<9_f_w#SGI1waCUF+)tQGf#KQdaeRj=Q+oo8Y_*v=iz+v&op{Y;J z{dTZ)r+O!s9nc`)O(%bmSg&Ear11ptVeY2COl5CBl)Gzvj3HH^VHEUso=iZjV!^^y zbKa6=boVz%B_&M@R;~THH)+RE{^@R;{3kATi=66Ct+&ljJ*>O-(qQZfsN5%8bMSCN;^gEf+3GQ@OT>lMFm@jD?#-!b#n z$*iwZuH}+FTYG18&&%KO&L$RPe0l2pyIKt$MTxHYrYe<%#;n4FQYo56#-#pLJ4oLz zoMV{GdakVyNi>zZ9xT5(JN8AL^ftex1MfaQq;4{m(wv{Wt!{ar-!9+M{3`!DlFz0R z&Mq3Y{qD2j&D?v9M;?={6#5_RP_&e>{zpyX!C}IIjTUQ9$E=q+wmwj??-|)mk~BP| z?qDOEcuCyoM9MF@`wia?#_inQ)4q3P!RFxAoqm>6x*QBO(~=Gsn_ZGl(R}vLr0)Rh zr01FbPp4nrQ&}?2@oYpXJ-ET>Rr*ijW!Y8R4PMeV8efvw==8I*+U!WS@%`u zY)u{!zjypt*KN>R?)#p`kDklcQ!3t7dVb2Z&3kWLl~$B6ZFI@6N`p;TAImk(sd++; zE*Dddc|^YOGh<8b?)v8ZqC@?2!txd6m&r|kT$D29$in)tm*r_5%4>=*Y+w6noxv~X zOBo@36^rJ^L|Ck$4^|BKO#erJrODjiO=9TT*-ScLDwtH*v z>0(#I`LX!2fqTv7m4!XgEc5hlMIE!2Bx|;u`Ha{9DF0yc8RL#UCIMh{9TzNwtn#U-MZe$-n&8iGT4c zy4(WxG&Fj=rApcYUS9LI`KM}GEP2WZ)&uWku9>EyzcTXW+_dtpG=|R zf2>JcMLk`va%lDQqKXS=tS{v+aIu`;`|p(A8oAlEdh^;-_Z~Byzk&Apq|WV2cL4Y2 zbCS2L3B5^t6`!pT6ZpBgbVW>&Q9wic0mgYF)jW@q+c;OF;w7`5e9hXQkgag@IOEg# zi)G*6ygu*Tp6N02?KURaG!ptdEXqn>KXu&&X{ySl?vrK1(s6rJ6i$AeQqujmRO^a} zYDV?>`YmyrH)HeeXReX@;`>YW{bf^@`;OkhQLAOEF7|0GBjQ`bUOphI3}9Awe<^9d zS$1>!ue)oC`UG_X4kySgWSkJQ5JWcxHan;ef*^tdBZ3n^;WrCWBnm{v zbIbxF9R?#}CxC({^R|T~s>2`x5pDzkLi&(8M8fJ51b`5QbQoE5Qy@HI76M{>1Q9<0 z6ap6d69vSIM!^FdvjF-;4k9=K6ddme14TMM1mNLe4B$ZcUkD@$7{)j(Ah^Ro(T)#c zkr52SSO5o+FaZ<-MB+ga>i8f5M!}Ovut7lBTSy#4`~*-SGMNVjFB*jiA!fmm;30+} zf&x%@yanRzF-T;O;R%R!5aZ)Hh}a3B;E|U7fkF`77CZ?FVmLBv7d!zFX#GD?aCqJ! zMih;LgAnWEA$>9jQIPeaKidNE#21hxy2n5yvVahgi-?~93P8Z|ppZqk1xrS(PsGDc zi69EHK5u~GLBU}~qTtBLzaWWYeHalt0Th79Glk&*kv)bZAzlx1rb`?d5@>y%i4xB< z#&DqMwh+jO^@&8d#}Guq1W+In<mr_I(_L1Y?kdhrJR(#7_VP2l0etoajj(hesAL zAnYkP4x#|-1Aq|gL!#S)<1Ao^WG*6h0w@FmZ;y%geH_49z>pxsE})+|?NmM4zkMNj)6fwNA6$1sV5h@Aimgyr#lJRrI)5SC+oBJ3|90VmM;H)Y;(2>a^nxD*k>wZ~#}Gt8)+Y-d$#~K8J_vA@W1KjKAc7M> z;qywoXx|6OoECB77=kFk`XG<*lXzk>Ui69|AR((hc&!c3`v6(ss*eW+5AxbY^t=xc zkyRfKKt>vZNSFW$Urfe}_I&^%aeSY%@Fxmf^?`r-K1k&4G0{tY0MA+V5s)~BAPTTP z2nilzkmz|IS%)LmN8%WQh@AimfymQikZ9ir020^w1kSxBX#yyCBF_pI620aJu$)yN za(l!3d(3uP|AUVk^&U;uAPG3R#VU$UkZ9>NrJ$=&3c5_BpzAmay3nGaD}HAhJjh zbk>AGcvcfkmhplB08hjrU`5hcC|3p|Q>S3A3;ymn-ZeQ9E3zdVS`i_ZaKdOs zoRH-bQKZLnSw&8O6v8UK=|lU zqDY75a($doEQIUh0f9(7p^GTe;ki^Ffb1g)q5610@HpO<5JZBYOdk;mT|$^X9uORf zcW{Yxc$DZvZd*WML?15*-{2CtU4im^02y%>Av_PB*7dX z4+wm}&I5uI3BsZH0C-gg38VOUL3q~@B#|D^W%%GbJU|%3#{&Fx*CL?276Ik82q>>bK-n<@%8n7x zS_o(@1hf_+S_=`ag^1QdL~9|UwGh!-h-fWDv=$;-3lXh_gw{erYayYvkkDF4Xe}hP z77|(u39W^M)`F%HS0L0fC(R;F7?vJw;5yJiP!tl37bQIvS zf3U|0W&iMG!FN&sAUXuar1yBYM4&OGcN&o&6hA=@!5aiH~f*C_9)iUdo8ka>R~+DOiv!$!ae%uqj&{`VW#^yy zpBN{K74pC4hS1Pp0}N*4#*O+68asl$QJ>BX)cWJG2Vubj;!u1LiL(O+At8h_&+~V- zu{w%P`J-C!|3w$vM7HFR;e{Jp3;dTVAfGA|NWbLpS^#JF6(^9_68@A5PIM{;4rR88 z$b6531V2O|%m;Czldy0g`V;{PiC(ygJw@<8FcWZf4!Z>qktH8aFuNrzR{_9@c6E@$ zZvg}}(G!@^9@hWBh+g%B9EJ!UdJ4czOaZu=DF8P$1>okU z0NmshfSa9yD*D@_|ID}K_o84LD>R6~V(ZgjSq9=s7#bUS2W2=TfEmnSVeHH-959Zn zFc21AmD|~wt#b%w(AS0I^>O;a-adc09Uh!e4m<UY+r$h7z$euomWe^iV6|3P^> z8;UKzx}yCVnc(1iE9B-4onHS-T^ygfkno7*%Lw(+XR_8~SUz;*e>kd>^+Pv>{;3&Z zLW$mZPRbX$3G|C1dzLP1pb$1L_W>P|7Xoee40Vn z2?QGA_+1QVf9t$8#9iEFuIR?z|(oU;H*rD_7}kYkX03~B)=sR|$C;A4)e zn#frQJ>p0cxW~wOj{9jMvLy6~BSGdK!xAXxs)>h>P((Z;fpV|NF%~Z1#tWS9@V|>l z1<+U#`HnDN;D{1`7ZFj?SP?0Z#|wxk3H!SUe@hxy2G*T4t_??h67F{q5gpeDZUkvu z8%{e&gx^I(bX*?@E{tmfaYV_#i?AqpTpt2l7}th?h?2qIMMQL5AI_KK>Ttdr(+4>o zQ-;%EGI6|wd^e^H++6aQCP-^REOxvE!lf}y@LC{tObt9o4mVyx%EKIRG3lA#!6{kl^Dn9Y`EGXuO2TjcGxK zkH>T%bL2?lB}5L@0&WF*>!ZnO1A6;|9CJ$GcnQ7&y%pk=aBvAfUV?iJy)Dw@v>d%P zLXJ6g5Pz4jaFO)8hiVSg843>@&g2!r6j-$ht&9PW1!?qnSPcMxlcU6bS2x|E&}V3*&z)1;RSwe=7yTI^usT1;RSwe=7yT zI^usT1;RSwe=7yTI^usTg;e}oDWu-tI>FUKzg2>3g??)UR|@@B2(AbU{T)0I)H>1D2n43g#?QJkFGq{5|&pFkca|B`Lg2y5=o#a ze=-4y$6CTN)d4bApeSDgH9!Ugit^N5X&10g}ej+ z#Nq^s@;%89V(|h+`5yfQu{_oi_Dns9B?uJddjuE6@>omQ)9oOZBv6zuyn$GSCh{p;R<;_h6@qj>4z64Vc4+<3JOD+KMIDw)7zbIa?DDOH8#PeE9 z*mR612o&Wv0iGyOlrMP>#0$0--_tN4o-9z5@0k`5!U`7UT@`~6AW)QVO$b7uK#%3i zZ2}>jU{StE2;l{a@^=;_*jjwqf*>T=T6`IQASBpYd|7)SL=r5@_s%$oEKrm$dk!RE z1&Z=zz<~rnuqc16yw(zui3SpI0!8_QCIK%{lrJL;BtQa1`Len|9xg*@W){f9WeCl# z0(rO$p&3#j50@b{%L(M+GK6L-fxKLXuxulcm&*{gB@Xg(8N$+jKwd6GSn3YQ!(|9% z$v`6C55C#a)-%}1@7Eze7luXmc0g|CImpd92f5kiAUDq(zv^-&4U&IO5(XNpNphB)B&i65Mq@{K=K$CJ=E~zY^Rg6p#qTz`<@jtU8` zaU^gkoh$KYcN71&yWxLW$gi`ZwxGbB9~26g+3*PtwTiK2c>B^!n435|fDqh?L^9}( zp)lCYFczJ`Mt`W6?!X9Li{u4h92uKJ(O;l5K|f5<4=Z=hPu#)c7I<|I)rzqosiR@X zf~-zLH~7YW%MKQ^0+2^f(9_7@cq4xM;(z=U9rq{Z0DuIWpYJE;5{_Fx`dAcpyn95a zj0V0XFek;*^j9UVzw|t7pA$tVWF_V4p+o=viq04NAZZkoH*#cgF8jpgts8S~=T0^L z)E@Kr=GB3lBRxiC4}N~Tv25fMb6vM{%=KZlljL7lqLYRmeGXF@Uac@PGVmzrYpT+x zM^}5pey(`3U$5un&rXGkyxe11zh12w%pR$ZX^ISLFX&kL?fsUNno^k~7l)VJq%S0l ze$ro|k>hbLhS{I-$`-qRw2s8hsP|oxpm6Z2ic)H88$zQPgWl+qqjyJ z8NHFXbbiy@h-bs!uy1Nxf&7e>2`5_1I(KT6>dd#+BULmySx0!TP%>58oi#jY zQ$M0#yzzUc?aus5i>5z)-%>CjxsmlPr@Cy}hv#1aszLn%hvdB8lEJ=#f!9i|O5yHN z27_N?3%YI758MrVV}DZTDpYOYJb0K=^x)a(kfC$q6Zhw7*`-Psb=)_`cv9!I7Jma5 zYcI`rR(N`=v8DGqIMOn`g{A76w{)d}=RhBAJ~=u4=#$z1Zi{*8l-RGy(tCF$X;jVS z`TdbwjmPt1=XajH>ZUMQvJ}h8qqjcq^($W2I(n5g*VFG1cv@XO%HBP;ui z&~qKJg$p`AHoRdu`RR0yXzw?9pZHMig=|dq%ItH~TOW$$-9%l@bI#uIb* zm7OHD6(a>FTS>9)KR%pmd_eF1e0v~TmS*^Ep#9MMH7ETXjXGElXU~5h5w!kQhy9Vd zmWFH2$G^RGUHM~oFGEGWvkmiw+~-Jb&o6DEjXJj#95!^mcztR9@Z;&uS8cT3IODrz z(!uk~&Q_irB@7;Jn&N-{UM%$L2K}AUO&833^A3r}AKtrMiNP-`aQ&`{m6Ge^rZv;Sl_t&38rSm&&>7LtT`XrstRwM)HiJL zit>ueo08s?B}H)GHhIy>@98`Dm@7r5RUt9 zyVy@6-!0d1HI%y8@z+xKkJsJU*)Hi%GgV6V99*y(QfdkNuw=+`IVODC;cYGjj@B`< zKbjxJnC2c|Fnr5KKioNCf5;umjWlMT-(Z7zzt{Taw>4MwTyIS6I`8(P@3iw^zd`N& z6~%pl8;G0xelzJ{4 zbo6&=$_o#qFK0c(j-0OgXX%|c5^R_iZB|Ek z?d5CxLmT7nxmLLN6Q@=m)yUPnmL_krLuGHQz``@jdG1l8w6O zL*{61%Qg@6aF9J5^5BexOL}6VVe{9z7vZGi8$GZ&N3LZnzio?RcDGbp#=U##XP;g< z>Q8kYc5Nt3)_=ABYD!|cJY=A=@5bn5YM)=2)Rn1h<}crz@L7eM2ae7r=G<^Obm#9v za8v7x8|#+oW>nra&z=9!y*K0NhmC~;`}f`nz49)5{?~s$K8bR$O_pOfZ@8L4Z#By6 zDswaJ&P$OBQGhO7Ol)>YlB9fQQf_?9& zjJCgV(ciPz^U^#Xx7NcXkK{V)2p7bZDjq; zLH(i7(yQVfYcH7R9^Y`@U2A{#q3k1XSNWH3F2o0ow238EtK;nGwIk;)wCG!Z%hes8 zT6xtoru_jPGrjlqk@n`dEgQ-w7Y?XhG=K5WhC%TT!xpE&Rd#C8ZttBEK3WclOEztY z?5uk+dU-(Z=(T%$+uUmuf%<@(A5SvXV`2KYWT+qL;bdn7z;Nc(e_*B(uTF z8&-p@e67@@e`DXXxX)%aXDsLsmoR1WhGG#U$KDrLf95$mkmYOpl-;WgTk<|#G+)(v zvzLm^v4|;=FTOCdE888K1EtN_)b}(@r8_R7{_?&yrz*2!?bpJu9GC3ME}X*1EHn-I zwLGC|bEBftyjrL9?wRzVx7v`igH-mxMSXsZn`N}T zHnJ+EfBpXMqi&Zwh7#+@PZbI`cePeN$(*^PxrW^Lg$kt|bO&4#K3*A`N*|u?l9Qq6 z?0^2)hm+CC_PIp%t-bLvL!3RF;m5F1y4i2rr1-V@ z3lw8=Lq6e#+)ZYn>=AigJHt(*w|kFf0`i&1!)k4=`$Z4Rv(qijA@L)| z399;8w!3ZVv{d_cMad?=;#-(=Kl;VLZqZ7}A2OA=&e-2P_3Q9rzwYB7H$p6Sd0g4K zs4b;e=0R1|!pj~Ve|xkQMQ!O*etr_;ddm5$y^$SVD!Vy)Nmb;Jb2*DsE{6BfHO;dv zU+j-e^R0tjdkL8t2wsx$;-?9woY6@3R56 z&6|oct*&1bd&BCstqO&B)sLF;{d)5|zcu?HPm$sNsa ze|SXx;vl!^D^xQCFRi$LN zocwpNx*yN{GHSg)^0{Q!D8bFCmN3G2hfSi{7w~Cl?;(qxG0DyS$lz`xx9A-UY&w)U zr%AEWul30H*i+}7{ZHO@*q6MvBy&E!cLR*|@LG?-gE>g+u2Oci9Sclsf-O=LQTF0l z!|nPIOiG_}c0=199cLL`yY$`HuZiW_%Seqj5)LTI6vw7{o^abjYA7gK|H=Ad)A{|f z>@8Ur3Nr>cc&X0+R{J3es=t0tv`2bhJaY4?#VJQkROzY)kEnesMv|=cCA(nNKVI*g zgTVUT>z?knj|RCtnUyGxAR1O*lK$mvUl6)~o|{_wIhXl2x>xFLY%?oJyEvELn-O9i zlHTiC^)t_{&*}3$w-=sd z?R?z4Zo!X9>GnT#Eau#qeuRK6$WY9cg?;h}Sgn{_n5*X5dt~XBt?r#h%WknEP6nNk z3m?g|#cJg;$T~Ow+6p|{P<-D%}*>cb*lDvJ>O|;5tz8>*|5X5ID&#Tv5v#Wa?wU03= zuQa;%Jp+jN_|*$TFDw08sF36H!Q8LPqiS-L`K+fpidPk~0{eqEK91@vP^!7MQ6E&W zQ4K14d_QIVjMA|1z|(033R&}_=1G2#g90vkKK3~4^Wof1wZ4HyO3>bWxIu-ed0%_$ z-aR&f=okua0F-~M<(Gym<&MYTmzyvCE!3JEsU>qf02^Z*n zAxZtQr7~aJ?>Hl>nWMEK8fMbQPNZ2zUfWpqd11J8ClxsI(m;kg&N5*H|OxX&+7X`WYE1MLS zeJz*sS`1%5(;BNHUt#0APn@O!&C0H~y-foK<~lzalB@IdkeDl9wNUr*hAr2=NHpVh z_gT5_DbH8Wpv~M-8RxfH_j=&4dd}|Ro3O@M8Ts3I-R&F&;!<`jQk*SGTdZ3ZmwzB_ zW{*MQFrxa-J5d#iwZ5=)la1?)!@at}>5FyG`c#;}Rc*hgJ^#-4)4PXH)p)Y6k1ld( z%Dji~>kNxMaxc`&J|pgx&B3&Lvb4p>dD*Pgu~Jo>jYdZ584KGC#?65_;PI4fpH&y) zULDrHjfW-4S${)^wK#`7(!(_$6VC-^Uv!XBlBXNHNfv)8{u1nU zhIgKkr@xpoD?3%zY}R?CKH6gOsyIZeQx>)ogPTr+n?Ba2l*D{FG?^YG@nw_Jh5wf9 zrH&YMs~d*yIWuiG4q`Y8lqkDqCS)GM1-z z3_^+{3A6X!yMH=HBCgn>h&St!Ld9Xy>XUVP@i3?pB*!D7esq?24ZNvzElvCpC zK2M%j<)JFZ{9&X}>we>JNySrXRY}ff)hH^Sx9=93Cr#RxY zu<}S}#AUvcRg|P`P084*1Zh1REW1trW8mHhxSF4_+&W!;Upw>LNy9%bNIP1wneGT{1Gga4-uBfAohjR7 z6~A75a461`B%Ya}HDiZ^G~60LEFz(JSk^Orv3O*vI;Yb8`59QE9x>(GT?bW7UM=7n zclp9K9yUocED_hTsl~8tV}Xs=-#v3!sWa{5XeI1}mUY|jxJn<%e3h>#iTDBH$~q_U$(P(vRNSr!S7ID)}q<-oFLvh^t;v?H)1Ckl72$Nv+pbeBg*ZruF{l zJ=t${-V#8aEaV3=bnnX2l$@Ur4wWC$uJU+LT5@GAu<;Y_Cg_93=#Flk@BAp=vprOt zvALrwk)+U z#?U^iD9}IJezs~~SK?9|C;HAS#nfu2d@$*Yv2-c8 z<+1DYBiCn{1{B%u6a?uZ-(L7i+$4YQT~T#3bn^0OFtHr7{gLcUxN?cd)$PgBXp66ETWms9yeTQM%tn_AdUv}%uron$IYECTMaE1BLpqNDzJ$h?{^&K_OE7b3^de%v;l0R(Q>(TUf zO;@&3^v~W)uEAG75T#!Ity%u_-Qu#RP|DzS#>w+*fkC%rF3i^!48O@l?RGmt3XypC zWbmDY8ket=Z61{7Gr#1_8qA$j)Kd0&aK3yFCe#(nys$34Z+#vqvMTPa+_natY3Vx? z{QC3l6FdOLr2&rV)hT9khBF!}%f3aucB)(Z7Ne_P7ie>m5w zW~ILU%ZGEZIP9YqwjBS2-87Rqa`|y~+BLVL0Zf5j%AjkzS$k&hHvY@H%6#9&6-z$F zM>b{dR`pU^`u=Fi!`NYqlP>Kp&}dDsbq16?ylwCI+h=UVD^ro#xxyv`4yjsnW6lRM zR}&8-?*1=uOe?Ti?PiL)>wzpUtV3o-s)-FQKA|ya8~xLQl;PPoyd{*IZGgq86=nA% zi;I{^KJ_jTGq1`!(kFlKB_D$VO^5Q}49hz2J=nuqe)xuK_iN%Jh$qk$gjX7j5fB?U z+%jc}b8SS8>1wgTW{^070;V*e0) zGCF(Yg!i42bffyd*>p%|WNFJ;^M=*BdpxizODVX91+`}Tm28na!4lId_z-F^wMkzQ zeHbJC3J!bXU-e&;d%qn`GhD6T(AqQV>6K8R8Cf3OZ&_!yA1kxeugR?5RT}x210<+^ zgHH~%sL85jr)@N}*uBMpt!~>r+Gs+4XFRJvp zOFtald~w#GZMq9Y9CEArAaUEKzkAJ>>HK;^$S4@s5eG-+u#Nkj>h_Kr4LCa2re4E0 zJd(-fc1ckGm9GtZ%E?ZTVe>+1E9a}7bgF&+b!9p-V&G{Yz3kqgW(Yi9?h<8|R=klR z>wW4NVOK34+HH1! zulg>t_Y8ayGQ{BCM?mIDo*BnNXAlJH{ZWh6%0b6N`uB-9=yX}sOD4!}t6xn^SAw0U zb%AkV$+a!+rckbQW`~}*RITjAfs`r$ez;mL>nTz3D>?~#2YSU6p zylV9pu3>7W+z7Ihv}y|0fY%)w8nv=>Z(liJ*KVU>Y$G`n@{^e9srBYhl#}y}l6-jeX*Be=FumZ%>to zO>v&_{%Dr;F5h@~)fd0qMrW#*n?~F#37T%^f$Q#SOX|I9M;uRPNmrH3p{F8erOTg5 zoR$kdot7ni)<=747Fvg&V_EBtW}EosaL<$n$76TsoDC|B`Sf^iL9$D2k;zo{&GLUZ zn0HDfd`ITDM#9}Ux%rC8sWj&qRcB2+)4!C@&w+ci`7Cm3muFD?r!QR@YaI5Rw^fXa zsCLjc!=6826OWa5+~rwhA`Jt>YGyJsOw{3vlpwjuKrW{ZWgHz3WPenv%>w0}W>j#m z35tJ6Txbe8Xjs-c&Y<8p@=ckWpG?h$_4jk*oTeMczd5vQQ%hA!)DNs&9M(Z(KOqVz zN@|~lzLiVq(MR#~x5PUGeeZ6<9sOymJi$-G3VZFqgTQ^$PN!)tJnJJdGb`03E=7K> zpQF*EtEZp$}$HdDQx6nX-qP=ysRhHQmiW88{0=d<$O0}-P7rEAW+h91n&45U8^3|J=c(BFEct9zkLXX zgwj3|rq%zi0@7m&lm~0L7r#)GZM^*{D0SM`@BnxiN-f=d8y-u@06lHt%O22)hf4>z zb-+V4)BZ`cQZ`(dpPQwoxPvA6ywO4HKKrdEX|9fzaj)PC^ww64S0H4-n`qsgJ+nAL zYG7m=uJQI6_(Fw4o<$s}CZdC7X2ZW!;(9aIKqBS zj!31PI{rW6zB;b1WLY;5+=D|1?h-cc5(w_@?jGFT-GW3 z^X{E_a_=AfSS-4_tG-&*CEcqR$RWL3U{fH1VZx9fJ1fusHRMkd_%?v((m?Xw_+k!Tz85ZYlVCo&GgoLO5$e>CT*7fU=ud)FddNcjKSYT(nSzxDd zy#Rn51N@=j*H4c5ap{)}PyXB>noah``wxMVv@V|rlUw+jl|zcMuQpYG7fKGq#y!Xy zSIN`7PSZvuRXO#Qoo z&9E(g{8p5m0f7)i6Ch579}EbZ=fECW4Cyl*QjPiP+;g^##0&Ebx>^yHKn~xA{BLev zab}{A5Su9_(bEH)X5jZ!9|xY%Xk;}-gb9Ns{a0l0_x6_G4Ls}<%}rI0PVsbFzv(dq zCFM{B5gfn={Y+c(%>lGspH!=Ca4`?lf*>ErxlHxkjUHN7+!Xne-x?xR@+c#`-M*LDjE0izn`9 ztj~ZM5O{C=JI$bSe3&b+9H3Vp!<)=tfY5prZQWX?&ExXP8xjx*aR++!kX@&ciitPoz zpetSQtFH2U-a!ike>M6$OYwAb7#G)ziQZ|Ich%HvWo}d4`Mr;C!IZcpbTqa~wcL*` zV*Kua<+An6*9gwD2u?sV_x^&NX74JxzWaGb-p*ZnBv6d|bOeokG(J_$D(bCYi*M(h z^j#~m`gvmabwtHy+uWzZc7qG*mWZ3Yp)@uWbvSmyp(*#CdOv{$Y2_xKY`M9n(?M5f=HxI zCwe-!A^y^c;f2Q79Aw1~Zan=SmHNldUwS~6i)B}h>)BL10|}4Nyzkojma&72Jedzy zQ4kv*;SIuDV(j~NCS|4|Ldk|u1;L^(zBbJf<2Mt#4|~fACP4CSU{;Au#QGJ;+;rTO zfFBVbf@U_ksIZyZtBKle>~j*nz~lK`F!}l2#RK-=8u;2oK(>db9xOlJwsftyrRk)0 zMh>kxm=DZSpR6{1O*j)H?^s)4>w8QQK9d4G=7D1URB2BImhr~t(0UC2_79StXoBFt zD0h$Xfg39?3`M}p9=3M`SLcj&->C$e?C1iGIVcCxbl<^3lgzE6?PUY5aUkTj+1xyO zv4^*zT@c6&4@+Sy{H-Kf)O@XNpp*?tnqZi&YixYm9B59}+w3037sA_GBR&FdRvGG5 z08OI&ZyozK`?Te{uXC~pfkB7Mj>01fFV`(}QoUlEYkVW}22 z_*hsgYzFk-BH9kqY)&+z92?z3&v0-}D|Mgu3qA(hL{zsy339DcZF_}%K4LMiXmdPq zhK8~~%E%JvOkOB$hrGr&^LRsE<*XmuhNAGZbo#42`zyoy#q4vl%3;1i^|HGS>;hNy zfObf6n_u=8TbOIOL1bIb_M$}m7qeav5{b{)@ogxxY>jTs-Oerb(p&!f86fdQ#*BJf zg=9fVV@2Ce=9Hi72|c#ETrSo0O-^?fp?l$5gymrn6NwfchNMMnp?B@Y|6n5=7nGFF zRXUx3w7k&RrezZi(iu1qK;BLj#5&t!t}$kU=vfJ$iD(lY{h3?SKLj1|H1Moe|J0tohpi$@`O?E^Q5# z{x77hxYGpwRSNnefy)n9(!aM^_{kzj!8z@N|1PfHPpFAU7Q*k1-&;jA z+cXum9lottv!^$hKW2?9J^7_khH4dt`8CZO8pYp520hD_}`+d z&>Q?Fu>Db+eB0mUcy|N09p&!IC2}>&#}U$IwlXa=`^T{h*n0h%muriDnM1l&%lHF+ z8XffPKXiiM@A><}!mkyMpT%B5c~AJmasz%;rIVgNJTTItaNE+NCBK>1u8WR4{=<#_ zPs8p_UZ6>KepO;q0_Eu+xzF9K>!E-7Yu-rhyY{s~3-|C(zVAzR)&jJL;$9=Nn0pwE zc(!-G1(Xo2EeG~Be(oc$xT!ztYz!6pIpG-4o=VMB*%ZlnmK0%oloTc36a*~|w>KM! zmG(n96;{`q$tM1$l;Px?s^wocI#X1w0=OwA=0gikwwx<$Z=Nl^o?~WxL@4?FnZdb$ zTK;W55q2B|`OiVHp5G=453}&K6zpZ)ze|GMpfdZVtx8TU8ss+d2X(cttgoK8HFQs0 zuNb2aGgJ-fdq9)lN{0N*Z{0=y1pSTip%Ku-eTN412*ECK>!mC(lJwJ(SY`m_< zDl^ue4ipF!|JD}sA5zyL5g6nHJ?Yx-W{0n@kJL8ye-`5m^ec6bd5!gdt^(=hp1Z+V zD{7ZAfM&hR!f>18;WYCTjy3<~6Gmt2o1@=l>S`U2D*Y*pTyEdbuCes`K$cLsc2~2! z3N(EF$K>#9WoxFW6+P%}Led^!j<4WrQJZ4r0+&dp+|~Ijma1QNwZ@uk{(HmL;$&|- zl;1$obazckXz8H2^8K4-fdB`9gq{IG@8*tc;7s>Wg1N9f&x<-IGE!;ocV~X_G||Er z@2(M1Xm~0DMB4k zrrf~jB%U4kyk}(q$`*}CYj|d~qTDUF-hdikOU*6;x1H+~N1AoLfZMzVk>dt5$T~;3 z%Lvq%MfKb6vC|clGWBgyl8_gf=L12Gb#z@$zZO&bo2Vy)sCER)2@v2xV`dq1 zv@CgUf+9((kBb@G6?G~@ElWz323_Fwj18%K$iPhVI_FJ4S2ijKof$1FtPuM{s~@HH zr9;)azDo>idS*K<4tz6=8S9uMZ%HP#J)bJdE$2C$#9?Q!FCLttwbbCGj`2>+FK0}< z9@|6JIr`dZuBch~W=xq@L5S?H(toZa>0QX|Rk2XX1!1CaxmFqej_bNQ9R5i8MOI>K z?dJ}T3M-CY>461fSj& zg-AJxe0oL>)3M!Vf6SvEgKDgLrX=5bc$*{hBZzxhu4TkUzvjZ!HlVU&**k+ft)rC_ zNPFa+HVP@#?gz&JCj~A7^P|M3lUe#?_gA>}OwL(mi_&f-TL$!)7qg}X9U|ThJrDFp z7gEUe_GK`rBRuIhxi}0nruX|wk(Sh$_Q*K7bI*y-{>FZN)*RuuM=RC3Yea$U! zt6i@a-iux3)C07RcuznoFbmu$1<(8F>;x=|Q@J8<@f z_?>yVz(e%}aLA=-(#W{0wd($2llNB4G5zjAzU-()y+FtVe(soyAaY2XEwEi?E@AT!8xDcA}!QgdY>U5ZE&_KAHgUTed zoyhjQFBXe>QnPL*Q4M~L4em^M`WSEYTPNI4NASY%AveKGny9k(5}8_&!YaVoU13)Z zzzM~Gf!`Ds0h;i9{0`L8=82yx--m4s3Gbd~qw9TJlU0lZWB|VTg>lDaaTfhjcjO$N zM;5YK$0vkUoOr}y<$Bj?_4_vB;z=C74mwMPh(5vSQYN5rB5~zPL-y&0V)u<{KJrIS zVfeUq1CJKPdk(k5u$ZhQt#&R-BWW%<6k1JUN-tG@lKiAHPO z<+{Y?j!VB$N{iC0=Dh=MWLoU#r~USMdk+@>R8QTDeYG2>L_8q$;_!3Nwo&zQao*i% zyR8pBw$91EG?SQ)@t9NZHg*AP9^!l5@2>k$`a2;GB0as3k z?$PPNtSCilX6$1TWG;o!Q%ttnc4;)8IQ4k>x4mXwJ!Y`R4n!40k+Y>8@--;Fb3l=d zMmv(}!}z|@qDY;Mv+()U$0NbuMlNwzlJ;wh5%76yo)6SXaHaR{sLk`n_)CkK=8;akaGTds zDj(nRjtuF<%W8Dwz3s~$;d%d4LGf56LGgHv~+55plq%t?f9j9F97B#(a4^sJbUv^1 zeD3Xi$Mdw@@p2dJ{kZ<}dYpqD-N@ST_s!>j-@MN8S9ak4c2Lv*$qsz2e{7`xkGtpp z=|qPA{qA|D-?q;G$KCTZn~aKpR|0~N223d8V_SA`>vo9iaGT(-L7|0wA{o#*gp zBxU?Rm-G*>6|fMp{MYXn`~-#mgSE8{X!zfby7?!N82z)>t+n6TbRx`A9db~muqeVjp$nw0sxS>&NATv=CKz?Ibz4}I$LPjm0 zWUz)Y94Mp6*6BU#x|&kmvXY7L^h#wvdOGV&oQ-pK*?KupduP6JbrCk#%0!a@!bn)t z==9z4*xs6vPrA>tG*uuxjTn5rf0mIRcq_oZ>ssy;xSw2Z2?lE_Z!xx%Po(ktpfwn2 zetT<<10l5t-8F|;Ookxim3v$>!}nk%X?{^ZEA|?W z2x3Fns?ia-2xj!i9GaEz zu0jVtYDR$l1jASeg$QOMuP+{)AQ9ggwNQc`a{Y2gsS6DiLaoE?1!j#t3X_SfSE;dx1cSIc;%kP zF;b6~*RxyRO{kbSV&2;l@hWXplT|@1w5x0iQQ`x3&l^!6{}_&ytGLhD{wNHjt>|sD zleR-JiZ<|teTkrZ-%H=IzC}M_1h-_hUz8*x>m$Stp{u2W!CjMICicY*_(o+q5276r zV4JWrJD=l_#sRx#wa5MXm6Qx>?#E0gZAyKrGe~`D&6WjmsITD-Vz6i-KZIYT{A3so zllp@=f@M!6VIsLr0veTsPupm^pZ^++{12=9BM1p&=+S?0%wR;BwTKQuyS;=BJ41*b z<@PEbH7S!YF{g1TI-L=GcKO@7@jFN=+dbHkxW&oS_awhV{9_6Ygweu4Wb7}DHc)!< zdayOh;H#NkErfq(cZ`Z&G}M>nNS?8@_x8izblWtH7nE0n4k08M0FRLujo{bKF%K)R zzl5azUdSewo((!xd&m8?7Pe%yi8%iVW`q9%0={oSup#m1MPE4vRVpwl84`Q3rov_- z*efG*-GHlTtqOVY9AitR){%l1@UM^`vNTh$u;u843Lx^l%9DrVi6WfKx*5j>0KM?d`{o5bv`&q5#0}}Q-$Y&|MIc<^HRF5RBdj4aSn;v$ z^|Jo%lAMNq<^1im;ndFn9swP&@k>jK4C(pl4F_kAe67$%;E88=ij&EQ`R_A(ZIM@J z^YkXg_MK0@@*GxVS&p?`%m>-8-zm9F)ytJwVYu1&Kh->pUy6=a5tL<#iJJwev2b3z zKR4aJf?=wq6k($2UktkE+r6DaryD$*>xGpkp9KH7Es8p9 zhO!kob8pgHXngwhXA|5sJt*vG3d$Hf)5ou|we!6Ah2g7;J^U)NlXztuO|iDmO)Mg* zKRmGZp2FOP6KI>O+5GwJf6Odz2iyFM1>2qW#gZNM2Zxv!-4Q~QGsa2R3_qu?ww2?YN<9>eI7EZr`Y0u?Jg#zq2#72B_a30xjYi? z2@XR_X)!@wp7~Y|?vn&Y!q~$egH;%ey}j#q01efIR;FB;vbMAP zeoc?{WC`M;<`P~c2{hL#nh0;9F7`2Vs&yQgkV7 zlKwe`_--MiObx!=^AGRpzv4OC^xJ0JLDg>OT4Eq)eKH>)GYq;Pxi_LaVwy{mZyZM6}H|Ge?I38Z*=eY=yl z^KXJLroR+?G5=2nU%!3s>Yt-8=06jC{X8k*U!$*4^})CmVWhSLntjT5VPl??qXyCM zGGY2n4>LnJcI8(`6U9qLS1sM~7zp_ItzQk6G;CEZ%st;G6KaEpevG@{3)FDea@$C^^3|yvhi3oB{Iz=eX+8L|KoxxR_!eJiNZ<)Lin^iAwmj5o#!3zn=4c(H~QV2m0~`USCgJ7O^rQt`TN;%Hfl zCKKeKxbh?Ov}lwq>WYi$`J6DE8q}uMdR}9O5o!N!c~CPMYg*tQ@~9=aVZ*0hNfHjI zTJi5ItgJGA%4R=m_aRJC;V6hGSU~q#7tSU&%OhwFVPhHteOM=DW=+G0 zQdWcdo!%ODZh;w=e4qJD%n`~8l{z?wgoI-({`)P6`&&_>;V-Tl9DB5eP9#*i{CJqA~%~7arMy{iDl^2#a=3mDjDaxxKR^Kr0=-x;hG`hvLL#MjhSo_ zew67;*Z7JNZt|7ffISbr;()UKV&%O3NtG3KOL&YieapW4E?Xe4c~C~o2Vb4NxOy9H zkYU>g4^hh4@suhfJ_8|jacD3^jy%rbbnbh=o3v54c>TB|QjiWPFv380%Pg@q^cC3a z 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 - - - - - CUPS Implementation of IPP - - - -

    Scope

    - -

    Identification

    - -

    This document provides an overview of the Internet Printing Protocol -("IPP") version 1.1 as implemented in the Common UNIX Printing System -("CUPS") version 1.2. - - - -

    Document Overview

    - -

    This document is organized into the following sections: - -

    - - - -

    Overview

    - -

    CUPS 1.1 implements IPP/1.1 and the operations and attributes -defined in the "IPP: Job and Printer Set Operations", -"IPP/1.1: Output-bin Attribute Extension", and "IPP/1.1: finishings -'fold',' trim', and 'bale' attribute values extension" specifications. - -

    CUPS also provides 13 new operations and many new attributes to -support multiple IPP printers and printer classes on a single host. - -

    IPP URIs

    - -

    CUPS supports both the "http" and "ipp" methods. The following -resource names are used: - -

    - -
    method://hostname:port/ - -
    Can be used for all "get" operations. - -
    method://hostname:port/admin - -
    Used for all administrative operations. - -
    method://hostname:port/classes/name - -
    Specifies a printer class. - -
    method://hostname:port/jobs/id - -
    Specifies a job. - -
    method://hostname:port/printers/name - -
    Specifies a printer. - -
    - -

    So a typical printer URI would be "ipp://foo.bar.com/printers/LaserJet". - -

    In addition, the CUPS server also supports normal browser access to -"method://hostname:port/admin/", "method://hostname:port/classes/", -"method://hostname:port/jobs/", and "method://hostname:port/printers/" -to view and manage resources on the server dynamically. - -

    CUPS IPP Operations

    - -

    CUPS provides 13 extension operations in addition to most of the -standard IPP and registered extension operations: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Operation NameCUPSCodeBrief Description
    Print-Job1.00x0002Print a file.
    Validate-Job1.00x0004Validate job attributes.
    Create-Job1.20x0005Create a print job.
    Send-Document1.20x0006Send a file for a print job.
    Cancel-Job1.00x0008Cancel a print job.
    Get-Job-Attributes1.00x0009Get job attributes.
    Get-Jobs1.00x000AGet all jobs.
    Get-Printer-Attributes1.00x000BGet printer attributes.
    Hold-Job1.20x000CHold a job for printing.
    Release-Job1.20x000DRelease a job for printing.
    Pause-Printer1.00x0010Pause printing on a printer.
    Resume-Printer1.00x0011Resume printing on a printer.
    Purge-Jobs1.00x0012Purge all jobs.
    Set-Job-Attributes1.20x0014Set attributes for a pending or held job.
    CUPS-Get-Default1.00x4001Get the default destination.
    CUPS-Get-Printers1.00x4002Get all of the available printers.
    CUPS-Add-Modify-Printer1.00x4003Add or modify a printer.
    CUPS-Delete-Printer1.00x4004Delete a printer.
    CUPS-Get-Classes1.00x4005Get all of the available printer classes.
    CUPS-Add-Modify-Class1.00x4006Add or modify a printer class.
    CUPS-Delete-Class1.00x4007Delete a printer class.
    CUPS-Accept-Jobs1.00x4008Accept jobs on a printer or printer class.
    CUPS-Reject-Jobs1.00x4009Reject jobs on a printer or printer class.
    CUPS-Set-Default1.00x400ASet the default destination.
    CUPS-Get-Devices1.20x400BGet all of the available devices.
    CUPS-Get-PPDs1.20x400CGet all of the available PPDs.
    CUPS-Move-Job1.20x400DMove a job to a different printer.
    -
    - -

    Operations

    - -

    The following sections describe the operations supported by CUPS. -In the interest of brevity, operations which use only the standard -IPP attributes are not described. - -

    Print-Job Operation

    - -

    The Print-Job operation (0x0002) prints a file. - -

    Print-Job Request

    - -

    The following groups of attributes are supplied as part of the -Print-Job request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer. - -

    - -

    Group 2: Job Template Attributes - -

      - -

      "job-billing" (text(MAX)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a billing string that is logged - with the page accounting information. - -

      "job-sheets" (1setof type3 keyword | name(MAX)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies one or two banner pages that - are printed before and after any files in the print job. The - name of "none" is reserved to indicate that no banner page - should be printed. If the client does not specify this - attribute then the value of the "job-sheets-default" printer - object attribute is used. - -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value. - -

      "media" (1setof type3 keyword | name(MAX)): - -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output - media. If the client does not specify this attribute then the - value of the "media-default" printer object attribute is used. - -

      Note: Standard IPP only allows specification of a single - media attribute value. - -

      Other Job Template Attributes - -

    - -

    The Print-Job request is followed by a file to be printed. - -

    Print-Job Response

    - -

    The following groups of attributes are send as part of the Print-Job -Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Job Attributes - -

      - -

      Standard Job Attributes - -

    - -

    Create-Job Operation

    - -

    The Create-Job operation (0x0005) creates a new, empty print job. - -

    Create-Job Request

    - -

    The following groups of attributes are supplied as part of the -Create-Job request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer. - -

    - -

    Group 2: Job Template Attributes - -

      - -

      "job-billing" (text(MAX)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a billing string that is logged - with the page accounting information. - -

      "job-sheets" (1setof type3 keyword | name(MAX)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies one or two banner pages that - are printed before and after any files in the print job. The - name of "none" is reserved to indicate that no banner page - should be printed. If the client does not specify this - attribute then the value of the "job-sheets-default" printer - object attribute is used. - -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value. - -

      "media" (1setof type3 keyword | name(MAX)): - -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output - media. If the client does not specify this attribute then the - value of the "media-default" printer object attribute is used. - -

      Note: Standard IPP only allows specification of a single - media attribute value. - -

      Standard Job Template Attributes - -

    - -

    Create-Job Response

    - -

    The following groups of attributes are send as part of the -Create-Job Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Job Attributes - -

      - -

      Standard Job Attributes - -

    - -

    Set-Job-Attributes Operation

    - -

    The Set-Job-Attributes operation (0x0014) changes the attributes of -an active (not completed) job. - -

    Set-Job-Attributes Request

    - -

    The following groups of attributes are supplied as part of the -Set-Job-Attributes request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri) and "job-id" (integer) -

      OR -

      "job-uri": - -

      The client MUST supply a URI for the specified printer and - a job ID number, or the job URI. - -

    - -

    Group 2: Job Template Attributes - -

      - -

      "job-sheets" (1setof type3 keyword | name(MAX)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies one or two banner pages that - are printed before and after any files in the print job. The - name of "none" is reserved to indicate that no banner page - should be printed. If the client does not specify this - attribute then the value of the "job-sheets-default" printer - object attribute is used. - -

      Note: Standard IPP only allows specification of a single - job-sheets attribute value. - -

      "media" (1setof type3 keyword | name(MAX)): - -

      The client OPTIONALLY supplies one or more media attributes - specifying the size, type, source, and color of the output - media. If the client does not specify this attribute then the - value of the "media-default" printer object attribute is used. - -

      Note: Standard IPP only allows specification of a single - media attribute value. - -

      Other Job Template Attributes - -

    - -

    Set-Job-Attributes Response

    - -

    The following groups of attributes are send as part of the Set-Job-Attributes -Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Get-Default Operation

    - -

    The CUPS-Get-Default operation (0x4001) returns the default printer -URI and attributes. - -

    CUPS-Get-Default Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Get-Default request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "requested-attributes" (1setOf keyword) : - -

      The client OPTIONALLY supplies a set of attribute names - and/or attribute group names in whose values the requester is - interested. If the client omits this attribute, the server - responds as if this attribute had been supplied with a value of - 'all'. - -

    - -

    CUPS-Get-Default Response

    - -

    The following groups of attributes are send as part of the -CUPS-Get-Default Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Printer Object Attributes - -

      - -

      The set of requested attributes and their current values. - -

    - -

    CUPS-Get-Printers Operation

    - -

    The CUPS-Get-Printers operation (0x4002) returns the printer -attributes for every printer known to the system. This may include -printers that are not served directly by the server. - -

    CUPS-Get-Printers Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Get-Printers request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "limit" (integer (1:MAX)): - -

      The client OPTIONALLY supplies this attribute limiting the - number of printers that are returned. - -

      "printer-info" (text(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies this attribute to - select which printers are returned. - -

      "printer-location" (text(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies this attribute to - select which printers are returned. - -

      "printer-type" (type2 enum): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a printer type enumeration to - select which printers are returned. - -

      "printer-type-mask" (type2 enum): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a printer type mask - enumeration to select which bits are used in the "printer-type" - attribute. - -

      "requested-attributes" (1setOf keyword) : - -

      The client OPTIONALLY supplies a set of attribute names - and/or attribute group names in whose values the requester is - interested. If the client omits this attribute, the server - responds as if this attribute had been supplied with a value of - 'all'. - -

    - -

    CUPS-Get-Printers Response

    - -

    The following groups of attributes are send as part of the -CUPS-Get-Printers Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Printer Object Attributes - -

      - -

      The set of requested attributes and their current values for - each printer. - -

    - -

    CUPS-Add-Modify-Printer Operation

    - -

    The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or -modifies an existing printer on the system. - -

    CUPS-Add-Modify-Printer Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Add-Modify-Printer request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer. - -

    - -

    Group 2: Printer Object Attributes - -

      - -

      "banner-end-default" (name(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a banner page name that is - printed after files in a job. The reserved name "none" is used to - specify that no banner page should be printed. - -

      "banner-start-default" (name(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a banner page name that is - printed before files in a job. The reserved name "none" is used to - specify that no banner page should be printed. - -

      "device-uri" (uri): - -

      The client OPTIONALLY supplies a device URI for the - specified printer. - -

      "ppd-name" (name(127)): - -

      The client OPTIONALLY supplies a PPD name for the specified - printer. - -

      "printer-is-accepting-jobs" (boolean): - -

      The client OPTIONALLY supplies this boolean attribute - indicating whether or not the printer object should accept new jobs. - -

      "printer-info" (text(127)): - -

      The client OPTIONALLY supplies this attribute indicating the - printer information string. - -

      "printer-location" (text(127)): - -

      The client OPTIONALLY supplies this attribute indicating a - textual location of the printer. - -

      "printer-more-info" (uri): - -

      The client OPTIONALLY supplies this attribute indicating a - URI for additional printer information. - -

      "printer-state" (type2 enum): - -

      The client OPTIONALLY supplies this attribute indicating the - initial/current state of the printer. Only the "idle" and "stopped" - enumerations are recognized. - -

      "printer-state-message" (text(MAX)): - -

      The client OPTIONALLY supplies this attribute indicating a - textual reason for the current printer state. - -

      "requesting-user-name-allowed" (1setof name(127) | delete) -

      OR -

      "requesting-user-name-denied" (1setof name(127) | delete): - -

      The client OPTIONALLY supplies one of these attributes to - specify an access control list for incoming print jobs. To allow - all users access to a printer, use the delete tag for the - attribute value. - -

    - -

    The CUPS-Add-Modify-Printer request can optionally be followed by a PPD -file or System V interface script to be used for the printer. The -"ppd-name" attribute overrides any file that is attached to the end of -the request with a local CUPS PPD file. - -

    CUPS-Add-Modify-Printer Response

    - -

    The following groups of attributes are send as part of the -CUPS-Add-Modify-Printer Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Delete-Printer Operation

    - -

    The CUPS-Delete-Printer operation (0x4004) removes an existing -printer from the system. - -

    CUPS-Delete-Printer Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Delete-Printer request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer. - -

    - -

    CUPS-Delete-Printer Response

    - -

    The following groups of attributes are send as part of the -CUPS-Delete-Printer Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Get-Classes Operation

    - -

    The CUPS-Get-Classes operation (0x4005) returns the printer -attributes for every printer class known to the system. This may -include printer classes that are not served directly by the server. - -

    CUPS-Get-Classes Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Get-Classes request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "limit" (integer (1:MAX)): - -

      The client OPTIONALLY supplies this attribute limiting the - number of printer classes that are returned. - -

      "printer-info" (text(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies this attribute to - select which printer classes are returned. - -

      "printer-location" (text(127)): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies this attribute to - select which printer classes are returned. - -

      "printer-type" (type2 enum): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a printer type enumeration to - select which printer classes are returned. - -

      "printer-type-mask" (type2 enum): - -

      (CUPS 1.1 and higher) - -

      The client OPTIONALLY supplies a printer type mask - enumeration to select which bits are used in the "printer-type" - attribute. - -

      "requested-attributes" (1setOf keyword) : - -

      The client OPTIONALLY supplies a set of attribute names - and/or attribute group names in whose values the requester is - interested. If the client omits this attribute, the server responds as - if this attribute had been supplied with a value of 'all'. - -

    - -

    CUPS-Get-Classes Response

    - -

    The following groups of attributes are send as part of the -CUPS-Get-Classes Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Printer Class Object Attributes - -

      - -

      The set of requested attributes and their current values for - each printer class. - -

    - -

    CUPS-Add-Modify-Class Operation

    - -

    The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class or -modifies and existing printer class on the system. - -

    CUPS-Add-Modify-Class Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Add-Modify-Class request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer class. - -

    - -

    Group 2: Printer Object Attributes - -

      - -

      "member-uris" (1setof uri): - -

      The client OPTIONALLY supplies the "member-uris" set - specifying the printers and printer classes that are part of the class. - -

      "printer-is-accepting-jobs" (boolean): - -

      The client OPTIONALLY supplies this boolean attribute - indicating whether or not the class object should accept new jobs. - -

      "printer-info" (text(127)): - -

      The client OPTIONALLY supplies this attribute indicating the - printer information string. - -

      "printer-location" (text(127)): - -

      The client OPTIONALLY supplies this attribute indicating a - textual location of the class. - -

      "printer-more-info" (uri): - -

      The client OPTIONALLY supplies this attribute indicating a - URI for additional class information. - -

      "printer-state" (type2 enum): - -

      The client OPTIONALLY supplies this attribute indicating the - initial/current state of the class. Only the "idle" and "stopped" - enumerations are recognized. - -

      "printer-state-message" (text(MAX)): - -

      The client OPTIONALLY supplies this attribute indicating a - textual reason for the current class state. - -

      "requesting-user-name-allowed" (1setof name(127)) -

      OR -

      "requesting-user-name-denied" (1setof name(127)): - -

      The client OPTIONALLY supplies one of these attributes to - specify an access control list for incoming print jobs. To allow - all users access to a class, use the delete tag for the - attribute value. - -

    - -

    CUPS-Add-Modify-Class Response

    - -

    The following groups of attributes are send as part of the CUPS-Add-Modify-Class Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Delete-Class Operation

    - -

    The CUPS-Delete-Class operation (0x4007) removes an existing printer -class from the system. - -

    CUPS-Delete-Class Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Delete-Class request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer class. - -

    - -

    CUPS-Delete-Class Response

    - -

    The following groups of attributes are send as part of the -CUPS-Delete-Class Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Accept-Jobs Operation

    - -

    The CUPS-Accept-Jobs operation (0x4008) sets the -"printer-is-accepting-jobs" attribute to true for the specified printer -or printer class. - -

    CUPS-Accept-Jobs Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Accept-Jobs request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer or printer class. - -

    - -

    CUPS-Accept-Jobs Response

    - -

    The following groups of attributes are send as part of the -CUPS-Accept-Jobs Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Reject-Jobs Operation

    - -

    The CUPS-Reject-Jobs operation (0x4009) sets -the"printer-is-accepting-jobs" attribute to false for the specified -printer or printer class. - -

    CUPS-Reject-Jobs Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Reject-Jobs request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer or printer class. - -

    - -

    Group 2: Printer Object Attributes - -

      - -

      "printer-state-message" (text(MAX)): - -

      The client OPTIONALLY supplies this attribute indicating a - textual reason for the current printer state. - -

    - -

    CUPS-Reject-Jobs Response

    - -

    The following groups of attributes are send as part of the -CUPS-Reject-Jobs Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Set-Default Operation

    - -

    The CUPS-Set-Default operation (0x400A) sets the default printer -destination for all clients when a resource name of "/printers" is -specified. - -

    CUPS-Set-Default Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Set-Default request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri): - -

      The client MUST supply a URI for the specified printer or - printer class. - -

    - -

    CUPS-Set-Default Response

    - -

    The following groups of attributes are send as part of the -CUPS-Set-Default Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    CUPS-Get-Devices Operation

    - -

    The CUPS-Get-Devices operation (0x400B) returns all of the supported -device-uri's for the server (CUPS 1.1 and higher). - -

    CUPS-Get-Devices Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Get-Devices request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "device-class" (type1 keyword): - -

      The client OPTIONALLY supplies a device class keyword to select - which devices are returned. - -

      "limit" (integer (1:MAX)): - -

      The client OPTIONALLY supplies this attribute limiting the number of - devices that are returned. - -

      "requested-attributes" (1setOf keyword) : - -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'. - -

    - -

    CUPS-Get-Devices Response

    - -

    The following groups of attributes are send as part of the -CUPS-Get-Devices Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: Device Object Attributes - -

      - -

      The set of requested attributes and their current values for - each device. - -

    - -

    CUPS-Get-PPDs Operation

    - -

    The CUPS-Get-PPDs operation (0x400C) returns all of the locally -available PPD files on the system (CUPS 1.1 and higher). - -

    CUPS-Get-PPDs Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Get-PPDs request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "limit" (integer (1:MAX)): - -

      The client OPTIONALLY supplies this attribute limiting the number of - PPDs that are returned. - -

      "ppd-make" (text(127)): - -

      The client OPTIONALLY supplies a printer manufacturer to select - which PPDs are returned. - -

      "requested-attributes" (1setOf keyword) : - -

      The client OPTIONALLY supplies a set of attribute names and/or - attribute group names in whose values the requester is interested. If - the client omits this attribute, the server responds as if this - attribute had been supplied with a value of 'all'. - -

    - -

    CUPS-Get-PPDs Response

    - -

    The following groups of attributes are send as part of the -CUPS-Get-PPDs Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Group 2: PPD Attributes - -

      - -

      The set of requested attributes and their current values for each - PPD file. - -

    - -

    CUPS-Move-Job Operation

    - -

    The CUPS-Move-Job operation (0x400D) moves an active print job to a -different printer (CUPS 1.1 and higher). - -

    CUPS-Move-Job Request

    - -

    The following groups of attributes are supplied as part of the -CUPS-Move-Job request: - -

    Group 1: Operation Attributes - -

      - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.1 of the IPP Model and - Semantics document. - -

      "printer-uri" (uri) and "job-id" (integer) -

      OR -

      "job-uri": - -

      The client MUST supply a URI for the specified printer and - a job ID number, or the job URI. - -

    - -

    Group 2: Job Template Attributes - -

      - -

      "job-printer-uri" (uri) - -

      The client MUST supply a URI for a printer on the same server. - -

    - -

    CUPS-Move-Job Response

    - -

    The following groups of attributes are send as part of the -CUPS-Move-Job Response: - -

    Group 1: Operation Attributes - -

      - -

      Status Message: - -

      The standard response status message. - -

      Natural Language and Character Set: - -

      The "attributes-charset" and "attributes-natural-language" - attributes as described in section 3.1.4.2 of the IPP Model and - Semantics document. - -

    - -

    Attributes

    - -

    CUPS provides many extension attributes to support multiple devices, -PPD files, standard job filters, printers, and printer classes. - -

    Device Attributes

    - -

    Device attributes are returned by the CUPS-Get-Devices operation and -enumerate all of the available hardware devices and network protocols -that are supported by the server. - -

    device-class (type2 keyword)

    - -

    The device-class attribute specifies the class of device and can be -one of the following: - -

      - -
    • "file" - a disk file. - -
    • "direct" - a parallel or fixed-rate serial data port, - currently used for Centronics, IEEE-1284, and USB printer - ports. - -
    • "serial" - a variable-rate serial port. - -
    • "network" - a network connection, typically via AppSocket, - HTTP, IPP, LPD, or SMB/CIFS protocols. - -
    - -

    device-info (text(127))

    - -

    The device-info attribute specifies a human-readable string describing -the device, e.g. "Parallel Port #1". - -

    device-make-and-model (text(127))

    - -

    The device-makr-and-model attribute specifies a device -identification string provided by the printer connected to the device. -If the device or printer does not support identification then this -attribute contains the string "unknown". - -

    device-uri (uri)

    - -

    The device-uri attribute specifies a unique identifier for the -device. The actual format of the device-uri string depends on the value -of the device-class attribute: - -

      - -
    • "file" - The device-uri will be of the form - "file:/path/to/filename". - -
    • "direct" - The device-uri will be of the form - "method:/dev/filename", where method may be "parallel" or "usb" - in the current implementation. - -
    • "serial" - The device-uri will be of the form - "serial:/dev/filename?baud=value+parity=value+flow=value". - The baud value is the data rate in bits per second; the - supported values depend on the underlying hardware. - The parity value can be one of "none", "even", or "odd". - The flow value can be one of "none", "soft" (XON/XOFF - handshaking), "hard" or "rts/cts" (RTS/CTS handshaking), - or "dtrdsr" (DTR/DSR handshaking). - -

      The URI returned by CUPS-Get-Devices will contain the - maximum baud rate supported by the device and the best - type of flow control available ("soft" or "hard"). - -

    • "network" - The device-uri will be of the form - "method://[username:password@]hostname[:port]/[resource]", - where method may be "http", "ipp", "lpd", "smb", or - "socket" in the current implementation. - -

      The URI returned by CUPS-Get-Devices will only contain - the method name followed by two slashes ("method://"). - It is up to the client application to add the appropriate - host and other information when adding a new printer. - -

      The URI returned by Get-Printer-Attributes and - CUPS-Get-Printers has any username and password information - stripped; the information is still stored and used by the - server internally to perform any needed authentication. - -

    - -

    Job Template Attributes

    - -

    blackplot (boolean)

    - -

    The blackplot attribute specifies whether HP-GL/2 plot files should be -rendered entirely in black ink (blackplot=true) or using the colors and shades -specified in the file (blackplot=false). The default value is false. - -

    brightness (integer(0:200))

    - -

    The brightness attribute specifies the overall brightness of the printed -output in percent. A brightness of 100 is normal, while 200 is twice as -bright and 50 is half as bright. The default value is 100. - -

    Brightness is applied to the Cyan, Magenta, Yellow, and Black values using -the function "f(x) = brightness / 100 * x". - -

    columns (integer(1:4))

    - -

    The columns attribute specifies the number of columns to generate when -printing text files. The default value is 1. - -

    cpi (type2 enum)

    - -

    The cpi attribute specifies the number of characters per inch when -printing text files. Only the values 10, 12, and 17 are currently -supported. The default value is 10. - -

    fitplot (boolean)

    - -

    The fitplot attribute specifies whether to scale HP-GL/2 plot files to -fit on the selected media (fitplot=true) or use the physical scale specified -in the plot file (fitplot=false). The default value is false. - -

    gamma (integer(1:10000))

    - -

    The gamma attribute specifies the luminance correction for the output. -A value of 1000 specifies no correction, while values of 2000 and 500 will -generate lighter and darker output, respectively. The default value is -1000. - -

    Gamma is applied to the Red, Green, and Blue values (or luminance for -grayscale output) using the function "f(x) = x(1000/gamma)". - -

    hue (integer(-180:180))

    - -

    The hue attribute specifies a color hue rotation when printing image -files. The default value is 0. - -

    job-billing (text(MAX))

    - -

    (CUPS 1.1 and higher) - -

    The job-billing attribute provides a text value to associate with a job -for billing purposes. - -

    job-hold-until (keyword | name(MAX))

    - -

    (CUPS 1.1 and higher) - -

    The job-hold-until attribute specifies a hold time. In addition to the -standard IPP/1.1 keyword names, CUPS supports name values of the form -"HH:MM" and "HH:MM:SS" that specify a hold time. The hold time is in -Greenwich Mean Time (GMT) and not in the local time zone. If the -specified time is less than the current time, the job is held until the -next day. - -

    job-sheets (1setof type3 keyword | name(MAX))

    - -

    (CUPS 1.1 and higher) - -

    The job-sheets attribute specifies one or two banner files that are printed -before and after a job. The reserved value of "none" disables banner printing. -The default value is stored in the job-sheets-default attribute. - -

    If only one value is supplied, the banner file is printed before the job. -If two values are supplied, the first value is used as the starting banner -file and the second as the ending banner file. - -

    job-originating-host-name (name(MAX))

    - -

    (CUPS 1.1.5 and higher) - -

    The job-originating-host-name attribute specifies the host -from which the job was queued. The value will be the hostname or -IP address of the client depending on whether hostname -resolution is enabled. The localhost address (127.0.0.1) is -always resolved to the name "localhost". - -

    This attribute is read-only. - -

    lpi (type2 enum)

    - -

    The lpi attribute specifies the number of lines per inch when -printing text files. Only the values 6 and 8 are currently supported. -The default value is 6. - -

    mirror (boolean)

    - -

    The mirror attribute specifies whether pages are mirrored on -their X axis, which is useful for printing transfer images on -special media. The default value is false. - -

    natural-scaling (integer(1:1000))

    - -

    (CUPS 1.1.9 and higher) - -

    The natural-scaling attribute specifies the scaling of image files with -respect to the natural image size. A value of 100 specifies that the image -file should exactly the natural size, while 50 is half the natural size -and 200 is twice the natural size. The default value is 100. - -

    The ppi option can be used to override the natural resolution of the -image, which controls the natural size. - -

    number-up-layout (type2 keyword)

    - -

    (CUPS 1.1.15 and higher) - -

    The number-up-layout attribute specifies the order each input -page is placed on each output page. The following keywords are -presently defined: - -

      - -
    • btlr - Bottom to top, left to right
    • - -
    • btrl - Bottom to top, right to left
    • - -
    • lrbt - Left to right, bottom to top
    • - -
    • lrtb - Left to right, top to bottom (default)
    • - -
    • rlbt - Right to left, bottom to top
    • - -
    • rltb - Right to left, top to bottom
    • - -
    • tblr - Top to bottom, left to right
    • - -
    • tbrl - Top to bottom, right to left
    • - -
    - -

    page-border (type2 keyword)

    - -

    (CUPS 1.1.15 and higher) - -

    The page-border attribute specifies whether a border is -draw around each page. The following keywords are presently -defined: - -

      - -
    • double - Two hairline borders are drawn
    • - -
    • double-thick - Two 1pt borders are drawn
    • - -
    • none - No border is drawn (default)
    • - -
    • single - A single hairline border is drawn
    • - -
    • single-thick - A single 1pt border is drawn
    • - -
    - -

    page-bottom (integer(0:MAX))

    - -

    The page-bottom attribute specifies the bottom margin in points (72 points -equals 1 inch). The default value is the device physical margin. - -

    page-label (text(MAX))

    - -

    (CUPS 1.1.7 and higher) - -

    The page-label attribute provides a text value to place in -the header and footer on each page. If a classification level is -set on the server, then this classification is printed before -the page label. - -

    page-left (integer(0:MAX))

    - -

    The page-left attribute specifies the left margin in points (72 points -equals 1 inch). The default value is the device physical margin. - -

    page-right (integer(0:MAX))

    - -

    The page-right attribute specifies the right margin in points (72 points -equals 1 inch). The default value is the device physical margin. - -

    page-set (type2 keyword)

    - -

    The page-set attribute specifies which pages to print in a file. The -supported keywords are "all", "even", and "odd". The default value is -"all". - -

    page-top (integer(0:MAX))

    - -

    The page-top attribute specifies the top margin in points (72 points -equals 1 inch). The default value is the device physical margin. - -

    penwidth (integer(0:MAX))

    - -

    The penwidth attribute specifies the default pen width in micrometers -when printing HP-GL/2 plot files. The default value is 1000 (1 millimeter). - -

    position (type2 keyword)

    - -

    The position attribute specifies the location of image files on the -media. The following keyword values are recognized: - -

      - -
    • center - Center the image on the page (default) - -
    • top - Print the image centered at the top of the page - -
    • left - Print the image centered on the left of page - -
    • right - Print the image centered on the right of the page - -
    • top-left - Print the image at the top left corner of - the page - -
    • top-right - Print the image at the top right corner of - the page - -
    • bottom - Print the image centered at the bottom of - the page - -
    • bottom-left - Print the image at the bottom left - corner of the page - -
    • bottom-right - Print the image at the bottom right - corner of the page - -
    - -

    ppi (integer(1:MAX))

    - -

    The ppi attribute specifies the resolution of an image file in pixels -per inch. The default value is the resolution included with the file or -128 if no resolution information is available. - -

    prettyprint (boolean)

    - -

    The prettyprint attribute specifies whether text files should be printed -with a shaded header and keyword highlighting (prettyprint=true) or without -additional formatting (prettyprint=false). The default value is false. - -

    saturation (integer(0:200))

    - -

    The saturation attribute specifies the color saturation when -printing image files. A saturation of 100 is normal, while values of 50 -and 200 will be half and twice as colorful, respectively. The default -value is 100. - -

    scaling (integer(1:1000))

    - -

    The scaling attribute specifies the scaling of image files with -respect to the selected media. A value of 100 specifies that the image -file should fit 100% of the page, or as much as possible given the -image dimensions. The default value is unspecified. - -

    The scaling attribute overrides the ppi attribute if specified. - -

    wrap (boolean)

    - -

    The wrap attribute specifies whether long lines should be wrapped -(wrap=true) or not (wrap=false) when printing text files. The default -value is true. - -

    PPD Attributes

    - -

    ppd-natural-language (naturalLanguage)

    - -

    The ppd-natural-language attribute specifies the language encoding -of the PPD file (the LanguageVersion attribute in the PPD file). If the -language is unknown or undefined then "en" (English) is assumed. - -

    ppd-make (text(127))

    - -

    The ppd-make attribute specifies the manufacturer of the printer -(the Manufacturer attribute in the PPD file). If the manufacturer -is not specified in the PPD file then an educated guess is made using -the NickName attribute in the PPD file. - -

    ppd-make-and-model (text(127))

    - -

    The ppd-make-and-model attribute specifies the manufacturer and model -name of the PPD file (the NickName attribute in the PPD file). If the -make and model is not specified in the PPD file then the ModelName or -ShortNickName attributes are used instead. - -

    ppd-name (name(255))

    - -

    The ppd-name attribute specifies the PPD filename on the server -relative to the model directory. The forward slash (/) is used to -delineate directories. - -

    Printer Attributes

    - -

    job-k-limit (integer)

    - -

    (CUPS 1.1 and higher) - -

    The job-k-limit attribute specifies the maximum number of kilobytes that -may be printed by a user, including banner files. The default value of 0 -specifies that there is no limit. - -

    job-page-limit (integer)

    - -

    (CUPS 1.1 and higher) - -

    The job-page-limit attribute specifies the maximum number of pages that -may be printed by a user, including banner files. The default value of 0 -specifies that there is no limit. - -

    job-quota-period (integer)

    - -

    (CUPS 1.1 and higher) - -

    The job-quota-period attribute specifies the time period used for quota -calculations, in seconds. The default value of 0 specifies that the limits -apply to all jobs that have been printed by a user that are still known to -the system. - -

    job-sheets-supported (1setof type3 keyword | name(MAX))

    - -

    (CUPS 1.1 and higher) - -

    The job-sheets-supported attribute specifies the available banner files. -There will always be at least one banner file available called "none". - -

    printer-type (type2 enum)

    - -

    The printer-type attribute specifies printer type and capability bits for -the printer or class. The default value is computed from internal state -information and the PPD file for the printer. The following bits are defined: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    BitDescription
    0x00000001Is a printer class.
    0x00000002Is a remote destination.
    0x00000004Can print in black.
    0x00000008Can print in color.
    0x00000010Can print on both sides of the page in hardware.
    0x00000020Can staple output.
    0x00000040Can do fast copies in hardware.
    0x00000080Can do fast copy collation in hardware.
    0x00000100Can punch output.
    0x00000200Can cover output.
    0x00000400Can bind output.
    0x00000800Can sort output.
    0x00001000Can handle media up to US-Legal/A4.
    0x00002000Can handle media from US-Legal/A4 to ISO-C/A2.
    0x00004000Can handle media larger than ISO-C/A2.
    0x00008000Can handle user-defined media sizes.
    0x00010000Is an implicit (server-generated) class.
    - -

    printer-type-mask (type2 enum)

    - -

    (CUPS 1.1 and higher) - -

    The printer-type-mask attribute is used to choose printers or classes with -the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits are defined -identically to the printer-type attribute and default to all 1's. - -

    requesting-user-name-allowed (1setof name(127))

    - -

    (CUPS 1.1 and higher) - -

    The requesting-user-name-allowed attribute lists all of the users that are -allowed to access a printer or class. Either this attribute or the -requesting-user-name-denied attribute will be defined, but not both. - -

    requesting-user-name-denied (1setof name(127))

    - -

    (CUPS 1.1 and higher) - -

    The requesting-user-name-denied attribute lists all of the users that are -not allowed to access a printer or class. Either this attribute or the -requesting-user-name-allowed attribute will be defined, but not both. - -

    Printer Class Attributes

    - -

    member-names (1setof name(127))

    - -

    The member-names attribute specifies each of the printer-name attributes of -the member printers and classes. Each name corresponds to the same element of -the member-uris attribute. - -

    member-uris (1setof uri)

    - -

    The member-uris attribute specifies each of the printer-uri attributes of -the member printers and classes. Each URI corresponds to the same element of -the member-names attribute. - - - - - diff --git a/doc/ja/images/accept-jobs.gif b/doc/ja/images/button-accept-jobs.gif similarity index 100% rename from doc/ja/images/accept-jobs.gif rename to doc/ja/images/button-accept-jobs.gif diff --git a/doc/ja/images/add-class.gif b/doc/ja/images/button-add-class.gif similarity index 100% rename from doc/ja/images/add-class.gif rename to doc/ja/images/button-add-class.gif diff --git a/doc/ja/images/add-printer.gif b/doc/ja/images/button-add-printer.gif similarity index 100% rename from doc/ja/images/add-printer.gif rename to doc/ja/images/button-add-printer.gif diff --git a/doc/ja/images/add-this-printer.gif b/doc/ja/images/button-add-this-printer.gif similarity index 100% rename from doc/ja/images/add-this-printer.gif rename to doc/ja/images/button-add-this-printer.gif diff --git a/doc/ja/images/cancel-all-jobs.gif b/doc/ja/images/button-cancel-all-jobs.gif similarity index 100% rename from doc/ja/images/cancel-all-jobs.gif rename to doc/ja/images/button-cancel-all-jobs.gif diff --git a/doc/ja/images/cancel-job.gif b/doc/ja/images/button-cancel-job.gif similarity index 100% rename from doc/ja/images/cancel-job.gif rename to doc/ja/images/button-cancel-job.gif diff --git a/doc/ja/images/change-settings.gif b/doc/ja/images/button-change-settings.gif similarity index 100% rename from doc/ja/images/change-settings.gif rename to doc/ja/images/button-change-settings.gif diff --git a/doc/ja/images/continue.gif b/doc/ja/images/button-continue.gif similarity index 100% rename from doc/ja/images/continue.gif rename to doc/ja/images/button-continue.gif diff --git a/doc/ja/images/delete-class.gif b/doc/ja/images/button-delete-class.gif similarity index 100% rename from doc/ja/images/delete-class.gif rename to doc/ja/images/button-delete-class.gif diff --git a/doc/ja/images/delete-printer.gif b/doc/ja/images/button-delete-printer.gif similarity index 100% rename from doc/ja/images/delete-printer.gif rename to doc/ja/images/button-delete-printer.gif diff --git a/doc/ja/images/edit-configuration-file.gif b/doc/ja/images/button-edit-configuration-file.gif similarity index 100% rename from doc/ja/images/edit-configuration-file.gif rename to doc/ja/images/button-edit-configuration-file.gif diff --git a/doc/ja/images/export-samba.gif b/doc/ja/images/button-export-samba.gif similarity index 100% rename from doc/ja/images/export-samba.gif rename to doc/ja/images/button-export-samba.gif diff --git a/doc/ja/images/help.gif b/doc/ja/images/button-help.gif similarity index 100% rename from doc/ja/images/help.gif rename to doc/ja/images/button-help.gif diff --git a/doc/ja/images/hold-job.gif b/doc/ja/images/button-hold-job.gif similarity index 100% rename from doc/ja/images/hold-job.gif rename to doc/ja/images/button-hold-job.gif diff --git a/doc/ja/images/manage-classes.gif b/doc/ja/images/button-manage-classes.gif similarity index 100% rename from doc/ja/images/manage-classes.gif rename to doc/ja/images/button-manage-classes.gif diff --git a/doc/ja/images/manage-jobs.gif b/doc/ja/images/button-manage-jobs.gif similarity index 100% rename from doc/ja/images/manage-jobs.gif rename to doc/ja/images/button-manage-jobs.gif diff --git a/doc/ja/images/manage-printers.gif b/doc/ja/images/button-manage-printers.gif similarity index 100% rename from doc/ja/images/manage-printers.gif rename to doc/ja/images/button-manage-printers.gif diff --git a/doc/ja/images/manage-server.gif b/doc/ja/images/button-manage-server.gif similarity index 100% rename from doc/ja/images/manage-server.gif rename to doc/ja/images/button-manage-server.gif diff --git a/doc/ja/images/modify-class.gif b/doc/ja/images/button-modify-class.gif similarity index 100% rename from doc/ja/images/modify-class.gif rename to doc/ja/images/button-modify-class.gif diff --git a/doc/ja/images/modify-printer.gif b/doc/ja/images/button-modify-printer.gif similarity index 100% rename from doc/ja/images/modify-printer.gif rename to doc/ja/images/button-modify-printer.gif diff --git a/doc/ja/images/move-job.gif b/doc/ja/images/button-move-job.gif similarity index 100% rename from doc/ja/images/move-job.gif rename to doc/ja/images/button-move-job.gif diff --git a/doc/ja/images/move-jobs.gif b/doc/ja/images/button-move-jobs.gif similarity index 100% rename from doc/ja/images/move-jobs.gif rename to doc/ja/images/button-move-jobs.gif diff --git a/doc/ja/images/print-test-page.gif b/doc/ja/images/button-print-test-page.gif similarity index 100% rename from doc/ja/images/print-test-page.gif rename to doc/ja/images/button-print-test-page.gif diff --git a/doc/ja/images/publish-printer.gif b/doc/ja/images/button-publish-printer.gif similarity index 100% rename from doc/ja/images/publish-printer.gif rename to doc/ja/images/button-publish-printer.gif diff --git a/doc/ja/images/reject-jobs.gif b/doc/ja/images/button-reject-jobs.gif similarity index 100% rename from doc/ja/images/reject-jobs.gif rename to doc/ja/images/button-reject-jobs.gif diff --git a/doc/ja/images/release-job.gif b/doc/ja/images/button-release-job.gif similarity index 100% rename from doc/ja/images/release-job.gif rename to doc/ja/images/button-release-job.gif diff --git a/doc/ja/images/restart-job.gif b/doc/ja/images/button-restart-job.gif similarity index 100% rename from doc/ja/images/restart-job.gif rename to doc/ja/images/button-restart-job.gif diff --git a/doc/ja/images/save-changes.gif b/doc/ja/images/button-save-changes.gif similarity index 100% rename from doc/ja/images/save-changes.gif rename to doc/ja/images/button-save-changes.gif diff --git a/doc/ja/images/search.gif b/doc/ja/images/button-search.gif similarity index 100% rename from doc/ja/images/search.gif rename to doc/ja/images/button-search.gif diff --git a/doc/ja/images/set-allowed-users.gif b/doc/ja/images/button-set-allowed-users.gif similarity index 100% rename from doc/ja/images/set-allowed-users.gif rename to doc/ja/images/button-set-allowed-users.gif diff --git a/doc/ja/images/set-as-default.gif b/doc/ja/images/button-set-as-default.gif similarity index 100% rename from doc/ja/images/set-as-default.gif rename to doc/ja/images/button-set-as-default.gif diff --git a/doc/ja/images/set-printer-options.gif b/doc/ja/images/button-set-printer-options.gif similarity index 100% rename from doc/ja/images/set-printer-options.gif rename to doc/ja/images/button-set-printer-options.gif diff --git a/doc/ja/images/show-active.gif b/doc/ja/images/button-show-active.gif similarity index 100% rename from doc/ja/images/show-active.gif rename to doc/ja/images/button-show-active.gif diff --git a/doc/ja/images/show-all.gif b/doc/ja/images/button-show-all.gif similarity index 100% rename from doc/ja/images/show-all.gif rename to doc/ja/images/button-show-all.gif diff --git a/doc/ja/images/show-completed.gif b/doc/ja/images/button-show-completed.gif similarity index 100% rename from doc/ja/images/show-completed.gif rename to doc/ja/images/button-show-completed.gif diff --git a/doc/ja/images/show-next.gif b/doc/ja/images/button-show-next.gif similarity index 100% rename from doc/ja/images/show-next.gif rename to doc/ja/images/button-show-next.gif diff --git a/doc/ja/images/show-previous.gif b/doc/ja/images/button-show-previous.gif similarity index 100% rename from doc/ja/images/show-previous.gif rename to doc/ja/images/button-show-previous.gif diff --git a/doc/ja/images/sort-ascending.gif b/doc/ja/images/button-sort-ascending.gif similarity index 100% rename from doc/ja/images/sort-ascending.gif rename to doc/ja/images/button-sort-ascending.gif diff --git a/doc/ja/images/sort-descending.gif b/doc/ja/images/button-sort-descending.gif similarity index 100% rename from doc/ja/images/sort-descending.gif rename to doc/ja/images/button-sort-descending.gif diff --git a/doc/ja/images/start-class.gif b/doc/ja/images/button-start-class.gif similarity index 100% rename from doc/ja/images/start-class.gif rename to doc/ja/images/button-start-class.gif diff --git a/doc/ja/images/start-printer.gif b/doc/ja/images/button-start-printer.gif similarity index 100% rename from doc/ja/images/start-printer.gif rename to doc/ja/images/button-start-printer.gif diff --git a/doc/ja/images/stop-class.gif b/doc/ja/images/button-stop-class.gif similarity index 100% rename from doc/ja/images/stop-class.gif rename to doc/ja/images/button-stop-class.gif diff --git a/doc/ja/images/stop-printer.gif b/doc/ja/images/button-stop-printer.gif similarity index 100% rename from doc/ja/images/stop-printer.gif rename to doc/ja/images/button-stop-printer.gif diff --git a/doc/ja/images/unpublish-printer.gif b/doc/ja/images/button-unpublish-printer.gif similarity index 100% rename from doc/ja/images/unpublish-printer.gif rename to doc/ja/images/button-unpublish-printer.gif diff --git a/doc/ja/images/use-default-config.gif b/doc/ja/images/button-use-default-config.gif similarity index 100% rename from doc/ja/images/use-default-config.gif rename to doc/ja/images/button-use-default-config.gif diff --git a/doc/ja/images/view-access-log.gif b/doc/ja/images/button-view-access-log.gif similarity index 100% rename from doc/ja/images/view-access-log.gif rename to doc/ja/images/button-view-access-log.gif diff --git a/doc/ja/images/view-error-log.gif b/doc/ja/images/button-view-error-log.gif similarity index 100% rename from doc/ja/images/view-error-log.gif rename to doc/ja/images/button-view-error-log.gif diff --git a/doc/ja/images/view-page-log.gif b/doc/ja/images/button-view-page-log.gif similarity index 100% rename from doc/ja/images/view-page-log.gif rename to doc/ja/images/button-view-page-log.gif diff --git a/doc/ja/images/cancel.gif b/doc/ja/images/cancel.gif deleted file mode 100644 index b182a5d87a40c72c4dde1afb78faeee6450fb85a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 496 zc-nLKbhEHb3}p~uXc1sI%fN7+mFuFE9PH0Wy59{AeNtTXqPy$uvZbF7 z9Qc0i>d(iIf4zP8@9(ewBm%{MqRvIBi6yBi3gww4844j8sS56%z5xu1KUo;L7z7w} z7=Qre7zWmV3Mzd9f(#j}*5$n3SHQ!@N z?HAJ)YbF&qaMX0RnSN_v6}!KQk3CpNqQ4@UG1ic8J)_LRQ!B49v2s+@hh-T#2pDp5 zvL_mFav8I7*3@z(YjB1z#&Ga+^YItBwKB9DsaiAhTh7&D;^Zsf*=oqd&&e=<0e|#v zzIaVW|K*1b)m-LrF6LRZR)co|U(K4CdfdF~>yI(8^0#QN$<*Z9rC+DFsF;g~o1K-Z zu5=;;_jA2;{_7f9-*x(T89sjQJVQ-OpUZ+lL0_JUosXj|Tkycao$A~N6dx5b+~Q_` z7$TD)&feS29v^BYYapTJF2h!OM&N;?jtV#HqzHwC1qZm7q!)73p4xI?Qje6akcZDh zjZxRw0%`sO9T5p;T$Y}quIO - + - - +

    Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@

    +
    - - - An Overview of the Common UNIX Printing System - - - - - - - - - -
    CUPS Logo

    An Overview of the
    - Common UNIX Printing System,
    - Version 1.2

    - -

    July 3, 2004
    - Michael Sweet, Easy Software Products
    - Copyright 1998-2004, All Rights Reserved.

    -
    - -
    -New Outline:
    -
    -New Features:
    -
    -1. Networking
    -   a. IPv6
    -        i. Next-generation Internet support
    -       ii. ????
    -   b. Domain sockets
    -        i. Enhanced performance under load for local clients.
    -       ii. Authentication without passwords on platforms that support it.
    -   c. CUPS browsing updates
    -        i. "Delete" bit for printers
    -       ii. "lease-time" for printers so that clients and servers don't need
    -          the same browse timeout/interval settings
    -      iii. Additional attributes/default options for network-wide defaults
    -       iv. Network default printer
    -        v. Ability to control send and receive protocols independently
    -   d. Rendevous support
    -   e. LDAP support
    -   f. Per-printer sharing
    -
    -2. IPP Support
    -   a. Notifications
    -   b. Document object
    -   c. Send-URI, Print-URI
    -   d. Other stuff?
    -   e. Add/delete device operations
    -
    -3. Scheduler
    -   a. Backchannel support
    -   b. Port monitor support
    -   c. Device monitor
    -      i. Dynamic device discovery/management
    -   d. All errors include a localized message.
    -   e. Fine-grain policies, server default + per-printer
    -   f. UTF-8 throughout
    -
    -4. Web Interface
    -   a. cupsd.conf interface
    -   b. Move-Job
    -   c. Export printers to windows
    -   d. Per-printer sharing controls
    -   e. Per-printer access control lists 
    -   f. Policy stuff
    -
    -5. I18N
    -   a. Support for ... character sets
    -   b. All commands and messages are localized
    -   c. Character set transcoding
    -   d. ... , and Japanese localizations
    -
    -6. Drivers
    -   a. New HP-RTL driver.
    -
    -
    - -

    This whitepaper describes the Common UNIX Printing -SystemTM (CUPSTM), a portable and -extensible printing system for Linux®, -MacOS® X, UNIX®. CUPS is developed -by Easy Software Products, a -software firm located in Hollywood, Maryland that has been -selling commercial software for UNIX since 1993 through more -than 40 distributors serving over 80 countries worldwide.

    - -

    CUPS is used by Apple to provide printing on MacOS X and is -the defacto-standard for Linux. Additional information on CUPS -is available on the World Wide Web at the following URL:

    - -
    -    http://www.cups.org/
    -
    - - -

    Background

    - -

    Printing within UNIX has historically been done using one of -two printing systems - the Berkeley Line Printer Daemon (LPD) -[RFC1179] and the AT&T Line Printer system. These printing -systems were designed in the 70's for printing text to line -printers; vendors have since added varying levels of support for -other types of printers.

    - -

    Replacements for these printing systems have emerged [LPRng, -Palladin, PLP], however none of the replacements change the -fundamental capabilities of these systems.

    - -

    Over the years several attempts at developing a standard -printing interface have been made, including the draft POSIX -Printing standard developed by the Institute of Electrical and -Electronics Engineers, Inc. (IEEE) [IEEE-1387.4] and Internet -Printing Protocol (IPP) developed by the Internet Engineering -Task Force (IETF) through the Printer Working Group (PWG) -[IETF-IPP]. The POSIX printing standard defines a common set of -command-line tools as well as a C interface for printer -administration and print jobs, but has been shelved by the -IEEE.

    - -

    The Internet Printing Protocol defines extensions to the -HyperText Transport Protocol 1.1 [RFC2616] to provide support -for remote printing services. IPP/1.1 was accepted by the IETF -as a proposed standard in ??? of ???. Unlike POSIX Printing, IPP -enjoys widespread industry support and has become the standard -network printing solution for all operating systems.

    - -

    CUPS uses IPP/1.1 to provide a complete, modern printing -system for UNIX that can be extended to support new printers, -devices, and protocols while providing compatibility with -existing UNIX applications. CUPS is free software provided under -the terms of the GNU General Public License and GNU Library -General Public License.

    - -

    History

    - -

    The first production release of CUPS (based on IPP/1.0) was -released in October of 1999. Version 1.1 of CUPS was released in -August of 2002 ???? and added support for IPP/1.1.

    - -

    CUPS 1.2 is based on IPP/1.1 and adds many of the functional -enhancements that have been requested by our users. As with CUPS -1.1, CUPS 1.2 will be followed by patch releases that address -any problems found with the software. New features will be put -in the 1.3 release to follow.

    - -

    Design Overview

    - -

    Like most printing systems, CUPS is designed around a central -print scheduling process that dispatches print jobs, processes -administrative commands, provides printer status information to -local and remote programs, and informs users as needed. Figure 1 -shows the basic organization of CUPS.

    - -

    CUPS Block Diagram
    -Figure 1 - CUPS Block Diagram

    - -

    Scheduler

    - -

    The scheduler is a HTTP/1.1 server application that handles -HTTP requests. Besides handling printer requests via IPP POST -requests, the scheduler also acts as a full-featured web server -for documentation, status monitoring, and administration.

    - -

    The scheduler also manages a list of available printers on -the LAN and dispatches print jobs as needed using the -appropriate filters and backends.

    - -

    Configuration Files

    - -

    The configuration files consist of:

    - -
      - -
    • The HTTP server configuration file.
    • - -
    • Printer and class definition files.
    • - -
    • MIME type and conversion rule files.
    • - -
    • PostScript Printer Description (PPD) files.
    • - -
    - -

    The HTTP server configuration file is purposely similar to -the Apache server configuration file and defines all of the -access control properties for the server.

    - -

    The printer and class definition files list the available -printer queues and classes. Printer classes are collections of -printers. Jobs sent to a class are forwarded to the first -available printer in the class, round-robin fashion.

    - -

    The MIME type files list the supported MIME types -(text/plain, application/postscript, etc.) and "magic' rules for -automatically detecting the format of a file. These are used by -the HTTP server to determine the Content-Type field for -GET and HEAD requests and by the IPP request -handler to determine the file type when a Print-Job or -Send-File request is received with a -document-format of -application/octet-stream.

    - -

    The MIME conversion rule files list the available filters. -The filters are used when a job is dispatched so that an -application can send a convenient file format to the printing -system which then converts the document into a printable format -as needed. Each filter has a relative cost associated with it, -and the filtering algorithm chooses the set of filters that will -convert the file to the needed format with the lowest total -"cost".

    - -

    The PPD files describe the capabilities of all printers, not -just PostScript printers. There is one PPD file for each -printer. PPD files for non-PostScript printers define additional -filters through cupsFilter attributes to support -printer drivers.

    - -

    CUPS API

    - -

    The CUPS API contains CUPS-specific convenience functions for -queuing print jobs, getting printer information, accessing -resources via HTTP and IPP, and manipulating PPD files. Unlike -the rest of CUPS, the CUPS API is provided under the terms of -the GNU LGPL so it may be used by non-GPL applications.

    - -

    Berkeley and System V Commands

    - -

    CUPS provides the System V and Berkeley command-line -interfaces for submitting jobs and checking the printer status. -The lpstat and lpc status commands -also show network printers ("printer@server") when printer -browsing is enabled.

    - -

    The System V administation commands are supplied for managing -printers and classes. The Berkeley printer administration tool -(lpc) is only supported in a "read-only' mode to -check the current status of the printer queues and -scheduler.

    - -

    Filters

    - -

    A filter program reads from the standard input or from a file -if a filename is supplied. All filters must support a common set -of options including printer name, job ID, username, job title, -number of copies, and job options. All output is sent to the -standard output.

    - -

    Filters are provided for many file formats and include image -file and PostScript raster filters that support non-PostScript -printers. Multiple filters are run in parallel to produce the -required output format.

    - -

    The PostScript raster filter is based on the ESP Ghostscript -core. Instead of using the Ghostscript printer drivers, the CUPS -filter uses a generic CUPS raster printer driver and -CUPS-compliant front-end to support any kind of raster printer. -This allows the same printer driver filter to be used for -printing raster data from any filter.

    - -
    Talk about Apple's use of CUPS...
    - -

    CUPS Imaging

    - -

    The CUPS Imaging library provides functions for managing -large images, doing colorspace conversion and color management, -scaling images for printing, and managing raster page streams. -It is used by the CUPS image file filters, the PostScript RIP, -and all raster printers drivers.

    - -

    Backends

    - -

    A backend program is a special filter that sends print data -to a device or network connection. Backends for parallel, -serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are -provided in CUPS 1.2.

    - -

    SAMBA version 2.0.6 and higher includes a SMB backend -(smbspool(1)) that can be used for printing to -Windows.

    - -

    Network Printing

    - -

    Traditionally, network printing has been one of the hardest -things to get working under UNIX. One reason is because each -vendor added their own extensions to the LPD protocol (the -previous standard for network printing), making cross-platform -printing difficult if not impossible.

    - -

    Another reason is that you have to administer every network -printer on every client machine. In some cases you can "clone' -the printer configuration from a "master' client to each of the -others, but even that can be time-consuming and error-prone. -Something better is needed.

    - -

    CUPS provides "printer browsing", which allows clients to -automatically see and use printers from any server on a LAN. -This means that you only need to configure the server and the -clients will automatically see the printers and classes on -it.

    - -

    In addition, CUPS can automatically merge multiple identical -network printers into "implicit classes". This allows clients to -send jobs to the implicit class and have them print on the first -available printer or server. In addition, failsafe and -load-balancing functions are enabled simply by defining the same -printer on multiple servers!

    - -

    New Features in CUPS 1.2

    - -

    CUPS 1.2 includes many new features and capabilities: - -

      - -
    1. Backends - -
    2. Banner Page Support - -
    3. Digest Authentication - -
    4. Directory Services - -
    5. Directory Structure Changes - -
    6. Documentation - -
    7. Drivers - -
    8. Filters - -
    9. IPP Support - -
    10. Job Persistence - -
    11. LPD Client Support - -
    12. User-Defined Printers and Options - -
    13. Web Administration Interface - -
    - -

    1. Backends

    - -

    CUPS 1.2 implements a new backend interface for retrieving a -list of available devices for CUPS clients. This allows -administration interfaces to query the CUPS scheduler for a list -of available devices, automatically configure printers if the -device identification information is available, and present the -user with a list of available devices rather than relying on the -user to know what devices are configured on the system.

    - -

    The new release also includes a backend for USB printers -under *BSD and Linux. Support for USB under Solaris 8 will be -provided in a subsequent patch release.

    - -

    2. Banner Page Support

    - -

    CUPS 1.2 includes support for banner pages at the beginning -and end of a job. Banner pages may be of any file format and -support variable substitution for job titles, usernames, etc. -Default banner pages are associated with each printer and can be -overridden with command-line options by the user.

    - -

    3. Digest Authentication

    - -

    Digest authentication provides a more secure method of -authenticating access to the printing system. Unlike Basic -authentication, Digest authentication does not send passwords -"in the clear' so it is more difficult to gain unauthorized -access to your system.

    - -

    CUPS 1.2 implements Digest authentication using a special MD5 -password file instead of the UNIX password file. This file is -managed using the new lppasswd command.

    - -

    4. Directory Services

    - -

    CUPS 1.2 adds new directory service ("printer browsing") -features to make using CUPS on large LANs and WANs easier. You -can now poll a remote server for printer information and relay -it to the LAN as well as restrict what printer information is -processed (e.g. to "hide" servers, domains, or networks that you -don't want to see.)

    - -

    5. Directory Structure Changes

    - -

    CUPS 1.2 now uses a directory structure that complies with -the Filesystem Hierarchy Standard (FHS), version 2.0. This -should make integration into existing Linux and *BSD -distributions a lot easier.

    - -

    6. Documentation

    - -

    The CUPS 1.2 documentation has gone through many revisions, -including a completely rewritten administrators manual, a new -programmers manual, and an IPP implementation reference -manual.

    - -

    7. Drivers

    - -

    CUPS 1.2 includes drivers for EPSON dot-matrix and inkjet -printers. As with the HP PCL drivers, the EPSON drivers don't -necessarily provide the best possible output for each printer -but should provide adequate printing quality for general -day-to-day printing.

    - -

    8. Filters

    - -

    CUPS 1.2 includes new image, PostScript, PDF, and text -filters. The image filters have been upgraded to support Windows -BMP and Alias PIX files.

    - -

    The PostScript filter is now based off ESP Ghostscript. The -new filter provides much better performance with -higher-resolution printers and supports all Level 3 PostScript -language features.

    - -

    The new PDF filter is based off the excellent Xpdf software -from Derek Noonburg and supports automatic page scaling. The new -filter is a faster, smaller, more reliable replacement for the -GNU Ghostscript PDF filtering that was used in CUPS 1.0.

    - -

    The new text filter now supports bidirectional text and can -embed fonts as needed.

    - -

    9. IPP Support

    - -

    Probably the least visible portion of CUPS is the IPP -support. CUPS 1.1 implements all of the required IPP/1.1 -operations and attributes and most of the optional ones. The -optional Create-Job and Send-File operations are now -implemented, allowing for better System V printing system -compatibility (one job ID per lp command) and support -for banner pages.

    - -

    10. Job Persistence

    - -

    CUPS 1.2 supports job persistence. This means that jobs are -preserved even after a reboot, a feature that was sorely missing -from CUPS 1.0.

    - -

    In addition, CUPS 1.2 allows you to keep job information -after the job has printed. The basic post-job persistence mode -provides a job history (number of pages printed, time job was -printed, etc.) but does not preserve the actual job files. This -can be changed to discard all information after a job is printed -or keep the job files after printing so you can reprint a job at -some later time.

    - -

    11. LPD Client Support

    - -

    By popular request, CUPS 1.2 supports LPD-based clients using -a new mini-daemon that handles LPD requests and passes them on -to the main server.

    - -

    12. User-Defined Printers and Options

    - -

    CUPS 1.2 includes support for user-defined printers and -options via a new lpoptions command. User-defined -printers are special instances of the available printers (e.g. -"printer/instance" or "printer@server/instance") that can have -their own default options such as media size, resolution, and so -forth. The lpoptions command can also be used to set a -different default printer queue.

    - -

    13. Web Administration Interface

    - -

    CUPS 1.0 provided a simple class, job, and printer monitoring -interface for web browsers. CUPS 1.2 replaces this interface -with an enhanced administration interface that allows you to -add, modify, delete, configure, and control classes, jobs, and -printers.

    - -

    Software Using CUPS

    - -

    A lot has happened since CUPS 1.0 came out, and many software -packages are supporting CUPS. We have contributed code to the -SAMBA team to support CUPS, and parts of that are already -available in SAMBA 2.0.6 and 2.0.7. With any luck the final -pieces that provide a complete integration with SAMBA will be -available in the next release of SAMBA.

    - -

    Two graphical interfaces have appeared on the scene that use -CUPS as well. The KUPS project provides a KDE-based interface -for CUPS and can be found at:

    - -
    -    http://kups.sourceforge.net
    -
    - -

    The X Printing Panel (XPP) project provides a graphical -printing panel for CUPS and can be found at:

    - -
    -    http://www.phy.uni-bayreuth.de/till/xpp/
    -
    - -

    Numerous other filters, drivers, tutorials, etc. have been -made available on the CUPS Links web page, available at:

    - -
    -    http://www.cups.org/links.php
    -
    - -

    Finally, our own ESP Print Pro software uses CUPS to provide -drivers for thousands of printers and can be found at:

    - -
    -    http://www.easysw.com/printpro
    -
    - -

    Operating Systems Using CUPS

    - -

    One of our goals has always been to get as many UNIX/Linux -distributions using CUPS as possible. Debian is currently -providing CUPS as part of its stable distribution, and many -other distributions are considering it in their next -releases.

    - -

    Summary

    - -

    The Common UNIX Printing System provides a modern printing -interface for UNIX applications that is both flexible and -user-friendly. The software provides System V and Berkeley -compatible command-line interfaces to ensure compatibility with -existing applications. CUPS 1.2 adds many new features that make -it an even better choice for printing under UNIX.

    - -

    Who to Contact

    - -

    For more information on CUPS please contact us at: - -

    -    Attn: CUPS Information
    -    Easy Software Products
    -    44141 Airport View Drive Suite 204
    -    Hollywood, Maryland 20636-3142 USA
    -
    -    +1.301.373.9600
    -
    -    cups-info@cups.org
    -
    - -

    References

    - -
    - -
    IEEE-1387.4
    - -
    System Administration - Part 4: Printing Interfaces - (draft)
    - -
    IETF-IPP
    - -
    Internet Printing Protocol/1.1
    - -
    LPRng
    - -
    An enhanced, extended, and portable implementation - of the Berkeley LPR print spooler functionality
    - -
    Palladin
    - -
    A printing system developed at the Massachussetts - Institute of Technology
    - -
    PLP
    - -
    The Portable Line Printer spooler system
    - -
    RFC1179
    - -
    Line Printer Daemon Protocol
    - -
    RFC2046
    - -
    Multipurpose Internet Mail Extensions (MIME) Part - Two: Media Types
    - -
    RFC2616
    - -
    Hypertext Transfer Protocol -- HTTP/1.1
    - -
    - -

    Trademarks

    - -

    The Common UNIX Printing System, CUPS, and the CUPS logo are -the trademark property of Easy Software Products. All other -trademarks are the property of their respective owners.

    - - - diff --git a/doc/overview.pdf b/doc/overview.pdf deleted file mode 100644 index ada9b01a55d8a4cf83818f9fd35e0c28a4cf1bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 50052 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 - - CUPS PostScript Printer Description (PPD) File Specification - - - - - - - -

    Scope

    - -

    Identification

    - -

    This document describes the PostScript Printer Description -(PPD) file format and the supported extensions for the Common -UNIX Printing System ("CUPS") Version 1.2. It should be used in -conjunction with the Adobe PostScript Printer Description File -Format Specification, Version 4.3 when creating PPD files for -CUPS.

    - - - -

    Document Overview

    - -

    This CUPS PostScript Printer Description File Specification -document is organized into the following sections:

    - -
      - -
    • 1 - Scope
    • - -
    • 2 - References
    • - -
    • 3 - PPD File Syntax
    • - -
    • 4 - General Attributes
    • - -
    • 5 - Custom Options
    • - -
    • 6 - Color Profiles
    • - -
    • 7 - I18N Support
    • - -
    • A - Glossary
    • - -
    • B - Change History
    • - -
    - - - -

    PPD File Syntax

    - -

    PostScript Printer Description ("PPD") files describe the -capabilities of each printer and are used by CUPS to support -printer-specific features and intelligent filtering.

    - -

    The PPD file format is described in -Adobe TechNote #5003: PostScript Printer Description File Format -Specification Version 4.3.

    - -

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

    - -
    -    PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)
    -
    -    HEADER   = "*" 0x50.50.44.2D.41.64.6F.62.65 ":"   ; *PPD-Adobe:
    -               *WSP DQUOTE "4.3" DQUOTE LINE-END
    -
    -    COMMENT  = "*%" *TCHAR LINE-END
    -
    -    DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
    -               1*(*WSP VALUE) LINE-END
    -
    -    VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE
    -
    -    KCHAR    = ALPHA / DIGIT / "_" / "." / "-"
    -
    -    SCHAR    = LINE-END / WSP / %x21 / %x23-7E / %xA0-FF
    -
    -    TCHAR    = %x20-7E / %xA0-FF
    -
    -    LINE-END = CR / LF / CR LF
    -
    - - -

    General Attributes

    - -

    cupsFilter

    - -

    This string attribute provides a conversion rule of the -form:

    - -
    -    source/type cost program
    -
    - -

    The destination type is assumed to the printer's type. If a -printer supports the source type directly the special filter -program "-" may be specified.

    - -

    cupsFlipDuplex

    - -

    This boolean attribute notifies the RIP filters that the -destination printer requires an upside-down image for the back -page. The default value is false.

    - -

    cupsManualCopies

    - -

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

    - -

    cupsModelNumber

    - -

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

    - -

    cupsProtocol

    - -

    This optional attribute describes which binary communication -protocol to use when printing binary PostScript data. The -strings "None", "BCP", and "TBCP" are recognized, corresponding -to no encoding, BCP, and TBCP respectively.

    - -

    cupsVersion

    - -

    This required attribute describes which version of the CUPS -IDD was used for the PPD file extensions. Currently it must be -the string "1.0", "1.1", or "1.2".

    - - -

    Custom Options

    - - -

    Color Profiles

    - -

    cupsColorProfile

    - -

    This string attribute specifies a color profile of the -form:

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

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

    - -

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

    - -
    -    f(x) = density * xgamma
    -
    - -

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

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

    cupsICCProfile

    - -

    This attribute specifies an ICC color profile of the -form:

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

    The ColorModel, MediaType, and -Resolution keywords specify a selector for color -profiles. If omitted, the color profile will match any option -keyword for the corresponding main keyword.

    - -

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

    - -

    Customizing the Profile Selection Keywords

    - -

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

    - -
    -    *cupsICCQualifier1: MainKeyword
    -    *cupsICCQualifier2: MainKeyword
    -    *cupsICCQualifier3: MainKeyword
    -
    - -

    The default mapping is as follows:

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

    I18N Support

    - -

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

    - -
      - -
    1. The LanguageVersion is English
    2. - -
    3. The LanguageEncoding is ISOLatin1
    4. - -
    5. Main and option keywords may not exceed 34 - characters, which is a subset of what the Adobe PPD spec - allows.
    6. - -
    7. Translations are specified using a locale prefix of - the form "ll" or "ll_CC." where "ll" is the 2-letter ISO - language code and "CC" is the 2-letter ISO country - code
    8. - -
    9. Translation strings are encoded using UTF-8.
    10. - -
    11. Main keywords are translated using any of the - following forms: -

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

    12. - -
    13. Option keywords are translated using any of the - following forms: -

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

    14. - -
    - -

    The following example shows how a fictional Foobar Laser 9999 -PPD file would be localized for English, French, and German:

    - -
    -    *LanguageVersion: English
    -    *LanguageEncoding: ISOLatin1
    -    *ModelName: "Foobar Laser 9999"
    -    *fr_FR.Translation ModelName/La Foobar Laser 9999: ""
    -    *de_DE.Translation ModelName/Foobar LaserDrucken 9999: ""
    -    ...
    -    *OpenUI *InputSlot/Paper Source: PickOne
    -    *OrderDependency: 10 AnySetup *InputSlot
    -    *DefaultInputSlot: Auto
    -    *fr_FR.Translation InputSlot/Papier source: ""
    -    *de_DE.Translation InputSlot/Papiereinzug: ""
    -    *InputSlot Auto/Default: "<>setpagedevice"
    -    *fr_FR.InputSlot Auto/Par Defaut: ""
    -    *de_DE.InputSlot Auto/Standard: ""
    -    *InputSlot Manual/Manual Feed: "<>setpagedevice"
    -    *fr_FR.InputSlot Manual/Manuel mecanisme de alimentation: ""
    -    *de_DE.InputSlot Manual/Manueller Einzug: ""
    -    *CloseUI: *InputSlot
    -
    - - - -

    Change History

    - -

    Changes in CUPS 1.2

    - -
      - -
    • cupsICCProfile
    • - -
    • New I18N support
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    - -

    Changes in CUPS 1.1

    - -
      - -
    • cupsProtocol
    • - -
    • cupsFlipDuplex
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    - - - diff --git a/doc/references.shtml b/doc/references.shtml deleted file mode 100644 index 6a8dd82df..000000000 --- a/doc/references.shtml +++ /dev/null @@ -1,42 +0,0 @@ -

    References

    - -

    CUPS Documentation

    - -

    The following CUPS documentation is referenced by this document: - -

      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan -
    • CUPS-IDD-1.2: CUPS System Interface Design Description -
    • CUPS-IPP-1.2: CUPS Implementation of IPP -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual -
    • CUPS-SDD-1.2: CUPS Software Design Description -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual -
    • CUPS-SSR-1.2: CUPS Software Security Report -
    • CUPS-STP-1.2: CUPS Software Test Plan -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual -
    • CUPS-SVD-1.2: CUPS Software Version Description -
    - -

    Other Documents

    - -

    The following non-CUPS documents are referenced by this document: - -

    diff --git a/doc/sam.html b/doc/sam.html deleted file mode 100644 index 85e9e4bcc..000000000 --- a/doc/sam.html +++ /dev/null @@ -1,5281 +0,0 @@ - - - -CUPS Software Administrators Manual - - - - - - - -

    -

    CUPS Software Administrators Manual


    -CUPS-SAM-1.2.0
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    Preface - -1 - Printing System Overview - -2 - Building and Installing CUPS - -3 - Managing Printers - -4 - Printer Classes - -5 - Client Setup - -6 - Printing System Management - -7 - Printing with Other Systems - -A - Software License Agreement - -B - Common Network Settings - -C - Printer Drivers - -D - List of Files -
    -
    E - Troubleshooting Common Problems - -
    -

    Preface

    -

    This software administrators manual provides printer administration - information for the Common UNIX Printing SystemTM ("CUPS -TM"), version 1.2.0.

    -

    System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    - - -

    Document Overview

    -

    This software administrators manual is organized into the following - sections:

    - -

    Notation Conventions

    -

    Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below: -

    - - - - - - - - - - - - -
    Example   Description
     
    lpstat -
    lpstat(1)
       The names of commands; - the first mention of a command or function in a chapter is followed by - a manual page section number.
     
    /var -
    /usr/share/cups/data/testprint.ps
        -File and directory names.
     
    Request ID is Printer-123 -   Screen output.
     
    lp -d printer filename ENTER -   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are - written using the period (.) to indicate the decimal point.
    -
    - - -

    -

    Abbreviations

    - The following abbreviations are used throughout this manual: -
      -
      -
      kb
      -
      Kilobytes, or 1024 bytes -
       
      -
      Mb
      -
      Megabytes, or 1048576 bytes -
       
      -
      Gb
      -
      Gigabytes, or 1073741824 bytes -
       
      -
      -
    -

    Other References

    -
      -
      -
      CUPS Software Programmers Manual
      -
      A programmer guide for interfacing with and/or extending the CUPS - software. -
       
      -
      CUPS Software Users Manual
      -
      An end-user guide for using the CUPS software. -
       
      -
      -
    -

    1 - Printing System Overview

    -

    This chapter provides an overview of how the Common UNIX Printing - System works.

    -

    The Printing Problem

    -

    For years the printing problem has plagued UNIX. Unlike - Microsoft® Windows® or Mac OS, UNIX has no standard interface or system - in place for supporting printers. Among the solutions currently - available, the Berkeley and System V printing systems are the most - prevalent.

    -

    These printing systems support line printers (text only) or - PostScript printers (text and graphics), and with some coaxing they can - be made to support a full range of printers and file formats. However, - because each varient of the UNIX operating system uses a different - printing system than the next developing printer drivers for a wide - range of printers and operating systems is extremely difficult. That - combined with the limited volume of customers for each UNIX varient has - forced most printer vendors to give up supporting UNIX entirely.

    -

    CUPS is designed to eliminate the printing problem. One common - printing system can be used by all UNIX varients to support the - printing needs of users. Printer vendors can use its modular filter - interface to develop a single driver program that supports a wide range - of file formats with little or no effort. Since CUPS provides both the - System V and Berkeley printing commands, users (and applications) can - reap the benefits of this new technology with no changes.

    -

    The Technology

    -

    CUPS is based upon an emerging Internet standard called the Internet - Printing Protocol. IPP has been embraced by dozens of printer and - printer server manufacturers and is supported by Microsoft Windows - 2000.

    -

    IPP defines a standard protocol for printing as well as managing - print jobs and printer options like media size, resolution, and so - forth. Like all IP-based protocols, IPP can be used locally or over the - Internet to printers hundreds or thousands of miles away. Unlike other - protocols, however, IPP also supports access control, authentication, - and encryption, making it a much more capable and secure printing - solution than older ones.

    -

    IPP is layered on top of the Hyper-Text Transport Protocol ("HTTP") - which is the basis of web servers on the Internet. This allows users to - view documentation, check status information on a printer or server, - and manage their printers, classes, and jobs using their web browser.

    -

    CUPS provides a complete IPP/1.1 based printing system that provides - Basic, Digest, and local certificate authentication and user, domain, - or IP-based access control. TLS encryption will be available in future - versions of CUPS.

    -

    Jobs

    -

    Each file or set of files that is submitted for printing is called a - job. Jobs are identified by a unique number starting at 1 and are - assigned to a particular destination, usually a printer. Jobs can also - have options associated with them such as media size, number of copies, - and priority.

    -

    Classes

    -

    CUPS supports collections of printers known as classes. Jobs - sent to a class are forwarded to the first available printer in the - class.

    -

    Filters

    -

    Filters allow a user or application to print many types of files - without extra effort. Print jobs sent to a CUPS server are filtered - before sending them to a printer. Some filters convert job files to - different formats that the printer can understand. Others perform page - selection and ordering tasks.

    -

    CUPS provides filters for printing many types of image files, HP-GL/2 - files, PDF files, and text files. CUPS also supplies PostScript and - image file Raster Image Processor ("RIP") filters that convert - PostScript or image files into bitmaps that can be sent to a raster - printer.

    -

    Backends

    -

    Backends perform the most important task of all - they send the - filtered print data to the printer.

    -

    CUPS provides backends for printing over parallel, serial, and USB - ports, and over the network via the IPP, JetDirect (AppSocket), and - Line Printer Daemon ("LPD") protocols. Additional backends are - available in network service packages such as the SMB backend included - with the popular SAMBA software.

    -

    Backends are also used to determine the available devices. On startup - each backend is asked for a list of devices it supports, and any - information that is available. This allows the parallel backend to tell - CUPS that an EPSON Stylus Color 600 printer is attached to parallel - port 1, for example.

    -

    Printer Drivers

    -

    Printer drivers in CUPS consist of one of more filters specific to a - printer. CUPS includes sample printer drivers for Hewlett-Packard - LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color, - and Stylus Photo printers. While these drivers do not generate optimal - output for the different printer models, they do provide basic printing - and demonstrate how you can write your own printer drivers and - incorporate them into CUPS.

    -

    Networking

    -

    Printers and classes on the local system are automatically shared - with other systems on the network. This allows you to setup one system - to print to a printer and use this system as a printer server or spool - host for all of the others. Users may then select a local printer by - name or a remote printer using "name@server".

    -

    CUPS also provides implicit classes, which are collections of - printers and/or classes with the same name. This allows you to setup - multiple servers pointing to the same physical network printer, for - example, so that you aren't relying on a single system for printing. - Because this also works with printer classes, you can setup multiple - servers and printers and never worry about a single point of failure - unless all of the printers and servers go down!

    -

    2 - Building and - Installing CUPS

    -

    This chapter shows how to build and install the Common UNIX Printing - System. If you are installing a binary distribution from the CUPS web - site, proceed to the section titled, Installing a - Binary Distribution.

    -

    Installing a Source Distribution

    -

    This section describes how to compile and install CUPS on your system - from the source code.

    -

    Requirements

    -

    You'll need ANSI-compliant C and C++ compilers to build CUPS on your - system. As its name implies, CUPS is designed to run on the UNIX - operating system, however the CUPS interface library and most of the - filters and backends supplied with CUPS should also compile and run - under Microsoft Windows.

    -

    For the image file filters and PostScript RIP, you'll need the JPEG, - PNG, TIFF, and ZLIB libraries. CUPS will build without these, but with - significantly reduced functionality. Easy Software Products maintains a - mirror of the current versions of these libraries at:

    - -

    If you make changes to the man pages you'll need GNU groff or another - nroff-like package. GNU groff is available from:

    - -

    The documentation is formatted using the HTMLDOC software. If you - need to make changes you can get the HTMLDOC software from:

    - -

    Finally, you'll need a make program that understands the - include directive - FreeBSD, NetBSD, and OpenBSD - developers should use the gmake program.

    -

    Compiling CUPS

    -

    CUPS uses GNU autoconf to configure the makefiles and source code for - your system. Type the following command to configure CUPS for your - system:

    -
      -
      -./configure ENTER
      -
      -
    -

    The default installation will put the CUPS software in the /etc -, /usr, and /var directories on your system, which - will overwrite any existing printing commands on your system. Use the ---prefix option to install the CUPS software in another location:

    -
      -
      -./configure --prefix=/some/directory ENTER
      -
      -
    -

    If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in a - system default location (typically /usr/include and - /usr/lib) you'll need to set the CFLAGS, -CXXFLAGS, and LDFLAGS environment variables prior to - running configure:

    -
      -
      -setenv CFLAGS "-I/some/directory" ENTER
      -setenv CXXFLAGS "-I/some/directory" ENTER
      -setenv LDFLAGS "-L/some/directory" ENTER
      -setenv DSOFLAGS "-L/some/directory" ENTER
      -./configure ... ENTER
      -
      -
    -

    or:

    -
      -
      -CFLAGS="-I/some/directory"; export CFLAGS ENTER
      -CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER
      -LDFLAGS="-L/some/directory"; export LDFLAGS ENTER
      -DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER
      -./configure ... ENTER
      -
      -
    -

    To enable support for encryption, you'll also want to add the - "--enable-ssl" option:

    -
      -
      -./configure --enable-ssl
      -
      -
    -

    SSL and TLS support require the OpenSSL library, available at:

    - -

    If the OpenSSL headers and libraries are not installed in the - standard directories, use the --with-openssl-includes and ---with-openssl-libs options:

    -
      -
      -./configure --enable-ssl \
      -    --with-openssl-includes=/foo/bar/include \
      -    --with-openssl-libs=/foo/bar/lib
      -
      -
    -

    Once you have configured things, just type:

    -
      -
      -make ENTER
      -
      -
    -

    to build the software. - -

    -

    Installing the Software

    -

    Use the "install" target to install the software:

    -
      -
      -make install ENTER
      -
      -
    -
    - - -
    WARNING: -

    Installing CUPS will overwrite your existing printing system. If you - experience difficulties with the CUPS software and need to go back to - your old printing system, you will need to reinstall the old printing - system from your operating system CDs.

    -
    -
    -

    Running the Software

    -

    Once you have installed the software you can start the CUPS server by - typing:

    -
      -
      -/usr/sbin/cupsd ENTER
      -
      -
    - - -

    Installing a Binary Distribution

    -

    CUPS comes in a variety of binary distribution formats. Easy Software - Products provides binaries in TAR format with installation and removal - scripts ("portable" distributions), and in RPM and DPKG formats for Red - Hat and Debian-based distributions. Portable distributions are - available for all platforms, while the RPM and DPKG distributions are - only available for Linux. -

    - - -
    WARNING: -

    Installing CUPS will overwrite your existing printing system. If you - experience difficulties with the CUPS software and need to go back to - your old printing system, you will need to remove the CUPS software - with the provided script and/or reinstall the old printing system from - your operating system CDs.

    -
    -
    -

    -

    Installing a Portable Distribution

    -

    To install the CUPS software from a portable distribution you will - need to be logged in as root; doing an su is good enough. - Once you are the root user, run the installation script with:

    -
      -
      -./cups.install ENTER
      -
      -
    -

    After asking you a few yes/no questions the CUPS software will be - installed and the scheduler will be started automatically. - -

    -

    Installing an RPM Distribution

    -

    To install the CUPS software from an RPM distribution you will need - to be logged in as root; doing an su is good enough. Once - you are the root user, run RPM with:

    -
      -
      -rpm -e lpr
      -rpm -i cups-1.1-linux-M.m.n-intel.rpm ENTER
      -
      -
    -

    After a short delay the CUPS software will be installed and the - scheduler will be started automatically.

    -

    Installing an Debian Distribution

    -

    To install the CUPS software from a Debian distribution you will need - to be logged in as root; doing an su is good enough. Once - you are the root user, run dpkg with:

    -
      -
      -dpkg -i cups-1.1-linux-M.m.n-intel.deb ENTER
      -
      -
    -

    After a short delay the CUPS software will be installed and the - scheduler will be started automatically.

    -

    3 - Managing Printers

    -

    This chapter describes how to add your first printer and how to - manage your printers.

    -

    The Basics

    -

    Each printer queue has a name associated with it; the printer name - must start with a letter and can contain up to 127 letters, numbers, - and the underscore (_). Case is not significant, e.g. "PRINTER", - "Printer", and "printer" are considered to be the same name.

    -

    Printer queues also have a device associated with them. The device - can be a parallel port, a network interface, and so forth. Devices - within CUPS use Uniform Resource Identifiers ("URIs") which are a more - general form of Uniform Resource Locators ("URLs") that are used in - your web browser. For example, the first parallel port in Linux usually - uses a device URI of parallel:/dev/lp1. - -

    -

    You can see a complete list of supported devices by running the -lpinfo(8) command:

    -
      -
      -lpinfo -v ENTER
      -network socket
      -network http
      -network ipp
      -network lpd
      -direct parallel:/dev/lp1
      -serial serial:/dev/ttyS1?baud=115200
      -serial serial:/dev/ttyS2?baud=115200
      -direct usb:/dev/usb/lp0
      -network smb
      -
      -
    -

    The -v option specifies that you want a list of - available devices. The first word in each line is the type of device - (direct, file, network, or serial) and is followed by the device URI or - method name for that device. File devices have device URIs of the form -file:/directory/filename while network devices use the more - familiar method://server or method://server/path - format.

    -

    Finally, printer queues usually have a PostScript Printer Description - ("PPD") file associated with them. PPD files describe the capabilities - of each printer, the page sizes supported, etc., and are used for - PostScript and non-PostScript printers. CUPS includes PPD files for HP - LaserJet, HP DeskJet, EPSON 9-pin, EPSON 24-pin, and EPSON Stylus - printers.

    -

    Adding Your First Printer

    -

    CUPS provides two methods for adding printers: a command-line program - called lpadmin(8) and a Web interface. The lpadmin - command allows you to perform most printer administration tasks from - the command-line and is located in /usr/sbin. The Web - interface is located at:

    - -

    and steps you through printer configuration. If you don't like - command-line interfaces, try the Web interface - instead.

    -

    Adding Your First Printer from the Command-Line

    -

    Run the lpadmin command with the -p option - to add a printer to CUPS:

    -
      -
      -/usr/sbin/lpadmin -p printer -E -v device -m ppd ENTER
      -
      -
    -

    For a HP DeskJet printer connected to the parallel port this would - look like:

    -
      -
      -/usr/sbin/lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd ENTER
      -
      -
    -

    Similarly, a HP LaserJet printer using a JetDirect network interface - at IP address 11.22.33.44 would be added with the command:

    -
      -
      -/usr/sbin/lpadmin -p LaserJet -E -v socket://11.22.33.44 -m laserjet.ppd ENTER
      -
      -
    -

    As you can see, deskjet.ppd and laserjet.ppd - are the PPD files for the HP DeskJet and HP LaserJet drivers included - with CUPS. You'll find a complete list of PPD files and the printers - they will work with in Appendix C, "Printer - Drivers".

    -

    For a dot matrix printer connected to the serial port this would - might look like:

    -
      -
      -/usr/sbin/lpadmin -p DotMatrix -E -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=soft deskjet.ppd ENTER
      -
      -
    -

    Here you specify the serial port (e.g. S0,S1, d0, d1), baud rate - (e.g. 9600, 19200, 38400, 115200, etc.), number of bits, parity, and - flow control. If you do not need flow control, delete the "+flow=soft" - portion.

    -

    Adding Your First Printer from the Web

    -

    The CUPS web server provides a user-friendly "wizard" interface for - adding your printers. Rather than figuring out which device URI and PPD - file to use, you can instead click on the appropriate listings and fill - in some simple information. Enter the following URL in your web browser - to begin:

    - -

    Click on the Add Printer button to add a printer.

    -

    Managing Printers from the Command-Line

    -

    The lpadmin command enables you to perform most printer - administration tasks from the command-line. You'll find lpadmin - in the /usr/sbin directory.

    -

    Adding and Modifying Printers

    -

    Run the lpadmin command with the -p option - to add or modify a printer:

    -
      -
      -/usr/sbin/lpadmin -p printer options ENTER
      -
      -
    -

    The options arguments can be any of the following:

    -
      -
      -
      -c class
      -
      Adds the named printer to printer class class. If the - class does not exist then it is created.
      -
      -i interface
      -
      Copies the named interface script to the printer. - Interface scripts are used by System V printer drivers. Since all - filtering is disabled when using an interface script, scripts generally - should not be used unless there is no other driver for a printer.
      -
      -m model
      -
      Specifies a standard printer driver which is usually a PPD file. A - list of all available models can be displayed using the lpinfo - command with the -m option. A list of printer drivers - included with CUPS can be found in Appendix - C, "Printer Drivers".
      -
      -r class
      -
      Removes the named printer from printer class class. If - the resulting class becomes empty then it is removed.
      -
      -v device-uri
      -
      Sets the device for communicating with the printer. If a job is - currently printing on the named printer then the job will be restarted - and sent to the new device.
      -
      -D info
      -
      Provides a textual description of the printer, e.g. "John's Personal - Printer".
      -
      -E
      -
      Enables the printer and accepts job. This option is equivalent to - running the enable(1) and accept(8) commands - on the printer.
      -
      -L location
      -
      Provides a textual location for the printer, e.g. "Computer Lab 5".
      -
      -P ppd-file
      -
      Specifies a local PPD file for the printer driver.
      -
      -
    -

    Deleting Printers

    -

    Run the lpadmin command with the -x option - to delete a printer:

    -
      -
      -/usr/sbin/lpadmin -x printer ENTER
      -
      -
    -

    Setting the Default Printer

    -

    Run the lpadmin command with the -d option - to set a default printer:

    -
      -
      -/usr/sbin/lpadmin -d printer ENTER
      -
      -
    -

    The default printer can be overridden by the user using the -lpoptions(1) command.

    -

    Starting and Stopping Printers

    -

    The enable and disable commands start and - stop printer queues, respectively:

    -
      -
      -/usr/bin/enable printer ENTER
      -/usr/bin/disable printer ENTER
      -
      -
    -

    Printers that are disabled may still accept jobs for printing, but - won't actually print any files until they are restarted. This is useful - if the printer malfunctions and you need time to correct the problem. - Any queued jobs are printed after the printer is enabled (started).

    -

    Accepting and Rejecting Print Jobs

    -

    The accept and reject commands accept and - reject print jobs for the named printer, respectively:

    -
      -
      -/usr/sbin/accept printer ENTER
      -/usr/sbin/reject printer ENTER
      -
      -
    -

    As noted above, a printer can be stopped but accepting new print - jobs. A printer can also be rejecting new print jobs while it finishes - those that have been queued. This is useful for when you must perform - maintenance on the printer and will not have it available to users for - a long period of time.

    -

    Setting Quotas on a Printer

    -

    CUPS supports page and size-based quotas for each printer. The quotas - are tracked individually for each user, but a single set of limits - applies to all users for a partiuclar printer. For example, you can - limit every user to 5 pages per day on an expensive printer, but you - cannot limit every user except Johnny.

    -

    The job-k-limit, job-page-limit, and job-quota-peiod - options determine whether and how quotas are enforced for a printer. - The job-quota-period option determines the time interval for - quota tracking. The interval is expressed in seconds, so a day is - 86,400, a week is 604,800 and a month is 2,592,000 seconds. The - job-k-limit option specifies the job size limit in killobytes. The - job-page-limit option specifies the number of pages limit.

    -

    For quotas to be enforced, the period and at least one of the limits - must be set to a non-zero value. The following options will enable - quotas:

    -
      -
      -/usr/sbin/lpadmin -p printer -o job-quota-period=604800 -o job-k-limit=1024 ENTER
      -/usr/sbin/lpadmin -p printer -o job-quota-period=604800 -o job-page-limit=100 ENTER
      -
      -
    -

    Or, you can combine all three options on the same line.

    -

    Restricting User Access to a Printer

    -

    The -u option of the lpadmin command - controls which users can print to a printer. The default configuration - allows all users to print to a printer:

    -
      -
      -/usr/sbin/lpadmin -p printer -u allow:all ENTER
      -
      -
    -

    CUPS supports allow and deny lists so that you can specify a list of - users who are allowed to print or not allowed to print. Along with your - list of users, you can specify whether they are allowed or not allowed - to use the printer:

    -
      -
      -/usr/sbin/lpadmin -p printer -u allow:peter,paul,mary ENTER
      -
      -
    -

    This command allows peter, paul, and mary to print to the named - printer, but all other users cannot print. The command:

    -
      -
      -/usr/sbin/lpadmin -p printer -u deny:peter,paul,mary ENTER
      -
      -
    -

    has the opposite effect. All users except peter, paul, and mary will - be able to print to the named printer.

    -
    - - -
    NOTE: -

    The allow and deny options are not cummulative. That - is, you must provide the complete list of users to allow or deny each - time.

    -

    Also, CUPS only maintains one list of users - the list can allow or - deny users from printing. If you specify an allow list and then specify - a deny list, the deny list will replace the allow list - only one list - is active at any time.

    -
    -
    -

    Managing Printers from the Web

    -

    The Web interface is located at:

    - -

    From there you can perform all printer management tasks with a few - simple mouse clicks.

    -

    4 - Printer Classes

    -

    This chapter describes what printer classes are and how to manage - them.

    -

    The Basics

    -

    CUPS provides collections of printers called printer classes. - Jobs sent to a class are forwarded to the first available printer in - the class. Classes can themselves be members of other classes, so it is - possible for you to define very large, distributed printer classes for - high-availability printing.

    -

    CUPS also supports implicit classes. Implicit classes work - just like printer classes, but they are created automatically based - upon the available printers and classes on the network. This allows you - to setup multiple print servers with identical printer configurations - and have the client machines send their print jobs to the first - available server. If one or more servers go down, the jobs are - automatically redirected to the servers that are running, providing - fail-safe printing.

    -

    Managing Printer Classes from the Command-Line

    -

    Run the lpadmin command with the -p and --c options to add a printer to a class:

    -
      -
      -/usr/sbin/lpadmin -p printer -c class ENTER
      -
      -
    -

    The class is created automatically if it doesn't exist. To - remove a printer from a class use the -r option:

    -
      -
      -/usr/sbin/lpadmin -p printer -r class ENTER
      -
      -
    -

    To remove the entire class just use the -x option:

    -
      -
      -/usr/sbin/lpadmin -x class ENTER
      -
      -
    -

    Managing Printer Classes from the Web Interface

    -

    The Web interface is located at:

    - -

    The Add Class and Modify Class interfaces - provide a list of available printers; click on the printers of interest - to add them to the class.

    -

    Implicit Classes

    -

    A noted earlier, implicit classes are created automatically from the - available network printers and classes. To disable this functionality, - set the ImplicitClasses - directive to Off in the cupsd.conf file. You - will find more information on doing this in - Chapter 6, "Printing System Management".

    -

    5 - Client Setup

    -

    This chapter discusses several ways to configure CUPS clients for - printing.

    -

    The Basics

    -

    A client is any machine that sends print jobs to another machine for - final printing. Clients can also be servers if they communicate - directly with any printers of their own.

    -

    CUPS supports several methods of configuring client machines:

    - -

    Manual Configuration of Print Queues

    -

    The most tedious method of configuring client machines is to - configure each remote queue by hand using the lpadmin - command:

    -
      -
      -lpadmin -p printer -E -v ipp://server/printers/printer ENTER
      -
      -
    -

    The printer name is the name of the printer on the - server machine. The server name is the hostname or IP - address of the server machine. Repeat the lpadmin command - for each remote printer you wish to use.

    -
    - - -
    NOTE: -

    Manual configuration of print queues is not recommended for large - numbers of client machines because of the administration nightmare it - creates. For busy networks, consider subnetting groups of clients and - polling and relaying printer information instead.

    -
    -
    -

    Specifying a Single Server for Printing

    -

    CUPS can be configured to run without a local spooler and send all - jobs to a single server. However, if that server goes down then all - printing will be disabled. Use this configuration only as absolutely - needed.

    -

    The default server is normally "localhost". To override the default - server create a file named /etc/cups/client.conf and add a - line reading:

    -
      -
      -ServerName server
      -
      -
    -

    to the file. The server name can be the hostname or IP - address of the default server.

    -

    The default server can also be customized on a per-user basis. To set - a user-specific server create a file named ~/.cupsrc and add - a line reading:

    -
      -
      -ServerName server
      -
      -
    -

    to the file. The server name can be the hostname or IP - address of the default server.

    -

    Automatic Configuration of Print Queues

    -

    CUPS supports automatic client configuration of printers on the same - subnet. To configure printers on the same subnet, do nothing. - Each client should see the available printers within 30 seconds - automatically. The printer and class lists are updated automatically as - printers and servers are added or removed.

    -

    If you want to see printers on other subnets as well, use the - BrowsePoll directive as described next.

    -
    - - -
    NOTE: -

    The BrowseAddress directive - enables broadcast traffic from your server. The default configuration - braodcasts printer information every 30 seconds. Although this printer - information does not use much bandwidth, typically about 80 bytes per - printer, it can add up with large numbers of servers and printers.

    -

    Use the BrowseInterval and BrowseTimeout directives to tune - the amount of data that is added to your network load. In addition, - subnets can be used to minimize the amount of traffic that is carried - by the "backbone" of your large network.

    -
    -
    -

    Specifying Multiple Servers for Printing

    -

    If you have CUPS servers on different subnets, then you should - configure CUPS to poll those servers. Polling provides the benefits of - automatic configuration without significant configuration on the - clients, and multiple clients on the same subnet can share the same - configuration information.

    -

    Polling is enabled by specifying one or more -BrowsePoll directives in the /etc/cups/cupsd.conf - file. For information on making these changes, see - Chapter 6, "Printing System Management".

    -

    Multiple BrowsePoll lines can - be used to poll multiple CUPS servers. To limit the amount of polling - you do from client machines, you can have only one of the clients do - the polling and relay that information to the others on the same subnet - (described next).

    -

    Relaying Printers to Other Clients

    -

    When you have clients and servers spread across multiple subnets, the - polling method is inefficient. CUPS provides a -BrowseRelay directive that enables a single client to relay - (broadcast) the polled printer information to the local subnet.

    -

    For example, Server A and Server B are on subnet 1 and subnet 2, - while the clients are on subnet 3. To provide printers to all of the - clients in subnet 3, client C will be configured with the following - directives in /etc/cups/cupsd.conf:

    -
      -
      -# Poll the two servers
      -
      -BrowsePoll ServerA ENTER
      -BrowsePoll ServerB ENTER
      -
      -
      -# Relay the printers to the local subnet
      -
      -BrowseRelay 127.0.0.1 192.168.3.255 ENTER
      -
      -
    -

    The BrowseRelay line - specifies a source address and mask. Any browse packets coming from a - matching address wil be sent to the given broadcast address. In this - case, we want the packets from the local machine (127.0.0.1) relayed to - the other clients.

    -

    As printers are found using polling, they are relayed from client C - to the rest of the clients through a broadcast on subnet 3. The rest of - the clients can use the standard cupsd.conf configuration.

    -

    The BrowseRelay directive can - also be used to relay browsing packets from one network interface to - another. For example, if client C in the previous example had network - interfaces attaches to both subnet 1 and subnet 2, it could use the - BrowseRelay directive exclusively:

    -
      -
      -# Relay the printers from subnet 1 and 2 to subnet 3
      -
      -BrowseRelay 192.168.1 192.168.3.255 ENTER
      -BrowseRelay 192.168.2 192.168.3.255 ENTER
      -
      -
    -

    Load Balancing and Failsafe Operation

    -

    When using server polling or broadcasting, CUPS clients can - automatically merge identical printers on multiple servers into a - single implicit class queue. Clients assume that printers with - the same name on multiple servers are in fact the same printer or type - of printer being served by multiple machines.

    -

    If you have two printers, LaserJet@ServerA and LaserJet@ServerB, a - third implicit class called LaserJet will be created - automatically on the client that refers to both printers. If the client - also has a local printer with the name LaserJet then an implicit class - named AnyLaserJet will be created instead.

    -

    The client will alternate between servers and automatically stop - sending jobs to a server if it goes down, providing a load-balancing - effect and fail-safe operation with automatic switchover.

    -
    - - -
    NOTE: -

    Note that implicit classes ( -ImplicitClasses) are enabled by default.

    -
    -
    -

    6 - Printing System - Management

    -

    This chapter shows how you can configure the CUPS server.

    -

    The Basics

    -

    Several text files are used to configure CUPS. All of the server - configuration files are located in the /etc/cups directory:

    -
      -
      - - -
      classes.conf
      -
      This file contains information on each printer class. Normally you - manipulate this file using the lpadmin command or the Web - interface. -
        - -
      -
      client.conf
      -
      This file provides the default server name for client machines. See Chapter 5, "Client Setup" for more - information. -
        - -
      -
      cupsd.conf
      -
      This file controls how the CUPS server (/usr/sbin/cupsd) - operates and is normally edited by hand. -
        - -
      -
      mime.convs
      -
      This file contains a list of standard file conversion filters and - their costs. You normally do not edit this file. -
        - -
      -
      mime.types
      -
      This file contains a list of standard file formats and how to - recognize them. You normally do not edit this file. -
        - -
      -
      printers.conf
      -
      This file contains information on each printer. Normally you - manipulate this file using the lpadmin command or the Web - Interface. -
       
      -
      -
    -

    Restarting the CUPS Server

    -

    Once you have made a change to a configuration file you need to - restart the CUPS server by sending it a HUP signal or - using the supplied initialization script. The CUPS distributions - install the script in the init.d directory with the name - cups. The location varies based upon the operating system:

    -
      -
      -/etc/software/init.d/cups restart ENTER
      -/etc/rc.d/init.d/cups restart ENTER
      -/etc/init.d/cups restart ENTER
      -/sbin/init.d/cups restart ENTER
      -
      -
    -

    Changing the Server Configuration

    -

    The /etc/cups/cupsd.conf file contains configuration - directives 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. Since the server configuration file consists of plain text, you - can use your favorite text editor to make changes to it. - -

    -

    Server Directives

    -

    The cupsd.conf file contains many directives that - determine how the server operates:

    - - - -

    AccessLog

    -
    -

    Examples

    -
      -
      -AccessLog /var/log/cups/access_log
      -AccessLog /var/log/cups/access_log-%s
      -AccessLog syslog
      -
      -
    -

    Description

    -

    The AccessLog directive sets the name of the access log - file. If the filename is not absolute then it is assumed to be relative - to the ServerRoot 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.

    -

    The server name can be included in the filename by using %s - in the name.

    -

    The special name "syslog" can be used to send the access information - to the system log instead of a plain file.

    -

    The default access log file is /var/log/cups/access_log. - -

    -

    Allow

    -
    -

    Examples

    -
      -
      -Allow from All
      -Allow from None
      -Allow from *.domain.com
      -Allow from .domain.com
      -Allow from host.domain.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 @LOCAL
      -Allow from @IF(name)
      -
      -
    -

    Description

    -

    The Allow directive specifies a hostname, IP address, or - network that is allowed access to the server. Allow - directives are cummulative, so multiple Allow directives - can be used to allow access for multiple hosts or networks. The -/mm notation specifies a CIDR netmask: -

    - - - - - - -
    mmnetmask -mmnetmask
    00.0.0.0 -8255.0.0.0
    1128.0.0.0 -16255.255.0.0
    2192.0.0.0 -24255.255.255.0
    ...... -32255.255.255.255
    -
    -

    -

    The @LOCAL name will allow access from all local network - interfaces, but not remote point-to-point interfaces. The -@IF(name) name will allow access from the named interface.

    -

    The Allow directive must appear inside a - Location directive. - -

    -

    AuthClass

    -
    -

    Examples

    -
      -
      -AuthClass Anonymous
      -AuthClass User
      -AuthClass System
      -AuthClass Group
      -
      -
    -

    Description

    -

    The AuthClass directive defines what level of - authentication is required:

    -
      -
    • Anonymous - No authentication should be performed - (default.)
    • -
    • User - A valid username and password is required.
    • -
    • System - A valid username and password is required, and - the username must belong to the "sys" group; this can be changed using - the SystemGroup directive.
    • -
    • Group - A valid username and password is required, and - the username must belong to the group named by the AuthGroupName - directive.
    • -
    -

    The AuthClass directive must appear inside a - Location directive. - -

    -

    AuthGroupName

    -
    -

    Examples

    -
      -
      -AuthGroupName mygroup
      -AuthGroupName lp
      -
      -
    -

    Description

    -

    The AuthGroupName directive sets the group to use for -Group authentication.

    -

    The AuthGroupName directive must appear inside a - Location directive. - -

    -

    AuthType

    -
    -

    Examples

    -
      -
      -AuthType None
      -AuthType Basic
      -AuthType Digest
      -AuthType BasicDigest
      -
      -
    -

    Description

    -

    The AuthType directive defines the type of - authentication to perform:

    -
      -
    • None - No authentication should be performed (default.)
    • -
    • Basic - Basic authentication should be performed using - the UNIX password and group files.
    • -
    • Digest - Digest authentication should be performed - using the /etc/cups/passwd.md5 file.
    • -
    • BasicDigest - Basic authentication should be performed - using the /etc/cups/passwd.md5 file.
    • -
    -

    When using Basic, Digest, or -BasicDigest authentication, clients connecting through the -localhost interface can also authenticate using - certificates.

    -

    The AuthType directive must appear inside a - Location directive. - -

    -

    AutoPurgeJobs

    -
    -

    Examples

    -
      -
      -AutoPurgeJobs Yes
      -AutoPurgeJobs No
      -
      -
    -

    Description

    -

    The AutoPurgeJobs 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 -No. - -

    -

    BrowseAddress

    -
    -

    Examples

    -
      -
      -BrowseAddress 255.255.255.255:631
      -BrowseAddress 192.0.2.255:631
      -BrowseAddress host.domain.com:631
      -BrowseAddress @LOCAL
      -BrowseAddress @IF(name)
      -
      -
    -

    Description

    -

    The BrowseAddress directive specifies an address to send - browsing information to. Multiple BrowseAddress directives - can be specified to send browsing information to different networks or - systems.

    -

    The @LOCAL name will broadcast printer information to - all local interfaces. The @IF(name) name will broadcast to - the named interface.

    -

    No browse addresses are set by default.

    -
    - - -
    NOTE: -

    If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8 - bits, printer browsing (and in fact all broadcast reception) will not - work. This problem appears to be fixed in HP-UX 11.0.

    -
    -
    - - -

    BrowseAllow

    -
    -

    Examples

    -
      -
      -BrowseAllow from all
      -BrowseAllow from none
      -BrowseAllow from 192.0.2
      -BrowseAllow from 192.0.2.0/24
      -BrowseAllow from 192.0.2.0/255.255.255.0
      -BrowseAllow from *.domain.com
      -BrowseAllow from @LOCAL
      -BrowseAllow from @IF(name)
      -
      -
    -

    Description

    -

    The BrowseAllow directive specifies a system or network - to accept browse packets from. The default is to accept browse packets - from all hosts.

    -

    Host and domain name matching require that you enable the - HostNameLookups directive.

    -

    IP address matching supports exact matches, partial addresses that - match networks using netmasks of 255.0.0.0, 255.255.0.0, and - 255.255.255.0, or network addresses using the specified netmask or bit - count.

    -

    The @LOCAL name will allow browse data from all local - network interfaces, but not remote point-to-point interfaces. The -@IF(name) name will allow browse data from the named interface. - -

    -

    BrowseDeny

    -
    -

    Examples

    -
      -
      -BrowseDeny from all
      -BrowseDeny from none
      -BrowseDeny from 192.0.2
      -BrowseDeny from 192.0.2.0/24
      -BrowseDeny from 192.0.2.0/255.255.255.0
      -BrowseDeny from *.domain.com
      -BrowseDeny from @LOCAL
      -BrowseDeny from @IF(name)
      -
      -
    -

    Description

    -

    The BrowseDeny directive specifies a system or network - to reject browse packets from. The default is to deny browse packets - from no hosts.

    -

    Host and domain name matching require that you enable the - HostNameLookups directive.

    -

    IP address matching supports exact matches, partial addresses that - match networks using netmasks of 255.0.0.0, 255.255.0.0, and - 255.255.255.0, or network addresses using the specified netmask or bit - count.

    -

    The @LOCAL name will block browse data from all local - network interfaces, but not remote point-to-point interfaces. The -@IF(name) name will block browse data from the named interface. - -

    -

    BrowseOrder

    -
    -

    Examples

    -
      -
      -BrowseOrder allow,deny
      -BrowseOrder deny,allow
      -
      -
    -

    Description

    -

    The BrowseOrder directive specifies the order of - allow/deny processing. The default order is deny,allow:

    -
      -
    • allow,deny - Browse packets are accepted unless - specifically denied.
    • -
    • deny,allow - Browse packets are rejected unless - specifically allowed.
    • -
    - - -

    BrowseInterval

    -
    -

    Examples

    -
      -
      -BrowseInterval 0
      -BrowseInterval 30
      -
      -
    -

    Description

    -

    The BrowseInterval directive specifies the maximum - amount of time between browsing updates. Specifying a value of 0 - seconds disables outgoing browse updates but allows a server to receive - printer information from other hosts.

    -

    The BrowseInterval value should always be less than the BrowseTimeout value. Otherwise - printers and classes will disappear from client systems between - updates. - -

    -

    BrowsePoll

    -
    -

    Examples

    -
      -
      -BrowsePoll 192.0.2.2:631
      -BrowsePoll host.domain.com:631
      -
      -
    -

    Description

    -

    The BrowsePoll directive polls a server for available - printers once every BrowseInterval - seconds. Multiple BrowsePoll directives can be - specified to poll multiple servers.

    -

    If BrowseInterval is set to 0 then the server is polled - once every 30 seconds. - -

    -

    BrowsePort

    -
    -

    Examples

    -
      -
      -BrowsePort 631
      -BrowsePort 9999
      -
      -
    -

    Description

    -

    The BrowsePort directive specifies the UDP port number - used for browse packets. The default port number is 631.

    -
    - - -
    NOTE: -

    You must set the BrowsePort to the same value on all of - the systems that you want to see.

    -
    -
    - - -

    BrowseProtocols

    -
    -

    Examples

    -
      -
      -BrowseProtocols CUPS
      -BrowseProtocols SLP
      -BrowseProtocols CUPS SLP
      -BrowseProtocols all
      -
      -
    -

    Description

    -

    The BrowseProtocols directive specifies the protocols to - use when collecting and distributing shared printers on the local - network. The default protocol is CUPS, which is a - broadcast-based protocol.

    -
    - - -
    NOTE: -

    When using the SLP protocol, you must have at least one - Directory Agent (DA) server on your network. Otherwise the CUPS - scheduler (cupsd) will not respond to client requests for - several seconds while polling the network.

    -
    -
    - - -

    BrowseRelay

    -
    -

    Examples

    -
      -
      -BrowseRelay 193.0.2.1 192.0.2.255
      -BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
      -BrowseRelay 193.0.2.0/24 192.0.2.255
      -BrowseRelay *.domain.com 192.0.2.255
      -BrowseRelay host.domain.com 192.0.2.255
      -
      -
    -

    Description

    -

    The BrowseRelay directive specifies source and - destination addresses for relaying browsing information from one host - or network to another. Multiple BrowseRelay directives can - be specified as needed.

    -

    BrowseRelay is typically used on systems that bridge - multiple subnets using one or more network interfaces. It can also be - used to relay printer information from polled servers with the line:

    -
      -
      -BrowseRelay 127.0.0.1 255.255.255.255
      -
      -
    -

    This effectively provides access to printers on a WAN for all clients - on the LAN(s). - -

    -

    BrowseShortNames

    -
    -

    Examples

    -
      -
      -BrowseShortNames Yes
      -BrowseShortNames No
      -
      -
    -

    Description

    -

    The BrowseShortNames directive specifies whether or not - short names are used for remote printers when possible. Short names are - just the remote printer name, without the server ("printer"). If more - than one remote printer is detected with the same name, the printers - will have long names ("printer@server1", "printer@server2".)

    -

    The default value for this option is Yes. - -

    -

    BrowseTimeout

    -
    -

    Examples

    -
      -
      -BrowseTimeout 300
      -BrowseTimeout 60
      -
      -
    -

    Description

    -

    The BrowseTimeout directive sets the timeout for printer - or class information that is received in browse packets. Once a printer - or class times out it is removed from the list of available - destinations.

    -

    The BrowseTimeout value should always be greater than - the BrowseInterval value. - Otherwise printers and classes will disappear from client systems - between updates. - -

    -

    Browsing

    -
    -

    Examples

    -
      -
      -Browsing On
      -Browsing Off
      -
      -
    -

    Description

    -

    The Browsing directive controls whether or not network - printer browsing is enabled. The default setting is On.

    -
    - - -
    NOTE: -

    If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8 - bits, printer browsing (and in fact all broadcast reception) will not - work. This problem appears to be fixed in HP-UX 11.0.

    -
    -
    - - -

    Classification

    -
    -

    Examples

    -
      -
      -Classification
      -Classification classified
      -Classification confidential
      -Classification secret
      -Classification topsecret
      -Classification unclassified
      -
      -
    -

    Description

    -

    The Classification 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. - -

    -

    ClassifyOverride

    -
    -

    Examples

    -
      -
      -ClassifyOverride Yes
      -ClassifyOverride No
      -
      -
    -

    Description

    -

    The ClassifyOverride 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 job-sheets option and can choose to only print one - security banner before or after the job. If the job-sheets - option is set to none then the server default - classification is used.

    -

    The default is to not allow classification overrides. - -

    -

    ConfigFilePerm

    -
    -

    Examples

    -
      -
      -ConfigFilePerm 0644
      -ConfigFilePerm 0600
      -
      -
    -

    Description

    -

    The ConfigFilePerm directive specifies the permissions - to use when writing configuration files. The default is 0600. - -

    -

    DataDir

    -
    -

    Examples

    -
      -
      -DataDir /usr/share/cups
      -
      -
    -

    Description

    -

    The DataDir directive sets the directory to use for data - files. - -

    -

    DefaultCharset

    -
    -

    Examples

    -
      -
      -DefaultCharset utf-8
      -DefaultCharset iso-8859-1
      -DefaultCharset windows-1251
      -
      -
    -

    Description

    -

    The DefaultCharset directive sets the default character - set to use for client connections. The default character set is -utf-8 but is overridden by the character set for the language - specified by the client or the DefaultLanguage directive. - -

    -

    DefaultLanguage

    -
    -

    Examples

    -
      -
      -DefaultLanguage de
      -DefaultLanguage en
      -DefaultLanguage es
      -DefaultLanguage fr
      -DefaultLanguage it
      -
      -
    -

    Description

    -

    The DefaultLanguage 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. - -

    -

    Deny

    -
    -

    Examples

    -
      -
      -Deny from All
      -Deny from None
      -Deny from *.domain.com
      -Deny from .domain.com
      -Deny from host.domain.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 @LOCAL
      -Deny from @IF(name)
      -
      -
    -

    Description

    -

    The Deny directive specifies a hostname, IP address, or - network that is allowed access to the server. Deny - directives are cummulative, so multiple Deny directives - can be used to allow access for multiple hosts or networks. The -/mm notation specifies a CIDR netmask: -

    - - - - - - -
    mmnetmask -mmnetmask
    00.0.0.0 -8255.0.0.0
    1128.0.0.0 -16255.255.0.0
    2192.0.0.0 -24255.255.255.0
    ...... -32255.255.255.255
    -
    -

    -

    The @LOCAL name will deny access from all local network - interfaces, but not remote point-to-point interfaces. The -@IF(name) name will deny access from the named interface.

    -

    The Deny directive must appear inside a - Location directive. - -

    -

    DocumentRoot

    -
    -

    Examples

    -
      -
      -DocumentRoot /usr/share/doc/cups
      -DocumentRoot /foo/bar/doc/cups
      -
      -
    -

    Description

    -

    The DocumentRoot 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 - ServerRoot directory. The default directory is - /usr/share/doc/cups.

    -

    Documents are first looked up in a sub-directory for the primary - language requested by the client (e.g. /usr/share/doc/cups/fr/... -) and then directly under the DocumentRoot directory (e.g. - /usr/share/doc/cups/...), so it is possible to localize the web - content by providing subdirectories for each language needed. - -

    -

    Encryption

    -
    -

    Examples

    -
      -
      -Encryption Never
      -Encryption IfRequested
      -Encryption Required
      -Encryption Always
      -
      -
    -

    Description

    -

    The Encryption directive must appear instead a - Location section and specifies the encryption settings - for that location. The default setting is IfRequested for - all locations. - -

    -

    ErrorLog

    -
    -

    Examples

    -
      -
      -ErrorLog /var/log/cups/error_log
      -ErrorLog /var/log/cups/error_log-%s
      -ErrorLog syslog
      -
      -
    -

    Description

    -

    The ErrorLog directive sets the name of the error log - file. If the filename is not absolute then it is assumed to be relative - to the ServerRoot directory. The - default error log file is /var/log/cups/error_log.

    -

    The server name can be included in the filename by using %s - in the name.

    -

    The special name "syslog" can be used to send the error information - to the system log instead of a plain file. - -

    -

    FilterLimit

    -
    -

    Examples

    -
      -
      -FilterLimit 0
      -FilterLimit 200
      -FilterLimit 1000
      -
      -
    -

    Description

    -

    The FilterLimit 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.

    -

    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

    -
    -

    Examples

    -
      -
      -FilterNice 0
      -FilterNice 39
      -FilterNice -10
      -
      -
    -

    Description

    -

    The FilterNice directive sets the scheduling priority of - job filters. Values larger than 0 give filters a lower priority while - values smaller than 0 give filters a higher priority. The -FilterNice value does not affect the priority of job backends.

    -

    The default priority is 0. - -

    -

    FontPath

    -
    -

    Examples

    -
      -
      -FontPath /foo/bar/fonts
      -FontPath /usr/share/cups/fonts:/foo/bar/fonts
      -
      -
    -

    Description

    -

    The FontPath directive specifies the font path to use - when searching for fonts. The default font path is -/usr/share/cups/fonts. - -

    -

    Group

    -
    -

    Examples

    -
      -
      -Group sys
      -Group system
      -Group root
      -
      -
    -

    Description

    -

    The Group directive specifies the UNIX group that filter - and CGI programs run as. The default group is sys, -system, or root depending on the operating system. - -

    -

    HideImplicitMembers

    -
    -

    Examples

    -
      -
      -HideImplicitMembers Yes
      -HideImplicitMembers No
      -
      -
    -

    Description

    -

    The HideImplicitMembers directive controls whether the - individual printers in an implicit class are shown to the user. The - default is No.

    -

    ImplicitClasses must be - enabled for this directive to have any effect.

    - - -

    HostNameLookups

    -
    -

    Examples

    -
      -
      -HostNameLookups On
      -HostNameLookups Off
      -HostNameLookups Double
      -
      -
    -

    Description

    -

    The HostNameLookups directive controls whether or not - CUPS looks up the hostname for connecting clients. The Double - setting causes CUPS 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. - Set this option to On or Double only if - absolutely required. - -

    -

    ImplicitClasses

    -
    -

    Examples

    -
      -
      -ImplicitClasses On
      -ImplicitClasses Off
      -
      -
    -

    Description

    -

    The ImplicitClasses directive controls whether implicit - classes are created based upon the available network printers and - classes. The default setting is On but is automatically - turned Off if Browsing - is turned Off. - -

    -

    ImplicitAnyClasses

    -
    -

    Examples

    -
      -
      -ImplicitAnyClasses On
      -ImplicitAnyClasses Off
      -
      -
    -

    Description

    -

    The ImplicitAnyClasses directive controls whether - implicit classes for local and remote printers are created with the - name AnyPrinter. The default setting is Off.

    -

    ImplicitClasses must be - enabled for this directive to have any effect.

    - - -

    Include

    -
    -

    Examples

    -
      -
      -Include filename
      -Include /foo/bar/filename
      -
      -
    -

    Description

    -

    The Include directive includes the named file in the -cupsd.conf file. If no leading path is provided, the file is - assumed to be relative to the ServerRoot - directory.

    - - -

    KeepAlive

    -
    -

    Examples

    -
      -
      -KeepAlive On
      -KeepAlive Off
      -
      -
    -

    Description

    -

    The KeepAlive directive controls whether or not to - support persistent HTTP connections. The default is On.

    -

    HTTP/1.1 clients automatically support persistent connections, while - HTTP/1.0 clients must specifically request them using the -Keep-Alive attribute in the Connection: field of - each request. - -

    -

    KeepAliveTimeout

    -
    -

    Examples

    -
      -
      -KeepAliveTimeout 60
      -KeepAliveTimeout 30
      -
      -
    -

    Description

    -

    The KeepAliveTimeout directive controls how long a - persistent HTTP connection will remain open after the last request. The - default is 60 seconds. - -

    -

    Limit

    -
    -

    Examples

    -
      -
      -<Limit GET POST>
      -...
      -</Limit>
      -
      -<Limit ALL>
      -...
      -</Limit>
      -
      -
    -

    Description

    -

    The Limit directive groups access control directives for - specific types of HTTP requests and must appear inside a - Location section. Access can be limited for individual - request types (DELETE, GET, HEAD -, OPTIONS, POST, PUT, and -TRACE) or for all request types (ALL). The request - type names are case-sensitive for compatibility with Apache. - -

    -

    LimitExcept

    -
    -

    Examples

    -
      -
      -<LimitExcept GET POST>
      -...
      -</LimitExcept>
      -
      -
    -

    Description

    -

    The LimitExcept directive groups access control - directives for specific types of HTTP requests and must appear inside a Location section. Unlike the - Limit directive, LimitExcept restricts - access for all requests except those listed on the -LimitExcept line. - -

    -

    LimitRequestBody

    -
    -

    Examples

    -
      -
      -LimitRequestBody 10485760
      -LimitRequestBody 10m
      -LimitRequestBody 0
      -
      -
    -

    Description

    -

    The LimitRequestBody 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.

    -

    Also see the identical MaxRequestSize - directive. - -

    -

    Listen

    -
    -

    Examples

    -
      -
      -Listen 127.0.0.1:631
      -Listen 192.0.2.1:631
      -
      -
    -

    Description

    -

    The Listen directive specifies a network address and - port to listen 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. - -

    -

    Location

    -
    -

    Examples

    -
      -
      -<Location />
      -...
      -</Location>
      -
      -<Location /admin>
      -...
      -</Location>
      -
      -<Location /printers>
      -...
      -</Location>
      -
      -<Location /printers/name>
      -...
      -</Location>
      -
      -<Location /classes>
      -...
      -</Location>
      -
      -<Location /classes/name>
      -...
      -</Location>
      -
      -
    -

    Description

    -

    The Location directive specifies access control and - authentication options for the specified HTTP resource or path. The - Allow, AuthClass -, AuthGroupName, - AuthType, Deny, - Encryption, Limit, - LimitExcept, Order, Require, and -Satisfy directives may all appear inside a location. -

    - - - - - - - - - - - - - - -
    Locations on the Server.
    LocationDescription
    /The path for all get operations (get-printers, - get-jobs, etc.)
    /adminThe path for all administration operations - (add-printer, delete-printer, start-printer, etc.)
    /admin/confThe path for access to the ESP Print Pro - configuration files (cupsd.conf, client.conf, etc.)
    /classesThe path for all classes
    /classes/nameThe resource for class name
    /jobsThe path for all jobs (hold-job, release-job, - etc.)
    /jobs/idThe resource for job id
    /printersThe path for all printers
    /printers/nameThe path for printer name
    /printers/name.ppdThe PPD file path for printer -name
    -
    -

    -

    Note that more specific resources override the less specific ones. So - the directives inside the /printers/name location will - override ones from /printers. Directives inside -/printers will override ones from /.   None of the - directives are inherited. More information can be found in section - "Printing System Security". - -

    -

    LogFilePerm

    -
    -

    Examples

    -
      -
      -LogFilePerm 0644
      -LogFilePerm 0600
      -
      -
    -

    Description

    -

    The LogFilePerm directive specifies the permissions to - use when writing configuration files. The default is 0644. - -

    -

    LogLevel

    -
    -

    Examples

    -
      -
      -LogLevel none
      -LogLevel emerg
      -LogLevel alert
      -LogLevel crit
      -LogLevel error
      -LogLevel warn
      -LogLevel notice
      -LogLevel info
      -LogLevel debug
      -LogLevel debug2
      -
      -
    -

    Description

    -

    The LogLevel directive specifies the level of logging - for the ErrorLog file. The - following values are recognized (each level logs everything under the - preceding levels):

    -
      -
    • none - Log nothing.
    • -
    • emerg - Log emergency conditions that prevent the - server from running.
    • -
    • alert - Log alerts that must be handled immediately.
    • -
    • crit - Log critical errors that don't prevent the - server from running.
    • -
    • error - Log general errors.
    • -
    • warn - Log errors and warnings.
    • -
    • notice - Log temporary error conditions.
    • -
    • info - Log all requests and state changes (default).
    • -
    • debug - Log basic debugging information.
    • -
    • debug2 - Log all debugging information.
    • -
    - - -

    MaxClients

    -
    -

    Examples

    -
      -
      -MaxClients 100
      -MaxClients 1024
      -
      -
    -

    Description

    -

    The MaxClients directive controls the maximum number of - simultaneous clients that will be allowed by the server. The default is - 100 clients.

    -
    - - -
    NOTE: -

    Since each print job requires a file descriptor for the status pipe, - the CUPS server internally limits the MaxClients value to - 1/3 of the available file descriptors to avoid possible problems when - printing large numbers of jobs.

    -
    -
    - - -

    MaxCopies

    -
    -

    Examples

    -
      -
      -MaxCopies 100
      -MaxCopies 65535
      -
      -
    -

    Description

    -

    The MaxCopies directive controls the maximum number of - copies that a user can print of a job. The default is 100 copies.

    -
    - - -
    NOTE: -

    Most HP PCL laser printers internally limit the number of copies to - 100.

    -
    -
    - - -

    MaxJobs

    -
    -

    Examples

    -
      -
      -MaxJobs 100
      -MaxJobs 9999
      -MaxJobs 0
      -
      -
    -

    Description

    -

    The MaxJobs 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.

    -

    Setting the maximum to 0 disables this functionality. The default - setting is 0. - -

    -

    MaxJobsPerPrinter

    -
    -

    Examples

    -
      -
      -MaxJobsPerPrinter 100
      -MaxJobsPerPrinter 9999
      -MaxJobsPerPrinter 0
      -
      -
    -

    Description

    -

    The MaxJobsPerPrinter 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 cancelled.

    -

    Setting the maximum to 0 disables this functionality. The default - setting is 0. - -

    -

    MaxJobsPerUser

    -
    -

    Examples

    -
      -
      -MaxJobsPerUser 100
      -MaxJobsPerUser 9999
      -MaxJobsPerUser 0
      -
      -
    -

    Description

    -

    The MaxJobsPerUser 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 cancelled.

    -

    Setting the maximum to 0 disables this functionality. The default - setting is 0. - -

    -

    MaxLogSize

    -
    -

    Examples

    -
      -
      -MaxLogSize 1048576
      -MaxLogSize 1m
      -MaxLogSize 0
      -
      -
    -

    Description

    -

    The MaxLogSize 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 filename.O. This allows you to - rotate the logs automatically. The default size is 1048576 bytes (1MB).

    -

    Setting the maximum size to 0 disables log rotation. - -

    -

    MaxRequestSize

    -
    -

    Examples

    -
      -
      -MaxRequestSize 10485760
      -MaxRequestSize 10m
      -MaxRequestSize 0
      -
      -
    -

    Description

    -

    The MaxRequestSize 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.

    -

    Also see the identical -LimitRequestBody directive. - -

    -

    Order

    -
    -

    Examples

    -
      -
      -Order Allow,Deny
      -Order Deny,Allow
      -
      -
    -

    Description

    -

    The Order directive defines the default access control. - The following values are supported:

    -
      -
    • Allow,Deny - Allow requests from all systems except - for those listed in a Deny directive.
    • -
    • Deny,Allow - Allow requests only from those listed in - an Allow directive.
    • -
    -

    The Order directive must appear inside a - Location directive. - -

    -

    PageLog

    -
    -

    Examples

    -
      -
      -PageLog /var/log/cups/page_log
      -PageLog /var/log/cups/page_log-%s
      -PageLog syslog
      -
      -
    -

    Description

    -

    The PageLog directive sets the name of the page log - file. If the filename is not absolute then it is assumed to be relative - to the ServerRoot directory. The - default page log file is /var/log/cups/page_log.

    -

    The server name can be included in the filename by using %s - in the name.

    -

    The special name "syslog" can be used to send the page information to - the system log instead of a plain file. - -

    -

    Port

    -
    -

    Examples

    -
      -
      -Port 631
      -Port 80
      -
      -
    -

    Description

    -

    The Port directive specifies a port to listen on. - Multiple Port lines can be specified to listen on multiple - ports. The default port is 631. - -

    -

    PreserveJobHistory

    -
    -

    Examples

    -
      -
      -PreserveJobHistory On
      -PreserveJobHistory Off
      -
      -
    -

    Description

    -

    The PreserveJobHistory directive controls whether the - history of completed, cancelled, or aborted print jobs is stored on - disk.

    -

    A value of On (the default) preserves job information - until the administrator purges it with the cancel command.

    -

    A value of Off removes the job information as soon as - each job is completed, cancelled, or aborted. - -

    -

    PreserveJobFiles

    -
    -

    Examples

    -
      -
      -PreserveJobFiles On
      -PreserveJobFiles Off
      -
      -
    -

    Description

    -

    The PreserveJobFiles directive controls whether the - document files of completed, cancelled, or aborted print jobs are - stored on disk.

    -

    A value of On preserves job files until the - administrator purges them with the cancel command. Jobs - can be restarted (and reprinted) as desired until they are purged.

    -

    A value of Off (the default) removes the job files as - soon as each job is completed, cancelled, or aborted. - -

    -

    Printcap

    -
    -

    Examples

    -
      -
      -Printcap
      -Printcap /etc/printcap
      -Printcap /etc/printers.conf
      -
      -
    -

    Description

    -

    The Printcap 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 - /etc/printcap.

    -

    When a filename is specified (e.g. /etc/printcap), 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. - -

    -

    PrintcapFormat

    -
    -

    Examples

    -
      -
      -PrintcapFormat BSD
      -PrintcapFormat Solaris
      -
      -
    -

    Description

    -

    The PrintcapFormat directive controls the output format - of the printcap file. The default is to generate a BSD printcap file. - -

    -

    PrintcapGUI

    -
    -

    Example

    -
      -
      -PrintcapGUI /usr/bin/glpoptions
      -
      -
    -

    Description

    -

    The PrintcapGUI directive sets the program to use when - displaying an option panel from an IRIX application that uses the - Impressario print API. The default program is the ESP Print Pro - "glpoptions" GUI.

    -

    The program must accept the -d option to specify a - printer and the -o option to specify one or more options. - After allowing the user to select/change options, the program must then - write the list of printing options without the -o to the - standard output. - -

    -

    RemoteRoot

    -
    -

    Examples

    -
      -
      -RemoteRoot remroot
      -RemoteRoot root
      -
      -
    -

    Description

    -

    The RemoteRoot directive sets the username for - unauthenticated root requests from remote hosts. The default username - is remroot. Setting RemoteRoot to root - effectively disables this security mechanism. - -

    -

    RequestRoot

    -
    -

    Examples

    -
      -
      -RequestRoot /var/spool/cups
      -RequestRoot /foo/bar/spool/cups
      -
      -
    -

    Description

    -

    The RequestRoot 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 - ServerRoot directory. The default request directory is - /var/spool/cups. - -

    -

    Require

    -
    -

    Examples

    -
      -
      -Require group foo bar
      -Require user john mary
      -Require valid-user
      -
      -
    -

    Description

    -

    The Require directive specifies that authentication is - required for the resource. The group keyword specifies - that the authenticated user must be a member of one or more of the - named groups that follow.

    -

    The user keyboard specifies that the authenticated user - must be one of the named users that follow.

    -

    The valid-user keyword specifies that any authenticated - user may access the resource.

    -

    The default is to do no authentication. This directive must appear - inside a Location directive. - -

    -

    RIPCache

    -
    -

    Examples

    -
      -
      -RIPCache 8m
      -RIPCache 1g
      -RIPCache 2048k
      -
      -
    -

    Description

    -

    The RIPCache directive sets the size of the memory cache - used by Raster Image Processor ("RIP") filters such as -imagetoraster and pstoraster. The size can be - suffixed with a "k" for kilobytes, "m" for megabytes, or "g" for - gigabytes. The default cache size is "8m", or 8 megabytes. - -

    -

    RootCertDuration

    -
    -

    Examples

    -
      -
      -RootCertDuration 300
      -RootCertDuration 0
      -
      -
    -

    Description

    -

    The RootCertDuration directive controls the interval - between updates of the root authentication certificate. The default is -300 seconds which updates the root certificate approximately once - every 5 minutes. Set the interval to 0 to disable certificate updates - entirely. - -

    -

    RunAsUser

    -
    -

    Examples

    -
      -
      -RunAsUser Yes
      -RunAsUser No
      -
      -
    -

    Description

    -

    The RunAsUser directive controls whether the scheduler - runs as the unpriviledged user account (usually lp). The - default is No which leaves the scheduler running as the -root user.

    -

    Note: Running as a non-priviledged user may prevent LPD and - locally connected printers from working due to permission problems. The - lpd backend will automatically use a non-priviledged mode - that is not 100% compliant with RFC 1179. The parallel, -serial, and usb backends will need write access to - the corresponding device files. - -

    -

    Satisfy

    -
    -

    Examples

    -
      -
      -Satisfy all
      -Satisfy any
      -
      -
    -

    Description

    -

    The Satisfy directive specifies whether all conditions - must be satisfied to allow access to the resource. If set to all -, then all authentication and access control conditions must be satified - to allow access.

    -

    Setting Satisfy to any 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.

    -

    The default is all. This directive must appear inside a Location directive. - -

    -

    ServerAdmin

    -
    -

    Examples

    -
      -
      -ServerAdmin user@host
      -ServerAdmin root@foo.bar.com
      -
      -
    -

    Description

    -

    The ServerAdmin directive identifies the email address - for the administrator on the system. By default the administrator email - address is root@server, where server is the - server name. - -

    -

    ServerBin

    -
    -

    Examples

    -
      -
      -ServerBin /usr/lib/cups
      -ServerBin /foo/bar/lib/cups
      -
      -
    -

    Description

    -

    The ServerBin directive sets the directory for - server-run executables. If an absolute path is not provided then it is - assumed to be relative to the ServerRoot - directory. The default executable directory is /usr/lib/cups -. - -

    -

    ServerCertificate

    -
    -

    Examples

    -
      -
      -ServerCertificate /etc/cups/ssl/server.crt
      -
      -
    -

    Description

    -

    The ServerCertificate 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. The default certificate file is - /etc/cups/ssl/server.crt. - -

    -

    ServerKey

    -
    -

    Examples

    -
      -
      -ServerKey /etc/cups/ssl/server.key
      -
      -
    -

    Description

    -

    The ServerKey directive specifies the location of the - SSL private key file used by the server when negotiating encrypted - connections. The default key file is /etc/cups/ssl/server.crt -. - -

    -

    ServerName

    -
    -

    Examples

    -
      -
      -ServerName foo.domain.com
      -ServerName myserver.domain.com
      -
      -
    -

    Description

    -

    The ServerName directive specifies the hostname that is - reported to clients. By default the server name is the hostname. - -

    -

    ServerRoot

    -
    -

    Examples

    -
      -
      -ServerRoot /etc/cups
      -ServerRoot /foo/bar/cups
      -
      -
    -

    Description

    -

    The ServerRoot directive specifies the absolute path to - the server configuration and state files. It is also used to resolve - relative paths in the cupsd.conf file. The default server - directory is /etc/cups. - -

    -

    SSLListen

    -
    -

    Examples

    -
      -
      -SSLListen 127.0.0.1:443
      -SSLListen 192.0.2.1:443
      -
      -
    -

    Description

    -

    The SSLListen directive specifies a network address and - port to listen for secure connections. Multiple SSLListen - directives can be provided to listen on multiple addresses.

    -

    The SSLListen directive is similar to the - SSLPort directive but allows you to restrict access to - specific interfaces or networks. - -

    -

    SSLPort

    -
    -

    Examples

    -
      -
      -SSLPort 443
      -
      -
    -

    Description

    -

    The SSLPort directive specifies a port to listen on for - secure connections. Multiple SSLPort lines can be - specified to listen on multiple ports. - -

    -

    SystemGroup

    -
    -

    Examples

    -
      -
      -SystemGroup sys
      -SystemGroup system
      -SystemGroup root
      -
      -
    -

    Description

    -

    The SystemGroup directive specifies the system - administration group for System authentication. More - information can be found later in this chapter in - "Printing System Security". - -

    -

    TempDir

    -
    -

    Examples

    -
      -
      -TempDir /var/tmp
      -TempDir /foo/bar/tmp
      -
      -
    -

    Description

    -

    The TempDir directive specifies an absolute path for the - directory to use for temporary files. The default directory is - /var/tmp.

    -

    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 /foo/bar/tmp:

    -
      -
      -mkdir /foo/bar/tmp ENTER
      -chmod a+rwxt /foo/bar/tmp ENTER
      -
      -
    - - -

    Timeout

    -
    -

    Examples

    -
      -
      -Timeout 300
      -Timeout 90
      -
      -
    -

    Description

    -

    The Timeout directive controls the amount of time to - wait before an active HTTP or IPP request times out. The default - timeout is 300 seconds. - -

    -

    User

    -
    -

    Examples

    -
      -
      -User lp
      -User guest
      -
      -
    -

    Description

    -

    The User directive specifies the UNIX user that filter - and CGI programs run as. The default user is lp. - -

    -

    Printing System Security

    -

    CUPS provides support for address, certificate, and password (Basic - and Digest) based authentication and access control. Certificate and - password authentication provide ways to limit access to individual - people or groups.

    -

    Address based access control allows you to limit access to specific - systems, networks, or domains. While this does not provide - authentication, it does allow you to limit the potential users of your - system efficiently.

    -

    CUPS maintains a list of locations that have access control and/or - authentication enabled. Locations are specified using the - Location directive:

    - -

    Locations generally follow the directory structure of the - DocumentRoot directory, however CUPS does have several - virtual locations for administration, classes, jobs, and printers: -

    - - - - - - - - - - - - -
    LocationDescription
    /adminThe path for all administration operations.
    /classesThe path for all classes.
    /classes/nameThe resource for class name.
    /jobsThe path for all jobs.
    /jobs/idThe resource for job id.
    /printersThe path for all printers.
    /printers/nameThe path for printer name.
    /printers/name.ppdThe PPD file path for printer -name.
    -
    -

    -

    Authentication Using Certificates

    -

    CUPS supports a local certificate-based authentication scheme that - can be used in place of Basic or Digest - authentication by clients connecting through the localhost - interface. Certificate authentication is not supported or allowed from - clients on any other interface.

    -

    Certificates are 128-bit random numbers that refer to an internal - authentication record in the server. A client connecting via the -localhost interface sends a request with an authorization header - of:

    -
      -
      -Authorization: Local 0123456789ABCDEF0123456789ABCDEF
      -
      -
    -

    The server then looks up the local certificate and authenticates - using the username associated with it.

    -

    Certificates are generated by the server automatically and stored in - the /etc/cups/certs directory using the process ID of the - CGI program started by the server. Certificate files are only readable - by the User and -Group defined in the cupsd.conf file. When the CGI - program ends the certificate is removed and invalidated automatically.

    -

    The special file /etc/cups/certs/0 defines the root - certificate which can be used by any client running as the - super-user or another user that is part of the group defined by the - SystemGroup directive. The root certificate is - automatically regenerated every 5 minutes.

    -

    Using Basic Authentication

    -

    Basic authentication uses UNIX users and passwords to authenticate - access to resources such as printers and classes, and to limit access - to administrative functions.

    -
    - - -
    NOTE: -

    Basic authentication sends the username and password Base64 encoded - from the client to the server, so it offers no protection against - eavesdropping. This means that a malicious user can monitor network - packets and discover valid users and passwords that could result in a - serious compromise in network security. Use Basic authentication with - extreme care.

    -
    -
    -

    The CUPS implementation of Basic authentication does not allow access - through user accounts without a password. If you try to authenticate - using an account without a password, your access will be immediately - blocked.

    -

    Once a valid username and password is authenticated by CUPS, any - additional group membership requirements are checked.

    -
    - - -
    NOTE: -

    The root user is considered by CUPS to be a member of every group.

    -
    -
    - - -

    Use the AuthType directive to enable Basic - authentication:

    -
      -
      -AuthType Basic
      -
      -
    - - -

    Using Digest Authentication

    -

    Digest authentication uses users and passwords defined in the - /etc/cups/passwd.md5 file to authenticate access to resources - such as printers and classes, and to limit access to administrative - functions.

    -
    - - -
    NOTE: -

    Unlike Basic authentication, Digest passes the MD5 sum (basically a - complicated checksum) of the username and password instead of the - strings themselves. Also, Digest authentication does not use the UNIX - password file, so if an attacker does discover the original password it - is less likely to result in a serious security problem so long as you - use a different UNIX password than the corresponding Digest password.

    -

    The current CUPS implementation of Digest authentication uses the - client's hostname or IP address for the "nonce" value. The nonce value - is an additional string added to the username and password to make - guessing the password more difficult. The server checks that the nonce - value matches the client's hostname or address and rejects the MD5 sum - if it doesn't. Future versions of CUPS will support Digest "session" - authentication which adds the request data to the MD5 sum, providing - even better authentication and security.

    -

    Digest authentication does not guarantee that an attacker cannot gain - unauthorized access, but it is safer than Basic authentication and - should be used in place of Basic authentication whenever possible. - Support for Digest authentication in web browsers is not yet - universally available.

    -
    -
    - - -

    The lppasswd(1) command is used to add, change, or - remove accounts from the passwd.md5 file. To add a user to - the default system group, type:

    -
      -
      -lppasswd -a user ENTER
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
      -
    - - -

    Once added, a user can change his/her password by typing:

    -
      -
      -lppasswd ENTER
      -Old password: (password) ENTER [password is not echoed]
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
      -
    - - -

    To remove a user from the password file, type:

    -
      -
      -lppasswd -x user ENTER
      -
      -
    -

    Once a valid username and password is authenticated by CUPS, any - additional group membership requirements are checked.

    -
    - - -
    NOTE: -

    The root user is considered by CUPS to be a member of every group.

    -
    -
    -

    Use the AuthType directive to enable Digest - authentication:

    -
      -
      -AuthType Digest
      -
      -
    -

    System and Group Authentication

    -

    The AuthClass directive - controls the level of authentication to perform. System - and Group authentication extend the normal user-based - authentication to require membership in a UNIX group. For System - authentication each user must belong to the sys, -system, or root group; the actual group depends on - the operating system.

    -

    For Group authentication each user must belong to the - group named by the AuthGroupName - directive:

    -
      -
      -<Location /path>
      -AuthType Digest
      -AuthClass Group
      -AuthGroupName mygroup
      -</Location>
      -
      -
    -

    The named group must be a valid UNIX user group, usually defined in - the /etc/group or /etc/netgroup files. - Additionally, when using Digest authentication you need to create user - accounts with the named group:

    -
      -
      -lppasswd -g mygroup -a user ENTER
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
      -
    - - -

    Printer Accounting

    -

    CUPS maintains a log of all accesses, errors, and pages that are - printed. The log files are normally stored in the /var/log/cups - directory. You can change this by editing the /etc/cups/cupsd.conf - configuration file.

    -

    The access_log File

    -

    The access_log file lists each HTTP resource that is - accessed by a web browser or CUPS/IPP client. Each line is in the - so-called "Common Log Format" used by many web servers and web - reporting tools:

    -
      -
      -host group user date-time \"method resource version\" status bytes
      -
      -127.0.0.1 - - [20/May/1999:19:20:29 +0000] "POST /admin/ HTTP/1.1" 401 0
      -127.0.0.1 - mike [20/May/1999:19:20:31 +0000] "POST /admin/ HTTP/1.1" 200 0
      -
      -
    -

    The host field will normally only be an IP address unless you - have enabled the HostNameLookups - directive in the cupsd.conf file.

    -

    The group field always contains "-" in CUPS.

    -

    The user field is the authenticated username of the requesting - user. If no username and password is supplied for the request then this - field contains "-".

    -

    The date-time field is the date and time of the request in - local time and is in the format:

    -
      -
      -[DD/MON/YYYY:HH:MM:SS +ZZZZ]
      -
      -
    -

    where ZZZZ is the timezone offset in hours and minutes from - Greenwich Mean Time (a.k.a. GMT a.k.a. ZULU.)

    -

    The method field is the HTTP method used ("GET", "PUT", - "POST", etc.)

    -

    The resource field is the filename of the requested resource.

    -

    The version field is the HTTP specification version used by - the client. For CUPS clients this will always be "HTTP/1.1".

    -

    The status field contains the HTTP result status of the - request. Usually it is "200", but other HTTP status codes are possible. - For example, 401 is the "unauthorized access" status in the example - above.

    -

    The bytes field contains the number of bytes in the request. - For POST requests the bytes field contains the number of bytes - that was received from the client.

    -

    The error_log File

    -

    The error_log file lists messages from the scheduler - (errors, warnings, etc.):

    -
      -
      -level date-time message
      -
      -I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
      -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 was cancelled by 'mike'.
      -
      -
    -

    The level field contains the type of message:

    -
      -
    • E - An error occurred.
    • -
    • W - The server was unable to perform some action.
    • -
    • I - Informational message.
    • -
    • D - Debugging message.
    • -
    -

    The date-time field contains the date and time of when the - page started printing. The format of this field is identical to the - data-time field in the access_log file.

    -

    The message fields contains a free-form textual message.

    -

    The page_log File

    -

    The page_log file lists each page that is sent to a - printer. Each line contains the following information:

    -
      -
      -printer user job-id date-time page-number num-copies job-billing
      -
      -DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 0 acme-123
      -
      -
    -

    The printer field contains the name of the printer that - printed the page. If you send a job to a printer class, this field will - contain the name of the printer that was assigned the job.

    -

    The user field contains the name of the user (the IPP -requesting-user-name attribute) that submitted this file for - printing.

    -

    The job-id field contains the job number of the page being - printed. Job numbers are reset to 1 whenever the CUPS server is - started, so don't depend on this number being unique!

    -

    The date-time field contains the date and time of when the - page started printing. The format of this field is identical to the - data-time field in the access_log file.

    -

    The page-number and num-pages fields contain the page - number and number of copies being printed of that page. For printer - that can not produce copies on their own, the num-pages field - will always be 1.

    -

    The job-billing field contains a copy of the job-billing - attribute provided with the IPP create-job or -print-job requests or "-" if none was provided. - -

    -

    File Typing and Filtering

    -

    CUPS provides a MIME-based file typing and filtering mechanism to - convert files to a printable format for each printer. On startup the - CUPS server reads MIME database files from the /etc/cups - directory (or a directory specified by the -ServerRoot directive) to build a file type and conversion - database in memory. These database files are plain ASCII text and can - be edited with your favorite text editor.

    -

    The mime.types and mime.convs files define the - standard file types and filters that are available on the system.

    -

    mime.types

    -

    The mime.types file defines the known file types. Each - line of the file starts with the MIME type and may be followed by one - or more file type recognition rules. For example, the text/html - file type is defined as:

    -
      -
      -text/html       html htm \
      -                printable(0,1024) + \
      -                (string(0,"<HTML>") string(0,"<!DOCTYPE"))
      -
      -
    -

    The first two rules say that any file with an extension of .html - or .htm is a HTML file. The third rule says that any file - whose first 1024 characters are printable text and starts with the - strings <HTML> or <!DOCTYPE is a HTML file as - well.

    -

    The first two rules deal solely with the name of the file being - typed. This is useful when the original filename is known, however for - print files the server doesn't have a filename to work with. The third - rule takes care of this possibility and automatically figures out the - file type based upon the contents of the file instead.

    -

    The available tests are:

    -
      -
    • ( expr ) - Parenthesis for expression grouping
    • -
    • + - Logical AND
    • -
    • , or whitespace - Logical OR
    • -
    • ! - Logical NOT
    • -
    • match("pattern") - Pattern match on filename
    • -
    • extension - Pattern match on "*.extension"
    • -
    • ascii(offset,length) - True if bytes are valid - printable ASCII (CR, NL, TAB, BS, 32-126)
    • -
    • printable(offset,length) - True if bytes are printable - 8-bit chars (CR, NL, TAB, BS, 32-126, 160-254)
    • -
    • string(offset,"string") - True if bytes are identical - to string
    • -
    • contains(offset,range,"string") - True if the range of - bytes contains the string
    • -
    • char(offset,value) - True if byte is identical
    • -
    • short(offset,value) - True if 16-bit integer is - identical (network or "big-endian" byte order)
    • -
    • int(offset,value) - True if 32-bit integer is identical - (network or "big-endian" byte order)
    • -
    • locale("string") - True if current locale matches - string
    • -
    -

    All numeric values can be in decimal (123), octal (0123), or - hexadecimal (0x123) as desired. - -

    -

    Strings can be in quotes, all by themselves, as a string of - hexadecimal values, or some combination:

    -
      -
      -"string"
      -'string'
      -string
      -<737472696e67>
      -<7374>ring
      -
      -
    -

    As shown in the text/html example, rules can continue on - multiple lines using the backslash (\) character. A more complex - example is the image/jpeg rules:

    -
      -
      -image/jpeg      jpeg jpg jpe string(0,<FFD8FF>) &&\
      -                (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
      -                 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
      -                 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
      -                 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
      -
      -
    -

    This rule states that any file with an extension of .jpeg, - .jpg, or .jpe is a JPEG file. In addition, any file - starting with the hexadecimal string <FFD8FF> (JPEG - Start-Of-Image) followed by a character between and including -0xe0 and 0xef (JPEG APPn markers) is also a JPEG - file.

    -

    mime.convs

    -

    The mime.convs file defines all of the filter programs - that are known to the system. Each line consists of:

    -
      -
      -source destination cost program
      -
      -text/plain application/postscript 50 texttops
      -application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
      -image/* application/vnd.cups-postscript 50 imagetops
      -image/* application/vnd.cups-raster 50 imagetoraster
      -
      -
    -

    The source field is a MIME type, optionally using a wildcard - for the super-type or sub-type (e.g. "text/plain", "image/*", - "*/postscript").

    -

    The destination field is a MIME type defined in the - mime.types file.

    -

    The cost field defines a relative cost for the filtering - operation from 1 to 100. The cost is used to choose between two - different sets of filters when converting a file. For example, to - convert from image/jpeg to -application/vnd.cups-raster, you could use the imagetops - and pstoraster filters for a total cost of 100, or the -imagetoraster filter for a total cost of 50.

    -

    The program field defines the filter program to run; the - special program "-" can be used to make two file types equivalent. The - program must accept the standard filter arguments and environment - variables described in the CUPS Interface Design Description and CUPS - Software Programmers Manual:

    -
      -
      -program job user title options [filename]
      -
      -
    -

    If specified, the filename argument defines a file to read - when filtering, otherwise the filter must read from the standard input. - All filtered output must go to the standard output. - -

    -

    Adding Filetypes and Filters

    -

    Adding a new file type or filter is fairly straight-forward. Rather - than adding the new type and filter to the mime.types and - mime.convs files which are overwritten when you upgrade to a new - version of CUPS, you simple need to create new files with .types - and .convs extensions in the /etc/cups directory. - We recommend that you use the product or format name, e.g.:

    -
      -
      -myproduct.types
      -myproduct.convs
      -
      -
    -

    If you are providing a filter for a common file format or printer, - add the company or author name:

    -
      -
      -acme-msword.types
      -acme.msword.convs
      -
      -
    -

    This will help to prevent name collisions if you install many - different file types and filters.

    -

    Once you choose the names for these files, create them using your - favorite text editor as described earlier in this chapter. Once you - have created the files, restart the cupsd process as - described earlier in "Restarting the CUPS Server" -.

    -

    Printer Drivers and PPD Files

    -

    Most CUPS printer drivers utilize one or more printer-specific - filters and a PPD file for each printer model. Printer driver filters - are registered via the PPD file using cupsFilter - attributes:

    -
      -
      -*cupsFilter: "application/vnd.cups-raster 0 rastertohp"
      -
      -
    -

    The filter is specified using the source file type only; the - destination file type is assumed to be printer/name - - suitable for sending to the printer.

    -

    Writing Your Own Filter or Printer Driver

    -

    CUPS supports an unlimited number of file formats and filters, and - can handle any printer. If you'd like to write a filter or printer - driver for your favorite file format or printer, consult the CUPS - Software Programmers Manual for step-by-step instructions.

    -

    7 - Printing with Other - Systems

    -

    This chapter describes how to print from client systems that use the - LPD, Mac OS, or Windows printing protocols.

    -

    The Basics

    -

    CUPS is based on the IPP protocol, so any system that supports IPP - can send jobs to and receive jobs from CUPS automatically. However, not - all systems support IPP yet. This chapter will show you how to connect - these systems to your CUPS server, either to accept jobs from your - server for printing, or to send jobs to your server.

    -

    Printing from LPD Clients

    -

    CUPS supports limited functionality for LPD-based clients. With LPD - you can print files to specific printers, list the queue status, and so - forth. However, the automatic client configuration and printer options - are not supported by the LPD protocol, so you must manually configure - each client for the printers it needs to access.

    -

    The cups-lpd(8) program provides support for LPD clients - and can be used from either the inetd(8) or -xinetd(8) programs. Add the following line to the - /etc/inetd.conf file to enable LPD support on your server through - the inetd program:

    -
      -
      -printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd
      -
      -
    -

    The path to the cups-lpd may vary depending on your - installation.

    -

    Once you have added this line, send the inetd process a -HUP signal or reboot the system:

    -
      -
      -killall -HUP inetd ENTER [IRIX and some versions of Linux]
      -kill -HUP pid ENTER [Others]
      -reboot ENTER [For all systems if the HUP signal fails]
      -
      -
    -

    If you are using the xinetd program, create a file named - /etc/xinetd.d/printer containing the following lines:

    -
      -
      -service printer
      -{
      -    socket_type = stream
      -    protocol = tcp
      -    wait = no
      -    user = lp
      -    server = /usr/lib/cups/daemon/cups-lpd
      -}
      -
      -
    -

    The xinetd program automatically reads the new - configuration file and enables LPD printing support. -

    - - -
    Warning: -

    cups-lpd currently does not perform any access control - based on the settings in cupsd.conf or in the - hosts.allow or hosts.deny files used by TCP wrappers. - Therefore, running cups-lpd on your server will allow any - computer on your network (and perhaps the entire Internet) to print to - your server.

    -

    While xinetd has built-in access control support, you - should use the TCP wrappers package with inetd to limit - access to only those computers that should be able to print through - your server.

    -
    -
    -

    -

    Printing to LPD Servers

    -

    CUPS provides the lpd backend for printing to LPD-based - servers and printers. Use a device URI of lpd://server/name - to print to a printer on an LPD server, where server is - the hostname or IP address of the server and name is the - queue name.

    -

    Microsoft Windows NT provides an LPD service under the name "TCP/IP - Printing Services". To enable LPD printing on NT, open the "Services" - control panel, select the "TCP/IP Printing Services" service, and click - on the "Start" button. Any shared printer will then be available via - the LPD protocol.

    -

    Printing from Mac OS Clients

    -

    CUPS does not provide Mac OS support directly. However, there are - several free and commercial software packages that do.

    -

    Columbia Appletalk Package (CAP)

    -

    Because the CAP LaserWriter server (lwsrv(8)) does not - support specification of PPD files, we do not recommend that you use - CAP with CUPS. However, you can run the lpsrv program for - limited printing with the command:

    -
      -
      -lwsrv -n "Name" -p printer -a /usr/lib/adicts -f /usr/lib/LW+Fonts
      -
      -
    -

    where Name is the name you want to use when sharing the - printer, and printer is the name of the CUPS print queue. - -

    -

    XINET KA/Spool

    -

    To use your system as a print server for Mac OS clients, configure - each printer using a papserver(8) in the - /usr/adm/appletalk/services file, specifying the corresponding - PPD file in the /etc/cups/ppd directory for each printer. - For a printer named MyPrinter the entry would look like:

    -
      -
      -/usr/etc/appletalk/papserver -I -L -P /etc/cups/ppd/MyPrinter.ppd \
      -"Printer Description" MyPrinter
      -
      -
    -
    - - -
    NOTE: -

    Enter the text above on a single line without the backslash (\) - character.

    -
    -
    -

    NetATalk

    -

    To use your system as a print server for Mac OS clients, configure - each printer in the papd.conf file, specifying the - corresponding PPD file in the /etc/cups/ppd directory for - each printer. For a printer named MyPrinter the entry - would look like:

    -
      -
      -Printer Description:MyPrinter@MyServer:\
      -        :pr=|/usr/bin/lp -d MyPrinter:\
      -        :op=daemon:\
      -        :pd=/etc/cups/ppd/MyPrinter.ppd:
      -
      -
    - - -

    Printing to Mac OS Servers

    -

    CUPS currently does not provide a backend to communicate with a Mac - OS server. However, you can write and install a short shell script in - the /usr/lib/cups/backend directory that sends a print file - using the appropriate command. The following is a short script that - will run the papif command provided with CAP.

    -

    After copying this script to /usr/lib/cups/backend/cap, - specify a device URI of cap://server/printer to use this - backend with a print queue. - -

    -
      -
      -"/usr/lib/cups/backend/cap"
      -#!/bin/sh
      -#
      -# Usage: cap job user title copies options [filename]
      -#
      -
      -# No arguments means show available devices...
      -
      -if test ${#argv} = 0; then
      -	echo "network cap \"Unknown\" \"Mac OS Printer via CAP\""
      -	exit 0
      -fi
      -
      -# Collect arguments...
      -
      -user=$2
      -copies=$4
      -
      -if test ${#argv} = 5; then
      -	# Get print file from stdin; copies have already been handled...
      -	file=/var/tmp/$$.prn
      -	copies=1
      -	cat > $file
      -else
      -	# Print file is on command-line...
      -	file=$6
      -fi
      -
      -# Create a dummy cap.printers file for this printer based
      -# upon a device URI of "cap://server/printer"...
      -
      -echo $PRINTER/$DEVICE_URI | \
      -	awk -F/ '{print $1 "=" $5 ":LaserWriter@" $4}' > /var/tmp/$$.cap
      -
      -CAPPRINTERS=/var/tmp/$$.cap; export CAPPRINTERS
      -
      -# Send the file to the printer, once for each copy. This assumes that you
      -# have properly initialized the cap.printers file...
      -
      -while [ $copies -gt 0 ]; do
      -	papif -n $user < $file
      -
      -        copies=`expr $copies - 1`
      -done
      -
      -# Remove any temporary files...
      -if test ${#argv} = 5; then
      -	/bin/rm -f $file
      -fi
      -
      -/bin/rm -f /var/tmp/$$.cap
      -
      -exit 0
      -
      -
    - - -

    Printing from Windows Clients

    -

    While CUPS does not provide Windows support directly, the free SAMBA - software package does. SAMBA version 2.0.6 is the first release of - SAMBA that supports CUPS. You can download SAMBA from:

    - -

    To configure SAMBA for CUPS, edit the smb.conf file and - replace the existing printing commands and options with the line:

    -
      -
      -printing = cups
      -printcap name = cups
      -
      -
    -

    That's all there is to it! Remote users will now be able to browse - and print to printers on your system.

    -

    Exporting Printer Drivers

    -

    You can optionally export printer drivers from your CUPS server using - the cupsaddsmb command and the SAMBA 2.2.0 or higher - software.

    -

    Before you can export the printers you must download the current - Adobe PostScript printer drivers from the Adobe web site ( -http://www.adobe.com/). Use the free unzip software to - extract the files from the self-extracting ZIP file containing the - drivers; you will need the following files:

    -
      -
      -ADFONTS.MFM
      -ADOBEPS4.DRV
      -ADOBEPS4.HLP
      -ADOBEPS5.DLL
      -ADOBEPSU.DLL
      -ADOBEPSU.HLP
      -DEFPRTR2.PPD
      -ICONLIB.DLL
      -PSMON.DLL
      -
      -
    -

    Copy these files to the /usr/share/cups/drivers directory - - you may need to rename some of the files so the filenames are all - UPPERCASE.

    -

    Next, add a print$ share for the printer drivers to your - smb.conf file:

    -
      -
      -[print$]
      -    comment = Printer Drivers
      -    path = /etc/samba/drivers
      -    browseable = yes
      -    guest ok = no
      -    read only = yes
      -    write list = root
      -
      -
    -

    The directory for your printer drivers can be anywhere on the system; - just make sure it is writable by the users specified by the write - list directive. Also, make sure that you have SAMBA passwords - defined for each user in the write list using the -smbpasswd(1) command. Otherwise you will not be able to - authenticate

    -

    Finally, run the cupsaddsmb command to export the - printer drivers for one or more queues:

    -
      -
      -cupsaddsmb -U root printer1 ... printerN ENTER
      -
      -
    -

    Running cupsaddsmb with the -a option will - export all printers:

    -
      -
      -cupsaddsmb -U root -a ENTER
      -
      -
    -

    Printing to Windows Servers

    -

    CUPS can print to Windows servers in one of two ways. The first way - uses the LPD protocol on the CUPS system and the "TCP/IP Printing - Services" on the Windows system. You can find out more about this - configuration in the LPD section earlier in this - chapter.

    -

    The second way is through the Microsoft Server Message Block ("SMB") - protocol. Support for this protocol is provided with the free SAMBA - software package. You can download SAMBA from:

    - -

    To configure CUPS for SAMBA, run the following command:

    -
      -
      -ln -s `which smbspool` /usr/lib/cups/backend/smb ENTER
      -
      -
    -

    The smbspool(1) program is provided with SAMBA starting - with SAMBA 2.0.6. Once you have made the link you can configure your - printers with one of the following device URIs:

    -
      -
      -smb://workgroup/server/sharename
      -smb://server/sharename
      -smb://user:pass@workgroup/server/sharename
      -smb://user:pass@server/sharename
      -
      -
    -

    The workgroup name need only be specified if your system - is using a different workgroup. The user:pass strings are - required when printing to Windows NT servers or to shares with - passwords enabled under Windows 95 and 98.

    -

    A - Software License Agreement

    -

    Common UNIX Printing System License - Agreement

    -

    Copyright 1997-2003 by Easy Software Products -
    44141 AIRPORT VIEW DR STE 204 -
    HOLLYWOOD, MARYLAND 20636-3111 USA -
    -
    Voice: +1.301.373.9600 -
    Email: cups-info@cups.org -
    WWW: http://www.cups.org

    -

    Introduction

    -

    The Common UNIX Printing SystemTM, ("CUPSTM"), - 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.

    -

    The GNU LGPL applies to the CUPS API library, located in the "cups" - subdirectory of the CUPS source distribution and in the "cups" include - directory and library files in the binary distributions. The GNU GPL - applies to the remainder of the CUPS distribution, including the - "pdftops" filter which is based upon Xpdf and the CUPS imaging library.

    -

    For those not familiar with the GNU GPL, the license basically allows - you to:

    -
      -
    • Use the CUPS software at no charge.
    • -
    • Distribute verbatim copies of the software in source or binary form.
    • -
    • Sell verbatim copies of the software for a media fee, or sell - support for the software.
    • -
    • Distribute or sell printer drivers and filters that use CUPS so long - as source code is made available under the GPL.
    • -
    -

    What this license does not allow you to do is make changes or - add features to CUPS and then sell a binary distribution without source - code. You must provide source for any new drivers, changes, or - additions to the software, and all code must be provided under the GPL - or LGPL as appropriate. The only exceptions to this are the portions of - the CUPS software covered by the Apple operating system license - exceptions outlined later in this license agreement.

    -

    The GNU LGPL relaxes the "link-to" restriction, allowing you to - develop applications that use the CUPS API library under other licenses - and/or conditions as appropriate for your application.

    -

    License Exceptions

    -

    In addition, as the copyright holder of CUPS, Easy Software Products - grants the following special exceptions:

    -
      -
    1. Apple Operating System Development License Exception; -
        -
      1. Software that is developed by any person or entity for an Apple - Operating System ("Apple OS-Developed Software"), including but not - limited to Apple and third party printer drivers, filters, and backends - for an Apple Operating System, that is linked to the CUPS imaging - library or based on any sample filters or backends provided with CUPS - shall not be considered to be a derivative work or collective work - based on the CUPS program and is exempt from the mandatory source code - release clauses of the GNU GPL. You may therefore distribute linked - combinations of the CUPS imaging library with Apple OS-Developed - Software without releasing the source code of the Apple OS-Developed - Software. You may also use sample filters and backends provided with - CUPS to develop Apple OS-Developed Software without releasing the - source code of the Apple OS-Developed Software.
      2. -
      3. An Apple Operating System means any operating system software - developed and/or marketed by Apple Computer, Inc., including but not - limited to all existing releases and versions of Apple's Darwin, Mac OS - X, and Mac OS X Server products and all follow-on releases and future - versions thereof.
      4. -
      5. This exception is only available for Apple OS-Developed Software and - does not apply to software that is distributed for use on other - operating systems.
      6. -
      7. All CUPS software that falls under this license exception have the - following text at the top of each source file:
        This file is - subject to the Apple OS-Developed Software exception.
      8. -
      -
    2. -
    3. OpenSSL Toolkit License Exception; -
        -
      1. Easy Software Products explicitly allows the compilation and - distribution of the CUPS software with the OpenSSL Toolkit.
      2. -
      -
    4. -
    -

    No developer is required to provide these exceptions in a derived - work.

    -

    Trademarks

    -

    Easy Software Products has trademarked the Common UNIX Printing - System, CUPS, and CUPS logo. These names and logos may be used freely - in any direct port or binary distribution of CUPS. Please contract Easy - Software Products for written permission to use them in derivative - products. Our intention is to protect the value of these trademarks and - ensure that any derivative product meets the same high-quality - standards as the original.

    -

    Binary Distribution Rights

    -

    Easy Software Products also sells rights to the CUPS source code - under a binary distribution license for vendors that are unable to - release source code for their drivers, additions, and modifications to - CUPS under the GNU GPL and LGPL. For information please contact us at - the address shown above.

    -

    The Common UNIX Printing System provides a "pdftops" filter that is - based on the Xpdf software. For binary distribution licensing of this - software, please contact:

    Derek B. Noonburg -
    Email: derekn@foolabs.com -
    WWW: - http://www.foolabs.com/xpdf/

    -

    Support

    -

    Easy Software Products sells software support for CUPS as well as a - commercial printing product based on CUPS called ESP Print Pro. You can - find out more at our web site:

    - - - -

    GNU GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright 1989, 1991 Free Software Foundation, Inc.
    -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    -Everyone is permitted to copy and distribute verbatim
    -copies of this license document, but changing it is not allowed.
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public License is - intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users. This - General Public License applies to most of the Free Software - Foundation's software and to any other program whose authors commit to - using it. (Some other Free Software Foundation software is covered by - the GNU Library General Public License instead.) You can apply it to - your programs, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the software, or if you modify it.

    -

    For example, if you distribute copies of such a program, whether - gratis or for a fee, you must give the recipients all the rights that - you have. You must make sure that they, too, receive or can get the - source code. And you must show them these terms so they know their - rights.

    -

    We protect your rights with two steps: (1) copyright the software, - and (2) offer you this license which gives you legal permission to - copy, distribute and/or modify the software.

    -

    Also, for each author's protection and ours, we want to make certain - that everyone understands that there is no warranty for this free - software. If the software is modified by someone else and passed on, we - want its recipients to know that what they have is not the original, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that redistributors of a free - program will individually obtain patent licenses, in effect making the - program proprietary. To prevent this, we have made it clear that any - patent must be licensed for everyone's free use or not licensed at all.

    -

    The precise terms and conditions for copying, distribution and - modification follow.

    -

    GNU GENERAL PUBLIC LICENSE -
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -
      -
    1. This License applies to any program or other work which contains a - notice placed by the copyright holder saying it may be distributed - under the terms of this General Public License. The "Program", below, - refers to any such program or work, and a "work based on the Program" - means either the Program or any derivative work under copyright law: - that is to say, a work containing the Program or a portion of it, - either verbatim or with modifications and/or translated into another - language. (Hereinafter, translation is included without limitation in - the term "modification".) Each licensee is addressed as "you". -

      Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - the Program is not restricted, and the output from the Program is - covered only if its contents constitute a work based on the Program - (independent of having been made by running the Program). Whether that - is true depends on what the Program does.

      -
    2. You may copy and distribute verbatim copies of the Program's source - code as you receive it, in any medium, provided that you conspicuously - and appropriately publish on each copy an appropriate copyright notice - and disclaimer of warranty; keep intact all the notices that refer to - this License and to the absence of any warranty; and give any other - recipients of the Program a copy of this License along with the - Program. -

      You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

      -
    3. You may modify your copy or copies of the Program or any portion of - it, thus forming a work based on the Program, and copy and distribute - such modifications or work under the terms of Section 1 above, provided - that you also meet all of these conditions: -
        -
      1. You must cause the modified files to carry prominent notices stating - that you changed the files and the date of any change.
      2. -
      3. You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any part - thereof, to be licensed as a whole at no charge to all third parties - under the terms of this License.
      4. -
      5. if the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the most ordinary way, to print or display an announcement including - an appropriate copyright notice and a notice that there is no warranty - (or else, saying that you provide a warranty) and that users may - redistribute the program under these conditions, and telling the user - how to view a copy of this License. (Exception: if the Program itself - is interactive but does not normally print such an announcement, your - work based on the Program is not required to print an announcement.)
      6. -
      -

      These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Program, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Program, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

      -

      Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Program.

      -

      In addition, mere aggregation of another work not based on the - Program with the Program (or with a work based on the Program) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

      -
    4. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the terms of - Sections 1 and 2 above provided that you also do one of the following: -
        -
      1. Accompany it with the complete corresponding machine-readable source - code, which must be distributed under the terms of Sections 1 and 2 - above on a medium customarily used for software interchange; or,
      2. -
      3. Accompany it with a written offer, valid for at least three years, - to give any third party, for a charge no more than your cost of - physically performing source distribution, a complete machine-readable - copy of the corresponding source code, to be distributed under the - terms of Sections 1 and 2 above on a medium customarily used for - software interchange; or,
      4. -
      5. Accompany it with the information you received as to the offer to - distribute corresponding source code. (This alternative is allowed only - for noncommercial distribution and only if you received the program in - object code or executable form with such an offer, in accord with - Subsection b above.)
      6. -
      -

      The source code for a work means the preferred form of the work for - making modifications to it. For an executable work, complete source - code means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to control - compilation and installation of the executable. However, as a special - exception, the source code distributed need not include anything that - is normally distributed (in either source or binary form) with the - major components (compiler, kernel, and so on) of the operating system - on which the executable runs, unless that component itself accompanies - the executable.

      -

      If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent access - to copy the source code from the same place counts as distribution of - the source code, even though third parties are not compelled to copy - the source along with the object code.

      -
    5. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt otherwise - to copy, modify, sublicense or distribute the Program is void, and will - automatically terminate your rights under this License. However, - parties who have received copies, or rights, from you under this - License will not have their licenses terminated so long as such parties - remain in full compliance.
    6. -
    7. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify or - distribute the Program or its derivative works. These actions are - prohibited by law if you do not accept this License. Therefore, by - modifying or distributing the Program (or any work based on the - Program), you indicate your acceptance of this License to do so, and - all its terms and conditions for copying, distributing or modifying the - Program or works based on it.
    8. -
    9. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program subject to - these terms and conditions. You may not impose any further restrictions - on the recipients' exercise of the rights granted herein. You are not - responsible for enforcing compliance by third parties to this License.
    10. -
    11. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent issues), - conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot - distribute so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you - may not distribute the Program at all. For example, if a patent license - would not permit royalty-free redistribution of the Program by all - those who receive copies directly or indirectly through you, then the - only way you could satisfy both it and this License would be to refrain - entirely from distribution of the Program. -

      If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply and the section as a whole is intended to apply in other - circumstances.

      -

      It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system, which is - implemented by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

      -

      This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

      -
    12. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted interfaces, the - original copyright holder who places the Program under this License may - add an explicit geographical distribution limitation excluding those - countries, so that distribution is permitted only in or among countries - not thus excluded. In such case, this License incorporates the - limitation as if written in the body of this License.
    13. -
    14. The Free Software Foundation may publish revised and/or new versions - of the General Public License from time to time. Such new versions will - be similar in spirit to the present version, but may differ in detail - to address new problems or concerns. -

      Each version is given a distinguishing version number. If the Program - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Program does not specify a version - number of this License, you may choose any version ever published by - the Free Software Foundation.

      -
    15. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to the - author to ask for permission. For software which is copyrighted by the - Free Software Foundation, write to the Free Software Foundation; we - sometimes make exceptions for this. Our decision will be guided by the - two goals of preserving the free status of all derivatives of our free - software and of promoting the sharing and reuse of software generally.
    16. - - - - - - -
    -

    NO WARRANTY

    -
      -
    1. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY - FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN - OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES - PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE - ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH - YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL - NECESSARY SERVICING, REPAIR OR CORRECTION.
    2. -
    3. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY - AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU - FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR - CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.
    4. -
    -

    END OF TERMS AND CONDITIONS

    - - -

    GNU LIBRARY GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright (C) 1991 Free Software Foundation, Inc.
    -59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
    -Everyone is permitted to copy and distribute verbatim copies
    -of this license document, but changing it is not allowed.
    -
    -[This is the first released version of the library GPL.  It is
    - numbered 2 because it goes with version 2 of the ordinary GPL.]
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public Licenses - are intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users.

    -

    This license, the Library General Public License, applies to some - specially designated Free Software Foundation software, and to any - other libraries whose authors decide to use it. You can use it for your - libraries, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the library, or if you modify it.

    -

    For example, if you distribute copies of the library, whether gratis - or for a fee, you must give the recipients all the rights that we gave - you. You must make sure that they, too, receive or can get the source - code. If you link a program with the library, you must provide complete - object files to the recipients so that they can relink them with the - library, after making changes to the library and recompiling it. And - you must show them these terms so they know their rights.

    -

    Our method of protecting your rights has two steps: (1) copyright the - library, and (2) offer you this license which gives you legal - permission to copy, distribute and/or modify the library.

    -

    Also, for each distributor's protection, we want to make certain that - everyone understands that there is no warranty for this free library. - If the library is modified by someone else and passed on, we want its - recipients to know that what they have is not the original version, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that companies distributing free - software will individually obtain patent licenses, thus in effect - transforming the program into proprietary software. To prevent this, we - have made it clear that any patent must be licensed for everyone's free - use or not licensed at all.

    -

    Most GNU software, including some libraries, is covered by the - ordinary GNU General Public License, which was designed for utility - programs. This license, the GNU Library General Public License, applies - to certain designated libraries. This license is quite different from - the ordinary one; be sure to read it in full, and don't assume that - anything in it is the same as in the ordinary license.

    -

    The reason we have a separate public license for some libraries is - that they blur the distinction we usually make between modifying or - adding to a program and simply using it. Linking a program with a - library, without changing the library, is in some sense simply using - the library, and is analogous to running a utility program or - application program. However, in a textual and legal sense, the linked - executable is a combined work, a derivative of the original library, - and the ordinary General Public License treats it as such.

    -

    Because of this blurred distinction, using the ordinary General - Public License for libraries did not effectively promote software - sharing, because most developers did not use the libraries. We - concluded that weaker conditions might promote sharing better.

    -

    However, unrestricted linking of non-free programs would deprive the - users of those programs of all benefit from the free status of the - libraries themselves. This Library General Public License is intended - to permit developers of non-free programs to use free libraries, while - preserving your freedom as a user of such programs to change the free - libraries that are incorporated in them. (We have not seen how to - achieve this as regards changes in header files, but we have achieved - it as regards changes in the actual functions of the Library.) The hope - is that this will lead to faster development of free libraries.

    -

    The precise terms and conditions for copying, distribution and - modification follow. Pay close attention to the difference between a - "work based on the library" and a "work that uses the library". The - former contains code derived from the library, while the latter only - works together with the library.

    -

    Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

    -

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -

    0. This License Agreement applies to any software - library which contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of this - Library General Public License (also called "this License"). Each - licensee is addressed as "you".

    -

    A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables.

    -

    The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or translated - straightforwardly into another language. (Hereinafter, translation is - included without limitation in the term "modification".)

    -

    "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code means - all the source code for all modules it contains, plus any associated - interface definition files, plus the scripts used to control - compilation and installation of the library.

    -

    Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - a program using the Library is not restricted, and output from such a - program is covered only if its contents constitute a work based on the - Library (independent of the use of the Library in a tool for writing - it). Whether that is true depends on what the Library does and what the - program that uses the Library does.

    -

    1. You may copy and distribute verbatim copies of - the Library's complete source code as you receive it, in any medium, - provided that you conspicuously and appropriately publish on each copy - an appropriate copyright notice and disclaimer of warranty; keep intact - all the notices that refer to this License and to the absence of any - warranty; and distribute a copy of this License along with the Library.

    -

    You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

    -

    2. You may modify your copy or copies of the Library - or any portion of it, thus forming a work based on the Library, and - copy and distribute such modifications or work under the terms of - Section 1 above, provided that you also meet all of these conditions:

    -
      -
    1. The modified work must itself be a software library. -

      -
    2. You must cause the files modified to carry prominent notices stating - that you changed the files and the date of any change. -

      -
    3. You must cause the whole of the work to be licensed at no charge to - all third parties under the terms of this License. -

      -
    4. If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses the - facility, other than as an argument passed when the facility is - invoked, then you must make a good faith effort to ensure that, in the - event an application does not supply such function or table, the - facility still operates, and performs whatever part of its purpose - remains meaningful. -

      (For example, a function in a library to compute square roots has a - purpose that is entirely well-defined independent of the application. - Therefore, Subsection 2d requires that any application-supplied - function or table used by this function must be optional: if the - application does not supply it, the square root function must still - compute square roots.)

      -
    5. - - - -
    -

    These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Library, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Library, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

    -

    Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Library.

    -

    In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

    -

    3. You may opt to apply the terms of the ordinary - GNU General Public License instead of this License to a given copy of - the Library. To do this, you must alter all the notices that refer to - this License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer version - than version 2 of the ordinary GNU General Public License has appeared, - then you can specify that version instead if you wish.) Do not make any - other change in these notices.

    -

    Once this change is made in a given copy, it is irreversible for that - copy, so the ordinary GNU General Public License applies to all - subsequent copies and derivative works made from that copy.

    -

    This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

    -

    4. You may copy and distribute the Library (or a - portion or derivative of it, under Section 2) in object code or - executable form under the terms of Sections 1 and 2 above provided that - you accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange.

    -

    If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy the - source code from the same place satisfies the requirement to distribute - the source code, even though third parties are not compelled to copy - the source along with the object code.

    -

    5. A program that contains no derivative of any - portion of the Library, but is designed to work with the Library by - being compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of the - Library, and therefore falls outside the scope of this License.

    -

    However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because it - contains portions of the Library), rather than a "work that uses the - library". The executable is therefore covered by this License. Section - 6 states terms for distribution of such executables.

    -

    When a "work that uses the Library" uses material from a header file - that is part of the Library, the object code for the work may be a - derivative work of the Library even though the source code is not. - Whether this is true is especially significant if the work can be - linked without the Library, or if the work is itself a library. The - threshold for this to be true is not precisely defined by law.

    -

    If such an object file uses only numerical parameters, data structure - layouts and accessors, and small macros and small inline functions (ten - lines or less in length), then the use of the object file is - unrestricted, regardless of whether it is legally a derivative work. - (Executables containing this object code plus portions of the Library - will still fall under Section 6.)

    -

    Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section 6. - Any executables containing that work also fall under Section 6, whether - or not they are linked directly with the Library itself.

    -

    6. As an exception to the Sections above, you may - also compile or link a "work that uses the Library" with the Library to - produce a work containing portions of the Library, and distribute that - work under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications.

    -

    You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered by - this License. You must supply a copy of this License. If the work - during execution displays copyright notices, you must include the - copyright notice for the Library among them, as well as a reference - directing the user to the copy of this License. Also, you must do one - of these things:

    -
      -
    1. Accompany the work with the complete corresponding machine-readable - source code for the Library including whatever changes were used in the - work (which must be distributed under Sections 1 and 2 above); and, if - the work is an executable linked with the Library, with the complete - machine-readable "work that uses the Library", as object code and/or - source code, so that the user can modify the Library and then relink to - produce a modified executable containing the modified Library. (It is - understood that the user who changes the contents of definitions files - in the Library will not necessarily be able to recompile the - application to use the modified definitions.) -

      -
    2. Accompany the work with a written offer, valid for at least three - years, to give the same user the materials specified in Subsection 6a, - above, for a charge no more than the cost of performing this - distribution. -

      -
    3. If distribution of the work is made by offering access to copy from - a designated place, offer equivalent access to copy the above specified - materials from the same place. -

      -
    4. Verify that the user has already received a copy of these materials - or that you have already sent this user a copy.
    5. - - - -
    -

    For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special exception, - the source code distributed need not include anything that is normally - distributed (in either source or binary form) with the major components - (compiler, kernel, and so on) of the operating system on which the - executable runs, unless that component itself accompanies the - executable.

    -

    It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you cannot - use both them and the Library together in an executable that you - distribute.

    -

    7. You may place library facilities that are a work - based on the Library side-by-side in a single library together with - other library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution of the - work based on the Library and of the other library facilities is - otherwise permitted, and provided that you do these two things:

    -
      -
    1. Accompany the combined library with a copy of the same work based on - the Library, uncombined with any other library facilities. This must be - distributed under the terms of the Sections above. -

      -
    2. Give prominent notice with the combined library of the fact that - part of it is a work based on the Library, and explaining where to find - the accompanying uncombined form of the same work.
    3. - -
    -

    8. You may not copy, modify, sublicense, link with, - or distribute the Library except as expressly provided under this - License. Any attempt otherwise to copy, modify, sublicense, link with, - or distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have received - copies, or rights, from you under this License will not have their - licenses terminated so long as such parties remain in full compliance.

    -

    9. You are not required to accept this License, - since you have not signed it. However, nothing else grants you - permission to modify or distribute the Library or its derivative works. - These actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work based - on the Library), you indicate your acceptance of this License to do so, - and all its terms and conditions for copying, distributing or modifying - the Library or works based on it.

    -

    10. Each time you redistribute the Library (or any - work based on the Library), the recipient automatically receives a - license from the original licensor to copy, distribute, link with or - modify the Library subject to these terms and conditions. You may not - impose any further restrictions on the recipients' exercise of the - rights granted herein. You are not responsible for enforcing compliance - by third parties to this License.

    -

    11. If, as a consequence of a court judgment or - allegation of patent infringement or for any other reason (not limited - to patent issues), conditions are imposed on you (whether by court - order, agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this License. If - you cannot distribute so as to satisfy simultaneously your obligations - under this License and any other pertinent obligations, then as a - consequence you may not distribute the Library at all. For example, if - a patent license would not permit royalty-free redistribution of the - Library by all those who receive copies directly or indirectly through - you, then the only way you could satisfy both it and this License would - be to refrain entirely from distribution of the Library.

    -

    If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply, and the section as a whole is intended to apply in other - circumstances.

    -

    It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system which is implemented - by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

    -

    This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

    -

    12. If the distribution and/or use of the Library is - restricted in certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Library under - this License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only in or - among countries not thus excluded. In such case, this License - incorporates the limitation as if written in the body of this License.

    -

    13. The Free Software Foundation may publish revised - and/or new versions of the Library General Public License from time to - time. Such new versions will be similar in spirit to the present - version, but may differ in detail to address new problems or concerns.

    -

    Each version is given a distinguishing version number. If the Library - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Library does not specify a license - version number, you may choose any version ever published by the Free - Software Foundation.

    -

    14. If you wish to incorporate parts of the Library - into other free programs whose distribution conditions are incompatible - with these, write to the author to ask for permission. For software - which is copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free status - of all derivatives of our free software and of promoting the sharing - and reuse of software generally.

    -

    NO WARRANTY

    -

    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, - THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    -

    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR - AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO - MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL - OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.

    -

    END OF TERMS AND CONDITIONS

    -

    B - Common Network Settings -

    -

    This appendix covers many of the popular TCP/IP network interfaces - and printer servers available on the market today.

    -

    Configuring a Network Interface

    -

    When you first install a network printer or print server on your LAN, - you need to set the Internet Protocol ("IP") address. On most - higher-end "workgroup" printers, you can set the address through the - printer control panel. However, in most cases you will want to assign - the addresses remotely from your workstation. This makes administration - a bit easier and avoids assigning duplicate addresses accidentally.

    -

    To setup your printer or print server for remote address assignment, - you'll need the Ethernet Media Access Control ("MAC") address, also - sometimes called a node address, and the IP address you want to use for - the device. The Ethernet MAC address can often be found on the printer - test page or bottom of the print server. - -

    -

    Configuring the IP Address Using ARP

    -

    The easiest way to set the IP address of a network device is to use - the arp(8) command. The arp sends an Address - Resolution Protocol ("ARP") packet to the specified Ethernet MAC - address, setting the network device's IP address:

    -
      -
      -arp -s ip-address ethernet-address ENTER
      -arp -s host.domain.com 08:00:69:00:12:34 ENTER
      -arp -s 192.0.2.2 08:00:69:00:12:34 ENTER
      -
      -
    -

    Configuring the IP Address Using RARP

    -

    The most flexible way to remotely assign IP addresses under UNIX is - through the Reverse Address Resolution Protocol ("RARP"). RARP allows a - network device to request an IP address using its Ethernet MAC address, - and one or more RARP servers on the network will respond with an ARP - packet with the IP address the device can use.

    -

    RARP should be used when you have to manage many printers or print - servers, or when you have a network device that does not remember its - IP address after a power cycle. If you just have a single printer or - print server, the arp command is the way to go.

    -

    Some UNIX operating systems use a program called rarpd(8) - to manage RARP. Others, like Linux, support this protocol in the - kernel. For systems that provide the rarpd program you - will need to start it before RARP lookups will work:

    -
      -
      -rarpd ENTER
      -
      -
    -

    Under IRIX you can enable this functionality by default using:

    -
      -
      -chkconfig rarpd on ENTER
      -
      -
    -

    Both the rarpd program and kernel RARP support read a - list of Ethernet and IP addresses from the file /etc/ethers. - Each line contains the Ethernet address (colon delimited) followed by - an IP address or hostname like:

    -
      -
      -08:00:69:00:12:34 myprinter.mydomain.com
      -08:00:69:00:12:34 192.0.2.2
      -
      -
    -

    Add a line to this file and cycle the power on the printer or print - server to set its address. - -

    -

    Configuring the IP Address Using BOOTP

    -

    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 bootpd(8) program supplied - with UNIX you simply need to add a line to the /etc/bootptab - file; for IRIX:

    -
      -
      -myprinter 08:00:69:00:12:34 192.0.2.2 myprinter.boot
      -
      -
    - - -

    Newer versions of bootpd use a different format:

    -
      -
      -myprinter:ha=080069001234:ip=192.0.2.2:t144=myprinter.boot
      -
      -
    -

    The myprinter.boot file resides in the - /usr/local/boot directory by default. If you do not need to - provide a boot file you may leave the last part of the line blank.

    - - -
    - - -
    NOTE: -

    Some versions of UNIX do not enable the BOOTP service by default. The - /etc/inetd.conf usually contains a line for the BOOTP service - that can be uncommented if needed.

    -
    -
    -

    Verifying the Printer Connection

    -

    To test that the IP address has been successfully assigned and that - the printer is properly connected to your LAN, type:

    -
      -
      -ping ip-address ENTER
      -
      -
    -

    If the connection is working properly you will see something like:

    -
      -
      -ping myprinter ENTER
      -PING myprinter (192.0.2.2): 56 data bytes
      -64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
      -64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
      -64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
      -64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
      -
      -
    -

    If not, verify that the printer or print server is connected to the - LAN, it is powered on, the LAN cabling is good, and the IP address is - set correctly. You can usually see the current IP address and network - status by printing a configuration or test page on the device. - -

    -

    Common Network Interface Settings

    -

    Once you have set the IP address you can access the printer or print - server using the ipp, lpd, or socket - backends. The following is a list of common network interfaces and - printer servers and the settings you should use with CUPS: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Model/ManufacturerDevice - URI(s)
    Apple LaserWriterlpd:// -address/PASSTHRU
    Axis w/o IPP -
    (see directions)
    socket://address -:9100 -
    socket://address:9101 -
    socket://address:9102
    Axis w/IPPipp://address -/LPT1 -
    ipp://address/LPT2 -
    ipp://address/COM1
    Castelle LANpressTM -lpd://address/pr1 -
    lpd://address/pr2 -
    lpd://address/pr3
    DPI NETPrintlpd://address -/pr1 -
    lpd://address/pr2 -
    lpd://address/pr3
    EFI® Fiery® RIPlpd:// -address/print
    EPSON® Multiprotocol Ethernet - Interface Boardsocket://address
    Extended System ExtendNET -lpd://address/pr1 -
    lpd://address/pr2 -
    lpd://address/pr3
    Hewlett Packard JetDirect w/o IPP -socket://address:9100 -
    socket://address:9101 -
    socket://address:9102
    Hewlett Packard JetDirect w/IPP -ipp://address/ipp -
    ipp://address/ipp/port1 -
    ipp://address/ipp/port2 -
    ipp://address/ipp/port3
    Intel® NetportExpress XL, PRO/100 -lpd://address/LPT1_PASSTHRU -
    lpd://address/LPT2_PASSTHRU -
    lpd://address/COM1_PASSTHRU
    LexmarkTM MarkNet -lpd://address/ps
    Linksys EtherFast® -
    (see directions)
    socket://address -:4010 -
    socket://address:4020 -
    socket://address:4030
    Kodak®lpd://address/ps
    QMS® CrownNetTM -lpd://address/ps
    Tektronix® PhaserShareTM -socket://address:9100
    XEROX® 4512 NIClpd:// -address/PORT1
    XEROX® XNIClpd://address -/PASSTHRU
    XEROX® (most others)socket:// -address:5503
    -
    -

    -

    Configuring Axis Print Servers

    -

    The Axis print servers can be configured using ARP, RARP, or BOOTP. - However, on models that do not provide IPP support an additional step - must be performed to configure the TCP/IP portion of the print server - for use with CUPS. - -

    -

    Each print server contains a configuration file named config - that contains a list of network parameters used by the server. To - modify this file you must first download it from the print server using - the ftp(1) program:

    -
      -
      -ftp ip-address ENTER
      -Connected to ip-address.
      -220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
      -ftp> user root ENTER
      -331 User name ok, need password
      -Password: pass ENTER (this is not echoed)
      -230 User logged in
      -ftp> get config ENTER
      -local: config remote: config
      -200 PORT command successful.
      -150 Opening data connection for config (192,0,2,2),
      -(mode ascii).
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
      -
    - - -

    Next, edit the file with your favorite text editor and locate the - lines beginning with:

    -
      -
      -RTN_OPT.     : YES
      -RTEL_PR1.    : 0
      -RTEL_PR2.    : 0
      -RTEL_PR3.    : 0
      -RTEL_PR4.    : 0
      -RTEL_PR5.    : 0
      -RTEL_PR6.    : 0
      -RTEL_PR7.    : 0
      -RTEL_PR8.    : 0
      -
      -
    - - - Change the RTN_OPT line to read: -
      -
      -RTN_OPT.     : NO
      -
      -
    - - -

    This disables the Reverse TELNET protocol and enables the standard - TELNET protocol on the print server. Next, assign a port number for - each parallel and serial port on the server as follows:

    -
      -
      -RTEL_PR1.    : 9100
      -RTEL_PR2.    : 9101
      -RTEL_PR3.    : 9102
      -RTEL_PR4.    : 9103
      -RTEL_PR5.    : 9104
      -RTEL_PR6.    : 9105
      -RTEL_PR7.    : 9106
      -RTEL_PR8.    : 9107
      -
      -
    - - -

    This essentially makes the Axis print server look like a Hewlett - Packard JetDirect EX print server. Save the file and then upload the - new config file using the ftp command:

    -
      -
      -ftp ip-address ENTER
      -Connected to ip-address.
      -220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
      -ftp> user root ENTER
      -331 User name ok, need password
      -Password: pass ENTER (this is not echoed)
      -230 User logged in
      -ftp> put config CONFIG ENTER
      -local: config remote: CONFIG
      -200 PORT command successful.
      -150 Opening data connection for config (192,0,2,2), (mode ascii).
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> get hardreset ENTER
      -local: hardreset remote: hardreset
      -200 PORT command successful.
      -421 Axis NPS ### hard reset, closing connection.
      -ftp> quit ENTER
      -221 Goodbye.
      -
      -
    -

    Your Axis print server is now ready for use!

    -

    Configuring Linksys Print Servers

    -

    The Linksys print servers can be configured using ARP, RARP, or - BOOTP. Like older Axis print servers, an additional step must be - performed to configure the TCP/IP portion of the print server for use - with CUPS. - -

    -

    Each print server contains a configuration file named CONFIG - that contains a list of network parameters used by the server. To - modify this file you must first download it from the print server using - the ftp(1) program:

    -
      -
      -ftp -n ip-address ENTER
      -Connected to ip-address.
      -220 Print Server Ready.
      -Remote system type is Print.
      -ftp> get CONFIG ENTER
      -local: CONFIG remote: CONFIG
      -200 Command OK.
      -150 Open ASCII Mode Connection.
      -WARNING! 68 bare linefeeds received in ASCII mode
      -File may not have transferred correctly.
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
      -
    - - -

    Next, edit the file with your favorite text editor and locate the - lines beginning with:

    -
      -
      -0100 L1_PROUT:P1
      -0120 L2_PROUT:P1
      -0140 L3_PROUT:P1
      -
      -
    -

    Change the port number for each parallel and serial port on the - server as follows:

    -
      -
      -0100 L1_PROUT:P1
      -0120 L2_PROUT:P2
      -0140 L3_PROUT:P3
      -
      -
    - - -

    This maps each virtual printer with a physical port. Save the file - and then upload the new CONFIG file using the ftp - command:

    -
      -
      -ftp -n ip-address ENTER
      -Connected to ip-address.
      -220 Print Server Ready.
      -Remote system type is Print.
      -ftp> put CONFIG ENTER
      -local: CONFIG remote: CONFIG
      -200 Command OK.
      -150 Open ASCII Mode Connection.
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
      -
    -

    Your Linksys print server is now ready for use!

    -

    C - Printer Drivers

    -

    This appendix lists the printer drivers that are provided with CUPS.

    -

    Printer Drivers

    -

    CUPS includes the following printer drivers:

    - -

    EPSON 9-pin Dot Matrix

    -

    The EPSON 9-pin Dot Matrix driver (epson9.ppd) supports - 9-pin dot matrix printers that implement the ESC/P command set. It - provides 60x72, 120x72, and 240x72 DPI output in black only.

    -

    EPSON 24-pin Dot Matrix

    -

    The EPSON 24-pin Dot Matrix driver (epson9.ppd) supports - 24-pin dot matrix printers that implement the ESC/P command set. It - provides 120x180, 180x180, 360x180, and 360x360 DPI output in black - only.

    -

    EPSON Stylus Color

    -

    The EPSON Stylus Color driver (stcolor.ppd) supports EPSON - Stylus Color printers that implement the ESC/P2 command set. It - provides 180, 360, and 720 DPI output in black and color (CMYK).

    -

    EPSON Stylus Photo

    -

    The EPSON Stylus Photo driver (stphoto.ppd) supports EPSON - Stylus Photo printers that implement the ESC/P2 command set. It - provides 180, 360, and 720 DPI output in black and color (CMYKcm).

    -

    HP DeskJet

    -

    The HP DeskJet driver (deskjet.ppd) supports HP DeskJet - printers that implement the PCL command set. It provides 150, 300, and - 600 DPI output in black and color (CMYK).

    -

    The DeskJet printers that implement the HP-PPA command set (720C, - 722C, 820C, and 1100C) are not supported due to a complete lack - of documentation and support from Hewlett Packard.

    -

    The duplexer provided with the HP DeskJet 900 series printers is also - not supported for similar reasons.

    -

    HP LaserJet

    -

    The HP LaserJet driver (laserjet.ppd) supports HP LaserJet - printers that implement the PCL command set. It provides 150, 300, and - 600 DPI output in black only and supports the duplexer if installed.

    -

    LaserJet printers that do not implement PCL (3100, 3150) are not - supported due to a complete lack of documentation and support from - Hewlett Packard.

    -

    D - List of Files

    -

    This appendix lists the files and directories that are installed for - the Common UNIX Printing System. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PathnameDescription
    /etc/cups/certs/The location of - authentication certificate files for local HTTP clients.
    /etc/cups/classes.confThe printer classes - configuration file for the scheduler.
    /etc/cups/cupsd.confThe scheduler - configuration file.
    /etc/cups/interfaces/The location of - System V interface scripts for printers.
    /etc/cups/mime.convsThe list of standard - file filters included with CUPS.
    /etc/cups/mime.typesThe list of recognized - file types for CUPS.
    /etc/cups/ppd/The location of PostScript - Printer Description ("PPD") files for printers.
    /etc/cups/printers.confThe printer - configuration file for the scheduler.
    /usr/bin/cancelThe System V cancel job(s) - command.
    /usr/bin/disableThe System V disable - printer command.
    /usr/bin/enableThe System V enable printer - command.
    /usr/bin/lpThe System V print command.
    /usr/bin/lpoptionsSets user-defined - printing options and defaults.
    /usr/bin/lppasswdAdds, changes, or removes - Digest password accounts.
    /usr/bin/lpqThe Berkeley status command.
    /usr/bin/lprThe Berkeley print command.
    /usr/bin/lprmThe Berkeley cancel job(s) - command.
    /usr/bin/lpstatThe System V status - command.
    /usr/include/cups/CUPS API header files.
    /usr/lib32/libcups.a -
    /usr/lib32/libcupsimage.a
    Static libraries (IRIX 6.5)
    /usr/lib/libcups.a -
    /usr/lib/libcupsimage.a
    Static libraries (all others)
    /usr/lib/libcups.sl.2 -
    /usr/lib/libcupsimage.sl.2
    Shared libraries (HP-UX)
    /usr/lib32/libcups.so.2 -
    /usr/lib32/libcupsimage.so.2
    Shared libraries (IRIX 6.5)
    /usr/lib/libcups.so.2 -
    /usr/lib/libcupsimage.so.2
    Shared libraries (all others)
    /usr/lib/cups/backend/Backends for various - types of printer connections.
    /usr/lib/cups/cgi-bin/CGI programs for the - scheduler.
    /usr/lib/cups/daemon/Daemons for polling - and LPD support.
    /usr/lib/cups/filter/Filters for various - types of files.
    /usr/lib/locale/The location of - language-specific message files. (System V)
    /usr/lib/nls/msg/The location of - language-specific message files. (Compaq Tru64 UNIX)
    /usr/share/locale/The location of - language-specific message files. (Linux, *BSD)
    /usr/sbin/acceptThe accept-jobs command.
    /usr/sbin/cupsdThe CUPS print scheduler.
    /usr/sbin/lpadminThe System V printer - administration tool.
    /usr/sbin/lpcThe Berkeley printer - administration tool.
    /usr/sbin/lpinfoThe get-devices and - get-ppds command.
    /usr/sbin/lpmoveThe move-jobs command.
    /usr/sbin/rejectThe reject-jobs command.
    /usr/share/catman/a_man/ -
    /usr/share/catman/u_man/
    Man pages (IRIX)
    /usr/share/man/Man pages (Compaq Tru64 - UNIX, HP-UX, Solaris)
    /usr/man/Man pages (all others)
    /usr/share/cups/data/The location of - filter data files.
    /usr/share/cups/data/testprint.psThe - PostScript test page file.
    /usr/share/cups/fonts/The location of - PostScript fonts for the PostScript RIP.
    /usr/share/cups/model/The location of - PostScript Printer Description ("PPD") files and interface scripts that - may be used to setup a printer queue.
    /usr/share/cups/pstoraster/Other - PostScript RIP initialization files.
    /usr/share/cups/pstoraster/FontmapThe font - mapping file (converts filenames to fontnames)
    /usr/share/cups/templates/The location of - HTML template files for the web interfaces.
    /usr/share/doc/cups/Documentation and web - page data for the scheduler.
    /var/log/cups/The location of scheduler - log files.
    /var/spool/cups/The location of print - files waiting to be printed.
    -
    -

    -

    E - Troubleshooting Common Problems

    -

    This appendix covers some of the common problems first-time users - encounter when installing and configuring CUPS.

    -

    Commercial support for CUPS is available from Easy Software Products. - For more information please contact us at:

    - -

    My Applications Don't See the Available Printers

    -

    Many applications read the /etc/printcap file to get a - list of available printers.

    -

    The default CUPS configuration creates the /etc/printcap - file automatically. To enable or disable automatic creation and - updating of this file, use the Printcap - directive described in Chapter 6, - "Printing System Management".

    -

    CUPS Doesn't Recognize My Username or Password!

    -

    CUPS will ask you for a UNIX username and password when you perform - printer administration tasks remotely or via a web browser. The default - configuration requires that you use the root username and - the corresponding password to authenticate the request.

    -

    CUPS does not allow you to authenticate an administration request - with an account that has no password for security reasons. If you do - not have a password on your root account then you won't be - able to add printers remotely or via the web interface! - -

    -

    To disable password authentication you need to edit the - /etc/cups/cupsd.conf file and comment out the lines reading:

    -
      -
      -AuthType Basic
      -AuthClass System
      -
      -
    -

    for the /admin location. Then restart the CUPS server as - described in Chapter 6, "Printing System - Management".

    -
    - - -
    NOTE: -

    Disabling password checks will allow any local user to change your - printer and class configuration, but remote administration from another - machine will still not be allowed.

    -
    -
    -

    I Can't Do Administration Tasks from Another - Machine!

    -

    The default CUPS configuration limits administration to the local - machine. To open up access, edit the /etc/cups/cupsd.conf - and comment out the lines reading:

    -
      -
      -Order deny,allow
      -Deny from all
      -Allow from 127.0.0.1
      -
      -
    -

    for the /admin location. Then restart the CUPS server as - described in Chapter 6, "Printing System - Management".

    -
    - - -
    NOTE: -

    Allowing administration access from all hosts is a potential security - risk. Please read Chapter 6, "Printing - System Management" for a description of these risks and ways to - minimize them.

    -
    -
    - - -

    I Can't Do Administration Tasks from My Web Browser! -

    -

    This problem is usually caused by:

    -
      -
    1. not specifying the correct password for the root account.
    2. -
    3. accessing the CUPS server using the hostname or IP address of the - server without enabling remote access for administration functions. - This can be corrected by following the instructions in the - "I Can't Do Administration Tasks from Another Machine!" section - earlier in this appendix.
    4. -
    5. not setting a password on the root account. CUPS will not - authenticate a user account that does not have a password for security - reasons.
    6. -
    7. authenticating using an account other than root, but the account you - are using is not a member of the system group.
    8. -
    9. configuring CUPS to use Digest authentication, but your web browser - does not support Digest authentication.
    10. -
    -

    Connection Refused Messages

    -

    Under normal circumstances, "connection refused" messages for a - networked printer should be expected from time to time. Most network - interfaces only allow a single connection to be made at any given time - (one job at a time) and will refuse access to all other systems while - the first connection is active. CUPS automatically retries the - connection once every 30 seconds.

    -

    If the problem persists and you are unable to print any jobs to the - printer, verify that another machine is not maintaining a connection - with the printer, and that you have selected the proper port or printer - name for the printer.

    -

    Also, most external print servers will refuse connections if the - connected printer is turned off or is off-line. Verify that the - affected printer is turned on and is online.

    -

    Write Error Messages

    -

    If you get "write error" messages on a printer queue the printer - interface (usually a Hewlett Packard JetDirect interface) has timed out - and reset the network connection from your workstation.

    -

    The error is caused by that startup delay between the initial setup - of the printer or plotter and the first page of print data that is - sent. - -

    -

    To correct the problem, change the idle timeout on the interface to - at least 180 seconds or 3 minutes. To change the timeout on a Hewlett - Packard JetDirect interface, type:

    -
      -
      -telnet ip-address ENTER
      -
      -Trying ip-address...
      -Connected to ip-address.
      -Escape character is `^]'.
      -
      -Please type [Return] two times, to initialize telnet configuration
      -For HELP type "?"
      -> idle-timeout: 180 ENTER
      -> quit ENTER
      -
      -
    - - diff --git a/doc/sam.pdf b/doc/sam.pdf deleted file mode 100644 index ae1b1481714f54f4296c774e9c7e7aff343088dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 273391 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 - - - - - CUPS Software Administrators Manual - - - -

    Preface

    - -

    This software administrators manual provides printer administration -information for the Common UNIX Printing SystemTM -("CUPSTM"), version 1.2.0. - - - - -

    Document Overview

    - -

    This software administrators manual is organized into the following sections:

    - -
    - -

    Notation Conventions

    - -

    Various font and syntax conventions are used in this guide. Examples and -their meanings and uses are explained below: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Example   Description
     
    lpstat
    - lpstat(1)
       The names of commands; the first mention of a command or - function in a chapter is followed by a manual page section - number.
     
    /var
    - /usr/share/cups/data/testprint.ps
       File and directory names.
     
    Request ID is Printer-123   Screen output.
     
    lp -d printer filename ENTER   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are written using the period (.) to indicate - the decimal point.
    - - -

    Abbreviations

    - -The following abbreviations are used throughout this manual: - -
      -
      - -
      kb -
      Kilobytes, or 1024 bytes
        - -
      Mb -
      Megabytes, or 1048576 bytes
        - -
      Gb -
      Gigabytes, or 1073741824 bytes
        - -
      -
    - -

    Other References

    - -
      -
      - -
      CUPS Software Programmers Manual - -
      A programmer guide for interfacing with and/or extending the CUPS - software.
        - -
      CUPS Software Users Manual - -
      An end-user guide for using the CUPS software.
        - -
      -
    - - - - - -

    2 - Building and Installing CUPS

    - -

    This chapter shows how to build and install the Common UNIX Printing System. -If you are installing a binary distribution from the CUPS web site, proceed to -the section titled, Installing a Binary Distribution. - -

    Installing a Source Distribution

    - -

    This section describes how to compile and install CUPS on your system -from the source code. - -

    Requirements

    - -

    You'll need ANSI-compliant C and C++ compilers to build CUPS on your -system. As its name implies, CUPS is designed to run on the UNIX -operating system, however the CUPS interface library and most of the -filters and backends supplied with CUPS should also compile and run -under Microsoft Windows. - -

    For the image file filters and PostScript RIP, you'll need the JPEG, -PNG, TIFF, and ZLIB libraries. CUPS will build without these, but with -significantly reduced functionality. Easy Software Products maintains a -mirror of the current versions of these libraries at: - -

    - -

    If you make changes to the man pages you'll need GNU groff or another -nroff-like package. GNU groff is available from: - -

    - -

    The documentation is formatted using the HTMLDOC software. If you need to -make changes you can get the HTMLDOC software from: - -

    - -

    Finally, you'll need a make program that -understands the include directive - FreeBSD, -NetBSD, and OpenBSD developers should use the gmake -program. - -

    Compiling CUPS

    - -

    CUPS uses GNU autoconf to configure the makefiles and source code -for your system. Type the following command to configure CUPS for your -system: - -

      -./configure ENTER
      -
    - -

    The default installation will put the CUPS software in the -/etc, /usr, and /var directories on -your system, which will overwrite any existing printing commands on -your system. Use the --prefix option to install the CUPS -software in another location: - -

      -./configure --prefix=/some/directory ENTER
      -
    - -

    If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in a -system default location (typically /usr/include and -/usr/lib) you'll need to set the CFLAGS, -CXXFLAGS, and LDFLAGS environment variables -prior to running configure: - -

      -setenv CFLAGS "-I/some/directory" ENTER
      -setenv CXXFLAGS "-I/some/directory" ENTER
      -setenv LDFLAGS "-L/some/directory" ENTER
      -setenv DSOFLAGS "-L/some/directory" ENTER
      -./configure ... ENTER
      -
    - -

    or: - -

      -CFLAGS="-I/some/directory"; export CFLAGS ENTER
      -CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER
      -LDFLAGS="-L/some/directory"; export LDFLAGS ENTER
      -DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER
      -./configure ... ENTER
      -
    - -

    To enable support for encryption, you'll also want to add the -"--enable-ssl" option: - -

      -./configure --enable-ssl
      -
    - -

    SSL and TLS support require the OpenSSL library, available at: - -

    - -

    If the OpenSSL headers and libraries are not installed in the -standard directories, use the --with-openssl-includes -and --with-openssl-libs options:

    - -
      -./configure --enable-ssl \
      -    --with-openssl-includes=/foo/bar/include \
      -    --with-openssl-libs=/foo/bar/lib
      -
    - -

    Once you have configured things, just type: - -

      -make ENTER
      -
    - -

    to build the software. - - -

    Installing the Software

    - -

    Use the "install" target to install the software: - -

      -make install ENTER
      -
    - -
    - - - -
    - WARNING: - -

    Installing CUPS will overwrite your existing printing - system. If you experience difficulties with the CUPS software - and need to go back to your old printing system, you will need - to reinstall the old printing system from your operating system CDs. -

    - -

    Running the Software

    - -

    Once you have installed the software you can start the CUPS server by -typing: - -

      -/usr/sbin/cupsd ENTER
      -
    - - -

    Installing a Binary Distribution

    - -

    CUPS comes in a variety of binary distribution formats. Easy -Software Products provides binaries in TAR format with installation and -removal scripts ("portable" distributions), and in RPM and DPKG formats -for Red Hat and Debian-based distributions. Portable distributions are -available for all platforms, while the RPM and DPKG distributions are -only available for Linux. - -

    - - - -
    - WARNING: - -

    Installing CUPS will overwrite your existing printing - system. If you experience difficulties with the CUPS software - and need to go back to your old printing system, you will need - to remove the CUPS software with the provided script and/or - reinstall the old printing system from your operating system CDs. -

    - - -

    Installing a Portable Distribution

    - -

    To install the CUPS software from a portable distribution you will -need to be logged in as root; doing an su is good enough. -Once you are the root user, run the installation script with: - -

      -./cups.install ENTER
      -
    - -

    After asking you a few yes/no questions the CUPS software will be -installed and the scheduler will be started automatically. - - -

    Installing an RPM Distribution

    - -

    To install the CUPS software from an RPM distribution you will need -to be logged in as root; doing an su is good enough. Once -you are the root user, run RPM with: - -

      -rpm -e lpr
      -rpm -i cups-1.1-linux-M.m.n-intel.rpm ENTER
      -
    - -

    After a short delay the CUPS software will be -installed and the scheduler will be started automatically. - -

    Installing an Debian Distribution

    - -

    To install the CUPS software from a Debian distribution you will -need to be logged in as root; doing an su is good enough. -Once you are the root user, run dpkg with: - -

      -dpkg -i cups-1.1-linux-M.m.n-intel.deb ENTER
      -
    - -

    After a short delay the CUPS software will be installed and the -scheduler will be started automatically. - - -

    3 - Managing Printers

    - -

    This chapter describes how to add your first printer and how to -manage your printers. - -

    The Basics

    - -

    Each printer queue has a name associated with it; the printer name -must start with a letter and can contain up to 127 letters, numbers, -and the underscore (_). Case is not significant, e.g. "PRINTER", "Printer", -and "printer" are considered to be the same name. - -

    Printer queues also have a device associated with them. The device can be -a parallel port, a network interface, and so forth. Devices within CUPS use -Uniform Resource Identifiers ("URIs") which are a more general form of -Uniform Resource Locators ("URLs") that are used in your web browser. For -example, the first parallel port in Linux usually uses a device URI of -parallel:/dev/lp1. - - -

    You can see a complete list of supported devices by running the -lpinfo(8) command: - -

      -lpinfo -v ENTER
      -network socket
      -network http
      -network ipp
      -network lpd
      -direct parallel:/dev/lp1
      -serial serial:/dev/ttyS1?baud=115200
      -serial serial:/dev/ttyS2?baud=115200
      -direct usb:/dev/usb/lp0
      -network smb
      -
    - -

    The -v option specifies that you want a list of available -devices. The first word in each line is the type of device (direct, file, -network, or serial) and is followed by the device URI or method name for -that device. File devices have device URIs of the form -file:/directory/filename while network devices use the more -familiar method://server or method://server/path -format. - -

    Finally, printer queues usually have a PostScript Printer Description -("PPD") file associated with them. PPD files describe the capabilities of -each printer, the page sizes supported, etc., and are used for PostScript -and non-PostScript printers. CUPS includes PPD files for HP LaserJet, HP -DeskJet, EPSON 9-pin, EPSON 24-pin, and EPSON Stylus printers. - -

    Adding Your First Printer

    - -

    CUPS provides two methods for adding printers: a command-line -program called lpadmin(8) and a Web interface. The -lpadmin command allows you to perform most printer -administration tasks from the command-line and is located in -/usr/sbin. The Web interface is located at: - -

    - -

    and steps you through printer configuration. If you don't like -command-line interfaces, try the Web interface instead. - -

    Adding Your First Printer from the Command-Line

    - -

    Run the lpadmin command with the -p option to add a -printer to CUPS: - -

      -/usr/sbin/lpadmin -p printer -E -v device -m ppd ENTER
      -
    - -

    For a HP DeskJet printer connected to the parallel port this would look -like: - -

      -/usr/sbin/lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd ENTER
      -
    - -

    Similarly, a HP LaserJet printer using a JetDirect network interface at -IP address 11.22.33.44 would be added with the command: - -

      -/usr/sbin/lpadmin -p LaserJet -E -v socket://11.22.33.44 -m laserjet.ppd ENTER
      -
    - -

    As you can see, deskjet.ppd and laserjet.ppd are -the PPD files for the HP DeskJet and HP LaserJet drivers included with CUPS. -You'll find a complete list of PPD files and the printers they will work with -in Appendix C, "Printer Drivers". - - -

    For a dot matrix printer connected to the serial port this would might look like: - -

      -/usr/sbin/lpadmin -p DotMatrix -E -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=soft deskjet.ppd ENTER
      -
    - -

    Here you specify the serial port (e.g. S0,S1, d0, d1), baud rate -(e.g. 9600, 19200, 38400, 115200, etc.), number of bits, parity, and flow control. -If you do not need flow control, delete the "+flow=soft" portion. - - -

    Adding Your First Printer from the Web

    - -

    The CUPS web server provides a user-friendly "wizard" interface for -adding your printers. Rather than figuring out which device URI and PPD file -to use, you can instead click on the appropriate listings and fill in some -simple information. Enter the following URL in your web browser to begin: - -

    - -

    Click on the Add Printer button to add a printer. - -

    Managing Printers from the Command-Line

    - -

    The lpadmin command enables you to perform most printer -administration tasks from the command-line. You'll find lpadmin -in the /usr/sbin directory. - -

    Adding and Modifying Printers

    - -

    Run the lpadmin command with the -p option -to add or modify a printer: - -

      -/usr/sbin/lpadmin -p printer options ENTER
      -
    - -

    The options arguments can be any of the following: - -

      -
      - -
      -c class - -
      Adds the named printer to printer class class. - If the class does not exist then it is created. - -
      -i interface - -
      Copies the named interface script to the printer. - Interface scripts are used by System V printer drivers. Since - all filtering is disabled when using an interface script, scripts - generally should not be used unless there is no other driver for - a printer. - -
      -m model - -
      Specifies a standard printer driver which is usually a PPD - file. A list of all available models can be displayed using the - lpinfo command with the -m option. A - list of printer drivers included with CUPS can be found in - Appendix C, "Printer Drivers". - -
      -r class - -
      Removes the named printer from printer class class. - If the resulting class becomes empty then it is removed. - -
      -v device-uri - -
      Sets the device for communicating with the printer. If a - job is currently printing on the named printer then the job - will be restarted and sent to the new device. - -
      -D info - -
      Provides a textual description of the printer, e.g. - "John's Personal Printer". - -
      -E - -
      Enables the printer and accepts job. This option is - equivalent to running the enable(1) and - accept(8) commands on the printer. - -
      -L location - -
      Provides a textual location for the printer, e.g. - "Computer Lab 5". - -
      -P ppd-file - -
      Specifies a local PPD file for the printer driver. - -
      -
    - -

    Deleting Printers

    - -

    Run the lpadmin command with the -x option -to delete a printer: - -

      -/usr/sbin/lpadmin -x printer ENTER
      -
    - -

    Setting the Default Printer

    - -

    Run the lpadmin command with the -d option -to set a default printer: - -

      -/usr/sbin/lpadmin -d printer ENTER
      -
    - -

    The default printer can be overridden by the user using the -lpoptions(1) command. - -

    Starting and Stopping Printers

    - -

    The enable and disable commands start and stop -printer queues, respectively: - -

      -/usr/bin/enable printer ENTER
      -/usr/bin/disable printer ENTER
      -
    - -

    Printers that are disabled may still accept jobs for printing, but won't -actually print any files until they are restarted. This is useful if the -printer malfunctions and you need time to correct the problem. Any queued -jobs are printed after the printer is enabled (started). - -

    Accepting and Rejecting Print Jobs

    - -

    The accept and reject commands accept and reject -print jobs for the named printer, respectively: - -

      -/usr/sbin/accept printer ENTER
      -/usr/sbin/reject printer ENTER
      -
    - -

    As noted above, a printer can be stopped but accepting new print -jobs. A printer can also be rejecting new print jobs while it finishes -those that have been queued. This is useful for when you must perform -maintenance on the printer and will not have it available to users for -a long period of time. - -

    Setting Quotas on a Printer

    - -

    CUPS supports page and size-based quotas for each printer. -The quotas are tracked individually for each user, but a single set of -limits applies to all users for a partiuclar printer. For example, you -can limit every user to 5 pages per day on an expensive printer, but -you cannot limit every user except Johnny.

    - -

    The job-k-limit, job-page-limit, and job-quota-peiod -options determine whether and how quotas are enforced for a printer. -The job-quota-period option determines the time interval for -quota tracking. The interval is expressed in seconds, so a day is -86,400, a week is 604,800 and a month is 2,592,000 seconds. The -job-k-limit option specifies the job size limit in killobytes. The -job-page-limit option specifies the number of pages limit.

    - -

    For quotas to be enforced, the period and at least one of the limits -must be set to a non-zero value. The following options will enable -quotas:

    - -
      -
      -/usr/sbin/lpadmin -p printer -o job-quota-period=604800 -o job-k-limit=1024 ENTER
      -/usr/sbin/lpadmin -p printer -o job-quota-period=604800 -o job-page-limit=100 ENTER
      -
      -
    - -

    Or, you can combine all three options on the same line.

    - -

    Restricting User Access to a Printer

    - -

    The -u option of the lpadmin command controls which users can -print to a printer. The default configuration allows all users to print -to a printer:

    - -
      -
      -/usr/sbin/lpadmin -p printer -u allow:all ENTER
      -
      -
    - -

    CUPS supports allow and deny lists so that you can specify a -list of users who are allowed to print or not allowed to print. Along -with your list of users, you can specify whether they are allowed or -not allowed to use the printer:

    - -
      -
      -/usr/sbin/lpadmin -p printer -u allow:peter,paul,mary ENTER
      -
      -
    - -

    This command allows peter, paul, and mary to print to the named -printer, but all other users cannot print. The command:

    - -
      -
      -/usr/sbin/lpadmin -p printer -u deny:peter,paul,mary ENTER
      -
      -
    - -

    has the opposite effect. All users except peter, paul, and mary will -be able to print to the named printer.

    - -

    You can control access by UNIX groups as well by placing an -"@" character before each group name. The command:

    - -
      -
      -/usr/sbin/lpadmin -p printer -u allow:peter,paul,mary,@printgods ENTER
      -
      -
    - -

    allows the users peter, paul, and mary to print, as well as -any user in the printgods group to print. - -

    - - - - -
    NOTE: - -

    The allow and deny options are not cummulative. That - is, you must provide the complete list of users to allow or deny each - time.

    - -

    Also, CUPS only maintains one list of users - the list can - allow or deny users from printing. If you specify an allow list and - then specify a deny list, the deny list will replace the allow list - - only one list is active at any time.

    - -
    -
    - -

    Managing Printers from the Web

    - -

    The Web interface is located at: - -

    - -

    From there you can perform all printer management tasks with a few -simple mouse clicks. - - -

    4 - Printer Classes

    - -

    This chapter describes what printer classes are and how to manage them. - -

    The Basics

    - -

    CUPS provides collections of printers called printer classes. Jobs -sent to a class are forwarded to the first available printer in the class. -Classes can themselves be members of other classes, so it is possible for -you to define very large, distributed printer classes for high-availability -printing. - -

    CUPS also supports implicit classes. Implicit classes work just -like printer classes, but they are created automatically based upon the -available printers and classes on the network. This allows you to setup -multiple print servers with identical printer configurations and have the -client machines send their print jobs to the first available server. If -one or more servers go down, the jobs are automatically redirected to the -servers that are running, providing fail-safe printing. - -

    Managing Printer Classes from the Command-Line

    - -

    Run the lpadmin command with the -p and -c options -to add a printer to a class: - -

      -/usr/sbin/lpadmin -p printer -c class ENTER
      -
    - -

    The class is created automatically if it doesn't exist. To remove a -printer from a class use the -r option: - -

      -/usr/sbin/lpadmin -p printer -r class ENTER
      -
    - -

    To remove the entire class just use the -x option: - -

      -/usr/sbin/lpadmin -x class ENTER
      -
    - -

    Managing Printer Classes from the Web Interface

    - -

    The Web interface is located at: - -

    - -

    The Add Class and Modify Class interfaces provide a -list of available printers; click on the printers of interest to add them to -the class. - -

    Implicit Classes

    - -

    A noted earlier, implicit classes are created automatically from the -available network printers and classes. To disable this functionality, -set the ImplicitClasses -directive to Off in the cupsd.conf file. You -will find more information on doing this in -Chapter 6, "Printing System -Management". - - -

    5 - Client Setup

    - -

    This chapter discusses several ways to configure CUPS clients for -printing. - -

    The Basics

    - -

    A client is any machine that sends print jobs to another machine for -final printing. Clients can also be servers if they communicate directly with -any printers of their own. - -

    CUPS supports several methods of configuring client machines: - -

    - -

    Manual Configuration of Print Queues

    - -

    The most tedious method of configuring client machines is to configure -each remote queue by hand using the lpadmin command: - -

      -lpadmin -p printer -E -v ipp://server/printers/printer ENTER
      -
    - -

    The printer name is the name of the printer on the server -machine. The server name is the hostname or IP address of the -server machine. Repeat the lpadmin command for each remote -printer you wish to use.

    - -
    - - - - -
    NOTE: -

    Manual configuration of print queues is not recommended for large - numbers of client machines because of the administration nightmare it - creates. For busy networks, consider subnetting groups of clients and - polling and relaying printer information instead.

    -
    -
    - -

    Specifying a Single Server for Printing

    - -

    CUPS can be configured to run without a local spooler and send all -jobs to a single server. However, if that server goes down then all -printing will be disabled. Use this configuration only as absolutely needed. - -

    The default server is normally "localhost". To override the default -server create a file named /etc/cups/client.conf and add -a line reading: - -

      -ServerName server
      -
    - -

    to the file. The server name can be the hostname or IP address -of the default server. - -

    The default server can also be customized on a per-user basis. To set a -user-specific server create a file named ~/.cupsrc and add a line -reading: - -

      -ServerName server
      -
    - -

    to the file. The server name can be the hostname or IP -address of the default server. - -

    Automatic Configuration of Print Queues

    - -

    CUPS supports automatic client configuration of printers on the same -subnet. To configure printers on the same subnet, do nothing. -Each client should see the available printers within 30 seconds -automatically. The printer and class lists are updated automatically as -printers and servers are added or removed. - -

    If you want to see printers on other subnets as well, use the -BrowsePoll -directive as described next.

    - -
    - - - - -
    NOTE: -

    The BrowseAddress directive - enables broadcast traffic from your server. The default configuration - braodcasts printer information every 30 seconds. Although this printer - information does not use much bandwidth, typically about 80 bytes per - printer, it can add up with large numbers of servers and printers.

    -

    Use the BrowseInterval - and BrowseTimeout directives to tune - the amount of data that is added to your network load. In addition, - subnets can be used to minimize the amount of traffic that is carried - by the "backbone" of your large network.

    -
    -
    - -

    Specifying Multiple Servers for Printing

    - -

    If you have CUPS servers on different subnets, then you should configure -CUPS to poll those servers. Polling provides the benefits of automatic -configuration without significant configuration on the clients, and multiple -clients on the same subnet can share the same configuration information. - -

    Polling is enabled by specifying one or more -BrowsePoll -directives in the /etc/cups/cupsd.conf file. -For information on making these changes, see -Chapter 6, "Printing System Management". - -

    Multiple BrowsePoll lines can -be used to poll multiple CUPS servers. To limit the amount of -polling you do from client machines, you can have only one of the -clients do the polling and relay that information to the others on the -same subnet (described next).

    - -

    Relaying Printers to Other Clients

    - -

    When you have clients and servers spread across multiple subnets, the -polling method is inefficient. CUPS provides a -BrowseRelay directive that enables a -single client to relay (broadcast) the polled printer information to the local subnet.

    - -

    For example, Server A and Server B are on subnet 1 and subnet 2, -while the clients are on subnet 3. -To provide printers to all of the clients in subnet 3, -client C will be configured with the following directives in /etc/cups/cupsd.conf:

    - -
      -# Poll the two servers
      -
      -BrowsePoll ServerA ENTER
      -BrowsePoll ServerB ENTER
      -
      -
      -# Relay the printers to the local subnet
      -
      -BrowseRelay 127.0.0.1 192.168.3.255 ENTER
      -
    - -

    The BrowseRelay line specifies a source address and mask. -Any browse packets coming from a matching address wil be sent to the given broadcast address. -In this case, we want the packets from the local machine (127.0.0.1) relayed to the other clients.

    - -

    As printers are found using polling, -they are relayed from client C to the rest of the clients through a broadcast on subnet 3. -The rest of the clients can use the standard cupsd.conf configuration.

    - -

    The BrowseRelay directive can also be used to relay -browsing packets from one network interface to another. -For example, if client C in the previous example had network interfaces attaches to both -subnet 1 and subnet 2, it could use the BrowseRelay directive exclusively: - -

      -# Relay the printers from subnet 1 and 2 to subnet 3
      -
      -BrowseRelay 192.168.1 192.168.3.255 ENTER
      -BrowseRelay 192.168.2 192.168.3.255 ENTER
      -
    - -

    Load Balancing and Failsafe Operation

    - -

    When using server polling or broadcasting, CUPS clients can -automatically merge identical printers on multiple servers into a -single implicit class queue. Clients assume that printers with -the same name on multiple servers are in fact the same printer or type -of printer being served by multiple machines.

    - -

    If you have two printers, LaserJet@ServerA and LaserJet@ServerB, a -third implicit class called LaserJet will be created -automatically on the client that refers to both printers. If the client -also has a local printer with the name LaserJet then an implicit class -named AnyLaserJet will be created instead.

    - -

    The client will alternate between servers and automatically stop -sending jobs to a server if it goes down, providing a load-balancing -effect and fail-safe operation with automatic switchover.

    - -
    - - - -
    NOTE: -

    Note that implicit classes (ImplicitClasses) - are enabled by default.

    -
    - -

    6 - Printing System Management

    - -

    This chapter shows how you can configure the CUPS server. - -

    The Basics

    - -

    Several text files are used to configure CUPS. All of the server -configuration files are located in the /etc/cups directory: - -

      -
      - - -
      classes.conf - -
      This file contains information on each printer class. - Normally you manipulate this file using the - lpadmin command or the Web interface.
        - - -
      client.conf - -
      This file provides the default server name for client - machines. See Chapter 5, "Client - Setup" for more information.
        - - -
      cupsd.conf - -
      This file controls how the CUPS server - (/usr/sbin/cupsd) operates and is normally edited by - hand.
        - - -
      mime.convs - -
      This file contains a list of standard file conversion filters - and their costs. You normally do not edit this file.
        - - -
      mime.types - -
      This file contains a list of standard file formats and how to - recognize them. You normally do not edit this file.
        - - -
      printers.conf - -
      This file contains information on each printer. Normally - you manipulate this file using the lpadmin command - or the Web Interface.
        - -
      -
    - -

    Restarting the CUPS Server

    - -

    Once you have made a change to a configuration file you need to -restart the CUPS server by sending it a HUP signal or using the -supplied initialization script. The CUPS distributions install the -script in the init.d directory with the name -cups. The location varies based upon the operating system: - -

      -/etc/software/init.d/cups restart ENTER
      -/etc/rc.d/init.d/cups restart ENTER
      -/etc/init.d/cups restart ENTER
      -/sbin/init.d/cups restart ENTER
      -
    - -

    Changing the Server Configuration

    - -

    The /etc/cups/cupsd.conf file contains configuration -directives 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. Since the server configuration file consists of plain text, you -can use your favorite text editor to make changes to it. - - -

    Server Directives

    - -

    The cupsd.conf file contains many directives that -determine how the server operates: - -

    - - -

    AccessLog

    -
    - -

    Examples

    - -
      -AccessLog /var/log/cups/access_log
      -AccessLog /var/log/cups/access_log-%s
      -AccessLog syslog
      -
    - -

    Description

    - -

    The AccessLog directive sets the name of the access log -file. If the filename is not absolute then it is assumed to be relative -to the ServerRoot 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. - -

    The server name can be included in the filename by using -%s in the name. - -

    The special name "syslog" can be used to send the access information -to the system log instead of a plain file. - -

    The default access log file is /var/log/cups/access_log. - - -

    Allow

    -
    - -

    Examples

    - -
      -Allow from All
      -Allow from None
      -Allow from *.domain.com
      -Allow from .domain.com
      -Allow from host.domain.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 @LOCAL
      -Allow from @IF(name)
      -
    - -

    Description

    - -

    The Allow directive specifies a hostname, IP address, -or network that is allowed access to the server. Allow -directives are cummulative, so multiple Allow directives -can be used to allow access for multiple hosts or networks. The -/mm notation specifies a CIDR netmask: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    mmnetmaskmmnetmask
    00.0.0.08255.0.0.0
    1128.0.0.016255.255.0.0
    2192.0.0.024255.255.255.0
    ......32255.255.255.255
    - -

    The @LOCAL name will allow access from all local -network interfaces, but not remote point-to-point interfaces. The -@IF(name) name will allow access from the named -interface. - -

    The Allow directive must appear inside a -Location directive. - - -

    AuthClass

    -
    - -

    Examples

    - -
      -AuthClass Anonymous
      -AuthClass User
      -AuthClass System
      -AuthClass Group
      -
    - -

    Description

    - -

    The AuthClass directive defines what level of authentication -is required: - -

      - -
    • Anonymous - No authentication should be performed - (default.) - -
    • User - A valid username and password is required. - -
    • System - A valid username and password is - required, and the username must belong to the "sys" group; this - can be changed using the - SystemGroup directive. - -
    • Group - A valid username and password is - required, and the username must belong to the group named by - the AuthGroupName directive. - -
    - -

    The AuthClass directive must appear inside a -Location directive. - - -

    AuthGroupName

    -
    - -

    Examples

    - -
      -AuthGroupName mygroup
      -AuthGroupName lp
      -
    - -

    Description

    - -

    The AuthGroupName directive sets the group to use for -Group authentication. - -

    The AuthGroupName directive must appear inside a -Location directive. - - -

    AuthType

    -
    - -

    Examples

    - -
      -AuthType None
      -AuthType Basic
      -AuthType Digest
      -AuthType BasicDigest
      -
    - -

    Description

    - -

    The AuthType directive defines the type of authentication to -perform: - -

      - -
    • None - No authentication should be performed - (default.) - -
    • Basic - Basic authentication should be - performed using the UNIX password and group files. - -
    • Digest - Digest authentication should be - performed using the /etc/cups/passwd.md5 file. - -
    • BasicDigest - Basic authentication should be - performed using the /etc/cups/passwd.md5 file. - -
    - -

    When using Basic, Digest, or -BasicDigest authentication, clients connecting -through the localhost interface can also -authenticate using certificates. - -

    The AuthType directive must appear inside a -Location directive. - - -

    AutoPurgeJobs

    -
    - -

    Examples

    - -
      -AutoPurgeJobs Yes
      -AutoPurgeJobs No
      -
    - -

    Description

    - -

    The AutoPurgeJobs 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 No. - - -

    BrowseAddress

    -
    - -

    Examples

    - -
      -BrowseAddress 255.255.255.255:631
      -BrowseAddress 192.0.2.255:631
      -BrowseAddress host.domain.com:631
      -BrowseAddress @LOCAL
      -BrowseAddress @IF(name)
      -
    - -

    Description

    - -

    The BrowseAddress directive specifies an address to -send browsing information to. Multiple BrowseAddress -directives can be specified to send browsing information to different -networks or systems. - -

    The @LOCAL name will broadcast printer -information to all local interfaces. The @IF(name) -name will broadcast to the named interface. - -

    No browse addresses are set by default.

    - -
    - - - -
    - NOTE: - -

    If you are using HP-UX 10.20 and a subnet that is not 24, - 16, or 8 bits, printer browsing (and in fact all broadcast - reception) will not work. This problem appears to be fixed in - HP-UX 11.0. -

    - - -

    BrowseAllow

    -
    - -

    Examples

    - -
      -BrowseAllow from all
      -BrowseAllow from none
      -BrowseAllow from 192.0.2
      -BrowseAllow from 192.0.2.0/24
      -BrowseAllow from 192.0.2.0/255.255.255.0
      -BrowseAllow from *.domain.com
      -BrowseAllow from @LOCAL
      -BrowseAllow from @IF(name)
      -
    - -

    Description

    - -

    The BrowseAllow directive specifies a system or network -to accept browse packets from. The default is to accept browse packets -from all hosts. - -

    Host and domain name matching require that you enable the -HostNameLookups directive. - -

    IP address matching supports exact matches, partial addresses that -match networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, -or network addresses using the specified netmask or bit count. - -

    The @LOCAL name will allow browse data from all -local network interfaces, but not remote point-to-point -interfaces. The @IF(name) name will allow browse -data from the named interface. - - - -

    BrowseDeny

    -
    - -

    Examples

    - -
      -BrowseDeny from all
      -BrowseDeny from none
      -BrowseDeny from 192.0.2
      -BrowseDeny from 192.0.2.0/24
      -BrowseDeny from 192.0.2.0/255.255.255.0
      -BrowseDeny from *.domain.com
      -BrowseDeny from @LOCAL
      -BrowseDeny from @IF(name)
      -
    - -

    Description

    - -

    The BrowseDeny directive specifies a system or network -to reject browse packets from. The default is to deny browse packets -from no hosts. - -

    Host and domain name matching require that you enable the -HostNameLookups directive. - -

    IP address matching supports exact matches, partial addresses that -match networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, -or network addresses using the specified netmask or bit count. - -

    The @LOCAL name will block browse data from all -local network interfaces, but not remote point-to-point -interfaces. The @IF(name) name will block browse -data from the named interface. - - - -

    BrowseOrder

    -
    - -

    Examples

    - -
      -BrowseOrder allow,deny
      -BrowseOrder deny,allow
      -
    - -

    Description

    - -

    The BrowseOrder directive specifies the order of allow/deny -processing. The default order is deny,allow: - -

      - -
    • allow,deny - Browse packets are accepted unless - specifically denied. - -
    • deny,allow - Browse packets are rejected unless - specifically allowed. - -
    - - -

    BrowseInterval

    -
    - -

    Examples

    - -
      -BrowseInterval 0
      -BrowseInterval 30
      -
    - -

    Description

    - -

    The BrowseInterval directive specifies the maximum amount of -time between browsing updates. Specifying a value of 0 seconds disables -outgoing browse updates but allows a server to receive printer information -from other hosts. - -

    The BrowseInterval value should always be less than the -BrowseTimeout value. Otherwise -printers and classes will disappear from client systems between updates. - - -

    BrowsePoll

    -
    - -

    Examples

    - -
      -BrowsePoll 192.0.2.2:631
      -BrowsePoll host.domain.com:631
      -
    - -

    Description

    - -

    The BrowsePoll directive polls a server for available -printers once every -BrowseInterval seconds. -Multiple BrowsePoll directives can be specified to poll -multiple servers. - -

    If BrowseInterval is set to 0 then the server is polled -once every 30 seconds. - - -

    BrowsePort

    -
    - -

    Examples

    - -
      -BrowsePort 631
      -BrowsePort 9999
      -
    - -

    Description

    - -

    The BrowsePort directive specifies the UDP port number -used for browse packets. The default port number is 631.

    - -
    - - - -
    - NOTE: - -

    You must set the BrowsePort to the same value - on all of the systems that you want to see. -

    - - -

    BrowseProtocols

    -
    - -

    Examples

    - -
      -BrowseProtocols CUPS
      -BrowseProtocols SLP
      -BrowseProtocols CUPS SLP
      -BrowseProtocols all
      -
    - -

    Description

    - -

    The BrowseProtocols directive specifies the protocols to -use when collecting and distributing shared printers on the local network. -The default protocol is CUPS, which is a broadcast-based -protocol.

    - -
    - - - -
    - NOTE: - -

    When using the SLP protocol, you must have at least - one Directory Agent (DA) server on your network. Otherwise the - CUPS scheduler (cupsd) will not respond to client - requests for several seconds while polling the network. -

    - - -

    BrowseRelay

    -
    - -

    Examples

    - -
      -BrowseRelay 193.0.2.1 192.0.2.255
      -BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
      -BrowseRelay 193.0.2.0/24 192.0.2.255
      -BrowseRelay *.domain.com 192.0.2.255
      -BrowseRelay host.domain.com 192.0.2.255
      -
    - -

    Description

    - -

    The BrowseRelay directive specifies source and destination -addresses for relaying browsing information from one host or network to -another. Multiple BrowseRelay directives can be specified -as needed. - -

    BrowseRelay is typically used on systems that bridge -multiple subnets using one or more network interfaces. It can also be -used to relay printer information from polled servers with the line: - -

      -BrowseRelay 127.0.0.1 255.255.255.255
      -
    - -

    This effectively provides access to printers on a WAN for all clients -on the LAN(s). - - -

    BrowseShortNames

    -
    - -

    Examples

    - -
      -BrowseShortNames Yes
      -BrowseShortNames No
      -
    - -

    Description

    - -

    The BrowseShortNames directive specifies whether or not -short names are used for remote printers when possible. Short names are -just the remote printer name, without the server ("printer"). If more than -one remote printer is detected with the same name, the printers will have -long names ("printer@server1", "printer@server2".) - -

    The default value for this option is Yes. - - -

    BrowseTimeout

    -
    - -

    Examples

    - -
      -BrowseTimeout 300
      -BrowseTimeout 60
      -
    - -

    Description

    - -

    The BrowseTimeout directive sets the timeout for -printer or class information that is received in browse packets. Once a -printer or class times out it is removed from the list of available -destinations. - -

    The BrowseTimeout value should always be greater than the -BrowseInterval value. Otherwise -printers and classes will disappear from client systems between updates. - - -

    Browsing

    -
    - -

    Examples

    - -
      -Browsing On
      -Browsing Off
      -
    - -

    Description

    - -

    The Browsing directive controls whether or not network printer -browsing is enabled. The default setting is On.

    - -
    - - - -
    - NOTE: - -

    If you are using HP-UX 10.20 and a subnet that is not 24, - 16, or 8 bits, printer browsing (and in fact all broadcast - reception) will not work. This problem appears to be fixed in - HP-UX 11.0. -

    - - -

    Classification

    -
    - -

    Examples

    - -
      -Classification
      -Classification classified
      -Classification confidential
      -Classification secret
      -Classification topsecret
      -Classification unclassified
      -
    - -

    Description

    - -

    The Classification 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. - - -

    ClassifyOverride

    -
    - -

    Examples

    - -
      -ClassifyOverride Yes
      -ClassifyOverride No
      -
    - -

    Description

    - -

    The ClassifyOverride 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 job-sheets option and can choose to only print one -security banner before or after the job. If the job-sheets -option is set to none then the server default classification -is used. - -

    The default is to not allow classification overrides. - - -

    ConfigFilePerm

    -
    - -

    Examples

    - -
      -ConfigFilePerm 0644
      -ConfigFilePerm 0600
      -
    - -

    Description

    - -

    The ConfigFilePerm directive specifies the permissions -to use when writing configuration files. The default is 0600. - - -

    DataDir

    -
    - -

    Examples

    - -
      -DataDir /usr/share/cups
      -
    - -

    Description

    - -

    The DataDir directive sets the directory to use for data -files. - - -

    DefaultCharset

    -
    - -

    Examples

    - -
      -DefaultCharset utf-8
      -DefaultCharset iso-8859-1
      -DefaultCharset windows-1251
      -
    - -

    Description

    - -

    The DefaultCharset directive sets the default character set -to use for client connections. The default character set is -utf-8 but is overridden by the character set for the language -specified by the client or the DefaultLanguage directive. - - -

    DefaultLanguage

    -
    - -

    Examples

    - -
      -DefaultLanguage de
      -DefaultLanguage en
      -DefaultLanguage es
      -DefaultLanguage fr
      -DefaultLanguage it
      -
    - -

    Description

    - -

    The DefaultLanguage 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. - - -

    Deny

    -
    - -

    Examples

    - -
      -Deny from All
      -Deny from None
      -Deny from *.domain.com
      -Deny from .domain.com
      -Deny from host.domain.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 @LOCAL
      -Deny from @IF(name)
      -
    - -

    Description

    - -

    The Deny directive specifies a hostname, IP address, or -network that is allowed access to the server. Deny -directives are cummulative, so multiple Deny directives -can be used to allow access for multiple hosts or networks. The -/mm notation specifies a CIDR netmask: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    mmnetmaskmmnetmask
    00.0.0.08255.0.0.0
    1128.0.0.016255.255.0.0
    2192.0.0.024255.255.255.0
    ......32255.255.255.255
    - -

    The @LOCAL name will deny access from all local -network interfaces, but not remote point-to-point interfaces. The -@IF(name) name will deny access from the named -interface. - -

    The Deny directive must appear inside a -Location directive. - - -

    DocumentRoot

    -
    - -

    Examples

    - -
      -DocumentRoot /usr/share/doc/cups
      -DocumentRoot /foo/bar/doc/cups
      -
    - -

    Description

    - -

    The DocumentRoot 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 -ServerRoot directory. The -default directory is /usr/share/doc/cups. - -

    Documents are first looked up in a sub-directory for the primary -language requested by the client (e.g. /usr/share/doc/cups/fr/...) -and then directly under the DocumentRoot directory -(e.g. /usr/share/doc/cups/...), so it is possible to localize -the web content by providing subdirectories for each language needed. - - -

    Encryption

    -
    - -

    Examples

    - -
      -Encryption Never
      -Encryption IfRequested
      -Encryption Required
      -Encryption Always
      -
    - -

    Description

    - -

    The Encryption directive must appear instead a -Location -section and specifies the encryption settings for that location. -The default setting is IfRequested for all locations. - - -

    ErrorLog

    -
    - -

    Examples

    - -
      -ErrorLog /var/log/cups/error_log
      -ErrorLog /var/log/cups/error_log-%s
      -ErrorLog syslog
      -
    - -

    Description

    - -

    The ErrorLog directive sets the name of the error log -file. If the filename is not absolute then it is assumed to be relative -to the ServerRoot directory. The -default error log file is /var/log/cups/error_log. - -

    The server name can be included in the filename by using -%s in the name. - -

    The special name "syslog" can be used to send the error information -to the system log instead of a plain file. - - -

    FilterLimit

    -
    - -

    Examples

    - -
      -FilterLimit 0
      -FilterLimit 200
      -FilterLimit 1000
      -
    - -

    Description

    - -

    The FilterLimit 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. - -

    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

    -
    - -

    Examples

    - -
      -FilterNice 0
      -FilterNice 39
      -FilterNice -10
      -
    - -

    Description

    - -

    The FilterNice directive sets the scheduling -priority of job filters. Values larger than 0 give filters a -lower priority while values smaller than 0 give filters a higher -priority. The FilterNice value does not affect the -priority of job backends. - -

    The default priority is 0. - - -

    FontPath

    -
    - -

    Examples

    - -
      -FontPath /foo/bar/fonts
      -FontPath /usr/share/cups/fonts:/foo/bar/fonts
      -
    - -

    Description

    - -

    The FontPath directive specifies the font path to use when -searching for fonts. The default font path is -/usr/share/cups/fonts. - - -

    Group

    -
    - -

    Examples

    - -
      -Group sys
      -Group system
      -Group root
      -
    - -

    Description

    - -

    The Group directive specifies the UNIX group that -filter and CGI programs run as. The default group is sys, -system, or root depending on the operating -system. - - -

    HideImplicitMembers

    -
    - -

    Examples

    - -
      -HideImplicitMembers Yes
      -HideImplicitMembers No
      -
    - -

    Description

    - -

    The HideImplicitMembers directive controls -whether the individual printers in an implicit class are shown -to the user. The default is No.

    - -

    ImplicitClasses -must be enabled for this directive to have any effect.

    - - -

    HostNameLookups

    -
    - -

    Examples

    - -
      -HostNameLookups On
      -HostNameLookups Off
      -HostNameLookups Double
      -
    - -

    Description

    - -

    The HostNameLookups directive controls whether -or not CUPS looks up the hostname for connecting clients. The -Double setting causes CUPS 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. Set this option to -On or Double only if absolutely -required. - - -

    ImplicitClasses

    -
    - -

    Examples

    - -
      -ImplicitClasses On
      -ImplicitClasses Off
      -
    - -

    Description

    - -

    The ImplicitClasses directive controls whether implicit -classes are created based upon the available network printers and classes. -The default setting is On but is automatically turned -Off if Browsing is -turned Off. - - -

    ImplicitAnyClasses

    -
    - -

    Examples

    - -
      -ImplicitAnyClasses On
      -ImplicitAnyClasses Off
      -
    - -

    Description

    - -

    The ImplicitAnyClasses directive controls -whether implicit classes for local and remote printers are -created with the name AnyPrinter. The default -setting is Off.

    - -

    ImplicitClasses -must be enabled for this directive to have any effect.

    - - -

    Include

    -
    - -

    Examples

    - -
      -Include filename
      -Include /foo/bar/filename
      -
    - -

    Description

    - -

    The Include directive includes the named file in -the cupsd.conf file. If no leading path is -provided, the file is assumed to be relative to the -ServerRoot directory.

    - - -

    KeepAlive

    -
    - -

    Examples

    - -
      -KeepAlive On
      -KeepAlive Off
      -
    - -

    Description

    - -

    The KeepAlive directive controls whether or not to support -persistent HTTP connections. The default is On. - -

    HTTP/1.1 clients automatically support persistent connections, while -HTTP/1.0 clients must specifically request them using the -Keep-Alive attribute in the Connection: -field of each request. - - -

    KeepAliveTimeout

    -
    - -

    Examples

    - -
      -KeepAliveTimeout 60
      -KeepAliveTimeout 30
      -
    - -

    Description

    - -

    The KeepAliveTimeout directive controls how long a -persistent HTTP connection will remain open after the last request. The -default is 60 seconds. - - -

    Limit

    -
    - -

    Examples

    - -
      -<Limit GET POST>
      -...
      -</Limit>
      -
      -<Limit ALL>
      -...
      -</Limit>
      -
    - -

    Description

    - -

    The Limit directive groups access control directives for -specific types of HTTP requests and must appear inside a -Location section. Access can be limited -for individual request types (DELETE, GET, -HEAD, OPTIONS, POST, PUT, -and TRACE) or for all request types (ALL). The -request type names are case-sensitive for compatibility with Apache. - - -

    LimitExcept

    -
    - -

    Examples

    - -
      -<LimitExcept GET POST>
      -...
      -</LimitExcept>
      -
    - -

    Description

    - -

    The LimitExcept directive groups access control directives for -specific types of HTTP requests and must appear inside a -Location section. Unlike the -Limit directive, LimitExcept -restricts access for all requests except those listed on the -LimitExcept line. - - -

    LimitRequestBody

    -
    - -

    Examples

    - -
      -LimitRequestBody 10485760
      -LimitRequestBody 10m
      -LimitRequestBody 0
      -
    - -

    Description

    - -

    The LimitRequestBody 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. - -

    Also see the identical -MaxRequestSize directive. - - -

    Listen

    -
    - -

    Examples

    - -
      -Listen 127.0.0.1:631
      -Listen 192.0.2.1:631
      -
    - -

    Description

    - -

    The Listen directive specifies a network address and port -to listen 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. - - -

    Location

    -
    - -

    Examples

    - -
      -<Location />
      -...
      -</Location>
      -
      -<Location /admin>
      -...
      -</Location>
      -
      -<Location /printers>
      -...
      -</Location>
      -
      -<Location /printers/name>
      -...
      -</Location>
      -
      -<Location /classes>
      -...
      -</Location>
      -
      -<Location /classes/name>
      -...
      -</Location>
      -
    - -

    Description

    - -

    The Location directive specifies access control and -authentication options for the specified HTTP resource or path. -The -Allow, -AuthClass, -AuthGroupName, -AuthType, -Deny, -Encryption, -Limit, -LimitExcept, -Order, -Require, and -Satisfy -directives may all appear inside a location. - -

    - - - - - - - - - - - -
    Locations on the Server.
    LocationDescription
    /The path for all get operations (get-printers, get-jobs, etc.)
    /adminThe path for all administration operations (add-printer, delete-printer, start-printer, etc.)
    /admin/confThe path for access to the ESP Print Pro configuration files (cupsd.conf, client.conf, etc.)
    /classesThe path for all classes
    /classes/nameThe resource for class name
    /jobsThe path for all jobs (hold-job, release-job, etc.)
    /jobs/idThe resource for job id
    /printersThe path for all printers
    /printers/nameThe path for printer name
    /printers/name.ppdThe PPD file path for printer name
    - -

    Note that more specific resources override the less specific ones. -So the directives inside the /printers/name location will override ones from /printers. -Directives inside /printers will override ones from /.   -None of the directives are inherited. -More information can be found in section "Printing System Security". - - -

    LogFilePerm

    -
    - -

    Examples

    - -
      -LogFilePerm 0644
      -LogFilePerm 0600
      -
    - -

    Description

    - -

    The LogFilePerm directive specifies the permissions -to use when writing configuration files. The default is 0644. - - -

    LogLevel

    -
    - -

    Examples

    - -
      -LogLevel none
      -LogLevel emerg
      -LogLevel alert
      -LogLevel crit
      -LogLevel error
      -LogLevel warn
      -LogLevel notice
      -LogLevel info
      -LogLevel debug
      -LogLevel debug2
      -
    - -

    Description

    - -

    The LogLevel directive specifies the level of logging -for the ErrorLog file. The -following values are recognized (each level logs everything under the -preceding levels): - -

      - -
    • none - Log nothing. - -
    • emerg - Log emergency conditions that prevent the - server from running. - -
    • alert - Log alerts that must be handled immediately. - -
    • crit - Log critical errors that don't prevent - the server from running. - -
    • error - Log general errors. - -
    • warn - Log errors and warnings. - -
    • notice - Log temporary error conditions. - -
    • info - Log all requests and state changes (default). - -
    • debug - Log basic debugging information. - -
    • debug2 - Log all debugging information. - -
    - - -

    MaxClients

    -
    - -

    Examples

    - -
      -MaxClients 100
      -MaxClients 1024
      -
    - -

    Description

    - -

    The MaxClients directive controls the maximum number of -simultaneous clients that will be allowed by the server. The default is -100 clients.

    - -
    - - - -
    - NOTE: - -

    Since each print job requires a file descriptor for the - status pipe, the CUPS server internally limits the - MaxClients value to 1/3 of the available file descriptors - to avoid possible problems when printing large numbers of jobs. -

    - - -

    MaxCopies

    -
    - -

    Examples

    - -
      -MaxCopies 100
      -MaxCopies 65535
      -
    - -

    Description

    - -

    The MaxCopies directive controls the maximum -number of copies that a user can print of a job. The default is -100 copies.

    - -
    - - - -
    - NOTE: - -

    Most HP PCL laser printers internally limit the - number of copies to 100. - -

    - - -

    MaxJobs

    -
    - -

    Examples

    - -
      -MaxJobs 100
      -MaxJobs 9999
      -MaxJobs 0
      -
    - -

    Description

    - -

    The MaxJobs 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. - -

    Setting the maximum to 0 disables this functionality. The default -setting is 0. - - -

    MaxJobsPerPrinter

    -
    - -

    Examples

    - -
      -MaxJobsPerPrinter 100
      -MaxJobsPerPrinter 9999
      -MaxJobsPerPrinter 0
      -
    - -

    Description

    - -

    The MaxJobsPerPrinter 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 cancelled. - -

    Setting the maximum to 0 disables this functionality. The default -setting is 0. - - -

    MaxJobsPerUser

    -
    - -

    Examples

    - -
      -MaxJobsPerUser 100
      -MaxJobsPerUser 9999
      -MaxJobsPerUser 0
      -
    - -

    Description

    - -

    The MaxJobsPerUser 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 cancelled. - -

    Setting the maximum to 0 disables this functionality. The default -setting is 0. - - -

    MaxLogSize

    -
    - -

    Examples

    - -
      -MaxLogSize 1048576
      -MaxLogSize 1m
      -MaxLogSize 0
      -
    - -

    Description

    - -

    The MaxLogSize 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 filename.O. This allows you to rotate the logs -automatically. The default size is 1048576 bytes (1MB). - -

    Setting the maximum size to 0 disables log rotation. - - -

    MaxRequestSize

    -
    - -

    Examples

    - -
      -MaxRequestSize 10485760
      -MaxRequestSize 10m
      -MaxRequestSize 0
      -
    - -

    Description

    - -

    The MaxRequestSize 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. - -

    Also see the identical -LimitRequestBody directive. - - -

    Order

    -
    - -

    Examples

    - -
      -Order Allow,Deny
      -Order Deny,Allow
      -
    - -

    Description

    - -

    The Order directive defines the default access control. -The following values are supported: - -

      - -
    • Allow,Deny - Allow requests from all - systems except for those listed in a Deny - directive. - -
    • Deny,Allow - Allow requests only from - those listed in an Allow directive. - -
    - -

    The Order directive must appear inside a -Location directive. - - -

    PageLog

    -
    - -

    Examples

    - -
      -PageLog /var/log/cups/page_log
      -PageLog /var/log/cups/page_log-%s
      -PageLog syslog
      -
    - -

    Description

    - -

    The PageLog directive sets the name of the page log -file. If the filename is not absolute then it is assumed to be relative -to the ServerRoot directory. The -default page log file is /var/log/cups/page_log. - -

    The server name can be included in the filename by using -%s in the name. - -

    The special name "syslog" can be used to send the page information -to the system log instead of a plain file. - - -

    Port

    -
    - -

    Examples

    - -
      -Port 631
      -Port 80
      -
    - -

    Description

    - -

    The Port directive specifies a port to listen on. -Multiple Port lines can be specified to listen on multiple -ports. The default port is 631. - - -

    PreserveJobHistory

    -
    - -

    Examples

    - -
      -PreserveJobHistory On
      -PreserveJobHistory Off
      -
    - -

    Description

    - -

    The PreserveJobHistory directive controls whether -the history of completed, cancelled, or aborted print jobs is stored -on disk. - -

    A value of On (the default) preserves job information -until the administrator purges it with the cancel -command. - -

    A value of Off removes the job information as soon as -each job is completed, cancelled, or aborted. - - -

    PreserveJobFiles

    -
    - -

    Examples

    - -
      -PreserveJobFiles On
      -PreserveJobFiles Off
      -
    - -

    Description

    - -

    The PreserveJobFiles directive controls whether the -document files of completed, cancelled, or aborted print jobs are -stored on disk. - -

    A value of On preserves job files until the -administrator purges them with the cancel command. Jobs -can be restarted (and reprinted) as desired until they are purged. - -

    A value of Off (the default) removes the job files as -soon as each job is completed, cancelled, or aborted. - - -

    Printcap

    -
    - -

    Examples

    - -
      -Printcap
      -Printcap /etc/printcap
      -Printcap /etc/printers.conf
      -
    - -

    Description

    - -

    The Printcap 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 /etc/printcap. - -

    When a filename is specified (e.g. /etc/printcap), 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. - - -

    PrintcapFormat

    -
    - -

    Examples

    - -
      -PrintcapFormat BSD
      -PrintcapFormat Solaris
      -
    - -

    Description

    - -

    The PrintcapFormat directive controls the output -format of the printcap file. The default is to generate a BSD -printcap file. - - -

    PrintcapGUI

    -
    - -

    Example

    - -
      -PrintcapGUI /usr/bin/glpoptions
      -
    - -

    Description

    - -

    The PrintcapGUI directive sets the program to -use when displaying an option panel from an IRIX application -that uses the Impressario print API. The default program is the -ESP Print Pro "glpoptions" GUI. - -

    The program must accept the -d option to specify -a printer and the -o option to specify one or more -options. After allowing the user to select/change options, the -program must then write the list of printing options without the --o to the standard output. - - -

    RemoteRoot

    -
    - -

    Examples

    - -
      -RemoteRoot remroot
      -RemoteRoot root
      -
    - -

    Description

    - -

    The RemoteRoot directive sets the username for -unauthenticated root requests from remote hosts. The default -username is remroot. Setting RemoteRoot -to root effectively disables this security mechanism. - - -

    RequestRoot

    -
    - -

    Examples

    - -
      -RequestRoot /var/spool/cups
      -RequestRoot /foo/bar/spool/cups
      -
    - -

    Description

    - -

    The RequestRoot 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 -ServerRoot directory. The -default request directory is /var/spool/cups. - - -

    Require

    -
    - -

    Examples

    - -
      -Require group foo bar
      -Require user john mary
      -Require valid-user
      -
    - -

    Description

    - -

    The Require directive specifies that -authentication is required for the resource. The -group keyword specifies that the authenticated user -must be a member of one or more of the named groups that follow. - -

    The user keyboard specifies that the -authenticated user must be one of the named users that follow. - -

    The valid-user keyword specifies that any -authenticated user may access the resource. - -

    The default is to do no authentication. This directive must -appear inside a Location -directive. - - -

    RIPCache

    -
    - -

    Examples

    - -
      -RIPCache 8m
      -RIPCache 1g
      -RIPCache 2048k
      -
    - -

    Description

    - -

    The RIPCache directive sets the size of the memory -cache used by Raster Image Processor ("RIP") filters such as -imagetoraster and pstoraster. The size can -be suffixed with a "k" for kilobytes, "m" for megabytes, or -"g" for gigabytes. The default cache size is "8m", or 8 megabytes. - - -

    RootCertDuration

    -
    - -

    Examples

    - -
      -RootCertDuration 300
      -RootCertDuration 0
      -
    - -

    Description

    - -

    The RootCertDuration directive controls the -interval between updates of the root authentication certificate. -The default is 300 seconds which updates the root -certificate approximately once every 5 minutes. Set the interval -to 0 to disable certificate updates entirely. - - - -

    RunAsUser

    -
    - -

    Examples

    - -
      -RunAsUser Yes
      -RunAsUser No
      -
    - -

    Description

    - -

    The RunAsUser directive controls whether the -scheduler runs as the unpriviledged user account (usually lp). -The default is No which leaves the scheduler running as -the root user. - -

    Note: Running as a non-priviledged user may prevent -LPD and locally connected printers from working due to -permission problems. The lpd backend will -automatically use a non-priviledged mode that is not 100% -compliant with RFC 1179. The parallel, -serial, and usb backends will need -write access to the corresponding device files. - - -

    Satisfy

    -
    - -

    Examples

    - -
      -Satisfy all
      -Satisfy any
      -
    - -

    Description

    - -

    The Satisfy directive specifies whether all -conditions must be satisfied to allow access to the resource. If -set to all, then all authentication and access -control conditions must be satified to allow access. - -

    Setting Satisfy to any 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. - -

    The default is all. This directive must appear -inside a Location -directive. - - -

    ServerAdmin

    -
    - -

    Examples

    - -
      -ServerAdmin user@host
      -ServerAdmin root@foo.bar.com
      -
    - -

    Description

    - -

    The ServerAdmin directive identifies the email address for the -administrator on the system. By default the administrator email address is -root@server, where server is the server name. - - -

    ServerBin

    -
    - -

    Examples

    - -
      -ServerBin /usr/lib/cups
      -ServerBin /foo/bar/lib/cups
      -
    - -

    Description

    - -

    The ServerBin directive sets the directory for -server-run executables. If an absolute path is not provided then it is -assumed to be relative to the -ServerRoot directory. The -default executable directory is /usr/lib/cups. - - -

    ServerCertificate

    -
    - -

    Examples

    - -
      -ServerCertificate /etc/cups/ssl/server.crt
      -
    - -

    Description

    - -

    The ServerCertificate 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. -The default certificate file is /etc/cups/ssl/server.crt. - - -

    ServerKey

    -
    - -

    Examples

    - -
      -ServerKey /etc/cups/ssl/server.key
      -
    - -

    Description

    - -

    The ServerKey directive specifies the location -of the SSL private key file used by the server when negotiating -encrypted connections. The default key file is -/etc/cups/ssl/server.crt. - - -

    ServerName

    -
    - -

    Examples

    - -
      -ServerName foo.domain.com
      -ServerName myserver.domain.com
      -
    - -

    Description

    - -

    The ServerName directive specifies the hostname that is -reported to clients. By default the server name is the hostname. - - -

    ServerRoot

    -
    - -

    Examples

    - -
      -ServerRoot /etc/cups
      -ServerRoot /foo/bar/cups
      -
    - -

    Description

    - -

    The ServerRoot directive specifies the absolute path to -the server configuration and state files. It is also used to resolve -relative paths in the cupsd.conf file. The default server -directory is /etc/cups. - - -

    ServerTokens

    -
    - -

    Examples

    - -
      -ServerTokens None
      -ServerTokens ProductOnly
      -ServerTokens Major
      -ServerTokens Minor
      -ServerTokens Minimal
      -ServerTokens OS
      -ServerTokens Full
      -
    - -

    Description

    - -

    The ServerTokens directive specifies the information -that is included in the Server header of HTTP responses. The default value -is Minor which generates "CUPS/1.1". - - -

    SSLListen

    -
    - -

    Examples

    - -
      -SSLListen 127.0.0.1:443
      -SSLListen 192.0.2.1:443
      -
    - -

    Description

    - -

    The SSLListen directive specifies a network -address and port to listen for secure connections. Multiple -SSLListen directives can be provided to listen on -multiple addresses. - -

    The SSLListen directive is similar to the -SSLPort directive but allows -you to restrict access to specific interfaces or networks. - - -

    SSLPort

    -
    - -

    Examples

    - -
      -SSLPort 443
      -
    - -

    Description

    - -

    The SSLPort directive specifies a port to listen -on for secure connections. Multiple SSLPort lines -can be specified to listen on multiple ports. - - -

    SystemGroup

    -
    - -

    Examples

    - -
      -SystemGroup sys
      -SystemGroup system
      -SystemGroup root
      -
    - -

    Description

    - -

    The SystemGroup directive specifies the system -administration group for System authentication. More -information can be found later in this chapter in -"Printing System Security". - - -

    TempDir

    -
    - -

    Examples

    - -
      -TempDir /var/tmp
      -TempDir /foo/bar/tmp
      -
    - -

    Description

    - -

    The TempDir directive specifies an absolute path for -the directory to use for temporary files. The default directory is -/var/tmp. - -

    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 /foo/bar/tmp: - -

      -mkdir /foo/bar/tmp ENTER
      -chmod a+rwxt /foo/bar/tmp ENTER
      -
    - - -

    Timeout

    -
    - -

    Examples

    - -
      -Timeout 300
      -Timeout 90
      -
    - -

    Description

    - -

    The Timeout directive controls the amount of time to -wait before an active HTTP or IPP request times out. The default -timeout is 300 seconds. - - -

    User

    -
    - -

    Examples

    - -
      -User lp
      -User guest
      -
    - -

    Description

    - -

    The User directive specifies the UNIX user that -filter and CGI programs run as. The default user is lp. - - -

    Printing System Security

    - -

    CUPS provides support for address, certificate, and password (Basic -and Digest) based authentication and access control. Certificate and -password authentication provide ways to limit access to individual -people or groups. - -

    Address based access control allows you to limit access to specific -systems, networks, or domains. While this does not provide authentication, -it does allow you to limit the potential users of your system efficiently. - -

    CUPS maintains a list of locations that have access control and/or -authentication enabled. Locations are specified using the -Location directive: - -

    - -

    Locations generally follow the directory structure of the -DocumentRoot directory, however -CUPS does have several virtual locations for administration, classes, jobs, -and printers: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LocationDescription
    /adminThe path for all administration operations.
    /classesThe path for all classes.
    /classes/nameThe resource for class name.
    /jobsThe path for all jobs.
    /jobs/idThe resource for job id.
    /printersThe path for all printers.
    /printers/nameThe path for printer name.
    /printers/name.ppdThe PPD file path for printer name.
    - -

    Authentication Using Certificates

    - -

    CUPS supports a local certificate-based authentication scheme that -can be used in place of Basic or Digest -authentication by clients connecting through the localhost -interface. Certificate authentication is not supported or allowed from -clients on any other interface. - -

    Certificates are 128-bit random numbers that refer to an internal -authentication record in the server. A client connecting via the -localhost interface sends a request with an -authorization header of: - -

      -Authorization: Local 0123456789ABCDEF0123456789ABCDEF
      -
    - -

    The server then looks up the local certificate and authenticates -using the username associated with it. - -

    Certificates are generated by the server automatically and stored in -the /etc/cups/certs directory using the process ID of the -CGI program started by the server. Certificate files are only readable -by the User and -Group defined in the -cupsd.conf file. When the CGI program ends the certificate -is removed and invalidated automatically. - -

    The special file /etc/cups/certs/0 defines the root -certificate which can be used by any client running as the super-user -or another user that is part of the group defined by the -SystemGroup directive. The -root certificate is automatically regenerated every 5 minutes. - -

    Using Basic Authentication

    - -

    Basic authentication uses UNIX users and passwords to authenticate -access to resources such as printers and classes, and to limit access -to administrative functions.

    - -
    - - - -
    - NOTE: - -

    Basic authentication sends the username and password Base64 - encoded from the client to the server, so it offers no - protection against eavesdropping. This means that a malicious - user can monitor network packets and discover valid users and - passwords that could result in a serious compromise in network - security. Use Basic authentication with extreme care. -

    - -

    The CUPS implementation of Basic authentication does not allow access -through user accounts without a password. If you try to authenticate -using an account without a password, your access will be immediately -blocked. - -

    Once a valid username and password is authenticated by CUPS, any -additional group membership requirements are checked.

    - -
    - - - -
    - NOTE: - -

    The root user is considered by CUPS to be a member of every - group. -

    - - -

    Use the AuthType directive to enable Basic authentication: - -

      -AuthType Basic
      -
    - - -

    Using Digest Authentication

    - -

    Digest authentication uses users and passwords defined in the -/etc/cups/passwd.md5 file to authenticate access to -resources such as printers and classes, and to limit access to -administrative functions.

    - -
    - - - -
    - NOTE: - -

    Unlike Basic authentication, Digest passes the MD5 sum - (basically a complicated checksum) of the username and password - instead of the strings themselves. Also, Digest authentication - does not use the UNIX password file, so if an attacker does - discover the original password it is less likely to result in a - serious security problem so long as you use a different UNIX - password than the corresponding Digest password. - -

    The current CUPS implementation of Digest authentication - uses the client's hostname or IP address for the "nonce" value. - The nonce value is an additional string added to the username - and password to make guessing the password more difficult. The - server checks that the nonce value matches the client's hostname - or address and rejects the MD5 sum if it doesn't. Future versions - of CUPS will support Digest "session" authentication which adds - the request data to the MD5 sum, providing even better - authentication and security. - -

    Digest authentication does not guarantee that an attacker - cannot gain unauthorized access, but it is safer than Basic - authentication and should be used in place of Basic - authentication whenever possible. Support for Digest - authentication in web browsers is not yet universally - available. -

    - - -

    The lppasswd(1) command is used to add, change, or -remove accounts from the passwd.md5 file. To add a -user to the default system group, type: - -

      -lppasswd -a user ENTER
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
    - - -

    Once added, a user can change his/her password by typing: - -

      -lppasswd ENTER
      -Old password: (password) ENTER [password is not echoed]
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
    - - -

    To remove a user from the password file, type: - -

      -lppasswd -x user ENTER
      -
    - -

    Once a valid username and password is authenticated by CUPS, any -additional group membership requirements are checked.

    - -
    - - - -
    - NOTE: - -

    The root user is considered by CUPS to be a member of every - group. -

    - -

    Use the AuthType directive to enable Digest authentication: - -

      -AuthType Digest
      -
    - -

    System and Group Authentication

    - -

    The AuthClass directive controls -the level of authentication to perform. System and -Group authentication extend the normal user-based authentication -to require membership in a UNIX group. For System authentication -each user must belong to the sys, system, or -root group; the actual group depends on the operating system. - -

    For Group authentication each user must belong to the -group named by the AuthGroupName -directive: - -

      -<Location /path>
      -AuthType Digest
      -AuthClass Group
      -AuthGroupName mygroup
      -</Location>
      -
    - -

    The named group must be a valid UNIX user group, usually defined in the -/etc/group or /etc/netgroup files. Additionally, when -using Digest authentication you need to create user accounts with the named -group: - -

      -lppasswd -g mygroup -a user ENTER
      -Password: (password) ENTER [password is not echoed]
      -Password again: (password) ENTER [password is not echoed]
      -
    - - -

    Printer Accounting

    - -

    CUPS maintains a log of all accesses, errors, and -pages that are printed. The log files are normally stored in the -/var/log/cups directory. You can change this by -editing the /etc/cups/cupsd.conf configuration file. - -

    The access_log File

    - -

    The access_log file lists each HTTP resource that is accessed -by a web browser or CUPS/IPP client. Each line is in the so-called "Common -Log Format" used by many web servers and web reporting tools: - -

      -host group user date-time \"method resource version\" status bytes
      -
      -127.0.0.1 - - [20/May/1999:19:20:29 +0000] "POST /admin/ HTTP/1.1" 401 0
      -127.0.0.1 - mike [20/May/1999:19:20:31 +0000] "POST /admin/ HTTP/1.1" 200 0
      -
    - -

    The host field will normally only be an IP address unless you -have enabled the HostNameLookups -directive in the cupsd.conf file. - -

    The group field always contains "-" in CUPS. - -

    The user field is the authenticated username of the requesting user. -If no username and password is supplied for the request then this field -contains "-". - -

    The date-time field is the date and time of the request in local time -and is in the format: - -

      -[DD/MON/YYYY:HH:MM:SS +ZZZZ]
      -
    - -

    where ZZZZ is the timezone offset in hours and minutes from Greenwich -Mean Time (a.k.a. GMT a.k.a. ZULU.) - -

    The method field is the HTTP method used ("GET", "PUT", "POST", etc.) - -

    The resource field is the filename of the requested resource. - -

    The version field is the HTTP specification version used by the -client. For CUPS clients this will always be "HTTP/1.1". - -

    The status field contains the HTTP result status of the -request. Usually it is "200", but other HTTP status codes are possible. -For example, 401 is the "unauthorized access" status in the example -above. - -

    The bytes field contains the number of bytes in the request. -For POST requests the bytes field contains the number of bytes -that was received from the client. - -

    The error_log File

    - -

    The error_log file lists messages from the scheduler (errors, -warnings, etc.): - -

      -level date-time message
      -
      -I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
      -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 was cancelled by 'mike'.
      -
    - -

    The level field contains the type of message: - -

      - -
    • E - An error occurred. - -
    • W - The server was unable to perform some action. - -
    • I - Informational message. - -
    • D - Debugging message. - -
    - -

    The date-time field contains the date and time of when the page -started printing. The format of this field is identical to the data-time -field in the access_log file. - -

    The message fields contains a free-form textual message. - -

    The page_log File

    - -

    The page_log file lists each page that is sent to a printer. -Each line contains the following information: - -

      -printer user job-id date-time page-number num-copies job-billing
      -
      -DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 0 acme-123
      -
    - -

    The printer field contains the name of the printer that -printed the page. If you send a job to a printer class, this field will -contain the name of the printer that was assigned the job. - -

    The user field contains the name of the user (the IPP -requesting-user-name attribute) that submitted this file for -printing. - -

    The job-id field contains the job number of the page being printed. -Job numbers are reset to 1 whenever the CUPS server is started, so don't depend -on this number being unique! - -

    The date-time field contains the date and time of when the page -started printing. The format of this field is identical to the data-time -field in the access_log file. - -

    The page-number and num-pages fields contain the page number -and number of copies being printed of that page. For printer that can not -produce copies on their own, the num-pages field will always be 1. - -

    The job-billing field contains a copy of the -job-billing attribute provided with the IPP -create-job or print-job requests or "-" if none -was provided. - - -

    File Typing and Filtering

    - -

    CUPS provides a MIME-based file typing and filtering mechanism to -convert files to a printable format for each printer. On startup the -CUPS server reads MIME database files from the /etc/cups -directory (or a directory specified by the -ServerRoot directive) to build -a file type and conversion database in memory. These database files are -plain ASCII text and can be edited with your favorite text editor. - -

    The mime.types and mime.convs files define the -standard file types and filters that are available on the system. - -

    mime.types

    - -

    The mime.types file defines the known file types. Each line -of the file starts with the MIME type and may be followed by one or -more file type recognition rules. For example, the -text/html file type is defined as: - -

      -text/html       html htm \
      -                printable(0,1024) + \
      -                (string(0,"<HTML>") string(0,"<!DOCTYPE"))
      -
    - -

    The first two rules say that any file with an extension of -.html or .htm is a HTML file. The third rule -says that any file whose first 1024 characters are printable text and -starts with the strings <HTML> or -<!DOCTYPE is a HTML file as well. - -

    The first two rules deal solely with the name of the file being -typed. This is useful when the original filename is known, however for -print files the server doesn't have a filename to work with. The third -rule takes care of this possibility and automatically figures out the -file type based upon the contents of the file instead. - -

    The available tests are: - -

      - -
    • ( expr ) - Parenthesis for expression grouping - -
    • + - Logical AND - -
    • , or whitespace - Logical OR - -
    • ! - Logical NOT - -
    • match("pattern") - Pattern match on filename - -
    • extension - Pattern match on "*.extension" - -
    • ascii(offset,length) - True if bytes are valid - printable ASCII (CR, NL, TAB, BS, 32-126) - -
    • printable(offset,length) - True if bytes are - printable 8-bit chars (CR, NL, TAB, BS, 32-126, 160-254) - -
    • string(offset,"string") - True if bytes are - identical to string - -
    • contains(offset,range,"string") - True if the - range of bytes contains the string - -
    • char(offset,value) - True if byte is identical - -
    • short(offset,value) - True if 16-bit integer - is identical (network or "big-endian" byte order) - -
    • int(offset,value) - True if 32-bit integer is - identical (network or "big-endian" byte order) - -
    • locale("string") - True if current locale - matches string - -
    - -

    All numeric values can be in decimal (123), octal (0123), or hexadecimal -(0x123) as desired. - - -

    Strings can be in quotes, all by themselves, as a string -of hexadecimal values, or some combination: - -

      -"string"
      -'string'
      -string
      -<737472696e67>
      -<7374>ring
      -
    - -

    As shown in the text/html example, rules can continue on -multiple lines using the backslash (\) character. A more complex example is -the image/jpeg rules: - -

      -image/jpeg      jpeg jpg jpe string(0,<FFD8FF>) &&\
      -                (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
      -                 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
      -                 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
      -                 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
      -
    - -

    This rule states that any file with an extension of -.jpeg, .jpg, or .jpe is a JPEG file. -In addition, any file starting with the hexadecimal string -<FFD8FF> (JPEG Start-Of-Image) followed by a -character between and including 0xe0 and 0xef -(JPEG APPn markers) is also a JPEG file. - -

    mime.convs

    - -

    The mime.convs file defines all of the filter programs that -are known to the system. Each line consists of: - -

      -source destination cost program
      -
      -text/plain application/postscript 50 texttops
      -application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
      -image/* application/vnd.cups-postscript 50 imagetops
      -image/* application/vnd.cups-raster 50 imagetoraster
      -
    - -

    The source field is a MIME type, optionally using a wildcard for -the super-type or sub-type (e.g. "text/plain", "image/*", "*/postscript"). - -

    The destination field is a MIME type defined in the -mime.types file. - -

    The cost field defines a relative cost for the filtering -operation from 1 to 100. The cost is used to choose between two -different sets of filters when converting a file. For example, to convert -from image/jpeg to application/vnd.cups-raster, -you could use the imagetops and pstoraster -filters for a total cost of 100, or the imagetoraster filter -for a total cost of 50. - -

    The program field defines the filter program to run; the -special program "-" can be used to make two file types equivalent. The -program must accept the standard filter arguments and environment -variables described in the CUPS Interface Design Description and CUPS -Software Programmers Manual: - -

      -program job user title options [filename]
      -
    - -

    If specified, the filename argument defines a file to read -when filtering, otherwise the filter must read from the standard input. -All filtered output must go to the standard output. - - -

    Adding Filetypes and Filters

    - -

    Adding a new file type or filter is fairly straight-forward. Rather -than adding the new type and filter to the mime.types and -mime.convs files which are overwritten when you upgrade to a -new version of CUPS, you simple need to create new files with -.types and .convs extensions in the -/etc/cups directory. We recommend that you use the product -or format name, e.g.: - -

      -myproduct.types
      -myproduct.convs
      -
    - -

    If you are providing a filter for a common file format or printer, -add the company or author name: - -

      -acme-msword.types
      -acme.msword.convs
      -
    - -

    This will help to prevent name collisions if you install many -different file types and filters. - -

    Once you choose the names for these files, create them using your -favorite text editor as described earlier in this chapter. Once you -have created the files, restart the cupsd process as -described earlier in "Restarting the CUPS Server". - -

    Printer Drivers and PPD Files

    - -

    Most CUPS printer drivers utilize one or more printer-specific filters -and a PPD file for each printer model. Printer driver filters are registered -via the PPD file using cupsFilter attributes: - -

      -*cupsFilter: "application/vnd.cups-raster 0 rastertohp"
      -
    - -

    The filter is specified using the source file type only; the destination -file type is assumed to be printer/name - suitable for sending -to the printer. - -

    Writing Your Own Filter or Printer Driver

    - -

    CUPS supports an unlimited number of file formats and filters, and can -handle any printer. If you'd like to write a filter or printer driver for -your favorite file format or printer, consult the CUPS Software Programmers -Manual for step-by-step instructions. - - -

    7 - Printing with Other Systems

    - -

    This chapter describes how to print from client systems that use the -LPD, Mac OS, or Windows printing protocols. - -

    The Basics

    - -

    CUPS is based on the IPP protocol, so any system that supports IPP -can send jobs to and receive jobs from CUPS automatically. However, not -all systems support IPP yet. This chapter will show you how to connect -these systems to your CUPS server, either to accept jobs from your -server for printing, or to send jobs to your server. - -

    Printing from LPD Clients

    - -

    CUPS supports limited functionality for LPD-based clients. With LPD you can -print files to specific printers, list the queue status, and so forth. However, -the automatic client configuration and printer options are not supported by -the LPD protocol, so you must manually configure each client for the printers -it needs to access. - -

    The cups-lpd(8) program provides support for LPD -clients and can be used from either the inetd(8) or -xinetd(8) programs. Add the following line to the -/etc/inetd.conf file to enable LPD support on your -server through the inetd program: - -

      -printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd
      -
    - -

    The path to the cups-lpd may vary depending on your -installation. - -

    Once you have added this line, send the inetd -process a HUP signal or reboot the system: - -

      -killall -HUP inetd ENTER [IRIX and some versions of Linux]
      -kill -HUP pid ENTER [Others]
      -reboot ENTER [For all systems if the HUP signal fails]
      -
    - -

    If you are using the xinetd program, create a -file named /etc/xinetd.d/printer containing the -following lines: - -

      -service printer
      -{
      -    socket_type = stream
      -    protocol = tcp
      -    wait = no
      -    user = lp
      -    server = /usr/lib/cups/daemon/cups-lpd
      -}
      -
    - -

    The xinetd program automatically reads the new -configuration file and enables LPD printing support. - -

    - - - -
    Warning: - -

    cups-lpd currently does not perform any - access control based on the settings in - cupsd.conf or in the hosts.allow - or hosts.deny files used by TCP wrappers. - Therefore, running cups-lpd on your server - will allow any computer on your network (and perhaps the - entire Internet) to print to your server. - -

    While xinetd has built-in access control - support, you should use the TCP wrappers package with - inetd to limit access to only those - computers that should be able to print through your - server. - -

    - -

    Printing to LPD Servers

    - -

    CUPS provides the lpd backend for printing to LPD-based -servers and printers. Use a device URI of lpd://server/name -to print to a printer on an LPD server, where server -is the hostname or IP address of the server and name is -the queue name. - -

    Microsoft Windows NT provides an LPD service under the name "TCP/IP -Printing Services". To enable LPD printing on NT, open the "Services" -control panel, select the "TCP/IP Printing Services" service, and click -on the "Start" button. Any shared printer will then be available via -the LPD protocol. - -

    Printing from Mac OS Clients

    - -

    CUPS does not provide Mac OS support directly. However, there are several -free and commercial software packages that do. - -

    Columbia Appletalk Package (CAP)

    - -

    Because the CAP LaserWriter server (lwsrv(8)) does -not support specification of PPD files, we do not recommend that you -use CAP with CUPS. However, you can run the lpsrv program -for limited printing with the command: - -

      -lwsrv -n "Name" -p printer -a /usr/lib/adicts -f /usr/lib/LW+Fonts
      -
    - -

    where Name is the name you want to use when sharing the -printer, and printer is the name of the CUPS print queue. - - -

    XINET KA/Spool

    - -

    To use your system as a print server for Mac OS clients, -configure each printer using a papserver(8) in the -/usr/adm/appletalk/services file, specifying the -corresponding PPD file in the /etc/cups/ppd directory for -each printer. For a printer named MyPrinter the entry -would look like: - -

      -/usr/etc/appletalk/papserver -I -L -P /etc/cups/ppd/MyPrinter.ppd \
      -"Printer Description" MyPrinter
      -
    - -
    - - - -
    - NOTE: - -

    Enter the text above on a single line without the backslash (\) - character. -

    - -

    NetATalk

    - -

    To use your system as a print server for Mac OS clients, -configure each printer in the papd.conf file, specifying the -corresponding PPD file in the /etc/cups/ppd directory for -each printer. For a printer named MyPrinter the entry -would look like: - -

      -Printer Description:MyPrinter@MyServer:\
      -        :pr=|/usr/bin/lp -d MyPrinter:\
      -        :op=daemon:\
      -        :pd=/etc/cups/ppd/MyPrinter.ppd:
      -
    - - - -

    Printing to Mac OS Servers

    - -

    CUPS currently does not provide a backend to communicate with a Mac OS -server. However, you can write and install a short shell script -in the /usr/lib/cups/backend directory that sends a print file -using the appropriate command. The following is a short script that will -run the papif command provided with CAP. - -

    After copying this script to /usr/lib/cups/backend/cap, -specify a device URI of cap://server/printer to use this -backend with a print queue. - - -

      -
      -"/usr/lib/cups/backend/cap"
      -#!/bin/sh
      -#
      -# Usage: cap job user title copies options [filename]
      -#
      -
      -# No arguments means show available devices...
      -
      -if test ${#argv} = 0; then
      -	echo "network cap \"Unknown\" \"Mac OS Printer via CAP\""
      -	exit 0
      -fi
      -
      -# Collect arguments...
      -
      -user=$2
      -copies=$4
      -
      -if test ${#argv} = 5; then
      -	# Get print file from stdin; copies have already been handled...
      -	file=/var/tmp/$$.prn
      -	copies=1
      -	cat > $file
      -else
      -	# Print file is on command-line...
      -	file=$6
      -fi
      -
      -# Create a dummy cap.printers file for this printer based
      -# upon a device URI of "cap://server/printer"...
      -
      -echo $PRINTER/$DEVICE_URI | \
      -	awk -F/ '{print $1 "=" $5 ":LaserWriter@" $4}' > /var/tmp/$$.cap
      -
      -CAPPRINTERS=/var/tmp/$$.cap; export CAPPRINTERS
      -
      -# Send the file to the printer, once for each copy. This assumes that you
      -# have properly initialized the cap.printers file...
      -
      -while [ $copies -gt 0 ]; do
      -	papif -n $user < $file
      -
      -        copies=`expr $copies - 1`
      -done
      -
      -# Remove any temporary files...
      -if test ${#argv} = 5; then
      -	/bin/rm -f $file
      -fi
      -
      -/bin/rm -f /var/tmp/$$.cap
      -
      -exit 0
      -
    - - -

    Printing from Windows Clients

    - -

    While CUPS does not provide Windows support directly, the free -SAMBA software package does. SAMBA version 2.0.6 is the first release -of SAMBA that supports CUPS. You can download SAMBA from: - -

    - -

    To configure SAMBA for CUPS, edit the smb.conf file and -replace the existing printing commands and options with the line: - -

      -printing = cups
      -printcap name = cups
      -
    - -

    That's all there is to it! Remote users will now be able to browse and -print to printers on your system. - -

    Exporting Printer Drivers

    - -

    You can optionally export printer drivers from your CUPS -server using the cupsaddsmb command and the SAMBA -2.2.0 or higher software. - -

    Before you can export the printers you must download the -current Adobe PostScript printer drivers from the Adobe web -site (http://www.adobe.com/). -Use the free unzip software to extract the files -from the self-extracting ZIP file containing the drivers; you -will need the following files: - -

      -ADFONTS.MFM
      -ADOBEPS4.DRV
      -ADOBEPS4.HLP
      -ADOBEPS5.DLL
      -ADOBEPSU.DLL
      -ADOBEPSU.HLP
      -DEFPRTR2.PPD
      -ICONLIB.DLL
      -PSMON.DLL
      -
    - -

    Copy these files to the /usr/share/cups/drivers -directory - you may need to rename some of the files so the -filenames are all UPPERCASE. - -

    Next, add a print$ share for the printer -drivers to your smb.conf file: - -

      -[print$]
      -    comment = Printer Drivers
      -    path = /etc/samba/drivers
      -    browseable = yes
      -    guest ok = no
      -    read only = yes
      -    write list = root
      -
    - -

    The directory for your printer drivers can be anywhere on the -system; just make sure it is writable by the users specified by -the write list directive. Also, make sure that you -have SAMBA passwords defined for each user in the write -list using the smbpasswd(1) command. -Otherwise you will not be able to authenticate - -

    Finally, run the cupsaddsmb command to export -the printer drivers for one or more queues: - -

      -cupsaddsmb -U root printer1 ... printerN ENTER
      -
    - -

    Running cupsaddsmb with the -a option -will export all printers: - -

      -cupsaddsmb -U root -a ENTER
      -
    - -

    Printing to Windows Servers

    - -

    CUPS can print to Windows servers in one of two ways. The first way uses -the LPD protocol on the CUPS system and the "TCP/IP Printing Services" on -the Windows system. You can find out more about this configuration in the -LPD section earlier in this chapter. - -

    The second way is through the Microsoft Server Message Block ("SMB") -protocol. Support for this protocol is provided with the free SAMBA -software package. You can download SAMBA from: - -

    - -

    To configure CUPS for SAMBA, run the following command: - -

      -ln -s `which smbspool` /usr/lib/cups/backend/smb ENTER
      -
    - -

    The smbspool(1) program is provided with SAMBA starting -with SAMBA 2.0.6. Once you have made the link you can configure your -printers with one of the following device URIs: - -

      -smb://workgroup/server/sharename
      -smb://server/sharename
      -smb://user:pass@workgroup/server/sharename
      -smb://user:pass@server/sharename
      -
    - -

    The workgroup name need only be specified if your -system is using a different workgroup. The user:pass -strings are required when printing to Windows NT servers or to shares -with passwords enabled under Windows 95 and 98. - - -

    A - Software License Agreement

    - - - - -

    B - Common Network Settings

    - -

    This appendix covers many of the popular TCP/IP network interfaces -and printer servers available on the market today. - -

    Configuring a Network Interface

    - -

    When you first install a network printer or print server on your -LAN, you need to set the Internet Protocol ("IP") address. On most -higher-end "workgroup" printers, you can set the address through the -printer control panel. However, in most cases you will want to assign -the addresses remotely from your workstation. This makes administration -a bit easier and avoids assigning duplicate addresses accidentally. - -

    To setup your printer or print server for remote address assignment, -you'll need the Ethernet Media Access Control ("MAC") address, also -sometimes called a node address, and the IP address you want to use for -the device. The Ethernet MAC address can often be found on the printer -test page or bottom of the print server. - - -

    Configuring the IP Address Using ARP

    - -

    The easiest way to set the IP address of a network device is to use -the arp(8) command. The arp sends an Address -Resolution Protocol ("ARP") packet to the specified Ethernet MAC address, -setting the network device's IP address: - -

      -arp -s ip-address ethernet-address ENTER
      -arp -s host.domain.com 08:00:69:00:12:34 ENTER
      -arp -s 192.0.2.2 08:00:69:00:12:34 ENTER
      -
    - -

    Configuring the IP Address Using RARP

    - -

    The most flexible way to remotely assign IP addresses under UNIX -is through the Reverse Address Resolution Protocol ("RARP"). RARP -allows a network device to request an IP address using its Ethernet -MAC address, and one or more RARP servers on the network will -respond with an ARP packet with the IP address the device can use. - -

    RARP should be used when you have to manage many printers or print -servers, or when you have a network device that does not remember its -IP address after a power cycle. If you just have a single printer or -print server, the arp command is the way to go. - -

    Some UNIX operating systems use a program called -rarpd(8) to manage RARP. Others, like Linux, support this -protocol in the kernel. For systems that provide the rarpd -program you will need to start it before RARP lookups will work: - -

      -rarpd ENTER
      -
    - -

    Under IRIX you can enable this functionality by default using: - -

      -chkconfig rarpd on ENTER
      -
    - -

    Both the rarpd program and kernel RARP support read a -list of Ethernet and IP addresses from the file /etc/ethers. -Each line contains the Ethernet address (colon delimited) followed by -an IP address or hostname like: - -

      -08:00:69:00:12:34 myprinter.mydomain.com
      -08:00:69:00:12:34 192.0.2.2
      -
    - -

    Add a line to this file and cycle the power on the printer or print -server to set its address. - - -

    Configuring the IP Address Using BOOTP

    - -

    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 bootpd(8) program supplied with UNIX you simply need to -add a line to the /etc/bootptab file; for IRIX: - -

      -myprinter 08:00:69:00:12:34 192.0.2.2 myprinter.boot
      -
    - - -

    Newer versions of bootpd use a different format: - -

      -myprinter:ha=080069001234:ip=192.0.2.2:t144=myprinter.boot
      -
    - -

    The myprinter.boot file resides in the /usr/local/boot -directory by default. If you do not need to provide a boot file you may leave -the last part of the line blank.

    - - -
    - - - -
    - NOTE: - -

    Some versions of UNIX do not enable the BOOTP service by - default. The /etc/inetd.conf usually contains a - line for the BOOTP service that can be uncommented if - needed. -

    - -

    Verifying the Printer Connection

    - -

    To test that the IP address has been successfully assigned and that the -printer is properly connected to your LAN, type: - -

      -ping ip-address ENTER
      -
    - -

    If the connection is working properly you will see something like: - -

      -ping myprinter ENTER
      -PING myprinter (192.0.2.2): 56 data bytes
      -64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
      -64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
      -64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
      -64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
      -
    - -

    If not, verify that the printer or print server is connected to the -LAN, it is powered on, the LAN cabling is good, and the IP address is -set correctly. You can usually see the current IP address and network -status by printing a configuration or test page on the device. - - -

    Common Network Interface Settings

    - -

    Once you have set the IP address you can access the printer or print -server using the ipp, lpd, or -socket backends. The following is a list of common network -interfaces and printer servers and the settings you should use with -CUPS: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Model/ManufacturerDevice URI(s)
    Apple LaserWriterlpd://address/PASSTHRU
    Axis w/o IPP
    - (see directions)
    socket://address:9100
    - socket://address:9101
    - socket://address:9102
    Axis w/IPPipp://address/LPT1
    - ipp://address/LPT2
    - ipp://address/COM1
    Castelle LANpressTMlpd://address/pr1
    - lpd://address/pr2
    - lpd://address/pr3
    DPI NETPrintlpd://address/pr1
    - lpd://address/pr2
    - lpd://address/pr3
    EFI® Fiery® RIPlpd://address/print
    EPSON® Multiprotocol Ethernet Interface Boardsocket://address
    Extended System ExtendNETlpd://address/pr1
    - lpd://address/pr2
    - lpd://address/pr3
    Hewlett Packard JetDirect w/o IPPsocket://address:9100
    - socket://address:9101
    - socket://address:9102
    Hewlett Packard JetDirect w/IPPipp://address/ipp
    - ipp://address/ipp/port1
    - ipp://address/ipp/port2
    - ipp://address/ipp/port3
    Intel® NetportExpress XL, PRO/100lpd://address/LPT1_PASSTHRU
    - lpd://address/LPT2_PASSTHRU
    - lpd://address/COM1_PASSTHRU
    LexmarkTM MarkNetlpd://address/ps
    Linksys EtherFast®
    - (see directions)
    socket://address:4010
    - socket://address:4020
    - socket://address:4030
    Kodak®lpd://address/ps
    QMS® CrownNetTMlpd://address/ps
    Tektronix® PhaserShareTMsocket://address:9100
    XEROX® 4512 NIClpd://address/PORT1
    XEROX® XNIClpd://address/PASSTHRU
    XEROX® (most others)socket://address:5503
    - -

    Configuring Axis Print Servers

    - -

    The Axis print servers can be configured using ARP, RARP, or BOOTP. -However, on models that do not provide IPP support an additional step -must be performed to configure the TCP/IP portion of the print server -for use with CUPS. - - -

    Each print server contains a configuration file named -config that contains a list of network parameters used by -the server. To modify this file you must first download it from the -print server using the ftp(1) program: - -

      -ftp ip-address ENTER
      -Connected to ip-address.
      -220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
      -ftp> user root ENTER
      -331 User name ok, need password
      -Password: pass ENTER (this is not echoed)
      -230 User logged in
      -ftp> get config ENTER
      -local: config remote: config
      -200 PORT command successful.
      -150 Opening data connection for config (192,0,2,2),
      -(mode ascii).
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
    - - -

    Next, edit the file with your favorite text editor and locate the -lines beginning with: - -

      -RTN_OPT.     : YES
      -RTEL_PR1.    : 0
      -RTEL_PR2.    : 0
      -RTEL_PR3.    : 0
      -RTEL_PR4.    : 0
      -RTEL_PR5.    : 0
      -RTEL_PR6.    : 0
      -RTEL_PR7.    : 0
      -RTEL_PR8.    : 0
      -
    - - -Change the RTN_OPT line to read: - -
      -RTN_OPT.     : NO
      -
    - - -

    This disables the Reverse TELNET protocol and enables the standard -TELNET protocol on the print server. Next, assign a port number for -each parallel and serial port on the server as follows: - -

      -RTEL_PR1.    : 9100
      -RTEL_PR2.    : 9101
      -RTEL_PR3.    : 9102
      -RTEL_PR4.    : 9103
      -RTEL_PR5.    : 9104
      -RTEL_PR6.    : 9105
      -RTEL_PR7.    : 9106
      -RTEL_PR8.    : 9107
      -
    - - -

    This essentially makes the Axis print server look like a Hewlett -Packard JetDirect EX print server. Save the file and then upload the -new config file using the ftp command: - -

      -ftp ip-address ENTER
      -Connected to ip-address.
      -220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
      -ftp> user root ENTER
      -331 User name ok, need password
      -Password: pass ENTER (this is not echoed)
      -230 User logged in
      -ftp> put config CONFIG ENTER
      -local: config remote: CONFIG
      -200 PORT command successful.
      -150 Opening data connection for config (192,0,2,2), (mode ascii).
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> get hardreset ENTER
      -local: hardreset remote: hardreset
      -200 PORT command successful.
      -421 Axis NPS ### hard reset, closing connection.
      -ftp> quit ENTER
      -221 Goodbye.
      -
    - -

    Your Axis print server is now ready for use! - -

    Configuring Linksys Print Servers

    - -

    The Linksys print servers can be configured using ARP, RARP, or -BOOTP. Like older Axis print servers, an additional step must be -performed to configure the TCP/IP portion of the print server for use -with CUPS. - - -

    Each print server contains a configuration file named -CONFIG that contains a list of network parameters used by -the server. To modify this file you must first download it from the -print server using the ftp(1) program: - -

      -ftp -n ip-address ENTER
      -Connected to ip-address.
      -220 Print Server Ready.
      -Remote system type is Print.
      -ftp> get CONFIG ENTER
      -local: CONFIG remote: CONFIG
      -200 Command OK.
      -150 Open ASCII Mode Connection.
      -WARNING! 68 bare linefeeds received in ASCII mode
      -File may not have transferred correctly.
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
    - - -

    Next, edit the file with your favorite text editor and locate the -lines beginning with: - -

      -0100 L1_PROUT:P1
      -0120 L2_PROUT:P1
      -0140 L3_PROUT:P1
      -
    - -

    Change the port number for -each parallel and serial port on the server as follows: - -

      -0100 L1_PROUT:P1
      -0120 L2_PROUT:P2
      -0140 L3_PROUT:P3
      -
    - - -

    This maps each virtual printer with a physical port. Save the file and then upload the -new CONFIG file using the ftp command: - -

      -ftp -n ip-address ENTER
      -Connected to ip-address.
      -220 Print Server Ready.
      -Remote system type is Print.
      -ftp> put CONFIG ENTER
      -local: CONFIG remote: CONFIG
      -200 Command OK.
      -150 Open ASCII Mode Connection.
      -226 Transfer complete.
      -##### bytes received in #.## seconds (##### Kbytes/s)
      -ftp> quit ENTER
      -221 Goodbye.
      -
    - -

    Your Linksys print server is now ready for use! - - -

    C - Printer Drivers

    - -

    This appendix lists the printer drivers that are provided with CUPS. - -

    Printer Drivers

    - -

    CUPS includes the following printer drivers: - -

    - -

    EPSON 9-pin Dot Matrix

    - -

    The EPSON 9-pin Dot Matrix driver (epson9.ppd) supports -9-pin dot matrix printers that implement the ESC/P command set. It -provides 60x72, 120x72, and 240x72 DPI output in black only. - -

    EPSON 24-pin Dot Matrix

    - -

    The EPSON 24-pin Dot Matrix driver (epson9.ppd) supports -24-pin dot matrix printers that implement the ESC/P command set. It -provides 120x180, 180x180, 360x180, and 360x360 DPI output in black -only. - -

    EPSON Stylus Color

    - -

    The EPSON Stylus Color driver (stcolor.ppd) supports -EPSON Stylus Color printers that implement the ESC/P2 command set. It -provides 180, 360, and 720 DPI output in black and color (CMYK). - -

    EPSON Stylus Photo

    - -

    The EPSON Stylus Photo driver (stphoto.ppd) supports -EPSON Stylus Photo printers that implement the ESC/P2 command set. It -provides 180, 360, and 720 DPI output in black and color (CMYKcm). - -

    HP DeskJet

    - -

    The HP DeskJet driver (deskjet.ppd) supports HP DeskJet -printers that implement the PCL command set. It provides 150, 300, and -600 DPI output in black and color (CMYK). - -

    The DeskJet printers that implement the HP-PPA command set (720C, -722C, 820C, and 1100C) are not supported due to a complete lack -of documentation and support from Hewlett Packard. - -

    The duplexer provided with the HP DeskJet 900 series printers is also -not supported for similar reasons. - -

    HP LaserJet

    - -

    The HP LaserJet driver (laserjet.ppd) supports HP -LaserJet printers that implement the PCL command set. It provides 150, -300, and 600 DPI output in black only and supports the duplexer if -installed. - -

    LaserJet printers that do not implement PCL (3100, 3150) are not -supported due to a complete lack of documentation and support from -Hewlett Packard. - - -

    D - List of Files

    - -

    This appendix lists the files and directories that are installed for -the Common UNIX Printing System. - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PathnameDescription
    /etc/cups/certs/The location of authentication certificate files for local - HTTP clients.
    /etc/cups/classes.confThe printer classes configuration file for the scheduler.
    /etc/cups/cupsd.confThe scheduler configuration file.
    /etc/cups/interfaces/The location of System V interface scripts for printers.
    /etc/cups/mime.convsThe list of standard file filters included with CUPS.
    /etc/cups/mime.typesThe list of recognized file types for CUPS.
    /etc/cups/ppd/The location of PostScript Printer Description ("PPD") files for - printers.
    /etc/cups/printers.confThe printer configuration file for the scheduler.
    /usr/bin/cancelThe System V cancel job(s) command.
    /usr/bin/disableThe System V disable printer command.
    /usr/bin/enableThe System V enable printer command.
    /usr/bin/lpThe System V print command.
    /usr/bin/lpoptionsSets user-defined printing options and defaults.
    /usr/bin/lppasswdAdds, changes, or removes Digest password accounts.
    /usr/bin/lpqThe Berkeley status command.
    /usr/bin/lprThe Berkeley print command.
    /usr/bin/lprmThe Berkeley cancel job(s) command.
    /usr/bin/lpstatThe System V status command.
    /usr/include/cups/CUPS API header files.
    /usr/lib32/libcups.a
    - /usr/lib32/libcupsimage.a
    Static libraries (IRIX 6.5)
    /usr/lib/libcups.a
    - /usr/lib/libcupsimage.a
    Static libraries (all others)
    /usr/lib/libcups.sl.2
    - /usr/lib/libcupsimage.sl.2
    Shared libraries (HP-UX)
    /usr/lib32/libcups.so.2
    - /usr/lib32/libcupsimage.so.2
    Shared libraries (IRIX 6.5)
    /usr/lib/libcups.so.2
    - /usr/lib/libcupsimage.so.2
    Shared libraries (all others)
    /usr/lib/cups/backend/Backends for various types of printer connections.
    /usr/lib/cups/cgi-bin/CGI programs for the scheduler.
    /usr/lib/cups/daemon/Daemons for polling and LPD support.
    /usr/lib/cups/filter/Filters for various types of files.
    /usr/lib/locale/The location of language-specific message files. (System V)
    /usr/lib/nls/msg/The location of language-specific message files. (Compaq Tru64 UNIX)
    /usr/share/locale/The location of language-specific message files. (Linux, *BSD)
    /usr/sbin/acceptThe accept-jobs command.
    /usr/sbin/cupsdThe CUPS print scheduler.
    /usr/sbin/lpadminThe System V printer administration tool.
    /usr/sbin/lpcThe Berkeley printer administration tool.
    /usr/sbin/lpinfoThe get-devices and get-ppds command.
    /usr/sbin/lpmoveThe move-jobs command.
    /usr/sbin/rejectThe reject-jobs command.
    /usr/share/catman/a_man/
    - /usr/share/catman/u_man/
    Man pages (IRIX)
    /usr/share/man/Man pages (Compaq Tru64 UNIX, HP-UX, Solaris)
    /usr/man/Man pages (all others)
    /usr/share/cups/data/The location of filter data files.
    /usr/share/cups/data/testprint.psThe PostScript test page file.
    /usr/share/cups/fonts/The location of PostScript fonts for the PostScript RIP.
    /usr/share/cups/model/The location of PostScript Printer Description ("PPD") files and - interface scripts that may be used to setup a printer queue.
    /usr/share/cups/pstoraster/Other PostScript RIP initialization files.
    /usr/share/cups/pstoraster/FontmapThe font mapping file (converts filenames to fontnames)
    /usr/share/cups/templates/The location of HTML template files for the web interfaces.
    /usr/share/doc/cups/Documentation and web page data for the scheduler.
    /var/log/cups/The location of scheduler log files.
    /var/spool/cups/The location of print files waiting to be printed.
    - - -

    E - Troubleshooting Common Problems

    - -

    This appendix covers some of the common problems first-time users -encounter when installing and configuring CUPS. - -

    Commercial support for CUPS is available from Easy Software Products. -For more information please contact us at: - -

    - -

    My Applications Don't See the Available Printers

    - -

    Many applications read the /etc/printcap file to -get a list of available printers. - -

    The default CUPS configuration creates the -/etc/printcap file automatically. To enable or -disable automatic creation and updating of this file, use the Printcap directive described -in Chapter 6, "Printing System -Management". - -

    CUPS Doesn't Recognize My Username or Password!

    - -

    CUPS will ask you for a UNIX username and password when you perform -printer administration tasks remotely or via a web browser. The default -configuration requires that you use the root username and -the corresponding password to authenticate the request. - -

    CUPS does not allow you to authenticate an administration request -with an account that has no password for security reasons. If you do -not have a password on your root account then you won't be -able to add printers remotely or via the web interface! - - -

    To disable password authentication you need to edit the -/etc/cups/cupsd.conf file and comment out the -lines reading: - -

      -AuthType Basic
      -AuthClass System
      -
    - -

    for the /admin location. Then restart the CUPS server as -described in Chapter 6, "Printing System -Management".

    - -
    - - - -
    - NOTE: - -

    Disabling password checks will allow any local user to - change your printer and class configuration, but remote - administration from another machine will still not be allowed. -

    - -

    I Can't Do Administration Tasks from Another Machine!

    - -

    The default CUPS configuration limits administration to the local -machine. To open up access, edit the /etc/cups/cupsd.conf -and comment out the lines reading: - -

      -Order deny,allow
      -Deny from all
      -Allow from 127.0.0.1
      -
    - -

    for the /admin location. Then restart the CUPS server as -described in Chapter 6, "Printing System -Management".

    - -
    - - - -
    - NOTE: - -

    Allowing administration access from all hosts is a potential - security risk. Please read Chapter - 6, "Printing System Management" for a description of these - risks and ways to minimize them. -

    - - -

    I Can't Do Administration Tasks from My Web Browser!

    - -

    This problem is usually caused by: - -

      - -
    1. not specifying the correct password for the - root account. - -
    2. accessing the CUPS server using the hostname or IP - address of the server without enabling remote access for - administration functions. This can be corrected by following - the instructions in the "I Can't Do - Administration Tasks from Another Machine!" section earlier - in this appendix. - -
    3. not setting a password on the root account. CUPS will not - authenticate a user account that does not have a password for - security reasons. - -
    4. authenticating using an account other than root, but the - account you are using is not a member of the system group. - -
    5. configuring CUPS to use Digest authentication, but - your web browser does not support Digest authentication. - -
    - -

    Connection Refused Messages

    - -

    Under normal circumstances, "connection refused" messages for a -networked printer should be expected from time to time. Most network -interfaces only allow a single connection to be made at any given time -(one job at a time) and will refuse access to all other systems while -the first connection is active. CUPS automatically retries the -connection once every 30 seconds. - -

    If the problem persists and you are unable to print any jobs to the printer, -verify that another machine is not maintaining a connection with the printer, -and that you have selected the proper port or printer name for the printer. - -

    Also, most external print servers will refuse connections if the connected -printer is turned off or is off-line. Verify that the affected printer is -turned on and is online. - -

    Write Error Messages

    - -

    If you get "write error" messages on a printer queue the printer -interface (usually a Hewlett Packard JetDirect interface) has timed out -and reset the network connection from your workstation. - -

    The error is caused by that startup delay between the initial setup -of the printer or plotter and the first page of print data that is -sent. - - -

    To correct the problem, change the idle timeout on the interface to at least -180 seconds or 3 minutes. To change the timeout on a Hewlett Packard -JetDirect interface, type: - -

      -telnet ip-address ENTER
      -
      -Trying ip-address...
      -Connected to ip-address.
      -Escape character is `^]'.
      -
      -Please type [Return] two times, to initialize telnet configuration
      -For HELP type "?"
      -> idle-timeout: 180 ENTER
      -> quit ENTER
      -
    - - - diff --git a/doc/sdd.html b/doc/sdd.html deleted file mode 100644 index 92172102a..000000000 --- a/doc/sdd.html +++ /dev/null @@ -1,591 +0,0 @@ - - - -CUPS Software Design Description - - - - - - - -

    -

    CUPS Software Design Description


    -CUPS-SDD-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Design Overview - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    - This software design description document provides general information - on the architecture and coding of the Common UNIX Printing System - ("CUPS") Version 1.2. -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    - This software design description document is organized into the - following sections: -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Design Overview
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Design Overview

    - CUPS is composed of 9 software sub-systems that operate together to - perform common printing tasks: -
      -
    • Backends
    • -
    • Berkeley Commands
    • -
    • CGI
    • -
    • CUPS Application Programmers Interface
    • -
    • CUPS Imaging Library
    • -
    • Daemons
    • -
    • Filters
    • -
    • Scheduler
    • -
    • System V Commands
    • -
    -

    3.1 Backends

    - The backends implement communications over a number of different - interfaces. All backends are called with a common set of arguments: -
      -
    • Device URI - the Uniform Resource Identifier for the output device - (e.g. parallel:/dev/plp, ipp://hostname/resource -).
    • -
    • Job Identifier - the job identifier for this job (integer).
    • -
    • User Name - the user associated with this job (name string).
    • -
    • Title - the title/job-name associated with this job (name string).
    • -
    • Copies - the number of copies required (integer).
    • -
    • Options - the options associated with this job (space separated - option strings).
    • -
    • Filename (optional) - the file to print; if this option is not - specified, the backend must read the print file from the standard - input.
    • -
    -

    Backends are named using the scheme of the URI, so a URI of - "ipp://hostname/resource" would be processed by the "ipp" backend.

    -

    3.1.1 ipp

    -

    The ipp backend sends the specified job to a network printer or host - using the Internet Printing Protocol. The URI is as specified by the -printer-uri-supported attribute from the printer or host.

    -

    3.1.2 lpd

    -

    The lpd backend sends the specified job to a network printer or host - using the Line Printer Daemon protocol. The URI is of the form:

    -
      -
      lpd://hostname/queue
      -
      -
    -

    3.1.3 parallel

    -

    The parallel backend sends the specified job to a local printer - connected via the specified parallel port device. The URI is of the - form:

    -
      -
      parallel:/dev/file
      -
      -
    -

    3.1.4 serial

    -

    The serial backend sends the specified job to a local printer - connected via the specified serial port device. The URI is of the form:

    -
      -
      serial:/dev/file?option[+option+...]
      -
      -
    - The options can be any combination of the following: -
      -
    • baud=rate - Sets the baud rate for the device.
    • -
    • bits=7 or 8 - Sets the number of data bits.
    • -
    • parity=even - Sets even parity checking.
    • -
    • parity=odd - Sets odd parity checking.
    • -
    • parity=none - Turns parity checking off.
    • -
    • flow=dtrdsr - Turns DTR/DSR (hardware) flow - control on.
    • -
    • flow=hard - Turns RTS/CTS (hardware) flow - control on.
    • -
    • flow=none - Turns flow control off.
    • -
    • flow=rtscts - Turns RTS/CTS (hardware) flow - control on.
    • -
    • flow=xonxoff - Turns XON/XOFF (software) flow - control on.
    • -
    -

    3.1.5 socket

    -

    The socket backend sends the specified job to a network host using - the AppSocket protocol commonly used by Hewlett-Packard and Tektronix - printers. The URI is of the form:

    -
      -
      socket://hostname[:port]
      -
      -
    - The default port number is 9100. -

    3.1.6 usb

    -

    The usb backend sends the specified job to a local printer connected - via the specified usb port device. The URI is of the form:

    -
      -
      usb:/dev/file
      -
      -
    -

    3.2 Berkeley Commands

    -

    The Berkeley commands provide a simple command-line interface to CUPS - to submit and control print jobs. It is provided for compatibility with - existing software that is hardcoded to use the Berkeley commands.

    -

    3.2.1 lpc

    - The lpc command allows users and administrators to check the status and - control print queues. The version provided with CUPS supports the - following commands: -
      -
    • quit - Quits the lpc command.
    • -
    • status - Shows the status of printers and jobs in the queue.
    • -
    -

    3.2.2 lpq

    -

    The lpq command shows the current queue status.

    -

    3.2.3 lpr

    -

    The lpr command submits a job for printing. The CUPS version of lpr - silently ignores the "i", "t", "m", "h", and "s" options.

    -

    3.2.4 lprm

    -

    The lprm removes one or more print jobs.

    -

    3.3 CGI

    -

    The Common Gateway Interface (CGI) programs provide a web-based - status interface to monitor the status of printers, classes, and jobs. - Each of the CGIs utilize HTML template files that can be customized to - provide alternate appearances.

    -

    3.3.1 admin.cgi

    -

    The admin CGI provides administration interfaces for printers and - classes. The user can add, modify, delete, start, stop, and configure - printers and classes using "wizard" interfaces.

    -

    3.3.2 classes.cgi

    -

    The classes CGI lists the available printer classes and any pending - jobs for the class. The user can click on individual classes to limit - the display and click on jobs to see the job status.

    -

    3.3.3 jobs.cgi

    -

    The jobs CGI lists the queued print jobs in order of priority. The - list can be limited by printer or job.

    -

    3.3.4 printers.cgi

    -

    The printers CGI lists the available printer queues and any pending - jobs for the printer. The user can click on individual printers to - limit the display and click on jobs to see the job status.

    -

    3.4 CUPS Application Programmers Interface

    -

    The CUPS Application Programmers Interface ("API") provides common - convenience, HTTP, IPP, language, and PPD functions used by the CUPS - software.

    -

    3.4.1 Convenience Functions

    -

    Convenience functions are provided to submit an IPP request, send a - print file, cancel a job, get a list of available printers, get a list - of available classes, get the default printer or class, get the default - server name, get the local username, and get a password string.

    -

    3.4.2 HTTP Functions

    -

    The HTTP functions provide functions to connect to HTTP servers, - issue requests, read data from a server, and write data to a server.

    -

    3.4.3 IPP Functions

    -

    The IPP function provide functions to manage IPP request data and - attributes, read IPP responses from a server, and write IPP requests to - a server.

    -

    3.4.4 Language Functions

    -

    The language functions provide a standard interface for retrieving - common textual messages for a particular locale and determining the - correct encoding (e.g. US ASCII, UTF-8, ISO-8859-1, etc.)

    -

    3.4.5 PPD Functions

    -

    The PostScript Printer Description functions manage PPD files, select - options, check for option conflicts, and emit selected options in the - correct order.

    -

    3.5 CUPS Imaging Library

    -

    The CUPS imaging library provides colorspace conversion, color - management, image management, scaling, image file, and raster functions - used by the CUPS raster filters.

    -

    3.5.1 Colorspace Conversion Functions

    -

    The colorspace conversion functions handle conversion of grayscale - and RGB colors to grayscale, RGB, K, CMY, CMYK, and CMYKcm colorspaces.

    -

    3.5.2 Color Management Functions

    -

    The color management functions handle gamut mapping and density - correction. These are integrated with the colorspace conversion - functions so that colorspace conversion and color management are - processed in a single step.

    -

    3.5.3 Image Management Functions

    -

    The image management functions manage a tiled image database that is - swapped to/from disk as needed.

    -

    3.5.4 Scaling Functions

    -

    The scaling functions provide image scaling services using - nearest-neighbor sampling and bilinear interpolation as appropriate.

    -

    3.5.5 Image File Functions

    -

    The image file functions handle loading of all image file formats.

    -

    3.5.6 Raster Functions

    -

    The raster functions manage streams of CUPS raster data (described in - the Interface Design Document) used by non-PostScript printer drivers - and raster filters.

    -

    3.6 Daemons

    -

    The daemons provide additional network functions for the scheduler. - Currently only two daemons are provided with CUPS.

    -

    3.6.1 Line Printer Daemon

    -

    The line printer daemon provides remote LPD client support and is run - by the inetd(8) daemon as needed.

    -

    3.6.2 Polling Daemon

    -

    The polling daemon is used to poll a remote server for a list of - available printers and provide it to the scheduler for addition. A - separate polling daemon is run by the scheduler for every remote system - listed for polling in the scheduler configuration file.

    -

    3.7 Filters

    -

    The filters implement file conversion services for CUPS. All filters - are called with a common set of arguments:

    -
      -
    • Printer name - the name of the destination printer (name string).
    • -
    • Job Identifier - the job identifier for this job (integer).
    • -
    • User Name - the user associated with this job (name string).
    • -
    • Title - the title/job-name associated with this job (name string).
    • -
    • Copies - the number of copies required (integer).
    • -
    • Options - the options associated with this job (space separated - option strings).
    • -
    • Filename (optional) - the file to print; if this option is not - specified, the filter must read the input file from the standard input.
    • -
    -

    Filters are added to the MIME conversion data file and implement all - necessary conversions from one file type to another.

    -

    3.7.1 hpgltops

    -

    The hpgltops filter converts HP-GL/2 files into PostScript.

    -

    3.7.2 imagetops

    -

    The imagetops filter converts image files into PostScript.

    -

    3.7.3 imagetoraster

    -

    The imagetoraster filter converts image files into CUPS raster data.

    -

    3.7.4 pdftops

    -

    The pdftops filter converts PDF files into PostScript.

    -

    3.7.5 pstops

    -

    The pstops filter inserts printer-specific commands from PPD files - and performs page filtering as requested by the user.

    -

    3.7.6 pstoraster

    -

    The pstoraster filter converts PostScript program data into CUPS - raster data.

    -

    3.7.7 rastertoepson

    -

    The rastertoepson filter handles converting CUPS raster data to ESC/P - and supports both color and black-and-white printers.

    -

    3.7.8 rastertohp

    -

    The rastertohp filter handles converting CUPS raster data to HP-PCL - and supports both color and black-and-white printers.

    -

    3.7.9 texttops

    -

    The texttops filter converts text files into PostScript.

    -

    3.8 Scheduler

    -

    The scheduler is a fully-functional HTTP/1.1 and IPP/1.1 server that - manages the printers, classes, and jobs in the system. It also handles - a simple broadcast-based directory service so that remote print queues - and classes can be accessed transparently from the local system.

    -

    3.8.1 Authorization

    -

    The authorization module is responsible for performing access control - and authentication for all HTTP and IPP requests entering the system.

    -

    3.8.2 Classes

    -

    The classes module is responsible for managing printer classes in the - system. Each class is a collection of local and/or remote printers. The - classes module also reads and writes the classes configuration file.

    -

    3.8.3 Client

    -

    The client module is responsible for all HTTP client communications. - It handles listening on selected interfaces, accepting connections from - prospective clients, processing incoming HTTP requests, and sending - HTTP responses to those requests. The client module also is responsible - for executing the external CGI programs as needed to support web-based - printer, class, and job status monitoring and administration.

    -

    Once authorized, all IPP requests are sent to the IPP module.

    -

    3.8.4 Configuration

    -

    The configuration module is responsible for reading the CUPS - configuration file and initializing the appropriate data structures and - values. The configuration module also stops CUPS services before - reading the configuration file and restarts them after the - configuration file has been read.

    -

    3.8.5 Devices

    -

    The devices module is responsible for managing the list of available - devices for the CUPS-Get-Devices operation.

    -

    3.8.6 Directory Services

    -

    The directory services module sends and recieves printer state - information over a broadcast socket. Remote printers and classes are - automatically added to or removed from the local printer and class - lists as needed.

    -

    The directory services module can only recieve printer state - information over a single UDP port, however it can broadcast to - multiple addresses and ports as needed.

    -

    3.8.7 IPP

    -

    The IPP module handles IPP requests and acts accordingly. URI - validation is also performed here, as a client can post IPP data to any - URI on the server which might sidestep the access control or - authentication of the HTTP server.

    -

    3.8.8 Jobs

    -

    The jobs module manages print jobs, starts filter and backend - processes for jobs to be printed, and monitors status messages from - those filters and backends.

    -

    3.8.9 Logging

    -

    The logging module manages the access, error, and page log files that - are generated by the scheduler.

    -

    3.8.10 Main

    -

    The main module is responsible for timing out and dispatching input - and output for client connections. It also watches for incoming -SIGHUP and SIGCHLD signals, reloads the server - configuration files as needed, and handles child process errors and - exits.

    -

    3.8.11 MIME

    -

    The Multimedia Internet Mail Exchange module manages a MIME type and - conversion database that supports file typing by extension and content - and least-cost file filtering from a source to a destination file type.

    -

    3.8.12 PPDs

    -

    The PPDs module is responsible for managing the list of available PPD - files for the CUPS-Get-PPDs operation.

    -

    3.8.13 Printers

    -

    The printers module is responsible for managing printers and PPD - files in the system. The printers module also reads and writes the - printers configuration file.

    -

    3.9 System V Commands

    -

    The System V commands provide a robust command-line interface to CUPS - to submit and control printers and jobs.

    -

    3.9.1 accept

    -

    The accept command tells the scheduler to accept new jobs for - specific printers.

    -

    3.9.2 cancel

    -

    The cancel command tells the scheduler to cancel one or more jobs - that are queued for printing.

    -

    3.9.3 disable

    -

    The disable command tells the scheduler to stop printing jobs on the - specified printers.

    -

    3.9.4 enable

    -

    The enable command tells the scheduler to start printing jobs on the - specified printers.

    -

    3.9.5 lp

    -

    The lp command submits submits files for printing. Unlike the - standard System V lp command, a single CUPS lp command will generate a - separate job ID for each file that is printed. Also, the Solaris "f", - "H", "P", "S", and "y" options are silently ignored.

    -

    3.9.6 lpadmin

    -

    The lpadmin command manages printer queues and classes. The Solaris - "A", "F", "I", "M", "P", "Q", "S", "T", "U", "W", "f", "l", "m", "o", - "s", "t", and "u" options are not supported, and new options "P" (PPD - file) and "E" (enable and accept) are provided to configure - CUPS-specific features.

    -

    3.9.7 lpinfo

    -

    The lpinfo command lists the available PPD files or devices as - selected by the user.

    -

    3.9.8 lpmove

    -

    The lpmove command moves a print job to a new destination.

    -

    3.9.9 lpoptions

    -

    The lpoptions command manages user-defined printers and options.

    -

    3.9.10 lpstat

    -

    The lpstat command lists printers, classes, and jobs as requested by - the user.

    -

    3.9.11 reject

    -

    The reject command tells the scheduler not to accept new jobs for - specific printers.

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/sdd.pdf b/doc/sdd.pdf deleted file mode 100644 index 15a684056e8d6f5d6703f347f9a267a752c0e1d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 71633 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%0A$23uSI56bGMBw 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 - - -CUPS Software Programmers Manual - - - - - - - -


    -

    CUPS Software Programmers Manual


    -CUPS-SPM-1.2.0
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    Preface - -1 - Printing System Overview - -2 - The CUPS API - -3 - Writing Filters - -4 - Writing Printer Drivers - -5 - Writing Backends - -A - Software License Agreement - -B - Constants - -C - Structures - -D - Functions - -
    -

    Preface

    -

    This software programmers manual provides software programming - information for the Common UNIX Printing System ("CUPS") Version 1.2.0.

    -

    System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    - - -

    Document Overview

    -

    This software programmers manual is organized into the following - sections:

    - -

    Notation Conventions

    -

    Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below: -

    - - - - - - - - - - - - -
    Example   Description
     
    lpstat -
    lpstat(1)
       The names of commands; - the first mention of a command or function in a chapter is followed by - a manual page section number.
     
    /var -
    /usr/share/cups/data/testprint.ps
        -File and directory names.
     
    Request ID is Printer-123 -   Screen output.
     
    lp -d printer filename ENTER -   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are - written using the period (.) to indicate the decimal point.
    -
    - - -

    -

    Abbreviations

    - The following abbreviations are used throughout this manual: -
      -
      -
      kb
      -
      Kilobytes, or 1024 bytes -
       
      -
      Mb
      -
      Megabytes, or 1048576 bytes -
       
      -
      Gb
      -
      Gigabytes, or 1073741824 bytes -
       
      -
      -
    -

    Other References

    -
      -
      -
      CUPS Software Administrators Manual
      -
      An administration guide for the CUPS software. -
       
      -
      CUPS Software Users Manual
      -
      An end-user guide for using the CUPS software. -
       
      -
      -
    -

    1 - Printing System Overview

    -

    This chapter provides an overview of how the Common UNIX Printing - System works.

    -

    The Printing Problem

    -

    For years the printing problem has plagued UNIX. Unlike - Microsoft® Windows® or Mac OS, UNIX has no standard interface or system - in place for supporting printers. Among the solutions currently - available, the Berkeley and System V printing systems are the most - prevalent.

    -

    These printing systems support line printers (text only) or - PostScript printers (text and graphics), and with some coaxing they can - be made to support a full range of printers and file formats. However, - because each varient of the UNIX operating system uses a different - printing system than the next developing printer drivers for a wide - range of printers and operating systems is extremely difficult. That - combined with the limited volume of customers for each UNIX varient has - forced most printer vendors to give up supporting UNIX entirely.

    -

    CUPS is designed to eliminate the printing problem. One common - printing system can be used by all UNIX varients to support the - printing needs of users. Printer vendors can use its modular filter - interface to develop a single driver program that supports a wide range - of file formats with little or no effort. Since CUPS provides both the - System V and Berkeley printing commands, users (and applications) can - reap the benefits of this new technology with no changes.

    -

    The Technology

    -

    CUPS is based upon an emerging Internet standard called the Internet - Printing Protocol. IPP has been embraced by dozens of printer and - printer server manufacturers and is supported by Microsoft Windows - 2000.

    -

    IPP defines a standard protocol for printing as well as managing - print jobs and printer options like media size, resolution, and so - forth. Like all IP-based protocols, IPP can be used locally or over the - Internet to printers hundreds or thousands of miles away. Unlike other - protocols, however, IPP also supports access control, authentication, - and encryption, making it a much more capable and secure printing - solution than older ones.

    -

    IPP is layered on top of the Hyper-Text Transport Protocol ("HTTP") - which is the basis of web servers on the Internet. This allows users to - view documentation, check status information on a printer or server, - and manage their printers, classes, and jobs using their web browser.

    -

    CUPS provides a complete IPP/1.1 based printing system that provides - Basic, Digest, and local certificate authentication and user, domain, - or IP-based access control. TLS encryption will be available in future - versions of CUPS.

    -

    Jobs

    -

    Each file or set of files that is submitted for printing is called a - job. Jobs are identified by a unique number starting at 1 and are - assigned to a particular destination, usually a printer. Jobs can also - have options associated with them such as media size, number of copies, - and priority.

    -

    Classes

    -

    CUPS supports collections of printers known as classes. Jobs - sent to a class are forwarded to the first available printer in the - class.

    -

    Filters

    -

    Filters allow a user or application to print many types of files - without extra effort. Print jobs sent to a CUPS server are filtered - before sending them to a printer. Some filters convert job files to - different formats that the printer can understand. Others perform page - selection and ordering tasks.

    -

    CUPS provides filters for printing many types of image files, HP-GL/2 - files, PDF files, and text files. CUPS also supplies PostScript and - image file Raster Image Processor ("RIP") filters that convert - PostScript or image files into bitmaps that can be sent to a raster - printer.

    -

    Backends

    -

    Backends perform the most important task of all - they send the - filtered print data to the printer.

    -

    CUPS provides backends for printing over parallel, serial, and USB - ports, and over the network via the IPP, JetDirect (AppSocket), and - Line Printer Daemon ("LPD") protocols. Additional backends are - available in network service packages such as the SMB backend included - with the popular SAMBA software.

    -

    Backends are also used to determine the available devices. On startup - each backend is asked for a list of devices it supports, and any - information that is available. This allows the parallel backend to tell - CUPS that an EPSON Stylus Color 600 printer is attached to parallel - port 1, for example.

    -

    Printer Drivers

    -

    Printer drivers in CUPS consist of one of more filters specific to a - printer. CUPS includes sample printer drivers for Hewlett-Packard - LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color, - and Stylus Photo printers. While these drivers do not generate optimal - output for the different printer models, they do provide basic printing - and demonstrate how you can write your own printer drivers and - incorporate them into CUPS.

    -

    Networking

    -

    Printers and classes on the local system are automatically shared - with other systems on the network. This allows you to setup one system - to print to a printer and use this system as a printer server or spool - host for all of the others. Users may then select a local printer by - name or a remote printer using "name@server".

    -

    CUPS also provides implicit classes, which are collections of - printers and/or classes with the same name. This allows you to setup - multiple servers pointing to the same physical network printer, for - example, so that you aren't relying on a single system for printing. - Because this also works with printer classes, you can setup multiple - servers and printers and never worry about a single point of failure - unless all of the printers and servers go down!

    -

    2 - The CUPS API

    -

    This chapter describes the CUPS Application Programmers Interface - ("API").

    -

    The CUPS API Library

    -

    The CUPS library provides a whole collection of interfaces needed to - support the internal needs of the CUPS software as well as the needs of - applications, filters, printer drivers, and backends.

    -

    Unlike the rest of CUPS, the CUPS API library is provided under the - GNU Library General Public License. This means that you can use the - CUPS API library in both proprietary and open-source programs.

    -

    Programs that use the CUPS API library typically will include the -<cups/cups.h> header file:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -jobid = cupsPrintFile("myprinter", "filename.ps", "title",
      -                      num_options, options);
      -
      -
    -

    Use the -lcups compiler option when linking to the CUPS - API library:

    -
      -
      -cc -o program program.c -lcups ENTER
      -
      -
    -

    Additional options and libraries may be required depending on the - operating system and the location of the CUPS API library.

    -

    Detecting the CUPS API Library in GNU Autoconf

    -

    GNU autoconf is a popular configuration tool used by many programs. - Add the following lines to your configure.in file to check - for the CUPS API library in your configuration script:

    -
      -
      -AC_CHECK_LIB(socket,socket,
      -if test "$uname" != "IRIX"; then
      -	LIBS="-lsocket $LIBS"
      -else
      -	echo "Not using -lsocket since you are running IRIX."
      -fi)
      -AC_CHECK_LIB(nsl,gethostbyaddr,
      -if test "$uname" != "IRIX"; then
      -	LIBS="-lnsl $LIBS"
      -else
      -	echo "Not using -lnsl since you are running IRIX."
      -fi)
      -
      -AC_CHECK_LIB(cups,httpConnect)
      -
      -
    -

    Printing Services

    -

    The CUPS API library provides some basic printing services for - applications that need to print files.

    -

    Include Files

    -

    The include file used by all of these functions is -<cups/cups.h>:

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

    Printing a File

    -

    The CUPS API provides two functions for printing files. The first is -cupsPrintFile which prints a single named file:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -
      -...
      -
      -jobid = cupsPrintFile("name", "filename", "title", 0, NULL);
      -
      -
    -

    The name string is the name of the printer or class to - print to. The filename string is the name of the file to - print. The title string is the name of the print job, e.g. - "Acme Word Document".

    -

    The return value is a unique ID number for the print job or 0 if - there was an error.

    -

    Printing Multiple Files

    -

    The second printing function is cupsPrintFiles:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int        jobid;
      -int        num_files;
      -const char *files[100];
      -...
      -
      -jobid = cupsPrintFiles("name", num_files, files, "title", 0, NULL);
      -
      -
    -

    Instead of passing a filename string as with cupsPrintFile() - you pass a file count (num_files) and filename pointer - array (files) for each file that you want to print.

    -

    As with cupsPrintFile() the return value is a unique ID - for the print job.

    -

    Cancelling Jobs

    -

    The cupsCancelJob() function cancels a queued print job:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -int status;
      -...
      -
      -status = cupsCancelJob("name", jobid);
      -
      -
    -

    The name string specifies the destination and is used to - determine the server to send the request to. The jobid - value is the integer returned from a previous cupsPrintFile() - or cupsPrintFiles() call.

    -

    cupsCancelJob() returns 1 if the job was - successfully cancelled and 0 if there was an error.

    -

    Getting the Available Printers and Classes

    -

    The cupsGetDests() function can be used to get a list of - the available printers, classes, and instances that a user has defined:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int         num_dests;
      -cups_dest_t *dests;
      -
      -...
      -
      -num_dests = cupsGetDests(&dests);
      -
      -
    -

    Each destination is stored in a cups_dest_t structure - which defines the printer or class name, the instance name (if any), if - it is the default destination, and the default options the user has - defined for the destination:

    -
      -
      -typedef struct               /**** Destination ****/
      -{
      -  char          *name,       /* Printer or class name */
      -                *instance;   /* Local instance name or NULL */
      -  int           is_default;  /* Is this printer the default? */
      -  int           num_options; /* Number of options */
      -  cups_option_t *options;    /* Options */
      -} cups_dest_t;
      -
      -
    -

    The destinations are sorted by name and instance for your - convenience. Once you have the list of available destinations, you can - lookup a specific destination using the cupsGetDest() - function:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int         num_dests;
      -cups_dest_t *dests;
      -cups_dest_t *mydest;
      -
      -...
      -
      -mydest = cupsGetDest("name", "instance", num_dests, dests);
      -
      -
    -

    The name string is the printer or class name. You can - pass a value of NULL to get the default destination.

    -

    The instance string is the user-defined instance name. - Pass NULL to select the default instance, e.g. "name" - instead of "name/instance".

    -

    Printing with Options

    -

    All of the previous printing examples have passed 0 and -NULL for the last two arguments to the cupsPrintFile() - and cupsPrintFiles() functions. These last two arguments - are the number of options and a pointer to the option array:

    -
      -
      -int cupsPrintFile(const char *name, const char *filename, const char *title,
      -                  int num_options, cups_option_t *options);
      -int cupsPrintFiles(const char *name, int num_files, const char **files,
      -                   const char *title, int num_options,
      -		   cups_option_t *options);
      -
      -
    -

    The cups_option_t structure holds each option and its - value. These are converted as needed and passed to the CUPS server when - printing a file.

    -

    The simplest way of handling options is to use the num_options - and options members of the cups_dest_t - structure described earlier:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int         jobid;
      -int         num_dests;
      -cups_dest_t *dests;
      -cups_dest_t *mydest;
      -
      -...
      -
      -mydest = cupsGetDest("name", "instance", num_dests, dests);
      -
      -jobid  = cupsPrintFile(mydest->name, "filename", "title",
      -                       mydest->num_options, mydest->options);
      -
      -
    -

    This effectively uses the options a user has previous selected - without a lot of code.

    -

    Setting Printer Options

    -

    Options can also be set by your program using the -cupsAddOption() function:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int           num_options;
      -cups_option_t *options;
      -
      -...
      -
      -num_options = 0;
      -options     = NULL;
      -
      -...
      -
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -
      -
    -

    The name string is the name of the option, and the -value string is the value for that option.

    -

    Each call to cupsAddOption() returns the new number of - options. Since adding two options with the same name overwrites the - first value with the second, do not assume that calling -cupsAddOptions() 20 times will result in 20 options.

    -

    Call cupsFreeOptions once you are done using the - options:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int           num_options;
      -cups_option_t *options;
      -
      -...
      -
      -cupsFreeOptions(num_options, options);
      -
      -
    -

    Getting Errors

    -

    If any of the CUPS API printing functions returns an error, the - reason for that error can be found by calling cupsLastError() - and cupsErrorString(). cupsLastError() - returns the last IPP error code that was encountered. -cupsErrorString() converts the error code to a localized message - string suitable for presentation to the user:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -
      -...
      -
      -if (jobid == 0)
      -  puts(cupsErrorString(cupsLastError()));
      -
      -
    -

    Passwords and Authentication

    -

    CUPS supports authentication of any request, including submission of - print jobs. The default mechanism for getting the username and password - is to use the login user and a password from the console.

    -

    To support other types of applications, in particular Graphical User - Interfaces ("GUIs"), the CUPS API provides functions to set the default - username and to register a callback function that returns a password - string.

    -

    The cupsSetPasswordCB() - function is used to set a password callback in your program. Only one - function can be used at any time.

    -

    The cupsSetUser() function - sets the current username for authentication. This function can be - called by your password callback function to change the current - username as needed.

    -

    The following example shows a simple password callback that gets a - username and password from the user:

    -
      -
      -#include <cups/cups.h>
      -
      -const char *
      -my_password_cb(const char *prompt)
      -{
      -  char	user[65];
      -
      -
      -  puts(prompt);
      -
      - /* Get a username from the user */
      -  printf("Username: ");
      -  if (fgets(user, sizeof(user), stdin) == NULL)
      -    return (NULL);
      -
      - /* Strip the newline from the string and set the user */
      -  user[strlen(user) - 1] = '\0';
      -
      -  cupsSetUser(user);
      -
      - /* Use getpass() to ask for the password... */
      -  return (getpass("Password: "));
      -}
      -
      -...
      -
      -cupsSetPasswordCB(my_password_cb);
      -
      -
    -

    Similarly, a GUI interface could display the prompt string in a - window with input fields for the username and password. The username - should probably default to the value of -cupsUser() to make things easier on the user.

    -

    PPD Services

    -

    CUPS includes functions to access and manipulate PostScript Printer - Description ("PPD") files that are used with the printer drivers in - CUPS.

    -

    Each PPD file enumerates the available features provided by a - printer, including conflict information for specific options (e.g. - can't duplex output on envelopes.)

    -

    Include Files

    -

    Include the <cups/ppd.h> header file to use the PPD - functions:

    -
      -
      -#include <cups/ppd.h>
      -
      -
    -

    This header file is also included by the <cups/cups.h> - header file.

    -

    Getting a PPD File for a Printer

    -

    The cupsGetPPD() function retrieves the PPD file for the - named printer or class:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -const char *filename;
      -
      -filename = cupsGetPPD("name");
      -
      -
    -

    The name string is the name of the printer or class, - including the remote server name as appropriate (e.g. - "printer@server".)

    -

    The return value is a pointer to a filename in static storage; this - value is overwritten with each call to cupsGetPPD(). If - the printer or class does not exist, a NULL pointer will - be returned.

    -

    Loading a PPD File

    -

    The ppdOpenFile() function "opens" a PPD file and loads - it into memory:

    -
      -
      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -ppd = ppdOpenFile("filename");
      -
      -
    -

    The filename string is the name of the file to load, - such as the value returned by the cupsGetPPD() function.

    -

    The return value is a pointer to a structure describing the contents - of the PPD file or NULL if the PPD file could not be read.

    -

    Freeing PPD File Information

    -

    Once you are done using a PPD file, call the ppdClose() - function to free all memory that has been used:

    -
      -
      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -...
      -
      -ppdClose(ppd);
      -
      -
    -

    The PPD File Structure

    -

    Each PPD file contains a number of capability attributes, printer - options, and conflict definitions. The page size options also include - the physical margins for the printer and the minimum and maximum sizes - for the printer. All of this information is stored in the -ppd_file_t structure.

    -

    Capabilities

    -

    Each PPD file contains a number of informational attributes that - describe the capabilities of the printer. These are provided in the -ppd_file_t structure in the following members: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    accurate_screensint1 - = supports accurate screens
    color_deviceint1 = - color device
    colorspaceppd_cs_t -Default colorspace: PPD_CS_CMYK, PPD_CS_CMY, PPD_CS_GRAY, PPD_CS_RGB, - PPD_CS_RGBK, PPD_CS_N
    contone_onlyint1 = - printer is continuous tone only
    num_emulations -
    emulations
    int -
    ppd_emul_t *
    Emulations supported by the printer
    flip_duplexint1 = - need to flip odd pages when duplexing
    num_fonts -
    fonts
    int -
    char **
    The fonts available on the printer.
    jcl_begin -
    jcl_ps -
    jcl_end
    char *Job Control - Language commands for PostScript output
    landscapeint -Landscape orientation, -90 or 90 degrees
    lang_encodingchar * -The character used for the option strings
    lang_versionchar * -The language used for the options strings (English, French, etc.)
    language_levelint -PostScript language level, 1 to 3
    manual_copiesint1 = - Copies are done manually
    model_numberint -Driver-specific model number.
    patcheschar *Patch - commands to send to the printer
    manufacturerchar * -The Manufacturer attribute from the PPD file, if any
    modelnamechar *The - ModelName attribute from the PPD file
    nicknamechar *The - NickName attribute from the PPD file, if any
    productchar *The - Product attribute from the PPD file, if any
    shortnicknamechar * -The ShortNickName attribute from the PPD file, if any
    throughputintNumber - of pages per minute
    ttrasterizerchar * -The TruType font rasterizer (Type42)
    variable_sizesint1 = - supports variable sizes
    -
    -

    -

    Options and Groups

    -

    PPD files support multiple options, which are stored in -ppd_option_t and ppd_choice_t structures by the PPD - functions.

    -

    Each option in turn is associated with a group stored in the -ppd_group_t structure. Groups can be specified in the PPD file; - if an option is not associated with a group then it is put in a - "General" or "Extra" group depending on the option.

    -

    Groups can also have sub-groups; CUPS currently limits the depth of - sub-groups to 1 level to reduce programming complexity.

    -

    Conflicts

    -

    PPD files support specification of conflict conditions between - different options. Conflicts are stored in ppd_conflict_t - structures which specify the options that conflict with each other.

    -

    Page Sizes

    -

    PPD files specify all of the available pages sizes and the physical - margins associated with them. These sizes are stored in -ppd_size_t structures and are available in the num_sizes - and sizes members of the ppd_file_t - structure. You can lookup a particular page size with the -ppdPageWidth(), ppdPageLength(), and -ppdPageSize() functions:

    -
      -
      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -ppd_size_t *size;
      -float      width;
      -float      length;
      -
      -...
      -
      -size   = ppdPageSize(ppd, "size");
      -width  = ppdPageWidth(ppd, "size");
      -length = ppdPageLength(ppd, "size");
      -
      -
    -

    The size string is the named page size option. The width - and length are in points; there are 72 points per inch. The -ppd_size_t structure contains the width, length, and margin - information:

    -
      -
      -typedef struct    /**** Page Sizes ****/
      -{
      -  int   marked;   /* Page size selected? */
      -  char  name[41]; /* Media size option */
      -  float width,    /* Width of media in points */
      -        length,   /* Length of media in points */
      -        left,     /* Left printable margin in points */
      -        bottom,   /* Bottom printable margin in points */
      -        right,    /* Right printable margin in points */
      -        top;      /* Top printable margin in points */
      -} ppd_size_t;
      -
      -
    -

    Custom Page Sizes

    -

    Besides the standard page sizes listed in a PPD file, some printers - support variable or custom page sizes. If variables_sizes - is non-zero, the custom_min, custom_max, and -custom_margins members of the ppd_file_t structure - define the limits of the variable sizes.

    -

    To get the resulting media size, use a page size string of -Custom.widthxlength, where width and -length are integer values in points:

    -
      -
      -Custom.612x792   [8.5 inches wide, 11 inches long]
      -Custom.1224x792  [17 inches wide, 11 inches long]
      -
      -
    -

    Marking Options

    -

    Before marking any user-defined options, call the -ppdMarkDefaults() function to mark the default options from the - PPD file:

    -
      -
      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -...
      -
      -ppdMarkDefaults(ppd);
      -
      -
    -

    Then call the ppdMarkOption() function to mark - individual options:

    -
      -
      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -int        conflicts;
      -
      -...
      -
      -conflicts = ppdMarkOption(ppd, "name", "value");
      -
      -
    -

    The name and value strings choose a - particular option and choice, respectively. The return value is 0 if - there are not conflicts created by the selection.

    -

    CUPS also provides a convenience function for marking all options in - the cups_option_t structure:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -ppd_file_t    *ppd;
      -int           num_options;
      -cups_option_t *options;
      -int           conflicts;
      -
      -...
      -
      -conflicts = cupsMarkOptions(ppd, num_options, options);
      -
      -
    -

    The cupsMarkOptions() function also handles mapping the - IPP job template attributes to PPD options. The return value is the - number of conflicts present.

    -

    Checking for Conflicts

    -

    The ppdMarkOption() and cupsMarkOptions() - functions return the number of conflicts with the currently marked - options.

    -

    Call the ppdConflicts() function to get the number of - conflicts after you have marked all of the options:

    -
      -
      -#include <cups/cups.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -int        conflicts;
      -
      -...
      -
      -conflicts = ppdConflicts(ppd);
      -
      -
    -

    The return value is the number of conflicting options, or 0 if there - are no conflicts.

    -

    3 - Writing Filters

    -

    This chapter describes how to write a file filter for CUPS.

    -

    Overview

    -

    File filters are programs that convert from one or more MIME types to - another type. Filters use a common command-line and environment - interface that allows them to be joined as needed to print files to any - type of printer.

    -

    Security Considerations

    -

    Filters are normally run as a non-priviledged user, so the major - security consideration is resource utilization - filters should not - depend on unlimited amounts of memory and disk space.

    -

    Users and Groups

    -

    The default CUPS configuration runs filters as user "lp" and group - "other".

    -

    Temporary Files

    -

    Temporary files should be created in the directory specified by the - "TMPDIR" environment variable. The -cupsTempFile() function can be used to safely choose - temporary files in this directory.

    -

    Sending Messages to the User

    -

    The CUPS scheduler collects messages sent to the standard error file - by the filter. These messages are relayed to the user based upon the - scheduler LogLevel directive.

    -

    The type of message is determined by an initial prefix sent on each - line:

    -
      -
    • DEBUG: - a debug message
    • -
    • INFO: - an informational message
    • -
    • WARNING: - a warning message
    • -
    • ERROR: - an error message
    • -
    • PAGE: - a page accounting message
    • -
    -

    If the line of text does not begin with any of the above prefixes, it - is treated as a debug message. Text following the prefix is copied to - the printer-state-message attribute for the printer, and - also added to the error_log unless it is an informational or - page accounting message.

    -

    Page Accounting

    -

    Page accounting messages are used to inform the server when one or - more pages are printed. Each line has the form:

    -
      -
      -PAGE: page-number copy-count
      -
      -
    -

    The page-number field is the current page number, starting at - 1. The copy-count field specifies the number of copies of that - page that was produced.

    -

    Page account messages are added to the page_log file and - cause the job-sheets-completed attribute to be updated for - the job.

    -

    Command-Line Arguments

    -

    Every filter accepts exactly 6 or 7 command-line arguments:

    -
      -
      -printer job user title copies options [filename]
      -
      -
    • printer - The name of the printer queue (normally this - is the name of the program being run)
    • -
    • job - The numeric job ID for the job being printed
    • -
    • user - The string from the originating-user-name - attribute
    • -
    • title - The string from the job-name - attribute
    • -
    • copies - The numeric value from the number-copies - attribute
    • -
    • options - String representations of the job template - attributes, separated by spaces. Boolean attributes are provided as - "name" for true values and "noname" for false values. All other - attributes are provided as "name=value" for single-valued attributes - and "name=value1,value2,...,valueN" for set attributes
    • -
    • filename - The request file
    • -
    -

    The filename argument is only provided to the first filter in - the chain; all filters must be prepared to read the print file - from the standard input if the filename argument is omitted.

    -

    Copy Generation

    -

    The copies argument specifies the number of copies to produce - of the input file. In general, you should only generate copies if the - filename argument is supplied. The only exception to this are - filters that produce device-independent PostScript output (without any - printer commands from the printer's PPD file), since the PostScript - filter pstops is responsible for copy generation.

    -

    Environment Variables

    -

    Every filter receives a fixed set of environment variables that can - be used by the filter:

    -
      -
    • CHARSET - The character set used by the client for this - print file
    • -
    • CONTENT_TYPE - The original document type, such as - "application/postscript"
    • -
    • CUPS_DATADIR - The location of CUPS data files
    • -
    • CUPS_SERVERROOT - The location of CUPS configuration - files
    • -
    • DEVICE_URI - The output device URI
    • -
    • LANG - The language used by the client for this print - file
    • -
    • PATH - The execution path exported to the filter
    • -
    • PPD - The full filename of the printer's PPD file
    • -
    • PRINTER - The name of the printer queue
    • -
    • RIP_CACHE - The maximum amount of memory each filter - should use
    • -
    • SOFTWARE - The name of the CUPS software, typically - "CUPS/1.1"
    • -
    • TZ - The local timezone
    • -
    • USER - The name of the current user
    • -
    -

    Dissecting the HP-GL/2 Filter

    -

    The HP-GL/2 filter (hpgltops) provided with CUPS is a - complex program that converts HP-GL/2 files into device-independent - PostScript output. Since it produces device-independent PostScript - output, it does not need to handle copy generation or writing printer - options from the printer's PPD file.

    -

    Initializing the Filter

    -

    The first task of any filter is to ensure that the correct number of - command-line arguments are present:

    -
      -
      -if (argc < 6 || argc > 7)
      -{
      -  fputs("ERROR: hpgltops job-id user title copies options [file]\n", stderr);
      -  return (1);
      -}
      -
      -
    -

    After this you open the print file or read from the standard input as - needed:

    -
      -
      -FILE *fp;
      -
      -/*
      - * If we have 7 arguments, print the file named on the command-line.
      - * Otherwise, send stdin instead...
      - */
      -
      -if (argc == 6)
      -  fp = stdin;
      -else
      -{
      - /*
      -  * Try to open the print file...
      -  */
      -
      -  if ((fp = fopen(argv[6], "rb")) == NULL)
      -  {
      -    perror("ERROR: unable to open print file - ");
      -    return (1);
      -  }
      -}
      -
      -
    -

    Once the print file has been opened, options can be processed using - the cupsParseOptions() and cupsGetOption() functions:

    -
      -
      -int           num_options;
      -cups_option_t *options;
      -const char    *val;
      -
      -/*
      - * Process command-line options and write the prolog...
      - */
      -
      -options     = NULL;
      -num_options = cupsParseOptions(argv[5], 0, 
      -
      -if ((val = cupsGetOption("blackplot", num_options, options)) != NULL)
      -  shading = 0;
      -
      -if ((val = cupsGetOption("fitplot", num_options, options)) != NULL)
      -  FitPlot = 1;
      -
      -if ((val = cupsGetOption("penwidth", num_options, options)) != NULL)
      -  PenWidth = (float)atoi(val) * 0.001f;
      -
      -
    -

    After the options have been processed, the filter writes PostScript - code to the standard output based on the print file, closes the print - file (as needed), and returns 0 to the scheduler.

    -

    PostScript Output

    -

    Filters that produce PostScript output must generate output - conforming to the Adobe Document Structuring Conventions, 3.0. In - general this means the beginning of each file must begin with:

    -
      -
      -%!PS-Adobe-3.0
      -%%BoundingBox: left bottom right top
      -%%Pages: (atend)
      -%%EndComments
      -
      -
    -

    The left, bottom, right, and top values - are integers in points from the lower-lefthand corner of the page.

    -

    Pages must be surrounded by:

    -
      -
      -%%Page: number number
      -gsave
      -...
      -grestore
      -showpage
      -
      -
    -

    And the end of each file must contain:

    -
      -
      -%%Trailer
      -%%Pages: number-pages
      -%%EOF
      -
      -
    -

    These comments allow the PostScript filter to correctly perform page - accounting, copy generation, N-up printing, and so forth.

    -

    4 - Writing Printer Drivers -

    -

    This chapter discusses how to write a printer driver, which is a - special filter program that converts CUPS raster data into the - appropriate commands and data required for a printer.

    -

    Overview

    -

    Raster printers utilitize PPD files that specify one or more - device-specific filters that handle converting print files for the - printer. The simplest raster printer drivers provide a single filter - that converts CUPS raster data to the printer's native format.

    -

    CUPS Raster Data

    -

    CUPS raster data (application/vnd.cups-raster) consists - of a stream of raster page descriptions produced by one of the RIP - filters, such as pstoraster or imagetoraster.

    -

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

    -

    After the page dictionary comes the page data which is a - full-resolution, uncompressed bitmap representing the page in the - printer's output colorspace.

    -

    Page Accounting

    -

    Printer drivers must handle all page accounting. This means they must - send "PAGE:" messages to the standard error file for each page (and in - many cases, copy) sent to the printer.

    -

    Color Management

    -

    Printer drivers can implement their color management via the -cupsColorProfile attributes in the PPD file or internally in the - driver from a device-independent colorspace. In general, color - management performed by the RIP filters is more efficient than that - performed inside printer drivers.

    -

    For example, the pstoraster filter often only has to - perform a color conversion once each time the color is used for - multiple output pixels, while the raster filter must convert every - pixel on the page.

    -

    Device and Bitmap Variables

    -

    Besides the standard PostScript page device dictionary variables - defined in the Adobe PostScript Level 3 reference manual, the CUPS - filters support additional variables that are passed in the page device - dictionary header for the page and in some cases control the type of - raster data that is generated: -

    - - - - - - - - - - - - - - -
    VariableTypeDescription
    cupsWidthread-only integerWidth of bitmap in - pixels
    cupsHeightread-only integerHeight of bitmap in - pixels
    cupsMediaTyperead-write integerDevice-specific - media type code
    cupsBitsPerColorread-write integerNumber of - bits per color; 1, 2, 4, and 8 are currently supported
    cupsBitsPerPixelread-only integerNumber of - bits per pixel; 1 to 32
    cupsBytesPerLineread-only integerNumber of - bytes per line of raster graphics
    cupsColorOrderread-write enumThe order of - color values in the bitmap: -
      -
    • CUPS_ORDER_CHUNKED - CMYK CMYK CMYK
    • -
    • CUPS_ORDER_BANDED - CCC MMM YYY KKK
    • -
    • CUPS_ORDER_PLANAR - CCC ... MMM ... YYY ... KKK ...
    • -
    -
    cupsColorSpaceread-write enumThe colorspace of - the bitmap: -
      -
    • CUPS_CSPACE_W - White (luminance)
    • -
    • CUPS_CSPACE_RGB - Red, green, blue
    • -
    • CUPS_CSPACE_RGBA - Red, green, blue, alpha
    • -
    • CUPS_CSPACE_K - Black
    • -
    • CUPS_CSPACE_CMY - Cyan, magenta, yellow
    • -
    • CUPS_CSPACE_YMC - Yellow, magenta, cyan
    • -
    • CUPS_CSPACE_CMYK - Cyan, magenta, yellow, black
    • -
    • CUPS_CSPACE_YMCK - Yellow, magenta, cyan, black
    • -
    • CUPS_CSPACE_KCMY - Black, cyan, magenta, yellow
    • -
    • CUPS_CSPACE_KCMYcm - Black, cyan, magenta, yellow, - light cyan, light magenta
    • -
    • CUPS_CSPACE_GMCK - Metallic yellow (gold), metallic - magenta, metallic cyan, black
    • -
    • CUPS_CSPACE_GMCS - Metallic yellow (gold), metallic - magenta, metallic cyan, metallic grey (silver)
    • -
    • CUPS_CSPACE_WHITE - White pigment (black as white - pigment)
    • -
    • CUPS_CSPACE_GOLD - Gold foil (black as gold foil)
    • -
    • CUPS_CSPACE_SILVER - Silver foil (black as silver foil)
    • -
    -
    cupsCompressionread-write integer -Device-specific compression type code
    cupsRowCountread-write integerDevice-specific - row count value
    cupsRowFeedread-write integerDevice-specific - row feed value
    cupsRowStepread-write integerDevice-specific - row step value
    -
    -

    -

    Bitmaps with a colorspace of CUPS_CSPACE_KCMYcm and more than 1 bit - per color are transmitted to the raster driver in KCMY colorspace; the - driver is responsible for producing the correct separation of normal - and light cyan and magenta inks.

    -

    Dissecting the HP-PCL Driver

    -

    The HP-PCL driver provided with CUPS (rastertohp) - converts bitmap data from the raster filters into HP-PCL commands for - most PCL-compatible printers. The actual format of the raster data is - controlled by the PPD file being used - deskjet.ppd or - laserjet.ppd.

    -

    PPD Files

    -

    PPD files play an important part of all raster printer drivers. - Options defined in the PPD file contain PostScript commands that - control the raster data that is sent to the printer driver.

    -

    A typical CUPS printer driver will include ColorModel, -InputSlot, PageSize, PageRegion, and -Resolution options. Each option is shown using the standard PPD - format:

    -
      -
      -*OpenUI *PageSize/Media Size: PickOne
      -*OrderDependency: 10 AnySetup *PageSize
      -*DefaultPageSize: Letter
      -*PageSize Letter/US Letter: "<<
      -/PageSize [612 792]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*PageSize Legal/US Legal: "<<
      -/PageSize [612 1008]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*PageSize A4/A4: "<<
      -/PageSize [595 842]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*CloseUI: *PageSize
      -
      -
    -

    The OpenUI keyword specifies the new option. The first - name is the option with an asterisk (*) in front of it. The first name - is usually followed by a slash (/) and a human-readable version of the - option name.

    -

    Every option must have a default value, specified using the -DefaultOption keyword.

    -

    Each option begins with the option name followed by the computer and - human-readable values. The PostScript commands follow these inside - double quotes. PostScript commands can be provided on a single line:

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

    or broken down on separate lines using the End keyword - to terminate them:

    -
      -
      -*PageSize A4/A4: "<<
      -/PageSize [595 842]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -
      -
    -

    The choice of the two formats is usually esthetic. However, each line - in a PPD file must not exceed 255 characters, so if your PostScript - commands are long you may need to break them up on separate lines.

    -

    Reading Raster Data

    -

    As with any filter, your printer driver should handle raster data - from a filename specified on the command-line or from the standard - input. The cupsRasterOpen() - function opens a raster stream for printing:

    -
      -
      -int           fd;   /* File descriptor */
      -cups_raster_t *ras; /* Raster stream for printing */
      -
      -
      -/*
      - * Check for valid arguments...
      - */
      -
      -if (argc < 6 || argc > 7)
      -{
      - /*
      -  * We don't have the correct number of arguments; write an error message
      -  * and return.
      -  */
      -
      -  fputs("ERROR: rastertopcl job-id user title copies options [file]\n", stderr);
      -  return (1);
      -}
      -
      -/*
      - * Open the page stream...
      - */
      -
      -if (argc == 7)
      -{
      -  if ((fd = open(argv[6], O_RDONLY)) == -1)
      -  {
      -    perror("ERROR: Unable to open raster file - ");
      -    sleep(1);
      -    return (1);
      -  }
      -}
      -else
      -  fd = 0;
      -
      -ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
      -
      -
    -

    Once you have opened the raster stream you just need to read each - page and print it:

    -
      -
      -cups_raster_header_t header;
      -int                  y;
      -unsigned char        data[8192];
      -
      -while (cupsRasterReadHeader(ras, &header))
      -{
      -  ... initialize the printer ...
      -  for (y = header.cupsHeight; y > 0; y ++)
      -  {
      -    cupsRasterReadPixels(ras, data, header.cupsBytesPerLine);
      -    ... send raster line to printer ...
      -  }
      -}
      -
      -
    -

    After you have processed all pages, close the raster stream and - return:

    -
      -
      -cupsRasterClose(ras);
      -
      -return (0);
      -
      -
    -

    5 - Writing Backends

    -

    This chapter describes how to write a backend for CUPS. Backends - communicate directly with printers and allow printer drivers and - filters to send data using any type of connection transparently.

    -

    Overview

    -

    Backends are special filters that communicate with printers directly. - They are treated slightly differently than filters, however, and have - some unique requirements.

    -

    Security Considerations

    -

    Backends are run as the root user, so special care must be taken to - avoid potential security violations. In particular, remember that a - backend will be able to manipulate disk files, devices, and other - resources that potentially could damage a system or printer.

    -

    Command-Line Arguments

    -

    Besides the standard filter arguments, backends are also run with no - arguments to get a list of available devices. This discovery process is - described later in this chapter.

    -

    Copy Generation

    -

    Like filters, backends should send multiple copies of the print file - only if a filename is supplied on the command-line. Otherwise the - backend should assume that the upstream filter has already added the - necessary commands or data to produce the multiple copies.

    -

    Page Accounting

    -

    Backend filters generally do not do page accounting, however they - should at a minimum produce a single page message for each copy that is - produced when a filename is present on the command-line. This is - because the user selected "raw" printing and no other accounting - information is possible.

    -

    Exclusive Access

    -

    Backends that talk to local character or block devices should open - the device file in exclusive mode (O_EXCL) to cooperate - with other printers defined for the same device.

    -

    Retries

    -

    All backends must retry connections to the device. This - includes backends that talk to local character or block devices, as the - user may define more than one printer queue pointing at the same - physical device.

    -

    To prevent excess CPU utilitization, the backend should go to sleep - for an amount of time between retries; the CUPS-supplied backends retry - once every 30 seconds.

    -

    Dissecting the Serial Port Backend

    -

    The serial port backend provides support for serial printers. Since - it does everything a good backend needs to do, it provides an excellent - example of what to do.

    -

    Supporting Device Discovery

    -

    As previously noted, backends are special filter programs that talk - to printer devices. Another task a backend must perform is to list the - available devices it supports. The backend lists the available devices - when no additioanl arguments are supplied on the command-line (i.e. - just the command name...)

    -

    The serial backend lists devices by looking at serial port files in - the /dev directory, by consulting a hardware inventory - (IRIX), and in some cases by trying to open the ports to see if they - actually exist.

    -

    Once it finds a serial port it writes a single line for each port to - the standard error file. Each line looks like this:

    -
      -
      -serial serial:/dev/ttyS0?baud=115200 "Unknown" "Serial Port 1"
      -
      -
    -

    The first word "serial" is the device class; this identifies - the class of device which can be used to categorize it in user - interfaces. CUPS currently recognizes the following classes:

    -
      -
    • "file" - a disk file.
    • -
    • "direct" - a parallel or fixed-rate serial data port, currently used - for Centronics, IEEE-1284, and USB printer ports.
    • -
    • "serial" - a variable-rate serial port.
    • -
    • "network" - a network connection, typically via AppSocket, HTTP, - IPP, LPD, or SMB/CIFS protocols.
    • -
    -

    After the device class is the device URI, in this case - "serial:/dev/ttyS0?baud=115200". This is the URI that should be used by - the user to select this port. For serial ports, the "baud=115200" - specifies the maximum baud rate supported by the port - the actual - value will vary based on the speed the user selects for the printer.

    -

    The last two strings are the model and description for the port. The - "Unknown" string means that the printer model is unknown - some devices - are able to provide a make and model such as "HP DeskJet" that allows - users and software to choose an appropriate printer driver more easily. - Both the model and description must be enclosed inside double quotes.

    -

    Opening the Serial Port

    -

    As noted previously, all backends should open device files in - exclusive mode, and retry as needed until the port is available. The - serial port does this using a do-while loop:

    -
      -
      -do
      -{
      -  if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL)) == -1)
      -  {
      -    if (errno == EBUSY)
      -    {
      -      fputs("INFO: Serial port busy; will retry in 30 seconds...\n", stderr);
      -      sleep(30);
      -    }
      -    else
      -    {
      -      perror("ERROR: Unable to open serial port device file");
      -      return (1);
      -    }
      -  }
      -}
      -while (fd < 0);
      -
      -
    -

    If the port is busy or in use by another process, the backend will go - to sleep for 30 seconds and try again. If another error is detected a - message is sent to the user and the backend aborts the print job until - the problem can be corrected.

    -

    Writing Data to the Port

    -

    Network and character devices pose an interesting problem when - writing data to the port - they may not be able to write all of the - bytes in your buffer before returning. To work around this problem you - must loop until all bytes have been written:

    -
      -
      -while (nbytes > 0)
      -{
      -  if ((wbytes = write(fd, bufptr, nbytes)) < 0)
      -    if (errno == ENOTTY)
      -      wbytes = write(fd, bufptr, nbytes);
      -
      -  if (wbytes < 0)
      -  {
      -    perror("ERROR: Unable to send print file to printer");
      -    break;
      -  }
      -
      -  nbytes -= wbytes;
      -  bufptr += wbytes;
      -}
      -
      -
    -

    The check for the ENOTTY error is needed on some - platforms to clear an error from a previous ioctl() call.

    -

    Finishing Up

    -

    Once you have sent the print file, return 0 if the file printed - successfully or 1 if it did not. This will allow the scheduler to stop - the print job if there is a device error, preserving the print job for - later printing once the problem has been corrected.

    -

    A - Software License Agreement

    -

    Common UNIX Printing System License - Agreement

    -

    Copyright 1997-2003 by Easy Software Products -
    44141 AIRPORT VIEW DR STE 204 -
    HOLLYWOOD, MARYLAND 20636-3111 USA -
    -
    Voice: +1.301.373.9600 -
    Email: cups-info@cups.org -
    WWW: http://www.cups.org

    -

    Introduction

    -

    The Common UNIX Printing SystemTM, ("CUPSTM"), - 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.

    -

    The GNU LGPL applies to the CUPS API library, located in the "cups" - subdirectory of the CUPS source distribution and in the "cups" include - directory and library files in the binary distributions. The GNU GPL - applies to the remainder of the CUPS distribution, including the - "pdftops" filter which is based upon Xpdf and the CUPS imaging library.

    -

    For those not familiar with the GNU GPL, the license basically allows - you to:

    -
      -
    • Use the CUPS software at no charge.
    • -
    • Distribute verbatim copies of the software in source or binary form.
    • -
    • Sell verbatim copies of the software for a media fee, or sell - support for the software.
    • -
    • Distribute or sell printer drivers and filters that use CUPS so long - as source code is made available under the GPL.
    • -
    -

    What this license does not allow you to do is make changes or - add features to CUPS and then sell a binary distribution without source - code. You must provide source for any new drivers, changes, or - additions to the software, and all code must be provided under the GPL - or LGPL as appropriate. The only exceptions to this are the portions of - the CUPS software covered by the Apple operating system license - exceptions outlined later in this license agreement.

    -

    The GNU LGPL relaxes the "link-to" restriction, allowing you to - develop applications that use the CUPS API library under other licenses - and/or conditions as appropriate for your application.

    -

    License Exceptions

    -

    In addition, as the copyright holder of CUPS, Easy Software Products - grants the following special exceptions:

    -
      -
    1. Apple Operating System Development License Exception; -
        -
      1. Software that is developed by any person or entity for an Apple - Operating System ("Apple OS-Developed Software"), including but not - limited to Apple and third party printer drivers, filters, and backends - for an Apple Operating System, that is linked to the CUPS imaging - library or based on any sample filters or backends provided with CUPS - shall not be considered to be a derivative work or collective work - based on the CUPS program and is exempt from the mandatory source code - release clauses of the GNU GPL. You may therefore distribute linked - combinations of the CUPS imaging library with Apple OS-Developed - Software without releasing the source code of the Apple OS-Developed - Software. You may also use sample filters and backends provided with - CUPS to develop Apple OS-Developed Software without releasing the - source code of the Apple OS-Developed Software.
      2. -
      3. An Apple Operating System means any operating system software - developed and/or marketed by Apple Computer, Inc., including but not - limited to all existing releases and versions of Apple's Darwin, Mac OS - X, and Mac OS X Server products and all follow-on releases and future - versions thereof.
      4. -
      5. This exception is only available for Apple OS-Developed Software and - does not apply to software that is distributed for use on other - operating systems.
      6. -
      7. All CUPS software that falls under this license exception have the - following text at the top of each source file:
        This file is - subject to the Apple OS-Developed Software exception.
      8. -
      -
    2. -
    3. OpenSSL Toolkit License Exception; -
        -
      1. Easy Software Products explicitly allows the compilation and - distribution of the CUPS software with the OpenSSL Toolkit.
      2. -
      -
    4. -
    -

    No developer is required to provide these exceptions in a derived - work.

    -

    Trademarks

    -

    Easy Software Products has trademarked the Common UNIX Printing - System, CUPS, and CUPS logo. These names and logos may be used freely - in any direct port or binary distribution of CUPS. Please contract Easy - Software Products for written permission to use them in derivative - products. Our intention is to protect the value of these trademarks and - ensure that any derivative product meets the same high-quality - standards as the original.

    -

    Binary Distribution Rights

    -

    Easy Software Products also sells rights to the CUPS source code - under a binary distribution license for vendors that are unable to - release source code for their drivers, additions, and modifications to - CUPS under the GNU GPL and LGPL. For information please contact us at - the address shown above.

    -

    The Common UNIX Printing System provides a "pdftops" filter that is - based on the Xpdf software. For binary distribution licensing of this - software, please contact:

    Derek B. Noonburg -
    Email: derekn@foolabs.com -
    WWW: - http://www.foolabs.com/xpdf/

    -

    Support

    -

    Easy Software Products sells software support for CUPS as well as a - commercial printing product based on CUPS called ESP Print Pro. You can - find out more at our web site:

    - - - -

    GNU GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright 1989, 1991 Free Software Foundation, Inc.
    -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    -Everyone is permitted to copy and distribute verbatim
    -copies of this license document, but changing it is not allowed.
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public License is - intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users. This - General Public License applies to most of the Free Software - Foundation's software and to any other program whose authors commit to - using it. (Some other Free Software Foundation software is covered by - the GNU Library General Public License instead.) You can apply it to - your programs, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the software, or if you modify it.

    -

    For example, if you distribute copies of such a program, whether - gratis or for a fee, you must give the recipients all the rights that - you have. You must make sure that they, too, receive or can get the - source code. And you must show them these terms so they know their - rights.

    -

    We protect your rights with two steps: (1) copyright the software, - and (2) offer you this license which gives you legal permission to - copy, distribute and/or modify the software.

    -

    Also, for each author's protection and ours, we want to make certain - that everyone understands that there is no warranty for this free - software. If the software is modified by someone else and passed on, we - want its recipients to know that what they have is not the original, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that redistributors of a free - program will individually obtain patent licenses, in effect making the - program proprietary. To prevent this, we have made it clear that any - patent must be licensed for everyone's free use or not licensed at all.

    -

    The precise terms and conditions for copying, distribution and - modification follow.

    -

    GNU GENERAL PUBLIC LICENSE -
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -
      -
    1. This License applies to any program or other work which contains a - notice placed by the copyright holder saying it may be distributed - under the terms of this General Public License. The "Program", below, - refers to any such program or work, and a "work based on the Program" - means either the Program or any derivative work under copyright law: - that is to say, a work containing the Program or a portion of it, - either verbatim or with modifications and/or translated into another - language. (Hereinafter, translation is included without limitation in - the term "modification".) Each licensee is addressed as "you". -

      Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - the Program is not restricted, and the output from the Program is - covered only if its contents constitute a work based on the Program - (independent of having been made by running the Program). Whether that - is true depends on what the Program does.

      -
    2. You may copy and distribute verbatim copies of the Program's source - code as you receive it, in any medium, provided that you conspicuously - and appropriately publish on each copy an appropriate copyright notice - and disclaimer of warranty; keep intact all the notices that refer to - this License and to the absence of any warranty; and give any other - recipients of the Program a copy of this License along with the - Program. -

      You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

      -
    3. You may modify your copy or copies of the Program or any portion of - it, thus forming a work based on the Program, and copy and distribute - such modifications or work under the terms of Section 1 above, provided - that you also meet all of these conditions: -
        -
      1. You must cause the modified files to carry prominent notices stating - that you changed the files and the date of any change.
      2. -
      3. You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any part - thereof, to be licensed as a whole at no charge to all third parties - under the terms of this License.
      4. -
      5. if the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the most ordinary way, to print or display an announcement including - an appropriate copyright notice and a notice that there is no warranty - (or else, saying that you provide a warranty) and that users may - redistribute the program under these conditions, and telling the user - how to view a copy of this License. (Exception: if the Program itself - is interactive but does not normally print such an announcement, your - work based on the Program is not required to print an announcement.)
      6. -
      -

      These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Program, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Program, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

      -

      Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Program.

      -

      In addition, mere aggregation of another work not based on the - Program with the Program (or with a work based on the Program) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

      -
    4. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the terms of - Sections 1 and 2 above provided that you also do one of the following: -
        -
      1. Accompany it with the complete corresponding machine-readable source - code, which must be distributed under the terms of Sections 1 and 2 - above on a medium customarily used for software interchange; or,
      2. -
      3. Accompany it with a written offer, valid for at least three years, - to give any third party, for a charge no more than your cost of - physically performing source distribution, a complete machine-readable - copy of the corresponding source code, to be distributed under the - terms of Sections 1 and 2 above on a medium customarily used for - software interchange; or,
      4. -
      5. Accompany it with the information you received as to the offer to - distribute corresponding source code. (This alternative is allowed only - for noncommercial distribution and only if you received the program in - object code or executable form with such an offer, in accord with - Subsection b above.)
      6. -
      -

      The source code for a work means the preferred form of the work for - making modifications to it. For an executable work, complete source - code means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to control - compilation and installation of the executable. However, as a special - exception, the source code distributed need not include anything that - is normally distributed (in either source or binary form) with the - major components (compiler, kernel, and so on) of the operating system - on which the executable runs, unless that component itself accompanies - the executable.

      -

      If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent access - to copy the source code from the same place counts as distribution of - the source code, even though third parties are not compelled to copy - the source along with the object code.

      -
    5. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt otherwise - to copy, modify, sublicense or distribute the Program is void, and will - automatically terminate your rights under this License. However, - parties who have received copies, or rights, from you under this - License will not have their licenses terminated so long as such parties - remain in full compliance.
    6. -
    7. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify or - distribute the Program or its derivative works. These actions are - prohibited by law if you do not accept this License. Therefore, by - modifying or distributing the Program (or any work based on the - Program), you indicate your acceptance of this License to do so, and - all its terms and conditions for copying, distributing or modifying the - Program or works based on it.
    8. -
    9. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program subject to - these terms and conditions. You may not impose any further restrictions - on the recipients' exercise of the rights granted herein. You are not - responsible for enforcing compliance by third parties to this License.
    10. -
    11. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent issues), - conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot - distribute so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you - may not distribute the Program at all. For example, if a patent license - would not permit royalty-free redistribution of the Program by all - those who receive copies directly or indirectly through you, then the - only way you could satisfy both it and this License would be to refrain - entirely from distribution of the Program. -

      If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply and the section as a whole is intended to apply in other - circumstances.

      -

      It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system, which is - implemented by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

      -

      This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

      -
    12. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted interfaces, the - original copyright holder who places the Program under this License may - add an explicit geographical distribution limitation excluding those - countries, so that distribution is permitted only in or among countries - not thus excluded. In such case, this License incorporates the - limitation as if written in the body of this License.
    13. -
    14. The Free Software Foundation may publish revised and/or new versions - of the General Public License from time to time. Such new versions will - be similar in spirit to the present version, but may differ in detail - to address new problems or concerns. -

      Each version is given a distinguishing version number. If the Program - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Program does not specify a version - number of this License, you may choose any version ever published by - the Free Software Foundation.

      -
    15. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to the - author to ask for permission. For software which is copyrighted by the - Free Software Foundation, write to the Free Software Foundation; we - sometimes make exceptions for this. Our decision will be guided by the - two goals of preserving the free status of all derivatives of our free - software and of promoting the sharing and reuse of software generally.
    16. - - - - - - -
    -

    NO WARRANTY

    -
      -
    1. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY - FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN - OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES - PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE - ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH - YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL - NECESSARY SERVICING, REPAIR OR CORRECTION.
    2. -
    3. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY - AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU - FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR - CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.
    4. -
    -

    END OF TERMS AND CONDITIONS

    - - -

    GNU LIBRARY GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright (C) 1991 Free Software Foundation, Inc.
    -59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
    -Everyone is permitted to copy and distribute verbatim copies
    -of this license document, but changing it is not allowed.
    -
    -[This is the first released version of the library GPL.  It is
    - numbered 2 because it goes with version 2 of the ordinary GPL.]
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public Licenses - are intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users.

    -

    This license, the Library General Public License, applies to some - specially designated Free Software Foundation software, and to any - other libraries whose authors decide to use it. You can use it for your - libraries, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the library, or if you modify it.

    -

    For example, if you distribute copies of the library, whether gratis - or for a fee, you must give the recipients all the rights that we gave - you. You must make sure that they, too, receive or can get the source - code. If you link a program with the library, you must provide complete - object files to the recipients so that they can relink them with the - library, after making changes to the library and recompiling it. And - you must show them these terms so they know their rights.

    -

    Our method of protecting your rights has two steps: (1) copyright the - library, and (2) offer you this license which gives you legal - permission to copy, distribute and/or modify the library.

    -

    Also, for each distributor's protection, we want to make certain that - everyone understands that there is no warranty for this free library. - If the library is modified by someone else and passed on, we want its - recipients to know that what they have is not the original version, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that companies distributing free - software will individually obtain patent licenses, thus in effect - transforming the program into proprietary software. To prevent this, we - have made it clear that any patent must be licensed for everyone's free - use or not licensed at all.

    -

    Most GNU software, including some libraries, is covered by the - ordinary GNU General Public License, which was designed for utility - programs. This license, the GNU Library General Public License, applies - to certain designated libraries. This license is quite different from - the ordinary one; be sure to read it in full, and don't assume that - anything in it is the same as in the ordinary license.

    -

    The reason we have a separate public license for some libraries is - that they blur the distinction we usually make between modifying or - adding to a program and simply using it. Linking a program with a - library, without changing the library, is in some sense simply using - the library, and is analogous to running a utility program or - application program. However, in a textual and legal sense, the linked - executable is a combined work, a derivative of the original library, - and the ordinary General Public License treats it as such.

    -

    Because of this blurred distinction, using the ordinary General - Public License for libraries did not effectively promote software - sharing, because most developers did not use the libraries. We - concluded that weaker conditions might promote sharing better.

    -

    However, unrestricted linking of non-free programs would deprive the - users of those programs of all benefit from the free status of the - libraries themselves. This Library General Public License is intended - to permit developers of non-free programs to use free libraries, while - preserving your freedom as a user of such programs to change the free - libraries that are incorporated in them. (We have not seen how to - achieve this as regards changes in header files, but we have achieved - it as regards changes in the actual functions of the Library.) The hope - is that this will lead to faster development of free libraries.

    -

    The precise terms and conditions for copying, distribution and - modification follow. Pay close attention to the difference between a - "work based on the library" and a "work that uses the library". The - former contains code derived from the library, while the latter only - works together with the library.

    -

    Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

    -

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -

    0. This License Agreement applies to any software - library which contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of this - Library General Public License (also called "this License"). Each - licensee is addressed as "you".

    -

    A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables.

    -

    The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or translated - straightforwardly into another language. (Hereinafter, translation is - included without limitation in the term "modification".)

    -

    "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code means - all the source code for all modules it contains, plus any associated - interface definition files, plus the scripts used to control - compilation and installation of the library.

    -

    Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - a program using the Library is not restricted, and output from such a - program is covered only if its contents constitute a work based on the - Library (independent of the use of the Library in a tool for writing - it). Whether that is true depends on what the Library does and what the - program that uses the Library does.

    -

    1. You may copy and distribute verbatim copies of - the Library's complete source code as you receive it, in any medium, - provided that you conspicuously and appropriately publish on each copy - an appropriate copyright notice and disclaimer of warranty; keep intact - all the notices that refer to this License and to the absence of any - warranty; and distribute a copy of this License along with the Library.

    -

    You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

    -

    2. You may modify your copy or copies of the Library - or any portion of it, thus forming a work based on the Library, and - copy and distribute such modifications or work under the terms of - Section 1 above, provided that you also meet all of these conditions:

    -
      -
    1. The modified work must itself be a software library. -

      -
    2. You must cause the files modified to carry prominent notices stating - that you changed the files and the date of any change. -

      -
    3. You must cause the whole of the work to be licensed at no charge to - all third parties under the terms of this License. -

      -
    4. If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses the - facility, other than as an argument passed when the facility is - invoked, then you must make a good faith effort to ensure that, in the - event an application does not supply such function or table, the - facility still operates, and performs whatever part of its purpose - remains meaningful. -

      (For example, a function in a library to compute square roots has a - purpose that is entirely well-defined independent of the application. - Therefore, Subsection 2d requires that any application-supplied - function or table used by this function must be optional: if the - application does not supply it, the square root function must still - compute square roots.)

      -
    5. - - - -
    -

    These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Library, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Library, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

    -

    Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Library.

    -

    In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

    -

    3. You may opt to apply the terms of the ordinary - GNU General Public License instead of this License to a given copy of - the Library. To do this, you must alter all the notices that refer to - this License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer version - than version 2 of the ordinary GNU General Public License has appeared, - then you can specify that version instead if you wish.) Do not make any - other change in these notices.

    -

    Once this change is made in a given copy, it is irreversible for that - copy, so the ordinary GNU General Public License applies to all - subsequent copies and derivative works made from that copy.

    -

    This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

    -

    4. You may copy and distribute the Library (or a - portion or derivative of it, under Section 2) in object code or - executable form under the terms of Sections 1 and 2 above provided that - you accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange.

    -

    If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy the - source code from the same place satisfies the requirement to distribute - the source code, even though third parties are not compelled to copy - the source along with the object code.

    -

    5. A program that contains no derivative of any - portion of the Library, but is designed to work with the Library by - being compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of the - Library, and therefore falls outside the scope of this License.

    -

    However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because it - contains portions of the Library), rather than a "work that uses the - library". The executable is therefore covered by this License. Section - 6 states terms for distribution of such executables.

    -

    When a "work that uses the Library" uses material from a header file - that is part of the Library, the object code for the work may be a - derivative work of the Library even though the source code is not. - Whether this is true is especially significant if the work can be - linked without the Library, or if the work is itself a library. The - threshold for this to be true is not precisely defined by law.

    -

    If such an object file uses only numerical parameters, data structure - layouts and accessors, and small macros and small inline functions (ten - lines or less in length), then the use of the object file is - unrestricted, regardless of whether it is legally a derivative work. - (Executables containing this object code plus portions of the Library - will still fall under Section 6.)

    -

    Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section 6. - Any executables containing that work also fall under Section 6, whether - or not they are linked directly with the Library itself.

    -

    6. As an exception to the Sections above, you may - also compile or link a "work that uses the Library" with the Library to - produce a work containing portions of the Library, and distribute that - work under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications.

    -

    You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered by - this License. You must supply a copy of this License. If the work - during execution displays copyright notices, you must include the - copyright notice for the Library among them, as well as a reference - directing the user to the copy of this License. Also, you must do one - of these things:

    -
      -
    1. Accompany the work with the complete corresponding machine-readable - source code for the Library including whatever changes were used in the - work (which must be distributed under Sections 1 and 2 above); and, if - the work is an executable linked with the Library, with the complete - machine-readable "work that uses the Library", as object code and/or - source code, so that the user can modify the Library and then relink to - produce a modified executable containing the modified Library. (It is - understood that the user who changes the contents of definitions files - in the Library will not necessarily be able to recompile the - application to use the modified definitions.) -

      -
    2. Accompany the work with a written offer, valid for at least three - years, to give the same user the materials specified in Subsection 6a, - above, for a charge no more than the cost of performing this - distribution. -

      -
    3. If distribution of the work is made by offering access to copy from - a designated place, offer equivalent access to copy the above specified - materials from the same place. -

      -
    4. Verify that the user has already received a copy of these materials - or that you have already sent this user a copy.
    5. - - - -
    -

    For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special exception, - the source code distributed need not include anything that is normally - distributed (in either source or binary form) with the major components - (compiler, kernel, and so on) of the operating system on which the - executable runs, unless that component itself accompanies the - executable.

    -

    It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you cannot - use both them and the Library together in an executable that you - distribute.

    -

    7. You may place library facilities that are a work - based on the Library side-by-side in a single library together with - other library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution of the - work based on the Library and of the other library facilities is - otherwise permitted, and provided that you do these two things:

    -
      -
    1. Accompany the combined library with a copy of the same work based on - the Library, uncombined with any other library facilities. This must be - distributed under the terms of the Sections above. -

      -
    2. Give prominent notice with the combined library of the fact that - part of it is a work based on the Library, and explaining where to find - the accompanying uncombined form of the same work.
    3. - -
    -

    8. You may not copy, modify, sublicense, link with, - or distribute the Library except as expressly provided under this - License. Any attempt otherwise to copy, modify, sublicense, link with, - or distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have received - copies, or rights, from you under this License will not have their - licenses terminated so long as such parties remain in full compliance.

    -

    9. You are not required to accept this License, - since you have not signed it. However, nothing else grants you - permission to modify or distribute the Library or its derivative works. - These actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work based - on the Library), you indicate your acceptance of this License to do so, - and all its terms and conditions for copying, distributing or modifying - the Library or works based on it.

    -

    10. Each time you redistribute the Library (or any - work based on the Library), the recipient automatically receives a - license from the original licensor to copy, distribute, link with or - modify the Library subject to these terms and conditions. You may not - impose any further restrictions on the recipients' exercise of the - rights granted herein. You are not responsible for enforcing compliance - by third parties to this License.

    -

    11. If, as a consequence of a court judgment or - allegation of patent infringement or for any other reason (not limited - to patent issues), conditions are imposed on you (whether by court - order, agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this License. If - you cannot distribute so as to satisfy simultaneously your obligations - under this License and any other pertinent obligations, then as a - consequence you may not distribute the Library at all. For example, if - a patent license would not permit royalty-free redistribution of the - Library by all those who receive copies directly or indirectly through - you, then the only way you could satisfy both it and this License would - be to refrain entirely from distribution of the Library.

    -

    If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply, and the section as a whole is intended to apply in other - circumstances.

    -

    It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system which is implemented - by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

    -

    This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

    -

    12. If the distribution and/or use of the Library is - restricted in certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Library under - this License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only in or - among countries not thus excluded. In such case, this License - incorporates the limitation as if written in the body of this License.

    -

    13. The Free Software Foundation may publish revised - and/or new versions of the Library General Public License from time to - time. Such new versions will be similar in spirit to the present - version, but may differ in detail to address new problems or concerns.

    -

    Each version is given a distinguishing version number. If the Library - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Library does not specify a license - version number, you may choose any version ever published by the Free - Software Foundation.

    -

    14. If you wish to incorporate parts of the Library - into other free programs whose distribution conditions are incompatible - with these, write to the author to ask for permission. For software - which is copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free status - of all derivatives of our free software and of promoting the sharing - and reuse of software generally.

    -

    NO WARRANTY

    -

    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, - THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    -

    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR - AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO - MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL - OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.

    -

    END OF TERMS AND CONDITIONS

    -

    B - Constants

    -

    This appendix lists all of the constants that are defined by the CUPS - API.

    -

    CUPS Constants

    -

    Version Number

    -

    The CUPS_VERSION constant is a floating-point number - representing the API version number. The current version number is - 1.0100 which represents CUPS version 1.1.0.

    -

    Printer Capabilities

    -

    The CUPS_PRINTER constants represent capability bits for - printers and classes:

    -
      -
    • CUPS_PRINTER_LOCAL - Is a local printer or class.
    • -
    • CUPS_PRINTER_REMOTE - Is a remote printer or class.
    • -
    • CUPS_PRINTER_CLASS - Is a class.
    • -
    • CUPS_PRINTER_BW - Printer prints in black and white.
    • -
    • CUPS_PRINTER_COLOR - Printer prints in color.
    • -
    • CUPS_PRINTER_DUPLEX - Printer can print double-sided.
    • -
    • CUPS_PRINTER_STAPLE - Printer can staple output.
    • -
    • CUPS_PRINTER_COPIES - Printer can produce multiple - copies on its own.
    • -
    • CUPS_PRINTER_COLLATE - Printer can collate copies.
    • -
    • CUPS_PRINTER_PUNCH - Printer can punch holes in output.
    • -
    • CUPS_PRINTER_COVER - Printer can put covers on output.
    • -
    • CUPS_PRINTER_BIND - Printer can bind output.
    • -
    • CUPS_PRINTER_SORT - Printer can sort output.
    • -
    • CUPS_PRINTER_SMALL - Printer can print on media up to - 9x14 inches.
    • -
    • CUPS_PRINTER_MEDIUM - Printer can print on media from - 9x14 to 18x24 inches.
    • -
    • CUPS_PRINTER_LARGE - Printer can print on media larger - than 18x24 inches.
    • -
    • CUPS_PRINTER_VARIABLE - Printer can print on variable - or custom media sizes.
    • -
    • CUPS_PRINTER_IMPLICIT - Is an implicit class.
    • -
    • CUPS_PRINTER_OPTIONS - All of the printer capability - and option bits.
    • -
    -

    Encodings

    -

    CUPS defines the following character set encoding constants:

    -
      -
    • CUPS_US_ASCII - US ASCII character set.
    • -
    • CUPS_UTF_8 - UTF-8 encoding of Unicode.
    • -
    • CUPS_ISO8859_1 - ISO-8859-1 character set.
    • -
    • CUPS_ISO8859_2 - ISO-8859-2 character set.
    • -
    • CUPS_ISO8859_3 - ISO-8859-3 character set.
    • -
    • CUPS_ISO8859_4 - ISO-8859-4 character set.
    • -
    • CUPS_ISO8859_5 - ISO-8859-5 character set.
    • -
    • CUPS_ISO8859_6 - ISO-8859-6 character set.
    • -
    • CUPS_ISO8859_7 - ISO-8859-7 character set.
    • -
    • CUPS_ISO8859_8 - ISO-8859-8 character set.
    • -
    • CUPS_ISO8859_9 - ISO-8859-9 character set.
    • -
    • CUPS_ISO8859_10 - ISO-8859-10 character set.
    • -
    • CUPS_ISO8859_13 - ISO-8859-13 character set.
    • -
    • CUPS_ISO8859_14 - ISO-8859-14 character set.
    • -
    • CUPS_ISO8859_15 - ISO-8859-15 character set.
    • -
    • CUPS_WINDOWS_874 - Windows code page 874.
    • -
    • CUPS_WINDOWS_1250 - Windows code page 1250.
    • -
    • CUPS_WINDOWS_1251 - Windows code page 1251.
    • -
    • CUPS_WINDOWS_1252 - Windows code page 1252.
    • -
    • CUPS_WINDOWS_1253 - Windows code page 1253.
    • -
    • CUPS_WINDOWS_1254 - Windows code page 1254.
    • -
    • CUPS_WINDOWS_1255 - Windows code page 1255.
    • -
    • CUPS_WINDOWS_1256 - Windows code page 1256.
    • -
    • CUPS_WINDOWS_1257 - Windows code page 1257.
    • -
    • CUPS_WINDOWS_1258 - Windows code page 1258.
    • -
    • CUPS_KOI8_R - Russian code page koi8-r.
    • -
    • CUPS_KOI8_U - Ukrainian code page koi8-r.
    • -
    -

    HTTP Constants

    -

    Limits

    -

    The following constants define the limits for strings:

    -
      -
    • HTTP_MAX_BUFFER - Size of socket buffer.
    • -
    • HTTP_MAX_HOST - Maximum length of hostname.
    • -
    • HTTP_MAX_URI - Maximum length of URI.
    • -
    • HTTP_MAX_VALUE - Maximum length of field values.
    • -
    -

    Status Codes

    -

    The following status codes can be returned by httpUpdate() -:

    -
      -
    • HTTP_ERROR - A network error occurred
    • -
    • HTTP_CONTINUE - Continue response from HTTP proxy
    • -
    • HTTP_OK - 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
    • -
    • HTTP_RESET_CONTENT - Content was reset/recreated
    • -
    • HTTP_PARTIAL_CONTENT - Only a partial file was - recieved/sent
    • -
    • HTTP_MULTIPLE_CHOICES - 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 - 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_SERVER_ERROR - 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
    • -
    -

    Fields

    -

    The following fields are indices for each of the standard HTTP fields - in HTTP 1/1:

    -
      -
    • HTTP_FIELD_ACCEPT_LANGUAGE - Accept-Language
    • -
    • HTTP_FIELD_ACCEPT_RANGES - Accept-Ranges
    • -
    • HTTP_FIELD_AUTHORIZATION - Authorization
    • -
    • HTTP_FIELD_CONNECTION - Connection
    • -
    • HTTP_FIELD_CONTENT_ENCODING - Content-Encoding
    • -
    • HTTP_FIELD_CONTENT_LANGUAGE - Content-Language
    • -
    • HTTP_FIELD_CONTENT_LENGTH - Content-Length
    • -
    • HTTP_FIELD_CONTENT_LOCATION - Content-Location
    • -
    • HTTP_FIELD_CONTENT_MD5 - Content-MD5
    • -
    • HTTP_FIELD_CONTENT_RANGE - Content-Range
    • -
    • HTTP_FIELD_CONTENT_TYPE - Content-Type
    • -
    • HTTP_FIELD_CONTENT_VERSION - Content-Version
    • -
    • HTTP_FIELD_DATE - Date
    • -
    • HTTP_FIELD_HOST - Host
    • -
    • HTTP_FIELD_IF_MODIFIED_SINCE - If-Modified-Since
    • -
    • HTTP_FIELD_IF_UNMODIFIED_SINCE - If-Unmodified-Since
    • -
    • HTTP_FIELD_KEEP_ALIVE - Keep-Alive
    • -
    • HTTP_FIELD_LAST_MODIFIED - Last-Modified
    • -
    • HTTP_FIELD_LINK - Link
    • -
    • HTTP_FIELD_LOCATION - Location
    • -
    • HTTP_FIELD_RANGE - Range
    • -
    • HTTP_FIELD_REFERER - Referer
    • -
    • HTTP_FIELD_RETRY_AFTER - Retry-After
    • -
    • HTTP_FIELD_TRANSFER_ENCODING - Transfer-Encoding
    • -
    • HTTP_FIELD_UPGRADE - Upgrade
    • -
    • HTTP_FIELD_USER_AGENT - User-Agent
    • -
    • HTTP_FIELD_WWW_AUTHENTICATE - WWW-Authenticate
    • -
    -

    IPP Constants

    -

    Limits

    -

    The following constants define array limits for IPP data:

    -
      -
    • IPP_MAX_NAME - Maximum length of an attribute name
    • -
    • IPP_MAX_VALUES - Maximum number of set-of values that - can be read in a request.
    • -
    -

    Tags

    -
      -
    • IPP_TAG_ZERO - Wildcard tag value for searches; also - used to separate groups of attributes
    • -
    • IPP_TAG_OPERATION - Tag for values of type operation
    • -
    • IPP_TAG_JOB - Tag for values of type job
    • -
    • IPP_TAG_END - Tag for values of type end
    • -
    • IPP_TAG_PRINTER - Tag for values of type printer
    • -
    • IPP_TAG_UNSUPPORTED_GROUP - Tag for values of type - unsupported_group
    • -
    • IPP_TAG_UNSUPPORTED_VALUE - Tag for values of type - unsupported_value
    • -
    • IPP_TAG_DEFAULT - Tag for values of type default
    • -
    • IPP_TAG_UNKNOWN - Tag for values of type unknown
    • -
    • IPP_TAG_NOVALUE - Tag for values of type novalue
    • -
    • IPP_TAG_NOTSETTABLE - Tag for values of type - notsettable
    • -
    • IPP_TAG_DELETEATTR - Tag for values of type deleteattr
    • -
    • IPP_TAG_ANYVALUE - Tag for values of type anyvalue
    • -
    • IPP_TAG_INTEGER - Tag for values of type integer
    • -
    • IPP_TAG_BOOLEAN - Tag for values of type boolean
    • -
    • IPP_TAG_ENUM - Tag for values of type enum
    • -
    • IPP_TAG_STRING - Tag for values of type string
    • -
    • IPP_TAG_DATE - Tag for values of type date
    • -
    • IPP_TAG_RESOLUTION - Tag for values of type resolution
    • -
    • IPP_TAG_RANGE - Tag for values of type range
    • -
    • IPP_TAG_COLLECTION - Tag for values of type collection
    • -
    • IPP_TAG_TEXTLANG - Tag for values of type textlang
    • -
    • IPP_TAG_NAMELANG - Tag for values of type namelang
    • -
    • IPP_TAG_TEXT - Tag for values of type text
    • -
    • IPP_TAG_NAME - Tag for values of type name
    • -
    • IPP_TAG_KEYWORD - Tag for values of type keyword
    • -
    • IPP_TAG_URI - Tag for values of type uri
    • -
    • IPP_TAG_URISCHEME - Tag for values of type urischeme
    • -
    • IPP_TAG_CHARSET - Tag for values of type charset
    • -
    • IPP_TAG_LANGUAGE - Tag for values of type language
    • -
    • IPP_TAG_MIMETYPE - Tag for values of type mimetype
    • -
    -

    Resolution Units

    -

    The IPP_RES_PER_INCH and IPP_RES_PER_CM - constants specify dots per inch and dots per centimeter, respectively.

    -

    Finishings

    -

    The finishing values specify special finishing operations to be - performed on the job.

    -
      -
    • IPP_FINISH_NONE - Do no finishing
    • -
    • IPP_FINISH_STAPLE - Staple the job
    • -
    • IPP_FINISH_PUNCH - Punch the job
    • -
    • IPP_FINISH_COVER - Cover the job
    • -
    • IPP_FINISH_BIND - Bind the job
    • -
    -

    Orientations

    -

    The orientation values specify the orientation of the job.

    -
      -
    • IPP_PORTRAIT - No rotation
    • -
    • IPP_LANDSCAPE - 90 degrees counter-clockwise
    • -
    • IPP_REVERSE_LANDSCAPE - 90 degrees clockwise
    • -
    • IPP_REVERSE_PORTRAIT - 180 degrees
    • -
    -

    Qualities

    -

    The quality values specify the desired quality of the print.

    -
      -
    • IPP_QUALITY_DRAFT - Draft quality
    • -
    • IPP_QUALITY_NORMAL - Normal quality
    • -
    • IPP_QUALITY_HIGH - High quality
    • -
    -

    Job States

    -

    The job state values are used to represent the current job state.

    -
      -
    • IPP_JOB_PENDING - Job is pending
    • -
    • IPP_JOB_HELD - Job is held
    • -
    • IPP_JOB_PROCESSING - Job is processing
    • -
    • IPP_JOB_STOPPED - Job is stopped
    • -
    • IPP_JOB_CANCELLED - Job is cancelled
    • -
    • IPP_JOB_ABORTED - Job is aborted
    • -
    • IPP_JOB_COMPLETED - Job is completed
    • -
    -

    Printer States

    -

    The printer state values are used to represent the current printer - state.

    -
      -
    • IPP_PRINTER_IDLE - Printer is idle
    • -
    • IPP_PRINTER_PROCESSING - Printer is processing
    • -
    • IPP_PRINTER_STOPPED - Printer is stopped
    • -
    -

    Operations

    -

    The operation values represent the available IPP operations.

    -
      -
    • IPP_PRINT_JOB - Print a file
    • -
    • IPP_PRINT_URI - Print a URI
    • -
    • IPP_VALIDATE_JOB - Validate job attributes
    • -
    • IPP_CREATE_JOB - Create a new job
    • -
    • IPP_SEND_DOCUMENT - Send a document to a job
    • -
    • IPP_SEND_URI - Send a URI to a job
    • -
    • IPP_CANCEL_JOB - Cancel a job
    • -
    • IPP_GET_JOB_ATTRIBUTES - Get job attributes
    • -
    • IPP_GET_JOBS - Get a list of all jobs
    • -
    • IPP_GET_PRINTER_ATTRIBUTES - Get printer attributes
    • -
    • IPP_HOLD_JOB - Hold a pending job
    • -
    • IPP_RELEASE_JOB - Release a held job
    • -
    • IPP_RESTART_JOB - Restart a completed job
    • -
    • IPP_PAUSE_PRINTER - Pause a printer
    • -
    • IPP_RESUME_PRINTER - Restart a paused printer
    • -
    • IPP_PURGE_JOBS - Purge jobs from the queue
    • -
    • IPP_SET_PRINTER_ATTRIBUTES - Set printer attributes
    • -
    • IPP_SET_JOB_ATTRIBUTES - Set job attributes
    • -
    • IPP_GET_PRINTER_SUPPORTED_VALUES - Get printer - supported values
    • -
    • CUPS_GET_DEFAULT - Get the default destination
    • -
    • CUPS_GET_PRINTERS - Get a list of all printers
    • -
    • CUPS_ADD_PRINTER - Add or modify a printer
    • -
    • CUPS_DELETE_PRINTER - Delete a printer
    • -
    • CUPS_GET_CLASSES - Get a list of all classes
    • -
    • CUPS_ADD_CLASS - Add or modify a class
    • -
    • CUPS_DELETE_CLASS - Delete a class
    • -
    • CUPS_ACCEPT_JOBS - Accept jobs on a printer or class
    • -
    • CUPS_REJECT_JOBS - Reject jobs on a printer or class
    • -
    • CUPS_SET_DEFAULT - Set the default destination
    • -
    • CUPS_GET_DEVICES - Get a list of all devices
    • -
    • CUPS_GET_PPDS - Get a list of all PPDs
    • -
    • CUPS_MOVE_JOB - Move a job to a new destination
    • -
    -

    Status Codes

    -

    Status codes are returned by all IPP requests.

    -
      -
    • IPP_OK - Request completed with no errors
    • -
    • IPP_OK_SUBST - Request completed but some attribute - values were substituted
    • -
    • IPP_OK_CONFLICT - Request completed but some attributes - conflicted
    • -
    • IPP_BAD_REQUEST - The request was bad
    • -
    • IPP_FORBIDDEN - You don't have access to the resource
    • -
    • IPP_NOT_AUTHENTICATED - You are not authenticated for - the resource
    • -
    • IPP_NOT_AUTHORIZED - You not authorized to access the - resource
    • -
    • IPP_NOT_POSSIBLE - The requested operation cannot be - completed
    • -
    • IPP_TIMEOUT - A timeout occurred
    • -
    • IPP_NOT_FOUND - The resource was not found
    • -
    • IPP_GONE - The resource has gone away
    • -
    • IPP_REQUEST_ENTITY - The request was too large
    • -
    • IPP_REQUEST_VALUE - The request contained a value that - was unknown to the server
    • -
    • IPP_DOCUMENT_FORMAT - The document format is not - supported by the server
    • -
    • IPP_ATTRIBUTES - Required attributes are missing
    • -
    • IPP_URI_SCHEME - The URI scheme is not supported
    • -
    • IPP_CHARSET - The charset is not supported
    • -
    • IPP_CONFLICT - One or more attributes conflict
    • -
    • IPP_COMPRESSION_NOT_SUPPORTED - The specified - compression is not supported
    • -
    • IPP_COMPRESSION_ERROR - The compressed data contained - an error
    • -
    • IPP_DOCUMENT_FORMAT_ERROR - The document data contained - an error in it
    • -
    • IPP_DOCUMENT_ACCESS_ERROR - The remote document could - not be accessed
    • -
    • IPP_INTERNAL_ERROR - The server encountered an internal - error
    • -
    • IPP_OPERATION_NOT_SUPPORTED - The requested operation - is not supported
    • -
    • IPP_SERVICE_UNAVAILABLE - The requested service is - unavailable
    • -
    • IPP_VERSION_NOT_SUPPORTED - The IPP request version is - not supported
    • -
    • IPP_DEVICE_ERROR - The output device encountered an - error
    • -
    • IPP_TEMPORARY_ERROR - A temporary error occurred
    • -
    • IPP_NOT_ACCEPTING - The destination is not accepting - jobs
    • -
    • IPP_PRINTER_BUSY - The destination is busy
    • -
    • IPP_ERROR_JOB_CANCELLED - The requested job has been - cancelled
    • -
    • IPP_MULTIPLE_JOBS_NOT_SUPPORTED - The server does not - support multiple jobs
    • -
    -

    PPD Constants

    -

    PPD Format Version

    -

    The PPD_VERSION constant defines a floating point number - representing the newest format version that is supported by CUPS, - currently 4.3.

    -

    PPD User-Interface Types

    -

    Each printer option has a type associated with it:

    -
      -
    • PPD_UI_BOOLEAN - The user can turn this option on or - off
    • -
    • PPD_UI_PICKONE - The user can choose one option value - to use.
    • -
    • PPD_UI_PICKMANY - The user can choose zero or more - option values.
    • -
    -

    PPD Sections

    -

    Some options must be output before others, or in different sections - of the output document. The ppd_section_t enumeration - defines which section the option must be output in:

    -
      -
    • PPD_ORDER_ANY - The option can be output in any of the - document, page, or prolog sections of the document
    • -
    • PPD_ORDER_DOCUMENT - The option must be output in the - DocumentSetup section of the document
    • -
    • PPD_ORDER_EXIT - The option must be output before the - document
    • -
    • PPD_ORDER_JCL - The option must be output in the job - control section of the document
    • -
    • PPD_ORDER_PAGE - The option must be output in the - PageSetup section of the document
    • -
    • PPD_ORDER_PROLOG - The option must be output in the - Prolog section of the document
    • -
    -

    PPD Colorspaces

    -

    Each printer has a default colorspace:

    -
      -
    • PPD_CS_CMYK - The printer uses CMYK colors by default
    • -
    • PPD_CS_CMY - The printer uses CMY colors by default
    • -
    • PPD_CS_GRAY - The printer uses grayscale by default
    • -
    • PPD_CS_RGB - The printer uses RGB colors by default
    • -
    • PPD_CS_RGBK - The printer uses RGBK colors by default
    • -
    • PPD_CS_N - The printer uses a DeviceN colorspace by - default
    • -
    -

    Raster Constants

    -

    Raster Sync Words

    -

    The CUPS_RASTER_SYNC and CUPS_RASTER_REVSYNC - constants define the standard sync words at the beginning of each CUPS - raster file.

    -

    Raster Stream Modes

    -

    The CUPS_RASTER_READ and CUPS_RASTER_WRITE - constants are used with the -cupsRasterOpen() function to specify a stream for reading or - writing.

    -

    Raster Boolean Constants

    -

    The CUPS_FALSE and CUPS_TRUE constants - represent boolean values in the page header.

    -

    Raster Jog Values

    -

    The cups_jog_t enumeration defines constants for the Jog - page device dictionary variable:

    -
      -
    • CUPS_JOG_NONE - Do no jogging
    • -
    • CUPS_JOG_FILE - Jog pages after each file
    • -
    • CUPS_JOG_JOB - Jog pages after each job
    • -
    • CUPS_JOG_SET - Jog pages after each set of jobs
    • -
    -

    Raster Orientation Values

    -

    The cups_orient_t enumeration defines constants for the - Orientation page device dictionary variable:

    -
      -
    • CUPS_ORIENT_0 - Portrait orientation
    • -
    • CUPS_ORIENT_90 - Landscape orientation
    • -
    • CUPS_ORIENT_180 - Reverse-portrait orientation
    • -
    • CUPS_ORIENT_270 - Reverse-landscape orientation
    • -
    -

    Raster CutMedia Values

    -

    The cups_cut_t enumeration defines constants for the - CutMedia page device dictionary variable:

    -
      -
    • CUPS_CUT_NONE - Do no jogging
    • -
    • CUPS_CUT_FILE - Cut pages after each file
    • -
    • CUPS_CUT_JOB - Cut pages after each job
    • -
    • CUPS_CUT_SET - Cut pages after each set of jobs
    • -
    • CUPS_CUT_PAGE - Cut each page
    • -
    -

    Raster AdvanceMedia Values

    -

    The cups_advance_t enumeration defines constants for the - AdvanceMedia page device dictionary variable:

    -
      -
    • CUPS_ADVANCE_NONE - Do no jogging
    • -
    • CUPS_ADVANCE_FILE - Advance media after each file
    • -
    • CUPS_ADVANCE_JOB - Advance media after each job
    • -
    • CUPS_ADVANCE_SET - Advance media after each set of jobs
    • -
    • CUPS_ADVANCE_PAGE - Advance media for each page
    • -
    -

    Raster LeadingEdge Values

    -

    The cups_edge_t enumeration defines constants for the - LeadingEdge page device dictionary variable:

    -
      -
    • CUPS_EDGE_TOP - The top of the media is the leading - edge
    • -
    • CUPS_EDGE_RIGHT - The right of the media is the leading - edge
    • -
    • CUPS_EDGE_BOTTOM - The bottom of the media is the - leading edge
    • -
    • CUPS_EDGE_LEFT - The left of the media is the leading - edge
    • -
    -

    Raster Color Order Values

    -

    The cups_order_t enumeration defines the possible color - value orderings:

    -
      -
    • CUPS_ORDER_CHUNKED - CMYK CMYK CMYK
    • -
    • CUPS_ORDER_BANDED - CCC MMM YYY KKK
    • -
    • CUPS_ORDER_PLANAR - CCC ... MMM ... YYY ... KKK ...
    • -
    -

    Raster Colorspace Values

    -

    The cups_cspace_t enumeration defines the possible - colorspaces:

    -
      -
    • CUPS_CSPACE_W - White (luminance)
    • -
    • CUPS_CSPACE_RGB - Red, green, blue
    • -
    • CUPS_CSPACE_RGBA - Red, green, blue, alpha
    • -
    • CUPS_CSPACE_K - Black
    • -
    • CUPS_CSPACE_CMY - Cyan, magenta, yellow
    • -
    • CUPS_CSPACE_YMC - Yellow, magenta, cyan
    • -
    • CUPS_CSPACE_CMYK - Cyan, magenta, yellow, black
    • -
    • CUPS_CSPACE_YMCK - Yellow, magenta, cyan, black
    • -
    • CUPS_CSPACE_KCMY - Black, cyan, magenta, yellow
    • -
    • CUPS_CSPACE_KCMYcm - Black, cyan, magenta, yellow, - light cyan, light magenta
    • -
    • CUPS_CSPACE_GMCK - Metallic yellow (gold), metallic - magenta, metallic cyan, black
    • -
    • CUPS_CSPACE_GMCS - Metallic yellow (gold), metallic - magenta, metallic cyan, metallic grey (silver)
    • -
    • CUPS_CSPACE_WHITE - White pigment (black as white - pigment)
    • -
    • CUPS_CSPACE_GOLD - Gold foil (black as gold foil)
    • -
    • CUPS_CSPACE_SILVER - Silver foil (black as silver foil)
    • -
    -

    C - Structures

    -

    This appendix describes all of the structures that are defined by the - CUPS API.

    -

    CUPS Structures

    -

    CUPS Destinations

    -

    The CUPS destination structure (cups_dest_t) contains - information on a specific destination or instance: -

    - - - - - - - - -
    MemberTypeDescription
    namechar *The name of the printer or class.
    instancechar *The instance of the printer or - class; NULL for the primary instance.
    is_defaultint1 if the destination is set as - the default, 0 otherwise.
    num_optionsintThe number of options associated - with this destination.
    optionscups_option_t * -The options associated with this destination.
    -
    -

    -

    CUPS Jobs

    -

    The CUPS job structure (cups_job_t) contains information - on a specific job: -

    - - - - - - - - - - - - - - - -
    MemberTypeDescription
    idintThe job ID for this job.
    destchar *The destination for this job - (printer or class name).
    titlechar *The job-name for this job (title).
    userchar *The job-originating-user-name for - this job (username).
    formatchar *The document-format for this job - (MIME type string).
    stateipp_jstateThe current state of the job.
    sizeintThe size of this job in kilobytes.
    priorityintThe priority of this job from 1 to - 100 (50 is normal).
    completed_timetime_tThe time the job was - completed, or 0 if not yet completed.
    creation_timetime_tThe time the job was - queued.
    processing_timetime_tThe time the job started - printing.
    -
    -

    -

    CUPS Messages

    -

    The CUPS messages structure (cups_lang_t) contains the - character set, locale name, and messages array: -

    - - - - - - - - - -
    MemberTypeDescription
    nextcups_lang_t *Pointer to the next messages - structure in memory.
    usedintThe number of active users of this - messages structure.
    encodingcups_encoding_tThe character encoding - of the message strings.
    languagechar [16]The language/locale name.
    messageschar *[]The array of message strings.
    -
    -

    -

    CUPS Options

    -

    The CUPS option structure (cups_option_t) contains the - option name and string value: -

    - - - - - -
    MemberTypeDescription
    namechar *The name of the option.
    valuechar *The string value of the option.
    -
    -

    -

    Networking Structures

    -

    HTTP State

    -

    The HTTP state structure (http_t) contains the current - state of a HTTP request or response: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    fdintThe socket for the HTTP connection.
    blockingint1 if the HTTP functions should - block, 0 if not.
    errorintThe last OS error that occurred on the - socket.
    activitytime_tThe last time the HTTP - connection was used.
    statehttp_state_tThe current HTTP - request/response state.
    statusintThe last HTTP status seen.
    versionhttp_version_tThe HTTP protocol version - in use.
    keep_alivehttp_keep_alive_tWhether or not to - use Keep-Alive
    hostaddrstruct sockaddr_inThe IPv4 address of - the HTTP server.
    hostnamechar []The hostname of the HTTP - server.
    fieldschar [][]The string values of all HTTP - request/response fields.
    datachar *Current byte in data buffer.
    data_encodinghttp_encoding_tThe transfer - encoding for the request/response.
    data_remainingintThe number of bytes remaining - in the current request, response, or chunk.
    usedintThe number of bytes that are used in - the buffer.
    bufferchar []The read/write buffer.
    auth_typeintThe type of authentication in use.
    md5_statemd5_state_tThe current MD5 digest - state.
    noncechar []The nonce value for Digest - authentication.
    nonce_countintThe nonce count value.
    tlsvoid *A pointer to private encryption data.
    encryptionhttp_encryption_tThe current - encryption mode.
    -
    -

    -

    IPP State

    -

    The IPP state structure (ipp_t) contains the current - state of a IPP request or response: -

    - - - -
    MemberTypeDescription
    -
    -

    -

    Raster Structures

    -

    Raster Page Header

    -

    The raster page header (cups_raster_header_t) consists - of the PostScript page device dictionary for the page: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    MediaClasschar[64]The media class name
    MediaColorchar[64]The media color name
    MediaTypechar[64]The media type name
    OutputTypechar[64]The output type name
    AdvanceDistanceunsignedThe distance to advance - the media in points
    AdvanceMediacups_adv_tWhen to advance the - media
    Collatecups_bool_tWhether or not to produce - collated copies
    CutMediacups_cut_tWhen to cut the media
    Duplexcups_bool_tWhether or not to print on - both sides of the paper
    HWResolutionunsigned[2]The resolution of the - page image in pixels per inch; the HWResolution[0] represents the - horizontal resolution and HWResolution[1] represents the vertical - resolution
    ImagingBoundingBoxunsigned[4]The bounding box - for the page in points; the elements represent the left, bottom, right, - and top coordinates of the imaged area (if 0 then the whole page is - imaged)
    InsertSheetcups_bool_tWhether or not to insert - a sheet before this page
    Jogcups_jog_tWhen to jog copies of the page
    LeadingEdgecups_edge_tThe leading edge of the - page
    Marginsunsigned[2]The lower-lefthand margin of - the page in points
    ManualFeedcups_bool_tWhether or not to - manually feed the page
    MediaPositionunsignedThe input slot number to - use
    MediaWeightunsignedThe weight of the output - media in grams/m2
    MirrorPrintcups_bool_tWhether or not to mirror - the print
    NegativePrintcups_bool_tWhether or not to - invert the print
    NumCopiesunsignedThe number of copies to - produce
    Orientationcups_orient_tThe orientation of the - page image
    OutputFaceUpcups_bool_tWhether or not to - output the page face up
    PageSizeunsigned[2]The width and height of the - page in points
    Separationscups_bool_tWhether or not to output - separations
    TraySwitchcups_bool_tWhether or not to - automatically switch trays for the requested media size/type
    Tumblecups_bool_tWhether or not to rotate the - back side of the page
    cupsWidthunsignedThe width of the page image - in pixels
    cupsHeightunsignedThe height of the page image - in pixels
    cupsMediaTypeunsignedThe device-specific media - type code
    cupsBitsPerColorunsignedThe number of bits per - color
    cupsBitsPerPixelunsignedThe number of bits per - pixel
    cupsBytesPerLineunsignedThe number of bytes - per line of image data
    cupsColorOrdercups_order_tThe order of color - values
    cupsColorSpacecups_cspace_tThe type of color - values
    cupsCompressionunsignedThe device-specific - compression code
    cupsRowCountunsignedThe device-specific row - count
    cupsRowFeedunsignedThe device-specific row - feed
    cupsRowStepunsignedThe device-specific row - step
    -
    -

    -

    D - Functions

    -

    This appendix provides a reference for all of the CUPS API functions. - -

    -

    cupsAddDest()

    -

    Usage

    -
    -int
    -cupsAddDest(const char  *name,
    -            const char  *instance,
    -            int         num_dests,
    -	    cups_dest_t **dests);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    nameThe name of the destination.
    instanceThe instance of the destination, or NULL for - the primary instance.
    num_destsThe number of destinations in the array.
    destA pointer to the destination array pointer.
    -
    -

    Returns

    -

    The new number of destinations in the array.

    -

    Description

    -

    cupsAddDest() adds the named destination to the - destination array if it does not already exist.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -
    -
    -num_dests = cupsAddDests("foo", "bar", num_dests, &dests);
    -
    -

    See Also

    -

    cupsFreeDests(), - cupsGetDest(), -cupsGetDests() - -

    -

    cupsAddOption()

    -

    Usage

    -
    -int
    -cupsAddOption(const char    *name,
    -              const char    *value,
    -              int           num_options,
    -	      cups_option_t **options);
    -
    -

    Arguments

    -
    - - - - - - - -
    ArgumentDescription
    nameThe name of the option.
    valueThe value of the option.
    num_optionsNumber of options currently in the array.
    optionsPointer to the options array.
    -
    -

    Returns

    -

    The new number of options.

    -

    Description

    -

    cupsAddOption() adds an option to the specified array.

    -

    Example

    -
    -#include <cups.h>
    -
    -...
    -
    -/* Declare the options array */
    -int           num_options;
    -cups_option_t *options;
    -
    -/* Initialize the options array */
    -num_options = 0;
    -options     = (cups_option_t *)0;
    -
    -/* Add options using cupsAddOption() */
    -num_options = cupsAddOption("media", "letter", num_options, &options);
    -num_options = cupsAddOption("resolution", "300dpi", num_options, &options);
    -
    -

    See Also

    - cupsEncodeOptions(), - cupsFreeOptions(), -cupsGetOption(), -cupsParseOptions() - - -

    cupsCancelJob()

    -

    Usage

    -
    -int
    -cupsCancelJob(const char *dest,
    -              int        job);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    destPrinter or class name
    jobJob ID
    -
    -

    Returns

    -

    1 on success, 0 on failure. On failure the error can be found by - calling cupsLastError().

    -

    Description

    -

    cupsCancelJob() cancels the specifies job.

    -

    Example

    -
    -#include <cups.h>
    -
    -cupsCancelJob("LaserJet", 1);
    -
    -

    See Also

    -

    cupsLastError(), - cupsPrintFile(), -cupsPrintFiles() - -

    -

    cupsDoFileRequest()

    -

    Usage

    -
    -ipp_t *
    -cupsDoFileRequest(http_t     *http,
    -                  ipp_t      *request,
    -                  const char *resource,
    -		  const char *filename);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    httpHTTP connection to server.
    requestIPP request data.
    resourceHTTP resource name for POST.
    filenameFile to send with POST request (NULL - pointer if none.)
    -
    -

    Returns

    -

    IPP response data or NULL if the request fails. On - failure the error can be found by calling -cupsLastError().

    -

    Description

    -

    cupsDoFileRequest() does a HTTP POST request and - provides the IPP request and optionally the contents of a file to the - IPP server. It also handles resubmitting the request and performing - password authentication as needed.

    -

    Example

    -
    -#include <cups.h>
    -
    -http_t      *http;
    -cups_lang_t *language;
    -ipp_t       *request;
    -ipp_t       *response;
    -
    -...
    -
    -/* Get the default language */
    -language = cupsLangDefault();
    -
    -/* Create a new IPP request */
    -request  = ippNew();
    -
    -request->request.op.operation_id = IPP_PRINT_FILE;
    -request->request.op.request_id   = 1;
    -
    -/* Add required attributes */
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
    -             "attributes-charset", NULL, cupsLangEncoding(language));
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
    -             "attributes-natural-language", NULL,
    -             language != NULL ? language->language : "C");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
    -             NULL, "ipp://hostname/resource");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
    -             NULL, cupsUser());
    -
    -/* Do the request... */
    -response = cupsDoFileRequest(http, request, "/resource", "filename.txt");
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsUser(), httpConnect() -, ippAddString(), - ippNew() - -

    -

    cupsDoRequest()

    -

    Usage

    -
    -ipp_t *
    -cupsDoRequest(http_t *http,
    -              ipp_t *request,
    -              const char *resource);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    httpHTTP connection to server.
    requestIPP request data.
    resourceHTTP resource name for POST.
    -
    -

    Returns

    -

    IPP response data or NULL if the request fails. On - failure the error can be found by calling -cupsLastError().

    -

    Description

    -

    cupsDoRequest() does a HTTP POST request and provides - the IPP request to the IPP server. It also handles resubmitting the - request and performing password authentication as needed.

    -

    Example

    -
    -#include <cups.h>
    -
    -http_t      *http;
    -cups_lang_t *language;
    -ipp_t       *request;
    -ipp_t       *response;
    -
    -...
    -
    -/* Get the default language */
    -language = cupsLangDefault();
    -
    -/* Create a new IPP request */
    -request  = ippNew();
    -
    -request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
    -request->request.op.request_id   = 1;
    -
    -/* Add required attributes */
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
    -             "attributes-charset", NULL, cupsLangEncoding(language));
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
    -             "attributes-natural-language", NULL,
    -             language != NULL ? language->language : "C");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
    -             NULL, "ipp://hostname/resource");
    -
    -/* Do the request... */
    -response = cupsDoRequest(http, request, "/resource");
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsUser(), httpConnect() -, ippAddString(), - ippNew() - -

    -

    cupsEncodeOptions()

    -

    Usage

    -
    -void
    -cupsEncodeOptions(ipp_t         *ipp,
    -                  int           num_options,
    -		  cups_option_t *options);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ippThe IPP request.
    num_optionsThe number of options.
    optionsThe options.
    -
    -

    Description

    -

    cupsEncodeOptions() encodes all of the options in the - specified array as IPP attributes and adds them to the IPP request.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -ipp_t         *ipp;
    -int           num_options;
    -cups_option_t *options;
    -
    -
    -cupsEncodeOptions(ipp, num_options, options);
    -
    -

    See Also

    -

    cupsAddOption(), - cupsParseOptions(), ippNew() - - -

    -

    cupsEncryption()

    -

    Usage

    -
    -http_encryption_t
    -cupsEncryption(void);
    -
    -

    Returns

    -

    The current encryption setting.

    -

    Description

    -

    cupsEncryption() returns the current encryption setting - for IPP requests such as printing.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -http_t *http;
    -
    -printf("The current encryption setting is %d.\n", cupsEncryption());
    -
    -http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
    -
    -

    See Also

    -

    cupsServer(), - httpConnectEncrypt(), -ippPort() - -

    -

    cupsFreeDests()

    -

    Usage

    -
    -void
    -cupsFreeDests(int         num_dests,
    -              cups_dest_t *dests);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    num_destsThe number of destinations in the array.
    destsThe destination array.
    -
    -

    Description

    -

    cupsFreeDests() frees a destination array that was - created using cupsGetDests().

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    -

    See Also

    -

    cupsGetDest(), - cupsGetDests() - -

    -

    cupsFreeJobs()

    -

    Usage

    -
    -void
    -cupsFreeJobs(int        num_jobs,
    -             cups_job_t *jobs);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    num_jobsThe number of jobs.
    jobsThe job array.
    -
    -

    Description

    -

    cupsFreeJobs() frees an array of print jobs created by - the cupsGetJobs() function.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int        i;
    -int        num_jobs;
    -cups_job_t *jobs;
    -
    -
    -num_jobs = cupsGetJobs(&jobs, NULL, 0, 0);
    -
    -printf("%d active job(s):\n", num_jobs);
    -for (i = 0; i < num_jobs; i ++)
    -  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
    -         jobs[i].user, jobs[i].title,
    -	 jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
    -
    -cupsFreeJobs(num_jobs, jobs);
    -
    -

    See Also

    -

    cupsGetJobs(), - cupsGetDests() - -

    -

    cupsFreeOptions()

    -

    Usage

    -
    -void
    -cupsFreeOptions(int           num_options,
    -                cups_option_t *options);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    num_optionsNumber of options in array.
    optionsPointer to options array.
    -
    -

    Description

    -

    cupsFreeOptions() frees all memory associated with the - option array specified.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -
    -...
    -
    -cupsFreeOptions(num_options, options);
    -
    -

    See Also

    -

    cupsAddOption(), - cupsEncodeOptions(), -cupsGetOption(), -cupsMarkOptions(), -cupsParseOptions() - -

    -

    cupsGetClasses()

    -

    Usage

    -
    -int
    -cupsGetClasses(char ***classes);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    classesPointer to character pointer array.
    -
    -

    Returns

    -

    The number of printer classes available.

    -

    Description

    -

    cupsGetClasses() gets a list of the available printer - classes. The returned array should be freed using the free() - when it is no longer needed.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int  i;
    -int  num_classes;
    -char **classes;
    -
    -...
    -
    -num_classes = cupsGetClasses(
    -
    -...
    -
    -if (num_classes > 0)
    -{
    -  for (i = 0; i < num_classes; i ++)
    -    free(classes[i]);
    -
    -  free(classes);
    -}
    -
    -

    See Also

    -

    cupsGetDefault(), - cupsGetPrinters() - -

    -

    cupsGetDefault()

    -

    Usage

    -
    -const char *
    -cupsGetDefault(void);
    -
    -

    Returns

    -

    A pointer to the default destination.

    -

    Description

    -

    cupsGetDefault() gets the default destination printer or - class. The default destination is stored in a static string and will be - overwritten (usually with the same value) after each call.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -printf("The default destination is %s\n", cupsGetDefault());
    -
    -

    See Also

    -

    cupsGetClasses(), - cupsGetPrinters() - -

    -

    cupsGetDest()

    -

    Usage

    -
    -cups_dest_t *
    -cupsGetDest(const char  *name,
    -            const char  *instance,
    -            int         num_dests,
    -            cups_dest_t *dests);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    nameThe name of the destination, or NULL for the - default destination.
    instanceThe instance of the destination, or NULL for - the primary instance.
    num_destsThe number of destinations.
    destsThe destination array.
    -
    -

    Returns

    -

    A pointer to the specified destination, or NULL if none exists.

    -

    Description

    -

    cupsGetDest() finds the specified destination in the - array of destinations created by the cupsGetDests() - function.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    -

    See Also

    -

    cupsGetDests(), - cupsGetJobs() - -

    -

    cupsGetDests()

    -

    Usage

    -
    -int
    -cupsGetDests(cups_dest_t **dests);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    destsA pointer to a destination array pointer.
    -
    -

    Returns

    -

    The number of available destinations.

    -

    Description

    -

    cupsGetDests() creates an array of available - destinations that the user can print to. The array should be freed - using the cupsFreeDests() function.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    -

    See Also

    -

    cupsFreeDests(), - cupsGetDest(), -cupsGetJobs() - -

    -

    cupsGetJobs()

    -

    Usage

    -
    -int
    -cupsGetJobs(cups_job_t **jobs,
    -            const char *dest,
    -            int        myjobs,
    -            int        completed);
    -
    -

    Arguments

    -
    - - - - - - - -
    ArgumentDescription
    jobsA pointer to the job array pointer.
    destThe destination name, or NULL if jobs for all - destinations are requested.
    myjobs1 if only those jobs submitted by the current -cupsUser() should be returned, 0 for jobs submitted by all users.
    completed1 if only completed jobs should be returned, 0 - if only pending/processing jobs should be returned.
    -
    -

    Returns

    -

    The number of jobs.

    -

    Description

    -

    cupsGetJobs() creates an array of print jobs based on - the arguments supplied in the function call. The returned array should - be freed using the cupsFreeJobs() function.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int        i;
    -int        num_jobs;
    -cups_job_t *jobs;
    -
    -
    -num_jobs = cupsGetJobs(&jobs, NULL, 0, 0);
    -
    -printf("%d active job(s):\n", num_jobs);
    -for (i = 0; i < num_jobs; i ++)
    -  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
    -         jobs[i].user, jobs[i].title,
    -	 jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
    -
    -cupsFreeJobs(num_jobs, jobs);
    -
    -

    See Also

    -

    cupsFreeJobs(), - cupsGetDests() - -

    -

    cupsGetOption()

    -

    Usage

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

    Arguments

    -
    - - - - - -
    ArgumentDescription
    nameThe name of the option.
    num_optionsThe number of options in the array.
    optionsThe options array.
    -
    -

    Returns

    -

    A pointer to the option values or NULL if the option is - not defined.

    -

    Description

    -

    cupsGetOption() returns the first occurrence of the - named option. If the option is not included in the options array then a - NULL pointer is returned.

    -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -const char    *media;
    -
    -...
    -
    -media = cupsGetOption("media", num_options, options);
    -
    -

    See Also

    -

    cupsAddOption(), - cupsEncodeOptions(), -cupsFreeOptions(), -cupsMarkOptions(), -cupsParseOptions() - -

    -

    cupsGetPassword()

    -

    Usage

    -
    -const char *
    -cupsGetPassword(const char *prompt);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    promptThe prompt to display to the user.
    -
    -

    Returns

    -

    A pointer to the password that was entered or NULL if no - password was entered.

    -

    Description

    -

    cupsGetPassword() displays the prompt string and asks - the user for a password. The password text is not echoed to the user.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -char *password;
    -
    -...
    -
    -password = cupsGetPassword("Please enter a password:");
    -
    -

    See Also

    -

    cupsServer(), - cupsSetPasswordCB(), -cupsSetServer(), cupsSetUser() -, cupsUser() - -

    -

    cupsGetPPD()

    -

    Usage

    -
    -const char *
    -cupsGetPPD(const char *printer);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    printerThe name of the printer.
    -
    -

    Returns

    -

    The name of a temporary file containing the PPD file or NULL - if the printer cannot be located or does not have a PPD file.

    -

    Description

    -

    cupsGetPPD() gets a copy of the PPD file for the named - printer. The printer name can be of the form "printer" or - "printer@hostname".

    -

    You should remove (unlink) the PPD file after you are done using it. - The filename is stored in a static buffer and will be overwritten with - each call to cupsGetPPD().

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -char *ppd;
    -
    -...
    -
    -ppd = cupsGetPPD("printer@hostname");
    -
    -...
    -
    -unlink(ppd);
    -
    - - -

    cupsGetPrinters()

    -

    Usage

    -
    -int
    -cupsGetPrinters(char ***printers);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    printersPointer to character pointer array.
    -
    -

    Returns

    -

    The number of printer printers available.

    -

    Description

    -

    cupsGetPrinters() gets a list of the available printers. - The returned array should be freed using the free() when - it is no longer needed.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int  i;
    -int  num_printers;
    -char **printers;
    -
    -...
    -
    -num_printers = cupsGetPrinters(
    -
    -...
    -
    -if (num_printers > 0)
    -{
    -  for (i = 0; i < num_printers; i ++)
    -    free(printers[i]);
    -
    -  free(printers);
    -}
    -
    -

    See Also

    -

    cupsGetClasses() - cupsGetDefault() - -

    -

    cupsLangDefault()

    -

    Usage

    -
    -const char *
    -cupsLangDefault(void);
    -
    -

    Returns

    -

    A pointer to the default language structure.

    -

    Description

    -

    cupsLangDefault() returns a language structure for the - default language. The default language is defined by the LANG - environment variable. If the specified language cannot be located then - the POSIX (English) locale is used.

    -

    Call cupsLangFree() to free any memory associated with - the language structure when you are done.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -...
    -
    -language = cupsLangDefault();
    -
    -...
    -
    -cupsLangFree(language);
    -
    -

    See Also

    -

    cupsLangEncoding(), - cupsLangFlush(), -cupsLangFree(), cupsLangGet() -, cupsLangString() - -

    -

    cupsLangEncoding()

    -

    Usage

    -
    -char *
    -cupsLangEncoding(cups_lang_t *language);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    languageThe language structure.
    -
    -

    Returns

    -

    A pointer to the encoding string.

    -

    Description

    -

    cupsLangEncoding() returns the language encoding used - for the specified language, e.g. "iso-8859-1", "utf-8", etc.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -char        *encoding;
    -...
    -
    -language = cupsLangDefault();
    -encoding = cupsLangEncoding(language);
    -...
    -
    -cupsLangFree(language);
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangFlush(), -cupsLangFree(), cupsLangGet() -, cupsLangString() - -

    -

    cupsLangFlush()

    -

    Usage

    -
    -void
    -cupsLangFlush(void);
    -
    -

    Description

    -

    cupsLangFlush() frees all language structures that have - been allocated.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -...
    -
    -cupsLangFlush();
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsLangFree(), cupsLangGet() -, cupsLangString() - -

    -

    cupsLangFree()

    -

    Usage

    -
    -void
    -cupsLangFree(cups_lang_t *language);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    languageThe language structure to free.
    -
    -

    Description

    -

    cupsLangFree() frees the specified language structure.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -...
    -
    -cupsLangFree(language);
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsLangFlush(), cupsLangGet() -, cupsLangString() - -

    -

    cupsLangGet()

    -

    Usage

    -
    -cups_lang_t *
    -cupsLangGet(const char *name);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    nameThe name of the locale.
    -
    -

    Returns

    -

    A pointer to a language structure.

    -

    Description

    -

    cupsLangGet() returns a language structure for the - specified locale. If the locale is not defined then the POSIX (English) - locale is substituted.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -
    -...
    -
    -language = cupsLangGet("fr");
    -
    -...
    -
    -cupsLangFree(language);
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsLangFlush(), cupsLangFree() -, cupsLangString() - -

    -

    cupsLangString()

    -

    Usage

    -
    -char *
    -cupsLangString(cups_lang_t *language,
    -               int         message);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    languageThe language to query.
    messageThe message number.
    -
    -

    Returns

    -

    A pointer to the message string or NULL if the message - is not defined.

    -

    Description

    -

    cupsLangString() returns a pointer to the specified - message string in the specified language.

    -

    Example

    -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -char        *s;
    -...
    -
    -language = cupsLangGet("fr");
    -
    -s = cupsLangString(language, CUPS_MSG_YES);
    -
    -...
    -
    -cupsLangFree(language);
    -
    -

    See Also

    -

    cupsLangDefault(), - cupsLangEncoding(), -cupsLangFlush(), cupsLangFree() -, cupsLangGet() - -

    -

    cupsLastError()

    -

    Usage

    -
    -ipp_status_t
    -cupsLastError(void);
    -
    -

    Returns

    -

    An enumeration containing the last IPP error.

    -

    Description

    -

    cupsLastError() returns the last IPP error that - occurred. If no error occurred then it will return IPP_OK - or IPP_OK_CONFLICT.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -ipp_status_t status;
    -
    -...
    -
    -status = cupsLastError();
    -
    -

    See Also

    -

    cupsCancelJob(), - cupsPrintFile() - -

    -

    cupsMarkOptions()

    -

    Usage

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

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    ppdThe PPD file to mark.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    -
    -

    Returns

    -

    The number of conflicts found.

    -

    Description

    -

    cupsMarkOptions() marks options in the PPD file. It also - handles mapping of IPP option names and values to PPD option names.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -ppd_file_t    *ppd;
    -
    -...
    -
    -cupsMarkOptions(ppd, num_options, options);
    -
    -

    See Also

    -

    cupsAddOption(), - cupsFreeOptions(), -cupsGetOption(), -cupsParseOptions() - -

    -

    cupsParseOptions()

    -

    Usage

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

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    argThe string containing one or more options.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array pointer.
    -
    -

    Returns

    -

    The new number of options in the array.

    -

    Description

    -

    cupsParseOptions() parses the specifies string for one - or more options of the form "name=value", "name", or "noname". It can - be called multiple times to combine the options from several strings.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -
    -...
    -
    -num_options = 0;
    -options     = (cups_option_t *)0;
    -num_options = cupsParseOptions(argv[5], num_options, &options);
    -
    -

    See Also

    -

    cupsAddOption(), - cupsFreeOptions(), -cupsGetOption(), -cupsMarkOptions() - -

    -

    cupsPrintFile()

    -

    Usage

    -
    -int
    -cupsPrintFile(const char    *printer,
    -              const char    *filename,
    -              const char    *title,
    -	      int           num_options,
    -	      cups_option_t *options);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    printerThe printer or class to print to.
    filenameThe file to print.
    titleThe job title.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    -
    -

    Returns

    -

    The new job ID number or 0 on error.

    -

    Description

    -

    cupsPrintFile() sends a file to the specified printer or - class for printing. If the job cannot be printed the error code can be - found by calling cupsLastError().

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -int           jobid;
    -
    -...
    -
    -jobid = cupsPrintFile("printer@hostname", "filename.ps", "Job Title",
    -                      num_options, options);
    -
    -

    See Also

    -

    cupsCancelJob(), - cupsLastError(), -cupsPrintFiles() - -

    -

    cupsPrintFiles()

    -

    Usage

    -
    -int
    -cupsPrintFiles(const char    *printer,
    -               int           num_files,
    -               const char    **files,
    -               const char    *title,
    -	       int           num_options,
    -	       cups_option_t *options);
    -
    -

    Arguments

    -
    - - - - - - - - - -
    ArgumentDescription
    printerThe printer or class to print to.
    num_filesThe number of files to print.
    filesThe files to print.
    titleThe job title.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    -
    -

    Returns

    -

    The new job ID number or 0 on error.

    -

    Description

    -

    cupsPrintFiles() sends multiple files to the specified - printer or class for printing. If the job cannot be printed the error - code can be found by calling cupsLastError().

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int           num_files;
    -const char    *files[100];
    -int           num_options;
    -cups_option_t *options;
    -int           jobid;
    -
    -...
    -
    -jobid = cupsPrintFiles("printer@hostname", num_files, files,
    -                       "Job Title", num_options, options);
    -
    -

    See Also

    -

    cupsCancelJob(), - cupsLastError(), -cupsPrintFile() - -

    -

    cupsRasterClose()

    -

    Usage

    -
    -void
    -cupsRasterClose(cups_raster_t *ras);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    rasThe raster stream to close.
    -
    -

    Description

    -

    cupsRasterClose() closes the specified raster stream.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -cups_raster_t *ras;
    -
    -...
    -
    -cupsRasterClose(ras);
    -
    -

    See Also

    -

    cupsRasterOpen(), - cupsRasterReadHeader(), - cupsRasterReadPixels(), - cupsRasterWriteHeader(), - cupsRasterWritePixels() - -

    -

    cupsRasterOpen()

    -

    Usage

    -
    -cups_raster_t *
    -cupsRasterOpen(int         fd,
    -               cups_mode_t mode);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    fdThe file descriptor to use.
    modeThe mode to use; CUPS_RASTER_READ or -CUPS_RASTER_WRITE.
    -
    -

    Returns

    -

    A pointer to a raster stream or NULL if there was an - error.

    -

    Description

    -

    cupsRasterOpen() opens a raster stream for reading or - writing.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -cups_raster_t *ras;
    -
    -...
    -
    -ras = cupsRasterOpen(0, CUPS_RASTER_READ);
    -
    -

    See Also

    -

    cupsRasterClose(), - cupsRasterReadHeader(), - cupsRasterReadPixels(), - cupsRasterWriteHeader(), - cupsRasterWritePixels() - -

    -

    cupsRasterReadHeader()

    -

    Usage

    -
    -unsigned
    -cupsRasterReadHeader(cups_raster_t      *ras,
    -                     cups_page_header_t *header);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    rasThe raster stream to read from.
    headerA pointer to a page header structure to read - into.
    -
    -

    Returns

    -

    1 on success, 0 on EOF or error.

    -

    Description

    -

    cupsRasterReadHeader() reads a page header from the - specified raster stream.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -while (cupsRasterReadHeader(ras, &header))
    -{
    -  ...
    -
    -  for (line = 0; line < header.cupsHeight; line ++)
    -  {
    -    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
    -
    -    ...
    -  }
    -}
    -
    -

    See Also

    -

    cupsRasterClose(), - cupsRasterOpen(), -cupsRasterReadPixels(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - -

    -

    cupsRasterReadPixels()

    -

    Usage

    -
    -unsigned
    -cupsRasterReadPixels(cups_raster_t *ras,
    -                     unsigned char *pixels,
    -		     unsigned      length);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    rasThe raster stream to read from.
    pixelsThe pointer to a pixel buffer.
    lengthThe number of bytes of pixel data to read.
    -
    -

    Returns

    -

    The number of bytes read or 0 on EOF or error.

    -

    Description

    -

    cupsRasterReadPixels() reads pixel data from the - specified raster stream.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -while (cupsRasterReadHeader(ras, &header))
    -{
    -  ...
    -
    -  for (line = 0; line < header.cupsHeight; line ++)
    -  {
    -    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
    -
    -    ...
    -  }
    -}
    -
    -

    See Also

    -

    cupsRasterClose(), - cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - -

    -

    cupsRasterWriteHeader()

    -

    Usage

    -
    -unsigned
    -cupsRasterWriteHeader(cups_raster_t      *ras,
    -                      cups_page_header_t *header);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    rasThe raster stream to write to.
    headerA pointer to the page header to write.
    -
    -

    Returns

    -

    1 on success, 0 on error.

    -

    Description

    -

    cupsRasterWriteHeader() writes the specified page header - to a raster stream.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -cupsRasterWriteHeader(ras, &header);
    -
    -for (line = 0; line < header.cupsHeight; line ++)
    -{
    -  ...
    -
    -  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
    -}
    -
    -

    See Also

    -

    cupsRasterClose(), - cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWritePixels() - -

    -

    cupsRasterWritePixels()

    -

    Usage

    -
    -unsigned
    -cupsRasterWritePixels(cups_raster_t *ras,
    -                      unsigned char *pixels,
    -		      unsigned      length);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    rasThe raster stream to write to.
    pixelsThe pixel data to write.
    lengthThe number of bytes to write.
    -
    -

    Returns

    -

    The number of bytes written.

    -

    Description

    -

    cupsRasterWritePixels() writes the specified pixel data - to a raster stream.

    -

    Example

    -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -cupsRasterWriteHeader(ras, &header);
    -
    -for (line = 0; line < header.cupsHeight; line ++)
    -{
    -  ...
    -
    -  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
    -}
    -
    -

    See Also

    -

    cupsRasterClose(), - cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWriteHeader() - -

    -

    cupsServer()

    -

    Usage

    -
    -const char *
    -cupsServer(void);
    -
    -

    Returns

    -

    A pointer to the default server name.

    -

    Description

    -

    cupsServer() returns a pointer to the default server - name. The server name is stored in a static location and will be - overwritten with every call to cupsServer().

    -

    The default server is determined from the following locations:

    -
      -
    1. The CUPS_SERVER environment variable,
    2. -
    3. The ServerName directive in the client.conf - file,
    4. -
    5. The default host, "localhost".
    6. -
    -

    Example

    -
    -#include <cups/cups.h>
    -
    -const char *server;
    -
    -server = cupsServer();
    -
    -

    See Also

    -

    cupsGetPassword(), - cupsSetPasswordCB(), -cupsSetServer(), cupsSetUser() -, cupsUser() - -

    -

    cupsSetDests()

    -

    Usage

    -
    -void
    -cupsSetDests(int         num_dests,
    -             cups_dest_t *dests);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    num_destsNumber of destinations.
    destsArray of destinations.
    -
    -

    Description

    -

    cupsSetDests() saves the destination array to disk. If - the current UID is 0, the destinations are saved in the - /etc/cups/lpoptions file, otherwise they are saved in the - ~/.lpoptions file. This function is typically used to save the - default options and instances that are set by the user.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -
    -...
    -
    -cupsSetDests(num_dests, dests);
    -
    -

    See Also

    -

    cupsGetDests() - -

    -

    cupsSetEncryption()

    -

    Usage

    -
    -void
    -cupsSetEncryption(http_encryption_t encryption);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    encryptionThe type of encryption to use.
    -
    -

    Description

    -

    cupsSetEncryption() sets the default type of encryption - to use when connecting with the print server.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
    -
    -

    See Also

    -

    cupsEncryption() - -

    -

    cupsSetPasswordCB()

    -

    Usage

    -
    -void
    -cupsSetPasswordCB(const char *(*cb)(const char *prompt));
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    cbThe password callback function.
    -
    -

    Description

    -

    cupsSetPasswordCB() sets the callback function to use - when asking the user for a password. The callback function must accept - a single character string pointer (the prompt string) and return -NULL if the user did not enter a password string or a pointer to - the password string otherwise.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -const char *
    -my_password_cb(const char *prompt)
    -{
    -  return (getpass(prompt));
    -}
    -
    -...
    -
    -char *password;
    -
    -...
    -
    -cupsSetPasswordCB(my_password_cb);
    -password = cupsGetPassword("Please enter a password:");
    -
    -

    See Also

    -

    cupsServer(), - cupsSetServer(), -cupsSetUser(), cupsUser() - - -

    -

    cupsSetServer()

    -

    Usage

    -
    -void
    -cupsSetServer(const char *server);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    serverThe default server to use.
    -
    -

    Description

    -

    cupsSetServer() sets the default server to use for the - CUPS API. If the server argument is NULL, the - default server is used.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -cupsSetServer("foo.bar.com");
    -
    -

    See Also

    -

    cupsServer(), - cupsSetPasswordCB(), -cupsSetUser(), cupsUser() - - -

    -

    cupsSetUser()

    -

    Usage

    -
    -void
    -cupsSetUser(const char *user);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    userThe user name string to use.
    -
    -

    Description

    -

    cupsSetUser() sets the default user name for - authentication. If the user argument is NULL - then the current login user is used.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -...
    -
    -cupsSetUser("root");
    -
    -

    See Also

    -

    cupsServer(), - cupsSetPasswordCB(), -cupsSetServer(), cupsUser() - - -

    -

    cupsTempFd()

    -

    Usage

    -
    -int
    -cupsTempFd(char *filename,
    -           int  length);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    filenameThe character string to hold the temporary - filename.
    lengthThe size of the filename string in bytes.
    -
    -

    Returns

    -

    A file descriptor open for reading and writing.

    -

    Description

    -

    cupsTempFd() create a temporary filename in the - /var/tmp directory or the directory specified by the TMPDIR - environment variable.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -int  fd;
    -char filename[256];
    -
    -fd = cupsTempFd(filename, sizeof(filename));
    -
    -

    See Also

    -

    cupsTempFile() - -

    -

    cupsTempFile()

    -

    Usage

    -
    -char *
    -cupsTempFile(char *filename,
    -             int  length);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    filenameThe character string to hold the temporary - filename.
    lengthThe size of the filename string in bytes.
    -
    -

    Returns

    -

    A pointer to filename.

    -

    Description

    -

    cupsTempFile() creates a temporary filename in the - /var/tmp directory or the directory specified by the TMPDIR - environment variable.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -char filename[256];
    -
    -cupsTempFile(filename, sizeof(filename));
    -
    -

    See Also

    -

    cupsTempFd() - -

    -

    cupsUser()

    -

    Usage

    -
    -const char *
    -cupsUser(void);
    -
    -

    Returns

    -

    A pointer to the current username or NULL if the user ID - is undefined.

    -

    Description

    -

    cupsUser() returns the name associated with the current - user ID as reported by the getuid() system call.

    -

    Example

    -
    -#include <cups/cups.h>
    -
    -const char *user;
    -
    -user = cupsUser();
    -
    -

    See Also

    -

    cupsGetPassword(), - cupsServer() - -

    -

    httpBlocking()

    -

    Usage

    -
    -void
    -httpBlocking(http_t *http,
    -             int    blocking)
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    blocking0 if the connection should be non-blocking, 1 - if it should be blocking
    -
    -

    Description

    -

    The httpBlocking() function sets the blocking mode for - the HTTP connection. By default HTTP connections will block (stop) the - client program until data is available or can be sent to the server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnect("server", port);
    -httpBlocking(http, 0);
    -
    -

    See Also

    - httpCheck(), - httpConnect() - - -

    httpCheck()

    -

    Usage

    -
    -int
    -httpCheck(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Returns

    -

    0 if there is no data pending, 1 otherwise.

    -

    Description

    -

    The httpCheck() function checks to see if there is any - data pending on an HTTP connection.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -if (httpCheck(http))
    -{
    -  ... do something ...
    -}
    -
    -

    See Also

    - httpBlocking(), - httpConnect(), httpGets() -, httpRead() - - -

    httpClearFields()

    -

    Usage

    -
    -void
    -httpClearFields(http_t *http)
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Description

    -

    The httpClearFields() function clears all HTTP request - fields for the HTTP connection.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpClearFields(http);
    -
    -

    See Also

    - httpConnect(), - httpGetField(), -httpSetField() - - -

    httpClose()

    -

    Usage

    -
    -void
    -httpClose(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Description

    -

    The httpClose() function closes an active HTTP - connection.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpClose(http);
    -
    -

    See Also

    - httpConnect() - - -

    httpConnect()

    -

    Usage

    -
    -http_t *
    -httpConnect(const char *hostname,
    -            int        port);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    hostnameThe name or IP address of the server to connect - to
    portThe port number to use
    -
    -

    Returns

    -

    A pointer to a HTTP connection structure or NULL if the connection - could not be made.

    -

    Description

    -

    The httpConnect() function opens a HTTP connection to - the specified server and port.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnect(cupsServer(), ippPort());
    -
    -

    See Also

    - httpClose(), - httpConnectEncrypt(), -httpGet(), httpGets(), - httpPost(), httpRead() -, httpWrite() - - -

    httpConnectEncrypt()

    -

    Usage

    -
    -http_t *
    -httpConnectEncrypt(const char        *hostname,
    -                   int               port,
    -                   http_encryption_t encryption);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    hostnameThe name or IP address of the server to connect - to
    portThe port number to use
    encryptionThe level of encryption to use
    -
    -

    Returns

    -

    A pointer to a HTTP connection structure or NULL if the connection - could not be made.

    -

    Description

    -

    The httpConnectEncrypt() function opens a HTTP - connection to the specified server, port, and encryption.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
    -
    -

    See Also

    - httpClose(), - httpConnect(), httpGet() -, httpGets(), - httpPost(), httpRead() -, httpWrite() - - -

    httpDecode64()

    -

    Usage

    -
    -char *
    -httpDecode64(char       *out,
    -             const char *in);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    outThe output string
    inThe input string
    -
    -

    Returns

    -

    A pointer to the decoded string.

    -

    Description

    -

    The httpDecode64() function decodes a base-64 encoded - string to the original string.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -char encoded_string[255];
    -char original_string[255];
    -
    -httpDecode64(original_string, encoded_string);
    -
    -

    See Also

    - httpEncode64() - - -

    httpDelete()

    -

    Usage

    -
    -int
    -httpDelete(http_t     *http,
    -           const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to delete
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpDelete() function sends a HTTP DELETE request to - the server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpDelete(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpEncode64()

    -

    Usage

    -
    -char *
    -httpEncode64(char       *out,
    -             const char *in);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    outThe output string
    inThe input string
    -
    -

    Returns

    -

    A pointer to the encoded string.

    -

    Description

    -

    The httpEncode64() function decodes a base-64 encoded - string to the original string.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -char encoded_string[255];
    -char original_string[255];
    -
    -httpEncode64(encoded_string, original_string);
    -
    -

    See Also

    - httpDecode64() - - -

    httpEncryption()

    -

    Usage

    -
    -int
    -httpEncryption(http_t            *http,
    -               http_encryption_t encryption);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection.
    encryptionThe desired level of encryption.
    -
    -

    Returns

    -

    0 on success, -1 on error.

    -

    Description

    -

    httpEncryption() sets the encryption level for the HTTP - connection.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
    -
    -

    See Also

    -

    httpConnectEncrypt() - -

    -

    httpError()

    -

    Usage

    -
    -int
    -httpError(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Returns

    -

    The last error that occurred or 0 if no error has occurred.

    -

    Description

    -

    The httpError() function returns the last error that - occurred on the HTTP connection.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -if (httpError(http))
    -{
    -  ... show an error message ...
    -}
    -
    -

    See Also

    - httpConnect() - - -

    httpFlush()

    -

    Usage

    -
    -void
    -httpFlush(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Description

    -

    The httpFlush() function flushes any remaining data left - from a GET or POST operation.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpFlush(http);
    -
    -

    See Also

    - httpConnect(), - - -

    httpGet()

    -

    Usage

    -
    -int
    -httpGet(http_t     *http,
    -        const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to get
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpGet() function sends a HTTP GET request to the - server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpGet(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpGets()

    -

    Usage

    -
    -char *
    -httpGets(char   *line,
    -         int    length,
    -         http_t *http)
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    lineThe string to fill with a line from the HTTP - connection
    lengthThe maximum length of the string
    httpThe HTTP connection
    -
    -

    Returns

    -

    A pointer to the string or NULL if no line could be retrieved.

    -

    Description

    -

    The httpGets() function is used to read a request line - from the HTTP connection. It is not normally used by a client program.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char   line[1024];
    -
    -if (httpGets(line, sizeof(line), http))
    -{
    -  ... process the line ...
    -}
    -
    -

    See Also

    - httpConnect(), - httpUpdate() - - -

    httpGetDateString()

    -

    Usage

    -
    -const char *
    -httpGetDateString(time_t time)
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    timeThe UNIX date/time value
    -
    -

    Returns

    -

    A pointer to a static string containing the HTTP date/time string for - the specified UNIX time value.

    -

    Description

    -

    The httpGetDateString() function generates a date/time - string suitable for HTTP requests from a UNIX time value.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -puts(httpGetDateString(time(NULL)));
    -
    -

    See Also

    - httpGetDateTime() - - -

    httpGetDateTime()

    -

    Usage

    -
    -time_t
    -httpGetDateTime(const char *date)
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    dateThe HTTP date/time string
    -
    -

    Returns

    -

    A UNIX time value.

    -

    Description

    -

    The httpGetDateTime() function converts a HTTP date/time - string to a UNIX time value.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -printf("%d\n", httpGetDateTime("Fri, 30 June 2000 12:34:56 GMT"));
    -
    -

    See Also

    - httpGetDateString() - - -

    httpGetField()

    -

    Usage

    -
    -const char *
    -httpGetField(http_t       *http,
    -             http_field_t field);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    fieldThe HTTP field
    -
    -

    Returns

    -

    A pointer to the field value string.

    -

    Description

    -

    The httpGetField() function returns the current value - for the specified HTTP field.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    -puts(httpGetField(http, HTTP_FIELD_CONTENT_TYPE));
    -
    -

    See Also

    - httpConnect(), - httpGetSubField(), -httpSetField() - - -

    httpGetHostByName()

    -

    Usage

    -
    -struct hostent	*
    -httpGetHostByName(const char *name);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    nameName or IP address to lookup.
    -
    -

    Returns

    -

    NULL if the host could not be found or a pointer to a host entry - containing one or more addresses.

    -

    Description

    -

    httpGetHostByName() is a portable wrapper around the -gethostbyname() function which handles both hostnames and IP - addresses.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -struct hostent *hostaddr;
    -
    -hostaddr = httpGetHostByName("foo.bar.com");
    -
    - - -

    httpGetLength()

    -

    Usage

    -
    -int
    -httpGetLength(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection.
    -
    -

    Returns

    -

    The content length of the response or MAX_INT if chunking is used.

    -

    Description

    -

    httpGetLength() returns the content length of a - response.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -printf("The length of the response is %d bytes.\n", httpGetLength(http));
    -
    -

    See Also

    -

    httpGet(), -httpPost() - -

    -

    httpGetSubField()

    -

    Usage

    -
    -const char *
    -httpGetSubField(http_t       *http,
    -                http_field_t field,
    -		const char   *name,
    -		char         *value);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    httpThe HTTP connection.
    fieldThe HTTP field.
    nameThe name of the subfield.
    valueThe string to hold the subfield value.
    -
    -

    Returns

    -

    A pointer to the subfield value string or NULL if it does not exist.

    -

    Description

    -

    The httpGetSubField() function returns a subfield value - from the specified HTTP field. The destination string buffer must be at - least HTTP_MAX_VALUE bytes in length.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char   value[HTTP_MAX_VALUE];
    -
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    -puts(httpGetSubField(http, HTTP_FIELD_CONTENT_TYPE, "charset", value));
    -
    -

    See Also

    - httpConnect(), - httpGetField(), -httpSetField() - - -

    httpHead()

    -

    Usage

    -
    -int
    -httpHead(http_t     *http,
    -         const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to head
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpHead() function sends a HTTP HEAD request to the - server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpHead(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpInitialize()

    -

    Usage

    -
    -void httpInitialize(void);
    -
    -

    Description

    -

    The httpInitialize() function initializes the networking - code as needed by the underlying platform. It is called automatically - by the httpConnect() function.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -httpInitialize();
    -
    -

    See Also

    - httpConnect() - - -

    httpMD5()

    -

    Usage

    -
    -char *
    -httpMD5(const char *username,
    -        const char *realm,
    -        const char *passwd,
    -        char       md5[33]);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    usernameThe authenticating user name.
    realmThe authenticating realm name.
    passwdThe authenticating password.
    md5The MD5 sum string.
    -
    -

    Returns

    -

    A pointer to the MD5 sum string.

    -

    Description

    -

    httpMD5() computes the MD5 hash of the username, realm, - and password as required by the HTTP Digest specification.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -char md5[33];
    -
    -...
    -
    -httpMD5("user", "realm", "password", md5);
    -
    -

    See Also

    -

    httpMD5Final(), - httpMD5String() - -

    -

    httpMD5Final()

    -

    Usage

    -
    -char *
    -httpMD5Final(const char *nonce,
    -             const char *method,
    -             const char *resource,
    -             char       md5[33]);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    nonceThe server nonce value.
    methodThe HTTP method (GET, POST, etc.)
    resourceThe resource path.
    md5The MD5 sum string.
    -
    -

    Returns

    -

    The MD5 sum string.

    -

    Description

    -

    httpMD5Final() appends the nonce, method, and resource - to the specified MD5 sum.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -char md5[33];
    -
    -...
    -
    -httpMD5Final("nonce", "GET", "/jobs", md5);
    -
    -

    See Also

    -

    httpMD5(), - httpMD5String() - -

    -

    httpMD5String()

    -

    Usage

    -
    -char *
    -httpMD5String(const md5_byte_t *sum,
    -              char             md5[33]);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    sumThe raw MD5 sum data.
    md5The MD5 sum string.
    -
    -

    Returns

    -

    The MD5 sum string.

    -

    Description

    -

    httpMD5String() converts the raw MD5 sum value to a - string.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -md5_byte_t sum[16];
    -char       md5[33];
    -
    -...
    -
    -httpMD5String(sum, md5);
    -
    -

    See Also

    -

    httpMD5(), - httpMD5Final() - -

    -

    httpOptions()

    -

    Usage

    -
    -int
    -httpOptions(http_t     *http,
    -            const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to check for options
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpOptions() function sends a HTTP OPTIONS request - to the server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpOptions(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpPost()

    -

    Usage

    -
    -int
    -httpPost(http_t     *http,
    -         const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to post to
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpPost() function sends a HTTP POST request to the - server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpPost(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpPrintf()

    -

    Usage

    -
    -int
    -httpPrintf(http_t     *http,
    -           const char *format,
    -           ...);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    formatA printf-style format string
    -
    -

    Returns

    -

    The number of bytes written.

    -

    Description

    -

    The httpPrintf() function sends a formatted string to - the HTTP connection. It is normally only used by the CUPS API and - scheduler.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpPrintf(http, "GET / HTTP/1.1 \r\n");
    -
    -

    See Also

    - httpConnect() - - -

    httpPut()

    -

    Usage

    -
    -int
    -httpPut(http_t     *http,
    -        const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to put
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpPut() function sends a HTTP PUT request to the - server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpDelete(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpRead()

    -

    Usage

    -
    -int
    -httpRead(http_t *http,
    -         char   *buffer,
    -         int    length);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    bufferThe buffer to read into
    lengthThe number of bytes to read
    -
    -

    Returns

    -

    The number of bytes read or -1 on error.

    -

    Description

    -

    The httpRead() function reads data from the HTTP - connection, possibly the result of a GET or POST request.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char buffer[1024];
    -int  bytes;
    -
    -httpGet(http, "/");
    -while (httpUpdate(http) != HTTP_CONTINUE);
    -while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
    -{
    -  buffer[bytes] = '\0';
    -  fputs(buffer, stdout);
    -}
    -
    -

    See Also

    - httpConnect(), - httpWrite() - - -

    httpReconnect()

    -

    Usage

    -
    -int
    -httpReconnect(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpReconnect() function reconnects to the HTTP - server. This is usually done automatically if the HTTP functions detect - that the server connection has terminated.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpReconnect(http);
    -
    -

    See Also

    - httpConnect() - - -

    httpSeparate()

    -

    Usage

    -
    -void
    -httpSeparate(const char *uri,
    -             char       *method,
    -             char       *username,
    -             char       *host,
    -             int        *port,
    -             char       *resource);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    uriThe URI to separate
    methodThe method (scheme) of the URI
    usernameThe username (and password) portion of the URI, - if any
    hostThe hostname portion of the URI, if any
    portThe port number for the URI, either as specified or - as default for the method/scheme
    resourceThe resource string, usually a filename on the - server
    -
    -

    Description

    -

    The httpSeparate() function separates the specified URI - into its component parts. The method, username, hostname, and resource - strings should be at least HTTP_MAX_URI characters long to - avoid potential buffer overflow problems.

    -

    Example

    -
    -char uri[HTTP_MAX_URI];
    -char method[HTTP_MAX_URI];
    -char username[HTTP_MAX_URI];
    -char host[HTTP_MAX_URI];
    -char resource[HTTP_MAX_URI];
    -int  port;
    -
    -...
    -
    -httpSeparate(uri, method, username, host, &port, resource);
    -
    -

    See Also

    - httpConnect() - - -

    httpSetField()

    -

    Usage

    -
    -void
    -httpSetField(http_t       *http,
    -             http_field_t field,
    -             const char   *value);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    fieldThe HTTP field
    valueThe string value for the field
    -
    -

    Description

    -

    The httpSetField() function sets the current value for - the specified HTTP field.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpSetField(http, HTTP_FIELD_AUTHORIZATION, "Basic dfdr34453454325"));
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    -

    See Also

    - httpConnect(), - httpGetField() - - -

    httpStatus()

    -

    Usage

    -
    -const char *
    -httpStatus(http_status_t status);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    statusThe HTTP status code from the server.
    -
    -

    Returns

    -

    The standard HTTP status text associated with the status code.

    -

    Description

    -

    httpStatus() returns the standard HTTP status text - associated with the status code.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -puts(httpStatus(http->status));
    -
    - - -

    httpTrace()

    -

    Usage

    -
    -int
    -httpTrace(http_t     *http,
    -          const char *uri);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to trace
    -
    -

    Returns

    -

    0 on success, non-zero on failure.

    -

    Description

    -

    The httpTrace() function sends a HTTP TRACE request to - the server.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpTrace(http, "/some/uri");
    -
    -

    See Also

    - httpConnect(), - httpSetField(), -httpUpdate() - - -

    httpUpdate()

    -

    Usage

    -
    -http_status_t
    -httpUpdate(http_t *http);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    httpThe HTTP connection
    -
    -

    Returns

    -

    The HTTP status of the current request.

    -

    Description

    -

    The httpUpdate() function updates the current request - status. It is used after any DELETE, GET, HEAD, OPTIONS, POST, PUT, or - TRACE request to finalize the HTTP request and retrieve the request - status.

    -

    Since proxies and the current blocking mode can cause the request to - take longer, programs should continue calling httpUpdate() -until the return status is not the constant value HTTP_CONTINUE -.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -http_status_t status;
    -
    -httpGet(http, "/some/uri");
    -while ((status = httpUpdate(http)) == HTTP_CONTINUE);
    -printf("Request status is %d\n", status);
    -
    -

    See Also

    - httpConnect(), - httpDelete(), httpGet() -, httpHead(), - httpOptions(), httpPost() -, httpPut(), - httpTrace() - - -

    httpWrite()

    -

    Usage

    -
    -int
    -httpWrite(http_t *http,
    -          char   *buffer,
    -          int    length);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    bufferThe buffer to read into
    lengthThe number of bytes to read
    -
    -

    Returns

    -

    The number of bytes read or -1 on error.

    -

    Description

    -

    The httpWrite() function reads data from the HTTP - connection, possibly the result of a GET or POST request.

    -

    Example

    -
    -#include <cups/http.h>
    -
    -http_t *http;
    -FILE *fp;
    -char buffer[1024];
    -int  bytes;
    -
    -httpPost(http, "/");
    -
    -while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
    -  httpWrite(http, buffer, bytes);
    -
    -while (httpUpdate(http) != HTTP_CONTINUE);
    -
    -while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
    -{
    -  buffer[bytes] = '\0';
    -  fputs(buffer, stdout);
    -}
    -
    -

    See Also

    - httpConnect(), - httpRead() - - -

    ippAddBoolean()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddBoolean(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              const char *name,
    -	      char       value);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    valueThe boolean value
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddBoolean() function adds a single boolean - attribute value to the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "my-jobs", 1);
    -
    -

    See Also

    - ippAddBooleans(), - ippAddDate(), -ippAddInteger(), -ippAddIntegers(), ippAddRange() -, ippAddRanges(), - ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddBooleans()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddBooleans(ipp_t      *ipp,
    -               ipp_tag_t  group,
    -               const char *name,
    -               int        num_values,
    -               const char *values);
    -
    -

    Arguments

    -
    - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of values
    valuesThe boolean values
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddBooleans() function adds one or more boolean - attribute values to the specified IPP request. If the values - pointer is NULL then an array of num_values - false values is created.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -char values[10];
    -
    -ippAddBooleans(ipp, IPP_TAG_OPERATION, "some-attribute", 10, values);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddDate(), -ippAddInteger(), -ippAddIntegers(), ippAddRange() -, ippAddRanges(), - ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddDate()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddDate(ipp_t       *ipp,
    -           ipp_tag_t   group,
    -           const char  *name,
    -           ipp_uchar_t *value);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    valueThe date value
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddDate() function adds a single date-time - attribute value to the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddDate(ipp, IPP_TAG_OPERATION, "some-attribute", 
    -           ippTimeToDate(time(NULL));
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddInteger(), -ippAddIntegers(), ippAddRange() -, ippAddRanges(), - ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings(), -ippTimeToDate() - - -

    ippAddInteger()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddInteger(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              ipp_tag_t  tag,
    -              const char *name,
    -              int        value);
    -
    -

    Arguments

    -
    - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of integer value (IPP_TAG_INTEGER or - IPP_TAG_ENUM)
    nameThe name of attribute
    valueThe integer value
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddInteger() function adds a single integer - attribute value to the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddInteger(ipp, IPP_TAG_OPERATION, "limit", 100);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), -ippAddIntegers(), ippAddRange() -, ippAddRanges(), - ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddIntegers()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddIntegers(ipp_t      *ipp,
    -               ipp_tag_t  group,
    -               ipp_tag_t  tag,
    -               const char *name,
    -               int        num_values,
    -               const int  *values);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of integer value (IPP_TAG_INTEGER or - IPP_TAG_ENUM)
    nameThe name of attribute
    num_valuesThe number of values
    valuesThe integer values
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddIntegers() function adds one or more integer - attribute values to the specified IPP request. If the values - pointer is NULL then an array of num_values 0 - values is created.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int values[100];
    -
    -ippAddIntegers(ipp, IPP_TAG_OPERATION, "some-attribute", 100, values);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddRange(), - ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddRange()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddRange(ipp_t      *ipp,
    -            ipp_tag_t  group,
    -            const char *name,
    -            int        low,
    -            int        high);
    -
    -

    Arguments

    -
    - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    lowThe lower value
    highThe higher value
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddRange() function adds a single range attribute - value to the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddRange(ipp, IPP_TAG_OPERATION, "page-ranges", 1, 10);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddRanges()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddRanges(ipp_t      *ipp,
    -             ipp_tag_t  group,
    -             const char *name,
    -             int        num_values,
    -             const int  *lows,
    -             const int  *highs);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of range values
    lowsThe lower values
    highsThe higher values
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddRanges() function adds one or more range - attribute values to the specified IPP request. If the values - pointer is NULL then an array of num_values - 0,0 ranges is created.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int lows[2];
    -int highs[2];
    -
    -ippAddRanges(ipp, IPP_TAG_OPERATION, "page-ranges", 2, lows, highs);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddResolution()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddResolution(ipp_t      *ipp,
    -                 ipp_tag_t  group,
    -                 const char *name,
    -                 int        xres,
    -                 int        yres,
    -                 ipp_res_t  units);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    xresThe horizontal resolution
    yresThe vertical resolution
    unitsThe resolution units
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddResolution() function adds a single resolution - attribute value to the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolution",
    -              720, 720, IPP_RES_PER_INCH);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddRanges(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddResolutions()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddResolutions(ipp_t           *ipp,
    -                  ipp_tag_t       group,
    -                  const char      *name,
    -                  int             num_values,
    -                  const int       *xres,
    -                  const int       *yres,
    -                  const ipp_res_t *units);
    -
    -

    Arguments

    -
    - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of resolution values
    xresThe horizontal resolutions
    yresThe vertical resolutions
    unitsThe resolution units
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddResolutions() function adds one or more - resolution attribute values to the specified IPP request. If the -values pointer is NULL then an array of -num_values 0,0 resolutions is created.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int xres[5];
    -int yres[5];
    -ipp_res_t units[5];
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolutions-supported",
    -              5, xres, yres, units);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddSeparator()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddSeparator(ipp_t *ipp);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ippThe IPP request
    -
    -

    Returns

    -

    A pointer to the new separator or NULL if the separator could not be - created.

    -

    Description

    -

    The ippAddSeparator() function adds a group separator to - the specified IPP request.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddSeparator(ipp);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddString(), -ippAddStrings() - - -

    ippAddString()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddString(ipp_t      *ipp,
    -             ipp_tag_t  group,
    -             ipp_tag_t  tag,
    -             const char *name,
    -             const char *charset,
    -             const char *value);
    -
    -

    Arguments

    -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of string value
    nameThe name of attribute
    charsetThe character set for the string
    valueThe string value
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddString() function adds a single string - attribute value to the specified IPP request. For -IPP_TAG_NAMELANG and IPP_TAG_TEXTLANG strings, the - charset value is provided with the string to identify the string - encoding used. Otherwise the charset value is ignored.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
    -             NULL, "abc123");
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddStrings() - - -

    ippAddStrings()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippAddStrings(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              ipp_tag_t  tag,
    -              const char *name,
    -              int        num_values,
    -              const char *charset,
    -              const char **values);
    -
    -

    Arguments

    -
    - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of string value
    nameThe name of attribute
    num_valuesThe number of strings
    charsetThe character set for the strings
    valuesThe string values
    -
    -

    Returns

    -

    A pointer to the new attribute or NULL if the attribute could not be - created.

    -

    Description

    -

    The ippAddStrings() function adds one or more string - attribute values to the specified IPP request. For -IPP_TAG_NAMELANG and IPP_TAG_TEXTLANG strings, the - charset value is provided with the strings to identify the string - encoding used. Otherwise the charset value is ignored. If the -values pointer is NULL then an array of -num_values NULL strings is created.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -char *values[2] = { "one", "two" };
    -
    -ippAddStrings(ipp, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "attr-name",
    -              2, NULL, values);
    -
    -

    See Also

    - ippAddBoolean(), - ippAddBooleans(), -ippAddDate(), ippAddInteger() -, ippAddIntegers(), - ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString() - - -

    ippDateToTime()

    -

    Usage

    -
    -time_t
    -ippDateToTime(const ipp_uchar_t date[11]);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    dateThe IPP date-time value
    -
    -

    Returns

    -

    A UNIX time value.

    -

    Description

    -

    The ippDateToTime() function converts an IPP date-time - value to a UNIX time value.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_uchar_t date[11];
    -
    -printf("UNIX time is %d\n", ippDateToTime(date));
    -
    -

    See Also

    - ippTimeToDate() - - -

    ippDelete()

    -

    Usage

    -
    -void
    -ippDelete(ipp_t *ipp);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ippThe IPP request or response
    -
    -

    Description

    -

    The ippDelete() function deletes all memory used by an - IPP request or response.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippDelete(ipp);
    -
    -

    See Also

    - ippNew() - - -

    ippErrorString()

    -

    Usage

    -
    -const char *
    -ippErrorString(ipp_status_t error);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    errorIPP error code.
    -
    -

    Returns

    -

    The standard text representation of the IPP error code.

    -

    Description

    -

    ippErrorString() returns the standard text - representation of the IPP error code.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -puts(ippErrorString(IPP_OK));
    -
    -

    See Also

    -

    cupsLastError() - -

    -

    ippFindAttribute()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippFindAttribute(ipp_t      *ipp,
    -                 const char *name,
    -                 ipp_tag_t  tag);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    nameThe name of the attribute
    tagThe required value tag for the attribute or -IPP_TAG_ZERO for any type of value.
    -
    -

    Returns

    -

    A pointer to the first occurrence of the requested attribute, or -NULL if it was not found.

    -

    Description

    -

    ippFindAttribute() finds the first occurrence of the - named attribute. The tag parameter restricts the search to - a specific value type - use IPP_TAG_ZERO to find any value - with the name.

    -

    The value tags IPP_TAG_NAME and IPP_TAG_TEXT - match the name/text values with or without the language code.

    -

    Example

    -
    -ipp_attribute_t *attr;
    -
    -attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -while (attr != NULL)
    -{
    -  puts(attr->values[0].string.text);
    -
    -  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -}
    -
    -

    See Also

    - cupsDoFileRequest(), - cupsDoRequest(), -ippDelete(), -ippFindNextAttribute(), ippNew() - - - -

    ippFindNextAttribute()

    -

    Usage

    -
    -ipp_attribute_t *
    -ippFindNextAttribute(ipp_t      *ipp,
    -                     const char *name,
    -                     ipp_tag_t  tag);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    nameThe name of the attribute
    tagThe required value tag for the attribute or -IPP_TAG_ZERO for any type of value.
    -
    -

    Returns

    -

    A pointer to the next occurrence of the requested attribute, or -NULL if it was not found.

    -

    Description

    -

    ippFindNextAttribute() finds the next occurrence of the - named attribute. The tag parameter restricts the search to - a specific value type - use IPP_TAG_ZERO to find any value - with the name.

    -

    The value tags IPP_TAG_NAME and IPP_TAG_TEXT - match the name/text values with or without the language code.

    -

    Example

    -
    -ipp_attribute_t *attr;
    -
    -attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -while (attr != NULL)
    -{
    -  puts(attr->values[0].string.text);
    -
    -  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -}
    -
    -

    See Also

    - cupsDoFileRequest(), - cupsDoRequest(), -ippDelete(), -ippFindNextAttribute(), ippNew() - - - -

    ippLength()

    -

    Usage

    -
    -int
    -ippLength(ipp_t *ipp);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ippThe IPP request or response
    -
    -

    Returns

    -

    The total encoded length of the IPP request or response in bytes.

    -

    Description

    -

    ippLength() returns the length of the IPP request or - response in bytes.

    -

    Example

    -
    -printf("The length of the response is %d bytes.\n", ippLength(response));
    -
    -

    See Also

    - ippDelete(), -ippNew() - - -

    ippNew()

    -

    Usage

    -
    -ipp_t *
    -ippNew(void);
    -
    -

    Returns

    -

    A pointer to a new IPP request or response.

    -

    Description

    -

    The ippNew() function creates a new IPP request or - response.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ipp = ippNew();
    -
    -

    See Also

    - ippDelete() - - -

    ippPort()

    -

    Usage

    -
    -int
    -ippPort(void);
    -
    -

    Returns

    -

    The default TCP/IP port number for IPP requests.

    -

    Description

    -

    The ippPort() function returns the default IPP port - number for requests.

    -

    Example

    -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -
    -http = httpConnect(cupsServer(), ippPort());
    -
    -

    See Also

    - cupsServer(), - ippSetPort() - - -

    ippRead()

    -

    Usage

    -
    -ipp_state_t
    -ippRead(http_t *http,
    -        ipp_t  *ipp);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    ippThe IPP request or response
    -
    -

    Returns

    -

    The current read state.

    -

    Description

    -

    The ippRead() function reads IPP attributes from the - specified HTTP connection. Programs should continue calling -ippRead() until IPP_ERROR or IPP_DATA - is returned.

    -

    Example

    -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -ipp_t *ipp;
    -ipp_state_t status;
    -
    -ipp = ippNew();
    -
    -while ((status = ippRead(http, ipp)) != IPP_ERROR)
    -  if (status == IPP_DATA)
    -    break;
    -
    -if (status == IPP_DATA)
    -{
    -  ... read additional non-IPP data using httpRead() ...
    -}
    -
    -

    See Also

    - ippWrite() - - -

    ippSetPort()

    -

    Usage

    -
    -void
    -ippSetPort(int port);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    portThe port number to use
    -
    -

    Description

    -

    The ippSetPort() function sets the default IPP port - number for requests.

    -

    Example

    -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -...
    -
    -ippSetPort(8631);
    -
    -

    See Also

    - ippPort() - - -

    ippTimeToDate()

    -

    Usage

    -
    -ipp_uchar_t *
    -ippTimeToDate(time_t time);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    timeThe UNIX time value
    -
    -

    Returns

    -

    A static pointer to an IPP date-time value.

    -

    Description

    -

    The ippTimeToDate() function converts a UNIX time to an - IPP date-time value.

    -

    Example

    -
    -#include <cups/ipp.h>
    -
    -ipp_uchar_t *date;
    -
    -date = ippTimeToDate(time(NULL));
    -
    -

    See Also

    - ippDateToTime() - - -

    ippWrite()

    -

    Usage

    -
    -ipp_state_t
    -ippWrite(http_t *http,
    -         ipp_t  *ipp);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    httpThe HTTP connection
    ippThe IPP request or response
    -
    -

    Returns

    -

    The current write state.

    -

    Description

    -

    The ippWrite() function writes IPP attributes to the - specified HTTP connection. Programs should continue calling -ippWrite() until IPP_ERROR or IPP_DATA - is returned.

    -

    Example

    -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -ipp_t *ipp;
    -ipp_state_t status;
    -
    -ipp = ippNew();
    -... add attributes ...
    -
    -while ((status = ippWrite(http, ipp)) != IPP_ERROR)
    -  if (status == IPP_DATA)
    -    break;
    -
    -if (status == IPP_DATA)
    -{
    -  ... read additional non-IPP data using httpWrite() ...
    -}
    -
    -

    See Also

    - ippRead() - - -

    ppdClose()

    -

    Usage

    -
    -void
    -ppdClose(ppd_file_t *ppd);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ppdThe PPD file
    -
    -

    Description

    -

    The ppdClose() function frees all memory associated with - the PPD file.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdClose(ppd);
    -
    -

    See Also

    - ppdOpen(), -ppdOpenFd(), ppdOpenFile() - - - -

    ppdCollect()

    -

    Usage

    -
    -int
    -ppdCollect(ppd_file_t    *ppd,
    -           ppd_section_t section,
    -           ppd_choice_t  ***choices);
    -
    -

    Arguments

    -
    - - - - - - -
    ArgumentDescription
    ppdThe PPD file.
    sectionThe document section to collect.
    choicesThe array of option choices that are marked.
    -
    -

    Returns

    -

    The number of options collected.

    -

    Description

    -

    ppdCollect() collects all of the marked options in the - specified section, sorts them by their order dependency values, and - returns an array that can be used to emit option commands in the proper - order. It is normally used by the ppdEmit*() functions.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t   *ppd;
    -int          num_choices;
    -ppd_choice_t **choices;
    -
    -...
    -
    -num_choices = ppdCollect(ppd, PPD_ORDER_JCL, &choices);
    -
    -

    See Also

    -

    ppdEmit(), -ppdEmitFd(), ppdEmitJCL() - - -

    -

    ppdConflicts()

    -

    Usage

    -
    -int
    -ppdConflicts(ppd_file_t *ppd);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ppdThe PPD file
    -
    -

    Returns

    -

    The number of option conflicts in the file.

    -

    Description

    -

    The ppdConflicts() function returns the number of - conflicts with the currently selected options.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("%d conflicts\n", ppdConflicts(ppd));
    -
    -

    See Also

    - cupsMarkOptions(), - ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdEmit()

    -

    Usage

    -
    -int
    -ppdEmit(ppd_file_t    *ppd,
    -        FILE          *file,
    -        ppd_section_t section);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ppdThe PPD file
    fileThe file to write to
    sectionThe option section to write
    -
    -

    Returns

    -

    0 on success, -1 on error.

    -

    Description

    -

    The ppdEmit() function sends printer-specific option - commands to the specified file.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdEmit(ppd, stdout, PPD_ORDER_PAGE);
    -
    -

    See Also

    - ppdEmitFd() - - -

    ppdEmitFd()

    -

    Usage

    -
    -int
    -ppdEmitFd(ppd_file_t    *ppd,
    -          int           fd,
    -          ppd_section_t section);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ppdThe PPD file
    fdThe file descriptor to write to
    sectionThe option section to write
    -
    -

    Returns

    -

    0 on success, -1 on error.

    -

    Description

    -

    The ppdEmitFd() function sends printer-specific option - commands to the specified file descriptor.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdEmitFd(ppd, 1, PPD_ORDER_PAGE);
    -
    -

    See Also

    - ppdEmit() - - -

    ppdFindChoice()

    -

    Usage

    -
    -ppd_choice_t *
    -ppdFindChoice(ppd_option_t *option,
    -              const char   *choice);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    optionA pointer to the option
    choiceThe name of the choice
    -
    -

    Returns

    -

    A pointer to the choice data or NULL if the choice does not exist.

    -

    Description

    -

    The ppdFindChoice() function returns a pointer to the - choice data for the specified option.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_option_t *option;
    -ppd_choice_t *choice;
    -
    -option = ppdFindOption(ppd, "PageSize");
    -choice = ppdFindChoice(option, "Letter");
    -
    -

    See Also

    - ppdFindMarkedChoice(), ppdFindOption() - - -

    ppdFindMarkedChoice()

    -

    Usage

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

    Arguments

    -
    - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    -
    -

    Returns

    -

    A pointer to the choice data or NULL if the choice does not exist or - is not marked.

    -

    Description

    -

    The ppdFindMarkedChoice() function returns a pointer to - the marked choice data for the specified option.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_choice_t *choice;
    -
    -choice = ppdFindMarkedChoice(ppd, "PageSize");
    -
    -

    See Also

    - ppdFindChoice(), - ppdFindOption() - - -

    ppdFindOption()

    -

    Usage

    -
    -ppd_option_t *
    -ppdFindOption(ppd_file_t *ppd,
    -              const char *keyword);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    -
    -

    Returns

    -

    A pointer to the option data or NULL if the option does not exist.

    -

    Description

    -

    The ppdFindOption() function returns a pointer to the - option data for the specified option.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_option_t *option;
    -
    -option = ppdFindOption(ppd, "PageSize");
    -
    -

    See Also

    - ppdFindChoice(), - ppdFindMarkedChoice() - - -

    ppdIsMarked()

    -

    Usage

    -
    -int
    -ppdIsMarked(ppd_file_t *ppd,
    -            const char *keyword,
    -            const char *choice);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    choiceThe name of the option choice
    -
    -

    Returns

    -

    1 if the choice is marked, 0 otherwise.

    -

    Description

    -

    The ppdIsMarked() function returns whether or not the - specified option choice is marked.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Letter size %s selected.\n",
    -       ppdIsMarked(ppd, "PageSize", "Letter") ? "is" : "is not");
    -
    -

    See Also

    - cupsMarkOptions(), - ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdMarkDefaults()

    -

    Usage

    -
    -void
    -ppdMarkDefaults(ppd_file_t *ppd);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    ppdThe PPD file
    -
    -

    Description

    -

    The ppdMarkDefaults() function marks all of the default - choices in the PPD file.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdMarkDefaults(ppd);
    -
    -

    See Also

    - cupsMarkOptions(), - ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdMarkOption()

    -

    Usage

    -
    -int
    -ppdMarkOption(ppd_file_t *ppd,
    -              const char *keyword,
    -              const char *choice);
    -
    -

    Arguments

    -
    - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    choiceThe name of the choice
    -
    -

    Returns

    -

    The number of conflicts in the PPD file.

    -

    Description

    -

    The ppdMarkOption() function marks the specified option - choice.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdMarkOption(ppd, "PageSize", "Letter");
    -
    -

    See Also

    - cupsMarkOptions(), - ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdOpen()

    -

    Usage

    -
    -ppd_file_t *
    -ppdOpen(FILE *file);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    fileThe file to read from
    -
    -

    Returns

    -

    A pointer to a PPD file structure or NULL if the PPD file could not - be read.

    -

    Description

    -

    The ppdOpen() function reads a PPD file from the - specified file into memory.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -FILE *file;
    -
    -file = fopen("filename.ppd", "rb");
    -ppd = ppdOpen(file);
    -fclose(file);
    -
    -

    See Also

    - ppdClose(), -ppdOpenFd(), ppdOpenFile() - - - -

    ppdOpenFd()

    -

    Usage

    -
    -ppd_file_t *
    -ppdOpenFd(int fd);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    fdThe file descriptor to read from
    -
    -

    Returns

    -

    A pointer to a PPD file structure or NULL if the PPD file could not - be read.

    -

    Description

    -

    The ppdOpenFd() function reads a PPD file from the - specified file descriptor into memory.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -int        fd;
    -
    -fd = open("filename.ppd", O_RDONLY);
    -ppd = ppdOpenFd(fd);
    -close(fd);
    -
    -

    See Also

    - ppdClose(), -ppdOpen(), ppdOpenFile() - - -

    ppdOpenFile()

    -

    Usage

    -
    -ppd_file_t *
    -ppdOpenFile(const char *filename);
    -
    -

    Arguments

    -
    - - - -
    ArgumentDescription
    filenameThe name of the file to read from
    -
    -

    Returns

    -

    A pointer to a PPD file structure or NULL if the PPD file could not - be read.

    -

    Description

    -

    The ppdOpenFile() function reads a PPD file from the - named file into memory.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppd = ppdOpenFile("filename.ppd");
    -
    -

    See Also

    - ppdClose(), -ppdOpen(), ppdOpenFd() - - -

    ppdPageLength()

    -

    Usage

    -
    -float
    -ppdPageLength(ppd_file_t *ppd,
    -              const char *name);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    -
    -

    Returns

    -

    The length of the specified page size in points or 0 if the page size - does not exist.

    -

    Description

    -

    The ppdPageLength() function returns the page length of - the specified page size.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Length = %.0f\n", ppdPageLength(ppd, "Letter"));
    -
    -

    See Also

    - ppdPageLength(), - ppdPageSize(), -ppdPageWidth() - - -

    ppdPageSize()

    -

    Usage

    -
    -ppd_size_t *
    -ppdPageSize(ppd_file_t *ppd,
    -            const char *name);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    -
    -

    Returns

    -

    A pointer to the page size record of the specified page size in - points or NULL if the page size does not exist.

    -

    Description

    -

    The ppdPageSize() function returns the page size record - for the specified page size.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_size_t *size;
    -
    -size = ppdPageSize(ppd, "Letter");
    -if (size != NULL)
    -{
    -  printf(" Width = %.0f\n", size->width);
    -  printf("Length = %.0f\n", size->length);
    -  printf("  Left = %.0f\n", size->left);
    -  printf(" Right = %.0f\n", size->right);
    -  printf("Bottom = %.0f\n", size->bottom);
    -  printf("   Top = %.0f\n", size->top);
    -}
    -
    -

    See Also

    - ppdPageLength(), - ppdPageWidth() - - -

    ppdPageWidth()

    -

    Usage

    -
    -float
    -ppdPageWidth(ppd_file_t *ppd,
    -             const char *name);
    -
    -

    Arguments

    -
    - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    -
    -

    Returns

    -

    The width of the specified page size in points or 0 if the page size - does not exist.

    -

    Description

    -

    The ppdPageWidth() function returns the page width of - the specified page size.

    -

    Example

    -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Width = %.0f\n", ppdPageWidth(ppd, "Letter"));
    -
    -

    See Also

    - ppdPageLength(), - ppdPageSize() - diff --git a/doc/spm.pdf b/doc/spm.pdf deleted file mode 100644 index f6a76cc2f661bfeb66fd1373795f5946062e0722..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 689586 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

    gwRHZ_lO)E1gpUG&&Ekk|&4Ssf0M0VHkgeun@ zI-mL`2ZRCK8ihzg7}l!3K*~ml#k$!CuHGuTN5!K-c#MTuV^~niioeuxN-ax97tzml ze)*(60e3#yNJ<&K7*2w~I-jW;^txiQy~?Y{{5F7;Ea+mW`?k`@aV|?{;A+4PuOFAr z*!C|1O7swVzk8X=Z}MJHxvD!QT9y1P3oYV~S;U`sL_RY+Tjb%VV~cX;rcH;vXUvX1 zthbuozo=i35c$QN;cSw5EUDd(cVm?DQMLw+NeqXCmQE$f&>q)qPykBI>RyVLF82Co zYQpE>Yq%#1F!tu|io$FgZY?;POCy|@*%`u`>`=DQPP=@o;9&D{+<9TpyFK5ErTGpz zB7P;Diix8`Hie)>%MTc67QqcESI+^T9F3cqP~oguX{Ssvm+bP+F|<`vrVrIAahNut zn>$OtCr_CM2$3zBUk8!7jej6@KYb)lg24b;vXmSrK9KqrEcQ%5+)-x2#&15eYHF3n zxuk10l&mX3&aEb{Z!m^==kii+gTk&ImWCeyx{|Z|E!Zc)at0Zi5@g}={*bq3^yPiD z8x=qUX2T8!36Xg{JU=^NRmjxFg8YYVgO{Z1wjVOAa=ZJLCulOc>P1_T@WpDktjpDj zEA6)U0GJ<-bmWeJQ%r*&?$pEQ_M^{NxT-|spJeaf?3r+||8J;9|Iak;UwXrbgX6yz zh>|sQZ8x}(y=Q7L4~><36|YF9#6O%o<2Pt$Y3sEyBEjy3q#LKY5>BP1?7wbaCgYNf zhTSz#X_YKE@J&soVINl30*+rB@;a#7yNl~NKRS6le@5VF(HnIh=B~bQX{j?X9^SH2 zj)oj8dAym6ZMw*sHkQOZ&uPk^1-MPwdgmd~5Dqbxd%l_4}5Ju7Qn!DMxa1)EW)#WD~8i|VlJbk#dN z*L#YnhHR!AR|iLe^@cg4~- zabsCblpDChu1H)o5VHgdLLMh`xtXc1=`Mu=(-sZqOTiX&iLet#!LXW%wbW33j<9zu zeYP-9lfkSk^=gpJO2yWrMPVe5_Y8*bid?1|AULvjDSx%F@Oj?}Id7o8q)W5%QydGrWV8kcC^nc9{1IVrn2#vhQ0S^)$hC{ zI6}-;G0l3RA(xr3lG79jMpsR z=0j@$kH32AS}kT{RI#XGS&%1hx`IF3=RvMzhAV}cqD`iio_x6()m6{Jy2X!QBhUSy zSqy?khk5g&GixA@=K&crYG2H!j!wBxA?Cnh6%!cT0j5-a- zKs&~et|gb&Hy69GVRLKQ%x0)rmuWtqDS-=8tqNW_QeER37H<+MjQ#a$CBQCWW;Hk- z<=kEc{7u{T><(zJ`>*&VAvr#o()G0nw)gCVTT*3$mz)J*9|57npG-IY@}EclK} z>af09lR+uK{9qzaDx`z+&#{0?*Bgn#D_t$$dm|q199?Mom6&x7r0N-|St<-10?Es+ zp^a7d9MAeU8&d^Jp$j6o0x!XeuN9)nQaQA^Km?Bj%Fo}NT(#*0iEuK3OW|Ir7>e6^ zBag=3B>0bXFfLs%D&6tW6Yp{ks+ph{j(ltbHy7N@FQz>mmUZtTgP{6d&yJ8vgy_&=YVQkCz1sQX+9)JX{&w8H(LM8P>$`@zR>V*O&^d>uT>25 zJ(oS){8It1a)wQ8J>KP=1!a*x+&c6)3S?Do5LtAlJsI|>c+AWu)hTnuLG;FHl8FIG zYA{LqEiqQeO4;4dj6!lBqc_4J5*`aQFRQq5*MWK5Qv-m05|rm^@N3=?aO ziRFU{OCW1t&9=oQTc<KU!npdQ8u`g3dVMlobF=68VVrdw$~p`vwpMp5`_^;==IQ~MBSh&6>wIO1%Yl9O7{ z$=mG1T(2F{d=F05w?X#@QSjlDP>QbAcH4frKu$AUygmDnXpNxK35jy*R0`cq*@w?} zHo2RRUOPuEn(IhUK6gm+o1fO$p5I!2UwoVVv-^8on{Qty3kdIjSGIESN9M*t$mjS~ zHY#f!X!s_NmXEeR{pr2mz7xB7e0)DwY{F_Z}4$l9dZN$Gcn#1`IQ8`=V|B1?1SQ+tN@mJ53V;tqC z^D+Rt1CVi$^?~Oj{xd7b6%cTzyEveUTpwMoHNgBhvXo-^Or3f4^+X<@ZVk+3 zB4DuOE(i~aM_y2SP?)F8m@s=##IO(h6#hw_S87Q)gkF$hLgS+l&s8C8N_-m|SeT2F zn?ZjA`@{FW@wga9ySGLQrK?n~W4cs-Q^bBhl#z@E$BTz89ncwBY*$ZGDCw;E=t>_c zw|97X7nDTS;METtl>*r-miqAU8KpaZQ-8``S4FBi%$69&ZH_&HB<={m<|t!Il5(u6 zWI5G9wb!8?8Pg1@yEv_2jwmy!LN-mMykb)Lc&`5aD=&JdlNNfRQOGtP+*+mOnebMV zmis%lX}(D;)eQ>~&9eBYJh|X8o_k?K=pB}My-KyNq{LNs-LY_P(tGqqB7I}BTsSe$P)EDG2-Pew9Vy1@PtgLM`Joe!1>`k`& zKR&;>QBj>pVWujXIoD8@{374mlhW@zIxHorO<6Tj#@wg`nH%lr++3u#YLgkPj%sY%Psvu0C=8FMp&}CP$NEVi`-9YVTnv0>Z?bL{v_e2hdft`b9`xy0v5$yCG2+L$ z$YwF?U#mbxiU+h(h&42-*+~k7+&a2bqPg`VjnQO@b)L+hBa>;;+YPyzo1=Ri`DUQ* z7y6Wg30eY?ZB+z>B?OLKx2kYsqMz#fcnPA2TYtbvnC zC}+FWrhKNJ?KYHs%wM1yQQ3LVP#(g0EpLj@@GBF?j_4``O(bH*OLS9I*lSOg5x}=#kT*zC%c{bded<{b|NABPz@W@&xKPntoT=ZUKP9%YnPpLa; zGt;jV7CG4-EqQS4z~T0(Bm+!iT?CyS1c}9CKO@OcK|`KE!!h~RNplLi5_ zoWxN0QHYUO&&*K?&4{&j-L!7Qw$Uh7guJ8)Mh*(phil4msS8%1k?&edKp5M1o4xE2gekmZOk{l)k7)@!>q7_1|l?{ZMn%LY6XI3>@tC;xOa>;e z4;0jT@0$P$rcIEC-fsOxm5h%;TN-yo-s{<)rW?=#;TFYn7aoCd2rZLwQ|9c9lGBF9 zBdtPw(Ed80y*m@PA8W=J%(rkBZPqho7^EoebvJMA&8_~Ym{A+mS{u4P`Z&r2Pcg$yv? zcT!#M{^UYs(?H@LPT#uDovt7A@%9kW{fe5n@vWjdt)$vkxlaW~f}iwpfw^4KiuIQe&FqwJ8%#V`lHF6x76Pqb zW=QG+1govxlUkMWKOq4pvL>q<3&?jgj9i$)L%cbJXvMiE?H`cm_13b_L?FOPl zGx-&VWz=#?11gNeXi&I;8M&nrGa^m#k2 z8=kv0mrB2DZ6Cdj7w|d)iL$q5ZSb+*1PPlnceGEnIa%F5mWi-(CvNDtIY(Dxd%DkM zrFhfh(^mSimw+ogT)a4kFZ5CX4^L#>>iF^Yor2%x&GG(lss~?QZ1)eIgY(}6UpW8U22(lzCCY`9`M-{! z1*>m3?Eepl-|0$ODVXu~dYv3A2mlSP7UulPApt@$N6VZ5<(s>}jEu2I(xlo!U0zCG zDxZt@-F~W!;QRh)C(HhVT7ogtH?(w`^6m|-_Idt&=N}N}vGu1$T<~>5=E#y%N$XmI z1S&aGM|$1HL5V5puC$1O-k_W^;;ul(C5bws;Y+zq(Y8@+0eVp1`bZp;toK*DCDpwdnm|I;U9 z0-OU=12e2J2&vI1(aM^Sna|Rgw>hIXS6!+;Qnd|DDra8o#))zPJ})L7L^vBgTt<;- zc31>;i78xI%0dZUihxR3+7=uxeV`M~ftZ1%Jd6ZjOvZ@2uChJ22n$x)6#cgVlsGbB z`r*K5WkA(NMDrxVK>LmXsg6`@*q>#Z*jG4-0~MnGM%U}aUl^b|S42b=)zuzxKj}i1 zKuC^J6K1LzZxZKBea$9^yx{*yaUzT>dmWWnETs$NsLK*3^habk3G{YTC()#J?5;_6 zCy%v$L^(c!|INxq$bhe3#6YO!5;jGefP^1FiYkhkcBq%k^ILvs@-u)BLh_ugicblR z&s~TD)ph7T-&i_<10g1VKaM*R7@m=>$^ucu1cF3u7`*goERELH^q1D7d;aQoH}nlPLE;wQRpoDWRuL=L&3lW96W?LP1b?1H9MyBgw&-7 zqQ<$S!ufrgNkSs%({p;%4+>96gw-C^EP>%VtVUzJt7i}QerT(ej*Dwz?zS`Jp8m{< z56=m0N#c||cjn*3MfhtRKpPQJ+kSYtbt#Gi`7$ z4Y5j1TRZh52C1*Jq zxv3)TG&23-EUac16|f8;=1ol_$IwQrV+I`ShnqlX89sshsr&|bENJSfbftpDa^chH z^0cVQg3Z#uUvyUXZ6B3>J6GQj?`X6m+ljJ%cRNoiu|V4n1I!MclgTB!t&&jY`_F@RnhmbGRnku| z+nV}W;R))_eUW(!zA;=`Vj7Pm8Cqh#$}*%=`4$#n)m-Y*!1PvMGLq$5RNnkNJ19-| zm~sW5V$xmR+fm_ipK{F@EDS~G*LS)0n^sktdiZcG9~8f?K4vlO8Uuc?Eq2T&xY?3< zR@Se1C30zKDmkRD|Fo!{G%A^tXY#QY#`Z$&KWmbN; z{Kjid^fRgcIR*pv;`fbX&Lm8F;Bhg(>~#IhY-cJsvG-BQolhz5^AdN?WB1y~p6|K? z(>WG-$CozE=XG<$nzwT1cKYtKWB}ic#pU?f>v)oNAaCoY_04V?^Q&jB1EW(8 zqpw>gq%YlT)^^)y)x7xB0|)GE#>;iOm9X|DWPS55L^}L%Bq8$EEc2&q3Ggi#I0H-x z`229QZfo>pIMH+FMIlULulw^b-n^hU%Y6XUFJ!~(xN?hHOm4m@^lvLJ*Ns4fcc9qQ z{F^CX;v_BClac;4PtnNT+o^O|nH%}GxoM>2g%KxzQrO1f0Tj!SmEwGE2MGTclt+I; zgJ}#~o2^E7KSF7Am> zpPufbTWy);!fa{=@G56tCK!xF#)IPyesrJ%7&-^k6R^t@GTiv9Dld|WDzk?gL!8~f zyfk7HLX}BQY{d$v5}sgy@f9+hn171cJa!WoiI<{A}i=F_strz zyaD%SIzCS`G0Hzhv$Efr%;ZM4!}PR#S+$<%u-LE_`J$6ZHRXSz!sJ{q4xb(Zj#9?> zJnSpWq;**71huaTc(xd^kt?XATP$!bdKBPZwo+v$UvVV8gLqMDc&;EeEN5E36Yj-I zjd!@?C#R&QL(bS8V<}wU<>(i!RN}f5MnyNw2W@4Z7QNSU zM@t{E9b??6ug3DxMJjMn1*`llBiSch0y{}Ivr8E`MXmOtZZ7$wNk1wepjcQ0gWh`_ z@%TWJH?EIb*Nbs?by_MI&}Gy*lF51J&ng)>t||>UBY0XDPs*~JWl)GjN`+0TK-ed6 zzHbzVVOldM>o*5AFY2_uF7?*Z&qtqd))H}PWoFVhXQ0AiSkUU!um4flfJ)vmKHEaa znUHOd8Kru(yZm}u$vt=ret-Dbcyr_G%JQB6e*Jp6+gKd|Yg#pWK~h0w>>Q6|nSiT9NO!mHy`vkiTmBm0+W?%cwy1rU0eGwXX7l?6g;rv!CRo=|GfQ=Shl0<-TnC)&9~{*{^sQ_ zkDyn5eN%n+^fXmElG)P0uYVjwmS}Wn=8=P&+h<_^TKU|^A-#a~rJ^mH7#S(a#a9w( zwVuO2CO0$v_SvLu+of4emcRCU})W)X|A6^(Ua$w=a%Z)vqI5^6Q&osSif#1#$ zu)Ly1DWs#|8sEdE)K>T_^l0*DfN6SqPj(0)8s0NxGhiQDOe)b5n+1)ohT8fd%r5yp zxn9~Z)rg2#6GJk&c;mDn+MLUnx@T$?+~+`Qq5l_Vv$s5B?@6FLEWc9XiN7y;o0 zYYul~%Q4JKcdBV*h;qug+JXb@v3S9sjjWo>b78sQA-E1OwxfJT=aI}eF+4J2_1p&Jmg z52*BOTW$j$ZkDVzpt@mQ?ETU8bpDPZG15?Rk%s^C8e#_9sL2^8v1EVb1tehuJ!Oj0 z#Poh_F`jJACq0_A3~XVFpvc88Gq94}+!(LFh{CK~-{NSSczW<8#`#OD{6u9LPte1WFgg%p+Mt^C^KL=}C_7)T0Q~gawc$<$D0=^e>1qSJm5}eI^ z>|8d&kz0E>CY7Ek^gFF)Y@~c&;MRyr%GG%@VTEI2wmZhBebPy~Q zlw@XRz}P5rMng3~CLEkzb3cf|cmRd}cMRyr(BtO)pZmCLBNl1&X9h-Cq44f_xIAx_ z(f{OUW+!FM3(UcPcg&J}vl4YOrDVAC8klBgCR0xuOaPcAR%xeCdr;|H=6d>ObM~gB zqz4Lg<|LGiPG^M%B6gS3`lT1_uqK&m4deM?qt$tA5~za(%2PH$84}-htl+f3Qk&-& z3uBsjE6CtoXr@o;z|?+!un4HrUd)%QN7loDis!fk9mPBZHMYLt%hUx^E-2uDVr@=K z+e2qQk+S4;hg6^=rHgj*I4CJQV_uORe*@ud0xKJ>m^y{uaK#Ql^AZE~Zxb>diXV{T zBz^b$mRP3}io5lyQnXU1LCX3vTGb3OwC)~(<03wBefs&c_|J}W?=|5Q>3sQc3<0-(z1tZJP=737X3{_ICfnwz|&GcTK7F(g@t${h%P06msJ=|uO=_R9{2ZlSq4&u`G zFVxCvzrNNYQS7D;MS=o%{&;4?aZ)_^PdwxrxV|7MlOd~>ADs}kagU(e>1dK!e4W87 zu*B#mXkySWr7MuiZeK@x_Ak{har2st!u(W`Qg!}?&)aivuL1O5J?e{z4~dsJHN}SA4i4jbTa)lU zoUho!Cy==RB(wh}Y{U8gC2Ye^!1@11X8$GrhLiCh7*h>d$N!Mot`GIgQzcU|#X~O+ zImdcj?j@Q1)@G*k>BC>~d0`=-DnN}D-|yXEkO>7W)?}OtBz{}oAJ13)zS&uGI6u>; zOPoJ5=ZTd^W04yxPA*~-zx1Z*x96Ek->mp@7nr!WpvBvqEC9xG!F7vns+2v2(X5u# z7VL$_2K9ziyFC^yG(49|J9M=hY+|18B?@{(p@PdqNHLse43K|9fRLNfMaEGRS7zlm0ORh>sYsQ1q@qmmm8>mf;SQ1+wk0* zdeX4swTo=2zl9~MEm`c=Z{pxUOjA%K3raCGtic`l(6L*n$^oLyt)&_br{;LnIiIe6 zw>r#PP~lRjVR0w?3$!O$N!i+OC8p3HF8<^bR9|G=Twt)=L;1>1Cv1Htj`J%p_rqBG zNcuAh{IQRJ}%7u~Tg{kY$_krk8ca=qOD?oe3q{lD3cg zI3#!m#6kvQ^gEZg-ULWgM>y!Tx@U=L|Am6mG+nPI5v2{7sA5x?%l)?sP z1)M+0#K?WDy#lxClVb;9m`~Yg0?&O21IE^1hP_IL?8D$~u?`VbUq0`EB}uYK!z-#O zHZxTc&8i2UP%+|1*50^l6ETrA6e4qj4pQaV zST+r;AKy_Lm(qEB3f4T_ zQa`Z6dL#@EW4 z>}c&rMt51%T1Q>rT8i5-HorvM%hjzi=jg^7YN*jD%p$(luYV=w1T0i4DqLc5p0op18;@)(Qe>oTw6uuCyn_EFcx2qK7u%Y zD1l*)#>2qp5^Fs#M1b=t<^^hnBf}5QQjsLgV^AiaiZL`HZR-(9eV!-|6SyF_br@c9 znC(!3152Gv6(r#tb30FoK<+bRY6YP8S~?AOZ$)1Yrc}fcSDcV?LvO?-P%3CtKoak{ ze>&yGeDwFaf5vK(%~9zXZrCVv$w1QYNAt4ja4^FI^gES&*DGbw_;goJO)~$ zMhf?m)CIsLX^8k6n3x6!UG;Je3L1kK_Qro{UKjK3t5$&9d@n!|*xd>-1ibDOQDb4L$lb+dYZzE8}~wTu(5=n`9w-1=}E zI#eYHQihn)AVi1IW@@&D6~DChrIcQ&`JRp+2NqkkxQ#(Lrkibbau>|%tli0-W zPG%}5tO&Fw5k-js*luKcx;ohyp{`#`N4VK4MRdItTuqtU9yhRK+?;+Ay*hk7eaGV^ zR&0-au})l@<}=pZAD@`dJhVKxcAhpUlU< zSzXq4g9EYaM19g)xp!_|GNb6KoU&fj&nn(}Q`ld}EWExgUL?8b@_gqeGrwpwLfJ`? zpp4Yvcq)?}|J}YZkMo=M^gd~tj)FF}I#t~F+gUCWjMlNUt+l<#SnR>*KOF~eH#2pq zj&%AGpL@e6Mksyg0C_3K7-tMVeY<*Bw&A-CHkGP$IY3)URV@9kFI^Rd#kxtmTwlt^ zypcRpdDZM(=WFk-vkE3Uahr{9={4J2DMt&_nQO_Uax4fd9lAu@1&$`N;V`K#iHlj5 zvv7S4Fy;ilK{dLxsMgJ9ZiuZXqEInhzK(^)lCwBf!Qdm@Oaz#hjrI1D%HeF-4hmlx z2L~zAEi%uSDaRFWR-P`WYQ#U4y!ag#CLs3pQ5a>B497_i*P{Fm8;|BU7(9rwOf(PpaI0YKRzcfFXooT-8~ zNLc3$bQ{)(r4eIe8c=doH7Mej%7s~L70JLKXC0yQ%`KaPHMG8>3Z4i{hs$(qH*>xg)3IgIR z{Tk_}uWFYRjS#kVK~#zc)4Rb#V4M-5M-f6_T;b0gL%mh&7gzT{`cRKyLN^!dK|o_8i}w=F8(FZNiTW9)Pa+&LzkJ${niViu}W8CRs-HC&Vi1d{aD zZkv9~ma$5QLy(g9`s>zVy}*>epZR0oGFuaj{I6$h!6#!(W}WM~haZQRBp!{~^KSIJ zZe!tFEtw(|LSM{gnqUYrJ*yA}3lhy%RGTvH@kbDwqwARU3zkPrlS+L7(v1hYFi;t6 z0Me>F2dv+P2Ne;{JaCR0Z7Bil?a-^1Aq6NiAKbM zW!BAeQ+dqg4LIAujUhd;TQkOC_Y5dk{8QaLH^KSMZ8JJ&&pC&lK6qD`M<~4~@cr4w z7YOeo_oufGu=F1P5vdH+kxVt5^8k_SPTYuh%DT@9sB;ho=MFE#Hprj<2AR zT$^s5&D*AjiHF1cedu4k$q&*#P7OToC#U>yl-~a^LdwDL?*S~);M0bt$f)#Nuhjl7e7$`&}S63JQS+m=q;R4PEl{BPt%$InK$A|mofW; z!!L1>H0LB%Le!IBWL4f+tNng^2IC#4rKPxF-BG40$X*e*E~y12ZqSv|KkhJSYrdY5 z0-ZkwFwU=_rGu8wwlB_3E%4&}abd|%TzI&{GT=~Cb+atowD9^#_+}`IE*0}iC3#GN zz0{&o6QU=jsl{#`CWh>fP6RZZy|Qk+YhxhGQ>^st>X*aPLu*w)1Zku_xrmHE@EQYP z=V&b?lj|6_UxS!u(1@gqs9~g(sLw{Rk)36$bvfP&lesXDv4v7qq$=@(#6=nzpFN=) z>Pyy!;!N331}E1;wYV&@tJX8vbhp|9E|c_%n`*lU>KPca`F6^JkF1i8Z_TWy<|7VK z*xDWg&R-R7f6l**XEOK_R?gJK%M9NmfPU9SPYVZ(yH}zEQayccVik>FS=oyG=>w$* z#E!%lEp!UGHG{;b1)zIP(Rb_!j|>{-Cw`3PJmM9s62P7>imh?5<&JSO0tUE=>lp09 zfAN$lrPTe>5mQ7h(PVz=jgP*sR2eYQm8NGN2?h?_TsMm|3jc*lU3?S{HX+O~-Pjxk z6a|z-rMB2Oy&wdCuKX?4n!bbC`B#m-Ud37%>@q`4L)A7N%Q&xrIe90K7t6-nQ2wy$ zUE|6CDo(|->6**TU#*HtKbS|6=uBs(saFe_AY03#4+>zZI7$MwrOj!?uhsj>32>H5UTVL)ux?yFSSg09Rb&x=8qJ191 zHBYq;*Z*9IsVJ*-pQSHD>+I$g_0N%y5hq$cc)%afNnDVyjnN24M34?HKiJ&K_KMPhG$Kr$y0=v1# zb;6C*%KkCWf^Fsmtl4G}-dXi3FH5$BFulL3a@H@8NkD-LDTI zNf32Z>=cH;cfFG)k1ylPme)yH2vFj@29#s0{fvv;5Dj3=Q!0Yc1CC+776ia zgD8~h77BZNEEnZUAaUKnB9HwU5U=DX>+l?*Xn7K)XJ&lkW^;WI?jFe z7XaG*Kme_U5+&}MLgWh@Q$B6(c->W}dao6KhJoeuiatF01p%3kSguUP^IEekw@!0AT;cXbg^%^v zTPiIhWPCM4$DwkuU?N0d!SMW-MnoYV@T=+b{zHnX(=q3hQn+#6t-z_ksNn|>Z+2NG(K?M2q`ols%uX&0mi>EyFBW`z_N#C*g4PF=jLYfNZ1hRrrrMZ%XQEOvZHqS=r-?U+wVABB@&Kv1bga)b8U{Jd`C{a(S)%Rj6J;ei0iuNVBfS5`d z^=sJ}&DElYD{M+kLRN$n@#_bws}eHHEuRqvtjU+1@M!*NeAS&!uyn9bji;^7sOI*X z;@tRs76-hq2gPhq(;3I9ov$<6j<~6GEe5#^X>%E-Q*&f_YweDu7>;&vq~bsxbr@{i zjI0TXWX7{nE~=-1%p4<@zl{s#3R%L1R6h#1JOA7mkMwk+TDnu5!ajtkj$XE|fiWEC9aY z_53KBKLo~h4TyS@i{-Evo|xntgJ`qmA8$1slrY&M-ut{ zZz1$HC;8ugVdeW@^Rqq8JP_%im^3c!5v$7O5+;x}M?-Rp2x)I{H3>LoN6D7%c+TKZ z-WX!x28WD+B9>s>NbYdofSBFVFAC#t(b$x7NLa{sUdgciug*iE%nVs>xgpP z>=Wv8vH>7O+>H)_!vLy$Eh3=8RVq>}Qc*UZ)O48TybK{t3-SPZnER-#MhJwV>L}D0 zJ8CcdUeZv2 z2d&p6#n-pa4r99|Qtaji!b2dR>Y6K+#7ofva|R^5{u_U+^CO6cLvvZ z%f`H|z{0oKaxG{M=HfF{7};0*e==V zw2GhAGOf{OGLIAswkHfdW+jA}eCs)+dKDIW%?*pl;8Bx}JZ!`As0CryIAMx3BWShmNabH7#L zJ3hH(eh3Al6c$y|bERnKjlZ1vl=k%U1@CXuR~PZms+XM= z^OqK$EcU97CS<(fzH*wp0qX!}w++-?jfX*s?(B{uxK(3~N)3&cDTckv-`4g5LCg}T zFNTXTK8?l!-X*a}gX&Y1`gmS-u8X#Jzf4^`+>#o*HQKKa@|jWBv7SakNM<${tMvv# zHERCm^vz?96lE|`u1;hBqNQZ(h$h0_>9&$;f1aGfZ*6bwz#k>|oc4IRuKtp%+P?wr zBcSG+-r{^-J%Nnj(=^$#7@?xK2Vq=4YI0K7#;r@PA`Tw-K*V!Ux2G2MX~CJKLg>_| znsVsZi2b+y&M+={JBrcC-IPfTzJw=zKHf&Nt{>W`qw+f)1!%t-_}ePnks$;+S#soU zKioWD`w0j)y}RGulf65A+rPY?M)Zb3JxC|OT2 zZs_058?(|@ZlNj54j6{~N zn&fA2v&fx_78Oeog-58tH0~Sww2+X_o?#oN6V`!gx167QShMik60)XPkZxOi2j0aW zv8jc6a$p&85kbVY{)@4D7h>agek83Hx&`C4*8C_gAe#AuF-TjVpwgF~Cf@_^WDMJ;_*y^9?j??&B6f7z99XsS}A-@**|ofID5)8h(gLt*D0rB@*H?`%9pd zY`;$JEfKm_y%U)22r3=2Lo$tcy@NyYO9GpSP-(H0D%F$!UgrvnX`Z^9qLeDSs8%cv zt4nE+&vS zLgF#wP&pvoI`t7*)UQ7=&(eM%gy)%Nll6)3vZG-q!vu@-I;W>j^A;J3!;Xc(YN>Ms zcH+_B!A|`kWym&`viq@k%CE{FHi`}t2Nthalot&>g3Hzl-V{9wPDe%tF<1zM9ZkAa^Te*Wx_E zTdNRhs>+Jt4zMQ-Xu+Ey*cz6Z+N8?4MP^Vj0E@3A2Z^3~ymP>97Ue-5+X@lBENi`$ zKbx_7VHQy7E`k~FB(_OCytMvNsNhUDjr4N9-@mK!ny9H!DFkh{!*D5>z)TII4Wl8? zk*dc)juH#wR?J!ji`yeVou_#Q6VeG3j@LI|s4TepJLHe4>7DDgCP{CmES||U4#+6Y z-hFb8lMXd#24qPTJcD)7$ae@CcP5@HHm9+N6oRI^juZ3LK6yHUk%8)w<-I1`61qgm z!h_uJ?cbvw2@dCuR{Iu=TUUTV^|65Fq$Ger?lk7sv5=K0Z7EHE&RsGYhC>V}pBP96 zjO)P(EzcSVe+eWPAlwErU{Jd)EgM=^F&7ev3t`(=fJn$xKZ@v?NMHQ2k!)Um1|exN z$|>ucJu=BVK_{u*S4bjFCAH3-_+a8e#*O`TWu;Zi3DptUAgHQ)2?VRh` z3BJo)#(5>0J~e!TURQEF&qaYSPGXIfGCj7BFAVcXJ-X)VeBOtANg!}q58)1ze5m$* z#6GPXSw{ZTT9v})R{|oJBHI-?GS7*tvH(ZiJvuKCN6=~b1cEic^Es(aTd-LM?N+E5 zOxJ=aRC4yd78YXF=C)OMDcGnTEdo`Saq89&D+?Rd(}7+H&UN8&H$hxsOU+RRUzfb4 zG|1NbJd<$#;hfCfR;_-bv=v)~d)%SG3hQqhtgDw}-^vWN_$SNHa9`Oor_GikuRv$h zySWY4+?|*^dLqqlxC$y6kM369xxL#4YB6UYbniKIrwYSt8BTWZtUsx7Zra=jDLvGV zZ%z52>Ywl~*GKMVdm@iL1Y2g`&r*j#>~eieS1#yfCZ}rcy&i3%STJWV0=m6pY645m zqD$vp6K^^i5uH3JuJqTpHZRibajA0iRoqLeRmM`~SGg&#C<&kEI-nVQ_`F&8xIGaE z>+VlpyJ6pyo$x2k)SWzi5puPlo~4>N{~;G-;LynaDU4wMn_VtQTPx_<;-DQT+h%ZU)lz$l8sF6w-_uq{{I(Q5xl5L(4-FJ4 zNt4;l7@Q@RKxrWjD!cu_GG3yv?5gGx0n~Kg`2Qezpdj0M=KJW@n0I;hBOqW2}niW(!3l)Jx4REj^+XDJg6uWy$UT>`NS&WEBdi=~ZkW$mq??zM8 zAPk=)P2+#$B~&ff6uO_<_IUrO0xP0u6SCw`rUfQTttJ3@p-4KK&%<^+kLOthVKsA! z-{#+v#Lr@6%ge+d8c2&i|eHR9)qqXU_#uKB&NAoA<-E6*pYd%C4< zt5m~Laf!bm-nSf64CR#HT0eC1QLB-;&Wp!9z%QeNq-|&k1B^V>&G$=Ix?c`oU6j{P zG9OGMvU!|~Qyg;K5CzTc)skV~Sp~8(r0zGr!z5GFzcNEA$-4UArA=+PAX%AtEnqr= zGOz%FY{7HR$A8n8W|70l_VJ`Zus}Kq8$D-?>YbGy#IgVI{nYb{O46* zng8TE-3JpOfF}BMhwf?tdl6j_Bb_V>hC1)C^MeVVB(bDm%Z_X}=ePfWHxoj`9#lcJ zgJHVSTOiPp0*jl39u>-9l0dc~0kUAU+$INpyR(mXQ~FHWgVBA1%wc$8ch7@OY0bpP z@MW!wkng+?nw!wz<3dHjrDC#XW-};^<~V!x%)O@Sq1sWy<$j99klZ;eRs${49|oTJ zZ{}5*ng8FMPWo3IF8|Lpa!GylOf=V!8F;v5sw@YW03TNvVC3J85S@M1i65X`}S zUwUQ&M0iLMd-;*KCkJ&G?xjd)`ZsUOr`(SZR}NVpC$H=48{%_eCJ>Kvnfa+R*YDTE zahJqcV#a78OfaMXf+yn1KGK{cL8%Vq<31Tl8-T@q zmhRnkZwgS$KMWaFOk3YqY0-x5=IZl|MMqf^*>^1m8n%x{<*SJe+L~yjlQbc;D#k}T zj-+63!;khfE)lW_2pZ4Y&7#*SsYrcKq2R|PY(aT7*9QPQ5JebM;Jr@;wJ?8Wqk3DqpTfOQ)R0p~sSW|5<&j=&o<=C3DQ z#Vaf|obWpRa>n-^nFO}t16q|oeri;I1oP!6L>&UfV$|uRm)zz?oMu=O|JNx~sp#?X)GB_|s(jo5>JnmVc+o#_}&YRB`-avZd)JW-y_JTz#Oot?NlZLj`TN zscDzAYxLPNej6}GX454~8Qie(^_G8MuC5lgfG=brIU<`L_eXVmS?n7LLKJJR?6#O~ zi{Y*nuY)XfD|cxd6utpT53$IglByzclA`iTtw|}Jhgc0@#B~~wsEJ3F= zQOi$CF>g$!IzZGUM`A?Yl3F%A4=oBM)}1Dj67Ot%HEJVR6_3Sn>0@YymnP5Jt_{p= zdAR3RV_+37w8vNy2Cpr$Juc!W_$r>U)c)N%f)Q140U;UlPPr~zC9{-1Lv8}_!kwV} zDl*Z$F=7NKGrToES!BJO-h}^>RFbPi7um-VvY~oi$OZp6b5K@9Y%;oMm_`ciRg)-N z(knIKzYm9@n0H`;n$qd^7a$5n&&(=@!(lHK!ez_)CFq9w0ex}AwJXgDxzdf)QDA+H zKc4=M;F0IZk>K!qs39GP@B&?6odn|1mA^&`Cxu$S?gzP?Nm|?vPLV5GG{#Coa{6+( z)-BIbEE80*mDa2ZG+MgIiXnr>k`%E8^-$)#QEx+eiFXcLy0|1i4p?6@)Cjf)&uIeYi^7}x=(fBIHDj2N5FUS@Sxptyd4&e%8SfzJT!o<41O8ZPeQ6m4hh9yJc0?9f$;m^=EGy-tDBaFs#BuZh9Z z&jZe*zOD0f+3rk`hHV03+Jk6I>!^ejnb+LJvlnxx%WQctF;y;@zIo4U3D>m)K*v5B z59n6tEcU>+eEF(n465m|WF6Y;3|P&%g7j44P^xCSfk*Fsk8VLI_hx@&{V{PZlkLTq ziUQI6O?_GOw&J!7pv$_F9VAZIoRdnyH`Qu0?vOR^89BTorc1B$cd%dZ&)|QemA|RI zGPC_V(aOJO!prr4*6;bLp{u;c`48i}^_F79{Xij<$4N4&>#FY^%`)S1W`KS*6dN1r zWD}~lv!^kHi6%~6muv(?xaNu3uBUa!n)?T1DA0H8{%5?+SR#74niEOi82J!^rN>!w z07OP#9tRejUr8xPQb=X-okg<9CHE^PL-#TxUoeYCgIz%x%t+gM8hshtc7t9c!$vJP z?h^$@ifL)?wD@=PO+Mj8#_5nN&m)&U*wyMi@_l+YtG+up0u8;JTiIUq8NZ#kJ4rh? z)i0bC(R#xY8p8^Jo)02#uV~@set%7YHiA|1(W&AHe9|OG`3Hm&#ZFG(VaZ&Anf=$j za9yePcb8Fy?;*Z?AMcl;&puy1%oqa&dY${hB8o^|Q{kWqnc~GgKucN{3Km)xlZ`Q| zX%KwQAI&5($*e+Z>@z<~jl*ANDuCY5&zoK!7m&H0_t;F4lsK;UJ_BYx;T=prn8GY_ z#io)BZX*Lm;RrOLO_EDG>6TPC+1|rAlP2`8$YhRd1)WNiQJRIO!o-gmBjyp0$0Uzs zk=hpWFKwi|blcS04aBIR3zB-U4U$)A=;PjY{arT&WZ8D-mqu=+lcxJz!6GGOjtzOn ztr=vq4aqn-yeE|>>vcOoLghqshq>YKN8X{a&ePZf4ydfSw(LmJ-~G)#P&gJbRmhjF`-R_2W#FvOA=m?l z@rC=onr>+3DUQlfp0JvYm8fU>PQ_O}W9-!7+5+-(9*OtnbunA|kd!(rRp(}Z^1g3VI9GR_ z+uyb2Qt>L&^LKuiO(1w>qiTaLvR~nOTP1{4+Z7M8H}g@L?@sg}Gge|uU#k&k0)O*lGhR2g+< zP{K3ez-PwvmtR%U<9~#?SSA~vCd|cM{ zk5`*5?75uwYtXxk4qYxcEgr;k-sCHwkCVtU288Q|AG)l-S{rdZ)!L65O4e4dLZ?e3 z58lAHrA=wgRbSyqFk*X=n+8Uh zvWZL~8r749(QvXpg_?>64Tht}L#Nt-jXMWu68onLI5s zMuvjxXsc9FB#j!wN7!UqH@!QVuQMWdZaw%#T`g3a`T0OtQu?xpo5$w`aqObwo9KPz z|LBu5Fa|U$+r`>^i7czQb^i1gM!_L1_2FiVYKF0QlJv}qP}f1UBYzLO?&jKg1Az@i z3C&MMYG5=z&f)L_4fm-;HPOQ3?#SLNcC(27Co)c;wxb5^J1*92G3IhE^H1IuP>ph3 z;>MozF_?UC&Ig@TnGTD2A*h^V5yjoPv{q$1(~d~Fyj>w|5i-$?@M^UxP|>LCfUMzf z3d0dLZF+PLm`*PUNs-m7C!!w8Ud;t|GbDzqXYCo$Q>gMnvUR4?Im2w)O0;o4w_7{2 zOM!apsL=hc($9k?<&^;}GTcU)%*B)?#h7!1lZ=r{7R+|jd+4la&n%I`YuPSAMs`u? zPD!%Alu0K<`knnrpFo_*9$$B2gPxgP&Px#vNsk~wk5*iHsUSn|lXeL$5NLl>cX{|V zzb*HT4yyAWPCtrQd*8@J&Mjqt04RZ>zae=Ikf&x4u|A{iaa}-AzgTWZ&w&-jH6jIg zn2F^jgroG&bCZdDlJqvlSc-;L8<*#Jh!TrHpoXo@!WW_l^=luWYbi`mPfyZ8(|NA0 zYzPjN4NDT4js|D@1VH>18}18_~pJg&682KVhpFGBfJ2UXJGn_@J@QI`d&blW5?0>nQ75O15O9oMxdL zvM+`I(#^ZEdj?ZF$xyT16#H)~uEf!p)E<(QRPYKZ1RQWW!nB}LI2#j1{4t7An~?Fd z2JMdH7c$QIIpUFD_22n`s|?hHhy2HBwY_1#COuoR-ikH!5y>vkjfgN$9t8O7Hl{v( zAw1&JTTdm-`{HrMy05^|4l6~sML&laR0^sPLWO8@eoeBJE~T4te=(Zj%sxy_jNpkQ zbS;A)=Twa)$I$V#Z#KU9FZV?3iVm;*ZSjmnAC>2OWK?RM#PVh-PY>_^r z)7z(93&=A#Zv=4Qo*(QCI8<$K0^m9-k$x0d7o>X)$**yv`+$jv2jSRqOybqAAX5J$ z9|EBZ+;?l`LYKzdLLpBUx6kTWm0}p1lD0o1kTT}G;6@FcPaZ2Vrxiko3sbEO`3k#D z%zeDs>QZt(mzhJeWlZ*IS$h%5gmzpar1vmP+=+_5hS-k`Yj+uK4Q=_B+RD%g`({gG z(}8+A^MwemB1xfs7bCH2%7%NK+ueOcd3#)t#s{vd;3<2lRl)HxE75hirk^A>G4BXh zzMPv)fQRsNJ*vozK+x$bxQ&KZ^gO%uUL0(UWgeYG_BreI;~d1wGisghDTx?lZ{^YNvGD8*dia$*_CCH-MRzV)A_mYMzG!#Sz=e*P z6VcCRWPvw4>1Hv(VtVZE8m(u&#WWrl694i&@{wrF+KW0O+KOY+yA%)^8V_M|n1xi>Sj;-}?4OuQ(l=8Z+%xGm@nyb_YLG7PP@Tjf*@*mX}UT1!Ms__lG(s0a|g^!k(2J`VVI(#HY+iayTyr^<9c({$xenXrbhUeLPk zby`^zHW?r*{nD9QruNAwiJfV`DKDss+Hnh!Bsuhy&qc?TDc$!g_9!_ zQa1xmGy|n=0tukqlw5??{4r%}XpgcY(Q z$dxrD0!11j)O78w!6+q>ax~~yQ_n&uJk9MF;edfECEJ@dOCkWN@SNjdA@Y0o*V8t! z%ETfUIlSRR{NWvIVh~3}b7#Yc(V%yl3)$(r0lPSp#*_}CPfE9LRYERBQdaY%_CkKI z8zd__p0>4(U*~rpVu@4U&JpNgfXNE-RYUd0Vk2Q!xW2vA4KKMsxf=_HEM7&dQ?!C# z9}U~?mN72s0kz!4wp$*N6RlyO!ue;hU?q4a5pA*VYM53&w}^H5}uX=H>S zo;Mn;La4@-V=oQ`4fz}?_975iAPRF#L#6zV563LCd(3M6V0v`8k6 zzXB7kC{#$U1u98&PJD!>aKB%P5J)pfn$jejz#2u}cbXQ9t)#h=e#a+I`>`@U22~E1 zc0$l&LCPxVPCtc!;255b)O5e#5oiT`8Fbm2k5<~JQdDnBrCl11%h9w}ssq(eZq4j5 z>W4ZGe=dd&C{h)E7>YUyy7vJ7BnvG+bhERDW?sx9qEd=R(|F`h0plR}Te)XYceAB2 zk#7CRp>_$e;ah*I+s^ZZO1{0fGc0i*4TiyBb-Dfg51otcpelR8;#V}l>65TRFk<)U9S@%&aIlJ>^$9^RC)ul8e;tc!( zLAKRPr>e*ur2ALi${x_bxaxiW57s@$$KD%{>P~Q5do_cKquiE`=HK{bzuN5(ABrvo z^t(HcwOmR&{Jr1TKnfOZ&iJGJ1AqL9YyM_>0PydW9svAH=O+Nn?0?Ylv>gj1(0rzA zIqfpN!z$a{+(pjGCTN&uifFX8O@7XZHOySF%2u7%Zq4UqPKZQzFdYQKKz3iPPoLPC z@gDD%LIz5=o(gB>MxU(MwYU{SI$1D0go5TlJ8^H=Vw!u|iu-W3P$ahT{_MY2e~sE* z(!OzQ1)`M{pcyeqV9@s$%&IRa8``a29?D~3ZDr;9x@+L~d%Z+xYQKey37u#X)1-%Vk4($c~oY>2S zB0z}<>Hb+j{Q*Vr1KwkZct={z6sHF^8>U2=8mE6#wGJ^x_VL&&v<|MJX@)4Zw*k&y ze=ZG^-tYBupG+jl3Wnp3AnfK;yfxj6IX+Sjoc<T;arX0fc$ScO3OYOI6Dm4o3f=Vy_4^Y zohNi}p9WW&4pQXcPtIVK+)h-1k~73Rq<=5T#G8(n*5dA=TCys4+BjMzF;>Lk+zU&v z_dSqLuAk7(<`|-qk0e2tpY$v2O%HwKO~=1R+zchrbFgONKiz^`?rs6W!+$FLMOy+> zvlha$tiwCeVELlp*TRg$Bvn!$AI&A7Z~7Iit4F?<3L_00rC{LW(<`e`HG zsYoKY4Gy_pNA9PCQnK!IXo*8mcxwkBAOfLYm1q$ergJoOi;CH8Te#8~YM4M- zZtiI(&7Dj0?D3JSR>PAJO8t*ubR)@VZ8%1c+ZA*b0u4Kn0fhIrEt6{+&gNI;Ix-C5rizqZ9Kf=n2lY?aqw(?>Q#2HvEw#3pb^|fkoYv zzE?)7lDxR?AiAfYpgjdAb}P4-fvn`Ra_{3S99xO*SEtdA6QZMw4G_psl<-hQJ=;2?Dj zpJ}W$`vOw!AM-!G(b<^(cW?B6cJ4prb*4Y@y1K62?l&awBlQVV z+T`_X_@`(gjCy)P4#|!dC30gF$OaOJMVE-yp3fN6QgA716K#K_dR`W@DZI7Btzw$A z=W?O0;%+?^06eOAj_-Lsj(@v_6H!3L3ai%308ZB2Pwm$;Ps|GELI_(wAFXT%xi%kD ztAMj)vqoSqGaeF@OKMEw$ey;InF`?FmbS{}KcnP8qsJ~Ig!rsZHBI<>TCB}jv(ML( z`@Yx5k)>?U6GfE+f%Ih{WB-zt&cXEtij7ZQpa@E9}Pf#VAj z3Kmpwm-EpqlI(9S;-hPx>B;0$-!9H7YL^J}=YolR-i%*Vy|D|E|6LBnAmQT49ctY$W z^JLHi(yzrxMgdM57EInaTPaSanwbxLsFlN=6Y-aC5=*l0;4>eA14aTS8x_4u$6JDZ zSt(vloc}-pNtGX!Xf?w%SF&WqCpb108URxr#uzJ*5CT}W04zWI`w5`hiZ<8XBIqte z$~CtJzn(Ije+l96HjX-CE&NAKXlaF|rvZuky9miQ=R|U+) zH*gfYNRddmS|VcU4CF-nX47$DDFk*mL)WUBp$rbu$8W)XO}-q>6qlnsdi9AWOfwRA zH1qrE3z##>wZb+Z+^Vv&xZBj&+_ zc)b;wKP(O(aZIOR^`YbU;l9Tys<)lN3JdZutP?ei;Bn|2xq%OV#*W5g=TW(m%xH~y zRJ6$uYn%^O>xiBk-%nD!s1vY7Q|T1Hb_%Z(L}Q|GkXqCnR$5kFHC4y{DZ{37)f8nZ zO#AT+TX2x_N&SJ?o=c|kCqDd}sR+QoQz`=RFMZw%VEaG!&|RsDju`^~U7UL}C(IL| zGum1}%8Wv;OyzO@#kC^<7+KkCnz!5H?k&5S!y>{a#M6E9`Pz89s_4DWr}E)`|xCKU_2lpri3uAw1hyZ zogkP6g82*|162iu05u<}922=fC*D##*U-$3)Av2+tES-nfym-^8J!qiukjqcZYkQcvbgmhxW4?*|T%g$M&UD>H` z#eHnSNdXF&Ll!DQAAl-nXYp@>c(>yX9gJgRfm*Xwq+^p88iFgSali;Bl+cgrNWY*h z{M?S<8Nm2vO+Y)_A{q8gfvC9gR=DqShm8ym`WaNcCGJ=%v~Dy6Wu-kD zwOs=+ez`N2COL$BpX~sxKI}@a%L!n|$RxkJ31N+8!3Vb!a|tpLS@Y6JR(s-KF0yR1 zYjtob3Ncfig;?%D03BnK{0%Ery{{l-zd^%s1Qc4Z7a@~EoW zVVeHkS$`Kn8|=R9bS71>V|zR%MY<^C9-VJI8i)Xf;vIz}aO2u6Vo^%(uK5tZ=wPq# zNQZi*hSJnYJ2JK$HXFTk&*{VMSN`K&aBo(~JEAFANt75|Z7@Edb@&8>5}?o0gZ;`O z?$%&+A46CEKEHb6a$j?ShGMPUeNeDCy~zK?L0Vi|4`oVs4vNriKP96mbsy*tA(^6ENIEd_9-ab98pq&)IJ`0Gp}djE2{3m`lqs| zd%m)x_qNbMo!+r#tRrg)RbTZE*3h-!u2cFK*txgC^Q_uy0*}0y zH|6m*X+qTV5jG=0O2_dM$oH3H&3mEhWcci*KrliD0^@9jKS-K3XJzt-U@Pv#IzYAU zFr!Kq<32;mv2|CPhVr0Ce`EwCUy}uQu=aj}?%-y0sTX}0(Pq&m5usZ1a6M7|nEa+q zM&c3wl@1flfh;RIm4F4(Zp^%KSSQyI#p?jmZOji#Gs4Bxc>d-If}sEv=cU=!G1{9$ zS9SKLJxq|LHvPkFYUd~mWNA()cUkRzHI&X zy#lnV(K=tL%$Yn0Ln#ZLKuWq)fXbDl8a$MKZ5U3G1Z3<1)P{akmj=x!vz(1?eaWp+m^up8P*jA)jbG{2jD2Lq2) zC#nd0?<{{kv&fFiuYZ)q-lq~=FLC62%o6vQ8U~Rlc2{A=!Rf`|SIB+tY?SR!@((8T z0Sw>M2rr{5mgh5P19g93rj1GEUN;85@PM1{u;IX0uUrU?_i|UXDFe?Nr}xAq^>fPh zCy6|RO!t!CgxDkNb1*nx%ne$Jh+jqIxd^9ars7uzLwwA0mt3g&sB8kAq`rXsVWzVD zO(~n@{}(CyulxViLpJ}*t_1M^*_E*TE6O(4|0ve+zj@B8$;SS(boRt7wWS&vd4#3B zO*6exk?5+kEigs{-FNim1lm!Fr!CiKV(mqQ;-=+b*Yb4tt4Y$(+bvoITLc@py`EYl4VMDkSXW_3tkz z<0PblK~POt!3?x%z2I+7{v&8g1>wDA0S!^+EKmpF(~XHKio7ASohGm_660ZfHhyPm z7_#7E=t(9bnSxZ5ZvNR#QK!sNhjiLX0-9nECm>RdL1?mIV(398Dt}$T=$4b+5Ox07 z1@zhq0$O7CCm`Xy@=~nGSgHys$Tkr9o!jm%bAXCrri>PA!9Fksqj(G3=jXGfWI1d| z1{UjAFrKL>L>K3v;ool2vt(?oOXf4Im~k}QK>ujr6Ez1s-|Ok_yyz>*(2(`&D*)tl zqyjA!TYT#(m-79=Dtx$=0;DCtlSthF8*O-B(yu^(@gC#}Y)nl9Az#^dbn-h_m$eZV%hHDX$x21@3~ zEZsPm^^?mY=`zMyOP&94cNf}6F?|Qe+O$TfhCg*i_r^Z`DXy@{+r8}c2Vw_i=I!HNsQB~E0QVu5V)+Re7b)4E z%wWhEh3t@Fg>iprL=?G{z9ZpSP3>uCZHC8O#Hi?+(USks*4CU|#?Jg|vRJp1uFlj( z;;8rOmEcnDroilix884jm4|!_c?39L$KxpzMf{50m=X)-`m?)ssvcK^aL7dFc@))> z=V6==Pxsa2YDp>d#8odlj$Qq!V)tLlPJ*VFJAoU)jfQFGc@nJ3$1@O!vPCF~I!Ba| ze#1&d;hBoGi!0gI9*_YwHxOH5YxsnrXPl?klwrI?3w|^)( z8(zNt@UWa(D&&;6t?o|yV8?g{6kTK#jCtZ^GOB(>;V4W?=*4mOS|K(>@;>Z~y;C0E z(2;O;7pX?fN2*71_qzP@v2xL8iO9{|*o88h`pOch%96qLiH!eNI4mojvNN(Co0(49 z#c2c6Lej<`;F*{xDzp2*wduW{CQ+XG@XOy7@iVG$t@V-N3^=EhdNT@-cPb63{Nefc z1AgiAE_M-(1;IzB?nm1zruK1n&!4F7Zz}05EdRw+_rFrxzapdqnA!hOh)7fVAFcr1 zZ|d8}#zq<2nY_)iCA_V&l&91uZss`6$r43EN|GD;TSLMqqCV1Oi58{v_Vrtly)a6A z`Vz=<{7QrApDmkuB9d`oRdfLgNr1c`aglQ2km^*%3K?bqSQza%Kt6xrSlI#I_)n}9 znYmjF@Y#Lpk6QU&u*pZPoU)NXYc&viNsL*c+#qN?tKS$6Ny_jvg&0`4fUy9sNdjOd z_Wi_A$9i|N-eo^kZ3!t#s}dX)F?uF;<0Np$3|k&%CBcnSBzk1-xW~AYJv$FpH zCvucyD~rqjcsLsn0)-sL!Xf~ldyc%bi~YBt14wl^~WcU+d3evT-(LeXRaJhv`r=2nLC=&Ri_%-IgkjZRolr|%oMOi9fIp@v9$zzOD>y-@W6Q}ZI!A_C_ zhd^Yl3ZYGf6sf|)6e6JE+>RP?4UOM(vhF8@I_Cd1+B1I2+EA!sY*bO-6wF5`BM;CR z=l5pfqzR^i{~8TpP&rv*hKLnE)(S<#1%Dx7K25sHW#L$1VFq_j+zfdT7krcfv31zlS^@xiljPE}X$C(LKF=!@9^i$QiV^kJ_MKr?;&MH_ll zaA)o}OWe|&5KwEO<~rs@{1Y4x|F#{>%-EA``?yXWVOsQP)~_JZLMYoQA<}}F;ZVIa ziaP4sRK9iSPF`)~N)u3?G4TVMwkiMc5Bd;tnu5mEfr6D0FBl5@DtYa&f){+E@BbJn z?7C4QuD zW&Q?mOTl2VPTv{($d6s$&3hoB)eY}x6h{tHQ5r`FH!#yD7N+^}K2?&b!RF*H2B!IO zBMj5%l8G@BThT4-n5~lkKtruN>UL{?>lLAQ^U*>y0=eYGt8|LT8VahaR|vJ+mENbK zFqq!VK~Rqh*SdahA{Yc)ci>bzAz_Yy*8HBo4sI3i74UF(y88+rtx2th=mZRVOM;UA zImtsic$%{qY)GZ{aL{!cidh+p$qKfcunB_Bcvf10%J?uZ17Vo5Qd&t#et+t$41d;) zjA%m{QtHge*X+7Ga8RSo5qJv5Tg{=m6mCWdw_Y!go6RgOazyt++&i9Y4tO9JLW<5*d>~v>R zzG{w(jk`RL6u(E*uJD}~TuFrS=`ezJ7uq5$t&a{cleCZkn&>Il#yI^ATUT7RvbQzE zuI#pjY1@1VT`n-nZnZ8>kgmDmfDytlFQjQp&SW?AYyjkixTx1=aEt9UThn7sK4leP|_v-*5yAaEbd$DG|aMfyY zwb~GMqxr?(V(H}%QYw=l;nk<@r!SO|Dc_nnOC_ba#M~7$SU4;_kHp|jbfhrR@HIYU z4i8R+@8fkX!KF#fVDRs34LZX}XNB;7Zjl}l*gLEmb2ft$}+qHyLP zi;me=vst@bxq$7LA8-P2UX@N~$^>D~zI4#zye zZeo7qUEUJ_3UzOLt&NCFF{T?FkAHJLi#8!|WEeBO`LhTClO+`;-A2WG6%#ONPMdoX z$&CY_yRL9oC*dv1X~chy8z_@_SH59)87%1G+$m8PRdKd@i7Pv+>y6~wjam}gdUCk3 zcv!sw`>ktWmSfyBq`RX$8d_c*a>TupU*-pED#pjj01AO!{de|8Tv>2O0`^_ECtbqk zoQ<5wptny?5Z;_T-Y%Zv=gFI3KI#pI>^29s^I@i$0~_-*7t(d5k2bm4wi`vfBO-6M zs0aPWR44GrSVFj~)zBR)QSmpMB|ewmE|vU0?J7+5ZL)OQo6uNO?&=m~H46wSiKA0k zTck|YTbC*$dl)_;krsNX{uFlo&BPZA+rLrR^{?c)0002jAHuFR+jTJvuO;>S!iF%h z&csCTA60BdbWz#SX#0K85NM;b_PoM?PO3+rkDP7=;dtj|WDE%7@ZY6!s`ZTf6NKtD z_Q$!jM)J?`BU9>nb|@f?1mx3|AmIZtr(X_ zZ9iO60gmI%SmHJRdyD`dr2U=}`af>|2mFr^;(x+md_LpCe|)%tu@Bx{$qB@bN}!lT zzmZuKIj#@|ISW9!@a_4MR+uhZe!93`wLfYK?L;o#YBPw=3(&q?VJKF*?%_{~%e6Of z4R%vdY%A|=2^1$e8a1&{#-}J#cnEdcn5^7aV(_cPN`;WorNl9(biQweY~t9h7RLc! zj$MF)oRiZy*@UHn9>&0agj(J#pi#oFkGK}bp{4KEPq6_RK;73zTuGOyW}^%gC@kmx z4L?g31O~z5w?vkG12BNvzfbTlRMAG!FCg$Q6g5i}1P;Odw*(j;`%(kx;Tkaf_I8|V z%4AtH)nDzF@?=9#kpM%4c3P4_rIt3Oz{g2KBOqv+tVCJ<^%unZF*cvRO^5PVS1QFi z=_%K~cT>**{aK1W#;zSq;9WncUFa5llfz~+D7^!hxyO=p42u%k3MGsdr zjE1tUDh0eul)Mc*!Xpn|Q&&a1A<#*_J=KVPG{`?cnwjrFnca4S|e< zs+r_(;QaO*$oI5oL7s1RP9Fo;tp^7L;}SUYUB7ueAQp=7?6WRA;N8UO`cg-j=H`qY z?RJEI=?saW%_bERFAaCwJz~0TjRQ;8NgA!+j>KT0bSyrhckXco;NsmeRO$ds*^R?IwvexR!k%XAZcDVAJ@X zIBRZBj$HEixWJ=f0MD_si=klz3sUpbdgJkZx>4k3_>ip^!KlQr#5FrM zEY-qZikG~xlZ?Z*6-Lj#RxIx;YbB=z{-FL2zoHl@*CR(f{~TAExLNo&4HbSNb?H~p zdIPCL3wFNIPN=bm!&_3{Iomuuh?F-_5hLaba$@?>QCEcYMGl;#@R%{t% zA1RO6*^@-1(v};arOc1sr2_6LZ~##5)G+ zi=)CZ4!Fm9oV##Zx-VH$yEw0oXkqQ1dFiC{W{vX7s>_u zJVzBDqgHb7NGU6YxVm~`$TBEua)vmqE)1gW5(D` z^Dyn+KBVW9PF2$D-Z@}O4fU||47o_-Py>-~4x6fD=ess!7egHO90O(o?swS8S~C8b zori+i*g!Oyn^jJch89(0MKgeO+>2daVjQYG)&T3}KdVRfkX6=9m|`rw*S>g9OXcc^ z9mmpwi=*PSX}lB*R+)2*!jLNrv4y4>@5PPyj+ceIh$J`cOZHQuJl~KiUiazMMe;n4 zk=_|{ydBoZH{E#OtxV)6JX=iw@I`GD$~xN2q%Gz>(QEQ_#_mR2yfKbhnYDJ{HZK~c zn6=fO>cSr4Wad4NmY7V1AI6!u>zK^Ct$4?eSvGEua&ovPH9?a&*l*kg?t#rvUrcW{ z%k=j1gps!DAw5@{d=?YZ%{>;^D^j#YNxJCQntDb7Hkb=L4)RuGH%%NI+nC7=EPgH`uHy)h4H&ND ziKre7jFHY3MCu$QZ`3ckwLZ#reP}t}o1-VQX3%AK9M@yBVZMtqqw2QK@G58hlucva zU)-68K;-u^9_kt+kQg=UOOtpydy~n4nVHSalT9&PPx?$0n>1gcsk~Y4d<+}Zo}La5 z_Pj}nvwPenDlGeXkDq~hco1Ujq>W2U*+4ZHyZ2&o^Il#Le|?$$q`;GP zv3{Q~I{Y@{yrZZAb3DQ=#GX#S9G1ScOe=Hk+qlHe$YqZ_D*5T!{POto^Go>-jNk8K zx4*bZ&-DN4BK`jqsQtN9Gg+Ab^=p~5^?&TQ6?FNI?2-C~L0W;3BG-k%fLUavB+*}s zS%g2HDzsFXk=S^^>t*tTTu0NiT?M-U+zRG!oC7bJiZ-pUn;OgM%C2wmEj|UEX^$HvI}JK^ z*l3yhA}$y_w#4X|x*aYQJocysrM?LtS1k;s3>0W^UaiGK!w>*)aNLapYQ_*CaB%I3 z1Y;!nYROK$o*g-5xrx>*_OD8R)!zL~jc-R^UTX9e-f%T%r=H)A{?~175A0v1|K;Jt zbNIcD0t4nfTXIS&6Ri*IzFTq%I+OmlYQHX26fvUN|MBC0*8S_p|E&8zTdodo@ITxZ zMli)v%0PvN6*2xUiy7;NoJN%L-+3WG|4Wo@Ajd)NH z@_##Juwm+-odTLM1qcXMmnOk!EE87p@2yTW`9C!-f`cM2Y|g(Yx1=J?>D>NHPi{eb z2FPK}uZxNz#BX4@O22J+a|)M3WN%>Ie~cBhZ(_9UL(Ttax52}3(B6OA-IY=QKbrRM z#><)?m~sXxIIQSDI}I3?^#61k?QWEoeVoHTjly^_404G6kEUx4;%Hoy*k6_Tdf zqBSe)T2Lh8ZVnTT6Q|NTG0Tcf6!V9b*DpY4Y|Sh>R(0aRFgs82vhU=}$o303Jk}lb zmd`+0oXh)>=aiFeU&AXclr#lIHG?*wdVL!K-K+6VhiG``Csgct6+X#0h&&uk!g`ff z%Ui3CO>oxpOm7wiLEi*muAhXeZgN{=`SgvHH%r78`5c-$=Hb@AvUP80w*owb7KU0c zCbao?EMB&Sv5sO_QDj!kplyjYwpez40$by$4_)53HjhF*=X&8vwe@yJYsVEWHLPu6 zXfsuR#1~(nzm{PyykHr6+4}KW*QJcHUNYx>6c?Odo~}nm9FHwVXgNNgd+Ndryo4gn z;SVs~;&_?Q{t&cP>{vhs8hH%9+|RGxsODORtIte5>?GSj>$4uK`VK;~9O;RhT9wN} ze$Ue~8SZ0l_FP~K&$5@_+ERS(;Ld?fjNht@ zICs!j4-A?if{qwbPS)9#rOhgNapTSv+Z#x=XHN8Mov)VNnAkrYE`LU_E7t!mD*21q zMNI#19<2G-_|c!*DvC~14L%q z%B!a?uctB{Za{$D_7M<;01rf3F{_(UxI$Wc^_M6ihAJ^j6CEK&Fb?K~>jlFv=hF>bpsX-{gEos{BV<*vDiwyVI;NLbJV2hVVLRP33vA%?afDccqq4bEeop z4gs1^??d)!;0!tbo`>7DZ!Wyq+nc`rLAH>virM5i%>dUu-voC6phAF9WeR(#PTD-46C2GVcI!)$K7#Pd}wdTrUiSNR89&%}%l%SxS+DeBK0~F7$zAo-JEwm{^UaC)!j5pdB1xYQ-4wRQ-2NODS>{?mG-v z^qQ37VG9@J@aI5vC8%*-;1Z|dWVs!+flMPU2*iQR`MvMsHiuFQT;up`-?e%#gI6`x zcKH1)Qwy|g9!0fbAJc82z2kWyO5a#KQA*TXwiIrxldBln6Eb=^hkEl3Qt?c3emVm? zsA+H`@m|-|B7wbjmqNPGjYf`#Ia|+Tbep(5QiLqR72A6zrCejHf$9zxt%0xr;|_`J zOJ@c*C%PW$5KD?ngnX0dPfG4qRk(76+M%Hs?R2f)aBbDOcYZG>4p&K6>qbL)404Z2 zwsm@4cJ^Yxb~)Og(Ux~9)WGX45t;RBZVIZNUMetP;MP2NUPhnHYVNOo)cnHhQ_^E9 z*zKsi_s-IiBsl*ORmS+e(c0LKXf%rOVFv3)07enchru8I^MNDqr2Js0Zynm?xz=<4 zDf}DRt?9^|(lDU+wN;<0GTr$ZX(tLL5o(EXa%=yC=eqd!K4%uZH;gy10I(mqzf+OF zn7F~r^tVwFR;E9y$e-FU@ps9kiOQ=stMt%bQ>ySd^uz-B5}jDuV2-CC9!qH~$C|#q zb&2xL{k}VRK$<}7fPApR6&=R6YKp^&Gu$vjld`}Qx zu&b?)S%~ZmWeyslW6-g0g9f-L-D3{@)|d;?&r2g}(nd>IKm?$ z)G2sFHopDK=g8QXZ1bIgw|Zl^%3{Nh)$maPkBAL5663d&(e7tG_yo089#s0w1={kF zmNI168At6HEt7P{gRilwDo8K{Lw=&R!kf_jHQmL%(L~P zGRWsj8e#!OZIh&bGXs?sY4lh-?r}_VNt9LWT0g8+02AsKP~j%Ubg*^bSmV8C^OqIaR-pcG0Oj_@KUI<3;jv^b@P3T<83BPE zvQg(6dL!QA-^s{q6YqfN=zCgDlDKZ-ve^<(xMqnKs)3ti&gx;|>R;d(K}~Kmj?Qgk zd1gMDcVAkJ_Gx-TTKgP3#$SIrwd{-77L(%~=p^BR+FKx*C>U_ks$oXWTj2Y6r_kxe zR)w3|cO9y?jSOBN^k9uwps$Mx$YwuOV|&qJl#KfJ;DolK}i3d z0R6=!OlFq9j{vd%QGi(fRCfDs!k9#*Rht!lWY0sYs97|H9%tLmQsqMC@oR)2H-BqZBs-&)Z_ty^yC7wMopA@HqYHeev624 zMomB9^JhWJz&KFa5=A(qK@0uABEn9~hR?L61FQKap;38K^`;=9_8Kfd=lvKSRBvNQ zHcu?wY4r9)=gY{Z%hFElj%qEVkf8>bH{j@GJJ#R;4Kk7im!qu>Y`36}m_n~R1$wTi zk^)**EZaU;NHw|fho<8tZ|LwET)BPZHD%ZqTv~zZu#r?|8LYX|HcjfYyO44iig=1K z52e;87EICDl1P<0Oed|TA|v!bID<0>5XvUV)z=$Y@GADjFa-Dp$rM?X_+3LtrC^Xh zF=@TINOOfBAbkbu4%JTlYX9WN48>u@m0GXTR!eAAIM>hmRz|wWl~6t2LK6BCDthZA z3PaM6EsMkhk#ZEj%Qg?QEM)S^%H4W@F)7=16-n2(fYZF;au%!TRqL6|qs4jV#YQu{ zl*%B6YdpoHO!|9tAClNMm7Xdai+uz1>+5Tk$@~0U0e{MYgUp-f4)n-Q={#WRbV4^FIjJ^4z zrj|>Al^|7oIS}L!27<#GNCzX`yeT-fYqQK|Rd2SNHfMPKaK2PhHTm|v7Z9ln^@)`o zxBnE%#q5dR4$$z6pLMg|P8^fkyzlwEN0KQtie3xp#c>Qze3gndVaF0c4J<)s8WVFy z9Rl_+4vYXmk&l#Az*(x<+{`myZqY0Uk{>IMG&rIi5EO}%0jJTFaC+3_Cj?9CWDB_C z@sXgMFCRN;k-&qL99Fw^nqm!b20v91Zr&_;S~J@^lKU4xn)Y1 z_wW0Kn(eq&Va#X|Lan~-!>QLTO|MDehw%KHJzU$vifQ!n*X?H(Gk&{)_AVlnY)h0< zDiHJopYSlE1S%C1dI*K;=G~gK*_7CFfsB*#G*J#uIV;L3Z$orirs`>QZ89a1#+WDm z9m0j^vG*6SO`R}aKpraxOe`GP=*Vrr@&1YMepddI`XVU<-_iJHfguw1y|WS2#2-`k z=={^UR)|%%2zKuM4g5~RTj?-UTc@@$5^HOHQBI7HKxIo_)QSc5);XP$d+4LQT1d^1 z689UoM*QYV1k<$&?1|}=lmsW$dgBxmvEL&W($DrB-)JUwD_GAOBTI_EJ$=ht<%_>++uNh39e zlu7X;0cx!~&ab}n?SYiOGVAh^w-trDHwD99aD)T*?M^N?&e4FurkxK06y1(CiaA<3 zd|JNiA!EHU&_=svk&^pY9qf+WTC)3idSk4gcsh-riZK?USICC0k%UI@>{I)RgJ*dw z0j}QS!$n}FDhB?fxtzdsS!67_x-kD>#g)G3J#1QBUwCh78*xO=axM2-emY(f|Oftq*k*hxJ$aVkTwfxl_koi6f1Hy9t>g$&jX^MG+6r{ zNa7)Gfeq+R(vEhZU4dZ?%zn8Ob^!s8p4m^0Fx#!Ti-GhD4{o>>i%{}sbLSFNPnH9c zGeOr@4~U@o$%o5&xPiNe#~dsWMft|`n2ucAE(5@s3e+V%`-P%_P~PRhbob1N$_OOx zh=r?^D-I1%bNfaPLS6>F!NF;e*{ca3r689A=jG*-Lq$=>Bb=YS6Aru={%QIASAx}H z9qxVV*4RpC4z}oR70Bj}TcSN<6_f@acxzGt#Q>~kCFFDEh}I*lm#=ZnsH$!)!V?mj zPAB~h6uYpvOz>Q=(rAL`c8AK1SG#g?L38NGg0PrG@FcJ@x+XMesockP0^DSkU2zr*71+^?GI zX2h^RA-PYk1EH>sbPb1uts`7To!RaVN6gBr4?`?nlx19JN=0@{lHz(&H^_?St;QX~ zSL&qX1KaqKNZ_BaQp_YYAWusB6}aIX3Qpc!*9P9 zIvyJlOqhHZOiN)iVeD1$=ZeZ~*e`s4ro^I2$GT;z>QOD>VUtnB+i#Kr{PU%3fBL@ z90=61%Rt@_9aZ{|fW%9%6{iUAU%c_GzcBl!r~|Ma8@WUfi^JNo|0g8V2-pn zT7YmyH&{=YxJ}5nQuTLv>uTD5)Gr8`0!280;pA+ zreln$p>{*CGs8L?&&pREq{6?Lu=*nI;PnAl;VR6;lAUq;O%~ zuPa6Cw7?H6oNXUW!YJcp8r$^OfZ-{)!lC0EzT~+5_l>P|2WK7=lpl<)EzKbx@+zz~ z2|uSHLr-&s8C|Q6(kQ+IY)5V7Wzc~iJGbrGQTz&C(hM%U2e1y~h(2`hL#AKN3nYwP z!Z6U>1_-?K3v*OOv8#(LgqVY+p0}c4fJZH`y=i6sfPuBbBQK1GciNl ztdRrv^H3QuZrwMJrGhAqMb~f^m!j%dyDs2XjS;C*=&}DAk{AcMnP*07Fr`kddnggqOktL-V4kt0U42=nmIC=~Lpp4^1O#{iXzGX}yk-|em=%6-~i;~d097}kRWjZHbhY*=mQ)-b<06~>;cMH^J1D6c;_|SEC}xPxT&eGXYL72Y z@eWZxkCYW#^+~esMENx}lrKe6zf{I1-ZB@}GMIyK7(z(OC>y=ety|T__iZmSN7r%c zU$vD$yR}*GG*mo9Q5)N`Eo#byq{HPKrOtS+Bhn4z4d%`tjx5)Z{ftC_u^y6Jcbf|j zgP+yZ)$I+mS04zhG|RL%6Y?E9&2n%06k&CrvweQiS#E$~Xy$OVQ)L{*U=^L*@F4Tq z%2~I;(c_Fhdk?V@!rfqnD_GjWquNKHn*$b^{^`INl~nh9$ACGNoKK!6+r=xkI}kZ( zD_iDW%p1OUvyIW({<2Ii(c(TYTx^ru=Gl-iKYF#dvojUqTNFPbb_66fb9bxc*-Tz za16ltkz2DnPwmJ7^R*C|NDCbM4@?`0u;FUK?W0BbT$m2S_kkNzmJ=_USOi> zn>B7d*c-VZLIOXyh~tmR81%qEa%}k%(BUq@QnBiK+9*-Ud|G?4MnMdr3zQX87%yb< z2>Csj@88uzmO>ElP9a6FR4v#a(Nidy*2@e%w`^0_pf63#*`K}GGdGZ)>jDK$heufnJT>jmu0+-} zZgI-UH(Q~kY9VqX;!M3Av3W6^Rw!$jgc%2^7lRcd0Vim--xyHc(NKa3&W>?$VnR!Y zax%qTZEVy#)4!pJ{x-!g?T#KSO(gtkp8|16&&9SQs36I&Lje%RJuzLXqVAM(>$Q-n zT)TcJ_yAgK-s5pkuCCNV{&MXtTW8(;2CLfSK~@%a_(^l9NS8br4kz~Eggc;no6Kgy z{Kb9!Oa9`7e@9mcI?zWT5{eA7S}3WRs2Qcf(pm+jfo~+3T{p8IkU| z-o56wlCS^(==uwCT8DI6ZU4Ie&CCEqfX`Gzrla|3QGtT;YlesC#YBfnwkfjJn;bYg zJ8!}MILy~CS*A#EX8aI4%{J^-?)~QG<~#XM$#-;3v=hspahVn%ubGh~h;Knw**;V^43EHHomYdNI7&}U#81V&H_5+g@S zj3Pv4ogKa@5>~Or}8LF98(#Jol- zvSKidZw28vqiP|nE@tAPe1e-pb>*@Ma&R2iphKH*7`eRtsW+BF85-tIC~V3arf;u} z6Q>eu>Mpl#Z<1mXmy`}YggejV@#;;4ZhL9^LU$5Za*Q#7n@(9@vDqjRvA#3ioIi91 zZMSsq@9ThL^SJ$tQc+gjSkySv%Hi%f+=)f=nqT)cA7vy~<1PKR&h1Q6t&ywl`c+{h z*I5`a+njWxkf?}wHYBdwm^`RkjCPh(b;ul{39Uy%en;;Pux?o1ATqX{J(|0>)6(Sfd^^oy$Q_Z%>s&3WHOd zto8yr*%;3Zs?aG+Vy!Qgzi$D#5#V__!Wno2vS!vndWLBXv-AxbVs2Pcy>&dFV`W4o z{1_v_@%}W;sFz7Y10o0Yt-bDWO^wY5@qS~<*$10jBC7V_cIEh`gm-MQ%X?|W{pE{J zLwExlz*vVU@ABnX{_=`b(?UBt{>gV%xb6K7;vOH^p|o$!w8A{^Hq~`fc*d^P$v^PQ z0ad;dk-Be_gTDLh(p8V!p({Mw5=C^wXd%9wRC+dRSL$oqt|SB7UMMT_v3^y*5$#?q zIEfR46UJ)-KQpTpD75o!%1w*xj@M+nJ{vm2yW^Go-I^-PUj(BpZ2#M@F@`^G_rdaK zcqlXbZw`74QoOWHr-y%^)U`ih4pj=Z^bTm1UTL*j36`jswiQPKB+~~JvYxZ~eD{or zDUw$3i8_2X07oQAL~I1s;3X{jF;32 z@yRUH$Vy$dO8UTJ-2}LUw1x3!x=!w`WF3tuWrUO2Raz+(kB%$mn9TjefHhw9E znumGR#?+C>_cJ#W1*!iCeqNpEhXu%6n4z@KS*jAEk**bf@^olem#Nb;n{Dfh)hVA+ zd&z5D4_Uou5Y)2g^226h@i8Vp-SyBsnv zkhhJ-q5fVX1AD3GO&M`S&!WaJBec*xS;Tx}mtu}q_vSkt zAP^;9BTNztMHAfu2Dm=H;#*%Ef*?MZ;5qacpk8ShPX7)8(Zq3iiwT0-)-J+NBn9cY z=3FYdhCe^V<@PnX^m_FPE)Vf*&+i8OUt~@!9DkcP-G7|g^WR23$Di7M?l(yUkqN6d z>HP5DFW-@gR4eUJSgDIa3L_I5zuL@_SB~H))Hk37hXst~ns0X2Q9JuqWEwz(zngYu zVtni`M)(KuL5_nC1uOG@1M2O*rMUK80ob7NtO6$P*m3VaUnr3UB#}EX%#gt-kka## zX^K8y#rzul4REJjqZinv8MJU|n;=aTqu>Z@R@n}?7}LEF*jlI+GeHo?$if`cI3~|l zT(t)w!{R6rk(51L&8+wR{Ix*~Ab2DP+Y{<@UI=tdCNDQyWFOvDToq0Mvh*x((QIq@ z{c)$*%-J0UFp)yuKkE@FT@EkLsi_=fW>l?V^`#7PC%hz`lXYi+@TIgC+n}5p>2Uiw zL=EeaWfL4lU*HLQiy&&mchk5viIY}=5{>k&-b~L0#roq%(imAjG`copSGc>`mKPch z-J~N6XumUds*k+&iWahTW!{yPA_fw0|GhR!2$>H&`7SwZTnlTQT(^d*a;x=htsHcd zX-Z>2fT4I#vek1I^oGlfzLluj5tY;(xluHqFo-cABPmUD;6e=Qbk1mb*e40&%$hOm zFcPIl5v&@}pdBHpaYUdqcu~btO@p<%m!^ZKnTG0Zr?dBxbhj_?0Or#e<`1HcZlr2` zWr&RsmU<@*E4_Brrk(~f*z3@bb%{C5WFObgiKv%LX^o0nXPT{mwL_(i;a#^&x;CtU z1%FdIsnv9uDy)uMSWt?0tNICC7(D&8+qT@uNA{MIFwB9W!SnZt35b%{+gLw{f=e2| zW}?y-*va|E-p=@?6sk|+_KCC^E-6b_%^`aRRkPdnt(Fv2idqe+p2{58 zooXN$9PTwqf-S=Gv0c!Osf(ZvnUAR`0Xjvvu6}`#O*;wC^75_Q_jSZ1<5_O|x42E^ z{h}Q=+A_?}o4oy0&Izxqk&3IWQioJYbZ^x*!-*8F)(DeLlg}?)q0AV+adpVkGS65zjSox2+TBGBvJ*FJ>Gj5!7+yUcA0R_!osUtdAcs~aH zJgfQb<9Y)$I$=&XdI68eLxm%;_ab}B(}7;g9Y%y@;}o}@)+F{;R*)>xP-&n(Mh%V$ z+P5|1PDpS8Gwp)7T2Yk)WGCQ9W&)hdeJ0D|K$g}COeJC9^d;t4iLg$BOn(~3vRoX* zdYEJ867Z%N#j&DLC51bfV`QsbMVRxLAEKs=NYc%&Z_Rla^+Y5QJ@%*p2##U!kLHO( zzPjEVIda{l;f#Y`;U{$drt2%)#$PfNT7~Y~PoW02k3>b3ky?Qa>C;V;OB2}QgDXt$ z9v<7KC`SwgNm%STu+cCGcX^@k3I$W(sR76r@4&AZLy5w6i4U1;B=E>M5~__@FZgzi z3_)OjqU|FVW%r5sKRjr1I`JYUiHsB|MOQTtKpOber zVZ4V7lU1)i-a7524xRu$BEb*Rg8bF*;Lf1Cxg{u#K#M$hoO z{GR_Z3&zpl@gb364rJC_oy(cNsGLPcbb;E-C#Ep`%sOSao?Dp6NhH+H_L$;Xb zhXjC7Ey13{RoO$x%{_3y?@n^zrv(XmbjDvTZU?(JtA{`uGdJ?z%h_}Kx`orHnl$SG z1?}%dVMo>aK{3WPLa6-m9Kidm_3%Xt?G?cslyD#9Xjk%&X1od#MCX-!L-@b%r|hlOPtb`lhTB{Gw5Vw zPWUWw`f*#Y1A}<*#u4wna=Op61_(AwUd70z25uUsq5skuCMYqS**w4XYPCbS!l22= zldUaN*Vgf1&<$sn@H)xl4PQF~=rQH{=1HfSc~+=wSQCeFKk`v)(oXsgsrX?*(S$wm zpl&klA?20EI^tTQRJ&uOo*0k`VXrCT$3gSZaeZ?AP~Pg>%T|8}2yM^;5MgDM4)}Pk zW#Y#p8F^{RHIY4wQJTf5k}eFSN%GkFfKdC!tw}#KwwPs(cGOunD=b5+BD_9C{j+rA znA7$O9sIIWMwxt3va1YM*=g=$nJi_ndx@cA#-9-Ocxl%MPcO0w)wKfg9bd!QHOVkH zFjCPDgt9hV9=6Y8$h4i^_9iRKp&2(cP9377;cLc0(LeNK@T#L`3PYcCzfH44o7qdf2Bj4vh1MG3oUvFfDXYh}nX1{6;r9%qcBP+x+%L zaR_i9DGB``(FnTwQU*!{O zkdC+ZldVkZhBeX71k}Mm$LQNeHQnJmCs4^;kAw>^cag2vXP;TuR(^^xQ6Tgg527pF zt|AAxGR7L*)gk}+nX|+PG_`NVY>2#CXqLZ!odDdC>#MWym#4boSyL~0-B&p0V#9=M z>_%iCIPY~TifzK`a#gl_36s2u^w4`(Frh0X19KNg+m=4w0Jj8JePA7AcvQ!xmHl-G zka9{(To9dJN$tu8a!BDmGWkYAHsElwHNu=&fS~#2Oz_LW;fBZlI~OOMDc-3MfGP4j z!r%GzUj$dI|Lfq2>5tz4u>Lu4^*eV~oUuv&^@={EisFX%As5*aPrm#H1 zqRX;JB>lm(N_@IG^}XP9ffyyu&trxc*Z`AgqrX63`*wbzQ#m$I?8$ROZxAY380+?8yc7vTv$p zUfe1)WcG2clL0?6lT5m$wt_%~MQ=jEv<&kt%!9rw|FHD4h;gwsv>dUjB<9fR zU4`F(>~re4{?S*YgT`SzlbZ`qr9V-6vviazRM>-M0xe(`=)2G z>4}1Qx~HO7+goLW`35hind{Qps3M-AZ_2sAEK6&-=q3BT0Z?-$DRVS97GW&S27J`{o7 zI{N*=l}-C?FE+*o$p;A@`mMed9r-h^z+6bdGxSJ5O6ZHF{Vlt$UT%`}P<^*nd7_E+ z>C)3+L3%J6I-cvUIWw1673myAYU>!Po4AbEQ5AS6n9rA~1=`;&(y;zTbjAAjL03%w z5}y94V@=r^e>M?WODZ+XX z;;WJM!*~Wq9T(FF7eh~XHAEwsk3FkB;6Z?8@Hhya9xM7&(^d?#uQ8L@c`7axv);}u zX>62acDcR0ywzCmIe~D^au4|IJ;rpT#I)~rbS#4SP>@t`SXY2_ah(`IDlCBjfQ%Wd zhY%y=adXVE+_lS(QpX31oY`Drvu>B6Veo=o!9t8Ok?-)!k!i@h$Ds6LO= zWDw#aR+zXL-wihe0c@B1g&TD;#~3|Q6|`1w$zc*&q-hqwARXpa;CqKb`U)W!zm=Fm zWy(%54>%F;;2e~etTdD`6&9}bZ2T;@N(LjFM*tqLwLX4taIIjXEmP2J!T*Y6cm2Yn zi}j+iD7TWjgw+|4NC3d?-z?6ioCY&=|^8llWRE^s{ z<~4>)Zd>C-MuZq58lP_K-2EDU^wQO=&)4&GGH^l;VrS^Im zLx5E%LZ*s3Fr8u7OtpRVpXAa*7Po=-{)!{8|z_DC@4TVetg`zQ^Z8CMHS7)=-l5?m!B)1Acew zB--O!Fhb*3XfO-5hGDQ|lqZo?ckF-RATIf&Mw@ItZeJ~u+TO==P!D7ei{h$*;qPRP5H42+QH@_HWCf+oBAUiwH(XA%>YY>f+iaf>4LYePOhta8|NaNMVEjW>qkO5B`7!!eCJ@ zWFvqoCp9Yo1eWbwa?G^jJRKcA@+|EOx<+S^fxpNG@l79rC6An1kf@^RMnx$*sA6wc zEh~e%^AtZkh12XijiZ)PNCer)qM(Ny_y-63@Bu|IaW!%T>)`xHjP`jJk*9an)*Z7& z1R0tThL?dx5@9ptq7&(jgazFhup%!n>&UlyBAu|P{2N06qAY7dB)}9d>Uir!kpp@?OG?BvD7hhYe=>Nk8`DR+{o40QO= zP6nhFESz{E%E>L<33(EOxwVOX21NMPbtooO23ve?aW~48t?DEg7pYuobU5OSo+n%! zpn-*3i80+SC{YrA7JXD&!1IVC!RR$KHCRiOfMuvSbZjD-qCXJZuFV3)M71Ch^v&X` zvEqbAA}6sNF;FlU-AWv>PlxYqv#jUxzrB)<^wmcJx2s}I{S;(Pu2h+`62o%#apj%B z9t%gC+n8*s#j`?`w;X8tgL1pq61to_(~cAOv|&UvMa`6%n+Vw$tabBu8(zOrJV z#wyj? zI`9{H8Qb57mofiwEsgC@9Z^cp!S=7gxQg|+RaWRCGJ-KM=#)bh|e zZkZu_OG_r{n3tuaCBKs9qwAYswVZ3bS{wp=^#$&W|Fd^*cP|~#P_b@CcC#M`$P|P$ z9QUeYPp|QS{!d7&;&sDL403=v>b1GA?xbyMm7#Y#?0&~x@W<0~GaQ&bxNAM|3EgS9 zfOF#Rq#B%@pFn0|ld<6Sj?4t&eprlw^M1#~JV-P+nV$g6Uk}xQIXPQ@{e6=(=_B@7 zy>mBnTvljQ)WYYNw7hS`fHXML;1XL)DTp*FqO(jhvop_l{ECiI!au-*IoYvUqpR8K zfmrJhD8Z&ysTrH&35VFM69SQ|J;?;vS^8vp1;fLpLpLU5X?eeQbKmjkZe!m78SVFR z$KukY42iB)48T-OqneuD+KvtiK$|nw*oQrV$DltFy6;K!`P-HI#%d@kh=-^3 zHxHp#x^$agUsY=H&f9rM`3$&$RhYC+qB`-g-`zR~f-w z$1DD2LN8Dob(u+l97NSdxNdw7b4Kr(x^zHVSsyX?lp&E~nd8x4brtkH&dk@9G94Pg zRnTxUD0|5NDE=jU+1CuRa`ds;4@zrVt^)r)@6^v@gCMxflJ;}2|1?81_m#*q_ElHqK z9K6+&ew1j7s1C(?nsDz$luY5Tju;S9*o_1zd?%BbN#-4s3JC=gwH9G&&Xy4@OaSKC z0QbL_D#7`lEl)6Uc!k&+b&VTvySgXd9di1;ax={87vUNY)#RRK~9iZvElkC}g;tYC5{I*L$>E%07#q`N~I!C`Z3#q+OXRG0T&JshP5+ zY7k(6&|0@WMF(@i%n#&aATQp=cgcDK!h5Ng|4v{3BD-Y!`>@M@Ih2R(&#+7O-{mSK zs{H4K??{s0=z8Te-Hd7mRgQ!_A&`xDZw1Q^Yt_+O@&1y_B3xLr_RIK8yp&O6 zf{sgpR*pKt?H!1$N8ee@0!4+aPz!bqWQU9Nz%pgbqJb?1Sz$2kwf5?3)nlT?W-SA{X{WQgb@w|Hxu4RfNOkrUwFDRu;D>_=CplS^r~N9X~7{ED7R7V4E2DML#i z6J1=#p#uOQ$n2|L#LPu6Ib{B-pnG$0P&iV4qyJ{-%Klo~VWge72)zFSpkTE7%IUVV z((C7Hy+x!=4l`R;fhC@e1RypGDA{MKv=*P*Jznps>+gG(i%bmv$BsRFaeKntCAgnbNk8QeBO5?gbzXI7NS_p&6?NGwn?@@0^e!iCx2z@9AsOy>; zrX@0mJ#HtZMMn(XC2QB4(VaZV_-&wDt5;B(-s1p&DmP6iV6(x2aDsHOYV1eV_rww! zZ##n02n1Bc8d5=GpJ4GO@Z&W5kvh^N)Ng`@$-q%yNN~a9iiNGa(p00Zx-jbh4|8u7 zU01ekSz64@%*=d_n3*kRS!6Mj#mvlXF*CDdF*D0zX13TFac_ICD&xB9g?}>R_q5$k zTOWIjJy&0Ijp?kzUSt8ogz7K^83Sa4z zlDu1~QoWid!*q=r-<)WwsSBUyTtz#pZPZZ!+BkR_3Gc>q%O6Ly_mq#aOG^_#=ib)% zV@;;TaIPD^M%>+D6;2%bn2!$a@dKVNQ1K9Is1px#qvi4A z>~@E2dE_QGf~`{<@~e+-7236B$e5biSX_Kpb6839uGnDesDPakJip$p?9|ZV%NmVr zx%(|uFHxVi5?@#WbxX-MH_e)Ht}Vtc7fhC$U697GWT*h+iA$KLyAwa27ttHov0P2k zuk7SEktr9~KgUk~8ehQmci1T>0Qk%J0*5)~KkekKM`jdxq3u!JFRdxD3!RdEQd^(B zDIR+VE?#(SlT0&uw?JN+3MZz}@!@P`L91H=oA$cul4(z{BFg**StKG`NW_7i6_-g95X*DXOES(=#OZq{91Mr+ zU?)6@apxZd21If{7;hVTtNhMF{z(!dur|ywf@549h0Rbq(g10jP_ib*AF(jinJz-P z&IqfAmuP@5(QsYEa)$X#4YN~P{7~PB`5A>Aj?GX=6d93t1b2>*{21_k{zUDFM*XBV zex>hm`;7kSc&CIWFDxS#`^gVwWYBRSgx-s2}CtGX=RW8aBSz7qEjmj|WskPbgm|^Plk*O2Y)3cV4TgCJrM|MwL zUOW^I#WH=ZaG~V`VPC&Ds4?2`UCRI1Ft+g^)vB!Xl9=q?3a)3`v%s{#fs9#1x}hl+ zdzQqM&Aw;BqZ74nrK5%`+EymZBTpb!U6(as^IXxx>cOSkZt zxIC>PDA!t~js`fXVb3@@)ZZWK0IUmKBS%9=M3B9&h`-YDZ*pKR;6G=Q0@vSaS^Teo z;s5&)=9tYIGjhiZ9p>=>qk(wdhNSjg9D7QG9p1iT50-cyeIx3zvdZkMSIQUiI@)$- zgV6Prl{DS>ZY)lX$9j^lTaU3Sa9rddZXgtd%Uv?~HFlMNf1hDqtnkCMe`uuHIUvnX zgwf2ITg;swIye6uJqZ&dItWB-+r@1QwIndg2#ZucK$xHb2rc0}#{|NBA9AyQ2ZFAN zSY>YCy~d)hg#g4NO*E0I#tK%JmUL`6Q`Yuf8pC~DXb^LCN7KdoZ&?I%Hx{ghcmg42 z;Ce)=dOo1iSRhDEqIYlt;8$JnurY7~9?Fo@%g;|fRoO|F?55r!SuCmO9JPsTyVoNO zHhJy@5+Ez=Lw~k&F;3_y91ir8(W5F`J{1m+?mGuA&Lc>o=PKrCbeYw3mL&JNhAQ+$ zlT8Al)$C(&KEGbr8`FBpUDI6|o*N`&sV%uy;ZdCQ%?^^v&ty5UO?Rxy49ue$i;aNr z6ls#c)>@u^!fN*_HAod7YI*(Q>gcFp3^U-TC7Ft>+{YK9OeuRiKV1;NW~lz!LauN!4vIpk zncEL#8UTAEj%F@T7UY5jy+ui*%27V@QS+iK7R)-A<|08`oED|B8~teA{aw#OK5fGR z=np5vObQ_GU`g^^fL+~O@qycYi0aGD9)pi+Xn~b7qOEL_GLehZWB&vXa4pHU& z>$Nh#-y*6k%)gSjwZb0~f8WrzpY1|dj5_at3-0&5HdmJDD`t_Sv|p8VKh88}mV3G6 z88ZJYOl`eC>N@o&Q9aXVgGBF!r&s@(=V|)V4>q*h4`Qm_4-xJ`L2}F+EpxUwsI!9y z1&6&;#OpyqR>xR0(PxdcRBIVNc@uVD6^QbE4L5SA$hKC_?LoK*E?wEqcM|CM*yxy;W}dN`6&3LuyRljD6pQbBbtQBG-$qPu(E#MoI$(E?{EE9yA$%ER zXxvpM7^P0y#U_S;vuLAUhL{#~%`2;t)6ZA(YGa=qciMxEHJe;YWTr7fC2gCsl&C4* zW9@O^FzwJs3=IvtE7kV0D)3ZQLMXqI#|UE^D;%|NN% z@IfA)-ekKWq~sJN*!R_|K<_hLW+&HOJ{Mem;bDVr1u&xRg*be8c{Dd{R-F$V2xkkg z1ZN-Ol?@fcTaR!G?D*-y8K|hpAbVnf83bqA&zs5Is2)nDFQO;kTk|e1Z{;BD=e`&e^T6U*Eind7#9#;4hUcT6Bi1aYI{OL$7&zj%; z=9Ei%UGj%?Qn9+tc8|+Rv!8^b$g52L@FJPQN=U-!t6Arl53}cjnT6B=xU;&&`k@gsRA`o&?ltz(P{z380IZ$P`BH559Lu2l}JRc zfkU4YSIJH6ibwpLB9RBD0^{UTfx;v~oQm{e{$NA(2I%ev`o~Ij4*a~w31cYHMp#ZV za`}NaK$sR;1~M`C9q8hkcvIC&et$Y1M?U1Zt1?Lz5uzDsI&g4+Sn~>GCk47kYIzKxt`0hiZt(S(YveHY7vb4rZrnelg;U z@^&a%sss6iRfuj&__l{ss{T5W_TD4fn-Tv_;_%7M!)9zsH?1Wj#sg{tubHSvXoz>E z6$UyttHl~3=c`%2yi3bVZM)nVYo}{vQB!5H&e#t#FH%@d*4iWB*FJTmL@pQdcdD;G zpnCiIvt47Zk9p}f^6f39N<4*ocoyt+3hw;D{rm^!N1Ltn?HM$(CMMbI@ZYIh6$`3L zXRne%gY8nbN+Nhhzg^=YiN;e<*H4)p0iKqvum zAktA+s!*N3c{?*`%zrV4Ul*YG8*3fs7vXU`u3O$QeaGwVB2^&|h5UW+I*8>)et3P)zyw z&80*FVi8aABL{M-pK7VMi!JU;U8c@=GEHLFw5_WVUo=X?R@OH~jlues?~9vxpS;xj z_h}gxnd(y_BKD^kXT-EAXSPXDP*v6H54p9TPo(Iq2n5MdxUdZ!!Vbpguzb1t|56JQ3SUg5XlsWe;yr;4(Q%poP;ml zY+=85jk<_zXw(u?R)ef+rj<`XCrbuEi7kQ`nd@>35etXN9lGF09xhm|a)zPF#;x?* zayb2<8f{+5*nJ>j*s0K^c`U(eucI73aMVw5Tyqw%g;(bW=Q7vcrrhBAX&9ez>Ngr zng{d|>+W{MzCxmd4&q z*6~JE?w~8?UR8$MB_W1qqSaID9<3mfg|1BC0@gvGvHTtJ5OMjt!;R4mmPZ5Jr(dc3 zH^CR+|9Y<=;6IA$zttpCkJR;)b2{y(yg`+plg{D$%%di%RMm7AJqC+KRuheHC1nATjJQqCW8@wof{KblIgNmh`8Y7o-t! z>A)EVl}3}LOuWX-FCPOB zdJ~2WZ0|=STrIn6p;JDA^Lg^{tasyDA{QHMP0=~6s#(abUOku}^@ys#{>ZZHG0G4< zkKCkoikQe^fNyQrntOV#co*P&?_K?6xf}{%v(bjPl0l_fCR5?S6|>5_{MkSc|EJsn zx+yhB$B(Bf`7HaN+b!sWya*^v7gNFR?m}scS2IrMKbsvZn=P2%#=SSb6@H1YNY7&^ zH~oP-v3mZ@@ruWXcf7*8d#A8#+}SCaOjycJid~4>f_8OX=-t&lL2TLl#$>{=zUpG8 zs%yE{tG)m~>K3ps)hrwOdYF$I*3+McIu$#gqULUg^$J2JfF%5@H~2S^58$8E`Um)r zTJrB8AWjzcUnkH0cNcs3m5Z(38m%xb`!QS+to9B}q8A+@h`lFl7HEHz5N)|MP}Rf#{ymy4nr-dpi?x))|>_5@9*pv~=DYinYQ%$ibD$ z1?!wdpckT9%Gif$By9w)7SF*HS#0PfYXSUkZiHOzCzgq}DTR$Ow?h#TR}vD+%Yrfv z#yvU#u%}NV7}nP6y(HLhIx4p%Tk3HYFhd2%iGbwdBbtG$(%>I=R*IL`I~FI3IZ}m^ zJ8kQnX%nYq<=;}o6y^^V!u^cTj z+vv~|S~b$*YX1-`M&;MW7A!fb3p<5uE?_hWn5dm2#P>tw%k5EeTalK>-R?xOz{XPU z?x-^)4cK@0(1PG-D|O+N=M2+Tc>FZyD&3dE^e(!>=;a)H8P6-9(HInCeCRN3HkI>y zEe&)#hmwAJ0xXp0a~MQ+Zbk9EUs6_71f4d}zI(ZHxu9{F^Vxe5ZKZY=)8DjcP(3{` zWSXq1OxcpGuSzK};hwA#y=X4%$8mHs6*A?YLVdl$J1Bi1c)PLd_E)Vf^^s`F`e9Pb zkWXK40^zE(AxZ-S0GqmY6D$x^)|yM{yJMP|$7TGs(!8P%nqOu93-JMe6V3qtIdBH} z*CG-4x8Mvb>#xM8ZJWW2?mblvIMI`AY*{v7JmDLFD-D3h6|y`#$z~i31d45|FKQ)Inz%zVYp(^PR+f zg}`=>s zOU{b7{`>B=-lgxZGCKO!%JPg$T;IANJN$Ih2Wgz=2D&Jvlhah~L|``mEy1YH;+%y< zdkFUhT>A%IiDePFd0#XIiN<@M_Sxmbfuj?|5&YH&^pGhy>|8>6)Q>R;5zFBja&H{* zq%hfjFupeUEeFN`!WyB>||IhpbM9^nHaK_94M|)&F?dy*{a5rhOrm)yI!+% z*wLM|jB?V_nON@F$Wh87;kvRY#Vivp8D}Nf_q67(+Y(?}g5dhHLIhp9<4Cj;hlD9$ zH)TMO$l{;X8r6M4FDo_fB+^h1Wjji5F#Kq$90scbgK~t(xolCQy3k+3hdB2zghxL? z7|QH6u1kw4-#%i;%voS!LR-Z}Iyoy#u6uqpZ3|({F{~^^Ix9;GgHlTL9Y1v(&GNzP z{R%C4QKjmpLXT;P&;9#rnQ9R(Mf?(N_IpIQ-1`Z6*O+l8SC}tS+f8{DZQXl=Tu5zz z-@*%~j?4HdA0dgcZRhE%#PaExn3k?p@l!z)+PbPRy{r7;MUM`2%gE`?E6Qd#yTwhe zkvG!INtQ9~F6+qN2}62&NAH|RM9;j(xIkG+Mxs1GeL>Gg$n_`C+xNQ2elT=5gK0jc zcm@B!r0iWB&{AKfqpGA7S{7^@XO*XeC(Hf4zqt?1weMbcXIEls{dIaqdv4%p=t$sB z`ib#ZLjO%r1N_JIv#~P&wci5xx9)#(0e(GTBIA#*><{(GSuCn>t}{mZuMJ7F2RHF5 z=4ZSrb;e2^%PNqW5c3b0?N~K_71j&UXJ?sd^^OPro8s8`PlJMK&k^-;c*I1!!EsQj zPs0!r*$^QGLORv8hQXj<$Q4$c1!%0qmY?qU0u}o=ggCiziNCN0fqdV_hZp|#XSW5~ zCoJQ!E$A#1CsK%VVr@joUKIze6?#dke#YVCUKDP!BT-l|ZYZDwv?~!4(kN&m_zfG_ z!7vI-2!bp}AkG5vAb8wC0du66SFsR`$(K;=#Fhdy8Ql&Zn#4AbOZdd-nt&7S?~36g z#8-PMKVUtfFLaDu0rTYNph#~t<2BLgVj!Mz=>Vw^Cda}QWSpL zdV{3j)y(7YP@758kTpNWNMiy;5pNS6%SGy$gFSa}lULG3;Dl9sv?m7i3)U$s^+Sr3 z%uLLghfmL_us&1!2+vD;z*DNYq*z!pb(D$eJ)$7fezBCQFlrNAX=EwmQQPxuQ9 zu34k;zCS!aE+68Fq~Cp-L%qrKr%;&9WQyxl7}xqV6u+B`@_myjQZ_W$Vw53fj(mSC zw~C!;%Q_<3#N&@`V^c={?oX15UAfM^DTS~JjI!P6Gim$TyM!#N}Z+jy50Elrg#o1Lj$w?G*CttT+XfU)gLNbupQ*Bw%FlqT%24B|I&5s>5m@yx7QW$5?^$&x*f-^vFqz=q9HIV zek4>Pf9%oKUg(TrL-%JJGGsTHo7`Y}9xDJnK2iuZH@O!+z6<9|qg|CLjvI<}t_EHP z;64sZM9I351-($)Mb1M)i%(U$tgszFDtwcVj+s__ad}D+9WQLu%Vs3_0UCY3@xWSUUh8dK2|gQmAEF6s*HzXl@QH;;TVNQS_G~IMNmxr zqZoSvs5A|`p??^{5fPMj-pp9*aoF2 z`*7V^VjhP76K>#o;e(P4S`T{%>!hoeolcY`xO$Ah_iIZUcjuRx=#Ex=m&$`OiI=C-Sb?r`@0$GqpK2>%OAf zxY04`Zw7|O-)KKsZawp7KTM)J3tfS4K*gy<=Yyf&!+Kn(MNuDscG7-3L<+Ssz=Uap$0{{E)^@Q=1t`CiaLY2N1(U5k=S@G zNW}PTYF3{w*92oC&pz@TEEB{NvB5%i(b#EwbB>HVg@GlTAj47DL+@Z?fi^LGll#Ou zRU)SYp%_A@5CTu`VOm)<(q|Rn1{FIQ-5!`jZ#ZSs1{tL2Iw}_cPyQV2gn?iC5h06O zXf3u1G6)-5BW;NJ}gFWFaxVm>v?jg=&RdN{E{gEc<})0t1y`dpwNYdZ;eO;p zoG8%4h{_;c?UH;Z=5%Gh5=sTLc4H?d;G9+1S|db`3$lXiRxT?AN$C2`QBO=$i+?I- zYI1QiG1{m~yxD-T)`}hGP{E`IE!@!ehj@<*f&^+_Lp(EozRDmJ%nh&Sig>MC=?DEo zY`sYEnjgY_LWzqbGDQ{9W5yfFVQG`v6Spf#ReUMTlZ9h-%L`$W<;t~o=_(Fa7J#P0 zP((abikL5n07?-m@G7xZnmo#k8)oeo2oVm~X^5C*K`wHm+b9q=m>)VOHQpFoFH6K` z;Hr=?h%u6jdHD$Nkh{~kB=4%|vDUdJ+kjl*uW$i*(C@OV3YttLQ&&3EIB@f82ofD% z5jX4+;i7*;bKQENtLhf)yNTXV+og^7op5QkMdiz>e&Z~ki#(-%Tc!RdfB$BsZfb|)<4(LC$CZ042>0B0$1a&0W-%KQnxgA0mvbU_3cdpZwlokB}$!LvVdBtx+Dd0Z_O0oV&z7p_n-ACo%`juDwzot5ZL$5Ep zt1n4eS(ba1EMh#H%O>H$8;`*`#=E@y;GrTx=AXkHySmtFRnk#XC;wZlB!_Rp1h?Sqb3w37= zj9%ZyrVacOGS4m)1}DV4v;K%W$8n>KJJktmB_Df1_!b16LTRl!C2# z=#QWVDBE{g(eydpQz=(E1c=~G1!(iaCZ%^$pZZ-CO=f(CAEi|=As?$DIceKQiDexi zb_okDIxk6jToHTIWqQnp_bnRwd@lmxD^->IW6TSk{fl*$ieiB9Asm+cEz^ZZD5mMs zW~Az3^zppq6*T~r6$7-EXkDBgxm8vbm-*uUMr>M=D=A|?cp2NIU{%XVoH{uy)tX7j zvRsw}eOTs*)Gl?H@kP)&o!}AJs|E)`$`i|UXi18G8cu^OIHmdPUNo$~cw0H~AoK5WI3P32KgVzWQilI~ZU2+s09k(3Q1SnS6yq`xXvv*a;j|W?j&k0qOdi}yzV*Q?5 z-^@aHHKc}l0^ttQfP^)}puA2j(ZZ04e6`U=izt3mJ7&lfhvMUW7KREJHBbR=_I83% z!jS0PB%{5dnNmlo5VRz-0b-<398w&hIEur8l2Bw0oVjF}!-3RDm@pk87T~O3r(u*3 z#rLd)CFo;elnCkl6@yAMC~N|PVOGzbQpvO8 z0AvA(M{2B-59qVZllE0Z9yjK?91I0WVW6I!I+mhk^#rhI9S_*RQI!$tcc?;!RR?xL zK6vp3)BAkAW{B`eM*lEpdjT!C6_yKysnWN;-Ger*U10_;I?cwYsBg*+1ZWWS@Sb?s z;f7zMcUjDGLsF!`)a#^F4b|##^@>^0hFwHddT)=v;zGKZ^f0XEOlvmR+@lw-cgcwO-OT=B}vRbx)p7k0q)*jb(m0{(498N?C~p~V*O2@`sZN8 zzeY~|du{)tPjUWgOr-jn%^KiOj0iuAMHQ;4A+tJ{$n z+2qsR7lA*5BNYXYO*%Ec4cz-|{Ihv$Yb!)#&mT)zjqx>A4EZV)qUXCWNwg7-fh9@^ zoBq^w>;U9eT!=mTtPGH}9{7cT3tr;}JnyI@)x91y`e=~jbAL<#3McGw;dC%H1e(+8 zbSC&Ha%nHIp?@Yhp5L9aq)35347br|aZvNnS%cUfJR`DLJy`2dWo98W_z6j31SMSf z9kKDk73hK#VZ1za*=ZaRHdINGM96@a^+`U%Upx(NWCcDelZ&7POL-KTivuI!gy>ik zN7U8Tq0aUdRhXJ&r!4DK2!sn4Rwt8|M5@gL!ft4Y2d*`G2?70pd&DUHu>Y;2dod#A z5_JoNR@e4A2z8Kgm!yJAD;n(7D(&2LqH(fcmb{dqq_`W?hI1sGb=Q1dKcXu-|qNN~cmIQ@1t7 zlJVpWtJ&1#=i4UasYKPwRea5&l-{=*zfCPbJxy~l)_l{@_&u+f1I^`+!jjcNQNsm0 z473n>STM9u0gNwxw9!qxC}KU=beaLJlfv?UU5Z%<1~i(aDdVmgic*(cg$o^Zk39mj)jp7Kl| z6<~Q-vDsLmtHCxvJN2oI-YrqTVc%1nS=8SiMHii>OodAj6h*%gVG{(7qd$Cb^1r&DgKvHTgy7VdF(QL%+fd?c0Bvdb$_+ z-k_=#o^ZQ?_u*jei)+?vRAG%8Qj^J1I>)OiTo(!`V?S-U36CNyy-kaWpXnV6<2Y&SSKh|{o8HFp&+#_EU%l;bjlliYU6icxR( zmkBR9tnRN3jvd6l@~5_@)T5PCI&l$_`nZGsaO-MKrMp_RCioV9*?PEcw0ZhYs3f{2 zh7xneLnlExh#C~XjXd+mYlWh*gj=aa9$90@f(vr=L3|IVKmv$r39LfgMZZP+EEzo% z`xqZY)_P0GOF9f}1Sycf*_e(EFxz_#)~m52mtgkGKJPZww*rTe-lCQvr+Ix8^E*J? zN#qWVN0vAr{e+% z*S5$XKzyHw?Ekd^#;45F+#Xul0*ng7YOBg6t{t*7sCeMfq2zNU&Y{{)nck&zr+MU* z|BJ9SA_ZuI#*^&Ga~fwHZFr#pF+>lQbshI6r+ecyX&y!zGf1cMS5PvcylKh+3aSr| z5`lN1Bc0+K?5uK?bEq5`qi4}qwLf6$qhg6iwljfv6$-1*F8Rz6pRP*UOr1=@^k=?8 zuBTQ`-l$fkgmhh9DXlg^aUq$vGGw1`W_TuGv=@qBR%XC4MO_Ls@R?Mwwb|y1fi4Y= z1&~Kx!yFs9Rv*3USURbuo^Y5wc$IU3NjxAD#Ct@h$*1UV=b!o<%H2Zgrjl%gsdv|R zE#x?F9Q`ak3mq!lz2FbL(g*(`)bl8HQFVHM?i78nQ1+DZO<=X5YSCFMxsCHkyKSW~ z2qV?0BaD1Bo|=SnQZ*E#*!y)V@<5LDndJ+(3SZOxujI%1oAUeT;Mu<>Zv1;~|0AB| z{6!y7ma65SClPOx)h)AK(`7C8sE4^W2^wRB%FWIss@*EWC;;}4gyS%I0zOMF*d*A? z;;KFThuIz%_s)+TUk$d2AT}X~0^C{bz;?iHsSSHT{h1jdLK+}+#B~}a_)tIlY7ySZ zN>Ul?mm?@?;tx@7gBUCS*^A&joxo!u1m@xTHZLTV zp9*puh&{%#FOXX_2HgEhWrhMbbUCGcCw1X#1of!rTRkYk;E+l?EdCKSZ=TYnJs!J| z-@-;|EkV)F*3>T|*jC8KCacK3~UUIU)!)OduW&)-hM zpyW`-e?9|-0${nNtc+6Z6yfY>Vgk0N-qy0Z`|Vw31arYZzvR`etA*tWKJ*;G>Peq` z>YpN4sR>_T0Sn*Sl^^yfd5laE6P);16(tS5e*J~9PBlTbaM4aX3I#zI6}-fs&DdQw zelBQl%djQ!`05b?ih2x4uazY&__4R`KvY>G{M3cRSd$W?bu)OQr|Eum^y=Z-kUL^< z&JA@UZ{*Qt^B9@=I4rdINQU<~DArqBV*Uok(F+?0V2`%Y>d$DTK7CVM@##>hI-#wg z<<+gSkQbZ+n~&O(GGx9#zkcts<&(*E-*!Xbl0uMz(Fv7CzRmR*1gnQ1jE?dsHfhl( za+9B7_trGtSAO0Mt>~>TK9ki;_>`2>L1$a%kX?Q4v?;B<#7*YzzNrVk#^0idit~+v z(e^S51{5w!?SFb##EZ9-#w)HxJ6@rzVftxz-fp_CZJl+ktO zuQ+Iyq^bxZ*IMFigNBOd2XbIy8e^y|lv=sMpadYhK?ul1s(xh&fZw!)e-4G^_zx=b zwGJ*YrXm=QHepiG56LvsO$;=UEU$`^jU* za~wZ^{&lS`YqRsvHKo2W2MiX`TgeXWKC22!PgM8{Oxp9Se4ql9QLmvAS+)Xir#KiY zj_)(b!AdM+~h!uSNI5r4A!(Oe}i2$LJ zh;%g$xY@jAxH=$!)C~5^H(`ZI5=6x93l{HUwVpx}{w3rx6c!;wG%%oFFtt}CEzct0K)NMH?1$-#9nCVK=>O}kUR0aCx?zgQO0^1a0YBN3ZUD}f5 zE$GS8#li5F2<4zn`a+q$*-}qs)_5C3L{%Oeg$Z8n)9`8-ZOmX|AfX5a_=ZDTxYb7! z6GQe6Eu((y2Toy(Od!>jDr<5+L}sjL1!ig$Ahk?L&7aD$L>j-(7!gjXDr}U9BQQC! z)K=jfmD5CxnnguQkOM-tOnI|t0h6j@4S691X|VmxXHI}&N3GbWN6>4CBBIH`8O0O|59e}D;UL{)ylm5m z$f@=>e$$I*^}3Bc39463wSp&?$?ZZ`cbkHd6KB3ASuSLrPJt$OwX2BEfLb0<*p-QP zZkQ0qj9M;qH0SyZN9bc(l&B-hmjTBohCG&+4LPbnr`OHuy3D?_9uLK0^lUDw$&RF~ zd6CQ4he8lc0A+pd31kQ8q3{m~y+sq`#(j@$26fe_%@#2yDRy_UYQ3*!XArzQ?FdLPrNJE9rH$R_55CChN!z5Iu^rWECo16Sy%Obr zkN4Whmiwr(wyz$i`npBKTUSr{&>Vfjd&1Kn^9edtBDGli$HCY+IOTp`o5Iyb8^*pe z`6&k$DnI1_=g7pl#;tfR+UeM^p~d%spZosQtUq>Y;r708Kk`1pO^cPH{=$7&ev`?v z{BxKr=U;};{(EizGn3`~Ox*i4$ZpmLnhpb5i z|KByqGy1u#WM83(+Di#w{B|Z6F74>dcbSL6>4?*E8XAGK7AH110!WhJ&)~$JOMn^) zlg9qJ|I@I!F&i-gmZLBwg!Yk>Fb_F48mqZtD4HAI@*n>;kQpo0i^-id%?Lxl9iahG zt=8w#-$SfX^fvSLw&|4IRul0qA(mDzr#J{AS3&Nxvmil{_KH+9f=6pq$2I~fD`i=8 zO(vHSUlLI_cA`ly4f^EdZ zqa$oIJOYnUt}1~lJ30UTv#sr;HqTg};v^U*>XJy2)X%EOA{}iFh#KhmSi^bP1-{a(m5J?fQVRm;XsadzV2oCW794=V*8vgum< zk*F*d&Q!Uw_BMn}p`5R(Nf&3oWs4#8`De+nO9MQaEjFeh(lm9cI7`Ih18n94v>|a! zE5$L#LKaLx6lQT9Q%nEt$N)x^#H1}HNL4>RJUL=aG4X;ogX8J1vnDKc6A|PoPQz$^ zbpat__>Q%4vRGr1$xL-nd$gb29<{HPyFQOfsffvx7HIE*+~Zv9U_o-aCCwlm_kG6e1j3()rm_t|F! zq7k|U$3w~^Ww8EbvizK2n^DCtKga@MtYhyO6cSzWxd^IFgU5HJ^^zpQ)wV{R>8cK5$iHEEr13 z_DbKHsr5xmyNE5j{cMBUZD5D`MqExeK`mAsESI5<=x_|DSybjfM%x6Wl?TmPGEVxR~`JZddb!8euoXheIh|$Q$5iN?% ze|jys#G^7hK?K%Jbq*b_uUmTGQ@cGD^@zNUVDbr2qJWc7fGA#|iP|$j$XfIxh1x!R zmiz=aoobi~rzx{ST<$myqz{Gu?yuv-OZln^gXh%Fp%F;YzKlPt6}}cL(@V&0d4vNa zFT#j`nTrq1vO+Xw7_c5LG(gJYxQh%#;Er*7UOzZ}&ffr$CwtWsEYR*}Jg_q&VPZ!v zR49kcUoU47*XW$Z77H#B!>NzPORU8X;-rpwO)lN%P>aRNVJ=q>=3?fzO!SaNl8?xa z`7%U=`W2)~0xh!vc}!3QJ1R;YNnBGvn_p`2aseCL!@)*o69S1^-k;&a-2gR~4C|mDtFsA#m}^N<{s6Mn^=_PpMymKtbg^Ezm?R-#qs~!3iF4zEbXjLwy(-rwA;MZ zn8TMm7|N=`Lb6i$Q3##0pZ`$@QN{X#S;i`!9bU8^PPzu`6F{O1!1E#|!zC0L{h8sB z+YfTUyaP7iOlhD-nk;A4IHUuP(c}L?UrutuB&6a_$-V^x*%FC$Mw1_xFrh|dsY-}! z+}4PVnB!mN4%8pzj>NypooVR(!h6CDkkZyvG*%jbU@;muX>V$*RDiJ6rnMm($$ves zB0NNXHmxLVU&g5)5aR&lM%;~dm3rph7;0ET!la07w5A%wf{sreiKbUYKA1{%pGbX} zJnk0YaFO2z+sNzDr*i!a(neN!PF$%)ttMfr^a+z2pndjb9{3a4Kr_yrz0b1m&xnx7 zB3cF5d@0vDz5M`YCea6m2-umJY_ZIk_T7Yp8HICeL%{y`T@ZVnf^?V5TRX-Eh#&*Y zE#gWlghg}0iH|HvoY2gaT-u*T&O>C+1<HUmSU)IIhEOISU6qn)#HNeDt!Gs9Z(IPQHosx)|SWzey>9?gYQT0RFFI68nD0Q*O z()7hG@vff8?4OuF$Ji`B5)wrgPDe z%ETC1HjBmH1xbcI4eJ;+mioO&UaC8^aTAThH}27~gqfl=Db#x!-dZ7=w|gNbsCwFY z>WLkb>nT9!NJkx}r_*mFolmHq=QS)}UI3&A1~%rc2W3bzT4VDUZQ7Byolf)A_hO{RmtYEEB!8c=+AO9rmP!1OEQO#ufSSt{VUCBs}RS;O&FXtG?0k zc1!Cel3`0Gh62g^mml@}yl@Gk#z0TRIcMw?*VKnocXj~xX;Vc0aUvE+e)M`ffpeG3 zI|v^A=GR|2&~K7qmj6R{oSDQ8iT`V4@BgO-{q1B@<$ZyPsRi+TtFfMC;`yXDvvk7$(yfldcJmfs$`^x5I$ z`g9zq*6tsj;M8bJRfJTu2z{nsAQ;?}4H5`(+OQ1)9Yj)LB)>=OJn53|c}u%3mQxDK zDJ<=_^OdE45c;r1I79n`L?6*G&Nu3`Lh>{E9S`GpQRtswWs&PhROV zJ2&g+*|@rl)gVR1jugLKxBT2^HVPOM0X-u_uyVGY!#wT`Q=zBo$xphU(?a7Bt{%a@z ze*9bpa2LO-aG|*QAiCYd^jth6&*%d3`^VLm^^Mn%x$?QU^uB=eA|llW4~N#1j4)r4Ryy~XY&~54QPfR^&ikqy zit~tKd`~VZ32!JW1N@^9gKd&(Nxmm;8{b zU*NN$#Dz5y=eODBdHgt(0o~ZKUP7SuGzi?JzYd`lcv_eC1PYGQIz%h}SzJ8?K}`+W zAqrB))zkH^@TD)2XrM4cTnNJ_EDU&C+ng|L9h7kS|mf}7Qt z&X9eAa%U}rJ|`?^PEob3W2aY#nD4bjJ;IS%uLoEcklP+83w`S)Cvbl8qQx$)g+58Y zfPJ!^Rx?j(-yk80P(VXr-=hc%cEoWynnb%c7!DpV9BJq%>g}&awj-7cDWGm>oab9W z-@v;0{4DP@jrn!gq_6QSIWE`Q2MJ-DxVfrb%i_UDa8vl|WjLeMC%0;TN40GP)uY{S zl<<0+lLt3k_wqtF5+p)=q4wTegNYU-O#4irDM3QUUQ65d-|qKu5>Y#Lb+bkDnB#$o z69=<$Fi+^UoIoFWek|Gy%aB`(g>>P)s_wjsewGHwi)?8cr@?zQOuM7^tb|T~@MI(n z!5OYJ8Z4jk`?7I2)ymuy(#^(=bSIHkh)X(%0NyL{_SkT)G@xYF|6=c*0>fIPMcvr8 zZQDs>Cykvnw#~-2ZQE&VyRmJfF?v_`KKJZ>*3LtFUTz=m>zuFioBtT!KTyG&yJc;K zL9vABB6TW|ne}t~u55+d@p6=`{8_6T+(F}60FMujF7^5dr#)UZo@+d9BO4CbrLIs2 zVp+q6eR@p1&l~ns5Q3x9u&qmgUWe7RF7*WAOP~Z4;Jbx;R_v>%SEG-JW(m31q^h>Z z=5;GtW;qxTO|7A?4g^WCW{FNo;ESu{%wb9wSsJjz}acIH20I zeE$A|3%o2$Ng^4rm&!h6a{&9=h#~jNxRv!p-m(wY55CPU41gTL!GEnqy>yScjrc8+ zF&aeMPeNiz_n>0WucF%Q(yp20rfUuX7apREa@)^ZODNgy7-NH(<_QAI9wb4`47<-E(|QUI7$&o? zFZaEMs>L0ings{0%51a{5YUdT_0h%YI-zQyH5UpUH8Vy=8a@c_w9BL~*boVEXLwO+ zf4+Gfmlgdf$68jOvzBPHFj|AZd#}&uUJX3orslle(0iyK7KJ%$S;yeoy}9yxb&#vM z2@sp$>AR0D%q0Q$lF~!Xh!?}JQFyq4pL66}0VDm`%(3yAc>0=CTIJ#P?9C95XL}<&bm11C#po$8PMXfNL1ZaW%;U)xd+0aK_nHh^U3u#}sR)~m z3OX03jKebPEfX!AopFSvA+FWp85BmW6b^V#BHpgmSoz!DVfVTXfEOpr>W={WLwU#a z_sBcWe@C}Wztx(}#{6+>_Wv4yvNcdTyl~n^NzhpMqcDd*j$LYgVWXg^GeElyknlZI z{Y%`E6Ovp)_@VtlMrP_nG$JVO7ZfdEY4Bc0L$`j=Rn`#LIs2<`Q8qn#%dVEeYKf6t z{pGlG-{4&D72I`YWR-_%D#&h8GL8{%NdocK^xztYX5e#S|9Kk(3d_g=qzcU?kPBXn zjO)?#_UK$r!_ONmC*E@x`kjY_0ox6#=uUoWjgON2&bfyYqpD*-UZ-z%9)U#%d4I)Y zqx|XUH6DIWbnupRGG-SufQuoTN`q@$h?Zv2elVOe-abD3=$UHT@7ndfW0IxTIgyjm zQ=c0G*$jF_r9Eo8XA_iwd0iQB$_ANLCee zLlk|`l50PMOrRH~iqUAj;DS6wb{WPdX_Lq)|5|znKdP9Qq}CWeiKFKp6UudK$Zf@7 z4OT>`-gCf8h#&7FZd=@q+`cB;^*NW<`>@_Rg?|j`2rzWEuDWrqAc@xv@(FQ@NpF8Y zUdkW=aED$_!cMa~I9#ojl9U?o2s9)ple+*&7>?wK-t926?hWOniZa0p2#o`vWw{@K zxjDAl_rVkTs~IGZf!>(vYiN=k()JTvXy|~1KsnL{w~W#ue#L>4BDPLl7@Ba~FJTIX z)2LNm>TBzF0|R5UyLfFBQ3PYqTgsK0aY-Vy)wzD)@@EefkplTk{c-WzZi*K9>#v5# zT%25Q)w?v(qal6V^R*6l0(hTT0wSLo9uC^;DUPdOk`{QY`nLofk-oZQeR{~Tw{dCly*E#@4Ki4{+*?&Grt`x* zv`rm;odXLsp#xJnl<@|_R{xn<6Y~>qBk~Rlz42P%!LtTd(zCwRp&ES_bNt4rR`2mA z6Y7&>4a>e@uSrrOjXXd+o6XM2`*-XTw z*C;n;hW~M-{#GR-!^hL?|7%!7TNt^A9=cq)q->f>?96E8wWbaQO%t_&0vh?->m*QT zz)o`_Ey+O!r-QLc(idR3h_5&W&Ob@;T>+nSJbj^>4={l8A7=O$h$Qn>hnfd-070Nb z7lUyM9s5@@TB8sMZ@O~$I5Bg0EOLomR)qXr&k{7??Gt7;<+A-%_tJtU)sBW44O!~n zc3(`;0goZ$Mtk7p8|W=kV1c4%oKv>?e1|*cCs;%%Y@`K~XOeD;b~Y|crOcLoV(`R>%*&QZB8hieNO4z8BbnJ=8-$)^ zzz6{MBjVgd%nDOJv4yg~0K$DMSXzRLGt%nST!Y-nZN{t#8is~d65A%s0B-=l!)j&-b?Y9sa?43QbP{=K1s>ErrQ?{7Czv5@d z`aZ*NUgz3Ym6OY_+`WKx)`|~3DSrbn7$>V9rUPE#w53rPc;g;r&K{PzOgLXjqf{Kh zuady(&YV4|%hVy%Ja*DO7AJ;_7d~`;+%xKo+&Ou9$^Ao$ydB$d-IeRCnF!ZDQU9mo zIvSjf_t4Ys^L(It{R+vcmHAc&cNX5= zG^32eqJ}Hd4a?m|WQ@z3K|W}0q{Hz6-h=$ObI_yp$yL)Ut1Ix((W0J@xcfuV#Kivh zaQ8n>;@|R2A5TO2Z`0^0&4WJkPUrE*6^ZyZh+8}*K@)zDg5p(BkbHj9maH?NmW=53 zp|LkM32u{m%Vf-XG(fON04&&-79{~ewa@dR6hRnjWUawNKt)(Suk{h;?JnitK&eA# zLc-Q><hiopFyr9uUg#0d+BZk%?SLHU!jw z;Ahv8+wtAzk(5mixzDGgtT7vA(3hHB4$pQ}+QQ8Ue2;6^D>F)wr|KMM;|>@`Brrx( z{oJ)fKZMbUX*eYbuLhdu4jyE5R69a&gweF1h=`PWzRvKw)jiBnQb>>_l`4u~z_J#zo+Z{4T*K_gM%g(%=d$Ow8cVjTVC!owH@Rk=I!$WOr!Qr0goH+8Ps`PjR zgC-WRNoZAki)gQuv&mq)eK2VDm6o9u<79Lj2zSk-KDW@O2O;^qJd7?dLP!x8J9<@i zDYb>u1Nq&<9;h}N5^2Kl8ntN15C%ED#8*eCfYz;*LN%aZ%uu0psj|48Ln50hK1S>r()`|yN2eiB(|1um$9BiZx(_*J@laL(_IZ|u85F5@D$g+TnWuv zTlFY0@OV??IyU)$p%MP>jDyQO#KVZoKF7B;6r#7aW1@$m^sa*`#I4B|40vc={l?c3 z1ouIfs2MrTupJ71jf9%8gF@>)_weZh%zjJQb;`DWlPo_ZfAs{}*+OK~fBVt^iZQzc zrC$VngfFQk%SReNpbRrNbVxF^3`-3pGvVNP-Y+)EzHO4ONb4A!hxlTiDoJ5g@Zff-x5xKac{o{)tKnyvQ(>r zHZ*v8ck)DtJ!eM3QdvScgiYyMgnYy0FQ!h>PJS;0RRP4EETwtU$FyBP&&a;)kpx?W`R?O0T(08jQ)SWh^Gp3di| zrwe1qF*4O?oJ|+@I&~=>WkF}#iBnqoi5-|`x1)Y6Vai!&_%DulX}B*++GO!I@m(%b z52YVa&isegh?((kr2OCa%gn#ykJvaFKBjzy|3Cc^Xjz@>;-;iBrBz&6us91x@l4;K zjz6{cbfZN2`}3r`6~l!f6w+2IyN&V2_?3fTPcJ)Yw(q%smUM>Cdx$d^E_4Kqi76*%X1H@WMcYn;Jr%+ZogMgqnre1m9P z!2wS2oE2pF`6D}YASXKx2|E|=fW&kD6lVFfAvycDR3mPJE(f+(uR|IkD}C z;}E21$79%IGvAxSirAd#AJDbe2*-R|BJ;m#a^eZsCmVUK)GDB% ze>c1H(++g#Hm(W(dWPkk*URWGIUau#L8Td#ap1*sB}4-{1m=r9r*xiA#T9@rh&H7~ zm!{8NB*{d%QzYmo*<_9fdnenko)!wS&!Yf$GJn3!f04}o1#fUX&vVjHxl9{aI_tVv zOH1M4o}J$LX<*DfKGCl8Gf2BC6zv@N^4Ft_;M%_HI}J~Rs)x6eId7u#ZLrnAvYC7% zUXSw~6~S&N9o3(VgL@qPIen$dj{XQZn?&Pgke_(zRBOs+4$z0XS_&)J;?M(QSl4dt zryRVJ83Xx!L;&=|A*X%>Q5Sf?#I+cac8x@8~NQ zc9xGOh-v>CA^IP+XY_^|S}?votuiMIRcUiF>V!6K*AelqKObEsXIbz?5JMgZc08tlBHx+Zb!NYjcw-lLF33jS(Xq$&uXg4v7)OeFL) z4rrYduZ2<6EzY0`)}R^&3EVM{P+&xWdIpYrv^}-o*Jn0_@VHWs3*EU1v^X7}R@tJ< zij_T0ioU@lgL(;*yrZ<|I{2*=&v9ONI{d{hbRo`OUk#Sqy2*y8>*^>!(y( zm8#EW8*AhoaHluR6qx?$qGMw{o6Pk!sTT!U;k$iqwowX9caH6vPg01*h>{K-#dSFQ zv0dO_lEaZCTiCesFlZ9iC}x_Z%^n4WKVvQGwjRnH%5RHfOszfB)K=-c9Ewd2YooqG zy#oioqCbB0o&TYoVg7sU4CBAEMCRXGtibT$g~xw>@Ke>zD>}m{TItpQeDLON)*h*I zv_EKPgnLLTJPmbM&NnZyb`uL^kqQW2GCVw|Iu>8E{>c&<)VQ|5VpN#vNu;iTMLi)X z1Td0mgFQibvR(V|pv6l7M1}TJVWpTB+oiZ$wz!0IHeSYsHEGv4(4Sk6~4)}KEW z9rUP4=8N%FcdoU$rWoB-U%;B6^i}CegDhJssv`^egcwpH-#q_4O3Kl_+&v%20twpFd5KojpslEHpW8_f5aV42 zTHoT8+HUsNx@b=t&c5%zG;BJd*Qpr3*fs2MxLf}?`_d`61w6bMY2VhgQPQwMqr2Fk z&)dc0P>#kgHuK%1ZU?7ov}*bCwBb|;Of!oQ>$#0#qVK08D=&`xf#OauqN`e74BXJ> z+GeHh{N4^{&(vDxiSocITqmhhc0ym^cf0#I(dx)D#dd&~yh~Vv&b78klTDMK01%^h znIB>Ohw_K{?~y-D|CX-Iza@WIK8iyX|Eq?Yo&j~y8EHtRSi)-2i9Q~qz(!m#0b^Ja zCkewzvGHf;X#hYjWhFn@FR(9yz2PzBUKy?eUdW!hlSu*y_DBH8P^wTK3WEmVAVIEA znaM&d0VV}`PKBZbW&52O?|3tqiFEkA?6XKV($Qr1bRMP&_`GB)!8xIhKbK7PV78Fu zveRVz!*8w0i;?@Ktj`Nz6(_|7(a8jsF)%7p<50>Exjg`;Qi#ob9*BGHV0(dwGaMc| zu3Gl*TQ}uEXgRy4zRV;f@ZL#{N1ajM-ZvCaD&W)YwzMKZ*OMX`7fE#RnHf(0UlYWHBg%M|(MrS3C#ONR)bKdbAxY(@LvWW@Q(dbnG~on}`&K&^6SN%yG)PP~ryI zeWK|s%wy1=JAuI2b&~P#NTKz|xL@{}Ow;Fcyeh4UgKL)3xMaj}@_{t@3!R2+EZ?1B zfa?q#G>RQ2FW>v0jJ=#g_zcO^Z4_a%|Ypo_qLBn$;c$*A41u3`csET}B8mhFVvtAIn3EAN->^eGERGfO4 zxooW57|T52;I%b+XTPJqH=I zTH`1f1!W{#Yl*J*18sYF)W5pO>xu61-W;xt{|L)J)IrRge-D=I|HhK@x5^9HKf-d= zdgVXwLgvs*MvZNBsuN2T(#VdbNHj9o3x=62a&7`2XYOygPX~PUg{Vk~r#KxB&d#pO zhkSOT1-b<&#O*(uBl+Ol?f@$i@=fY0WKKznjpfzdq5Mi81fcW19Ipgh zdQ6)3m~9_C1C5+vKtnE)SJ?fPD9)TOM3*OoAjY8iD2jP3ub^c@i_=sGag1g3jJ7uwSreRV5Ykec1|5t%4qDNWJ$UbUCTq8E z!mkpItR(uT7p%{#F3>M~ZftTKzG1yUcj6KF)6f(zq6^h9fLYhKzPcz5d7K%p1B#*D zn^_J;7ajAw(t9&*o$^JniE)7-itmJ95Vv?_(d)_=OmOqp&ER25-L!AF&h~>9RbUut& z6@T3)qIe!sN6n$*gidUzp%s=T6q&s!j6{y47eZ~{74GcVO1wPrj-{n7^`k+gGn*Kj zOwrKe0f(Uj=bmMvX3dfKG3=0l6zO{^cviz!z>AlJoLNXCo&!u0Rmcz$kA^P!&Q||J z&o^-p`s21)PsY*Jsjg9z3bfugXL#lJjF z$+R+7`3rhlLda9q!B)>(8`;q?8AB6Wy*#Kwv){XLwxw%`Bhv*Gt}munF&M2j)A59l z-!qg+&}bX<4@EXb4@3yZ00cChoX&rTuNF%dB>ae(*t0)!6MD(-q_C{Y2%Ra8ov%uRULcx%l-345o+|?M@)0 zZ8rP-DrZFT9CT|XZg5_3zOLdNV~BX1+>hehZMRMzkw)vE1&_Jor{;>qB6=raUki+q z4^#*+Tm^&;r1Yg%Tl?vQn9*O=QKCa1W?#VjVTG+e!r>1^1OqNtkONk5RP(M4{-Mn0pCGdg96%RRexV+|E z?0n}W+S*Cx-vfjtq!#;nCX5i!59!m~>CZ6;>n{@g=(~H$io{h5D88ka1&f(*7URU~ zj!z$j;{spz{rgg`80pzGZ*>pB#t%+5XeNqU>^e#geiInnSY1}bSzQFd*x6BI0WeZ$ zAvRF(qljE$BZuSfCbok%LvOA-Ixnwz!lDdG`}le4*dW8;P)Tza#b9;+l#)ySrdqD|@qVwHZ3T z>p_)J2O0V*Vhk?jA;f7t^aPS%(-&4$Q%$Oq;Sa)-laIhF3gJ%8Nnd&TAwb?-cZg@F zjM(b6O7It37a*Z5yFeCGfddLY58T124+I8Srn1?#Rs`&sjZ8Mp=v`4ZpZ#1=CdQYg zvwYSc%2!I%Vf$<~(u_g|y@{S@pErH&IYqKV%_6SkW+<5fp{ELXnL3=7mn1R(8@y>J z&EuyH3sKe&3;}FaFDIq2&7cmT-UwE+}zSg=gvB{$h>P`H&vSs;gSr!@?c!7Qv9 z6n?znLV16ZPmD}DVW9K<{`)-|)UH`fyz)5}xQ>LYpGGi^Zh#YP&6xOjYk)E4(Ifbm#1-u#0H}Zc{!X8dnE859K z4U?y)wu7v1n5c~`gA(0a`tU*QHN4!ztczTUhs+cw?nOmF{s!@kCNOlWc`MetH6!lD z%A_fU*(TsC-V^l)Hnd+foci9$mD^cdg7Qtr)^9CZ4bC=dS-g+IHq!**G>}~|Ag`38 zi?_t+IvHE%RUhg($IAm>Gj}q^(@shy#^P9k_=?+QRE_7_S|#>mA2!76L-BXKpj%x+ zV@fsJWJSM-{REKhlqLV@xABMGhvo0_J}m!^L|J~T5$>Z^3BP8vuCk$cJybV$>tqla zizsB9vgcUTJM(k9*7|jVP$-2)u^yEZ&0GEKOfEnfgR?4jMhNCP#LM!auimkNhQjNl zypsF5ch?&&0V1#!3s7>1+;6uIy%YuU5c=fT`Uf!_;KGS_czw0(dB|S# z0*PB@@n{5h70uxc(RO5q_qQT4WRCnmO$6!S(XKJfx#n?(Y5Fr`#(FS0)2Bh9Cj+$b zV0MPKAz9IxpzX-_>}^FSNgPLdV>85fI?}$bcP?@Vp$Nfde4?XTQVTg*!Xgswwad+= z7(^zE2+AN~jtL6A7!P4W%iq8=az%V19_78XE0n(gjkXjfc1IY?H$^*rc_mPJDU=9s z;C^m|hJDMT(|L~tnBO@@%cj45g0|Ot&OUOSVj@)p74oc4g4k%eXvFm@+6bp5uz0mjQUTaZk zUZ@?z_2T$25hvNGx4_bev(Liox(8LxR(B|S0a*MV6=^#YA%a{ zbigbXv6NBb#*#}SxHQ|%O?cbM608pEJ*UPPhR%?4#6zNkkrEbJ$UueX%$uV^x(+!F z(7^lJ5>!FqPDt9IDHkIC-5Z^^1kGO4`c+Y?f-G_wvDHx44VIsI?n~ti!2o5b*HeaI z;v*fEmDN-_gj@~;v$+Znm&gJhDwyg_ZFViMYwC<4Eb;iR~FU=UcDzV8&1fx71QwFce z*pbowv+;KEbniN^0Pw7xS0DX){?JXa{5@`p<$nb5|JQ{{kxJjA(ispur&KHElJ^|1 zm%*^7l@qHv8a^jhp{dPp$R>598v_6PV{jXKN z{^eJD8EM5c`H$c?ze0GhR{b9Cm?{7AnjE3*5;rQ|FmHlve`tH_9BQDR23sV})_s`t2#w zGucrn2p8gtI8x$DYEfTKEGu#R1aII85?8$uGx56eSAN0&{O z>)V7WaL3jl_dJp4L6&V%=P9T$xZ8j-fU}^;60B2n-+3A2uqo#*qA~LFyYC5lv;^WQ zy!6Ss@k53arR;oyU6II2G^5gnpIFiEAqYG#siB9qQUWak@yAU%_fT`@4e=J+ADB2g z)tn7xX+BBiz#TSFW99mmmzjvg^cXvDP9-GQYIC96QW55qTYv8Dn)No~{Bl0v*-7cx zX_W-EaWK)@S#LdZpp7m#`Gt7R?dc-z>%O388@_O(2yXk6uB>G!)~7*0t&nkP;LaHYvo>Waxv%lSmIOW_Thdh)uM9KYH3-}RH}7d zrIhVZx+n`L?x<63nt~&FsGaem@$u2v5q%}ju%Rpt%Wo|zW&gOV z?f*?1oah^X47k5Uamk!$w92d$R0VvKR7^;Tqr_)%ZZhloy2zN2(8|CszvFN@(lSK8 zZPxFzlkAJ0_C+PqQ-BCUP!vd4FG4JAu`*yD?HYLJ!GeaQ7brud`9Khi7Tj<(>zyxy z8L87x%Q1^!Ljn@q(Z-?%B6?HbfxsW_fu9ak?C6Z2oP-11-mC`VHfDC@fFF$Z!dD9_ zYI@mMR-7XzKR_QM8~!1C9O}wvyA}wMAh3f%k1;Hja7kaV)g3~sO(u~~eh4qO*9wKv zGb(Z+51@edB1JhRjlOn~j1IheY=@s%QlHV%lQ%UE%~(t^v1N^A{L zFp;ppI1}H&m^$r=B@wDiJ!X)&ha z5FNaFa5uXqwcgn1PPv5P|8y$@7+3^0Zybo9@i5RYo4^6ShbP+WXou?jGq$aGHxu< zmtkDgZCbrA6{{tw@?s14O+CAw-?A~r_~MeQWAt3fZP^rMNKKjpO^Ov-VvwpN=i7gn z9A)LUH`&>_vf6RB#XL8~7`=Dhjmc!exd@(R!6I8A`r``+Ja=rI?ym!(O-TNfy@qvK zWQ(@aP_9$HqOELeXt3M3mm$VVCmU>0f0)1q`YCmsYjNLsYxrxq8I<;v&>w!D2T6xU45cw&3#TdhZuj!E*En(vv;#nJ{h(=$69Iw=Pp!nFsd* zkI)3w#)NP}rzCx9!q`~O;29yGf z1w|fXjk5LJ$tagzHf<4}f=9q>pWCq}2w(c9SIm#Vet9LQD%r0CZJSLOvjRt0{2S<>E&>E&hd90R7xi(Cxs22(D2sDhF->SsQ@C8knd z3KKn!OOvczOXt}120vB*Y1z7~BV~#`aPr%PLeFaZ@}kQE?Q;96;P8`005|=n_H4CQ zh|Pn4NmGeGJN|em>^FlFcaQO|r0W)itD4HO?WBh7u zWt1LH_z1#3)NZVQk9K4Iw{~Ow9qq=(%=}T^#A?(E1A^Bfwde`7Chf*!TzI2$;W=Fg zPlG-okCLDuMT&M=j2!omn+Mz>KtXc?0;yexgU4~#xNKf1z;}wP;rDu(&m<&440$9V zRQg)L5siMz{vk0T?$M$ob^wWlH=g3ug~SVcbB7E)yfL4n$OFDKPRDXz_7F;EDc%xP zqIe7Nfurwf38>PzLf^RALhP3uEB~L*9ru8cwh-`=uF2bgGf11QeQt$f`U-+D(&`ZQ z&k)qlgjU*KD13ulOrDi@3xPp7P{XYlDFkq>6T zN-#uAYR^7T?1*rR0^Ep0$kR6kILWJHJWw>+scsJ5LTOBCwmEskffRqv%!eaN`3hsq z{=nA9P8HU4(8{+PvH}6T^!{$3nEFE|HQFIZIvzcU?Zn5 z#z>f}=~;`+-(CFOy@8Mg-}7CH-advLrKhoYVu5kwAqhv|gUUmHk`+TvNhm*g0Q$sEtlfDuV4UCJTOF?dZFt>~&CQ=9 zhAosy??HqBGCB>t&pWrT;bH9se2ZjanwY?a|x z-zm%wQc7X!kvf|C!kTsK)nq~ET`y>qT?)G}`cljKz!~q$;W`Jq4jmv_7L$Xc@o~Ga z6Td1RAUIr+;ylSvAiLo?u6;)kvQef)`>KRIC4{jJ;wZpv(R3|gS|~7MoLJ9)RXqIk zA3Wj_X=f*eInr6&LJ;_3fGt2LIf#v=$RKcts+8~C(y{CYc_j}29$J+*t_0WZUfJYW>8}kdwsUtxP#4J|@oPi>s5bZg9AoUSBwawG|tz^3PX_Teu=q$OYFlgVC7x^RF%I8u+`p{r5ONGpO#7w>p5E?Fe^Mm}5QI=N zdjhii-k5qiy0Sr}+Tu-4+rEHxQCHTE_qfkhk>SB!a{EKs#_3c6)h{L^K;Y$O{ZsWq z4V}xKRK!nUYQ+ngjKdYBD_*)Zj(U)>PHW6*+bf_}Y7lp==XK5AW*Y#?RUJ;UcINhcpwUma!oXFhv&t4e$!aDql_F9PV`j95}Q~!{){i&GEH-cgoJgsai zEQ5O*nlxkNsb6gBowt+kAG9WGGk}zQkgQ|-Ry^=M*x?c7up<>4G^j*N0$f+?y+Y!b zJFVd1-4@T->nA+%yj@^qQw(S@@RW$WxIN5&Og6*d=P3&MDCEjKsvBvB8^kDJW0qO6{_SKwIY)>A?x+2d!x%-Pmj z&5OT64R)Lx375&Fr#ne-KKj*L+$zY7KiS(B11d97y~V%MnstxNim)#_-*#3RN z!unf+g@f^gdxlc#?MekyP~g-X0Rxlt`%@QOaEQ4;P|7f` zNnXx}y|hI@P;hS)K`?6oGsY{9|7`dIL)^gCS_D$T-FfP_crfK}2E>51n+p0NDcj$g zcF!9jkJRpKX-`LfAp%Wqf9b&h5x${VPtbwnA;bo5vL`KsPNRlh=f(ixBtKhbEZ|Oh zA7lwPIh-0qr^XTM5aKV?+{Md#glmgA{M>BLP(FTcg;gA^&495GCkAY92&DlK?OTdd<&p{l~WXbN2!zhugQNC_h;|(OEU$ zK^$&?X>{Pwnbe{CYzep!JW-%n38@oS1_)k%!1sSzkF?He>3V z33k7Suo*tB$Dh%?$vR7=+nbAy73fO5Wr6d_{IXEoMG{$P=gs}>NNy5-KfKr`he{3F zY2`dXUX~-Q`LT4ZDUm!ktuf^1VjH$BtT;z&M4uE@7|9^|Q|k zmbdl5kA&2-?dnjEDQudY^PR&7itLsV=X|?T*mu+8I}_NhpXv;n(?-h>6knZHlLzhS zK-LcGxF(CTGm_ew9rQ!ZEv203=Df&m_J7`>uNvj``%bt73r;adci#%_xK?hq4ea6^ z%uBw>UQM0URxLOwpyVZ8@lvLfusf{H%LtNlg$=cL_vyjCUa-icoph-4JTg9lYo$)` ze84Z;A6gc+zsIt$|9k8g+wWKw4#tm;JQa1DS$>4CQ`H!u$qnXB8;!d{BI1P^3Ic^r zSrmeUI^?2!ejQ*?J6+86r!2A!5+0*3xDMydZ;abpTjb!2#nlaIu7uFKd@f5kM9FSj zTL#pG_yCL8lg(3tz_!uMi(wHYZ94wKVuv%lo;KJ6b)(WF|qv`QMB)f?241fm}+CS1v!B9Kj2fA|Mzq4Nkz=F zWzO*)EB9Bsmn2#K06=qU+x4MfqzjgQFZ@Q-00$lxcn}d3J^yQ;CPV1X2=YT4qAik8 z2Q8gXC=o9RCR}B}c3j$&jbEviT|RYu;tcJ=_8kjA92f3C;47;?&XY=-VZaG#3gF}d z6&6>OfG+OuHkdp%wWt#CnXN0?Uxou`!xyPMQl&gC)WF?}*;WND{;`^6GaPUlcTlH& zpID)6qPB!Ci(@H|;U0t$!Wip{^MdILl!@R<+SWk3P-beryA6xS+yi<`< zZ+*+wNJ@Lj7)%BlAANCAZcmQAh}3L08PhYqnPfQjlhNRr(0w$VDNbhDik7Co#>J~B zM__xk)4rVJv9$f?<{>zRtNmUsFP)cwXMU+zS*({Njt)a&&m zN;{|45I2&;aakvizs_-Yj83C^8^)&>zr-^$q?kSgY#;-1~7UhS8Iub5yjd8lKMGY+-*# z-GlxdnW{^=3dcv{l%3#y$=0gAB}}qIRN(L&zP)wYx9laBR#Lq?Qas{)b*<$7(GTPg z4H4VlV~GC87;`q}|9egQzqjBb(c>!cu0EkbnAI@G3@R-s?c^dcmCl0gTQmW`dRAp7 z7?ILaC@8*UcwDqBF1ls>>Z}Rja3wUHAOBTd(Jui&BOU^dvM4FYM<5{X`E5uL=>eb^ z@unz7emHgsVfV&1di$P{h4gTMJjQN3cFhc)cV|}79C?_+ur-JBp8(+5?_FB0G=eL|xgtoL!MPUml zGV2zP{)2umfY-HIj9L~ zcr5D=rFq3?OEo@CS)BIO-(*^trsuIK_?q$iu=S!~c3P$baGMLuuXcg)dWz5P5BKqp zV(-hXk5&vrx14wIEtAZ?!A{*9pM78O=6J;8W#y^b3lUinAtUb$!)*auZ#hH*>)r zo!%;D2PbQP`qSIZ1-VA&G7oD z%jrIpij4JFs8eAlC3 zlnSb~9JF%UkiDr+&jN>$2URmZ$!RjFb)VelvlHxlHO@|p!%n~_o{bDCo#qnOCD~(- z9*bwU%6t&p4aRXNE6kMuT#H*g(FaPtLor8A4g}I^xXpjj0FG^UOxc(v9z63!F592k zz9|Qt=2sV+o$*gRcw`44zcdrT2&sZ4Z_e=y_*e%w^gKNQKnmQd z#tqqoPKk!FI>CWHSC+7^8d(HuH-kJRGeWTgwmRh0Mu;fA(esAi9t<9aNEwi=pBG+!X*~OH~3zr7BEO30r_>=b1v0xto;*XsD{Ua5eB9 zunPPRZ0$@{_0)q2!Jf8;<%Q%yI`yv2N+cWX zmVq^QOnC5WbUQ6Lx~-C;9_>W!Em9wPnNpv0R+CrBX4M)05igbyvFoGrWv6sX&_%Zn zw~Y>K8*T{`EA}i6%(G-g1tNb0t&{j^o9fA-Cr7aQ35B1sS4^MFC(0zl1eICW$c^In zM0MK_BfYS&kdWsx!sX&@zm1U(x?*!~W^|x(^E&;)YERTC2(2s7c{k%l<{w%cn)yvv<^#*M5b_=k62I+TGu?tz0hg>9r6A%Qc@s3cN;4GPHRJ(h~%YBROkrEINd(FJF zc4YJN*GS6QOe}ZrW6~+5$Z#Xl4>`v6tpvKBn1({J1EF83r=%jh>Mm=RhRWJYovFcw z9iL~x;pQ){(rcY$V=vv(UtP{pfLMg-4A{oFl4L@&Nd%)Bwz)Nuy##vq?S`{Hu5E(Ebt1l z?XW@!%sQ%}ZGj%+ieL0MAV!W^*lDGyWr%Ds(ivSZ)3x)fLa$8cG;#Yuzk+hS9Q77s zXs1Ds;Tdt7hXqwX_^db^nP7d&oycUlHwD=0(>?30>HTy7o4MO%5 z*Cq0pgq!?S7Qu$CqH;w$dP1Shyl@4Ug^APUIY-GhnRd#uD@#LkFRFJacKGS75c<H=} zzC9418(IOAi`a_~4-E~8t#}*b0KM8GKzfBcqZ!cza=@y?@W81-0KR{NT3D6Ns4)$> z4lpwCJH*^6V)`t3KitGBl+6HDqx*?fgq(>?C!t2nMXfJI;0It+=y-hGv2PIyPA)dM zyFf4A`hdOjJ>}3lhE|oGhXfi^R(GASGy+Hs%|YVBy2*YQ#vwgk=a|a+#HFlkQrDoQ z@0`#+(YSgBfedGtlYPFZFu)Trf#_%gz~pM@l^kK=4Bl2kcgR*o9WpF*er9l99GWbv zi0ouB%2tLT!hlEHv1WlYG1O%=GTBrr#4Tb<&}ZL(T}~6T0FRu0v3)2_mrgeKy^tmx z=sE`UVLv!<32EIp76#!Xfs`ni0-T7z>P3RF8LGo>Y}1IRbr;JoZ+`hrB%&(5gW&?J zpZ7h=*KhAx$gJ70xYl&E1vAqcU zq0Qn|x+U}7Qm8Qx%xK4@nu^iGMN6{z?;e-Zlt7vUB;A<~7pcrHvM;~7NP`8s1s-E6 zJ#@r@VgSjJQt*-bYw1wOzlHn=JzPln+zYn#nCwL4K`W-eiuVovFhh7MhmI2w$?kja zue=g==ewdg?y!#3gKsNNMyv&#V^41^4k^l|<-?t;jVix*D69p7zG{W;4nb5Ag&+bBsOEEzN+`^m}}1Gs7Q1H zR=A1b?v)LtSZJcD>TvnPG3|Q#I}a&I!$hJ$(fKI<4|8u7U00T@Yg%M6Gcz-5ir-FJ+euTyKUu^trvjQK^(KY%Y)l9QhX z_k(SPJ3bG`c_Ko3EB8_tbXkAq1mhzhTBaJ10>j^PhtbGy9IZkExbp1N5F|)q?7o)U zr{E=*OX=WVSjL9#TxlB2vzTM6+H%T|_ikI3SIFd3gNZ=G7uwCq=@||m#nD>5F)u+6 zQwLuV$xqOkqf*aR_#8T1wIw!=D^89Qc8v%M(jZUvYfm5@m~GuUzru9@zf5^mY+`rWevXjBu<5QPzZ&$2ZBnynAJUauU9*jqZ=^zn3I{2_=_8fB ze7@vr>PPAU;*Z-;Ke}c%n!0ik?(Ja*8$-=)!C2wF?x_Rb{m_W>%68Rd8s{2jfvCk> zNOz6O?+v}@EFSAfwCJ$USyCA2?3f}~_45*H2oJ@;RmePxcx-{3_|bMimgI2+n2jJO zJW?GBaR3J5OF;I}(Ok5`LJH={H103BSsc`kbQe<+165XHc zKU3s?u5-jQhxr@ro}Z41U4u%ifuiVZ*s%k~Nrmg`bb`FV7Z#%Z+IUpc)Td7U=hXmI z^WQ1o@uqY8XEu~RC_{u$PSPx~L%I-37mRE%h~3{q3z?QnR&(XH8{@ob(tH68v2Wt@;QyYVd7t1jhQ8 zo-fLIX7?Z>I3mkmt|=h5L9BK;*RHFml0!Buq#Yo4AIk!UChW7lA&Ub{kaJfh3D=n( zNn!Lvx=15~kq`yuyp`qnRc+J-`T~s=dO?-|_Fx}Wpm1t3UA;?ozpEJQG@@bYnjL&} z2V0|(i<#%IAO5B*U2d1ybFXi?!@wjKCfix+ zqEeRSN;8Qd@r(^^xDv$5OJRDmK<_Rt5rq7Mx%@C9Bd%_gxwmASspNYJISuJ z4!zyZo2SOZ!d?yiPHF1bGk%rGGtEt!J7kA~G`U>UDSQ&&d!*_2!}6 zY82mT`?_bA+E(Wk6l&Z2rxaF1Td}Bd?M^WL33ezDr)>HO<{uV>F^@|%IG%03^XWT& zQ~Q;I{U#J+|NB6({}^(?{+ArN*_nS$rvK&nbfP;;o*5+$;dQ~o`(U4y3JC`7i{kaM3EY9#f#bUOj>5tJ6VN8DR}H8& z=YT`_T(v^1JuJh?UIrv)BTl>v&pB_D!fvO(v@;v|y#}P1^QF}^1oWm6GeIHREk79; z`SEvtGZGB&pA+yJg4fNpzhI*c))3iM0q9+ zJRr%7$m^$QjyL{52@l~Zl0KAtulC)ELxUTXAJw3xciA%w@kAi40b2`Ua85_(5?>^# zs`PYh?5fnZHon0otq{99bYsMswD9vZDjKMef24F5m3X9PZ;NR8C;YU9xmc`um*N~V zaF=O42aRE@T^;3K6{X_SF{?xZ*)*HVu1w3d{erUM>b^ZG71%}&NF1H8P%q`O6N=Su zTrlYfEyzsOv)fSqB(y`%ayjU15;A%P2K;`Jspq5zhMXY;LXZ7`R)2 z`Z(friz-r9=oN4lU%tyFU4BWVe2qhMSR?`F9h}gmOJb^jnFouhdzUiAS)$C zXm|BNAAuCvDIF=|RBtBGQwnUFP|C%Xm5xrw8fi);RD^;)z?qr4wRqi7fL;_L6t}pa zgOS(|KRui?6Cs33B?!W52-eSu3ha2(bbj@QLz!_rjhdw)VF|A1tN@{C?QU-Jn4Xm^ z*^gX)%v`B@WgI3#f~)sPOC)i@OYXi{mW7G>aHA%;`FnL$h4@X#7ynri6KMwtb_R( ztT{D>iDmXoBle9r=G7?*f`sWe2y|mTOtGJ=j$ioT;JpOAvfmNro=Dk| zz?Bmykad-o0frg8474#oJSITwBdsu3Vk#s`=ql6%BRgy%q(r$4qv6CL zJ{(i75vLHg5XTyb>^L|r45cd6gagxOxVySQGfXjHJDk!B2{1Az3RZK3bGXXDc*pB1 zLxm|O@dGwgi!OLy?zKbV|Na%P{lS52awXfH)}%# zegeaZO2X$4n~hrQgmNC4so3(`^2PSS&dN|yHY)GfOxu%3b6J7{ShpWILN93g!W-FHc7M<{6*};f()PKy5jDQLt$};YAbGIQ zwhOX;DEzE6d03BT(Y3fxGpZC~`+ilhna$mJdBe2flI{m@p*9A65M#}EkKJ}*U;8rW z!p35FAL@kGr7N)MzE zt8|Ef_O<8L&;8KL*QZ0Tw?ebI8=yP(Ak%2!t`H{LhfB}Z#oWI+L@PwzBpr&cPp-~) zJrBLGD#P@`_5u#iYc25$J>d9FP{r}L0aZUYpnul`j=ut`*jawn0HHeaQx7^{s6YNg z4^SG3MEn~xK0%%gj+S2tBp;L3rbH;tPF>0;A+6x9)q!yBd)|IGCEVd7hC}NDK*;?d zT^WWIBFI+!zC}=`xjw!vsOHVUG5~lO)c4eK}cQX*$Ss`S32j z!`W~3F2gYNeM8eqi{%Cv@{ID_bt&$ppE=$|W7pOelj``?(PO$ENMTb<81uq%#MF%i^R*+`El2$vs zc!c(XzPU#{xnsRh$d1+UgmEX`tXl$gc|-|k_2=-z$jq?KkG0#bfQ?rY*D9&i;WR_$=y#aW zLznw%7yKh{v3!m>6{)(Zfv>)|S!|sI zISxj8?d`3a(EhD5XU1*q?6`{W(kU87#9-f2DbnM4yO#Q`-Iot2YOjP>t}hmm!z^DkHV zfu2-&rk$@YNK2+Ri+jj|pQZv2WpZGz)%lMkdp%TbVr3T?r<9Jr+)r1^5Pos;Gqu2jxF`JZ$~MJgcAKv8#SsJfKLA zq`+H}uQlj(pK@4$I2rg6ojF~Mv@Vf*{Jbb`vihWm%OV9wd@>r zirBni#0v@ALn-pp77i!Oh4tLK1zD3I69*|f5e;r%_dy>4ue0Q*`Ps zXq@Hu!Hf-rADKtr1HCqQgq($H^s^H2t}Bt!g`=R5a&KaB*OJ=;)plOLEWsw!Bgzo;c_)emJ?3T4tVGMQjSWQt11 zXR%>PJKF>ryCQ;npcgSS=8izye7O*T^N|y)p<0VkSLrk0Jhjn^@x+{98* zeF%FJR!M3?Unr09gNe(cVw>%twLO zRo(}oO;0dy^QK#aCZ(>L`K%UTR~1}^XQGHANcEVNB$ME_!sasPC)yU)s(jhLPWa|z zGSVZ%{ml6c%>l7+@vG4NP1M8jx9O{5`Hwj=9PIyp5beK0*XEDVMgFHfOPlLjKZ|Og zRxu@1iSa0SbhgcE&6Z0Ri+@`!0obn7<#j9h5Vs5k$74PMlRb!dWcZK-gb#l>JWJTs z#kLcz{u*J9T!(A)#~^IK8H6S4;j)9Us#A*xgQ$dUFylfefWwp|M}enKpn&>!tV}S> z#%1t&N)7?DkDSE4oN+RN0%eg|s%+3qmUZyPO7;PhFwUZVh}l9oFgv&B?}@rVhe{pj zJ>EqOKc~nbE`Z{SwnmbGh7+zo22zG$z;|9NjHgNnOLc}YGrahN&SeON5G zEv6tle<%*pKUT2BrAbXg1q-fbucsVm*Ar0^CJg!Uje`~>1Lsq|L6{pb@6ffP6}`wR z^Mni{{==TI5EuUH(t{qqO08Jw)r;ZqKseIAtn zn*~)-mVid`ZFfQS_g%J;n-a8v3oHBC#A`TBH+--_O~-k5S%bBt&#VL@t?_XfV<}sz zj5(pDq78|Gf{K(UdIh}2m-ljtXSaz0UYW@jo7SKmQkk9F<|f7uU1K;#Z({?(O%@%W z{9($odozQppz3;>9}cw%)C7B6=qiQG2D>aqu@g}u<(M-|sq-(G;_cp>eLA;DBw-dh z_|Q0KxPhnO!}l6L*)5KtR#kj{&feadt*^#AEus*n-LX<+ldw%#znc&u=lni&wr!9D z(#<75U-;>qE$1hqZJ`;9`BmKhCIjOD{C(o~Khoa6W~=ne;;@cgCO?ALLydYdy)4S) z`t@h!&T`Z0zL`venfE@3@*SudIFbB}cJ-mAChLlNk%g zPWZq*MTRF&Pk=G>k|DGyf|J^Ej&&zt4m^I3z>bC~4>!Om`+{@GLBa_YJpv$fm@Kg; zcyNFt6YP(j7bOB2ZON~LksZbqGE>B0Wl0GPUxr~7Tln`saKwEHkCu7-@!h>f&5v<{ zmhk)4&^k(OmRB_SmrF#l$Ong*&ePB+dHmfflQo3WxoE|9kxo=9JsGvs)N6bp2MA`A zNRfft_*|J>nO$1CjJt9zN{)k?l~L?h z(Oobp;0;0&R83_!0)&E|mdxCK+DOu-u#o2{Q#PVlWP`vBgjq%?_h%^}vB#7&*v3w^ z=-eo`A&m-K3s)a^2}foeA180Ryi3snn^@I-f3?PM9tR)m)p6Byiq&RqjJv#D3hq;NctH_S;=RSHz{z=t zka90?mUIvpgg(oyn#gzEVk6^Rb>VS=@*rL%^4}*)jC1xuo#GtJqmmyIA-&4erxq}G zS2)W@aN1NkZdBvu{e6MPkOKVMoIs z*8<5UUDpja_EDEzZphOYUCu}59f;L!7UCDt3;0c91^D|AtN$2=1Ncj=RqU+)W5WEe zUH7@}+yIGs=kqKIm=e=L;NYa{`O+n)EP*^aS`o!H;NfvS(@0ko1?N=(0<#6E=Ku83xlY{)yMjg)~psYTAY#2 z%U%MSPjdg29B0M-ksR0Q+YBG}63mOpRAzu-CM{#v12_oHusDru>iLhRi~9e*_t}Cx z4b6r6?oymf4$g91-9S|w;G8&bzc9ZtchEQiM?UW2vLf@gj#8jJTYGh;IFS!W9&Z-r z-Ulu`QOGeiZB!Q2lO1P~ZKI-^EZTp{QcE8Cs2c%RiN+iOoa8zVo zy$FvS3#jITV}+$U98bUJt8K3uI8{dXYLT}tQwX!4Hxgi_Z)l7XGs@MlSzle&sYCR? z<`E(QQpC8EC5EwS1QJEe28R=pBf*VFklo!8tIEEyDJ>T^oeA)OLk}oCwVD*{Yt-cc zr(0B+xM8;|W;o4%^!ONco27L)cjH#_$tkz(oyC%3bF~guBE39{nifpj2vMl-7A&l} zbT-&T7v(neyGVW(stJ`b3!}Df5K~;{se(Fs@hqQ>)4g)N;911!u3LwC376f(iwB#; z7-b-QqN4`RSXkAHMI&mli_OB4S&J+4{O6gw>%`^xPOZ=dZv}8BFCq7lpsq9>4i4Tj zy1B}uTk9OA>5qG)hcVx_6u>vL%g#1(_4I=EY6j8QvkhQFTNO1|0dL-|i?4;miMW(}S{=w5B4={{iGHzNH|X=_=O5au=D+H>2K**T z1N?nR+JB7G0{kVC#=!RfIwfybH^HK183W`eN^3heQB0X`7DomqHvmpF_!9g6tYc(8 zmqZ5a@5MLC^RNlhZHnU6K_LtS4CKMH#~4l!g#qaw0h-I3qXoIviwxE0iH%C)3MWe3 zAmb6EDBBZ~)dgpi6oy_+*+M|pD*{DsU*lwtchMcfwgZq%w>6LG#pGC;2K!^3_u9cM zHg*Bs3W$v3a1kN&(J>Ti@k{KtvlA!adCfW6YR!Qtc_51!vzNHT+fK&N8- zk#Fxnl z<>HD7x*)_#cmjG@Z-)tsJR$YwoFRq4W5wmNctnkmhPJ^t=JLoJ5=yL+eRSvUL$D9o zdO}70FK)Cg-{6!BJHS`i7F#ApE38PlEJ>fKn^$2shAo&*pj*VetDM9RyoX6JWx>+ch7YL_ckdNxX1q(5fzPuvEcF6 z=R~w8b)zE%$)0SRW4GfjhIVl8jC)PtR5{H7GzlVD_`cWPsaI{VVLg!x^8;+GX{Av^ zXH2!fS$c2z?lBr z_XPMW3=HtAySvdUYqo0~Kkx32&-FoCtGY=YD}7oy=S3M_gsbf-p}CNkNJo_68eH2zNEp&)1uG44WfIuT69tylnzjh zP(?TrH!E>i8>Ox7nDro6s{vp}_;7f^kEDRAB>M$9W+GgWC7JL zJgctKz_U?1hJ3LND%_IXD=0V+drx&UeW(y3bJHWb>#BqwzS|A7cqi^fz*$`zL*u3a2DtZXne5o(Q6S^TXG5J zWmnT4!2l(xi&`}pNQ*Pxo<}opdk%-BXmLL?6^3JrlT4a02o66tS9$vgC8EJth+lll!MMkl&SAIEcnLNzhNONf zgZ(k_t>gs@U7cl}*Ba8Qv)1(E5h;pJVx}aF4uy?AJ?5ND#N2ScGLoZib4Ra7&jo@c zlDkd+f(Dx2eXrDvTHe|T4VQWr@nr=MH)9?Ym8gS4w#8$^+J^6o*TZFVSIyA%>9^8W zLqWl>nSnXvoVp?2EVODEE)vx4ClSEy0Y;mV5qv__k4j%HCDx()8&-z&8f+^^z^t1P zCZBxw^t-!wG_*b%ePM;ho@IxgU&#i8mBKA0TwQKQ-$=_3k&> zA>i-B4w?RgKK!NrITprWvBMSHRelujBkJm7Xk`X>Gl4y%M{a0bjK&}0YRx8jhK}fr-d!2gcO!dA`EendaSsX6t=9zE^fL+lBV8s9REU!Z zOYUm}xnU6^3C6-2D8LO_#dt#H)zt?Sz7zR-m_-%yM;pXK#lv5XUPjpt5g`j)tL+wX;t4DR@hQ%t zJsQ|4rL+U+?Tm7S$2RM?9)6f3i3lf#7)M!)Q3!X6AXc@;)at(?>O-@tee5uGAaSS* zuUlVEO|48t`hHZY4SQdZ|EADOErEjK!h?uoYM~(50_j-(ibaB|cTX=p;vObX^_1wP zW8Vk!1 zh&@;ym`x-py3wzD$Nus~Zq{eCU(|dVwDGax!w}e}0kT?h|1j++x9n0LuzvD^e8hy? zXV-5b0|j9o7$M5zaHQn7sV-=RlNm!S#Dz1&%u8{ewH1mg&=l?(6jBDsM+G3@qLH}p zMmubl3m?)w=|a2M-_WhyMn-_%kxC5|MR2-;7pgHNO3iOObGQUEWFx|r_dKs5SMcxs z9q%2vGT&P~(rI2_hK^P)!}&bDF!&#+D0UGFRFaei2imtxla@D3y7AUKnVpBmMC-Vy z>S^&+Jl1)lyw(OF!EsxbMFd9f-s<5~Q&>_5%4l)upGhV*p1C5)szjF6V=iJ61f+ zA!KmUGTkrp&NTp+o9=aN5M;F>h0iUz+!F>lpGTYdJJ54)th2$_Xs4hbF^g2<=I5$C zgqE;;ZT)?qoP>XzKaU$8j&_!BJuN)JlPMFN{YUIGGcf!XdHmz~zYlq2{&ydRe|_8k zJQ(yB^}f&l>)d$>QrkD6!7`;{Z|AkKqN;qmWFpXgBdE9))AOm^=zJN))h=n_uv4dt z)}i~6TtDDCcrd#4nzBG~LtuwKhL59^n)8bl0e5}_z=b~1P)T@s;RDV{080Qe_NQln zG(r)59wmS-zT0X?`oaYsFMQa_5_wo*?0ZNFP6y!;`}de&W85)&|rSM^h0N zhcDHAEex+&??E$)xpnZD#!gE@Ohq7#6*uJJh?T{({@MMKxrZ+=Puwr(S{zJUNcAX2 z1}|eP*^}(aW(eZBkaY`^IQiz-HhIg3P;@v`0ZE+O?qM&w-@4Q>ukaskE6YcaFpsK# zB(6HUEMS~#uw~CX7)J<7%1JLX&Rm;IGKQzA)b}h&qFcH#v^QO2&Ez36c_z~|Qr*9X zhvBYdp0IKVpo!=buc=-UkD&!xP^`}ChFe-Opv@#dYf*A`lEp7hb|=d9>eFpF8Qm`qo-|(SU!g`sh8RO z9QVPH5<1AyMOv}eoaVyb)4IAnGH9<*??77At`5J7AEw`opT7_PV`lkt{4oD-sF%C^ zd%e5}?!W8hjsL8d;}8_n(TM+RoXHS(EQR}HAp-Li@o=R=j|7Z?uml8)1N^?CeZVB#KkDUT+%P-uY(K13{en?0QLhjv&!iwD6$D`g zVihikM}UgB39V!6!?4dizZ-F8Y>@NA8ng{Ai)A5V3ACN?o(W{cvTNEYr624%yt;d& zzc=9W*1O^=H4sPDdb8?QoJlN0!6yg_geliiQdrvPYZuOUz?V(z!NVT5F-;|+2iJDr zl&E6e$dK(+B!AsIXp}-CAAgY9i}tdlR?&zUbOv?A11{b^3GFf>h@q`naw>6t}shyiE>tF_}F3-S?Wf zXbo*MkrhdS^=eUaTuh(dvQ3fRf@*?u&Y@b{(@9ME0$s}CDx+_&hxc%?15VWTOVJ?W zl|iqh`;@_MzV((`IZ?aq1(Rd0q}$$`whQCt#F_Bk#~5oiWTN$vdw0~vachv;6DlM>}q@M|bWI6TF0fK*kMzi!Tr`T)dc_ zd6?nL!Wd8ZRot@tX59XLz#0qlpW~MGFI}c)`SlrpkL~9fA4UO>aUI=Pvv({$N|JFqlFIB8q4?)D`u0pdS}T`gnJ!Z@DrVwadd2qk;Z_%Tpl6k8vB_WDbCEB zx==L7VeIn9xSTP2K_RHg=>^D6;+?Qb7HRG;7uPp=u72)7yiQkU;tKRk>M_6pK$=nR zC7g?JBspuh4QJ_+l|r;Ic+O=uZ5xvLY;~Mg!XR6PX~?hQNt#%A5SRXDRi9<;!@s=w9NWrBcSAe`D4M1gl%v|e)$nQYCYtEVga zW1fy}bdF95I(9e0rREu6KxY8Z| z4fi%#Kcs8r4Gn4~=9cB=7&T^Lu8*+_4Sp@#Szqm>?J`Qyu3@)A%cETy8}rb~Dib36 z)2P_3HIDq6=rB;Q<62PFOu{|%PkqYM;s)(K*1weFhFVNjiGs&=xZw7e>~e~gHH2d* zE|{}zO9)csA<+P}#aDrj{s?}#ie-Qzzd{g2c89UMB)6eI#!0yLLgbmqO+{88Pc^Ss z-zlUZ{M6bB-HuT2Co^i1@;=l6s#A$p#NE49FTJva#e=j6+A#0j>o=A(1aoh4&GR)V z$%(JL`wP)~)(!2xNI-ki9$$%bPoyQu+c*LBV@fje*G5_kI{vc=Dk){V;Uu*)in%n? zbVFWGVEKHz#ULe}xhBw*6!iKIz0$UifKMr9Gf@)xz;#Dl4SvGZdyB zyw{2`L8_)&$_HU__dbiR?VQVBS8Th@Zqad9qt;t7e z3ML7;dZ8+b_7|1pE{-^A;$07?$_UpcX; z+Wag!zE9S)xZp#f7CCG}oM>8{9;;fMs!KG&kFgYQqm;zSugxsVyj*gvjX;zG#fk48 zU9=uey1~Wb0<-x*!rsQWRu53&j9*Ag(ppe?KpI92bO^ZL@My{@&_MuGRyOpeJxl9N0Fc zzlw>dK_89atIj8WEHe-2#M+@+6{D23K;T4!B*>uF#4gZqBOG{!)`G%v+ta0g&gan{ zo52GyGkyYUn`(FC_Q+f93z-@GAY}|++{=WHG{`Er?-Z!H>4R=hRP#nl{P-iC7AYh( z@r6l-a?K=IV4t+`DNuc&lR0sJ+EH7rtRXj5 z*1RaJZ}wvd;W~pkgs}g4{J05X#7C)R7K7- z4l3TZyOId)R`i(p4%FJ}_@Q8!G;Oxd8D(ZuN^`*SQ6Yl@@{mrT#?XTiH(Wg;7NBRsvu zmmKIXdcl@IrD7FsaFRdEBU8TX>=b|7z;bJF6uLn_vXtxA^JxpOw!0V%O_mzcBK6^N z)Z&BjJDdJdnk=K@gt~(r!VzQi@>pe(R4vuZj=E>4n`B6=mie~f*(5_5yo5>LG?WjZ zVJeo|*bG@Y&ip8`RL}%_daL+80wsp<_*gxI>*>Ls-q#@hbqZ8Z9a)vT*0`}Cs(*-t zKCy~3yJ1T|4E*38S|IcaI190x(<)qUf0g6J>*5upXenjmR~p3en;P`@frfvYL-nt3 z`yUgiUo}2tt6Ke>2uk1|3cx$`x_m8 zlW}ay5tYBqO_rzo1u1>L9WxZ@4+@U1N4e2-Y)v3{Sz`}=5W^>a`*r(e%K=v!wMm67 zC{+D91P?M}6i1>GqkYaM8Rvac0C_`JB%190q^CRt0M7IUlp$FP;a7 zxlGzph7&E{YI(eENgAXm3I|#g6FWHI#sF+VF;=P&8U&8pO6D?PQ>vhlXC5@l3Zeiv zU);3$QOyi1%!S2LiRgwmk1g3{rc7w#kM~{ft*r6c6UK{ne3e>;w~2g4D6Jm`-Q6eK zI#029?y82KtSHSaU0ZvsjBuO|jnZ6p4}PYI-{fwh*^3Y$z=FUV1q<+VoT@s_crCts zbOLt^h=P%1<uGl zD>E(CVg6>Hf$tOzEwlxay8<>mcwfsnv;!dmelpIht1;|S$7yB-4_)Fi{F$m68m6m@ zu1kl1b%?C{KHo=QdG@QP>pAk_W+WWHqKinBinc&>9F{B>?#6NKOSy}c;B zC7qXJ?B#nEB4z(#3uu_tj?svG#XuvCFWxEVG2~BdN8cU^q@TKfWG1&8);sx*R2Cg8 z!F7|pReMKHeqP#gK3cx-YUWxgzmz?aYx_j!#WOS(JEf=kaBA{;b#RNbne>CEYmxpu z6EH1h)3k$=BBF(#>ZE;ED551~adg=E=%@AeV+G#5iD^?CSD)p3uCemTi}qsGXmu^w zH#L&3LmQp%yH#(}<5MIJJ6wyk)m;T%*xVN?uC%_!bnAM)jZsvnuU-m3P zGC!@o=|2wES)NoGn1p+R`PNsM1-DH&uM-i(LlorD9)8sVhWrj@Ykl(Ke!q04=PQW& z_zMYR{7v@B`1fI-?0;sTjDLlFGBW%Z{QNfw`>#4LOdGwdekGAhT@VV`I-3^gant6q zhb2^Cy!jBcj<(L~M)wwBIrQgQS8Z|z>0IVevylGy?pTQBM=^cT-fKchFsFXMQjf;VQ9=SRz^pBNnjA;1SjAzfRzD(+j^kz`ZQmG zsbB+wlOP#5`M$B>5ltEr( z8VqD64|#|#r7sykGlJug={Q+&N|4!g`qIPu0)%jlVH!W*^54}Gb&TPalxU|K&-Nb_ zT|j@NdhnD%2F>F70HP-95(AKg9>n(V<_Hn>EEKQ-wxse{_h%?L%C0QRwkKin@q*j= zc8v(~;-Fu8GkCaaSH1|~aveK^o*;-l+Q=*9$_pLj2oDs}#Za$S715=Kdt)UbX=N#d zDiV1$mkF)gl1{r-&Ybc&5XTQ%2EwEA_4K{eMwmp~sEh1v`0&N+dYM<2E)V*Vma=$4bbuT z(%Cy20m6jSOBibk=%&4SW&wgiZsq@1cytgFQg+eYA)Us4kG+O`tzC0=%9MlTKczN^6+wNbKExSPg#_H(&? zH=>4XJ9D6TKJ~9%FF${245}2f+=sL1(N?-Qlyqji&oIG?3 zznw<%B&|QQY%{f{?q>0JtpqEnX|FEf%f+F7*RVptnHTAObEd(xy``*h?^5N{&|T`+ z^EWS-hl5*C-DHo^(hZHyj1P6>SM^T~`#6UZ>G-PhcAr7eL)bFXurEOt?+(tmxZh~$ z>EIad?)Fo)S7Vg(A86Ke^<`$qpdUNN6E)W>x5A&YgHpVvpi~dglkCDf6Kv=YtPTV2 z1rB%U+X+D7eQm&EI$$sH|2TFYW}cAuE7Vim*!0e#OhLUHYD^%pc4W4E8;6tWtiE^f z?g-MoB_PQm?rPVGe#d)**8s2G`juw>Chuna`|xg#KXWt2zhpwl1|ax<&`cDs2Q{1q zdRc=%G*c`RY~7{_V%ny&>Bf{mo^*9a5J^X8_3f3XLp()EQ#Jz>au~pz1?U*qG6S`K zCEI@7C8ssBH3!=U#2)}bT91Ka53vSzik2C*I>tPzmVJ;EtYRi49z|xHh(DFLv^r${ zne|no(uGP{FG7p`m#TSF^b}lp9~z?k!l(hT5jKZY|zZ`vGIw- z)Gr9nQ7Wv!K)%OS)LM-j536XPX&9n-pkL+FJmCccQkjt40%^-UG90)v9hSUt5&`)F zKmYT0im0HNZCCOgrd3N2^g;tGs*uF^odXxgf#m!jI0=T^N=2XWr+3X|TKuEj1>Z z0m`)QfHCb5o4V^?>z(9qRYQ#3Vql}DHsKLFV7d*xHwxDuf21;IX%1-UBY5#(0`CZ+ zf5_z%>Pp>)6!%awmcK^p+Q~CLrus78ej#VOyc{*Wv;`52MXxNE-QQKINC+vB!Wze) zs1_=CXTEZHuv}}cfnN`(XW2TU!Nw1ud};ncdQg|vQC)LOMcWqD`_jP0W;fGv_ZZs6 zl5~&WmW=*=WA5o%MHfN|{`zFDf9dYr6m`q{t=>-!mVU)C?A8(p`GIlpm{BdD0Jgn# zd0=CrF|ySJMpdML>OsFlX!Hbp5;{dW1Xm;NK@K_Ni23458c+SrFu);P@22d#cb1GI z?((f#!U26)y#Xver-QU_=q;Cj(^=ZQ#F*Z67cE}Z$<^%hk*k3hfv4ay-%E~-hXE*_ zPub1n+?f$nKvG zQVl<1yAQSqQ--XLVs755zgKHmJM+PTMs5;u3krq*40A9&4(~u+O34^)i4?;ZDt&%^ z8)o(>YdD)$09f}p7m=BeCt@as@`qnWgHt(hBCZl76ofU;LueY%Hw9_es3-9Gq-uaf>72IcX#&2JR$3Ot~|K>6kmQJ z_-^q0Df_0}!<43#xIQIhn{EL^}U3 z=H4+nv#opktk||~+fMG-wo$R2RBYR}ZQH2Wwv(zjsrQ`!^LCH!^VH~Z&gjvj&(}5f zz3wl2UTeiuAp6dG~2jV?KVdYEKv}Lbg1nr zqJ_!-)XNJaX&W`e*8>KA9y>3Zc;uylDc<`UO$Akcq=@kCIps=uOAAT#E?pL6I5r1! zlRnkGtB0d1Njb9fjluFjwpoiIS_4Db!$|M&%ylE3+0-|&Ptm_rnv2Xm-~+LQJ_l93W+CFP zg!=rT7*RT=HIo7Z`LP(W+Apt2+=a(tP-{%1@mEc0oHScdM)LvhV4eu4HMccyO#V{ zjNbh%eu6H5p1D{82UVb(WMl1)!O`-9z^gsCoY%a)hfNn>wm`cP`4<0MhfdY;{MAY) zRM$kK?ufpu-|Ay=VwV~0v4<{xYvYb}@(&-)V_JIH?Ci8uVU+U|7XJNhci*P#0L5Pj zEEAp=rf3)&7$ymO47c@0F6kUbwI6UNcCgiJ{53{;YP0ffBUgIX`q(=(^mCl~EnH^5%MkvY9%=hAA&7;MO_eyQwoo^|fn{{%#W+JjY( z`+`Ci7;fG+WL9H{651~f-OELh37t2UR^~Ou#0$rGo-4#nHL9Z;QDKzcW7r+Q$UYg^ zCk-ukIwPgfH`F*AXDC4d)*QHWW2o#(Pt|v6fXuqP*k3z_Sdhs~swQ*m#B1NKq?&UHsR>I_^pEk90E!8JbS2{{0U;f-FbuVjfAx*bxs zym;RYPJA%}iam6jt9%|s+m=)*wWn_eiWlWXqLqE;wNJ1ysXcT@T%x;Y1?_NQ?AD(p z2w3~DmTbscY&AoO)&DU>Y214??2702qFZZUNjv(78XbR61!Yty*YSrGHcSRXaFOs z*&ZvI0d)_H!G!=83+D~U-hMfch{wN>&7W_aERiEfkWB|9qy#zW#L=o2B+}Y#ELAK= zS5~7#;9s%x;JZ<*5I)F$*i+*$de@q|$mb<1wK}S2jZBi~06^%%LUMT#zD<;Kj&tFc z*pgRA3+B^!3cNAMz`t$dz5AvD-k6UMTg!M+3GyyRCT~=6WE!`>3s-M;9(=%BNmag# zP=35!vz|G7#AZ<3T^O}wfj`tDklfddA@keLoNYmFAD)Kkw7#olC7$(+#cZr()6g9l zr(AiY5woxkl-5X5*33SGiaYo?FJaK`C8v6#yBssiwAxV?4eS^gk4IYTPlTSUJ4Wa; zHtmNpB8a8v>)V43CfM#^?;xG1ayFJ5dhvVvHN)jr^qBSU*7pAzrhbe3o!*yaF?<3YYxV_usP#_b+8Sy z;Fu`ohgijr9drxQPYyK>>l**4tg{~pkr?3R%GMAAjTpv`4MgS8oo5272`eFjMM2rB zEzyVaG+-LIG2@lNvg-}##*T%E{N1Fc129p&gxDcS94qoz(5t}Kcqu`5bUQP^m?$3u ztlZMa3227Ac&L>Uc`5h1%Aqm8Jkcjji%w=G$az%jfQyfsDe5?6#f9QZqGlD+C%7 zYHP@BS;Wvu2ND(VSDEa&!9fPU*e=;jqZKrlVo_eY0Ns(RlYHnL3gqXGe5Eg~c2lU| zn)mD*HFon~=O5J0XIX6#O-T?`Jg4yH*6`WO3hG;mjPTFdU?;y3vpsGAM!#;g$#^i1Vd@I1!^hEU+m;=cJp0aDjlNvJn-IfK{bFLS(rE_$Sb$w@Vr zg@J7pkH|s+LpZjky^m-uJUQqW0p`csSP#A*G;7xr^PRgcip8e64(_RsosV!GuI#@~ z6OTLIHVP6;e_buS6nYs^>+n?_=MwbL)!3a>X4>hO-dcvb&C94Q^<)4Ke{;O{rsoRv zSX&;2W80`!>aD#5#Pj{jqT~bN_!XqJQt#?dbmz``?IV)r4Bu` z(0kP%e19)h{Ge|hB+{7{(EttI~@>kEQ1s_pa} z$z%S90EYQr17O%#nEoPp%zq2OFflUzR`T`%|1(i&-IoZ--F(E(Mm7AZq*7u-7kjL< zL^y_zm%2_bBAGcviqHH&_@)N}wgd1}6n3yP zrL%BSAU;?29NB-GvbqylCRl=g&;PS4tLLGNFa~WLlp;Rt{`$!xWRXZdN&)VVvGgGN z|J|$gkxr-*Nh0*mj<2WjEKs_2g5;tejA6UzrAz<)bWr+MjsU0{`7jTy8dEr z*?Ub0yAeq@1)jxa*}amtE5l`{*srT%J3rTdfKWD_hJAtEJXqJQRK|@8#V(vhh2@h! zdsqPphwiE7-Uo`3rXIbfLFdqCy=NH1cHCBg^i>WfiI&>YpVr4v?jc^)n7kjIt zI{R4Ikl-ZnsW*5PFy+xRWCvjAL*YxK=%|4`zO!%Kkxw`zl2UJQ$L8PKochI1ii2nI zT_Y&vB43!jb(*DWfg^UI(rKPfQ>+7rg)2m8aq{kt$M6IJtLmkjhY}X?go)NV8d%a9YZJ zBvJ=ZEJN!F-@T1=o}oy^PSclX?kXXIKhPj$Oa`r(fEri4eosHBYPareZym8*qx z1NEY!I_k&ujz#OvqwP{I``4~&WGI2rr5^X#qn72~#SQT=vzrvpXkX6lwzh!9v|m)8 zo^Yo~*M!xJcM16A=M2Y*vypZSouT9JpBpPkT^k1+{i~#}wxC8uu~_}88@A+RGA&|{ z6~R|=SSSRI)-;7lnB_=(0c`ngId@PSPCh^QV&@5fQC1h&bdSN=T^>LKkUs}hpYVPr%D0(?DsNoc@;@8j3PgTB2>woD{~@no z{@3stw*R{4%*^utig5!FeOA@uBG*r|zc- z3*w3hx}q=6rp;;}ofqnuIO)HfH(i6bez~5+1eb#p$x3U1ToYH`pk zL}%tk6W*gMtM@CM7;mv*eb?#x&-Q*Djp6eoSq(Auao=w^qcDocUvYoc?IP|H7E*x3IpC?O#(S63)Yt3+z>PtT;XE61qiO|x zY;S-4pv09EpyuA3h_Z=aG2T5#A*S5aM9;;9iHymWaBAL9<(r0b8A5j{!h+VVJ6rdU;G` z4BB#j}1KyItc0Y4IY%r$62Gge<|pa zGakE#?%6FsG$b<$v=w!$3x72#nsg<%a5kuG0#&aoZYU0rwI4iXdRD|onc&x-ZK=Ze?PKDo|t6WHvXoI?-P5{hz6E?8;Nnn%Rl4o-yoJ| zGYm7RFT8`+{!ZYUVnl#$n2eEX*EYmMw$a1dLos8Q%NX;O)AtK~&v*9{%PF_m2Qu0R z*`ItvE6pD9c9Hh2g9jnK16AE_@+3iWPGI^C7Ir&%Jn{JUIRGv4`L5X!=a z?tZ74|BwMO|7#c!8{1zQ5cA(+Kuny!V?erpUTySwswM15C9P9c+7S)~I?F%<>R^w| zE;WTj4R>YLNRXDaY1HqPRw8I}qT_OjBK+QdvgyRYFz%hrB)k`jG@80Yn%ka_h8X*r zB98ffg#tYrkk|~^4AZLd9QCGI{1WLMHi#JLNLa$f9ecG-=Oi@)MQ8r~KVL;dZ5mrb z8Y#>LDEv`ecjQ6ASO}#-M7t}YsEQy424DnnVa6|j$!Z9~4Decj7Q~hjg$eb;4B$qM zoduB7=7AaFvl_jnL|6Xz@<7?JJsT(!rMpmCAQG4ETo70j;Z&e-))-$w2oX3K1Edop zaVd00gCAOu=bQwh7OMK6e~2E${hvSNj4MP>p5Ln7h`opNpT0=Q5>adS& zimT4pGG>1`<-uhPRk~d=g16uXAx~__pE8ug{JGc;gg}jB9G5qk=V#GpO>Jet zlwCdQ+=A|;xft%ehKu9tPu#dy>^Zjv+>VaD(EKy4rg|9n*cAcUt2d+jgM=6nDPak_ z#$BL^?l@7k;#G2-nrqUvbCR|DNVVPOyo$Est?}*QVW~Ic%nxo@XEpxlg)lK^OZ6_~ z0#d4gs1IaZ5Zv!jL}!KA%i8i&ArS@(7AdOv)KFNmZ2Y#}595Ik+2c+z%YEU2y}+7W z5~`?D@*XvkT@mTTn^{@$h7Uvb^OkO#y^EV}tFQN&$T#4JH#d|gaDT&*Z2Z#F#|w`& znaHFoZn+Z`yX;J4$9KisS^PvMMGKFqWq*Gg@Ci2rahFAG+sgVn zT})*h6@xM`s5XBzKy}}Fc;ZDS&g!*(em-@70SsfAr3*wuqx|)}7zB<=`w*ov zaFI@;uSzWS515z>))x{CCCMKmvLWs=iZej#5v58dzmmo9?BMFpHPmy4k)(Ip${G*L z#&R&&sLHSkv-rodiopUU^IOEx;c+QqGLp3QI10)hLxte+aGz?h$r@-3+wu)vBrVtY zKYcWSm7womt`{g0s?j*VNUm8cD0G%dRI}tvtX(}eQxo!8wfc+IxO_kyhmvH1O>OfBAs+zod(}YtC4PyA04g~t*P1> zLRFRStk0~vx)m>;>$$gnOYdW%;#k<(7GUrE?!zn{+e*i8 z)l-W6w;x7kC(n7ULFdjR5E{1&g|+#TIP{DIky;(Hb)(+FjT>#Nx9TCifFAv`+%mIq zxB9RPrK}t~s8R8H51TGUh1LD3!W0a^5CSjF{Zh&M$F-Sc%2CHB{$Rcf$wYM618#@x zXH+El_W5MN5gjnLB=SSK_e~Jc80c#br>Blywb{4nPl%>E$BEx*_CKUm%>N!*#r{`X z#r$_@6$jgIdiG?iZpdv2BKpj#M=ho*#G5koL{uQ7Y7xy-%MRcmGe45IIa(XniV5^K zZoBM*qDUl<&A(=GnVY$~KJXd|-VOGh5b}ntkWdivxA9ZZ*9q<>?sp{AHHBRumHLeG zB4hf&gme)VVKh*f8EX;9eE?ZV$bpJ>We((QZg61^<=d6R5q8Jz1%xnj5}HGMQUvpH zNl{*}9W%Yo$+p3BErs?eO&SqcdjPyY%(crQH5BEx&fS3=$phqSXt8Qhm#bwEw0 zs&xn$swYkph$)Pv=B!?HvZ<*4@<_|L7fAudu|Oqv=|p1HoO=}nBPZN%7~lmE%bbv@ zD4Dp><<)Hb3(zK{&!F}1Qn;lgsxc`t z5e|7f!K3ZYjiRsH&<^b3BhY=vOp(R6(hW-}3V~Epolojku`zU^I&e;(DB2kmq0;{q zy=>}gzsg_ik;N7s#NeR3Y@SBz@oEVX^I(fR?VWwo`;9H^Ms`<6s%`Ats8#F(9D8Z9 zV9X>5;m5giTQ_^&r~44v_0#AY2d4oISCdC+ttC@3MQ6OY347#yGH-%!R997G)%?LD z!IE`gtbNvjZc1&;(GzUIb%`UDLm(pVy8xQ6SEg@g=8T~p?UHoRx4?x84b^$i=#P+G z#ck1a^fYG&l-!WOLaQiTgxP2-JMLqqk84k+SH4#WJTqaP-zmXA)pOIiEm)$(rotKQzm z&KBc=A%7f&I-i*=zD5?F z+vgn{_*(GGJn&AGuV3T~VzH;bO<2N#bz^$*nNEskPnSTC09Uwg8X*KsK_EGA6E6YU z_k&JqJ?O!{>@{Rwl}u{j3cexaVSFnpe9|oHKV-;iZd)sYM(CT|o#%T1^hd1Oi1e^t zir5E$`V)(gTue_=B4;02?!ldITS9dwInK`HSA=?Vo4|{xjirIZsN#I1qh_rbJ%cm5=dZ_ z@ih;RRIE!RVyNg8N=bgO8mMFv-j?213m2C?N*mLq`X5k(>yF2LptH?ar|a9$nyDT? z8@wxI?R7djp6jR@bk-7sT~i`YYzF*XYp>}Uh_o&2VMxWgrHB|vdG}?hjHr|%uf@OB zrM{Y}gj``Vp5}0U2PYUTm_Z?fcF0ge6bbH9ZI##V^&DNtt&Emv5F`KY>!x+vOsQW} zBUd0t#s}CJVdeSOmf^$GnWdY3^BVTxyyA(2ob3}^hImkqZ6z%W!^YnT&2D-}BR#+G zM4s!(7s%BlQcxdKrDGN;;FB^*rg^PEI&#`CrFZo-3Sq&R0H*EP2nch}g0ZDifknl(nB{vK<25c`Mw%0mK}$u1y6hZV8PjV!r5f=}xGV0$)dr}FUF>tf$=TH< z3~!&bq7sl7&a2oVPuAARi&9tOC%%UwTBTO@>96={_GdhrnPG5>CfW(NptQtJI7sX) zkCr1aqGz3MQx}0xCpVT*kNUV-rcVSNj?U0K|{$ zUZW&mN#e|dR-vynFWCC1Y^g;|irQ?dq6SwAYrBC*n`P&}w%2qS({PMSV@yD9rZ+e` zSvn6V`@Z1)g2l`~cDGmO;Pzb7e5u z9XKXhpXT=C)f1}GKYznLLM4uh!YeX8q_ABZ*2fFZ?2P-hf)R$T8XP4sp9ld-1OxdV z5MzdEBug{pHva>i#RbJ}5?Z;?hKWrpcr8Rfa<9;iP8>`ZahoO+7O2v`CT9j7EHQxhVG(HBs(Z`p{0Z3fpg!^DNA)`IXT|_cE&DLNLEM=I`(aO2Wj+0pqw^Q5Hd;-Gs03A(>w^{sKWQ~l zkA`E(6l$o>1k7;2kCD^GCFhm$Wx0`!RpOl5{Xli_m8YlGD*d^dMS`UuwKARh?tbkg z=wUEYke7`NA@)$=W#qA!^-?0W6jUTX#5MFwz2K{W1@5Es;G^hlqg**v@S?E3fv`e& zW`mrgzPmG^ethMtbgB+hR^~bh+yy@*Te=Ri%0vGvMEN*@=b_8~|gz3_CKm}DgBXMT9dbi}}MCSDXjFt`UWE&RZVNVjJ)1K<882(_7 zbbv7004F`6bn%I5iXBDeT~$f7T$4s4WjY0|t$HVTZiDwqfQ3!Eym!RViGkx!Z=M(4 z?(|JPm+qjin?LnKK^Jy_sf#Lt^P5zX6PTeTfi8I8GKMT15^q;ruMCiXwkUguXiX%( zXh(w4MmK2aB!ShyZxSWhB?Qa|l0~AH!g;J%*7Kw{Mb_Nut0RoKJr~$^SSQKy^oZ!R z^CIksmb#$2@-$VGST*E8S|On6EYZvj z(#f&H;OXpH-%DN*m=f57c!rRxLzfS+AK+MndiR=NI?GBIDWf^M_I+i9s=2Yv6c>>H z_Uq^M9`dj#Q|u7B+jqCiG!ZTl5zgzebSCgb(|8}{r;QO6UjehVgkY-qV37`+O27T* zFln8UgS8b6PnZ;CATKX>ihH~n`~m0wZOL!3yfh7_RO}7E;$>0ZW01_PqeD?<@7;pN z0&Jf3z#@N<;qsR1AnXL`uGtFkZOQ~0}6;2$C=mVXa|;`%FsV);7=itTr!X_6Cd ztTq@CM|Vz?aq$8{%~TUi*Gi1%s<%!fqpKVY7-J1^$$s80ShsJC?u@%;3^^eK0{WhA zJAa+Y^^(IVdNyeAxq-1s^3$v*-aI}5mTDClgr6GC6=I?cY8@CbP zpvKJlef+%^8^PA4mT{Gu3wmg`q;yOG-u_!xr1Ohm5tIo(NzHDU@Mw0$0X3D2(jlJc z55!2AREY>wT#)1#DE1DmfWsjtPvP65T|<65G3^p<_n7YhxM1xphkY+#TAbQ-TU9>l zEfo(RomJrcCq8!y?tFZg} z6d?@6kJ$Y;0Y$YE^OY0Tgwd~!YPamR6R+6K38iiy><-&@3j&c&PN<4%k~JKAKP(yO z%J+V9!#-4UFk0*o4y+YVYg2-?e$~a*KiU%`S^g3@(D&4Oe&xEDKXm7f_?+b3>LW#v z@&HB~@kiFQH<_b8+!E0sqsrzTb5AY>*SCJ8N&iz8IdNbW3{5mIJ*KO+=7$gC3-=2Q zDx4?h?;`6Tf(n*@52*OBk5yRy4ya&b{#_p!jvA5M4UPp9^sR z0=C~HCOooTB-FEHrTqFd%G@Ir0c$q$4IOw+@D%23`7J9(DXZ`G}L!o<-RdGITr~stH-`^So9r( zdLWwdWDn-l#k+V_JE~CaT(a$s`KA>@xXG-8k90=Dr@eJ?m`58R`~x_S5)HGj_B<_} zA03M&IGml|*KUvP^KyAbdNe2q#!!M|I-f>m%`$R8)&zWzQVT&iaws^P5H3zE3KU+-3&ljcIoLh~SS~wG)O)>hM{q^IxUPD! zn$rz^X#(U~APu8(|7?yOeT4Gk2+IhojoVjr5+|^?8kuNf6FyOqgcF6b0?VBI1?oV8 z*|?-q>%^m}Y5J;bUkb78T)eAFgd?u@dtPmv3*==q*b6jbAH75>bOKS-s^Z z=*Oe|cCdoclE1{8HgRx;)i(j7HaN4>_OSUqU zC6m2naXB3)>;Qp82!Q9?|7w6QNFqg~$QtVVjwv7ER&C%TXe3my7Y&u*=@&|LKN6Q1 z$5Jmc6&Jd|WFbQ@Bk8_0kiKb(fFFKJ){JyWYSNX*1i>)&5>TVTnOGRKKa~^HIeQHz zd_IF+$myj@zOCUQW3GWs%7jL_`uCVKoa)%j! zQH7&~*n;H~yB_v062=2a5c#>XUAH^e4nwU5V5`O6i zK7mb{33(ejaG49;XI1(_;3tx(@ojhyynMexQ=>E#U zF?RH!hRHJ~@I=99t0yCwB^72NY{KkKKyZzLWpcItNpNNndOTlI!Csof*2b zjERf=k&D_&VZ&uLbA?J>F*DdSNV;zXz|M{-CbV-NxilaaOPgO5hH5m36020qA=4}} z9ntjFjqds3`Q@DYRh)}^N-YMQ{PJb20aHNrE`lZqY7c*x=pgCK*fVmgGXro9R21Z- zWmTYi5C)tjJ7IC^BJT4AiSsG%G7m}+6o;&vc6@n>GLbdZOd zw6Hk8ET;ET-@Gn+X4%B^J;Em|1m_!$0fATX3P{ehO$aZ@pf#NboV#^4$29P?vati^ zzS6>9i^%l*dhbe(RfIK+q#&}Aj5iRZE-=x$L>mzpzD*JM^3e`zypFD^BkIFU$eW3t zP|O-LrTDMjCc(lm@N82tp00Bvzx0Xenk^9t;8Dy_spBJ~dSpPwyc{zhnQAFXCKl04 z=aA`oWEd4r$t{W&o?o9GjOJ%JLzVmK>IkL4EUKBql-M!pZ{U}Z-z=y%sEdKBn2XK7 zJb^OhJ>XJW&UDM`43Tjw&DY(`aUe0vcui&~SGentTUA)Ws`e*3r<2>n&b4DJsK2x6 z`pb|?x`ynp6&r0q8OnNB#cw>Ctt2d!3%WJRKN#j=24?w*KkO6|dE-QygAV-RJb?i}yXF2#YLjrbM%B$z7HYzpyW#~2Z*r83d~thjV3 z|G)r{O|HgNbtDiug11lmz%%+30Na^~`4pcqY$?BASYa-YJSXoRX67yP$ZtVk+AY=0xjPAj$A!7f^zA04lh37h?Mq9;JJr>6;k;ep&B`O-@i+R&`VS3G z)_;w`$&dKNC?j)U!>-nIqtD(MvJs%rpzW45kpx z9X3|?dzL$AXv4nUklc`Js?E3t9u23&A`sl~#mn&P+t=M?23{=4XX(iRvxChxrbFZe z#Tnob!z6~w0?nE-=J8|%u;1=truTn$ zVwzwY7U(ZI${O#Z9E}TLUzG##6*8;)p%djOb0=T-mCKx&ae}ER4>qxUvW?rx#_VZa zCM73QF^1|BiXDtMwcih(iBooK@&ke!Xf$)*3fez#t46?jPbi(!Z4Fj-^R90B6=jVx zB-2H0G~Fe4?7Yp(IU*el4@Fbg`=0w^=uds5u270oN)I^xLmwd-wzmy%5#$HaY{3Xv zj`@S6$wosM@yWy-5=|zx@5E+`X%hvksB!@Esi}MV>uaVlt}TpTXT?j7PU|CbjW)-EMX!j!e!gjmrv5gX9L4Udg&mMqaF!~I8s7Z!#C_<@gCPmoUD+(2` zfeo~lPP&n213BrWQXU_5$cd5DL>EXC!rE}{%=eWqKp@A=a%Rfmng|azm+doCnIxEJ z7=O3d@D6eF-$tKFzVedQg*N^>H^+e@=&_)&vb7UhfoBVM?H*Kx4nYz%J%lVIH}xYLv`Q`;A#3<2_=x>7)~7p-wjFRwu#nYyk9?W zwn3%?uP5N|XAOujnyZ=ue|Fcb-8>RRty5~VR2=e$%;4=ZzV#!%%Y*&O(fLFW?(^0@ z8l_;Vi9F}-?PuP+NH)ZrysK+%TA;yIcx_&VKA6kw+i9R3VGwP`ivVpkYITFchAb8E z?1%OCn$X$u6X4(G>l5io=!E>G*+KKbMjxS)gytR5z`b6fy8WuD>;;h9L^$1qv$s3= zY?-xb6LY_t9R7BpE1UE?nf!+iAS=tiM<)N;ua@<1Ie=`xnPOM1GH$!Uh}eBW0}cee zDmLVZLfCeP`5AUU5^Ru@P#LAX9pmyDfsa?e)w{ ztd#%e=(tj3wLn5C%HtxBOU^e)ift`V!{z`+U|#x#1eggSBr*Yb%gSyTdye>o>YZne68qr*aP#5Qs08iJ&k z&L+d33jOFiEz!j}=n?eg-D(}x?o%ThoP)XoS7IqVP)tcIHw9)*;trJuk1ofzg{}#? z8F|$M(CUP7v3KfwdKHkH6p-G+Y(hc@f#7TIButZSeN!zlEhyi5=x_oec+=?KIQgEkwih~? zX!Fh+`tE*aql1&F5b4LB1p@l+toMb1d@`S}2v&#giS#Zj zsD{eZRhL+7Pma45!gsJcL@qmS|got<%d5afTK#L!!_mq@TZ8hmy z7JSXujJC0|m?6WiI5T*}G#`{$aWR?%2X7^JEe8;(Q<9OnB*3AP+JZ;NK{;(LQIRp# za|?`$1s&HVo@`B7$=wPa+&-NWc1o8pEO_MKYzhPn4Kf ztcg#ihgc!>BTU}yz=E@(zj*===QdUdDgusIhYV|NSyD{}t!6{v9KYmE|`eC;HD>L4t_hC+by; z7&^n|F|i;?ElL+9s`%9Ng4?vJs3~dC@Q%1&zxmn`$we6#qamNVnwh(q$9hEu8so#~ z!{qoCG~*tpjV)Xp(}?vwa6RM)Gn!o=bTSL0}GfgA4|jX8X%b@mlG4G zIsj>MN%F*@xo$m4mj0O8u2x&CO}|M;M)`I%LW@Y=-eed04sRX;a>qi%C`^Q8Sq{a{ zG*kK@^qgNgxpjV@1NPSwArf5NVNRUxE4oz&l+1 z6a`Z)-Q|`P-1`U%#9w`}WbOFC3Kd@JuHkv{>>g}ldHr54k^{Fy3Gy`aRKz(D8kPf)c+I=jI2EzCb%^cRMg4{J9ZD+03@xcx_on0z$ooD+AroJ4 zqBQ#woUU$JC5cX{Uo&XJ1sy!et#lPYJx7jHILI0V_sjVx47PVVeHdn3{#F_6mCKQUN;f|~yBCH{xr7VE#q+hYE&+U;*mz2o}L)VpL=?LQ~?_@1a|ePv)og6(|k8aH5a$AO#Kk)PA-id9?f^tC`a7fE8ZhAD7QOF7DFJal#E z!4?x>-6m=oiDe?56?bIrLb9G_8wePO-_2LZ`$E}-njqPe1RcUIwc+#ufkQP}9Hf5k z>H5Y0v6z&!kEUxohF<16Xvh^;EM4uwbJB^56&fOr8n&6Sk8p9UZ(E$2Fk1n+ja@2# zFCwx{N;)0A9o<1YzW$1v6jBjP+UO+*n5Gm5jJC_BQ;TTb{uxt@B`lKn#G#b+TF}cI zc3k2YYo?*$jTJp9D%vNiX*|q!tdF&^BHnChePFUvM&Gf{vMN2ikGkXlza!5_TMacV zey}F6tVbAE?dN#X57SP--0}hWxx0wQl1F0N2*~`#!$WN)t+8!2n!>7MDw4r&y*dZR8>GpZ;F)0u&5XF`mdcmpk+%U8$O z1p*lpeyIl!u1T3W<-^1N#Or%XvKJVidB|QCKC4Ao5WEDIH6hooeORmyK0E;!skdpi zx;fp+aWw{|dH&RE;+%dw*44Ru2*1MLJ1N8<=K}{4NL8mtna3i%t1{RP6NKngLdyv| za+I<_k_9MMmIIv9%nCR!i$2ZTsx;5!!YFfM)5*%r2KcbrqJss)$aZG z7V`0u=xRZ|%{-t#xD`Fbctn%2aL^J|B*D8)D@wUA71A_I znfNiFEU+tZIISil{y-CUvO>>y8kgZ>? zZ}ZyZv~2uHO@tiC9y(!)hyM9CeGrG&WULUT4~g6@Ed9Kd;uUEe&!nA}nHuds^SR!m z+et>O16kRAgJ4{Z!@`MfOWcSH5Fr*8AM(jYqKh4l3IYDP=??*V1|CFxKc0RJ=G@-B z^p%^>uN2{w=1_=|wWTwhGy4*F-%a08&wT6B+G){b;iZ#!qKIHdctN#sW{3Z2=Ayop zb(GmKUg=P~r_1j;xHX>^gS(?I<0jNE-o^Nw1VMDT&-=~12-M341G##y2YY?8?bxv3 zz|?x)L!Xq4IYLM@L4xV(W^_~+SW-Jp0P8c=)yM0!v19q;%T9yY6t&fEu8Xh4f$8LR zjG$q}eUlX}YRhAs=T7&xs!KWl-v!A(tn=CaJ#{|wUr8(5->UQ3f7ilDS=(ykk0bS| zma{I^#9%4mDDss3blDcQBY_S6l1L$_kQBdXI;HdD9q*-qJ3X;aBFxw)_2KOFv{bCW z9|3HIV~4ZRT>|(P7{Ht7FM>GyB-P&{&YOGd8vROo`2`?yC`&{#92TLkx2|L@y9*-$sKj2$AvS-vTs8#dr8rde2$oqh2OE!VjLMo9C1FkD54BYD zVB)wo8PMzc`PXWX#++l{8#i!LnYA%vYDDDmKJ#+=TgHtKpdI3S%cNEa#ciHztK51` z)k@4mPi6nS>7#f{Z#(e{t(@=?>YIl7WUX7V`rfPY$X5nz*t3H#AaR}J(=Yl*0+(xKthvN{c8}v>yXIe7 zXH}e(7H!(u-Tm@Iw`ati!7azvecZHCO-e*g=Jc%&JzFW9G+0JnN?P=DU zrZ;LB!UtMXo()VB>*|lVaOR4C^TXnK`?99BJ@4BNSNqhOd{57c@FMT8 zQ2r^;3pOw;-|&d|YE@1+WxM!%ozlA7LUsA2J(I01Z>nmU@GPTgUJ5=DI;k>b`OS$> z6Xd_s-TT(QXyuT3&3AdTBYD5*{LHwQjV51wM56d*6`KtXZ`)F`Z`b0FoiBQ>Y@YT? zrsiAE<0Hz;Qy0H-cXqmdb>b=I>{T4=c$ZynDo(l0YxY$`MCJREN4m8~6GT>qTg=Y9 zf8^vg(;OI&`zntJQg*Z5PB z@^)o@^!4KISw$K5Q&ygrv+dxM;_G+kn^-QfLS+SAa63{O*rq#g_m=aUu3qD?`ch&Z z9vwGjU5Mm`*pOp-*=zUcwC~HbojSef!7sxts=nC*E>kQ{n{ay=u0B;+^kce5L%r65 ze%Y|jl2+AKrw+;Yo5i+V`!zdJ&%-yy?Srfg->H!PyJ@e_U08YP7wKNY$26;2N9&p! zwGWm~-+n^ysi4&lzqOg7st1?u&6!j5(KYSh;la3{GlXJ2(z&0fYiZjBiA4y9L1w?LwKeNvLPH-(H*OEi=UsDh?&L{^ zO`pyhy=+Rk(!+|>&2xcEFHMbMJ+xi^{aW$)|o=-4dYIX?}iIJ*a|iHa0HFkyL( z!~z4^XA0k4=AA)03d$08)GbMyl>P3VvWDU^yC%&$7dcYU8nIbNW~I052>5n=*=jJQ zx5ow+lbq|NBE`wwWumfl4N1!G(Q*FM`8)5}uhvj}6{^e2_uy2hb=)T1iVS55*RFRq zu=vO?U>q%N}M3@yNz;YM=vMnzJ7V?&Sx+M`V%;|q6H15*IPyC-noM(QDD)X-j z3kpb7DL6SlkR$kwY&?brmd7WmT3rKKxex@ovHLX zl;>AleB#7Qzn2|i`@Jom%K;a(A&)X-nt87n?X1jf?W^wE*}0^+ z)_&gPsI5tyOE!q}h;QhgDOnPBB#kmxVf(MogWo#_f7Uj3(o24pfAzdIFZET4(l*uG z6X(5I)#_!I_Vz*4xsPapZ^kkL@Pv|4zFJ!B*1L z@wA($ctCjZG#RGdJabAQL_s5tEn{4-{!d9=!#-m%W-+IX|cto>c`=cdSmMKaR+ zU$(%V_mUeeejO$sAFve@`4JnP{Bq`8=fqjUNu9G6N}o#z&C_%aH*ZY{ydb^MR@y-H-CFZ`>Cs&bcu|RUj!_QlW6IGxzKRU#&z} zteK^Jqm}bX_NzBRXPl9k9Wk#zUsF2QTPvT~KfUBuzq`lEg!__~Q}nJG%y1E}%A^{i zy}IS3SF>L6&U*d9BZF`FGn(6myuor7<+9C)h3Wj6r{`LDa>rIZ-%=-DcX3DVkqP^z zJKUTyIaa{zwA_O$Gwv%EzK^`%Y|iVP)s_0RGSifC^_cFuFfZHbA&d zB=uN{p6``g7nak*98`rAt%Yx2j(6YRP``6o`TfUIZW5nAo|f5}UYIp2yzk`miWduS z`MgiiJwbJQ^XvG$waY?iPZy;KG=JZu)UQ<#1m2rY|mE=H_G<;Qja&^&k6N)c>9S7J@Cv zspIKyQBj<s39VUW+^@pRIHJ1O-@GGs&f!av zSQ-~PyTCzJLq^k1Dr;4Eu}FTbxbP8Sf&TPR$)ei%$jzI^&U5VIH`DBl-S_AV7m3|) zs>oE9jF-$xxE~T@^mdOkZ}kI5)wzqzr#B*>BIZWTa;A>`9H5iwo5Q@ZhJPk}pM)k#*g)L4?14ETbst^Xet=VTPl&aE$9a0@!Y}GS6{DZJaMV1zL`~`n{Or6 z?$y+DSlC3z`g)S}tEYM8Bta($*Vr3By6zo!%+1;AkmL3E`l0@hFSmR2qu1-+$;q_4 zHk*Wp2`AR4eu%rejx3U?^22}6Ol#!@HcgN6vxW-e`piI`_Y&*t>UE9?hMf@}NRGF< zMCr-?m>Q(Pt?_B%(Ncjy`@`n^r>^=h|GMJqjQ2cWUgB~1ADe2_|DC291#4oUj;Ed>z&l_vXA?Z>Tf(epw~5px1C<9dMb>!qRQ+>L3z^p85w=P$6j(@bep(pqX+$) zAaB-;sMNV}Rx!p=d)G9T$Qsr?z4~m$6YVKe{6y3@R_34MXEb+72h1SPzV*P(uf4m1 zbD>7g>N(IQce=Lt1pz&YkL!iT0it_GE_*);I5IOx7TXXW&; z`_s`)46_3gtDW@EFUp%8P*E~_o0oEV(&kyG2Pf^jawPB0tNV1uqE80(H}-gJces+? zW7imH8uN?++)V^Rk34Bs*pN_~?82Sud?B>+{*(R-TDfs>Xp=+_zky zcf4h|r}BSxn;$x$@5xhJ|2?4b?WT2%9?clH%)Mux*;xvzP~Xcb77uJXZ1nNf)cLXk zQ?r}=`qbv;zs^<+e5-W$`_b>*%X)t3<5Bk?yIR!$ovzkMD<7clxbAo(;eGCE@?Sr^ z()v-3$3^nwIv1mc%R994&!xE~$WG3*nYxfe^YoW)zrA`YMoY97g$7oyxK`e8{WC@y z9mpctwhhJ!N-l^K+O~4>0)y5i5gkP{hC~R+2-o zv#0Corw3);-W9D@mXu$fVXw?3?yGub+P(@$)g?w3=3jbweCC_IRNSeKWPy9VpRc7+FD5~QJ#bpXN_g2K) z6i-&n*<>Z!YW%|K)`@GHmfDx^Q0h#rwI2qZS*^(F>|c8nHF)^!*(tSo=65(X9F9~R zqJCP%Fn6uCN-8q9&4>G?UlhqSw|uWxw^8-n8nRyak@+11%KIOVE5nyJ2g^QGvC!go z^OuXfI_>8}VG;Y|_dW-ne5iV)QFE=>hQvst+c#c+R}Q$Rv1etS^@btVdhS0gE28t` zi-O{t`iFad#UI}Ubf)`@z(J|1n#{dI-I@|r>snT~eXIXzP?8eTAJe1uI{)+$ z4sXGLNnW&=Q^ z3eRZ}abHNge!G3UwaAvBXZj2IKN-KJmrYe^6Q?S@Gb;4oZeE&R`J#2+s>~UBpPS0m z#ShQveeNlG{!>|U!RvcG3ayI+r}batT>f$T@rkB8@*j3}cCBhPn;D14?0@XGQU7Z$H>>n4S*T^mmF20NN_*srd0y}q-7>ZtYR!J?=O zH7m;d2cA_OjMIfj~rZ3o2-_qT^WlF`4vX7Bj{nAU)CeHgzs@^kA zdfDa`n#XP>g*O++=~Ykf7gMd?_w=X8w43RHPIK&5UlhK?AW1k(3yce?k5k~@ZIIu( zBWsBAg2mz+xFkLAJm8jjTR|_oAr( z--{Qrlioa6s=k=(Uoqt+zr*_GVD!jiA74|GM!iSNBi{zdM4LQa`)RZ_*PmS0{hD)6dE`_&nL%f$3I>t}^==$TIQnbg50McQ<0^=wT^ z?Mbm|0+Z&Z>!qak@>&Q@Ki`l!H-Lr5h=e^Fk$5Un9uPAeu zJc~)#u=wPJWYzE*&$v4&?LxQKb1%4OdFK4-mZwp!Ehas_H{Wc&ptam(u9JnykuAp$ zu5S|LyOg1`n)?2E@8JBXfT;)4!?bSAv(|{%4ck3PwQbk=%co5 z(G}mg?$o0@hL5g@H~KgjJ%y4_Oys+bgwMy>G2Z03tuc zY3KUN9@%MI>yBN@7cAc)J7B!=m9Y5Jdui|ZSH+Z0m9aUh-|^k`T2R=%;?BvfF&{Nn zQnf6iGQ(0b)-RERRadypLHA2Mj5`&W_&oZ+SNm-mhdZI8-w%K1_6p|U#vwHAANyCd z|DFETNb8N6(6n*&uV}P!5Sq+2yj90u&D-!eE?;~0q}mHy_kyxpcK&dFo2UO~QDkW8 zP@3&^@9K9UoA)mks;((@h%=R(pT<9FkKu$Q@{8R|j&0xzQ{EEPbzzTC6tbF>;GUiK3gTB7Id;@RL-9!j=VyN{5vbUs-wqN1@2u{k6e-=I&gc{tu>nx!=T1 z;ofZcG}w~wOU3Ke-15$M{VNXY4fq!RI%gJS;B!`NU+aQHBw?G_oI_->w3RpK3@Qj6 zX({tjRlS$QZ7~Rq6W&m3Gchr=kZ}fZh#uHRl=BCSNp|t z|HPFZR_)5)t@+m!8q8i(s7cKSk`=Z1B}cZ0c=;`zL$qWj3aGW)d! z3OcMFAKGnkR(bE8&dcsl&w0))`;#hTQVr&MA9h(vq!p9mynp*CS>k zY7?)P%ssTXzjT&FtMeM0j;j3EGaP&UuRC?S)?QGW*XZvZF?FwW_tE?ZQ+4Kl$XlzN z_uh8rj;V}`6M3E~D{OB&&uEbBznFVf(|(yj<73f`hgK^J>|@i+>l@on)_)ainR_CR zUbnvC{TX@fqr%?DK6f|dIUU-u;hV9ALzQWDyVn(`BG_@h!nMQa7TdLaH`6)hmVcch zG}s%k+Z753jy>qft7%O4&;77)l~UaxT;0C8G4j6Zm5spT=sS#ca0QvI3oM)1o>rn{5XlM2oia zT-__c2o};4`Rdf8B=lqc4{kK+ogf}}|FO$O``_tuQL$fZ(cp0zqw#G1rp>NRtA~I1 zQ{$Yh@?_z6gU?LPKC;Zw-mA^wpDSo#FZy&q<*G*BkHPBg)1TOJ@XY)&crSH@gD=;w z1qP%()f=8Kccsp7KDMn5mGTJcpmh|SLl-G*ZY*;>YM3~{dptPSLn-5+=jz9=kZ+{s zMK`9d(RBD)rXhZc;WeSzqf>$+#d?Jcf6%JNDf0B0Sbw|sb%Z?AK5{e&*t^OkN{*u+2uBrg{ zox+uI-z?3U2(xd3*^wf4?NIa^9KwULv!*F1j9%IWckZ(fe^c z!CMtOWUcBQEu{I1UnW&7=(DoBF$e0)aeBc2Wa7o;8)x226v?dJ8uv1;%`V#a!}`vq zrxKO)c%Hg#8+*OG%uTeOt(o+#%k{I=r4u5&v!)i`ankmx>Gm;=xVFQBkt(u*%V5py z-1JbB)z3cNn0HHia*m!X`fy?Vj=YK%myB2!RaukP2hC5#7j;XxmY7veaz12P8GI=u z{fzMa&9|Q;T3^#QCSHxSEpq#*_EmP7lGM9L64j5V@-2M+Sv&Q_=1bq}d{JAMT5pG! z=`+kw2Q3u2_OVFgrNoc&_NxP==+pQUd0m*>eI%aN|}U)-iB z``9p3s^EUgHv0!L``xNKuZVP&n&qDM@P`+E7x~Vu!o3ym8&BFl_SI77rc;tVUim5q57AG{7Zw+2lgzGmmkv4tDsIYarM zREo@d9@?KZ&5X-dk&92-LGaYjzfe8CWS6Qvo-(^mc_xPw`Io74VuG=}7HBCNQ$~T+CIxKWFz-@@ve>!X4&?Wpu0k1ub}*+`qEuv0pEkU_Uz4cbi8!CXGJFBMiF*ETt$ z5q_G(@!Mysr~{J4d7{mvHPvt3eG3IYZM_-Pkr?b=x3qG}Ax+B*F51qU_NnsU_8%sm z&CJsqMu?XjwtN=E+c>k^wkQzIpB|^BzfDc#@&(EK*4-LO`D^b7#i-olNfr@_tK|{B zxJkF-g|cM)iA+P*zo)6n*EF86SJ4oE6{^d}SK-4WntMS~lgBi-{atVFdgTLRD_@k( zTT*h2aUqrTYI9qVrv{I3T54lilRY|fZNz;W3z$ksRRMHmy8YLD4xd{Zh7YgqaPeL(PX8 z9gC~U3(i&|2WDi=&9q#8Gt8hbvEDePD*Y5?>cTKxk9j^kow~5qN_$y}k3t>_`;4Yo zRw?B?Qlu$t{w(3OPvH%Z$qnoDeJzRUv)r8}=G9KRp?!0+$MhU2-qaag(&yGbo3|mf zFcb>rDt~z=TuZ&-MRtXpi)DVHlR=dLY3>s=U9R$ob5l-s{zo&;J5{zW8O`6r&%~og z*B&@&Xso*4d)aiySs%se+}*{+H4hHVZ)vDg{UmtcN`xR6{n4B1wO0=r9?pPzr#2>b z#9d8kwYgT!_blAcaVEn>zCEz+T(=jZVYYCP`l`e&x-X&N38&w=nrZrTws9xE-sm6l z{QM-CqoKH=9<0SX5%+`qT% zd*VL*mCqU`JaaFvmy7J&{jylCYj;u6MtK_xsrxz+vHj|%D@|>VR^{wzzOdz%ZtLll zuDwPZImtDK-E(fwozzfEt1S4eNBX+*E4Rugy*fPd|6|{b_P^6NLs>T6arMopcrG=Q z-(TeRpEoaDsxP>)fP>GVN!xK{j<#d>ofis5YHe$>gH8lw_gsJXOjPR0jeW8@Q<54R z3tMhnw-=QEZuoxQ6OoS1uLjCE8f?or-xzl64y(Bwl&5K_FY;rb=VVIhmY{s&iflX0 zGv^-$)~(pVsdu+=<;B*#5&A2OY(3UA8Inz2`5=Bbhv%!+Zst$+=SGAr6IRSWRxiA1 zUv$GHbm0O|^O^@4%Qn?{Oc4#PeBExM2Yt?x=whku0()$f->Z~bAIh2{{VC4AaNCx4 z^FIEJJZ|0a?xnPK?q|?`O$X!q0XLmDB&0U1wGywqLYAKfnTlvDs3f~2CH2oVp6R$c zva>C9w!6&Xg6bUV!ILvRw$IFqK~mCIh#-EmE&LzxqR!ebC-_%BKgSCqwDGF@J9DM$80;ZE9qvBW}Y!i%rvZhY!!2PlHK&y zURPH!oiue}4#`7SM_0>i*e2K{n0!=n6&iAJu21Ft_0tEH1X7APGpvN>LOnZ@DAvXXKyZD}>}?(5+t);}VnWLM3*;AbJ!X(iDX_|){iOwpp6h2JvBSA>;I zRy9Yp>kL+3iOQ>*5vLvaqHw$X2^D_9q+_KeJ5&1|MY-os-6OMi(h7q|XyV={H^1x& zRG6IFx%cU_o7*&>yt&zRwW;Fn(U(?BeyN%%au;3y+GH7BuyX>R!=m?}j+NeSahkq0 z`O0<4X|Hn*t@SYxOm}VDYT|2nZt|g&qLU7s8(ObBwz*ptHt#xF*I!qB+Wm{|ml=aC z7hm9z75&Ga82Z1{6GO3eH9EeY7>w`fO8K23Kbo5rMSH85Z#qO)#XzlD4N@}_V37fPkp2Ef!(e2g5ED{xvC;Hi#e$CUd}muEhs)EkBbpAle&5p z_rZ@FCf421RSwzEF&JYoH>5z$S(#t23fd{n@DM(qdAhc?Ez8jT(`!LkD&l$i@}nys zw;x2NO)Z-`@wCNJspIuZT5zFj+tpX%YaC}dJ7uVIXq6~kohSEl)}6vRmS$^R6r(e# z@|Jcv^qWiS`lmm%RZV|os2u44d#kjqe{7g=NH2%?xlR89_zq{^p zQnc$f*mC#2vv)M;VHpY%Jx@%}hrj;Z=k3^Sq~Um=a@)H_7achZ@0ot?H-De9%EsDW z)35ixJem=>Z~xtoSv$YZYi`m09@ysue^&Z(-fpUpmB1}cgD1b7wx@qqPtpnDTH^5j zg0%kS8nzX5W($cl`_|^iOB-JnnZWH9d@|lWx&F;(-958zDXqKX;-=)lt?_kX z-3I5cVZHs*KJpy{lbjQ0w)@0}oi6_>a7fm1XL!MdkJ>AK@3H4?9_~q|Cb@XSH3I8H z^Dka=g#!w{K7H!BquY0u?lrxi6TPk%R^##ZANyhG|4u)Qj_qZm<8pn$cozj2|GvHG zn;h5c+k8%YqRlcC;_P29c4;v$scpF?U0Z9-w|>zmPx)n+_TCH<|8Uj+qka23 zp5g0bS8}&28|kJ74YUoW7L) zV(Td(){#B(J3{gu4+5PeE5t_bkL7;htgI>jw!%>5zT*$S{@YI{^iMxEp=QU57Z*|o z?jZ%`Nyit71nGLa?uf5-m;2;}(2IG33%g`0-E~TWX1!95_l=ZMyPKEu=v{)mn^|E% z(#m`G50?r{PRS>GEf8o>4ffu?v3%_#NIFzFBzp5T@#9Zy_h`pXPo2LYB<6FelumkO zQSb};V|S+~49kk}#;@jYg51SpO2c+KO|_t2X0$uOw|J~Nj9nuKCUB|Uf+gRJ?$e%P zc~|M-=^TqwkDSn}cT%Swo3ck1UH+zUPsx?~Q>e)8Fw@ARi|0)+;hMfvSOVegoSzlv zX!_QS>>$2`&&Oupi4*A`w=GFAOZ^X@C|TJgzk ze%)7!f^LuK<5S1u!XE9K;eYk#thuH;-M>9MTe-;1m}lXED>*d}7W@CKJ1^c@{4KJz zvsf%3^lX#<;~lHt559P^Pw`}EbctDW%lt0_rixysu|7RNj!OOF{w&oJw|jxD;$m0+ zklp9ePsQs3{I8qeG-BM>iHXj8@J6d#UEF8-#^;yzdP$NtmfsJYf6c#?8u`3^%hR7e z7sU|2Azdqfu`sYE(;knF|JY|j|9ARKbgT&k9aowLP{;ALwD;o|!uLqUT6?X04De zd#``WG0re@WnA?QA^PmD5Kb4dBiv!6S(M98^X*L1XJmM}Yv^+pZL*QjTD!Pa{Fwxh&@%$B5<8s zf1z}f#>Mw4@Lij_MMoWEGi_s%4^%AI5UE-%Gr3oNR=s0=CL>MljI|x3Eu&e`^nJvs z``_%2Oz?}WDinC{H|cTrj<}hN3+6vCJaR8xA$~$UPu{@Qn@5!o{+wA`A-B7z%uCcf zd0T{iVy9u=x1ufk6sn%Jq3d^Ve|)6$c&mwo_Cb@f@FQXh$7PM3#o{T4vSuyePfQO^ zcUCUR(9`)8ZgZ^Xd0ibzhj#^Kuj*%!1A#NOOiQ$^UhKXV-BjRm_z^<$Y(xCsm*e^X~b6eYkn|7YObYsUhoh<^BZ`TX_yegry+PXPv zP}baX{%T-w2xX6Epm8L~Pe z6>2LF&AZ%`_v>0W`XDY@Fk`~XevwwM!1K);CAkD!r&)67a;H1n`Im7v+mvzHe=D09 zbzP26E83iT@i65T|JsRMK4krHZ|M~m57oXM;&5a55QjDItuyYrd!$-fe9tazz1`l@ z+f|FEalMF7TW9oO{-c-2`R&s)&A`8R-8EFX$TK7MTa71Y((U)j!S5FCbhe>yt~+qH zG31_KM60sf?uWORSYGgG7Q0dHyL>l^JEY)YCcoOjOEGiX4==544WL*YIl{SWcKM<` z9rqsO_8ecm+&`Oaq;Bwj<0NN6FUEwZ6_2w&Nw-L;lIE>z{mGgRgL5xN9|s{%g-3g=U$Gwd6Oh`D_bj|)nq@~bYzWCMSzCo zFn3peP|A5^l%al3?Tne7{U&(X5O)Pn+2)^{Ke1WzsEb_irdu`_2c|qaKG|VM-mQby zd1^eX_Xm}}Tl{#c9r@cK2d>W%?+Qt9pWyvFH7n*8%bt%lK6LrUzTEk@4CXj0ZsSZx z50#&bj*@-mwjpu3_QCk_BN52DxAUWTudTe-8TZ9Aw4jahB5cCX)W;!Rv3G^exYMjG zVggUdn6zf^=$(APYJrwsUTwUJ8>Gy!#FFo2K);CnOWzBhTQmLhT5gLx(=5Jpt>8Mw5xRUFV=VIZVxkhJb>+VOM3K4z3 z>T0r_-12936ro%F$Q!R=so7iy|Vkim$Hjqb6+iyV2F$wNO6ACKXR7{;|1*{?9bGXe5@roBsc; zmznLJBRf4cX@*Zq-Ps;%C7G?+UqVd8Nj$SQa-^Gm`&`WRi2v0htWXUhibQ!G~%%;Q|xeH(2&bc-jqG-N zlA(K6r2Bb`PHM)7lfiP|ucNYI?Mvi86a~8ro46-%Cx7asDQ)Fz-;-96UvHmyx8zi@ z?DF%v^&}_$21=23$_zPEaWA2Zdi#u~JiV)Q=D;PbsFGRa9s3uTD_@b$Y2!1}`Bb=m zVmrTPgnntWw)xrK)r(EqJY)H`$wnW_o*=z>%lloCqPvy8%9Za=OjRoLaW4N>b!3A<+eswfGqOH~l)E9d{%qX0=Jh{1539zaFZa z{_tIx&y~HlYriSKc`)l>!IB!WXD`zPZreWMS~;&ous5~&TfUfFZLaDM@w>OY=V}cI z_Erwg4?NJ5xYLvVF5CuvOe^0M=Cb!kW1b$@v3AL{i|;yXIlud%b4Y>ldXlG4t-6l% zZIx-Ko{fG^5wW>1Ugv;xWvN>liI)r;V?24bf_@>7VL28=)*7oL)PSd+3T&+0* z{LbcVHs-XDIz4~qPQqN~^YrB*HZHKDereJT!b z>3{lMs%}0*WF?b_g5J~1dx)dIe^zm+uFdd&g2>p9lIVZhN~1&{9nNT}iKDkOL)ye< zvok}?&0cJb_cBY>7+&5RAnM4sSw>6EE!GeHf7#+EVm2s9Fv`4P~OM;Q8NeE-aQ?18WcUvwDffgmO*V}CDi zhKtx*UxufzBf}3L5+TuL5lG zTV#azT|i9lf=pt07j&GbM44&4h4BY}XgeMvwF^Ej0zrRbnvC67fB%6Uk_p3hi>sTn zn}h!!jK5Ho4$O^=MI^I9)OOqKg^xp_FyV~OKRiZ%@~C!>(jQ{p zMWG@34--Sx)WBFw*+A>RXMrGMTA<7`hfwU3u?o|uE{r`H`OlMq!bHc=b?m9cbR9Q) z+IafoKOHCxWENqd<2(=ZN~kfshZ6T;{qe@Z6mxVH)6_Q=Q}*$8vvqT||MLv2qR50w zCb4@9^#9%hnK>0Alj+#N9FgW>NoL+F0C>vqx2%7H1zaHP3n8=W*63Rs1=Vu3b@s7i zhz*gQ5O6pk|GaaoWRW2@5dY1~W&{Nv1c4|_vmyi1h5gZ*-+vevq@Itnx1+oBU*|`r zF-sX4kTNn>%E$;CXjPk`ZQj{=7#!FWAZA6Q4*yU7Kmv+J#?qfmVFRhj@cu8Pm3?g- zok!B;QJwP=vvIW(!)_bE)4;kg(`5VP(fDDWC6 z05A;;Ok)FVJo*~O1Re_w16dxKc~>6YZpNUoGDk+oxdQ5*o^GB5h!6x!mIffwv50hb zZ+U1vhxQb^-^)8BSX+j(Xxov*_76U@bPj(J&V-MhBg9t3X#a^A1c(>}R7VDCtoj85 z@`(V^hE*&GN3kIGiUmMWVP?gGu!;piY#_##(?)D~I>SI>_HLfT|M7Qd;iFO@W*vb5 z3B%sq{`(Jqdj?%M8$0kB@KIqB^L79M>IGrd3qshSYIrgjBODr=x0dVB%v~^H1*Fkb z=CFnUDZ}1D{reAp!yhRT#;}dOJ$-DweLNZX$P_wr)&v2v1z}|iqOw8Ovl&UySX2Wc z0kt-BS_lDxg}qDo_aFWSsk((>JAyeJTtkJhy|bgOHxn|D_|TbiVAkoO<4+MGAQ3~D zp9mgG5!ZP-js!n8{YMCkr!k!veGv$@c!F@mY;+&MmapVd$sBz+m|0p_N>$*Az|0WF z${UO$Zx9{WJ#2l3X6`?{5MGXU3{Omt004tw8Z#Jn!Z4W)n5oy;#;ob-=HpI)0u6s4 z{ohN5fyxoaiW&^D!8BpGxVw#Hxu9}_kYwfnhXD=4-qHE{4}X8Bt|J>kQ5rTjKF|^!B_!T2*(RB#g(_y5w=7o=pkeH*(p`I?_Efv+;Bs&O5ybfPrm_b#^E_iTG1U!hn9k%nzjIIF#l7sqfYp zC}`>~g+`?e|G^NToPvNh5Q0rkU>qfbQ6M=P5>Fdv$L(W}@Hc39r0`%G9w8CFh0%a^ z^YS*f^>lRi7F+A%?e63KXJF>d0;T{g#%du#X17^D|Gn(dO=xVhVAf-VX|o_|s!)i@ z4FQ!a1^cQI96cNTA=S}`ME*P^3_K+DZ<_`MCF-4%v3D4f5gdU-n7g|p4Fsbh*x{+$ zc-!Ekz!1WWf|W4@VS_>>V^m^hBY=z{SQ$eo>?Y>sJd~5@*|-it57V0f6J}0I5J12X zEX5Hj8%#CEaMdufE2=npyV$tnXbP3EYmPHX8oLN$3Ui=shWuSq3{-VT1O3l)0raCX z(+_(wFB!qnIs{uofqOJCJVZm8!wFkDB6K#x8!>)Y7I<+>1xgEqSsD?nj8I79mk|n3 zF;bW{jlv`&EPY_wUqT#6PN>-Ago2ZUQGlnT{&_k;7=ks7-j>;CN%-DAPRFkjsoOi*jug06of4@erf_hl7ZEw00KtAa+^Y714*Qr zG>EXvPXY9cg4Hhyl?|l&Hd|*OuOV3&#vRId@iD1DAx8l+Fzl^DWD1Q9rV+#2(~&_0 z1p(7znGnj3A%AvQ3XpSAA!2y#MEr(oPh#sf#8-cOKm>uA_=COhg-j)}0bJ|OaK)MBA26T=g#ybAq?J_cT&ZL> z&|~^Itkq*h6frhTVcr+1K;1~i?nYFI4Yr1(tE1PJVRTdXKX^bh0A^+`>+In1_a;X7 zpV2s@F^9VH&^}@8X7BAcG=`Y&(0aRi4KdBZlL00uG~$et0=x+t%bUQFvC+GHvHlS9 z=>4E$e85(KZmwdc`da2Jr|si>Yy@H6;b|<9iX(obFK(;~@%D7H^RWfR7D!2dA3%%+ z1y&lUR5l1>6B*Jx2Bu+#f+-p^4XA+HQL$=ArLjRZ@wBmHxY&4ZB|sz7nG0$v(A1}5 zH)kr!22I7$b+}tHq$)!iyV+;Nu43fqu!U*QL?Ob)HWlcJQL$MXmCgozRNnBRz@7!m z)MzBaNFHr)>zj&cs_Uy8DeH#` zjFgQm*gXZE_$gRuK^woni%bJ5M!?^tGNd!Z>6o_-Q+9+BTZG2u_WN}}B$ma%$;(Ff zB^LRkf$~SimYQsy3+#c?u>7Lo2po-hVa$d~_u(kl_i@?$r?>$zU^=sM(6EUajlu?F ztW%(B<8HIr(RpZJV-U;+hM2X31_m8gv1n8_xazL9Zo_2{6Bv*yQJKlhIxX5iEFw@# zqRjpEH6|toc#8;>cL+1LX+R!~vTzMY#Aq}?s9hWhk$_ErhLtE9oz2+B-ZtJoUPJS- zV_rgp@NkF*bbL@Oe^C+}JPk*NvmF5v1f0yU%mpR0TR$@CzXe2ra*)oPglHMyt{;^( z%^Z6YU>m@CQpqSz_JxxFvVH&(nas3)D7GL(VK!r%*fK{+G29pdkR?Q9xX<-@TJjDjT%5Lq(XYH(0!b zcreV&Y7|I>P^?g+G&XpKJ~mk8L;+$mD<=x%K`3^ALQytg+HRZ0hN;ek29XG>XcP!| zl!b_NHfUq}!`~38WZ-22vV#5inM^0KTReAc-vvaY07n-nP|DGd2NfsF z8^gh>4UV6k6=(Q>Q9)}sj)txJV#6O2c@dxiEo{KnPR82W$vC!lR%~O2Ehd-{!k!FZ zXD4HQ-((y+J1gEutKQ4q#+GP`2q3JilcN2@)<|d0Z6FfRR{q^i#)&ClpGKK=mt{Z1 zak_)q`6!C9zpJg-x?%ql0StxN0Yt~D5RO$HA7E?<6Fmt zRdI83X4tsmy-Q*f2H;?aunu+z$H9(^t?lL@W@h8;!yp1>J`{ieJ3EB6vqLy`c3e=V z{qwKj0DB<7;0|F8?hpwcAGoTI_sG|Se?_J+H!>i=?+#)8?hpwXAF{HY@332xJvz*s ztw1EO;G|&DDdR)e{e2FkZs)-GEBMF{bf zhS`pdVywB$3rz+z4eNJ@aQyB#U}Ki2KY-xL43!xW&@rsr9l~+D;{alOiy$7t`~?lp zln{0i1O15@3J@_=+|OKa;|3x+S{|Ft*bBhY8pi-X8fwgKm63vh0F4YpDVE4MmUeLb z;i?}qJYf7~uI(VKe;>jzu4CRV`On)0@+&fmo071+Ss>d(fLLZ>B#JXv9Elt`KV37l zLooFLL7b6y$~-ciog9*(KY|D`2@gU7e4c7Uf~eu+ipip3!gC##mMetgWgnGEma~5d z@UlY?b3EJnxO*wv*$qE{rL?8Ye~*HYh{_cRYXXLF?CcO=0yZ6%34)=iH0GhPti`dh zgF~~N@q@!tX-wrE1o+hMpE90EM)5Z03p;ds(PIQ4BdF7D0*YlOhS%z)$w>(YjBOz0q#F@qtd?Cj-+ zj|GzfES8DT{vqlCoq=K2sQa>gyYQyhh}8~Fg$PuHTGV{z_9xoj@23j!?FN?qR^O?4Djed6zuL! zf!ILdu>gc4F|QB>Tp_HOP+&H2SQb!-YXiVU4Pi~x5Cvfa#liyMlONz53uht}b}abM z8wLF~3XidXip`2fj5LhVb`!`1;>-vEHbW{)1mUR7s5Kgw3B;KZ)42*(nh2r(1D6~YP%jyoEJVhvBgl1u}z zuoIz@#~+?lAYGwSS;N!QpS548ma}lS(3v zOdwIg{^lNp;~NH{SR#`OTCQeJ_ze3hH%`(ARJ3@ zLWIEy7>XgRp%_9DHc+g=2{fb002a$cDC2Jkpg<`EIKhX5QZKfOD@3w4q-3GhH$*Z5a4^o(15t)!rF%+9Q!ahG)rU> zmt25b7{VHBAsn|b2!$JdJC7KX59VF<@848pNQCQxz#&0#vYK3FZmu?&MytdU72 zGSuTt&TyOywT*EBJN*vcPL?`aoQV9z#80!p%ah$>6&^YRh z5}sNBR$v%w1%`2~z#te42T-C@3m7l}!&n0_jAH->p>R2X5}jhhfaMp)T7F>?%m$8y z0{|4WyBH>c!GK_)5H?V(8~{Jjp)zB!Ol15?3QS^7QeZL}p95fuLVT|Z1bEnCGRumx z%FHNJa7jQT5tD$19h$~wXjT${!;^sZqXO%PV!=>0U|13WP(X?T1NR@oBsvy~&ISsP z1T+#+iUO0s6~bx>j_DSJ!;%1mVop(Dz?lhSjkhq4@fL()Apv;H4D&G|&P1T`lYk5Z zBtTh7z|!BK5tfiJ;4_D@4r>_4kvmEhd=3znkTBMt3FBCC!J%R)$k--(hN(qkV7KCHr07P_r4Fi`$ z!`O?HVH`&-2*t_)i0JlloQaITl>#$+YGD|{NrrGteKf*i6$Y+Chp~P`7{_G`lZhKC zG{RyPhOoMVf?zBxAUv>x0T(Tdbh$0E^G!ZZZ}g8?fiI9^&1ij@a|n+avcVx7qNJ1H;>q$w~?C&j=( z4Ws~Jxe5dKkHc8+B#h&;9pwo=1&GU4te+dkG1-Dc<4^!4qyTW|GK{@*8OE{Af?zBZ zKnW=T_!42PjTXkS(SlI86acDY<{M977+fK&lHeF=K{yr)0Ocx$xiV&*%lO+UFmR#3o8uMZ&<<-7vzkrZ`#y6Sq=O;wlnrtc7umwcyaKv568_kuabvSW7pI zgKyAQWC~qQq4sU`~XwK3W)o*}!3A6D6)95il6AYJwna zpjhM?B@s2caV9c;>l=&!X$l2vebcpZb-?R%qr{aY-~xv!Eb)UQI0$i?f)ZDfSX(WO zW2*&+W(iG*kOc^kq+spbFpkF-gu)F?h^W&&I+y?8u!#zeZx)1O2~D7Eg#prm>w^^& z93L$R#TuGGA<2B(1?xm8<9F%9z#YXfg@zNFV^^Gku}NIt0lsV)Yi5LTytXif*!YGL z*LPSuDvaZ+1&7AbXu`ut7;x6YSZ6Ja`=nPNSFc!16ECNY_u@tuP!?jyh@z8AZMKj+gt_tLj)jK zp+Y!B&~Wzg+5)nGxR3-a;4qaXRB^sHol?6B^TC+3gb9x!J%;^lepvpJhd>^Qw!sGYC$mE$RsYifQx@& zti>9}G1-D}ERl&4N+xjYFO0n!7sfHof>5lH30@n>teLD6p^twtl;(7~fLxpktwBXRJfk`K>w*W^ijCIt)IF4En47-=p ziR&#IApBT+HH>4g1)=abKqs!ZfLnWD8a7LzA#C8V9H0}|TQo2juu?*!uz_OX0DuMV z<*XB-{sRYS%p5@R_HtuyPi#s{CoZ=D?>CIHtSOGr0Jkh-Xh2+UVI8$Fj-wVF8ixji z-cJ~~HWtPjtYI93EeOU!147>?4BW~KV{he!aqO}n6fO-2y`L}*Tp_HQ;83v6e{~ z$6q^26?_&D7j{^4HH>4f1&3w{OyaT*xRe*hUdjvOcx6E-+`vQ#Q(C~22xI-TFphr~ zgkuRzgvee8qu}~rr3A-43qr95CU7+X(1K>2$Uo#LbRb8eV{??@-%Q0b=hKO+E#O{f z80-CmaqP9D@rxgt#MKtoP7CAMX~Cg!1e!{Crc4L41#9Gnaon{a7z+=mglEchAWxxV z_cR={EC_|m11jN}GH8Ot8falU!Um3o2f){MKxIb3g-%>a0_Jao#Q=z7v4!b>$yA6dNvyjX#_`vJL*ozuB_;xp zsbFu~g>gKyAQ%e~P+}sWz$?RKDhQ5;7KFkj0!mB-aD~WNI5HbJ79yZTL_h!+ErNB? zA~-Hu5Q>!ufY+3cGGnn!1RggL5E23qfsQ4@@G0T&bur8=pp%HpRyy-eh>%&9lvQj- zse;D>3=lI55UiOS!ExAvL$j~|9G=SjBU=b?D=vb)Di*;p&4OSU7JyI`2#6I507b(> z(bz!YumFSudK?H~qeZYbS_H>N3&LSo078wd{~stC07b__(b+&@SpZ@|%vX-GPJ}%E zJ0lS?^PQ0hnM%Y0FOUX=Wh(;Q=!{@ZfC!Gwc9bjlG$1Tn5v-jX!SUFFL*vkZ@Zb&s zZn8zNH`yXMzF82Ag$7`82Qx!K02G3SLfAmz(g3{E4wxCZLRdAyangctEHnUrFqTJRmGx$KK4?Jh0muj&l|S!wpWtQ%MByLLyiB@YU7tTcfAya{XOa-Fj2IufkdV;Y@C5}yCcY;~g z6i0BNzoaUJl`DcZS|d0{TX1Nc*rXD*77^f%S_FGXErMg51;JP}no87KL;!;#f;G}2 zI7V6!3YP{{qShh;SZNWgl@`IV(t>a-G@uf-77@Toi(sv^2#%E&gkq%uP`T0oEbK(! ze@IneAXR~>xHK64MeyHueS>5mtX>h|PGtmZY(#Jjx1)@~Cj(*iieQc12#(tp92$oV zgjdrbz*V&f_NrP0$3hE&v5o9k z9vis`&P8XY#%ZM8J(%e^C(fro)b8EwP5!8QtLmaqVCh|4S|mk1(jzJdL%el$eVnue zTJ6ki)H%lsRS1TltAD)tuIR{@7r&nKWAW<=uIo?1a4sJIRHTM>$FiZs@)Vf177WCSv4AF4if}Me0J2Sm@7WCSvs*Hx~7VHf4 z+L>9Yv!K^Tb%=)R7VHf4+L`IKv!K^TRg8vE3Vw&Lm^<>_3v5k+9xgl_DXXe<>f@3>B$FYs7Vr~c=+nG7G zv*6gyR~*} zJ6E14{pQmj|KFSt?!Y+^Z0CaO6vNG(V4D<$5Xc1ESrBaFqv4fTa_tP{+L<}2vmn>b zS6tqxF0P~og6+%%+qwD+b@0k~c=F?h!ix6ERM9H~ZVq3O9hqP5l`G6xmcc7o z=)~F`!v-$z+;E;^oLQflsN6AZrq|AbUK<}>49#~88_2aYb5dtPu8qn{&%EQZSeHSrsC1>W^&Vp+jm6fh}-$e|3+nM>cv*6oCb#TpjtBWuL*LG%# z>MXdnQ59V?fUb}AI*N{b1rX8zgp5Gw$AA7)cFa2x3U!aC!F!6aM(;?d-;q$R_Bsn* zZG3d$n0G7`xr>=;I}4_5R8~6XwQkJ}T-%wswzJ^cMs;w^b#=_ZwVj!3J8isBMaK+S zXnp*O?8sNF-r7ejBu`$w{ijd=`iH;yUG&R45(+hs1q8u@hx_ilwO`(mQ09Bjf`l6% zUHIi435Bw?GncKM1*bMD%gX`%j)Ed_F>`EZ!Lg01$`H8k<^`7R%q-hkuxz6`gh1HM z+aG6|7M&rDBvPsgw_d2rK@e1hAdo<^l}xggf@B+2Aqax5x07lAt_vOc@(GGOA15f%@&pC5lW|3K z5^5_;gX37y=lkqrToIjQnzt0(+xTesPqjMf>DYq>UG<=#ydJPCrIAJM!i0w9>-dBov(dpFjTihrj&phu{9Mbf(wF zy!&NHNFB~oj56&$I~nutmpKp%s%?C9F)&|mRhCe)Rx-(33g&H8R(j_3W@QOwYbBSh zm4Ztf)xk3ZoEslwE>I&Sb8DsG)<#wI%mC-QeAJaY(!ZPyC;j6(t@M>V^RNErr{Dgs z=$2P7CxNCdncOG^>Gs`sYqz|DImskjDM+^Q(S=)H!JLGWwURm4QgCjgGK|evASa<* zt>kjGQc!54sxktu1xO{36eZJYrJ&VDb%=m?X!2tk=+PPSKvIxuqbf!~EI=A`p(9_; z*_Zy20w`_azWZI=MjKb~D1i|!1O8KtGyTqf8+wm}JgyWh+xX}r z4)h)eAN@DcT2aNcQ}_BsZvmD%B)%`Shexdg=1d%krFtylBuXt zaB8EnJa3p+exw9Wtz=HE6r9?qs*HgvKT<-uTFHEFne&A@#K4sw`QDdbROO*$$_rJD zfq0L_$9Q8$)>p*9$1P-$UdO;Y%OQrs9oYpIxCrc83^wz=hdl4dE>miypwz}k7ol(^ zM@k^nO6H+TL8y(&5DHgvqy$2(WJ0YJgxaX8423H>^1Uy=sLLZt!LW_$5DN2F1L3_d zzo^RNNx_tjsu&8P0O`jf(M3nT{A8g>n59Tw-uUZJzy0BNpVo{)aL18>{4EO>Ek+yp z%tYmmBQuj$3MOrQbP)vCbA=Lkw36wkQt)V_G6cc(T%iOWtz;gp6g=9fstkhbxx)9p z{Gu+8B?YlIszVT5&lSG+hq7b4S)!tfZ{4lClU(yV0CtnBeZ6@oyXYaU=nzMO|5 zJM8u7!yu?=&vJ*yf%7d2n-(L@zVG(P9Uf;!wG@on_~;@G?(lerIm*sCt>DK-We9^i zJPv$E$$VKU__9$|83uQF92m2b8M9I_W}`ZU!5tn4wyb25sT6G4sET3GZ)FzP5&a4- ziUux9ps>D$L9X6va!18GB*08xm4aC-dMBdD9Tn&D$Wkz4a6wFr)Av``*M3Z`sShX|P0jitbpmCTftf+-tSF#_gw zV~HL43L;8i%8KRL5U%7fxkF+N+0WoP#R&5mo~+y4SYT(IArk9HK7wX`a_pMcn7Rm#OjTfrumg~B9&yIY>{3P&X*OTWb>4pW9 zJ4g*A+4aDf#TfG$lC0c8Y9`4_L6VghBw4wG)IgGzOp=v?BrBgK$;ut129m5~lB^UY zS$Rp4l{-icBv}Esv>?gKXGyYh2dNgFAq^v|Aj!(-NwRVWsktNTD@d{{kYv}h>Hl$~ zf87CUAjqyvkX;2qc728*yRHCrWrFM~2(s%1L3Uls+^j&5U6~-e3WDtVEJ1c%%iOF$ zkX@M|y9$ErdP$I7*D^Qji56N}-Fl%e2S892R_j+F$gWI~T?IjQeV!m2bcNF0MMv~2 z0^sAkWChyUdjS0PH$Q&jEhDzB7}oKp6`jA&Pu3NquFRBO1yeRYx`>1;S9S%i z?8;o(Rd8k3XKA_XdhT%rp6tr>($)G4Rb?df+x%p;XrVlywDCe6BB9?d+gYIy?aH+2 z)#eLTjD&!P<5xsSzWfgM)jnQsx_YZ4;h(pWrpc0sIpNR;$Yt6UwHH*`sH%*Ed5?o=p*)-v+}WrOad1Vd zD-@w!xpwO+_^?qG;~?x6&yU?=NBWn?K_4LwlyUGzfQ&(K1*qJCu7W?i`u()= zx`Ne}`Le6v%f?3+L2%u_U4bpTGRbrmY}u#`L2%u_U4bpTGFx^PY}u%)41(+a?ds7& zc`PaDvr!#_;JSaiLJ8WHE4QwK3>#H32*UpD$Fr(MN9>E2Yu5P4Xo)^WTPsK(K}vg^6@LOBVRF5 znPH+bi;2o_{`@~USJ`*q8ra<{6BSoMqPMMf{>8FUj}w-vi(y`F^duiS@VNfBWON-+cG&|A{m8eaEbU z*1Z;dwHRgOPQ2fD%$hl-t02q9N0;sr6twyAyM}2>Cd{saFdNmuU1CYrk2Bg(FLY(1 z_A1!3Q5D@K?yr7KaOlYTiannd_Iy^}^ZC2KmgpyUL>HLPE0@Sz1$*}0nQA||Bf89$ zT?JP*KDrn#^*Ub&Y}u9Bva4XrMr9Z-^*Ub&OxcwQrmJAeMpdQ%>vg^m*s?3LWmmzL zjq2e4dYvzXIky2m(`fWrFG2{e`M3 z2=uuI!HyQnW62&b)a4+Esz&Hp7)dfqd+qr`6@nn>8ZGETN4{bSWrrmcZ4829&r|Qv zG0?h~!lcDOv+qkNdWVjgD!U4*Y*=rPb`SEkFZf-W1CAqMW~F;Hb! zW|*#mD!X3Ru+=+y)M%kRloWK?_1PM>dPk2M29iwEUIlk{eZGdR-q9mF@)gS`7M4#e zFQ5Fw4}XdrNWJ66Kru55gC5dinS&cKvinP9pKrfgJ( z0J!gU2Bz%FOxb1Qg{m?D?t7gUEtJO*n=jNM0PcI87Df@vqln21RSbZ24FGmzeMJC# zTt3-Pu3hkUUH9)}2;3oY;B;?L6$|?8dz{oEaEHX1F1rf4YogWE)UvwvLLEXNK;rdbhW_4{UsUz1s=rXh z5V+RLEjse$H4FALLkQ%W1^@8pm;&sMh6AU2HyD!x%zKcO{%=<_yfa&N7i`)1X!^fh zkE!m!mED%10-}~~5I?d|zg}Utjc0H#0 z-j`ogSyp8)RKfr4xupPhqhd^JaAu=A1VF#h;CCnjx^n^9T`*vyDh5EE13`9Yg6!_? zg{m?NuGHV%qlNNd()$Z_h=O_JdhJj`cIOhZyN?&D7zF`#KOd)D?8ui_rrupb6y#~p zZ$ACun?HV&>ekr02SG@G1I|+nH2r=g(5`TJXNv4DD6;X%W3sSmWQR)s1>z%8H?t(A-?!L8WUQz1K?ATqfW8&%C149r&?3b4qu?kB!Po z&(!NgCGcZ+=Ev@W9~;%dGxa)231vWcCQI*vEgMzQGXqThc*ASak@Xdx8CFlg#r@5X z-~9OJk1Ocod9LVj2Ws`6aGqkM8MoDwtSI^=f>B>QI{RgQe3&+jIP&LlrC`TKWpUb& zRK;mSV8-rDDBT4!HmYI>Bz1Ax5ZJLhvt##cFVw{l$f`aPaf`lu`OeM`_7eS zo8NwlUU`RffmXdUEp`{Q*nOqNW<|j(Gc9%(wAlSwT5NiJT+;}&*qv#yyP(DH&(LDC zs<5UJXt6ufVs}A{-7jddNnKpi2(;Lp*`&Lm#qQ70Vw0-4rZJ;4_7kEcX2A~Z*s?Tff&0pF?JWk*nK6&Wo+CU-EGIkCIo z#KuP#5wNaP=D>*EnMk?|Mr>4u2w2zYa$v;n%!u6uBX-NnsmZ!dnI&2%4>F= zeT;%Ta14y!ynX$WI#>Ph%QE+Aa?!b%PnNGS3UTjo`D7Z3yci_eD z%!}OxFE*+wqu|Q;eecUJ>hfSx5M`q}M1kJOjyu%i+_`S-E|{-T6{8?*Z;lWJxg+~4 zws&?|Jqfp%hbV|RwcT-QU~%tEN!$fj_B~e0Flcw2nz^yN;Ks&BGYrDx-;NIa(vQH5 z-I-9j3ubIomct;Zdb|4R-&KYANoL0Gf*BiCRbdd+&9ED?qlNNlQcz{1x*P^A?mT{U zhER}m=en`GpuR>`2!o)jf2_e+bmS{Gd3M<3(Sb1d>x>B69TW!+_g2`m7-#mrhrk^a zXJYIwh_Ug}MF?Eaita#*-I-0g3tDVch7h=(72SaryE83zYkQ%p41w!e(f7XmqArgl z+Fz(c2=r?v2o*VZE*!gcyimmu2%xxs3;}lJ%j-RE4LdycAO!yQ`yW63OSlx*U*?XB z1BZJXOj-;xI`2_%$Hkc%y9;V;d~^{7^O^_(F?MG@=`M(|Q5m9OUK2qe#_mjv-32i= zsw$&kUK4=^3uRLFE|{`W9ikwpYN2OgD9OcRcR_!Rsu%?U7q<}Hxg+-FCjhtg5C!`d z1!+EX2giZNy)!j&7lhgOSgFI{4vsTHb{7QM_~;@G?mL}<9=kKEbQkp4s0?8c>9HTz zYXUuXXL{@|=&?~%83sY!2tA7y%A-lamyPNW2J6a13>9Q|t{}S$3T#xxFbJEf>*Hz$ zJEC6^1|JUs>N61r|M<=K|B@y|cW4}#+zNVP!I*sylsX2k&{#7=Rttt~d~^{5dQAm^ zAFG*Gss%qbDnktDEfr|s$7<%s>eFASDq}!zsX(7-p^?>%7wQlLdP@ZwipXj%BC8b* z*7UP6ptn>|bmYs=0qXPd9H6#V$3RR3{SJ%+ms=Yw%3iGdw$e~j(qu^vG$L9#@gjGfsj(d z6(Vb3cWb69YC)lW50^R;t`J!>WmXHyY~L1T;tF{nAOZP)q*e^l_3%$X8rid z0%2A&VOINip{k68h+Er7b^Iz&Q%t@C3fgetO{tH^4X7pfQuA9eL7bPF9> zUl9o(w~lpmM8Z26_=mVu)Ym-@LN**QYBApQ`v!7f_c+MoOTn0pk1pcidTWga&a7t6 ztQMTvs0?v%y|L!KC%=5MoZ<@tZB$jp!S&V}?a@McI4M}MQ61u7-MDQUh>n_BvRbfY zqbkNhfd2hs9Izu_zJaV`hB)8`GRlPbyIeuC25z@bShN^w#(n>|-$8O_%xb}yjgKyZ zK(EuH5#}nHK&=IVHY!69=yh5YigIeMAgcu@HmWLvK(EuHKz7v3lhuMJ8`U8Q0&ta& z&Jb9#npv`1uw_Q=%E>DKn?Ef*2c>bxITnh?`;l{6!Htc|5Czw3ax{<- zHFITE+6z@>6kM;#QHd7HgNgJP>JSC}Iw1;dSno-xD@;*Vnxed2FkH;k#~rRp zNK2Wvs0Eu=*JtJ^cet9_vs$ocMb#TMII6REE*{4p&1NS@-LDn{U7W z-GBbk!{C4XISKD3fQkAkRj1IT+@14~8(JWa_LI z)Y+&C!7!hDFyxNtm-F3JdkBWacf(y#{vvnO8ra^N>5E#hYE|!4w|PgcnMJDwi#9&G zh=4n44YfKo^S8Ai)kbBAfIDgp^<*{IlhuMG8&#DNa7V2gEtCh6f;b!1Ap-8GHPB`? z(`L1x%|=y>fPQ5!u_OBBs8s{i&CoZ0y3Vv?Y@iXj#l zvzCdbRxoCxGWfsVDu!5K%vxs5TEUo&s!IRYTg4CyWjZahwXLAgMs@K2u%o*5qpIi( zE2~;BRMG#h+nhy5_7@My_IzACv6eV5zxnhdMrFAoMGM?+Yj7PcdVOCuk>?%)mLF{| z9?cMtYbhrSd|AshQ!DtgQCa1eaxLd%fir8FGi$BAP?!BuuBDu;MGNJTr1cl7;Foee zj$3r(%Q-04X7I~2RXAIY|MUZnu1deV=EsC&9VRV?nsz6l$Q8m_rpsDEmyM4uT=NRy zED&Zb6K1U-%tmE-be1cGvp|-$%rUisEE`poQPA(Mxq`Z!)C7SXLta||D@uZ-~#zz+ca0QJP2(p$5vQ`jeqq5Q~uN#~e2(p%Wr8e3Nb@0mT=BABk zp*)U^{z4VKa@{uGi;jH7lUeIIZy4Prd9&4E%YXv>lK1+|4YfWAY^jORESS#qU_L3ee*SfqG=&_brrB={m z?X&b)xt3S5K##RdkF|mxYoDjb23_4k2;`1@1wGaRJ=Ov}_ALay|NVF0{`SYnj$L=; z7}&9v*|AozW9>8S*mXyanH_5dJJw#XW7i!y26n7vcB~cbSoc!$6CRT zwU_MJbw`dfS}2bt1v}P0%Z^>wBES~dv6k7fRwV@JN6 zaAJWMYk~ds?*D%im(SN7p9Ws6Ets&$1-ll3RS||@D1uZtJLlj(Z zQ?*b<)-oO23XW`4#VA;}E47P`=vPF+N2ZAdzSnyc{M|Qy{9m8SShxe@z~Z(I!xrPs zy3F)-svYc7LI&jD`D#>W&u5 zL&_d6)FBq`8>*p{tYt>F?fF6#W8r$OYSED|FRo9~)I63WBasz^3TPmseLZ9U%%dM#10y z>8E@UW8jXC19RJQ8B8lkvhRUX$G{yOXG*LUl-T&_A_ng0IFMp3lVYtP#YSa_fjc@5 zgjmZwQY#3tQB@fOcXX`LLU|}DNU>2JV&IOBLoHd$WNa%KvQZUdAfRIjUlAR#FWxKeQ~ zaAPe~O0D3=MrEaQUeAtN;Ky3#$C`~7>foH$v!iCwLU}l``9c+)^Llo)=*U-0Q|!Yu zWj;@%b5_%oJ8=ETuAUDliUn)--G6J>yaU(FlC^>*8y{V`=Jl!^3mjPkwY1>KMr9bH zuUF+*;K*9$$XdaXjjGBhxL%cGAIo&kCsC%~1)o!gC|K7a+M+YGtg5|G#VA;p<(sM_ zUp!6mwj)GAnx_2yA3i1jzk}6}RBnHg<(I-3^K+2Y{(l3j^GPh(cfsc#UHHFVhUQ;Qx9VmVfTaFRE5nwO*(y{a-Ib^Ur;m zGXnIvM!-jk?0gbM_FeEfWjO-$xkf;1LDk5r#tT(d1n6^(fEF#32a+~lsLK(c&ou&C z7)DwiMw+}(g$U5+8UgIc`icnHA0wdmA_BhsE-qPWzsEpGd>sZY#+Y`m_o)3I19?no z`r^?=4D@>p>|nl}%}9_<$`Awn9s^-o(sMTN&kI#$4D@>pL<{Aiq_-F95Ci=h13e5R zJr5+kzfi>(xUr0@j*Kslfj&bFBs$waxJwqtrFCATpoR1|VA5io>32q(&TAC(Jg#(k z@#rE7ZdBu6zRSE89Aek@j@A5U|nNigz3r1S$)hGs>&Ex*BBVlLU||| z@Gpbc`x#~>Gmjp# zzfcFa*Q?vlFm}v5cFgfY72RI1Lq9w6@59AE{o5Zt{ra!I`SF|Ye)yMPA1D6PU-b3P zW_p|5eDiNV{Q1XU|K{88|K+<+NAT;v|MQREefzz)8_)Y%^+5vv`M2jI|M$K>+}!;A zpTGO=r@zj-_;3I2hu?kr^*{gV)6b9i<(2;TA3y#6SI>D>`HNpYzx?@&CE_vr`+t`m zaP;;+-~S@(XOAMv+FN}~Hg%Is0}!?fR)CdpjE*WbJwI zP21Dj16gkavbV~@Nj957CcQznI^Sh?zRO$f`Xqbf>_=I9OJzyc2HvIh*&!QKAe&Pm z6ZmOsOVE$@cI$nTy%qLLvNr-*l=U~JRFbuYessoV>tmxIeZo&$7x-!GOZhHuDK*L7 zirFOD+ul=@`RIjr84Z5g#(3~u#)R*-ArEyZ{otn)I#Kr1*q&sCZ_GZSca8}ibJAbt z+ugfKwkCCK`p|rv8kU72U$m6?Vdv?WV2C+bm~~0I`*Ir9n@i% z!};4GH+D~i(9z!R!b`FNn|B`+sY4cZtVJCgV@_`zUmQ+iEOF1pxY7N`0$Im+(EC8_ z_dbm})hhgLCEn)3vin))0ez^p5u%qeJhQm`nAaE=Nl;!<@hWv@)J#4YBVt zDa_&e9Mn4}eR2wNw@=$Khx6$R@^qg{Kb?l0>|TmFTo+=EE}g#XzzF^De2IQ|zC=Hy z@MkIfSrl`)UgS%6HH>SX;pyX^FVPRrm*|I2OVE!c^m|YH=*QZ~Zw{F_{_Tgcu-k)v z?2f$EcQGdJiM-XfFh2HTeC*9}a=%@_m1J+{{G&`C%qM+T!m(31ckDjwq8~ajPwYx; z+C8tLZ_2r&4<&+kwvM@D_h~V7*re|o=YQSSrru3IHQm%OUB?D z#rWyYyCgHrxyIxgg}(~MlHs`#@8VdpL$;Cg#?;B@8T~~ba}^uvc2^g}q73{m7fAHk6G#(I$RhUZ4~V|C;_?*($+@Z5-gcy2^L)<(`7OOf-& zGUU9mANr&ZP3VW`M)YG3<9hu+=zbY2Cg_YtkDmBJJl3r_He9o%!z(D=ES===0x9&Yi^^+jfWST z-}x}~7Gw>+dv>oUWCPfAK3q4Oo*SuSH|o$v9R_SL+XHMmJvTy!=SJx8+z1_Q4(gCe z9cxm@7V1!;4g)rw{ech715P39SdZ`sgul#U?R9!?q>e?Kdv2r-rOmt1=4Y}3S*OiU z5`}Ei=0j+6A5f`-^Xxgeem{%cIDgvrOtMCs`$vV2$+6@t(Nc%d=AO11WE=TyPL3th zhgiIe4CK7CG>m?TY(8(%Ut}ZaO;O~$DTbWqXq7&+8gkxT9XZdD0dn44#aOZya^CdZ zh<+@tPtL{l$+@{cIXBlq{EH&zO;2U$hv!E0V+(TLF**9-xe@)?ik#;&VC1~%xe@(v zsDXZHN6wo%kn?<6hnzQ+YiaJL^i$7`=!YtD-c;ilW?ZYEo&wMh>zMOTpE95yHnHaB z(^Kpp`78`LVA|$bXNGk+c^+T`IXjb(b@;9nxltajw~OaS>M;1OvR6LH_M{H(JvkBr4iHZt(BZieI(o4tS%@stN0qws?41vyW) zA?Jz1Wc0&xBl_XF5&h7CoF~eCZ1LQPekj*5MK^MuPp{~wYRGxw&>sEp+=zY{_nE{7 z{nRFMo_KCVKWuXh^VdT^%&;D|o(FUObr>*^b?is2v!V#u1P)kdB!_H)&$WuZ%Jpz9 z%|jKwyNcYnJU8N$HR>>of6H?tba-xr4$qCy;kgkyJU3Fu>eR72btwI16n;>wsrqO|n|p4A4$qCy z;kl7IxCXTj@PTa8=2L0&X|%aKw7GDey@Y#wtH_PZb0c*KZSF~hIyjar;X0;&0ovSC z9%6rS9doT>ELoeru@pIPEkn*b%dvRgZuFPkk@J@4M)b|o8^)n6^r6lDnYFnF<;Wg6 zZ|!0%@!W`hXhY8P&w`w{JU5~ro|4fI7393-xe@))P5)Cx&Rc58d1u)h{jf%#H16>& z<2t6JLFBw;i+<|45&bY_&ND;K+YdPyXQ|#G>&SWgAqQih6+6fT`E5VsA$u<{=iiTF zTytcKJ;U7|tdX7V1@yyVDEiR`_7Q!?3T&_&*V1<5y8JG3LAz8XDYx3XDbFe207~6b0c(|%{Isuea&+tb!ev!qhC#O7k0sW z-JTnv!*e5acy6Q)p})++4~jKapK;OV(`a+gjnE)PXb5A(J*2^6IyPFzQg+ zTsY6(i+g;#$c=k-+T15y(6PwpawJZhFRo+mMGnK^p{O;sAnVOyzRLWng?@N$L_duD7k#+Lrw`XL_2Ic4J!}ogCUV|c7TAz2?7KG=r61AgJMn97SHFI=SJ!f+T3#^b#M*J7Wps! zzEFiXmcfp%9QJvu7P8T zlEY&5Am=$OL(cPbgq&wSaNzwsfbo7t&bt|TeP-k?9O^3iW>|x2Z}fA>FqX8pQ)iIj z>~(u%>_LX}Gwp4s1hSoTUVEFhLS_s7XwO1F8qQ6$b7&s@XyCuJa}XT;XjsQ==P)w* z;nREc!*e70!TKBR9Q;H-&LK+3a4x?c6QLiT8_^HXjp#?;4gKgid(+N=CiG)~Lv>0| zboApKT7hf~^uyf>{WymjAX|g)g0-}Ei0jb7+}O^N2i|$2&O|%pP<$&N{_uY8Le#7D z(+SRdJES(~@Z1O;o*SXVb0c(kZln%yaoQoaP>0gj1hq=qAum9O=SJvQ;4ZYcjcmv! zeduhkLbe8VZ2HS8{D5n!?Q9G|$8NN_54+H@2W`G5ZN7yz--|Z))JPpln{T7d^`XtR z(dNvJ?JU4Rhv!D>ShTqoV~Hwlu11?1I8^Nb8jM3$j3u_{8$MY1<;KMQhR>x!J$x?#L( za4xl-(hlgy0KfQ{660EP7=?cPbk|^%P1Lq=S;JV@W?$&X z91HI*l)bTniHw`*G zH$n%wI4;AP!c*!B<6k3gJhS4#cFJ*W8U1C08|t#g@#<`#Lk3>%kumnS6nYn9p~#o5 z$d|3im#xT`t;m->IPYjzoUZZ5+aJD17E zHz@FQZ=2uh1Q%pjGe6UV%w2F<<2&_m@B$)oukIdMPYiXVJ|6DeKAzUVGNBrg} ziet{+9CJ4Fmd{u>+9~Qwwa&Au2a+%!>EOHQpik;Fwp;W`U9^X8jya06M(vc2>6FnP z++#k_iuuR}^O2!;%#raso6t`kI-|d~>AT!_ek-w>{bf84@`8KXU^}iwjtBd6E}NJ; zj)xd_JlJn+=PFCK15fpog&k}MzO6%8@NL^Ehc_vMzc~DzY{zw0PjAR?qj7CyG;mj4 z2JY%9Zwu^vj?bXK9W@nQ))D(YI}o;;i|qts=kUQ3?{|u*L8isKaLzvl=lo+3pAXh2 zJj)F9-GQ2br%D#)G-Gf)7-Q3ShhlslgLCxp(|spN);fMW!PPiRBed_F^tDNRIVR3M zxoq=W%_3%I5i|18zS8Jx!nH&H%)nb`iHE-xz6lsgRm9OU%&$)EC-h@Cj;FiR9((Yeeaeq_*{Fx? zGQoV!r`bjw8~AN(Vj-6qpNDfmZRkULXybUV+;2SFYKSd=6{C#bKo?`$Aq2jka-DT( zk!!8UwbnRZS&@%?9?>b|*l9(MGVTQq<6hu_LVQ1PNZYykHS0YWISOPrkKN9-Vv{oX z(5XYk--7qhP8}-hMIEX(S!<(B*4j8S_~hhSD3>*i?WZ;se>*Uq&W5uOE~AYca`O8% z+GsW{bbxp5GTb-egFQIlF5{ZpJOzg#D{RyY8}-6QtXI{FdR1+*mSgj*PaT76L8o4o zQHD9Sr(~=FoMXMzfwRbG+n}@EqJ0PIZJr8cwC^BqWKPsGcUhxe)>3xaz!>JU4f-zY zMIIT}=H>)1?aYdS#plF%rZxrq#3N(hq;Y%^Vq$+~U@(_qf5E3xgL-jJ)eNe9<|IWp|HlL02{m!9&${2%-IQi7r!uMN63@+3Mb{XpKADL3GDxYTxA1c;2 zChs?J*i{plI&UMNF4azY0 zaSe<8;NGk};Pko-=UrUZ5ts7NzVdLt`;^9=lquWcuBfwh4F3~P(|jKH#f6;wCXM?G z(zw4Mjr$AIxW8~9;)aa4$Fn7HkIR(pxHc>W7tvDyzg5S%F_)1CC7nDd>EH;r19jO> z8rzYB;j&4+d-8dO-MV7`=+qvAAMj43^X2*NN2i~TG5I{seWaNC$RKy-l&NI9UFcQD z$Kd+7Osh(zbx|CWT9rO%eZHF zuGc`UdeKD5V^^09LIJWbggUf{9&$vD= zKINib?lXyTpJ_c@A72mmo!5h!!7f9c6PKaRiOW!%z-6e9d9GJ8wljQ})i_sPtWD}N z&XpJMv}lWWTC`JtZ9;~7@y_*c!gf5Hv3O@dJ6Xlv$tw0vmXLS2e8RzY!q^woW^RYN zfY|cElkLc@Sgc{{vd-_f$X8wqHHln?nndSjHjWW%bBtKZF=C<4`>BG#F=9845xevI z?XlQy(swua-q*$%W0&pC-{M^0xgrwt$)yi{TpPz1E&RUVNBAh-*luymR-EfSEcniL zJd5Wueva9OT8S=09buQD#{Qx2a?CjgVj)|!n{i!g8P}zJYKC04AL6KeZefIs>r(sS zy3~GfrrKqw#pN=NIs3sm$a5_y<{P__U$-0ib*CoVhKyKuH=Kt(H0j0PqV9~#P%FY^ zs5^76GDUoB-mT~|)SYn|*LQa(KYMqs@A~Kh+;fgX;hj78o%bPcL55nzF4ID)T-)G_k8TU0jbu*5Z zavWc%>3L+->q%fx#&L2t#@6PUA0JKWR~|@gC!NoeMZL_I=hz9KryNf=IVawX`Hgoz zyNr8~Te&CaGOTHBo%BCl%*nd>&Wif1F0d3iaSh&-dR?~Jj(Zb_ z#=~}uBbQ0h&e)Eecb6&KF;}<@*wkm}z=$qeY}Xpwq4wfATJ^9UF^S7)597L&%V-aq zw1-XF!-$DpMtd0d=v^j7JKDoG?P09(ajw#3J1y*Cg*`0Wqdz>ac4WeKI2YaDC=!$z z+hH%Ozul?~8R}>Ex0^B{1ONW*h#lL>!*-}q+aHd9{o(l6AFi|Zhxb?Xw@SE>X=ghv z>|upHjP~Gpy0;^RMLXJ~HQJ*!+M{*agSBn?8;hPY+M`X{qfIH=(H^|Rqd%+%(BD>7 zDWg5wrajuGJ(|)Uyl43w-7M^3g*}Y+=nw7TX^`z2?a>?U(L3$YJMD1}{81)FJKCd9 z+M`d}qYLfPh4$!+_UMcD=$rQFoA&5Rdvu*eyTTq;*u!X#@z5UQp*=>UJ$P=SKfHtN z$fRgTdypG&WV8p*TpStgF@*NudPF}LEwkOCJ;tUzc!uN1Xpf<^$I!waR@lR6kNMCZ z^PxRvqdjJmq8;rqJMA$$?J)=KF$e82C+#sO?JF-WL}t;B_K-z; z$f7-D(;nP=>TegZQC8T)3VT>#52HQSLwl@;_E?SfSdI2ro%Y~);{JBQ6=k%?nzYBc z7>Y95V+rlCg!WjA_E?MdSey1(oA%({^G7B{yTTq;*u!X#v!Oy6?ZNwc``hI(kagN) zciLkQ+GCGdw4*(E$KjFD9$RRSEwsm8w8vhw$KJFD?}a)t+G8v2v9+*=74|UNgPiCi zqdm0I9@=OR?X-vXS+t`)$gw^$+CwMpp_BGdp*>V+4_&l}E-Bj49=d4{-L!`)?V(!O z!wP#8_}mJ7ZUsKK0-sxf&#l1cR^W3h@VOQE+zNbd1wOX|pId>?t-$A2;BzbRxfS@_ z3Vdz_KDPp&TY=B5z~@GM-X7xfQ|qs2XKY7&eu}%Y9r5`ovdVVE=clkK+Yz6iC557$ zu^sXGDeB2~#OJ4wCfgC8pZbJsM|^&YNV1(3_OQYp#OG(3S}3DE$eTMd+M^MlpQ3{yWQ}~VTh|f>4HMS!@KLyT;c7;8xum|z^Tk$N) zXpc^Oeu_k~9r5{DA}iX_9-a9795-b<;`7G)?#@aO?ZFxlr*szW(TUH`vL4$JpEsWI z>~95NC@bt?g*}MRPXQC5jP~G}(Ib#590GT@+xJt$0j~Mq))aZK0iduq8;tAiO&zAknM=i4>^zR zh|e22PyLY4*pB%85W3io`23Kg*pB%85R%x=3VRTrAA-(98SSCO=Wm1+%4iQIK6e@I zp~UAdqdk=P+-0?t-$A2;BzbRxfS@_3Vdz_KDPp&TY=B5z~@%rb1U$<75Ll=d~O9kw*sGA zfzNpspdXTmP^N50e110l*^c=9Y(}#k@%h;#E!r8|5ucyUF}5Qj`;j6TC$xL_8>k#i&a7y?a_$O&*B5y5uYDWT(qM-8u9r7Lu^NUekSQ` zM|^%Jk8DSLekL_+M|^&gZPAYQXvF7d@MJqH>_L2ff<`E#Jv#CE`3OZj+M^Snciv;{ zBI0wG(H@=n+-0;!Cq8!>?a_(PT{eq$v_~gCcNy)`iO*eD*ux5Y5TBpxyo53-+R+|^ z_}pc*#~?m;8SOEM&s|1)@NVcMqdf-kxyxqJj`kSD=Psi?2JyMeXpcdBey-bQJ1gvA zg*}MRJvwNQNqpWX@wv-rk4b!9)JJz2@wv-rk4b#)vRSmFJ$N?g$Y_sAeC{&ZV-lZt z-kat!;`2jkE7}$Iu)-e1=bnvd4Zk zk41d$GTMXpz8)Fv!86}SMtiUZ-H}Prj`mo@=Psi?c!vDQ3VT>#58`u2TeQa}K0mZl zwj(}2wf)(S_}pc*$0j~^8SSx&&rcaDwj(}2RM?^&?Xii^T}FFs;&YeL9-H|5+&#c{ zR@j61{LptF%4X4y_E6$;m(d?t-$A2;BzbR zxfS@_3Vdz_KDPp&TY=B5z~@%rb1U$<75LnU&wa)Kd$??~9r5{ih|kAEe10hOMLT0V z;`71tjV>cTAFQKvU{7Z|;`4LQ1=|syAKE|L5uXp%WpWwuxyuTBSYZ$1^U;XUM+R+}J_r8ST-D&s|1)@XqlgE9_x~J*=FmOycvw`t3(X zdrabUm(d=R_}pc)Xh(ZY;`1?y&(C#yY)5=PCh_^0#OGrYpP!>-MLXJK5}&)Qu!j}) zAU^k59ql2+=R=6kT}FEd@%gz&r)Woe2=TegXb&MicNy&=#OLP@9=0PsKS%b8cC?2O zpSz6q5aRQ}T6JfcwXg^AxuYoBV-cU9V}@);eC{&ZV-cUbjP_W>=Psi?7V-I5#OIzZ zX^%yG?lRhA5udw^_E^N{E~7mb@wv+idstx);`4Ky^Py}O?P!lpeC{&ZV-ugdjP_vd zog*u>}OJ|(szK0jBPvK{fc%V>{He17g?VmmABVTC=2&wXT~J(T!- z@D7C|qdk=P+-0#OIE5X%E))JTls&5udw^_F$duQynwc9CaDz zjv^ce5=AIm`#emiAShWi#B{3_e6 zhwX|z8=p4iI)>*O=v=$)+;Wy{wfE&?1aug&q-TnJ&xOlS3%Kt-bFE32asIc@Lvo>$a0@Tm%HY0|{dAtv@Z)MD!>zVR**7I2*!<|ECl_uAtbs5)lw4+{g z_o)TOFl9}0mks__ra~|8M1Q-c8htCipDxtRa~W~1o+6D|rl`x=)o@SY*@{6N`IG^6 zJG9pgS#Ok~E@HQH+b?7s?`_~dG?(F?hHk~$h))j|+i{KJOd0YwIM-wvWE9lHbkz=IXd^+&ei0(uIYF? zLz86CNM6!)Kxvlb4S!&i5`-VZr@nufU_lb-tk3jFDPtIkCtrM!yp}0GE$iwH!!{>=R0%WZFHV%~z zIvflsWE}rw;@+jR47{LMuwF7`b@pRT{&wS@v$KnXG22H(_LucR#^T-3E*tQJb8pas z40{u2iMFAgXTAI`=Ngj^8SWk!OIjhr`u$i7_mjA+PxNDV#JNxPkW(Bl@SP1cy3cYa z^7K9{XIVCJZ_8Q6RLV5paWhV>d$beW6EaTi_iT@ICF_K&BYyWOJPlc&=!fCnmT_uo z=Wn17?yfmIfqCxuwiG!b(_D9YoLA|PtqvUncUid%cf2}~Y{+HGdyR(j&cCxf$@g2p zM=k?49qPal?c5R2PH}(KS&Gc_;%M(6X$xhTk^uJm%YJU&wIR$2{n-W!Wg+9r-CWp&(km7Z#~qpy5Rj5?!KMp0;C2R?hl=(kU#XQHayRe_g%Id-o~Y*-tk<#iw`e(ona2v<3812a;}&M5aPET zm~$R}6W(QjAK_M;hISKcDCcyP;{AN`jrUuaJI-_66P~v*=RXyL5vzmuxw;IwcAf-` z?_$6U^Xxqh$grm6vs2t<>N4!P&e?G{`8-apkXgRZYr4@5?IzYr=TU-o0)ELn)F^|@ z*lsnpBWJ?VTWffit$B_6u(a~p!yEj?^L+fn^9=WXxeWKUo!hsNqkQ(9@7$edc)@S| zGv{|c*IQA>_;sv{{yNrOY^SjAxicH@B1#<#`)_Bp7&elP`^y|Lfv0e84aa;#40n#t zb9ZolzjcbhLWVV?d9LT2kahU|8n{R7RFZno&K(eXC-@+93GU6E%kx6^gLN*bgG})4 z*V)*BOyNV@Cz%tnf$!%bvnU%G_nazO$TR0kt~}=KGjoD$V7{@Z@p;ntJi%S@F2mi` zbMwAbmnq_RZ_ZV=&xi7NKHCs@7X!!Ihmr^RqqrB!WgB__EdS;A(>62CbJ@x`?^Jn* z?`j9`nL0S$>%ji>)Co?J%LaVyT&DybyodKxM&ozkxytEydf;8oVoR2>9g=kB*5!#v`gW`EGmC+T?JKz@_6+aZw6K^-#r z+m-j!&yC*3c9wIQ6nA}`8$cW0#V482ab}~CVGmbMX2o}zg};#Ber~i7d;@8Go?vX3 zbKeBpVZF&^i{Df*e{mV+X5wFu&s(^s&}Ds~zYFW4ho#@~E^7_+!zUs5E@L$9ewu zzy-FmXXAO~i@L0cnM3M;3~O^PTl7C4-0_`x-<`vm2e$N~IL}#K)-iTA?or99ao!-q z`m@V$_xFKT9eNK@0Wz%NxeWViE*tpv?G$Z=4EL40416h<*@JgJ1=ApF>{|y1!)1f^ zIE7dsla2Q~>^#V{&_SO(b)xaSfqg4EwVo-%x`mv2&9K`52Th8a%Pzxy{E;CawfSHk z(I(baSO2jvv8{@_)2T#35y(fYp^w;OHl=a2mPU_vo*tA#C4tIph zx%3&|iaa+tbxrY|6?b8~3};Z~)Es5IiMh(D8;WnBi{qMZj?X?VK|c)Z*$2fJ?Qs55 zPQ6Xo(k91U6Z*4lj`ybYXJcOIMcz8gLlZKr0m!+yPawlN>mxJ%b{Fjw{&Fsi$=|Q2 z+bE|-qd^7?D{lqsA)7@zQMSW6mlX95&&Y(l--(Ik6mGkxg)ks%$c=A@+#$o-znp`(Y$wWg*awqy=#1}DeCJtw=h=#O*mH0hII}LB zg7=%Nu^l*?F4LkN))eH_WW%@j?2Y~k@xs}EV>_I^J{8%3r@Ji74?1ha9~s8PzQ9j( zSwk*!XkWC$T9p)a!A^C4`pe>ctuN(xunZXSgaX>_#&6F(Na@`3a@l13ZZW*`Ui9(3 zi+1+ld5W`I2X!-69jl?gI{2-0ax76P+AWTWTEw8L;#(PNPskzfLx=UE-I(|;R>UCB z;<=3Y=#4NBnPE&Ehr|LI=XK+hDuQfuJ`enHm*E_N9MU`6ZLFmoGJF0m<6P)P8DiRp zY~+-2zy@R!^YJ&bIAn~$!Mm#ua|XF$aPP@wt!RhyLN4R{-k}xdSEsHE>~T&_LAI5@ zag$3M@5(93iFE(5`%twoM^o`l*8?(_j zChs_u0~et8T+jsBD%yb)BZp8(9XS8yN$X+XP8Da!Q0u^DvuFpd)f@c<@7#-b?%daK zOCqM{;9PXN8?YVt7V<`5gRFSx0WPe|^r2qv51umM`0eCg%$(dGJR~pZm|UYh*R|oB z&Q-K4{CP5`9AXvT#ql71dyqV2qiDxDlD{&>i0M;3*u(K4f6F=2TwK5R5w@`%^Wa?I zfV&JeIb0_ErfU`LIDht;0DWU&?_K6@jICYx^Dbg=Phq=a+}Pl-xJ)@-ZPbxF$e!)A z@MrCeOC7*2Qzyr4CGMV{2hk5L{8T;%{4`evMC5H^bcB8W$&f&`0K<|((tofeJ-U*o&?Z9i1vl)nYY2dDkur7qWZSFvZ zI#g$Ozi5Z^GjbN!H)MwS)mhBNyPO47$VSnQ{(Kh6@Ghs=J!JG}De|Cn?ol0pj_2{- zS28Xwp>C+lP_seKk}AHl7-MyjyCADER##^~)?lo9xWR{b zR^MgdS-MP%cHo(xTQiVr&lV~Au{&dWPkz&lx;-viMZ3*!zm-0;aW>=Jpo+X8iZl49 z)DWaM)jA<*rvvHqOc&7EZB)_w5+QYPH$GzG0 zphkepxc0vu;@ZW!E-stOc2cz44|Q;lWj)+uS*%I!vWE4w)xgtt*(lm^efJ#Acp&4t z<7(iFy9~7weK;t-b8kgE?y;;>ITSMPvG_=b@#-Ak=WmPe+_}EH2I?2PtYO`DoyA

    ax3x>yC$##diG8`{5qTW}Qlxajv%?)V4X%i&)t0VLRTr;WE_0aM{GZ%Wi^kcb|*W zAwyjpmubqxz8}vp-w?*EP7JQmhP7Ck6c_u_Rc^>{%IG*mpH}+b5mtC~uo}Buijd#(95Lmie=Wfqvp3OEsBtOhDiZ2g!ryN8qifNQc+19vwL=>X znB7h#VaRYNgUfjK+ITPC*-D_@25QE+j5xq1YAL%6_4QoVi*|$YF;QFdY-=z+CUJoI zbeu9`L^~(OAw&HamvOJiWYDjQGZ!Yfi%G1&h{ik3T!y;8r>YvpQ}-au>uhz#YJm~W zF(TWohkAFT4#gbK7U$IFQ!d!eF(Ud=>?7Ld{+8{@er%rOvw~}C8~5m()0|iXHQq;c zw#N9K6*UW8HaPAo`QE0BV~KJP<6QH@cI5P)BMo>LBd$GA4e#P14O<%bihP7E+7;i~ zIH&e3$T8Ni=DW_-L;$(2#+fx89ZkAX|Apr@ZK z_nWx;cD+?XgKX39rxxvs?=0X>ueTGnkPZ5p6#gvOcUf<{hLGV5(RxEUkeTA0*TeoU z)SY(O;J071XeacmwKxu~E!3-w^ZoFfZrs!5vRv$p?0jUbpyv{?mW@ i)t`R+=8r%A?>~O}{jdC${FD9aKm3RP^7nu9tN$NbQzMrE diff --git a/doc/spm.shtml b/doc/spm.shtml deleted file mode 100644 index a63ad396f..000000000 --- a/doc/spm.shtml +++ /dev/null @@ -1,10202 +0,0 @@ - - - - - - CUPS Software Programmers Manual - - - -

    Preface

    - -

    This software programmers manual provides software -programming information for the Common UNIX Printing System -("CUPS") Version 1.2.0. - - - - -

    Document Overview

    - -

    This software programmers manual is organized into the following sections: - -

    - -

    Notation Conventions

    - -

    Various font and syntax conventions are used in this guide. Examples and -their meanings and uses are explained below: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Example   Description
     
    lpstat
    - lpstat(1)
       The names of commands; the first mention of a command or - function in a chapter is followed by a manual page section - number.
     
    /var
    - /usr/share/cups/data/testprint.ps
       File and directory names.
     
    Request ID is Printer-123   Screen output.
     
    lp -d printer filename ENTER   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are written using the period (.) to indicate - the decimal point.
    - - -

    Abbreviations

    - -The following abbreviations are used throughout this manual: - -
      -
      - -
      kb -
      Kilobytes, or 1024 bytes
        - -
      Mb -
      Megabytes, or 1048576 bytes
        - -
      Gb -
      Gigabytes, or 1073741824 bytes
        - -
      -
    - -

    Other References

    - -
      -
      - -
      CUPS Software Administrators Manual - -
      An administration guide for the CUPS software.
        - -
      CUPS Software Users Manual - -
      An end-user guide for using the CUPS software.
        - -
      -
    - - - - - -

    2 - The CUPS API

    - -

    This chapter describes the CUPS Application Programmers Interface ("API"). - -

    The CUPS API Library

    - -

    The CUPS library provides a whole collection of interfaces needed to -support the internal needs of the CUPS software as well as the needs of -applications, filters, printer drivers, and backends. - -

    Unlike the rest of CUPS, the CUPS API library is provided under the -GNU Library General Public License. This means that you can use the -CUPS API library in both proprietary and open-source programs. - -

    Programs that use the CUPS API library typically will include the -<cups/cups.h> header file: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -jobid = cupsPrintFile("myprinter", "filename.ps", "title",
      -                      num_options, options);
      -
    - -

    Use the -lcups compiler option when linking to the CUPS API -library: - -

      -cc -o program program.c -lcups ENTER
      -
    - -

    Additional options and libraries may be required depending on the -operating system and the location of the CUPS API library. - -

    Detecting the CUPS API Library in GNU Autoconf

    - -

    GNU autoconf is a popular configuration tool used by many programs. -Add the following lines to your configure.in file to check -for the CUPS API library in your configuration script: - -

      -AC_CHECK_LIB(socket,socket,
      -if test "$uname" != "IRIX"; then
      -	LIBS="-lsocket $LIBS"
      -else
      -	echo "Not using -lsocket since you are running IRIX."
      -fi)
      -AC_CHECK_LIB(nsl,gethostbyaddr,
      -if test "$uname" != "IRIX"; then
      -	LIBS="-lnsl $LIBS"
      -else
      -	echo "Not using -lnsl since you are running IRIX."
      -fi)
      -
      -AC_CHECK_LIB(cups,httpConnect)
      -
    - -

    Printing Services

    - -

    The CUPS API library provides some basic printing services for applications -that need to print files. - -

    Include Files

    - -

    The include file used by all of these functions is -<cups/cups.h>: - -

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

    Printing a File

    - -

    The CUPS API provides two functions for printing files. The first is -cupsPrintFile which prints a single named file: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -
      -...
      -
      -jobid = cupsPrintFile("name", "filename", "title", 0, NULL);
      -
    - -

    The name string is the name of the printer or class to -print to. The filename string is the name of the file to -print. The title string is the name of the print job, e.g. -"Acme Word Document". - -

    The return value is a unique ID number for the print job or 0 if there -was an error. - -

    Printing Multiple Files

    - -

    The second printing function is cupsPrintFiles: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int        jobid;
      -int        num_files;
      -const char *files[100];
      -...
      -
      -jobid = cupsPrintFiles("name", num_files, files, "title", 0, NULL);
      -
    - -

    Instead of passing a filename string as with cupsPrintFile() -you pass a file count (num_files) and filename pointer array -(files) for each file that you want to print. - -

    As with cupsPrintFile() the return value is a unique ID for -the print job. - -

    Cancelling Jobs

    - -

    The cupsCancelJob() function cancels a queued print job: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -int status;
      -...
      -
      -status = cupsCancelJob("name", jobid);
      -
    - -

    The name string specifies the destination and is used -to determine the server to send the request to. The jobid -value is the integer returned from a previous cupsPrintFile() -or cupsPrintFiles() call. - -

    cupsCancelJob() returns 1 if the job was -successfully cancelled and 0 if there was an error. - -

    Getting the Available Printers and Classes

    - -

    The cupsGetDests() function can be used to get a list -of the available printers, classes, and instances that a user has defined: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int         num_dests;
      -cups_dest_t *dests;
      -
      -...
      -
      -num_dests = cupsGetDests(&dests);
      -
    - -

    Each destination is stored in a cups_dest_t structure which -defines the printer or class name, the instance name (if any), if it is the -default destination, and the default options the user has defined for the -destination: - -

      -typedef struct               /**** Destination ****/
      -{
      -  char          *name,       /* Printer or class name */
      -                *instance;   /* Local instance name or NULL */
      -  int           is_default;  /* Is this printer the default? */
      -  int           num_options; /* Number of options */
      -  cups_option_t *options;    /* Options */
      -} cups_dest_t;
      -
    - -

    The destinations are sorted by name and instance for your convenience. -Once you have the list of available destinations, you can lookup a specific -destination using the cupsGetDest() function: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int         num_dests;
      -cups_dest_t *dests;
      -cups_dest_t *mydest;
      -
      -...
      -
      -mydest = cupsGetDest("name", "instance", num_dests, dests);
      -
    - -

    The name string is the printer or class name. You can pass -a value of NULL to get the default destination. - -

    The instance string is the user-defined instance name. Pass -NULL to select the default instance, e.g. "name" instead of -"name/instance". - -

    Printing with Options

    - -

    All of the previous printing examples have passed 0 and -NULL for the last two arguments to the cupsPrintFile() -and cupsPrintFiles() functions. These last two arguments are the -number of options and a pointer to the option array: - -

      -int cupsPrintFile(const char *name, const char *filename, const char *title,
      -                  int num_options, cups_option_t *options);
      -int cupsPrintFiles(const char *name, int num_files, const char **files,
      -                   const char *title, int num_options,
      -		   cups_option_t *options);
      -
    - -

    The cups_option_t structure holds each option and its value. -These are converted as needed and passed to the CUPS server when printing a -file. - -

    The simplest way of handling options is to use the num_options -and options members of the cups_dest_t -structure described earlier: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int         jobid;
      -int         num_dests;
      -cups_dest_t *dests;
      -cups_dest_t *mydest;
      -
      -...
      -
      -mydest = cupsGetDest("name", "instance", num_dests, dests);
      -
      -jobid  = cupsPrintFile(mydest->name, "filename", "title",
      -                       mydest->num_options, mydest->options);
      -
    - -

    This effectively uses the options a user has previous selected without a -lot of code. - -

    Setting Printer Options

    - -

    Options can also be set by your program using the cupsAddOption() -function: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int           num_options;
      -cups_option_t *options;
      -
      -...
      -
      -num_options = 0;
      -options     = NULL;
      -
      -...
      -
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -num_options = cupsAddOption("name", "value", num_options, &options);
      -
    - -

    The name string is the name of the option, and the -value string is the value for that option. - -

    Each call to cupsAddOption() returns the new number of -options. Since adding two options with the same name overwrites the -first value with the second, do not assume that calling -cupsAddOptions() 20 times will result in 20 options. - -

    Call cupsFreeOptions once you are done using the options: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int           num_options;
      -cups_option_t *options;
      -
      -...
      -
      -cupsFreeOptions(num_options, options);
      -
    - -

    Getting Errors

    - -

    If any of the CUPS API printing functions returns an error, the reason for -that error can be found by calling cupsLastError() and -cupsErrorString(). cupsLastError() returns the -last IPP error code that was encountered. cupsErrorString() -converts the error code to a localized message string suitable for -presentation to the user: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -int jobid;
      -
      -...
      -
      -if (jobid == 0)
      -  puts(cupsErrorString(cupsLastError()));
      -
    - -

    Passwords and Authentication

    - -

    CUPS supports authentication of any request, including -submission of print jobs. The default mechanism for getting the -username and password is to use the login user and a password -from the console. - -

    To support other types of applications, in particular -Graphical User Interfaces ("GUIs"), the CUPS API provides -functions to set the default username and to register a callback -function that returns a password string. - -

    The cupsSetPasswordCB() -function is used to set a password callback in your program. Only one -function can be used at any time. - -

    The cupsSetUser() function sets -the current username for authentication. This function can be called by -your password callback function to change the current username as needed. - -

    The following example shows a simple password callback that gets a -username and password from the user: - -

      -#include <cups/cups.h>
      -
      -const char *
      -my_password_cb(const char *prompt)
      -{
      -  char	user[65];
      -
      -
      -  puts(prompt);
      -
      - /* Get a username from the user */
      -  printf("Username: ");
      -  if (fgets(user, sizeof(user), stdin) == NULL)
      -    return (NULL);
      -
      - /* Strip the newline from the string and set the user */
      -  user[strlen(user) - 1] = '\0';
      -
      -  cupsSetUser(user);
      -
      - /* Use getpass() to ask for the password... */
      -  return (getpass("Password: "));
      -}
      -
      -...
      -
      -cupsSetPasswordCB(my_password_cb);
      -
    - -

    Similarly, a GUI interface could display the prompt string in a -window with input fields for the username and password. The username -should probably default to the value of -cupsUser() to make things easier -on the user. - -

    PPD Services

    - -

    CUPS includes functions to access and manipulate PostScript Printer -Description ("PPD") files that are used with the printer drivers in CUPS. - -

    Each PPD file enumerates the available features provided by a -printer, including conflict information for specific options (e.g. -can't duplex output on envelopes.) - -

    Include Files

    - -

    Include the <cups/ppd.h> header file to use the PPD -functions: - -

      -#include <cups/ppd.h>
      -
    - -

    This header file is also included by the -<cups/cups.h> header file. - -

    Getting a PPD File for a Printer

    - -

    The cupsGetPPD() function retrieves the PPD file for the -named printer or class: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -const char *filename;
      -
      -filename = cupsGetPPD("name");
      -
    - -

    The name string is the name of the printer or class, including -the remote server name as appropriate (e.g. "printer@server".) - -

    The return value is a pointer to a filename in static storage; this value -is overwritten with each call to cupsGetPPD(). If the printer -or class does not exist, a NULL pointer will be returned. - -

    Loading a PPD File

    - -

    The ppdOpenFile() function "opens" a PPD file and loads it -into memory: - -

      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -ppd = ppdOpenFile("filename");
      -
    - -

    The filename string is the name of the file to load, such as -the value returned by the cupsGetPPD() function. - -

    The return value is a pointer to a structure describing the contents of the -PPD file or NULL if the PPD file could not be read. - -

    Freeing PPD File Information

    - -

    Once you are done using a PPD file, call the ppdClose() function -to free all memory that has been used: - -

      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -...
      -
      -ppdClose(ppd);
      -
    - -

    The PPD File Structure

    - -

    Each PPD file contains a number of capability attributes, printer options, -and conflict definitions. The page size options also include the physical -margins for the printer and the minimum and maximum sizes for the printer. -All of this information is stored in the ppd_file_t structure. - -

    Capabilities

    - -

    Each PPD file contains a number of informational attributes that -describe the capabilities of the printer. These are provided in the -ppd_file_t structure in the following members: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    accurate_screensint1 = supports accurate screens
    color_deviceint1 = color device
    colorspaceppd_cs_tDefault colorspace: PPD_CS_CMYK, PPD_CS_CMY, PPD_CS_GRAY, - PPD_CS_RGB, PPD_CS_RGBK, PPD_CS_N
    contone_onlyint1 = printer is continuous tone only
    num_emulations
    - emulations
    int
    - ppd_emul_t *
    Emulations supported by the printer
    flip_duplexint1 = need to flip odd pages when duplexing
    num_fonts
    - fonts
    int
    - char **
    The fonts available on the printer.
    jcl_begin
    - jcl_ps
    - jcl_end
    char *Job Control Language commands for PostScript output
    landscapeintLandscape orientation, -90 or 90 degrees
    lang_encodingchar *The character used for the option strings
    lang_versionchar *The language used for the options strings (English, French, etc.)
    language_levelintPostScript language level, 1 to 3
    manual_copiesint1 = Copies are done manually
    model_numberintDriver-specific model number.
    patcheschar *Patch commands to send to the printer
    manufacturerchar *The Manufacturer attribute from the PPD file, if any
    modelnamechar *The ModelName attribute from the PPD file
    nicknamechar *The NickName attribute from the PPD file, if any
    productchar *The Product attribute from the PPD file, if any
    shortnicknamechar *The ShortNickName attribute from the PPD file, if any
    throughputintNumber of pages per minute
    ttrasterizerchar *The TruType font rasterizer (Type42)
    variable_sizesint1 = supports variable sizes
    - -

    Options and Groups

    - -

    PPD files support multiple options, which are stored in -ppd_option_t and ppd_choice_t structures by -the PPD functions. - -

    Each option in turn is associated with a group -stored in the ppd_group_t structure. Groups can be -specified in the PPD file; if an option is not associated with a group -then it is put in a "General" or "Extra" group depending on the option. - -

    Groups can also have sub-groups; CUPS currently limits the depth of -sub-groups to 1 level to reduce programming complexity. - -

    Conflicts

    - -

    PPD files support specification of conflict conditions between -different options. Conflicts are stored in ppd_conflict_t -structures which specify the options that conflict with each other. - -

    Page Sizes

    - -

    PPD files specify all of the available pages sizes and the physical -margins associated with them. These sizes are stored in -ppd_size_t structures and are available in the -num_sizes and sizes members of the -ppd_file_t structure. You can lookup a particular page size -with the ppdPageWidth(), ppdPageLength(), and -ppdPageSize() functions: - -

      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -ppd_size_t *size;
      -float      width;
      -float      length;
      -
      -...
      -
      -size   = ppdPageSize(ppd, "size");
      -width  = ppdPageWidth(ppd, "size");
      -length = ppdPageLength(ppd, "size");
      -
    - -

    The size string is the named page size option. The -width and length are in points; there are 72 points per inch. The -ppd_size_t structure contains the width, length, and -margin information: - -

      -typedef struct    /**** Page Sizes ****/
      -{
      -  int   marked;   /* Page size selected? */
      -  char  name[41]; /* Media size option */
      -  float width,    /* Width of media in points */
      -        length,   /* Length of media in points */
      -        left,     /* Left printable margin in points */
      -        bottom,   /* Bottom printable margin in points */
      -        right,    /* Right printable margin in points */
      -        top;      /* Top printable margin in points */
      -} ppd_size_t;
      -
    - -

    Custom Page Sizes

    - -

    Besides the standard page sizes listed in a PPD file, some printers -support variable or custom page sizes. If variables_sizes -is non-zero, the custom_min, custom_max, and -custom_margins members of the ppd_file_t -structure define the limits of the variable sizes. - -

    To get the resulting media size, use a page size string of -Custom.widthxlength, where width -and length are integer values in points: - -

      -Custom.612x792   [8.5 inches wide, 11 inches long]
      -Custom.1224x792  [17 inches wide, 11 inches long]
      -
    - -

    Marking Options

    - -

    Before marking any user-defined options, call the ppdMarkDefaults() -function to mark the default options from the PPD file: - -

      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -
      -...
      -
      -ppdMarkDefaults(ppd);
      -
    - -

    Then call the ppdMarkOption() function to mark individual -options: - -

      -#include <cups/ppd.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -int        conflicts;
      -
      -...
      -
      -conflicts = ppdMarkOption(ppd, "name", "value");
      -
    - -

    The name and value strings choose a -particular option and choice, respectively. The return value is 0 -if there are not conflicts created by the selection. - -

    CUPS also provides a convenience function for marking all options -in the cups_option_t structure: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -ppd_file_t    *ppd;
      -int           num_options;
      -cups_option_t *options;
      -int           conflicts;
      -
      -...
      -
      -conflicts = cupsMarkOptions(ppd, num_options, options);
      -
    - -

    The cupsMarkOptions() function also handles mapping the -IPP job template attributes to PPD options. The return value is the number -of conflicts present. - -

    Checking for Conflicts

    - -

    The ppdMarkOption() and cupsMarkOptions() -functions return the number of conflicts with the currently marked options. - -

    Call the ppdConflicts() function to get the number of -conflicts after you have marked all of the options: - -

      -#include <cups/cups.h>
      -
      -...
      -
      -ppd_file_t *ppd;
      -int        conflicts;
      -
      -...
      -
      -conflicts = ppdConflicts(ppd);
      -
    - -

    The return value is the number of conflicting options, or 0 if there -are no conflicts. - - -

    3 - Writing Filters

    - -

    This chapter describes how to write a file filter for CUPS. - -

    Overview

    - -

    File filters are programs that convert from one or more MIME types to -another type. Filters use a common command-line and environment interface -that allows them to be joined as needed to print files to any type of -printer. - -

    Security Considerations

    - -

    Filters are normally run as a non-priviledged user, so the major -security consideration is resource utilization - filters should not -depend on unlimited amounts of memory and disk space. - -

    Users and Groups

    - -

    The default CUPS configuration runs filters as user "lp" and group "other". - -

    Temporary Files

    - -

    Temporary files should be created in the directory specified by the -"TMPDIR" environment variable. The -cupsTempFile() function can be -used to safely choose temporary files in this directory. - -

    Sending Messages to the User

    - -

    The CUPS scheduler collects messages sent to the standard error file -by the filter. These messages are relayed to the user based upon the -scheduler LogLevel directive. - -

    The type of message is determined by an initial prefix sent on each -line: - -

      - -
    • DEBUG: - a debug message - -
    • INFO: - an informational message - -
    • WARNING: - a warning message - -
    • ERROR: - an error message - -
    • PAGE: - a page accounting message - -
    - -

    If the line of text does not begin with any of the above prefixes, it -is treated as a debug message. Text following the prefix is copied to the -printer-state-message attribute for the printer, and also -added to the error_log unless it is an informational or page -accounting message. - -

    Page Accounting

    - -

    Page accounting messages are used to inform the server when one or more -pages are printed. Each line has the form: - -

      -PAGE: page-number copy-count
      -
    - -

    The page-number field is the current page number, starting at 1. -The copy-count field specifies the number of copies of that page -that was produced. - -

    Page account messages are added to the page_log file and -cause the job-sheets-completed attribute to be updated for -the job. - -

    Command-Line Arguments

    - -

    Every filter accepts exactly 6 or 7 command-line arguments: - -

      -printer job user title copies options [filename]
      -
      - -
    • printer - The name of the printer queue (normally - this is the name of the program being run) - -
    • job - The numeric job ID for the job being - printed - -
    • user - The string from the - originating-user-name attribute - -
    • title - The string from the - job-name attribute - -
    • copies - The numeric value from the - number-copies attribute - -
    • options - String representations of the - job template attributes, separated by spaces. Boolean attributes - are provided as "name" for true values and "noname" for false - values. All other attributes are provided as "name=value" for - single-valued attributes and "name=value1,value2,...,valueN" for - set attributes - -
    • filename - The request file - -
    - -

    The filename argument is only provided to the first filter in the -chain; all filters must be prepared to read the print file from -the standard input if the filename argument is omitted. - -

    Copy Generation

    - -

    The copies argument specifies the number of copies to produce -of the input file. In general, you should only generate copies if the -filename argument is supplied. The only exception to this are -filters that produce device-independent PostScript output (without any -printer commands from the printer's PPD file), since the PostScript -filter pstops is responsible for copy generation. - -

    Environment Variables

    - -

    Every filter receives a fixed set of environment variables that can -be used by the filter: - -

      - -
    • CHARSET - The character set used by the client for - this print file - -
    • CONTENT_TYPE - The original document type, such as - "application/postscript" - -
    • CUPS_DATADIR - The location of CUPS data files - -
    • CUPS_SERVERROOT - The location of CUPS configuration - files - -
    • DEVICE_URI - The output device URI - -
    • LANG - The language used by the client for - this print file - -
    • PATH - The execution path exported to the filter - -
    • PPD - The full filename of the printer's PPD file - -
    • PRINTER - The name of the printer queue - -
    • RIP_CACHE - The maximum amount of memory each filter - should use - -
    • SOFTWARE - The name of the CUPS software, typically - "CUPS/1.1" - -
    • TZ - The local timezone - -
    • USER - The name of the current user - -
    - -

    Dissecting the HP-GL/2 Filter

    - -

    The HP-GL/2 filter (hpgltops) provided with CUPS is a -complex program that converts HP-GL/2 files into device-independent PostScript -output. Since it produces device-independent PostScript output, it does not -need to handle copy generation or writing printer options from the printer's -PPD file. - -

    Initializing the Filter

    - -

    The first task of any filter is to ensure that the correct number of -command-line arguments are present: - -

      -if (argc < 6 || argc > 7)
      -{
      -  fputs("ERROR: hpgltops job-id user title copies options [file]\n", stderr);
      -  return (1);
      -}
      -
    - -

    After this you open the print file or read from the standard input -as needed: - -

      -FILE *fp;
      -
      -/*
      - * If we have 7 arguments, print the file named on the command-line.
      - * Otherwise, send stdin instead...
      - */
      -
      -if (argc == 6)
      -  fp = stdin;
      -else
      -{
      - /*
      -  * Try to open the print file...
      -  */
      -
      -  if ((fp = fopen(argv[6], "rb")) == NULL)
      -  {
      -    perror("ERROR: unable to open print file - ");
      -    return (1);
      -  }
      -}
      -
    - -

    Once the print file has been opened, options can be processed using -the cupsParseOptions() and -cupsGetOption() functions: - -

      -int           num_options;
      -cups_option_t *options;
      -const char    *val;
      -
      -/*
      - * Process command-line options and write the prolog...
      - */
      -
      -options     = NULL;
      -num_options = cupsParseOptions(argv[5], 0, &options);
      -
      -if ((val = cupsGetOption("blackplot", num_options, options)) != NULL)
      -  shading = 0;
      -
      -if ((val = cupsGetOption("fitplot", num_options, options)) != NULL)
      -  FitPlot = 1;
      -
      -if ((val = cupsGetOption("penwidth", num_options, options)) != NULL)
      -  PenWidth = (float)atoi(val) * 0.001f;
      -
    - -

    After the options have been processed, the filter writes PostScript code -to the standard output based on the print file, closes the print file (as -needed), and returns 0 to the scheduler. - -

    PostScript Output

    - -

    Filters that produce PostScript output must generate output conforming -to the Adobe Document Structuring Conventions, 3.0. In general this means -the beginning of each file must begin with: - -

      -%!PS-Adobe-3.0
      -%%BoundingBox: left bottom right top
      -%%Pages: (atend)
      -%%EndComments
      -
    - -

    The left, bottom, right, and top values -are integers in points from the lower-lefthand corner of the page. - -

    Pages must be surrounded by: - -

      -%%Page: number number
      -gsave
      -...
      -grestore
      -showpage
      -
    - -

    And the end of each file must contain: - -

      -%%Trailer
      -%%Pages: number-pages
      -%%EOF
      -
    - -

    These comments allow the PostScript filter to correctly perform page -accounting, copy generation, N-up printing, and so forth. - -

    4 - Writing Printer Drivers

    - -

    This chapter discusses how to write a printer driver, which is a -special filter program that converts CUPS raster data into the -appropriate commands and data required for a printer. - -

    Overview

    - -

    Raster printers utilitize PPD files that specify one or more -device-specific filters that handle converting print files for the -printer. The simplest raster printer drivers provide a single filter -that converts CUPS raster data to the printer's native format. - -

    CUPS Raster Data

    - -

    CUPS raster data (application/vnd.cups-raster) consists of -a stream of raster page descriptions produced by one of the RIP filters, -such as pstoraster or imagetoraster. - -

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

    After the page dictionary comes the page data which is a full-resolution, -uncompressed bitmap representing the page in the printer's output colorspace. - -

    Page Accounting

    - -

    Printer drivers must handle all page accounting. This means they must -send "PAGE:" messages to the standard error file for each page (and in many -cases, copy) sent to the printer. - -

    Color Management

    - -

    Printer drivers can implement their color management via the -cupsColorProfile attributes in the PPD file or internally -in the driver from a device-independent colorspace. In general, color -management performed by the RIP filters is more efficient than that -performed inside printer drivers. - -

    For example, the pstoraster filter often only has to -perform a color conversion once each time the color is used for -multiple output pixels, while the raster filter must convert every -pixel on the page. - -

    Device and Bitmap Variables

    - -

    Besides the standard PostScript page device dictionary variables defined -in the Adobe PostScript Level 3 reference manual, the CUPS filters support -additional variables that are passed in the page device dictionary header for -the page and in some cases control the type of raster data that is generated: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    VariableTypeDescription
    cupsWidthread-only integerWidth of bitmap in pixels
    cupsHeightread-only integer Height of bitmap in pixels
    cupsMediaTyperead-write integerDevice-specific media type code
    cupsBitsPerColorread-write integerNumber of bits per color; 1, 2, 4, and 8 are currently - supported
    cupsBitsPerPixelread-only integer Number of bits per pixel; 1 to 32
    cupsBytesPerLineread-only integerNumber of bytes per line of raster graphics
    cupsColorOrderread-write enumThe order of color values in the bitmap: -
      -
    • CUPS_ORDER_CHUNKED - CMYK CMYK CMYK -
    • CUPS_ORDER_BANDED - CCC MMM YYY KKK -
    • CUPS_ORDER_PLANAR - CCC ... MMM ... YYY ... KKK ... -
    -
    cupsColorSpaceread-write enumThe colorspace of the bitmap: -
      -
    • CUPS_CSPACE_W - White (luminance) -
    • CUPS_CSPACE_RGB - Red, green, blue -
    • CUPS_CSPACE_RGBA - Red, green, blue, alpha -
    • CUPS_CSPACE_K - Black -
    • CUPS_CSPACE_CMY - Cyan, magenta, yellow -
    • CUPS_CSPACE_YMC - Yellow, magenta, cyan -
    • CUPS_CSPACE_CMYK - Cyan, magenta, yellow, black -
    • CUPS_CSPACE_YMCK - Yellow, magenta, cyan, black -
    • CUPS_CSPACE_KCMY - Black, cyan, magenta, yellow -
    • CUPS_CSPACE_KCMYcm - Black, cyan, magenta, yellow, - light cyan, light magenta -
    • CUPS_CSPACE_GMCK - Metallic yellow (gold), metallic magenta, - metallic cyan, black -
    • CUPS_CSPACE_GMCS - Metallic yellow (gold), metallic magenta, - metallic cyan, metallic grey (silver) -
    • CUPS_CSPACE_WHITE - White pigment (black as white pigment) -
    • CUPS_CSPACE_GOLD - Gold foil (black as gold foil) -
    • CUPS_CSPACE_SILVER - Silver foil (black as silver foil) -
    -
    cupsCompressionread-write integerDevice-specific compression type code
    cupsRowCountread-write integerDevice-specific row count value
    cupsRowFeedread-write integerDevice-specific row feed value
    cupsRowStepread-write integerDevice-specific row step value
    - -

    Bitmaps with a colorspace of CUPS_CSPACE_KCMYcm and more than 1 bit per -color are transmitted to the raster driver in KCMY colorspace; the driver -is responsible for producing the correct separation of normal and light -cyan and magenta inks. - -

    Dissecting the HP-PCL Driver

    - -

    The HP-PCL driver provided with CUPS (rastertohp) converts -bitmap data from the raster filters into HP-PCL commands for most -PCL-compatible printers. The actual format of the raster data is controlled -by the PPD file being used - deskjet.ppd or laserjet.ppd. - -

    PPD Files

    - -

    PPD files play an important part of all raster printer drivers. Options -defined in the PPD file contain PostScript commands that control the raster -data that is sent to the printer driver. - -

    A typical CUPS printer driver will include ColorModel, -InputSlot, PageSize, PageRegion, -and Resolution options. Each option is shown using the -standard PPD format: - -

      -*OpenUI *PageSize/Media Size: PickOne
      -*OrderDependency: 10 AnySetup *PageSize
      -*DefaultPageSize: Letter
      -*PageSize Letter/US Letter: "<<
      -/PageSize [612 792]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*PageSize Legal/US Legal: "<<
      -/PageSize [612 1008]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*PageSize A4/A4: "<<
      -/PageSize [595 842]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -*CloseUI: *PageSize
      -
    - -

    The OpenUI keyword specifies the new option. The first -name is the option with an asterisk (*) in front of it. The first name is -usually followed by a slash (/) and a human-readable version of the -option name. - -

    Every option must have a default value, specified using the -DefaultOption keyword. - -

    Each option begins with the option name followed by the computer and -human-readable values. The PostScript commands follow these inside double -quotes. PostScript commands can be provided on a single line: - -

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

    or broken down on separate lines using the End keyword to -terminate them: - -

      -*PageSize A4/A4: "<<
      -/PageSize [595 842]
      -/ImagingBBox null
      ->> setpagedevice"
      -*End
      -
    - -

    The choice of the two formats is usually esthetic. However, each line in -a PPD file must not exceed 255 characters, so if your PostScript commands are -long you may need to break them up on separate lines. - -

    Reading Raster Data

    - -

    As with any filter, your printer driver should handle raster data from -a filename specified on the command-line or from the standard input. The -cupsRasterOpen() function opens -a raster stream for printing: - -

      -int           fd;   /* File descriptor */
      -cups_raster_t *ras; /* Raster stream for printing */
      -
      -
      -/*
      - * Check for valid arguments...
      - */
      -
      -if (argc < 6 || argc > 7)
      -{
      - /*
      -  * We don't have the correct number of arguments; write an error message
      -  * and return.
      -  */
      -
      -  fputs("ERROR: rastertopcl job-id user title copies options [file]\n", stderr);
      -  return (1);
      -}
      -
      -/*
      - * Open the page stream...
      - */
      -
      -if (argc == 7)
      -{
      -  if ((fd = open(argv[6], O_RDONLY)) == -1)
      -  {
      -    perror("ERROR: Unable to open raster file - ");
      -    sleep(1);
      -    return (1);
      -  }
      -}
      -else
      -  fd = 0;
      -
      -ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
      -
    - -

    Once you have opened the raster stream you just need to read each -page and print it: - -

      -cups_raster_header_t header;
      -int                  y;
      -unsigned char        data[8192];
      -
      -while (cupsRasterReadHeader(ras, &header))
      -{
      -  ... initialize the printer ...
      -  for (y = header.cupsHeight; y > 0; y ++)
      -  {
      -    cupsRasterReadPixels(ras, data, header.cupsBytesPerLine);
      -    ... send raster line to printer ...
      -  }
      -}
      -
    - -

    After you have processed all pages, close the raster stream and -return: - -

      -cupsRasterClose(ras);
      -
      -return (0);
      -
    - -

    5 - Writing Backends

    - -

    This chapter describes how to write a backend for CUPS. Backends -communicate directly with printers and allow printer drivers and -filters to send data using any type of connection transparently. - -

    Overview

    - -

    Backends are special filters that communicate with printers directly. -They are treated slightly differently than filters, however, and have some -unique requirements. - -

    Security Considerations

    - -

    Backends are run as the root user, so special care must be taken to -avoid potential security violations. In particular, remember that a backend -will be able to manipulate disk files, devices, and other resources that -potentially could damage a system or printer. - -

    Command-Line Arguments

    - -

    Besides the standard filter arguments, backends are also run with no -arguments to get a list of available devices. This discovery process is -described later in this chapter. - -

    Copy Generation

    - -

    Like filters, backends should send multiple copies of the print file only -if a filename is supplied on the command-line. Otherwise the backend should -assume that the upstream filter has already added the necessary commands or -data to produce the multiple copies. - -

    Page Accounting

    - -

    Backend filters generally do not do page accounting, however they should -at a minimum produce a single page message for each copy that is produced -when a filename is present on the command-line. This is because the user -selected "raw" printing and no other accounting information is possible. - -

    Exclusive Access

    - -

    Backends that talk to local character or block devices should open the -device file in exclusive mode (O_EXCL) to cooperate with other -printers defined for the same device. - -

    Retries

    - -

    All backends must retry connections to the device. This -includes backends that talk to local character or block devices, as the -user may define more than one printer queue pointing at the same -physical device. - -

    To prevent excess CPU utilitization, the backend should go to sleep -for an amount of time between retries; the CUPS-supplied backends retry -once every 30 seconds. - -

    Dissecting the Serial Port Backend

    - -

    The serial port backend provides support for serial printers. Since -it does everything a good backend needs to do, it provides an excellent -example of what to do. - -

    Supporting Device Discovery

    - -

    As previously noted, backends are special filter programs that talk -to printer devices. Another task a backend must perform is to list the -available devices it supports. The backend lists the available devices -when no additioanl arguments are supplied on the command-line (i.e. -just the command name...) - -

    The serial backend lists devices by looking at serial port files in the -/dev directory, by consulting a hardware inventory (IRIX), and -in some cases by trying to open the ports to see if they actually exist. - -

    Once it finds a serial port it writes a single line for each port to -the standard error file. Each line looks like this: - -

      -serial serial:/dev/ttyS0?baud=115200 "Unknown" "Serial Port 1"
      -
    - -

    The first word "serial" is the device class; this identifies the -class of device which can be used to categorize it in user interfaces. CUPS -currently recognizes the following classes: - -

      - -
    • "file" - a disk file. - -
    • "direct" - a parallel or fixed-rate serial data port, - currently used for Centronics, IEEE-1284, and USB printer - ports. - -
    • "serial" - a variable-rate serial port. - -
    • "network" - a network connection, typically via AppSocket, - HTTP, IPP, LPD, or SMB/CIFS protocols. - -
    - -

    After the device class is the device URI, in this case -"serial:/dev/ttyS0?baud=115200". This is the URI that should be used by -the user to select this port. For serial ports, the "baud=115200" -specifies the maximum baud rate supported by the port - the actual -value will vary based on the speed the user selects for the printer. - -

    The last two strings are the model and description for the port. The -"Unknown" string means that the printer model is unknown - some devices -are able to provide a make and model such as "HP DeskJet" that allows -users and software to choose an appropriate printer driver more easily. -Both the model and description must be enclosed inside double quotes. - -

    Opening the Serial Port

    - -

    As noted previously, all backends should open device files in exclusive -mode, and retry as needed until the port is available. The serial port does -this using a do-while loop: - -

      -do
      -{
      -  if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL)) == -1)
      -  {
      -    if (errno == EBUSY)
      -    {
      -      fputs("INFO: Serial port busy; will retry in 30 seconds...\n", stderr);
      -      sleep(30);
      -    }
      -    else
      -    {
      -      perror("ERROR: Unable to open serial port device file");
      -      return (1);
      -    }
      -  }
      -}
      -while (fd < 0);
      -
    - -

    If the port is busy or in use by another process, the backend will -go to sleep for 30 seconds and try again. If another error is detected -a message is sent to the user and the backend aborts the print job -until the problem can be corrected. - -

    Writing Data to the Port

    - -

    Network and character devices pose an interesting problem when writing -data to the port - they may not be able to write all of the bytes in your -buffer before returning. To work around this problem you must loop until -all bytes have been written: - -

      -while (nbytes > 0)
      -{
      -  if ((wbytes = write(fd, bufptr, nbytes)) < 0)
      -    if (errno == ENOTTY)
      -      wbytes = write(fd, bufptr, nbytes);
      -
      -  if (wbytes < 0)
      -  {
      -    perror("ERROR: Unable to send print file to printer");
      -    break;
      -  }
      -
      -  nbytes -= wbytes;
      -  bufptr += wbytes;
      -}
      -
    - -

    The check for the ENOTTY error is needed on some platforms -to clear an error from a previous ioctl() call. - -

    Finishing Up

    - -

    Once you have sent the print file, return 0 if the file printed -successfully or 1 if it did not. This will allow the scheduler to stop -the print job if there is a device error, preserving the print job for -later printing once the problem has been corrected. - -

    A - Software License Agreement

    - - - - -

    B - Constants

    - -

    This appendix lists all of the constants that are defined by the CUPS -API. - -

    CUPS Constants

    - -

    Version Number

    - -

    The CUPS_VERSION constant is a floating-point number -representing the API version number. The current version number is -1.0100 which represents CUPS version 1.1.0. - -

    Printer Capabilities

    - -

    The CUPS_PRINTER constants represent capability bits for -printers and classes: - -

      - -
    • CUPS_PRINTER_LOCAL - Is a local printer or class. - -
    • CUPS_PRINTER_REMOTE - Is a remote printer or class. - -
    • CUPS_PRINTER_CLASS - Is a class. - -
    • CUPS_PRINTER_BW - Printer prints in black and white. - -
    • CUPS_PRINTER_COLOR - Printer prints in color. - -
    • CUPS_PRINTER_DUPLEX - Printer can print double-sided. - -
    • CUPS_PRINTER_STAPLE - Printer can staple output. - -
    • CUPS_PRINTER_COPIES - Printer can produce multiple - copies on its own. - -
    • CUPS_PRINTER_COLLATE - Printer can collate copies. - -
    • CUPS_PRINTER_PUNCH - Printer can punch holes in output. - -
    • CUPS_PRINTER_COVER - Printer can put covers on output. - -
    • CUPS_PRINTER_BIND - Printer can bind output. - -
    • CUPS_PRINTER_SORT - Printer can sort output. - -
    • CUPS_PRINTER_SMALL - Printer can print on media up - to 9x14 inches. - -
    • CUPS_PRINTER_MEDIUM - Printer can print on media - from 9x14 to 18x24 inches. - -
    • CUPS_PRINTER_LARGE - Printer can print on media - larger than 18x24 inches. - -
    • CUPS_PRINTER_VARIABLE - Printer can print on - variable or custom media sizes. - -
    • CUPS_PRINTER_IMPLICIT - Is an implicit class. - -
    • CUPS_PRINTER_OPTIONS - All of the printer capability - and option bits. - -
    - -

    Encodings

    - -

    CUPS defines the following character set encoding constants: - -

      - -
    • CUPS_US_ASCII - US ASCII character set. - -
    • CUPS_UTF_8 - UTF-8 encoding of Unicode. - -
    • CUPS_ISO8859_1 - ISO-8859-1 character set. - -
    • CUPS_ISO8859_2 - ISO-8859-2 character set. - -
    • CUPS_ISO8859_3 - ISO-8859-3 character set. - -
    • CUPS_ISO8859_4 - ISO-8859-4 character set. - -
    • CUPS_ISO8859_5 - ISO-8859-5 character set. - -
    • CUPS_ISO8859_6 - ISO-8859-6 character set. - -
    • CUPS_ISO8859_7 - ISO-8859-7 character set. - -
    • CUPS_ISO8859_8 - ISO-8859-8 character set. - -
    • CUPS_ISO8859_9 - ISO-8859-9 character set. - -
    • CUPS_ISO8859_10 - ISO-8859-10 character set. - -
    • CUPS_ISO8859_13 - ISO-8859-13 character set. - -
    • CUPS_ISO8859_14 - ISO-8859-14 character set. - -
    • CUPS_ISO8859_15 - ISO-8859-15 character set. - -
    • CUPS_WINDOWS_874 - Windows code page 874. - -
    • CUPS_WINDOWS_1250 - Windows code page 1250. - -
    • CUPS_WINDOWS_1251 - Windows code page 1251. - -
    • CUPS_WINDOWS_1252 - Windows code page 1252. - -
    • CUPS_WINDOWS_1253 - Windows code page 1253. - -
    • CUPS_WINDOWS_1254 - Windows code page 1254. - -
    • CUPS_WINDOWS_1255 - Windows code page 1255. - -
    • CUPS_WINDOWS_1256 - Windows code page 1256. - -
    • CUPS_WINDOWS_1257 - Windows code page 1257. - -
    • CUPS_WINDOWS_1258 - Windows code page 1258. - -
    • CUPS_KOI8_R - Russian code page koi8-r. - -
    • CUPS_KOI8_U - Ukrainian code page koi8-r. - -
    - -

    HTTP Constants

    - -

    Limits

    - -

    The following constants define the limits for strings: - -

      - -
    • HTTP_MAX_BUFFER - Size of socket buffer. - -
    • HTTP_MAX_HOST - Maximum length of hostname. - -
    • HTTP_MAX_URI - Maximum length of URI. - -
    • HTTP_MAX_VALUE - Maximum length of field values. - -
    - -

    Status Codes

    - -

    The following status codes can be returned by httpUpdate(): - -

      - -
    • HTTP_ERROR - A network error occurred - -
    • HTTP_CONTINUE - Continue response from HTTP proxy - -
    • HTTP_OK - 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 - -
    • HTTP_RESET_CONTENT - Content was reset/recreated - -
    • HTTP_PARTIAL_CONTENT - Only a partial file was recieved/sent - -
    • HTTP_MULTIPLE_CHOICES - 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 - 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_SERVER_ERROR - 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 - -
    - -

    Fields

    - -

    The following fields are indices for each of the standard HTTP fields in -HTTP 1/1: - -

      - -
    • HTTP_FIELD_ACCEPT_LANGUAGE - Accept-Language - -
    • HTTP_FIELD_ACCEPT_RANGES - Accept-Ranges - -
    • HTTP_FIELD_AUTHORIZATION - Authorization - -
    • HTTP_FIELD_CONNECTION - Connection - -
    • HTTP_FIELD_CONTENT_ENCODING - Content-Encoding - -
    • HTTP_FIELD_CONTENT_LANGUAGE - Content-Language - -
    • HTTP_FIELD_CONTENT_LENGTH - Content-Length - -
    • HTTP_FIELD_CONTENT_LOCATION - Content-Location - -
    • HTTP_FIELD_CONTENT_MD5 - Content-MD5 - -
    • HTTP_FIELD_CONTENT_RANGE - Content-Range - -
    • HTTP_FIELD_CONTENT_TYPE - Content-Type - -
    • HTTP_FIELD_CONTENT_VERSION - Content-Version - -
    • HTTP_FIELD_DATE - Date - -
    • HTTP_FIELD_HOST - Host - -
    • HTTP_FIELD_IF_MODIFIED_SINCE - If-Modified-Since - -
    • HTTP_FIELD_IF_UNMODIFIED_SINCE - If-Unmodified-Since - -
    • HTTP_FIELD_KEEP_ALIVE - Keep-Alive - -
    • HTTP_FIELD_LAST_MODIFIED - Last-Modified - -
    • HTTP_FIELD_LINK - Link - -
    • HTTP_FIELD_LOCATION - Location - -
    • HTTP_FIELD_RANGE - Range - -
    • HTTP_FIELD_REFERER - Referer - -
    • HTTP_FIELD_RETRY_AFTER - Retry-After - -
    • HTTP_FIELD_TRANSFER_ENCODING - Transfer-Encoding - -
    • HTTP_FIELD_UPGRADE - Upgrade - -
    • HTTP_FIELD_USER_AGENT - User-Agent - -
    • HTTP_FIELD_WWW_AUTHENTICATE - WWW-Authenticate - - -
    - -

    IPP Constants

    - -

    Limits

    - -

    The following constants define array limits for IPP data: - -

      - -
    • IPP_MAX_NAME - Maximum length of an attribute name - -
    • IPP_MAX_VALUES - Maximum number of set-of values - that can be read in a request. - -
    - -

    Tags

    - -
      - -
    • IPP_TAG_ZERO - Wildcard tag value for searches; also - used to separate groups of attributes - -
    • IPP_TAG_OPERATION - Tag for values of type operation - -
    • IPP_TAG_JOB - Tag for values of type job - -
    • IPP_TAG_END - Tag for values of type end - -
    • IPP_TAG_PRINTER - Tag for values of type printer - -
    • IPP_TAG_UNSUPPORTED_GROUP - Tag for values of type unsupported_group - -
    • IPP_TAG_UNSUPPORTED_VALUE - Tag for values of type unsupported_value - -
    • IPP_TAG_DEFAULT - Tag for values of type default - -
    • IPP_TAG_UNKNOWN - Tag for values of type unknown - -
    • IPP_TAG_NOVALUE - Tag for values of type novalue - -
    • IPP_TAG_NOTSETTABLE - Tag for values of type notsettable - -
    • IPP_TAG_DELETEATTR - Tag for values of type deleteattr - -
    • IPP_TAG_ANYVALUE - Tag for values of type anyvalue - -
    • IPP_TAG_INTEGER - Tag for values of type integer - -
    • IPP_TAG_BOOLEAN - Tag for values of type boolean - -
    • IPP_TAG_ENUM - Tag for values of type enum - -
    • IPP_TAG_STRING - Tag for values of type string - -
    • IPP_TAG_DATE - Tag for values of type date - -
    • IPP_TAG_RESOLUTION - Tag for values of type resolution - -
    • IPP_TAG_RANGE - Tag for values of type range - -
    • IPP_TAG_COLLECTION - Tag for values of type collection - -
    • IPP_TAG_TEXTLANG - Tag for values of type textlang - -
    • IPP_TAG_NAMELANG - Tag for values of type namelang - -
    • IPP_TAG_TEXT - Tag for values of type text - -
    • IPP_TAG_NAME - Tag for values of type name - -
    • IPP_TAG_KEYWORD - Tag for values of type keyword - -
    • IPP_TAG_URI - Tag for values of type uri - -
    • IPP_TAG_URISCHEME - Tag for values of type urischeme - -
    • IPP_TAG_CHARSET - Tag for values of type charset - -
    • IPP_TAG_LANGUAGE - Tag for values of type language - -
    • IPP_TAG_MIMETYPE - Tag for values of type mimetype - -
    - -

    Resolution Units

    - -

    The IPP_RES_PER_INCH and IPP_RES_PER_CM constants -specify dots per inch and dots per centimeter, respectively. - -

    Finishings

    - -

    The finishing values specify special finishing operations to be -performed on the job. - -

      - -
    • IPP_FINISH_NONE - Do no finishing - -
    • IPP_FINISH_STAPLE - Staple the job - -
    • IPP_FINISH_PUNCH - Punch the job - -
    • IPP_FINISH_COVER - Cover the job - -
    • IPP_FINISH_BIND - Bind the job - -
    - -

    Orientations

    - -

    The orientation values specify the orientation of the job. - -

      - -
    • IPP_PORTRAIT - No rotation - -
    • IPP_LANDSCAPE - 90 degrees counter-clockwise - -
    • IPP_REVERSE_LANDSCAPE - 90 degrees clockwise - -
    • IPP_REVERSE_PORTRAIT - 180 degrees - -
    - -

    Qualities

    - -

    The quality values specify the desired quality of the print. -

      - -
    • IPP_QUALITY_DRAFT - Draft quality - -
    • IPP_QUALITY_NORMAL - Normal quality - -
    • IPP_QUALITY_HIGH - High quality - -
    - -

    Job States

    - -

    The job state values are used to represent the current job state. - -

      - -
    • IPP_JOB_PENDING - Job is pending - -
    • IPP_JOB_HELD - Job is held - -
    • IPP_JOB_PROCESSING - Job is processing - -
    • IPP_JOB_STOPPED - Job is stopped - -
    • IPP_JOB_CANCELLED - Job is cancelled - -
    • IPP_JOB_ABORTED - Job is aborted - -
    • IPP_JOB_COMPLETED - Job is completed - -
    - -

    Printer States

    - -

    The printer state values are used to represent the current printer -state. - -

      - -
    • IPP_PRINTER_IDLE - Printer is idle - -
    • IPP_PRINTER_PROCESSING - Printer is processing - -
    • IPP_PRINTER_STOPPED - Printer is stopped - -
    - -

    Operations

    - -

    The operation values represent the available IPP operations. - -

      - -
    • IPP_PRINT_JOB - Print a file - -
    • IPP_PRINT_URI - Print a URI - -
    • IPP_VALIDATE_JOB - Validate job attributes - -
    • IPP_CREATE_JOB - Create a new job - -
    • IPP_SEND_DOCUMENT - Send a document to a job - -
    • IPP_SEND_URI - Send a URI to a job - -
    • IPP_CANCEL_JOB - Cancel a job - -
    • IPP_GET_JOB_ATTRIBUTES - Get job attributes - -
    • IPP_GET_JOBS - Get a list of all jobs - -
    • IPP_GET_PRINTER_ATTRIBUTES - Get printer attributes - -
    • IPP_HOLD_JOB - Hold a pending job - -
    • IPP_RELEASE_JOB - Release a held job - -
    • IPP_RESTART_JOB - Restart a completed job - -
    • IPP_PAUSE_PRINTER - Pause a printer - -
    • IPP_RESUME_PRINTER - Restart a paused printer - -
    • IPP_PURGE_JOBS - Purge jobs from the queue - -
    • IPP_SET_PRINTER_ATTRIBUTES - Set printer attributes - -
    • IPP_SET_JOB_ATTRIBUTES - Set job attributes - -
    • IPP_GET_PRINTER_SUPPORTED_VALUES - Get printer supported values - -
    • CUPS_GET_DEFAULT - Get the default destination - -
    • CUPS_GET_PRINTERS - Get a list of all printers - -
    • CUPS_ADD_PRINTER - Add or modify a printer - -
    • CUPS_DELETE_PRINTER - Delete a printer - -
    • CUPS_GET_CLASSES - Get a list of all classes - -
    • CUPS_ADD_CLASS - Add or modify a class - -
    • CUPS_DELETE_CLASS - Delete a class - -
    • CUPS_ACCEPT_JOBS - Accept jobs on a printer or class - -
    • CUPS_REJECT_JOBS - Reject jobs on a printer or class - -
    • CUPS_SET_DEFAULT - Set the default destination - -
    • CUPS_GET_DEVICES - Get a list of all devices - -
    • CUPS_GET_PPDS - Get a list of all PPDs - -
    • CUPS_MOVE_JOB - Move a job to a new destination - -
    - -

    Status Codes

    - -

    Status codes are returned by all IPP requests. - -

      - -
    • IPP_OK - Request completed with no errors - -
    • IPP_OK_SUBST - Request completed but some attribute - values were substituted - -
    • IPP_OK_CONFLICT - Request completed but some attributes - conflicted - -
    • IPP_BAD_REQUEST - The request was bad - -
    • IPP_FORBIDDEN - You don't have access to the resource - -
    • IPP_NOT_AUTHENTICATED - You are not authenticated for - the resource - -
    • IPP_NOT_AUTHORIZED - You not authorized to access - the resource - -
    • IPP_NOT_POSSIBLE - The requested operation cannot be - completed - -
    • IPP_TIMEOUT - A timeout occurred - -
    • IPP_NOT_FOUND - The resource was not found - -
    • IPP_GONE - The resource has gone away - -
    • IPP_REQUEST_ENTITY - The request was too large - -
    • IPP_REQUEST_VALUE - The request contained a value - that was unknown to the server - -
    • IPP_DOCUMENT_FORMAT - The document format is not - supported by the server - -
    • IPP_ATTRIBUTES - Required attributes are missing - -
    • IPP_URI_SCHEME - The URI scheme is not supported - -
    • IPP_CHARSET - The charset is not supported - -
    • IPP_CONFLICT - One or more attributes conflict - -
    • IPP_COMPRESSION_NOT_SUPPORTED - The specified - compression is not supported - -
    • IPP_COMPRESSION_ERROR - The compressed data - contained an error - -
    • IPP_DOCUMENT_FORMAT_ERROR - The document data - contained an error in it - -
    • IPP_DOCUMENT_ACCESS_ERROR - The remote document - could not be accessed - -
    • IPP_INTERNAL_ERROR - The server encountered an - internal error - -
    • IPP_OPERATION_NOT_SUPPORTED - The requested operation - is not supported - -
    • IPP_SERVICE_UNAVAILABLE - The requested service - is unavailable - -
    • IPP_VERSION_NOT_SUPPORTED - The IPP request - version is not supported - -
    • IPP_DEVICE_ERROR - The output device encountered - an error - -
    • IPP_TEMPORARY_ERROR - A temporary error occurred - -
    • IPP_NOT_ACCEPTING - The destination is not accepting - jobs - -
    • IPP_PRINTER_BUSY - The destination is busy - -
    • IPP_ERROR_JOB_CANCELLED - The requested job has been - cancelled - -
    • IPP_MULTIPLE_JOBS_NOT_SUPPORTED - The server - does not support multiple jobs - -
    - -

    PPD Constants

    - -

    PPD Format Version

    - -

    The PPD_VERSION constant defines a floating point number -representing the newest format version that is supported by CUPS, currently -4.3. - -

    PPD User-Interface Types

    - -

    Each printer option has a type associated with it: - -

      - -
    • PPD_UI_BOOLEAN - The user can turn this option on or off - -
    • PPD_UI_PICKONE - The user can choose one option value - to use. - -
    • PPD_UI_PICKMANY - The user can choose zero or more - option values. - -
    - -

    PPD Sections

    - -

    Some options must be output before others, or in different sections of -the output document. The ppd_section_t enumeration defines -which section the option must be output in: - -

      - -
    • PPD_ORDER_ANY - The option can be output in any of - the document, page, or prolog sections of the document - -
    • PPD_ORDER_DOCUMENT - The option must be output in - the DocumentSetup section of the document - -
    • PPD_ORDER_EXIT - The option must be output before - the document - -
    • PPD_ORDER_JCL - The option must be output in the - job control section of the document - -
    • PPD_ORDER_PAGE - The option must be output in the - PageSetup section of the document - -
    • PPD_ORDER_PROLOG - The option must be output in the - Prolog section of the document - -
    - -

    PPD Colorspaces

    - -

    Each printer has a default colorspace: - -

      - -
    • PPD_CS_CMYK - The printer uses CMYK colors by default - -
    • PPD_CS_CMY - The printer uses CMY colors by default - -
    • PPD_CS_GRAY - The printer uses grayscale by default - -
    • PPD_CS_RGB - The printer uses RGB colors by default - -
    • PPD_CS_RGBK - The printer uses RGBK colors by default - -
    • PPD_CS_N - The printer uses a DeviceN colorspace - by default - -
    - -

    Raster Constants

    - -

    Raster Sync Words

    - -

    The CUPS_RASTER_SYNC and CUPS_RASTER_REVSYNC -constants define the standard sync words at the beginning of each CUPS -raster file. - -

    Raster Stream Modes

    - -

    The CUPS_RASTER_READ and CUPS_RASTER_WRITE -constants are used with the -cupsRasterOpen() function to -specify a stream for reading or writing. - -

    Raster Boolean Constants

    - -

    The CUPS_FALSE and CUPS_TRUE constants -represent boolean values in the page header. - -

    Raster Jog Values

    - -

    The cups_jog_t enumeration defines constants for the -Jog page device dictionary variable: - -

      - -
    • CUPS_JOG_NONE - Do no jogging - -
    • CUPS_JOG_FILE - Jog pages after each file - -
    • CUPS_JOG_JOB - Jog pages after each job - -
    • CUPS_JOG_SET - Jog pages after each set of jobs - -
    - -

    Raster Orientation Values

    - -

    The cups_orient_t enumeration defines constants for the -Orientation page device dictionary variable: - -

      - -
    • CUPS_ORIENT_0 - Portrait orientation - -
    • CUPS_ORIENT_90 - Landscape orientation - -
    • CUPS_ORIENT_180 - Reverse-portrait orientation - -
    • CUPS_ORIENT_270 - Reverse-landscape orientation - -
    - -

    Raster CutMedia Values

    - -

    The cups_cut_t enumeration defines constants for the -CutMedia page device dictionary variable: - -

      - -
    • CUPS_CUT_NONE - Do no jogging - -
    • CUPS_CUT_FILE - Cut pages after each file - -
    • CUPS_CUT_JOB - Cut pages after each job - -
    • CUPS_CUT_SET - Cut pages after each set of jobs - -
    • CUPS_CUT_PAGE - Cut each page - -
    - -

    Raster AdvanceMedia Values

    - -

    The cups_advance_t enumeration defines constants for the -AdvanceMedia page device dictionary variable: - -

      - -
    • CUPS_ADVANCE_NONE - Do no jogging - -
    • CUPS_ADVANCE_FILE - Advance media after each file - -
    • CUPS_ADVANCE_JOB - Advance media after each job - -
    • CUPS_ADVANCE_SET - Advance media after each set of jobs - -
    • CUPS_ADVANCE_PAGE - Advance media for each page - -
    - -

    Raster LeadingEdge Values

    - -

    The cups_edge_t enumeration defines constants for the -LeadingEdge page device dictionary variable: - -

      - -
    • CUPS_EDGE_TOP - The top of the media is the leading - edge - -
    • CUPS_EDGE_RIGHT - The right of the media is the leading - edge - -
    • CUPS_EDGE_BOTTOM - The bottom of the media is the - leading edge - -
    • CUPS_EDGE_LEFT - The left of the media is the leading - edge - -
    - -

    Raster Color Order Values

    - -

    The cups_order_t enumeration defines the possible color -value orderings: - -

      - -
    • CUPS_ORDER_CHUNKED - CMYK CMYK CMYK - -
    • CUPS_ORDER_BANDED - CCC MMM YYY KKK - -
    • CUPS_ORDER_PLANAR - CCC ... MMM ... YYY ... KKK ... - -
    - -

    Raster Colorspace Values

    - -

    The cups_cspace_t enumeration defines the possible colorspaces: - -

      - -
    • CUPS_CSPACE_W - White (luminance) - -
    • CUPS_CSPACE_RGB - Red, green, blue - -
    • CUPS_CSPACE_RGBA - Red, green, blue, alpha - -
    • CUPS_CSPACE_K - Black - -
    • CUPS_CSPACE_CMY - Cyan, magenta, yellow - -
    • CUPS_CSPACE_YMC - Yellow, magenta, cyan - -
    • CUPS_CSPACE_CMYK - Cyan, magenta, yellow, black - -
    • CUPS_CSPACE_YMCK - Yellow, magenta, cyan, black - -
    • CUPS_CSPACE_KCMY - Black, cyan, magenta, yellow - -
    • CUPS_CSPACE_KCMYcm - Black, cyan, magenta, yellow, - light cyan, light magenta - -
    • CUPS_CSPACE_GMCK - Metallic yellow (gold), metallic magenta, - metallic cyan, black - -
    • CUPS_CSPACE_GMCS - Metallic yellow (gold), metallic magenta, - metallic cyan, metallic grey (silver) - -
    • CUPS_CSPACE_WHITE - White pigment (black as white pigment) - -
    • CUPS_CSPACE_GOLD - Gold foil (black as gold foil) - -
    • CUPS_CSPACE_SILVER - Silver foil (black as silver foil) - -
    - -

    C - Structures

    - -

    This appendix describes all of the structures that are -defined by the CUPS API. - -

    CUPS Structures

    - -

    CUPS Destinations

    - -

    The CUPS destination structure (cups_dest_t) -contains information on a specific destination or instance: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    namechar *The name of the printer or class.
    instancechar *The instance of the printer or class; NULL for the primary - instance.
    is_defaultint1 if the destination is set as the default, 0 otherwise.
    num_optionsintThe number of options associated with this destination.
    optionscups_option_t *The options associated with this destination.
    - -

    CUPS Jobs

    - -

    The CUPS job structure (cups_job_t) contains -information on a specific job: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    idintThe job ID for this job.
    destchar *The destination for this job (printer or class name).
    titlechar *The job-name for this job (title).
    userchar *The job-originating-user-name for this job (username).
    formatchar *The document-format for this job (MIME type string).
    stateipp_jstateThe current state of the job.
    sizeintThe size of this job in kilobytes.
    priorityintThe priority of this job from 1 to 100 (50 is normal).
    completed_timetime_tThe time the job was completed, or 0 if not yet completed.
    creation_timetime_tThe time the job was queued.
    processing_timetime_tThe time the job started printing.
    - -

    CUPS Messages

    - -

    The CUPS messages structure (cups_lang_t) -contains the character set, locale name, and messages array: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    nextcups_lang_t *Pointer to the next messages structure in memory.
    usedintThe number of active users of this messages structure.
    encodingcups_encoding_tThe character encoding of the message strings.
    languagechar [16]The language/locale name.
    messageschar *[]The array of message strings.
    - -

    CUPS Options

    - -

    The CUPS option structure (cups_option_t) -contains the option name and string value: - -

    - - - - - - - - - - - - - - - -
    MemberTypeDescription
    namechar *The name of the option.
    valuechar *The string value of the option.
    - -

    Networking Structures

    - -

    HTTP State

    - -

    The HTTP state structure (http_t) contains the -current state of a HTTP request or response: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    fdintThe socket for the HTTP connection.
    blockingint1 if the HTTP functions should block, 0 if not.
    errorintThe last OS error that occurred on the socket.
    activitytime_tThe last time the HTTP connection was used.
    statehttp_state_tThe current HTTP request/response state.
    statusintThe last HTTP status seen.
    versionhttp_version_tThe HTTP protocol version in use.
    keep_alivehttp_keep_alive_tWhether or not to use Keep-Alive
    hostaddrstruct sockaddr_inThe IPv4 address of the HTTP server.
    hostnamechar []The hostname of the HTTP server.
    fieldschar [][]The string values of all HTTP request/response - fields.
    datachar *Current byte in data buffer.
    data_encodinghttp_encoding_tThe transfer encoding for the request/response.
    data_remainingintThe number of bytes remaining in the current request, - response, or chunk.
    usedintThe number of bytes that are used in the buffer.
    bufferchar []The read/write buffer.
    auth_typeintThe type of authentication in use.
    md5_statemd5_state_tThe current MD5 digest state.
    noncechar []The nonce value for Digest authentication.
    nonce_countintThe nonce count value.
    tlsvoid *A pointer to private encryption data.
    encryptionhttp_encryption_tThe current encryption mode.
    - -

    IPP State

    - -

    The IPP state structure (ipp_t) contains the -current state of a IPP request or response: - -

    - - - - - - - - - - -
    MemberTypeDescription
    - -

    Raster Structures

    - -

    Raster Page Header

    - -

    The raster page header (cups_raster_header_t) -consists of the PostScript page device dictionary for the page: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MemberTypeDescription
    MediaClasschar[64]The media class name
    MediaColorchar[64]The media color name
    MediaTypechar[64]The media type name
    OutputTypechar[64]The output type name
    AdvanceDistanceunsignedThe distance to advance the media in points
    AdvanceMediacups_adv_tWhen to advance the media
    Collatecups_bool_tWhether or not to produce collated copies
    CutMediacups_cut_tWhen to cut the media
    Duplexcups_bool_tWhether or not to print on both sides of the paper
    HWResolutionunsigned[2]The resolution of the page image in pixels per inch; the - HWResolution[0] represents the horizontal resolution and - HWResolution[1] represents the vertical resolution
    ImagingBoundingBoxunsigned[4]The bounding box for the page in points; the elements - represent the left, bottom, right, and top coordinates of the - imaged area (if 0 then the whole page is imaged)
    InsertSheetcups_bool_tWhether or not to insert a sheet before this page
    Jogcups_jog_tWhen to jog copies of the page
    LeadingEdgecups_edge_tThe leading edge of the page
    Marginsunsigned[2]The lower-lefthand margin of the page in points
    ManualFeedcups_bool_tWhether or not to manually feed the page
    MediaPositionunsignedThe input slot number to use
    MediaWeightunsignedThe weight of the output media in grams/m2
    MirrorPrintcups_bool_tWhether or not to mirror the print
    NegativePrintcups_bool_tWhether or not to invert the print
    NumCopiesunsignedThe number of copies to produce
    Orientationcups_orient_tThe orientation of the page image
    OutputFaceUpcups_bool_tWhether or not to output the page face up
    PageSizeunsigned[2]The width and height of the page in points
    Separationscups_bool_tWhether or not to output separations
    TraySwitchcups_bool_tWhether or not to automatically switch trays for the requested - media size/type
    Tumblecups_bool_tWhether or not to rotate the back side of the page
    cupsWidthunsignedThe width of the page image in pixels
    cupsHeightunsignedThe height of the page image in pixels
    cupsMediaTypeunsignedThe device-specific media type code
    cupsBitsPerColorunsignedThe number of bits per color
    cupsBitsPerPixelunsignedThe number of bits per pixel
    cupsBytesPerLineunsignedThe number of bytes per line of image data
    cupsColorOrdercups_order_tThe order of color values
    cupsColorSpacecups_cspace_tThe type of color values
    cupsCompressionunsignedThe device-specific compression code
    cupsRowCountunsignedThe device-specific row count
    cupsRowFeedunsignedThe device-specific row feed
    cupsRowStepunsignedThe device-specific row step
    - -

    D - Functions

    - -

    This appendix provides a reference for all of the CUPS API functions. - - -

    cupsAddDest()

    - -

    Usage

    - -
    -int
    -cupsAddDest(const char  *name,
    -            const char  *instance,
    -            int         num_dests,
    -	    cups_dest_t **dests);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    nameThe name of the destination.
    instanceThe instance of the destination, or NULL for the primary instance.
    num_destsThe number of destinations in the array.
    destA pointer to the destination array pointer.
    - -

    Returns

    - -

    The new number of destinations in the array. - -

    Description

    - -

    cupsAddDest() adds the named destination to the destination -array if it does not already exist. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -
    -
    -num_dests = cupsAddDests("foo", "bar", num_dests, &dests);
    -
    - -

    See Also

    - -

    -cupsFreeDests(), -cupsGetDest(), -cupsGetDests() - - -

    cupsAddOption()

    - -

    Usage

    - -
    -int
    -cupsAddOption(const char    *name,
    -              const char    *value,
    -              int           num_options,
    -	      cups_option_t **options);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    nameThe name of the option.
    valueThe value of the option.
    num_optionsNumber of options currently in the array.
    optionsPointer to the options array.
    - -

    Returns

    - -

    The new number of options. - -

    Description

    - -

    cupsAddOption() adds an option to the specified array. - -

    Example

    - -
    -#include <cups.h>
    -
    -...
    -
    -/* Declare the options array */
    -int           num_options;
    -cups_option_t *options;
    -
    -/* Initialize the options array */
    -num_options = 0;
    -options     = (cups_option_t *)0;
    -
    -/* Add options using cupsAddOption() */
    -num_options = cupsAddOption("media", "letter", num_options, &options);
    -num_options = cupsAddOption("resolution", "300dpi", num_options, &options);
    -
    - -

    See Also

    - -cupsEncodeOptions(), -cupsFreeOptions(), -cupsGetOption(), -cupsParseOptions() - - -

    cupsCancelJob()

    - -

    Usage

    - -
    -int
    -cupsCancelJob(const char *dest,
    -              int        job);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    destPrinter or class name
    jobJob ID
    - -

    Returns

    - -

    1 on success, 0 on failure. On failure the error can be found by calling -cupsLastError(). - -

    Description

    - -

    cupsCancelJob() cancels the specifies job. - -

    Example

    - -
    -#include <cups.h>
    -
    -cupsCancelJob("LaserJet", 1);
    -
    - -

    See Also

    - -

    -cupsLastError(), -cupsPrintFile(), -cupsPrintFiles() - - -

    cupsDoFileRequest()

    - -

    Usage

    - -
    -ipp_t *
    -cupsDoFileRequest(http_t     *http,
    -                  ipp_t      *request,
    -                  const char *resource,
    -		  const char *filename);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpHTTP connection to server.
    requestIPP request data.
    resourceHTTP resource name for POST.
    filenameFile to send with POST request (NULL pointer if none.)
    - -

    Returns

    - -

    IPP response data or NULL if the request fails. On failure -the error can be found by calling -cupsLastError(). - -

    Description

    - -

    cupsDoFileRequest() does a HTTP POST request and provides the -IPP request and optionally the contents of a file to the IPP server. It also -handles resubmitting the request and performing password authentication as -needed. - -

    Example

    - -
    -#include <cups.h>
    -
    -http_t      *http;
    -cups_lang_t *language;
    -ipp_t       *request;
    -ipp_t       *response;
    -
    -...
    -
    -/* Get the default language */
    -language = cupsLangDefault();
    -
    -/* Create a new IPP request */
    -request  = ippNew();
    -
    -request->request.op.operation_id = IPP_PRINT_FILE;
    -request->request.op.request_id   = 1;
    -
    -/* Add required attributes */
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
    -             "attributes-charset", NULL, cupsLangEncoding(language));
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
    -             "attributes-natural-language", NULL,
    -             language != NULL ? language->language : "C");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
    -             NULL, "ipp://hostname/resource");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
    -             NULL, cupsUser());
    -
    -/* Do the request... */
    -response = cupsDoFileRequest(http, request, "/resource", "filename.txt");
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsUser(), -httpConnect(), -ippAddString(), -ippNew() - - -

    cupsDoRequest()

    - -

    Usage

    - -
    -ipp_t *
    -cupsDoRequest(http_t *http,
    -              ipp_t *request,
    -              const char *resource);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpHTTP connection to server.
    requestIPP request data.
    resourceHTTP resource name for POST.
    - -

    Returns

    - -

    IPP response data or NULL if the request fails. On failure -the error can be found by calling -cupsLastError(). - -

    Description

    - -

    cupsDoRequest() does a HTTP POST request and provides -the IPP request to the IPP server. It also handles resubmitting the -request and performing password authentication as needed. - -

    Example

    - -
    -#include <cups.h>
    -
    -http_t      *http;
    -cups_lang_t *language;
    -ipp_t       *request;
    -ipp_t       *response;
    -
    -...
    -
    -/* Get the default language */
    -language = cupsLangDefault();
    -
    -/* Create a new IPP request */
    -request  = ippNew();
    -
    -request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
    -request->request.op.request_id   = 1;
    -
    -/* Add required attributes */
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
    -             "attributes-charset", NULL, cupsLangEncoding(language));
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
    -             "attributes-natural-language", NULL,
    -             language != NULL ? language->language : "C");
    -
    -ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
    -             NULL, "ipp://hostname/resource");
    -
    -/* Do the request... */
    -response = cupsDoRequest(http, request, "/resource");
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsUser(), -httpConnect(), -ippAddString(), -ippNew() - - -

    cupsEncodeOptions()

    - -

    Usage

    - -
    -void
    -cupsEncodeOptions(ipp_t         *ipp,
    -                  int           num_options,
    -		  cups_option_t *options);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request.
    num_optionsThe number of options.
    optionsThe options.
    - -

    Description

    - -

    cupsEncodeOptions() encodes all of the options -in the specified array as IPP attributes and adds them to the -IPP request. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -ipp_t         *ipp;
    -int           num_options;
    -cups_option_t *options;
    -
    -
    -cupsEncodeOptions(ipp, num_options, options);
    -
    - -

    See Also

    - -

    -cupsAddOption(), -cupsParseOptions(), -ippNew() - - -

    cupsEncryption()

    - -

    Usage

    - -
    -http_encryption_t
    -cupsEncryption(void);
    -
    - -

    Returns

    - -

    The current encryption setting. - -

    Description

    - -

    cupsEncryption() returns the current encryption setting -for IPP requests such as printing. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -http_t *http;
    -
    -printf("The current encryption setting is %d.\n", cupsEncryption());
    -
    -http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
    -
    - -

    See Also

    - -

    -cupsServer(), -httpConnectEncrypt(), -ippPort() - - -

    cupsFreeDests()

    - -

    Usage

    - -
    -void
    -cupsFreeDests(int         num_dests,
    -              cups_dest_t *dests);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    num_destsThe number of destinations in the array.
    destsThe destination array.
    - -

    Description

    - -

    cupsFreeDests() frees a destination array that was -created using cupsGetDests(). - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    - -

    See Also

    - -

    -cupsGetDest(), -cupsGetDests() - - -

    cupsFreeJobs()

    - -

    Usage

    - -
    -void
    -cupsFreeJobs(int        num_jobs,
    -             cups_job_t *jobs);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    num_jobsThe number of jobs.
    jobsThe job array.
    - -

    Description

    - -

    cupsFreeJobs() frees an array of print jobs created by -the cupsGetJobs() function. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int        i;
    -int        num_jobs;
    -cups_job_t *jobs;
    -
    -
    -num_jobs = cupsGetJobs(&jobs, NULL, 0, 0);
    -
    -printf("%d active job(s):\n", num_jobs);
    -for (i = 0; i < num_jobs; i ++)
    -  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
    -         jobs[i].user, jobs[i].title,
    -	 jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
    -
    -cupsFreeJobs(num_jobs, jobs);
    -
    - -

    See Also

    - -

    -cupsGetJobs(), -cupsGetDests() - - -

    cupsFreeOptions()

    - -

    Usage

    - -
    -void
    -cupsFreeOptions(int           num_options,
    -                cups_option_t *options);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    num_optionsNumber of options in array.
    optionsPointer to options array.
    - -

    Description

    - -

    cupsFreeOptions() frees all memory associated with the -option array specified. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -
    -...
    -
    -cupsFreeOptions(num_options, options);
    -
    - -

    See Also

    - -

    -cupsAddOption(), -cupsEncodeOptions(), -cupsGetOption(), -cupsMarkOptions(), -cupsParseOptions() - - -

    cupsGetClasses()

    - -

    Usage

    - -
    -int
    -cupsGetClasses(char ***classes);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    classesPointer to character pointer array.
    - -

    Returns

    - -

    The number of printer classes available. - -

    Description

    - -

    cupsGetClasses() gets a list of the available printer classes. -The returned array should be freed using the free() when it is -no longer needed. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int  i;
    -int  num_classes;
    -char **classes;
    -
    -...
    -
    -num_classes = cupsGetClasses(&classes);
    -
    -...
    -
    -if (num_classes > 0)
    -{
    -  for (i = 0; i < num_classes; i ++)
    -    free(classes[i]);
    -
    -  free(classes);
    -}
    -
    - -

    See Also

    - -

    -cupsGetDefault(), -cupsGetPrinters() - - -

    cupsGetDefault()

    - -

    Usage

    - -
    -const char *
    -cupsGetDefault(void);
    -
    - -

    Returns

    - -

    A pointer to the default destination. - -

    Description

    - -

    cupsGetDefault() gets the default destination printer or class. -The default destination is stored in a static string and will be overwritten -(usually with the same value) after each call. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -printf("The default destination is %s\n", cupsGetDefault());
    -
    - -

    See Also

    - -

    -cupsGetClasses(), -cupsGetPrinters() - - -

    cupsGetDest()

    - -

    Usage

    - -
    -cups_dest_t *
    -cupsGetDest(const char  *name,
    -            const char  *instance,
    -            int         num_dests,
    -            cups_dest_t *dests);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    nameThe name of the destination, or NULL for the default destination.
    instanceThe instance of the destination, or NULL for the primary instance.
    num_destsThe number of destinations.
    destsThe destination array.
    - -

    Returns

    - -

    A pointer to the specified destination, or NULL if none exists. - -

    Description

    - -

    cupsGetDest() finds the specified destination in the array -of destinations created by the cupsGetDests() function. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    - -

    See Also

    - -

    -cupsGetDests(), -cupsGetJobs() - - -

    cupsGetDests()

    - -

    Usage

    - -
    -int
    -cupsGetDests(cups_dest_t **dests);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    destsA pointer to a destination array pointer.
    - -

    Returns

    - -

    The number of available destinations. - -

    Description

    - -

    cupsGetDests() creates an array of available -destinations that the user can print to. The array should be -freed using the cupsFreeDests() function. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -cups_dest_t *dest;
    -
    -num_dests = cupsGetDests(&dests);
    -dest      = cupsGetDest(NULL, NULL, num_dests, dests);
    -
    -if (dest)
    -  printf("The default destination is %s\n", dest->name);
    -else
    -  puts("No default destination.");
    -
    -cupsFreeDests(num_dests, dests);
    -
    - -

    See Also

    - -

    -cupsFreeDests(), -cupsGetDest(), -cupsGetJobs() - - -

    cupsGetJobs()

    - -

    Usage

    - -
    -int
    -cupsGetJobs(cups_job_t **jobs,
    -            const char *dest,
    -            int        myjobs,
    -            int        completed);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    jobsA pointer to the job array pointer.
    destThe destination name, or NULL if jobs for all destinations are requested.
    myjobs1 if only those jobs submitted by the current - cupsUser() should be returned, 0 for jobs - submitted by all users.
    completed1 if only completed jobs should be returned, 0 if only - pending/processing jobs should be returned.
    - -

    Returns

    - -

    The number of jobs. - -

    Description

    - -

    cupsGetJobs() creates an array of print jobs based on the -arguments supplied in the function call. The returned array should be freed -using the cupsFreeJobs() function. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int        i;
    -int        num_jobs;
    -cups_job_t *jobs;
    -
    -
    -num_jobs = cupsGetJobs(&jobs, NULL, 0, 0);
    -
    -printf("%d active job(s):\n", num_jobs);
    -for (i = 0; i < num_jobs; i ++)
    -  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
    -         jobs[i].user, jobs[i].title,
    -	 jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
    -
    -cupsFreeJobs(num_jobs, jobs);
    -
    - -

    See Also

    - -

    -cupsFreeJobs(), -cupsGetDests() - - -

    cupsGetOption()

    - -

    Usage

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

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    nameThe name of the option.
    num_optionsThe number of options in the array.
    optionsThe options array.
    - -

    Returns

    - -

    A pointer to the option values or NULL if the option is -not defined. - -

    Description

    - -

    cupsGetOption() returns the first occurrence of the -named option. If the option is not included in the options array then a -NULL pointer is returned. - -

    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -const char    *media;
    -
    -...
    -
    -media = cupsGetOption("media", num_options, options);
    -
    - -

    See Also

    - -

    -cupsAddOption(), -cupsEncodeOptions(), -cupsFreeOptions(), -cupsMarkOptions(), -cupsParseOptions() - - -

    cupsGetPassword()

    - -

    Usage

    - -
    -const char *
    -cupsGetPassword(const char *prompt);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    promptThe prompt to display to the user.
    - -

    Returns

    - -

    A pointer to the password that was entered or NULL if no -password was entered. - -

    Description

    - -

    cupsGetPassword() displays the prompt string and asks the user -for a password. The password text is not echoed to the user. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -char *password;
    -
    -...
    -
    -password = cupsGetPassword("Please enter a password:");
    -
    - -

    See Also

    - -

    -cupsServer(), -cupsSetPasswordCB(), -cupsSetServer(), -cupsSetUser(), -cupsUser() - - -

    cupsGetPPD()

    - -

    Usage

    - -
    -const char *
    -cupsGetPPD(const char *printer);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    printerThe name of the printer.
    - -

    Returns

    - -

    The name of a temporary file containing the PPD file or NULL -if the printer cannot be located or does not have a PPD file. - -

    Description

    - -

    cupsGetPPD() gets a copy of the PPD file for the named printer. -The printer name can be of the form "printer" or "printer@hostname". - -

    You should remove (unlink) the PPD file after you are done using it. The -filename is stored in a static buffer and will be overwritten with each call -to cupsGetPPD(). - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -char *ppd;
    -
    -...
    -
    -ppd = cupsGetPPD("printer@hostname");
    -
    -...
    -
    -unlink(ppd);
    -
    - - -

    cupsGetPrinters()

    - -

    Usage

    - -
    -int
    -cupsGetPrinters(char ***printers);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    printersPointer to character pointer array.
    - -

    Returns

    - -

    The number of printer printers available. - -

    Description

    - -

    cupsGetPrinters() gets a list of the available printers. -The returned array should be freed using the free() when it is -no longer needed. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int  i;
    -int  num_printers;
    -char **printers;
    -
    -...
    -
    -num_printers = cupsGetPrinters(&printers);
    -
    -...
    -
    -if (num_printers > 0)
    -{
    -  for (i = 0; i < num_printers; i ++)
    -    free(printers[i]);
    -
    -  free(printers);
    -}
    -
    - -

    See Also

    - -

    -cupsGetClasses() -cupsGetDefault() - - -

    cupsLangDefault()

    - -

    Usage

    - -
    -const char *
    -cupsLangDefault(void);
    -
    - -

    Returns

    - -

    A pointer to the default language structure. - -

    Description

    - -

    cupsLangDefault() returns a language structure for the default -language. The default language is defined by the LANG environment -variable. If the specified language cannot be located then the POSIX (English) -locale is used. - -

    Call cupsLangFree() to free any memory associated with the -language structure when you are done. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -...
    -
    -language = cupsLangDefault();
    -
    -...
    -
    -cupsLangFree(language);
    -
    - -

    See Also

    - -

    -cupsLangEncoding(), -cupsLangFlush(), -cupsLangFree(), -cupsLangGet(), -cupsLangString() - - -

    cupsLangEncoding()

    - -

    Usage

    - -
    -char *
    -cupsLangEncoding(cups_lang_t *language);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    languageThe language structure.
    - -

    Returns

    - -

    A pointer to the encoding string. - -

    Description

    - -

    cupsLangEncoding() returns the language encoding used for the -specified language, e.g. "iso-8859-1", "utf-8", etc. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -char        *encoding;
    -...
    -
    -language = cupsLangDefault();
    -encoding = cupsLangEncoding(language);
    -...
    -
    -cupsLangFree(language);
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangFlush(), -cupsLangFree(), -cupsLangGet(), -cupsLangString() - - -

    cupsLangFlush()

    - -

    Usage

    - -
    -void
    -cupsLangFlush(void);
    -
    - -

    Description

    - -

    cupsLangFlush() frees all language structures that have been -allocated. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -...
    -
    -cupsLangFlush();
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsLangFree(), -cupsLangGet(), -cupsLangString() - - -

    cupsLangFree()

    - -

    Usage

    - -
    -void
    -cupsLangFree(cups_lang_t *language);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    languageThe language structure to free.
    - -

    Description

    - -

    cupsLangFree() frees the specified language structure. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -...
    -
    -cupsLangFree(language);
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsLangFlush(), -cupsLangGet(), -cupsLangString() - - -

    cupsLangGet()

    - -

    Usage

    - -
    -cups_lang_t *
    -cupsLangGet(const char *name);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    nameThe name of the locale.
    - -

    Returns

    - -

    A pointer to a language structure. - -

    Description

    - -

    cupsLangGet() returns a language structure for the specified -locale. If the locale is not defined then the POSIX (English) locale is -substituted. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -
    -...
    -
    -language = cupsLangGet("fr");
    -
    -...
    -
    -cupsLangFree(language);
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsLangFlush(), -cupsLangFree(), -cupsLangString() - - -

    cupsLangString()

    - -

    Usage

    - -
    -char *
    -cupsLangString(cups_lang_t *language,
    -               int         message);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    languageThe language to query.
    messageThe message number.
    - -

    Returns

    - -

    A pointer to the message string or NULL if the message is -not defined. - -

    Description

    - -

    cupsLangString() returns a pointer to the specified message -string in the specified language. - -

    Example

    - -
    -#include <cups/language.h>
    -
    -cups_lang_t *language;
    -char        *s;
    -...
    -
    -language = cupsLangGet("fr");
    -
    -s = cupsLangString(language, CUPS_MSG_YES);
    -
    -...
    -
    -cupsLangFree(language);
    -
    - -

    See Also

    - -

    -cupsLangDefault(), -cupsLangEncoding(), -cupsLangFlush(), -cupsLangFree(), -cupsLangGet() - - -

    cupsLastError()

    - -

    Usage

    - -
    -ipp_status_t
    -cupsLastError(void);
    -
    - -

    Returns

    - -

    An enumeration containing the last IPP error. - -

    Description

    - -

    cupsLastError() returns the last IPP error that occurred. -If no error occurred then it will return IPP_OK or -IPP_OK_CONFLICT. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -ipp_status_t status;
    -
    -...
    -
    -status = cupsLastError();
    -
    - -

    See Also

    - -

    -cupsCancelJob(), -cupsPrintFile() - - -

    cupsMarkOptions()

    - -

    Usage

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

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file to mark.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    - -

    Returns

    - -

    The number of conflicts found. - -

    Description

    - -

    cupsMarkOptions() marks options in the PPD file. It also -handles mapping of IPP option names and values to PPD option names. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -ppd_file_t    *ppd;
    -
    -...
    -
    -cupsMarkOptions(ppd, num_options, options);
    -
    - -

    See Also

    - -

    -cupsAddOption(), -cupsFreeOptions(), -cupsGetOption(), -cupsParseOptions() - - -

    cupsParseOptions()

    - -

    Usage

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

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    argThe string containing one or more options.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array pointer.
    - -

    Returns

    - -

    The new number of options in the array. - -

    Description

    - -

    cupsParseOptions() parses the specifies string for one -or more options of the form "name=value", "name", or "noname". It can -be called multiple times to combine the options from several strings. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -
    -...
    -
    -num_options = 0;
    -options     = (cups_option_t *)0;
    -num_options = cupsParseOptions(argv[5], num_options, &options);
    -
    - -

    See Also

    - -

    -cupsAddOption(), -cupsFreeOptions(), -cupsGetOption(), -cupsMarkOptions() - - -

    cupsPrintFile()

    - -

    Usage

    - -
    -int
    -cupsPrintFile(const char    *printer,
    -              const char    *filename,
    -              const char    *title,
    -	      int           num_options,
    -	      cups_option_t *options);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    printerThe printer or class to print to.
    filenameThe file to print.
    titleThe job title.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    - -

    Returns

    - -

    The new job ID number or 0 on error. - -

    Description

    - -

    cupsPrintFile() sends a file to the specified printer or -class for printing. If the job cannot be printed the error code can be -found by calling cupsLastError(). - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int           num_options;
    -cups_option_t *options;
    -int           jobid;
    -
    -...
    -
    -jobid = cupsPrintFile("printer@hostname", "filename.ps", "Job Title",
    -                      num_options, options);
    -
    - -

    See Also

    - -

    -cupsCancelJob(), -cupsLastError(), -cupsPrintFiles() - - -

    cupsPrintFiles()

    - -

    Usage

    - -
    -int
    -cupsPrintFiles(const char    *printer,
    -               int           num_files,
    -               const char    **files,
    -               const char    *title,
    -	       int           num_options,
    -	       cups_option_t *options);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    printerThe printer or class to print to.
    num_filesThe number of files to print.
    filesThe files to print.
    titleThe job title.
    num_optionsThe number of options in the options array.
    optionsA pointer to the options array.
    - -

    Returns

    - -

    The new job ID number or 0 on error. - -

    Description

    - -

    cupsPrintFiles() sends multiple files to the specified -printer or class for printing. If the job cannot be printed the error -code can be found by calling cupsLastError(). - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int           num_files;
    -const char    *files[100];
    -int           num_options;
    -cups_option_t *options;
    -int           jobid;
    -
    -...
    -
    -jobid = cupsPrintFiles("printer@hostname", num_files, files,
    -                       "Job Title", num_options, options);
    -
    - -

    See Also

    - -

    -cupsCancelJob(), -cupsLastError(), -cupsPrintFile() - - -

    cupsRasterClose()

    - -

    Usage

    - -
    -void
    -cupsRasterClose(cups_raster_t *ras);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    rasThe raster stream to close.
    - -

    Description

    - -

    cupsRasterClose() closes the specified raster stream. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -cups_raster_t *ras;
    -
    -...
    -
    -cupsRasterClose(ras);
    -
    - -

    See Also

    - -

    -cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - - -

    cupsRasterOpen()

    - -

    Usage

    - -
    -cups_raster_t *
    -cupsRasterOpen(int         fd,
    -               cups_mode_t mode);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    fdThe file descriptor to use.
    modeThe mode to use; CUPS_RASTER_READ or - CUPS_RASTER_WRITE.
    - -

    Returns

    - -

    A pointer to a raster stream or NULL if there was an error. - -

    Description

    - -

    cupsRasterOpen() opens a raster stream for reading or writing. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -cups_raster_t *ras;
    -
    -...
    -
    -ras = cupsRasterOpen(0, CUPS_RASTER_READ);
    -
    - -

    See Also

    - -

    -cupsRasterClose(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - - -

    cupsRasterReadHeader()

    - -

    Usage

    - -
    -unsigned
    -cupsRasterReadHeader(cups_raster_t      *ras,
    -                     cups_page_header_t *header);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    rasThe raster stream to read from.
    headerA pointer to a page header structure to read into.
    - -

    Returns

    - -

    1 on success, 0 on EOF or error. - -

    Description

    - -

    cupsRasterReadHeader() reads a page header from the specified -raster stream. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -while (cupsRasterReadHeader(ras, &header))
    -{
    -  ...
    -
    -  for (line = 0; line < header.cupsHeight; line ++)
    -  {
    -    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
    -
    -    ...
    -  }
    -}
    -
    - -

    See Also

    - -

    -cupsRasterClose(), -cupsRasterOpen(), -cupsRasterReadPixels(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - - -

    cupsRasterReadPixels()

    - -

    Usage

    - -
    -unsigned
    -cupsRasterReadPixels(cups_raster_t *ras,
    -                     unsigned char *pixels,
    -		     unsigned      length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    rasThe raster stream to read from.
    pixelsThe pointer to a pixel buffer.
    lengthThe number of bytes of pixel data to read.
    - -

    Returns

    - -

    The number of bytes read or 0 on EOF or error. - -

    Description

    - -

    cupsRasterReadPixels() reads pixel data from the specified -raster stream. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -while (cupsRasterReadHeader(ras, &header))
    -{
    -  ...
    -
    -  for (line = 0; line < header.cupsHeight; line ++)
    -  {
    -    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
    -
    -    ...
    -  }
    -}
    -
    - -

    See Also

    - -

    -cupsRasterClose(), -cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterWriteHeader(), -cupsRasterWritePixels() - - -

    cupsRasterWriteHeader()

    - -

    Usage

    - -
    -unsigned
    -cupsRasterWriteHeader(cups_raster_t      *ras,
    -                      cups_page_header_t *header);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    rasThe raster stream to write to.
    headerA pointer to the page header to write.
    - -

    Returns

    - -

    1 on success, 0 on error. - -

    Description

    - -

    cupsRasterWriteHeader() writes the specified page header to -a raster stream. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -cupsRasterWriteHeader(ras, &header);
    -
    -for (line = 0; line < header.cupsHeight; line ++)
    -{
    -  ...
    -
    -  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
    -}
    -
    - -

    See Also

    - -

    -cupsRasterClose(), -cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWritePixels() - - -

    cupsRasterWritePixels()

    - -

    Usage

    - -
    -unsigned
    -cupsRasterWritePixels(cups_raster_t *ras,
    -                      unsigned char *pixels,
    -		      unsigned      length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    rasThe raster stream to write to.
    pixelsThe pixel data to write.
    lengthThe number of bytes to write.
    - -

    Returns

    - -

    The number of bytes written. - -

    Description

    - -

    cupsRasterWritePixels() writes the specified pixel data to a -raster stream. - -

    Example

    - -
    -#include <cups/raster.h>
    -
    -int                  line;
    -cups_raster_t        *ras;
    -cups_raster_header_t header;
    -unsigned char        pixels[8192];
    -...
    -
    -cupsRasterWriteHeader(ras, &header);
    -
    -for (line = 0; line < header.cupsHeight; line ++)
    -{
    -  ...
    -
    -  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
    -}
    -
    - -

    See Also

    - -

    -cupsRasterClose(), -cupsRasterOpen(), -cupsRasterReadHeader(), -cupsRasterReadPixels(), -cupsRasterWriteHeader() - - -

    cupsServer()

    - -

    Usage

    - -
    -const char *
    -cupsServer(void);
    -
    - -

    Returns

    - -

    A pointer to the default server name. - -

    Description

    - -

    cupsServer() returns a pointer to the default server name. -The server name is stored in a static location and will be overwritten with -every call to cupsServer(). - -

    The default server is determined from the following locations: - -

      - -
    1. The CUPS_SERVER environment variable, - -
    2. The ServerName directive in the - client.conf file, - -
    3. The default host, "localhost". - -
    - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -const char *server;
    -
    -server = cupsServer();
    -
    - -

    See Also

    - -

    -cupsGetPassword(), -cupsSetPasswordCB(), -cupsSetServer(), -cupsSetUser(), -cupsUser() - - -

    cupsSetDests()

    - -

    Usage

    - -
    -void
    -cupsSetDests(int         num_dests,
    -             cups_dest_t *dests);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    num_destsNumber of destinations.
    destsArray of destinations.
    - -

    Description

    - -

    cupsSetDests() saves the destination array to -disk. If the current UID is 0, the destinations are saved in the -/etc/cups/lpoptions file, otherwise they are saved -in the ~/.lpoptions file. This function is typically used -to save the default options and instances that are set by the user. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int         num_dests;
    -cups_dest_t *dests;
    -
    -...
    -
    -cupsSetDests(num_dests, dests);
    -
    - -

    See Also

    - -

    -cupsGetDests() - - -

    cupsSetEncryption()

    - -

    Usage

    - -
    -void
    -cupsSetEncryption(http_encryption_t encryption);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    encryptionThe type of encryption to use.
    - -

    Description

    - -

    cupsSetEncryption() sets the default type of encryption to -use when connecting with the print server. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
    -
    - -

    See Also

    - -

    -cupsEncryption() - - -

    cupsSetPasswordCB()

    - -

    Usage

    - -
    -void
    -cupsSetPasswordCB(const char *(*cb)(const char *prompt));
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    cbThe password callback function.
    - -

    Description

    - -

    cupsSetPasswordCB() sets the callback function to use when -asking the user for a password. The callback function must accept a single -character string pointer (the prompt string) and return NULL -if the user did not enter a password string or a pointer to the password -string otherwise. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -const char *
    -my_password_cb(const char *prompt)
    -{
    -  return (getpass(prompt));
    -}
    -
    -...
    -
    -char *password;
    -
    -...
    -
    -cupsSetPasswordCB(my_password_cb);
    -password = cupsGetPassword("Please enter a password:");
    -
    - -

    See Also

    - -

    -cupsServer(), -cupsSetServer(), -cupsSetUser(), -cupsUser() - - -

    cupsSetServer()

    - -

    Usage

    - -
    -void
    -cupsSetServer(const char *server);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    serverThe default server to use.
    - -

    Description

    - -

    cupsSetServer() sets the default server to use for -the CUPS API. If the server argument is NULL, -the default server is used. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -cupsSetServer("foo.bar.com");
    -
    - -

    See Also

    - -

    -cupsServer(), -cupsSetPasswordCB(), -cupsSetUser(), -cupsUser() - - -

    cupsSetUser()

    - -

    Usage

    - -
    -void
    -cupsSetUser(const char *user);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    userThe user name string to use.
    - -

    Description

    - -

    cupsSetUser() sets the default user name for authentication. -If the user argument is NULL then the current -login user is used. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -...
    -
    -cupsSetUser("root");
    -
    - -

    See Also

    - -

    -cupsServer(), -cupsSetPasswordCB(), -cupsSetServer(), -cupsUser() - - -

    cupsTempFd()

    - -

    Usage

    - -
    -int
    -cupsTempFd(char *filename,
    -           int  length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    filenameThe character string to hold the temporary filename.
    lengthThe size of the filename string in bytes.
    - -

    Returns

    - -

    A file descriptor open for reading and writing. - -

    Description

    - -

    cupsTempFd() create a temporary filename in the -/var/tmp directory or the directory specified by the -TMPDIR environment variable. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -int  fd;
    -char filename[256];
    -
    -fd = cupsTempFd(filename, sizeof(filename));
    -
    - -

    See Also

    - -

    -cupsTempFile() - - -

    cupsTempFile()

    - -

    Usage

    - -
    -char *
    -cupsTempFile(char *filename,
    -             int  length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    filenameThe character string to hold the temporary filename.
    lengthThe size of the filename string in bytes.
    - -

    Returns

    - -

    A pointer to filename. - -

    Description

    - -

    cupsTempFile() creates a temporary filename in the -/var/tmp directory or the directory specified by the -TMPDIR environment variable. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -char filename[256];
    -
    -cupsTempFile(filename, sizeof(filename));
    -
    - -

    See Also

    - -

    -cupsTempFd() - - -

    cupsUser()

    - -

    Usage

    - -
    -const char *
    -cupsUser(void);
    -
    - -

    Returns

    - -

    A pointer to the current username or NULL if the user ID is -undefined. - -

    Description

    - -

    cupsUser() returns the name associated with the current -user ID as reported by the getuid() system call. - -

    Example

    - -
    -#include <cups/cups.h>
    -
    -const char *user;
    -
    -user = cupsUser();
    -
    - -

    See Also

    - -

    -cupsGetPassword(), -cupsServer() - - -

    httpBlocking()

    - -

    Usage

    - -
    -void
    -httpBlocking(http_t *http,
    -             int    blocking)
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    blocking0 if the connection should be non-blocking, 1 if it should - be blocking
    - -

    Description

    - -

    The httpBlocking() function sets the blocking mode for the -HTTP connection. By default HTTP connections will block (stop) the client -program until data is available or can be sent to the server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnect("server", port);
    -httpBlocking(http, 0);
    -
    - -

    See Also

    - -httpCheck(), -httpConnect() - - -

    httpCheck()

    - -

    Usage

    - -
    -int
    -httpCheck(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Returns

    - -

    0 if there is no data pending, 1 otherwise. - -

    Description

    - -

    The httpCheck() function checks to see if there is any data -pending on an HTTP connection. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -if (httpCheck(http))
    -{
    -  ... do something ...
    -}
    -
    - -

    See Also

    - -httpBlocking(), -httpConnect(), -httpGets(), -httpRead() - - -

    httpClearFields()

    - -

    Usage

    - -
    -void
    -httpClearFields(http_t *http)
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Description

    - -

    The httpClearFields() function clears all HTTP request fields -for the HTTP connection. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpClearFields(http);
    -
    - -

    See Also

    - -httpConnect(), -httpGetField(), -httpSetField() - - -

    httpClose()

    - -

    Usage

    - -
    -void
    -httpClose(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Description

    - -

    The httpClose() function closes an active HTTP connection. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpClose(http);
    -
    - -

    See Also

    - -httpConnect() - - -

    httpConnect()

    - -

    Usage

    - -
    -http_t *
    -httpConnect(const char *hostname,
    -            int        port);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    hostnameThe name or IP address of the server to connect to
    portThe port number to use
    - -

    Returns

    - -

    A pointer to a HTTP connection structure or NULL if the connection could -not be made. - -

    Description

    - -

    The httpConnect() function opens a HTTP connection to the -specified server and port. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnect(cupsServer(), ippPort());
    -
    - -

    See Also

    - -httpClose(), -httpConnectEncrypt(), -httpGet(), -httpGets(), -httpPost(), -httpRead(), -httpWrite() - - -

    httpConnectEncrypt()

    - -

    Usage

    - -
    -http_t *
    -httpConnectEncrypt(const char        *hostname,
    -                   int               port,
    -                   http_encryption_t encryption);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    hostnameThe name or IP address of the server to connect to
    portThe port number to use
    encryptionThe level of encryption to use
    - -

    Returns

    - -

    A pointer to a HTTP connection structure or NULL if the connection could -not be made. - -

    Description

    - -

    The httpConnectEncrypt() function opens a HTTP -connection to the specified server, port, and encryption. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
    -
    - -

    See Also

    - -httpClose(), -httpConnect(), -httpGet(), -httpGets(), -httpPost(), -httpRead(), -httpWrite() - - -

    httpDecode64()

    - -

    Usage

    - -
    -char *
    -httpDecode64(char       *out,
    -             const char *in);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    outThe output string
    inThe input string
    - -

    Returns

    - -

    A pointer to the decoded string. - -

    Description

    - -

    The httpDecode64() function decodes a base-64 encoded string -to the original string. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -char encoded_string[255];
    -char original_string[255];
    -
    -httpDecode64(original_string, encoded_string);
    -
    - -

    See Also

    - -httpEncode64() - - -

    httpDelete()

    - -

    Usage

    - -
    -int
    -httpDelete(http_t     *http,
    -           const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to delete
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpDelete() function sends a HTTP DELETE request to -the server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpDelete(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpEncode64()

    - -

    Usage

    - -
    -char *
    -httpEncode64(char       *out,
    -             const char *in);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    outThe output string
    inThe input string
    - -

    Returns

    - -

    A pointer to the encoded string. - -

    Description

    - -

    The httpEncode64() function decodes a base-64 encoded string -to the original string. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -char encoded_string[255];
    -char original_string[255];
    -
    -httpEncode64(encoded_string, original_string);
    -
    - -

    See Also

    - -httpDecode64() - - -

    httpEncryption()

    - -

    Usage

    - -
    -int
    -httpEncryption(http_t            *http,
    -               http_encryption_t encryption);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection.
    encryptionThe desired level of encryption.
    - -

    Returns

    - -

    0 on success, -1 on error. - -

    Description

    - -

    httpEncryption() sets the encryption level for the HTTP -connection. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
    -
    - -

    See Also

    - -

    -httpConnectEncrypt() - - -

    httpError()

    - -

    Usage

    - -
    -int
    -httpError(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Returns

    - -

    The last error that occurred or 0 if no error has occurred. - -

    Description

    - -

    The httpError() function returns the last error that occurred -on the HTTP connection. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -if (httpError(http))
    -{
    -  ... show an error message ...
    -}
    -
    - -

    See Also

    - -httpConnect() - - -

    httpFlush()

    - -

    Usage

    - -
    -void
    -httpFlush(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Description

    - -

    The httpFlush() function flushes any remaining data left from -a GET or POST operation. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpFlush(http);
    -
    - -

    See Also

    - -httpConnect(), - - -

    httpGet()

    - -

    Usage

    - -
    -int
    -httpGet(http_t     *http,
    -        const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to get
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpGet() function sends a HTTP GET request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpGet(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpGets()

    - -

    Usage

    - -
    -char *
    -httpGets(char   *line,
    -         int    length,
    -         http_t *http)
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    lineThe string to fill with a line from the HTTP connection
    lengthThe maximum length of the string
    httpThe HTTP connection
    - -

    Returns

    - -

    A pointer to the string or NULL if no line could be retrieved. - -

    Description

    - -

    The httpGets() function is used to read a request line from -the HTTP connection. It is not normally used by a client program. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char   line[1024];
    -
    -if (httpGets(line, sizeof(line), http))
    -{
    -  ... process the line ...
    -}
    -
    - -

    See Also

    - -httpConnect(), -httpUpdate() - - -

    httpGetDateString()

    - -

    Usage

    - -
    -const char *
    -httpGetDateString(time_t time)
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    timeThe UNIX date/time value
    - -

    Returns

    - -

    A pointer to a static string containing the HTTP date/time string for -the specified UNIX time value. - -

    Description

    - -

    The httpGetDateString() function generates a date/time string -suitable for HTTP requests from a UNIX time value. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -puts(httpGetDateString(time(NULL)));
    -
    - -

    See Also

    - -httpGetDateTime() - - -

    httpGetDateTime()

    - -

    Usage

    - -
    -time_t
    -httpGetDateTime(const char *date)
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    dateThe HTTP date/time string
    - -

    Returns

    - -

    A UNIX time value. - -

    Description

    - -

    The httpGetDateTime() function converts a HTTP -date/time string to a UNIX time value. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -printf("%d\n", httpGetDateTime("Fri, 30 June 2000 12:34:56 GMT"));
    -
    - -

    See Also

    - -httpGetDateString() - - -

    httpGetField()

    - -

    Usage

    - -
    -const char *
    -httpGetField(http_t       *http,
    -             http_field_t field);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    fieldThe HTTP field
    - -

    Returns

    - -

    A pointer to the field value string. - -

    Description

    - -

    The httpGetField() function returns the current value for -the specified HTTP field. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    -puts(httpGetField(http, HTTP_FIELD_CONTENT_TYPE));
    -
    - -

    See Also

    - -httpConnect(), -httpGetSubField(), -httpSetField() - - -

    httpGetHostByName()

    - -

    Usage

    - -
    -struct hostent	*
    -httpGetHostByName(const char *name);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    nameName or IP address to lookup.
    - -

    Returns

    - -

    NULL if the host could not be found or a pointer to a host entry -containing one or more addresses. - -

    Description

    - -

    httpGetHostByName() is a portable wrapper around the -gethostbyname() function which handles both hostnames -and IP addresses. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -struct hostent *hostaddr;
    -
    -hostaddr = httpGetHostByName("foo.bar.com");
    -
    - - -

    httpGetLength()

    - -

    Usage

    - -
    -int
    -httpGetLength(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection.
    - -

    Returns

    - -

    The content length of the response or MAX_INT if chunking is used. - -

    Description

    - -

    httpGetLength() returns the content length of a response. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -printf("The length of the response is %d bytes.\n", httpGetLength(http));
    -
    - -

    See Also

    - -

    -httpGet(), -httpPost() - - -

    httpGetSubField()

    - -

    Usage

    - -
    -const char *
    -httpGetSubField(http_t       *http,
    -                http_field_t field,
    -		const char   *name,
    -		char         *value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection.
    fieldThe HTTP field.
    nameThe name of the subfield.
    valueThe string to hold the subfield value.
    - -

    Returns

    - -

    A pointer to the subfield value string or NULL if it does not exist. - -

    Description

    - -

    The httpGetSubField() function returns a subfield value -from the specified HTTP field. The destination string buffer must be at -least HTTP_MAX_VALUE bytes in length. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char   value[HTTP_MAX_VALUE];
    -
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    -puts(httpGetSubField(http, HTTP_FIELD_CONTENT_TYPE, "charset", value));
    -
    - -

    See Also

    - -httpConnect(), -httpGetField(), -httpSetField() - - -

    httpHead()

    - -

    Usage

    - -
    -int
    -httpHead(http_t     *http,
    -         const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to head
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpHead() function sends a HTTP HEAD request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpHead(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpInitialize()

    - -

    Usage

    - -
    -void httpInitialize(void);
    -
    - -

    Description

    - -

    The httpInitialize() function initializes the networking -code as needed by the underlying platform. It is called automatically by -the httpConnect() function. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -httpInitialize();
    -
    - -

    See Also

    - -httpConnect() - - -

    httpMD5()

    - -

    Usage

    - -
    -char *
    -httpMD5(const char *username,
    -        const char *realm,
    -        const char *passwd,
    -        char       md5[33]);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    usernameThe authenticating user name.
    realmThe authenticating realm name.
    passwdThe authenticating password.
    md5The MD5 sum string.
    - -

    Returns

    - -

    A pointer to the MD5 sum string. - -

    Description

    - -

    httpMD5() computes the MD5 hash of the username, -realm, and password as required by the HTTP Digest specification. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -char md5[33];
    -
    -...
    -
    -httpMD5("user", "realm", "password", md5);
    -
    - -

    See Also

    - -

    -httpMD5Final(), -httpMD5String() - - -

    httpMD5Final()

    - -

    Usage

    - -
    -char *
    -httpMD5Final(const char *nonce,
    -             const char *method,
    -             const char *resource,
    -             char       md5[33]);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    nonceThe server nonce value.
    methodThe HTTP method (GET, POST, etc.)
    resourceThe resource path.
    md5The MD5 sum string.
    - -

    Returns

    - -

    The MD5 sum string. - -

    Description

    - -

    httpMD5Final() appends the nonce, method, and resource -to the specified MD5 sum. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -char md5[33];
    -
    -...
    -
    -httpMD5Final("nonce", "GET", "/jobs", md5);
    -
    - -

    See Also

    - -

    -httpMD5(), -httpMD5String() - - -

    httpMD5String()

    - -

    Usage

    - -
    -char *
    -httpMD5String(const md5_byte_t *sum,
    -              char             md5[33]);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    sumThe raw MD5 sum data.
    md5The MD5 sum string.
    - -

    Returns

    - -

    The MD5 sum string. - -

    Description

    - -

    httpMD5String() converts the raw MD5 sum value to a string. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -md5_byte_t sum[16];
    -char       md5[33];
    -
    -...
    -
    -httpMD5String(sum, md5);
    -
    - -

    See Also

    - -

    -httpMD5(), -httpMD5Final() - - -

    httpOptions()

    - -

    Usage

    - -
    -int
    -httpOptions(http_t     *http,
    -            const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to check for options
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpOptions() function sends a HTTP OPTIONS request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpOptions(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpPost()

    - -

    Usage

    - -
    -int
    -httpPost(http_t     *http,
    -         const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to post to
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpPost() function sends a HTTP POST request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpPost(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpPrintf()

    - -

    Usage

    - -
    -int
    -httpPrintf(http_t     *http,
    -           const char *format,
    -           ...);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    formatA printf-style format string
    - -

    Returns

    - -

    The number of bytes written. - -

    Description

    - -

    The httpPrintf() function sends a formatted string to the -HTTP connection. It is normally only used by the CUPS API and scheduler. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpPrintf(http, "GET / HTTP/1.1 \r\n");
    -
    - -

    See Also

    - -httpConnect() - - -

    httpPut()

    - -

    Usage

    - -
    -int
    -httpPut(http_t     *http,
    -        const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to put
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpPut() function sends a HTTP PUT request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpDelete(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpRead()

    - -

    Usage

    - -
    -int
    -httpRead(http_t *http,
    -         char   *buffer,
    -         int    length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    bufferThe buffer to read into
    lengthThe number of bytes to read
    - -

    Returns

    - -

    The number of bytes read or -1 on error. - -

    Description

    - -

    The httpRead() function reads data from the HTTP connection, -possibly the result of a GET or POST request. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -char buffer[1024];
    -int  bytes;
    -
    -httpGet(http, "/");
    -while (httpUpdate(http) != HTTP_CONTINUE);
    -while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
    -{
    -  buffer[bytes] = '\0';
    -  fputs(buffer, stdout);
    -}
    -
    - -

    See Also

    - -httpConnect(), -httpWrite() - - -

    httpReconnect()

    - -

    Usage

    - -
    -int
    -httpReconnect(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpReconnect() function reconnects to the HTTP server. -This is usually done automatically if the HTTP functions detect that the -server connection has terminated. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpReconnect(http);
    -
    - -

    See Also

    - -httpConnect() - - -

    httpSeparate()

    - -

    Usage

    - -
    -void
    -httpSeparate(const char *uri,
    -             char       *method,
    -             char       *username,
    -             char       *host,
    -             int        *port,
    -             char       *resource);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    uriThe URI to separate
    methodThe method (scheme) of the URI
    usernameThe username (and password) portion of the URI, if any
    hostThe hostname portion of the URI, if any
    portThe port number for the URI, either as specified or as - default for the method/scheme
    resourceThe resource string, usually a filename on the server
    - -

    Description

    - -

    The httpSeparate() function separates the specified URI into -its component parts. The method, username, hostname, and resource strings should -be at least HTTP_MAX_URI characters long to avoid potential -buffer overflow problems. - -

    Example

    - -
    -char uri[HTTP_MAX_URI];
    -char method[HTTP_MAX_URI];
    -char username[HTTP_MAX_URI];
    -char host[HTTP_MAX_URI];
    -char resource[HTTP_MAX_URI];
    -int  port;
    -
    -...
    -
    -httpSeparate(uri, method, username, host, &port, resource);
    -
    - -

    See Also

    - -httpConnect() - - -

    httpSetField()

    - -

    Usage

    - -
    -void
    -httpSetField(http_t       *http,
    -             http_field_t field,
    -             const char   *value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    fieldThe HTTP field
    valueThe string value for the field
    - -

    Description

    - -

    The httpSetField() function sets the current value for -the specified HTTP field. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpSetField(http, HTTP_FIELD_AUTHORIZATION, "Basic dfdr34453454325"));
    -httpGet(http, "/some/uri");
    -while (httpUpdate(http) == HTTP_CONTINUE);
    -
    - -

    See Also

    - -httpConnect(), -httpGetField() - - -

    httpStatus()

    - -

    Usage

    - -
    -const char *
    -httpStatus(http_status_t status);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    statusThe HTTP status code from the server.
    - -

    Returns

    - -

    The standard HTTP status text associated with the status code. - -

    Description

    - -

    httpStatus() returns the standard HTTP status text -associated with the status code. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -...
    -
    -puts(httpStatus(http->status));
    -
    - - -

    httpTrace()

    - -

    Usage

    - -
    -int
    -httpTrace(http_t     *http,
    -          const char *uri);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    uriThe URI to trace
    - -

    Returns

    - -

    0 on success, non-zero on failure. - -

    Description

    - -

    The httpTrace() function sends a HTTP TRACE request to the -server. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -
    -httpTrace(http, "/some/uri");
    -
    - -

    See Also

    - -httpConnect(), -httpSetField(), -httpUpdate() - - -

    httpUpdate()

    - -

    Usage

    - -
    -http_status_t
    -httpUpdate(http_t *http);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    - -

    Returns

    - -

    The HTTP status of the current request. - -

    Description

    - -

    The httpUpdate() function updates the current request status. -It is used after any DELETE, GET, HEAD, OPTIONS, POST, PUT, or TRACE -request to finalize the HTTP request and retrieve the request status. - -

    Since proxies and the current blocking mode can cause the request to -take longer, programs should continue calling httpUpdate() -until the return status is not the constant value HTTP_CONTINUE. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -http_status_t status;
    -
    -httpGet(http, "/some/uri");
    -while ((status = httpUpdate(http)) == HTTP_CONTINUE);
    -printf("Request status is %d\n", status);
    -
    - -

    See Also

    - -httpConnect(), -httpDelete(), -httpGet(), -httpHead(), -httpOptions(), -httpPost(), -httpPut(), -httpTrace() - - -

    httpWrite()

    - -

    Usage

    - -
    -int
    -httpWrite(http_t *http,
    -          char   *buffer,
    -          int    length);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    bufferThe buffer to read into
    lengthThe number of bytes to read
    - -

    Returns

    - -

    The number of bytes read or -1 on error. - -

    Description

    - -

    The httpWrite() function reads data from the HTTP connection, -possibly the result of a GET or POST request. - -

    Example

    - -
    -#include <cups/http.h>
    -
    -http_t *http;
    -FILE *fp;
    -char buffer[1024];
    -int  bytes;
    -
    -httpPost(http, "/");
    -
    -while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
    -  httpWrite(http, buffer, bytes);
    -
    -while (httpUpdate(http) != HTTP_CONTINUE);
    -
    -while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
    -{
    -  buffer[bytes] = '\0';
    -  fputs(buffer, stdout);
    -}
    -
    - -

    See Also

    - -httpConnect(), -httpRead() - - -

    ippAddBoolean()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddBoolean(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              const char *name,
    -	      char       value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    valueThe boolean value
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddBoolean() function adds a single boolean attribute -value to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "my-jobs", 1);
    -
    - -

    See Also

    - -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddBooleans()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddBooleans(ipp_t      *ipp,
    -               ipp_tag_t  group,
    -               const char *name,
    -               int        num_values,
    -               const char *values);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of values
    valuesThe boolean values
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddBooleans() function adds one or more boolean -attribute values to the specified IPP request. If the -values pointer is NULL then an array of -num_values false values is created. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -char values[10];
    -
    -ippAddBooleans(ipp, IPP_TAG_OPERATION, "some-attribute", 10, values);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddDate()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddDate(ipp_t       *ipp,
    -           ipp_tag_t   group,
    -           const char  *name,
    -           ipp_uchar_t *value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    valueThe date value
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddDate() function adds a single date-time attribute -value to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddDate(ipp, IPP_TAG_OPERATION, "some-attribute", 
    -           ippTimeToDate(time(NULL));
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings(), -ippTimeToDate() - - -

    ippAddInteger()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddInteger(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              ipp_tag_t  tag,
    -              const char *name,
    -              int        value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of integer value (IPP_TAG_INTEGER or IPP_TAG_ENUM)
    nameThe name of attribute
    valueThe integer value
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddInteger() function adds a single integer attribute -value to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddInteger(ipp, IPP_TAG_OPERATION, "limit", 100);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddIntegers()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddIntegers(ipp_t      *ipp,
    -               ipp_tag_t  group,
    -               ipp_tag_t  tag,
    -               const char *name,
    -               int        num_values,
    -               const int  *values);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of integer value (IPP_TAG_INTEGER or IPP_TAG_ENUM)
    nameThe name of attribute
    num_valuesThe number of values
    valuesThe integer values
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddIntegers() function adds one or more integer -attribute values to the specified IPP request. If the -values pointer is NULL then an array of -num_values 0 values is created. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int values[100];
    -
    -ippAddIntegers(ipp, IPP_TAG_OPERATION, "some-attribute", 100, values);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddRange()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddRange(ipp_t      *ipp,
    -            ipp_tag_t  group,
    -            const char *name,
    -            int        low,
    -            int        high);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    lowThe lower value
    highThe higher value
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddRange() function adds a single range attribute -value to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddRange(ipp, IPP_TAG_OPERATION, "page-ranges", 1, 10);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddRanges()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddRanges(ipp_t      *ipp,
    -             ipp_tag_t  group,
    -             const char *name,
    -             int        num_values,
    -             const int  *lows,
    -             const int  *highs);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of range values
    lowsThe lower values
    highsThe higher values
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddRanges() function adds one or more range -attribute values to the specified IPP request. If the -values pointer is NULL then an array of -num_values 0,0 ranges is created. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int lows[2];
    -int highs[2];
    -
    -ippAddRanges(ipp, IPP_TAG_OPERATION, "page-ranges", 2, lows, highs);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddResolution()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddResolution(ipp_t      *ipp,
    -                 ipp_tag_t  group,
    -                 const char *name,
    -                 int        xres,
    -                 int        yres,
    -                 ipp_res_t  units);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    xresThe horizontal resolution
    yresThe vertical resolution
    unitsThe resolution units
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddResolution() function adds a single resolution attribute -value to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolution",
    -              720, 720, IPP_RES_PER_INCH);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddResolutions()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddResolutions(ipp_t           *ipp,
    -                  ipp_tag_t       group,
    -                  const char      *name,
    -                  int             num_values,
    -                  const int       *xres,
    -                  const int       *yres,
    -                  const ipp_res_t *units);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    nameThe name of attribute
    num_valuesThe number of resolution values
    xresThe horizontal resolutions
    yresThe vertical resolutions
    unitsThe resolution units
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddResolutions() function adds one or more -resolution attribute values to the specified IPP request. If the -values pointer is NULL then an array of -num_values 0,0 resolutions is created. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -int xres[5];
    -int yres[5];
    -ipp_res_t units[5];
    -
    -ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolutions-supported",
    -              5, xres, yres, units);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddSeparator(), -ippAddString(), -ippAddStrings() - - -

    ippAddSeparator()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddSeparator(ipp_t *ipp);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    - -

    Returns

    - -

    A pointer to the new separator or NULL if the separator could not be -created. - -

    Description

    - -

    The ippAddSeparator() function adds a group separator -to the specified IPP request. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddSeparator(ipp);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddString(), -ippAddStrings() - - -

    ippAddString()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddString(ipp_t      *ipp,
    -             ipp_tag_t  group,
    -             ipp_tag_t  tag,
    -             const char *name,
    -             const char *charset,
    -             const char *value);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of string value
    nameThe name of attribute
    charsetThe character set for the string
    valueThe string value
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddString() function adds a single string attribute -value to the specified IPP request. For IPP_TAG_NAMELANG and -IPP_TAG_TEXTLANG strings, the charset value is provided with -the string to identify the string encoding used. Otherwise the charset value -is ignored. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
    -             NULL, "abc123");
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddStrings() - - -

    ippAddStrings()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippAddStrings(ipp_t      *ipp,
    -              ipp_tag_t  group,
    -              ipp_tag_t  tag,
    -              const char *name,
    -              int        num_values,
    -              const char *charset,
    -              const char **values);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request
    groupThe IPP group
    tagThe type of string value
    nameThe name of attribute
    num_valuesThe number of strings
    charsetThe character set for the strings
    valuesThe string values
    - -

    Returns

    - -

    A pointer to the new attribute or NULL if the attribute could not be -created. - -

    Description

    - -

    The ippAddStrings() function adds one or more string -attribute values to the specified IPP request. For -IPP_TAG_NAMELANG and IPP_TAG_TEXTLANG -strings, the charset value is provided with the strings to identify the -string encoding used. Otherwise the charset value is ignored. If the -values pointer is NULL then an array of -num_values NULL strings is created. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -char *values[2] = { "one", "two" };
    -
    -ippAddStrings(ipp, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "attr-name",
    -              2, NULL, values);
    -
    - -

    See Also

    - -ippAddBoolean(), -ippAddBooleans(), -ippAddDate(), -ippAddInteger(), -ippAddIntegers(), -ippAddRange(), -ippAddRanges(), -ippAddResolution(), -ippAddResolutions(), -ippAddSeparator(), -ippAddString() - - -

    ippDateToTime()

    - -

    Usage

    - -
    -time_t
    -ippDateToTime(const ipp_uchar_t date[11]);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    dateThe IPP date-time value
    - -

    Returns

    - -

    A UNIX time value. - -

    Description

    - -

    The ippDateToTime() function converts an IPP date-time value -to a UNIX time value. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_uchar_t date[11];
    -
    -printf("UNIX time is %d\n", ippDateToTime(date));
    -
    - -

    See Also

    - -ippTimeToDate() - - -

    ippDelete()

    - -

    Usage

    - -
    -void
    -ippDelete(ipp_t *ipp);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    - -

    Description

    - -

    The ippDelete() function deletes all memory used by an IPP -request or response. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ippDelete(ipp);
    -
    - -

    See Also

    - -ippNew() - - -

    ippErrorString()

    - -

    Usage

    - -
    -const char *
    -ippErrorString(ipp_status_t error);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    errorIPP error code.
    - -

    Returns

    - -

    The standard text representation of the IPP error code. - -

    Description

    - -

    ippErrorString() returns the standard text representation -of the IPP error code. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -puts(ippErrorString(IPP_OK));
    -
    - -

    See Also

    - -

    -cupsLastError() - - -

    ippFindAttribute()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippFindAttribute(ipp_t      *ipp,
    -                 const char *name,
    -                 ipp_tag_t  tag);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    nameThe name of the attribute
    tagThe required value tag for the attribute or - IPP_TAG_ZERO for any type of value.
    - -

    Returns

    - -

    A pointer to the first occurrence of the requested attribute, or -NULL if it was not found. - -

    Description

    - -

    ippFindAttribute() finds the first occurrence of the named -attribute. The tag parameter restricts the search to a specific -value type - use IPP_TAG_ZERO to find any value with the name. - -

    The value tags IPP_TAG_NAME and IPP_TAG_TEXT -match the name/text values with or without the language code. - -

    Example

    - -
    -ipp_attribute_t *attr;
    -
    -attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -while (attr != NULL)
    -{
    -  puts(attr->values[0].string.text);
    -
    -  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -}
    -
    - -

    See Also

    - -cupsDoFileRequest(), -cupsDoRequest(), -ippDelete(), -ippFindNextAttribute(), -ippNew() - - -

    ippFindNextAttribute()

    - -

    Usage

    - -
    -ipp_attribute_t *
    -ippFindNextAttribute(ipp_t      *ipp,
    -                     const char *name,
    -                     ipp_tag_t  tag);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    nameThe name of the attribute
    tagThe required value tag for the attribute or - IPP_TAG_ZERO for any type of value.
    - -

    Returns

    - -

    A pointer to the next occurrence of the requested attribute, or -NULL if it was not found. - -

    Description

    - -

    ippFindNextAttribute() finds the next occurrence of the named -attribute. The tag parameter restricts the search to a specific -value type - use IPP_TAG_ZERO to find any value with the name. - -

    The value tags IPP_TAG_NAME and IPP_TAG_TEXT -match the name/text values with or without the language code. - -

    Example

    - -
    -ipp_attribute_t *attr;
    -
    -attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -while (attr != NULL)
    -{
    -  puts(attr->values[0].string.text);
    -
    -  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
    -}
    -
    - -

    See Also

    - -cupsDoFileRequest(), -cupsDoRequest(), -ippDelete(), -ippFindNextAttribute(), -ippNew() - - -

    ippLength()

    - -

    Usage

    - -
    -int
    -ippLength(ipp_t *ipp);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ippThe IPP request or response
    - -

    Returns

    - -

    The total encoded length of the IPP request or response in bytes. - -

    Description

    - -

    ippLength() returns the length of the IPP request or -response in bytes. - -

    Example

    - -
    -printf("The length of the response is %d bytes.\n", ippLength(response));
    -
    - -

    See Also

    - -ippDelete(), -ippNew() - - -

    ippNew()

    - -

    Usage

    - -
    -ipp_t *
    -ippNew(void);
    -
    - -

    Returns

    - -

    A pointer to a new IPP request or response. - -

    Description

    - -

    The ippNew() function creates a new IPP request or response. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_t *ipp;
    -
    -ipp = ippNew();
    -
    - -

    See Also

    - -ippDelete() - - -

    ippPort()

    - -

    Usage

    - -
    -int
    -ippPort(void);
    -
    - -

    Returns

    - -

    The default TCP/IP port number for IPP requests. - -

    Description

    - -

    The ippPort() function returns the default IPP port number -for requests. - -

    Example

    - -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -
    -http = httpConnect(cupsServer(), ippPort());
    -
    - -

    See Also

    - -cupsServer(), -ippSetPort() - - -

    ippRead()

    - -

    Usage

    - -
    -ipp_state_t
    -ippRead(http_t *http,
    -        ipp_t  *ipp);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    ippThe IPP request or response
    - -

    Returns

    - -

    The current read state. - -

    Description

    - -

    The ippRead() function reads IPP attributes from the specified -HTTP connection. Programs should continue calling ippRead() until -IPP_ERROR or IPP_DATA is returned. - -

    Example

    - -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -ipp_t *ipp;
    -ipp_state_t status;
    -
    -ipp = ippNew();
    -
    -while ((status = ippRead(http, ipp)) != IPP_ERROR)
    -  if (status == IPP_DATA)
    -    break;
    -
    -if (status == IPP_DATA)
    -{
    -  ... read additional non-IPP data using httpRead() ...
    -}
    -
    - -

    See Also

    - -ippWrite() - - -

    ippSetPort()

    - -

    Usage

    - -
    -void
    -ippSetPort(int port);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    portThe port number to use
    - -

    Description

    - -

    The ippSetPort() function sets the default IPP port number -for requests. - -

    Example

    - -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -...
    -
    -ippSetPort(8631);
    -
    - -

    See Also

    - -ippPort() - - -

    ippTimeToDate()

    - -

    Usage

    - -
    -ipp_uchar_t *
    -ippTimeToDate(time_t time);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    timeThe UNIX time value
    - -

    Returns

    - -

    A static pointer to an IPP date-time value. - -

    Description

    - -

    The ippTimeToDate() function converts a UNIX time to an IPP -date-time value. - -

    Example

    - -
    -#include <cups/ipp.h>
    -
    -ipp_uchar_t *date;
    -
    -date = ippTimeToDate(time(NULL));
    -
    - -

    See Also

    - -ippDateToTime() - - -

    ippWrite()

    - -

    Usage

    - -
    -ipp_state_t
    -ippWrite(http_t *http,
    -         ipp_t  *ipp);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    httpThe HTTP connection
    ippThe IPP request or response
    - -

    Returns

    - -

    The current write state. - -

    Description

    - -

    The ippWrite() function writes IPP attributes to the specified -HTTP connection. Programs should continue calling ippWrite() until -IPP_ERROR or IPP_DATA is returned. - -

    Example

    - -
    -#include <cups/http.h>
    -#include <cups/ipp.h>
    -
    -http_t *http;
    -ipp_t *ipp;
    -ipp_state_t status;
    -
    -ipp = ippNew();
    -... add attributes ...
    -
    -while ((status = ippWrite(http, ipp)) != IPP_ERROR)
    -  if (status == IPP_DATA)
    -    break;
    -
    -if (status == IPP_DATA)
    -{
    -  ... read additional non-IPP data using httpWrite() ...
    -}
    -
    - -

    See Also

    - -ippRead() - - -

    ppdClose()

    - -

    Usage

    - -
    -void
    -ppdClose(ppd_file_t *ppd);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    - -

    Description

    - -

    The ppdClose() function frees all memory associated with the -PPD file. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdClose(ppd);
    -
    - -

    See Also

    - -ppdOpen(), -ppdOpenFd(), -ppdOpenFile() - - -

    ppdCollect()

    - -

    Usage

    - -
    -int
    -ppdCollect(ppd_file_t    *ppd,
    -           ppd_section_t section,
    -           ppd_choice_t  ***choices);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file.
    sectionThe document section to collect.
    choicesThe array of option choices that are marked.
    - -

    Returns

    - -

    The number of options collected. - -

    Description

    - -

    ppdCollect() collects all of the marked options in the -specified section, sorts them by their order dependency values, and -returns an array that can be used to emit option commands in the proper -order. It is normally used by the ppdEmit*() functions. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t   *ppd;
    -int          num_choices;
    -ppd_choice_t **choices;
    -
    -...
    -
    -num_choices = ppdCollect(ppd, PPD_ORDER_JCL, &choices);
    -
    - -

    See Also

    - -

    -ppdEmit(), -ppdEmitFd(), -ppdEmitJCL() - - -

    ppdConflicts()

    - -

    Usage

    - -
    -int
    -ppdConflicts(ppd_file_t *ppd);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    - -

    Returns

    - -

    The number of option conflicts in the file. - -

    Description

    - -

    The ppdConflicts() function returns the number of conflicts -with the currently selected options. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("%d conflicts\n", ppdConflicts(ppd));
    -
    - -

    See Also

    - -cupsMarkOptions(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdEmit()

    - -

    Usage

    - -
    -int
    -ppdEmit(ppd_file_t    *ppd,
    -        FILE          *file,
    -        ppd_section_t section);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    fileThe file to write to
    sectionThe option section to write
    - -

    Returns

    - -

    0 on success, -1 on error. - -

    Description

    - -

    The ppdEmit() function sends printer-specific option -commands to the specified file. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdEmit(ppd, stdout, PPD_ORDER_PAGE);
    -
    - -

    See Also

    - -ppdEmitFd() - - -

    ppdEmitFd()

    - -

    Usage

    - -
    -int
    -ppdEmitFd(ppd_file_t    *ppd,
    -          int           fd,
    -          ppd_section_t section);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    fdThe file descriptor to write to
    sectionThe option section to write
    - -

    Returns

    - -

    0 on success, -1 on error. - -

    Description

    - -

    The ppdEmitFd() function sends printer-specific option -commands to the specified file descriptor. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdEmitFd(ppd, 1, PPD_ORDER_PAGE);
    -
    - -

    See Also

    - -ppdEmit() - - -

    ppdFindChoice()

    - -

    Usage

    - -
    -ppd_choice_t *
    -ppdFindChoice(ppd_option_t *option,
    -              const char   *choice);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    optionA pointer to the option
    choiceThe name of the choice
    - -

    Returns

    - -

    A pointer to the choice data or NULL if the choice does not exist. - -

    Description

    - -

    The ppdFindChoice() function returns a pointer to the choice -data for the specified option. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_option_t *option;
    -ppd_choice_t *choice;
    -
    -option = ppdFindOption(ppd, "PageSize");
    -choice = ppdFindChoice(option, "Letter");
    -
    - -

    See Also

    - -ppdFindMarkedChoice(), -ppdFindOption() - - -

    ppdFindMarkedChoice()

    - -

    Usage

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

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    - -

    Returns

    - -

    A pointer to the choice data or NULL if the choice does not exist or -is not marked. - -

    Description

    - -

    The ppdFindMarkedChoice() function returns a pointer to -the marked choice data for the specified option. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_choice_t *choice;
    -
    -choice = ppdFindMarkedChoice(ppd, "PageSize");
    -
    - -

    See Also

    - -ppdFindChoice(), -ppdFindOption() - - -

    ppdFindOption()

    - -

    Usage

    - -
    -ppd_option_t *
    -ppdFindOption(ppd_file_t *ppd,
    -              const char *keyword);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    - -

    Returns

    - -

    A pointer to the option data or NULL if the option does not exist. - -

    Description

    - -

    The ppdFindOption() function returns a pointer to the option -data for the specified option. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_option_t *option;
    -
    -option = ppdFindOption(ppd, "PageSize");
    -
    - -

    See Also

    - -ppdFindChoice(), -ppdFindMarkedChoice() - - -

    ppdIsMarked()

    - -

    Usage

    - -
    -int
    -ppdIsMarked(ppd_file_t *ppd,
    -            const char *keyword,
    -            const char *choice);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    choiceThe name of the option choice
    - -

    Returns

    - -

    1 if the choice is marked, 0 otherwise. - -

    Description

    - -

    The ppdIsMarked() function returns whether or not the -specified option choice is marked. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Letter size %s selected.\n",
    -       ppdIsMarked(ppd, "PageSize", "Letter") ? "is" : "is not");
    -
    - -

    See Also

    - -cupsMarkOptions(), -ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdMarkDefaults()

    - -

    Usage

    - -
    -void
    -ppdMarkDefaults(ppd_file_t *ppd);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    - -

    Description

    - -

    The ppdMarkDefaults() function marks all of the default -choices in the PPD file. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdMarkDefaults(ppd);
    -
    - -

    See Also

    - -cupsMarkOptions(), -ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdMarkOption()

    - -

    Usage

    - -
    -int
    -ppdMarkOption(ppd_file_t *ppd,
    -              const char *keyword,
    -              const char *choice);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    keywordThe name of the option
    choiceThe name of the choice
    - -

    Returns

    - -

    The number of conflicts in the PPD file. - -

    Description

    - -

    The ppdMarkOption() function marks the specified option -choice. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppdMarkOption(ppd, "PageSize", "Letter");
    -
    - -

    See Also

    - -cupsMarkOptions(), -ppdConflicts(), -ppdIsMarked(), -ppdMarkDefaults(), -ppdMarkOption() - - -

    ppdOpen()

    - -

    Usage

    - -
    -ppd_file_t *
    -ppdOpen(FILE *file);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    fileThe file to read from
    - -

    Returns

    - -

    A pointer to a PPD file structure or NULL if the PPD file could not be -read. - -

    Description

    - -

    The ppdOpen() function reads a PPD file from the specified -file into memory. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -FILE *file;
    -
    -file = fopen("filename.ppd", "rb");
    -ppd = ppdOpen(file);
    -fclose(file);
    -
    - -

    See Also

    - -ppdClose(), -ppdOpenFd(), -ppdOpenFile() - - -

    ppdOpenFd()

    - -

    Usage

    - -
    -ppd_file_t *
    -ppdOpenFd(int fd);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    fdThe file descriptor to read from
    - -

    Returns

    - -

    A pointer to a PPD file structure or NULL if the PPD file could not be -read. - -

    Description

    - -

    The ppdOpenFd() function reads a PPD file from the specified -file descriptor into memory. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -int        fd;
    -
    -fd = open("filename.ppd", O_RDONLY);
    -ppd = ppdOpenFd(fd);
    -close(fd);
    -
    - -

    See Also

    - -ppdClose(), -ppdOpen(), -ppdOpenFile() - - -

    ppdOpenFile()

    - -

    Usage

    - -
    -ppd_file_t *
    -ppdOpenFile(const char *filename);
    -
    - -

    Arguments

    - -
    - - - - - - - - -
    ArgumentDescription
    filenameThe name of the file to read from
    - -

    Returns

    - -

    A pointer to a PPD file structure or NULL if the PPD file could not be -read. - -

    Description

    - -

    The ppdOpenFile() function reads a PPD file from the named -file into memory. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -ppd = ppdOpenFile("filename.ppd");
    -
    - -

    See Also

    - -ppdClose(), -ppdOpen(), -ppdOpenFd() - - -

    ppdPageLength()

    - -

    Usage

    - -
    -float
    -ppdPageLength(ppd_file_t *ppd,
    -              const char *name);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    - -

    Returns

    - -

    The length of the specified page size in points or 0 if the page size -does not exist. - -

    Description

    - -

    The ppdPageLength() function returns the page length of the -specified page size. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Length = %.0f\n", ppdPageLength(ppd, "Letter"));
    -
    - -

    See Also

    - -ppdPageLength(), -ppdPageSize(), -ppdPageWidth() - - -

    ppdPageSize()

    - -

    Usage

    - -
    -ppd_size_t *
    -ppdPageSize(ppd_file_t *ppd,
    -            const char *name);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    - -

    Returns

    - -

    A pointer to the page size record of the specified page size in -points or NULL if the page size does not exist. - -

    Description

    - -

    The ppdPageSize() function returns the page size record for the -specified page size. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -ppd_size_t *size;
    -
    -size = ppdPageSize(ppd, "Letter");
    -if (size != NULL)
    -{
    -  printf(" Width = %.0f\n", size->width);
    -  printf("Length = %.0f\n", size->length);
    -  printf("  Left = %.0f\n", size->left);
    -  printf(" Right = %.0f\n", size->right);
    -  printf("Bottom = %.0f\n", size->bottom);
    -  printf("   Top = %.0f\n", size->top);
    -}
    -
    - -

    See Also

    - -ppdPageLength(), -ppdPageWidth() - - -

    ppdPageWidth()

    - -

    Usage

    - -
    -float
    -ppdPageWidth(ppd_file_t *ppd,
    -             const char *name);
    -
    - -

    Arguments

    - -
    - - - - - - - - - - - - -
    ArgumentDescription
    ppdThe PPD file
    nameThe name of the page size
    - -

    Returns

    - -

    The width of the specified page size in points or 0 if the page size -does not exist. - -

    Description

    - -

    The ppdPageWidth() function returns the page width of the -specified page size. - -

    Example

    - -
    -#include <cups/ppd.h>
    -
    -ppd_file_t *ppd;
    -
    -printf("Width = %.0f\n", ppdPageWidth(ppd, "Letter"));
    -
    - -

    See Also

    - -ppdPageLength(), -ppdPageSize() - - - - diff --git a/doc/sps.html b/doc/sps.html deleted file mode 100644 index 90b032fa8..000000000 --- a/doc/sps.html +++ /dev/null @@ -1,297 +0,0 @@ - - - -CUPS Software Performance Specification - - - - - - - -

    -

    CUPS Software Performance Specification


    -CUPS-SPS-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Programs -
    -
    4 Scheduler Objects -
    -
    A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This software performance specification provides an analysis of the - memory, disk, and processor utilitization of each program in the Common - UNIX Printing System ("CUPS") Version 1.2.

    -

    For the purposes of comparison, all figures are for the Linux Intel - platform. Memory utilization on other platforms should be similar.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This software performance specification is organized into the - following sections:

    -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Programs
    • -
    • 4 - Scheduler Objects
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Programs

    -

    The following table describes the average memory, disk, and CPU usage - of each program in CUPS.

    -

    The base memory column shows the initial memory requirements for each - program, including any shared libraries that are provided by CUPS.

    -

    The max memory column shows the maximum amount of memory that will be - used by the program based upon the default configuration settings - supplied with CUPS.

    -

    The temp files column indicates whether any temporary files are - created.

    -

    The CPU usage column specifies a relative CPU usage by the program - under normal conditions, either low, medium, or high. Low usage - indicates that the program will never use more than 33% of the - available CPU time. Medium usage indicates the program will use as much - as 66% of the available CPU time. High usage indicates the program uses - 66% or more of the available CPU time. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Backends
    ProgramBase MemoryMax MemoryTemp - FilesCPU Usage
    ipp91k256kUp to size of print file -Low
    lpd89k89kUp to size of print file -Low
    parallel85k85kUp to size of print - fileLow
    serial85k85kUp to size of print file -Low
    socket85k85kUp to size of print file -Low
    usb85k85kUp to size of print file -Low
    CGIs
    ProgramBase MemoryMax MemoryTemp - FilesCPU Usage
    admin.cgi107k256kUp to size of PPD - fileMedium
    classes.cgi95kSize of class objects -NoneMedium
    jobs.cgi93kSize of job objectsNone -Medium
    printers.cgi95kSize of printer objects -NoneMedium
    Command-Line Programs
    ProgramBase MemoryMax MemoryTemp - FilesCPU Usage
    accept88k128kNoneLow
    cancel88k128kNoneLow
    disable88k128kNoneLow
    enable88k128kNoneLow
    lp90k256kNoneLow
    lpadmin148k256kNoneLow
    lpc86kSize of job and printer objects -NoneMedium
    lpinfo89kSize of device and PPD objects -NoneMedium
    lpmove88k128kNoneLow
    lpoptions89k128kNoneLow
    lppasswd90k90kNoneLow
    lpq87kSize of job objectsNone -Medium
    lpr87k256kNoneLow
    lprm84k128kNoneLow
    lpstat119kSize of job, printer, and class - objectsNoneMedium
    reject88k128kNoneLow
    Daemons
    ProgramBase MemoryMax MemoryTemp - FilesCPU Usage
    cups-lpd92k256kOne file per control - or data file from clientLow
    cupsd308kSee Scheduler Requirements -See Scheduler RequirementsMedium
    cups-polld84kSize of printer and class objects -NoneLow
    Filters
    ProgramBase MemoryMax MemoryTemp - FilesCPU Usage
    hpgltops263k320kNoneMedium
    imagetops628k10MSwap file for - uncompressed image dataMedium
    imagetoraster652k10MSwap file for - uncompressed image dataHigh
    pstops775k840kUp to size of print - fileMedium
    pstoraster4M14MSwap file for command - listsHigh
    rastertoepson693k1MNoneLow
    rastertohp690k1MNoneLow
    texttops638k4*cols*rowsNone -Low
    -
    -

    -

    4 Scheduler Objects

    -

    The cupsd program is the CUPS scheduler process. It - manages many interdependent server objects that are used to manage and - print files to printers.

    -

    The following table provides the memory and disk cost associated with - each server object. -

    - - - - - - - - - - - - - - - -
    ObjectMemory PerDisk Per
    Browse ACL1k120
    Browse Poll2480
    Browse Relay2880
    Certificate7632
    Class9k200
    Client13k-
    Device256-
    Job2k1k + size of document files
    Location ACL1k120
    MIME Filter26880
    MIME Type34080
    PPD200656
    Printer11k32k
    -
    -

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/sps.pdf b/doc/sps.pdf deleted file mode 100644 index 8a0dfa1a2f25702a95c894a8367052b822655f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 41182 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

    p2uF| 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 x3_)Nc2n22bhXBz|(FYu#N{Li{|_@q=RyDg diff --git a/doc/ssr.html b/doc/ssr.html deleted file mode 100644 index a943892be..000000000 --- a/doc/ssr.html +++ /dev/null @@ -1,275 +0,0 @@ - - - -CUPS Software Security Report - - - - - - - -


    -

    CUPS Software Security Report


    -CUPS-SSR-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Local Access Risks - -4 Remote Access Risks - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This software security report provides an analysis of possible - security concerns for the Common UNIX Printing System ("CUPS") Version - 1.2.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This software security report is organized into the following - sections:

    -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Local Access Risks
    • -
    • 4 - Remote Access Risks
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Local Access Risks

    -

    Local access risks are those that can be exploited only with a local - user account. This section does not address issues related to - dissemination of the root password or other security issues associated - with the UNIX operating system.

    -

    3.1 Security Breaches

    -

    There is one known security vulnerability with local access:

    -
      -
    1. Device URIs are passed to backend filters in argv[0] and in an - environment variable. Since device URIs can contain usernames and - passwords it may be possible for a local user to gain access to a - remote resource. -

      We recommend that any password-protected accounts used for remote - printing have limited access priviledges so that the possible damages - can be minimized.

      -

      The device URI is "sanitized" (the username and password are removed) - when sent to an IPP client so that a remote user cannot exploit this - vulnerability.

      -
    2. -
    -

    4 Remote Access Risks

    -

    Remote access risks are those that can be exploited without a local - user account and/or from a remote system. This section does not address - issues related to network or firewall security.

    -

    4.1 Denial of Service Attacks

    -

    Like all Internet services, the CUPS server is vulnerable to denial - of service attacks, including:

    -
      -
    1. Establishing multiple connections to the server until the server - will accept no more. -

      This cannot be protected against by the current software. It is - possible that future versions of the CUPS software could be configured - to limit the number of connections allowed from a single host, however - that still would not prevent a distributed attack.

      -
    2. Repeatedly opening and closing connections to the server as fast as - possible. -

      There is no easy way of protecting against this in the CUPS software. - If the attack is coming from outside the local network it might be - possible to filter such an attack, however once the connection request - has been received by the server it must at least accept the connection - to find out who is connecting.

      -
    3. Flooding the network with broadcast packets on port 631. -

      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.

      -
    4. Sending partial IPP requests; specifically, sending part of an - attribute value and then stopping transmission. -

      The current code is structured to read and write the IPP request data - on-the-fly, so there is no easy way to protect against this for large - attribute values.

      -
    5. Sending large/long print jobs to printers, preventing other users - from printing. -

      There are limited facilities for protecting against large print jobs - (the MaxRequestSize attribute), however this will not - protect printers from malicious users and print files that generate - hundreds or thousands of pages. In general, we recommend restricting - printer access to known hosts or networks, and adding user-level access - control as needed for expensive printers.

      -
    6. - - - - -
    -

    4.2 Security Breaches

    -

    The current CUPS server supports Basic, Digest, and local certificate - authentication:

    -
      -
    1. Basic authentication essentially places the clear text of the - username and password on the network. Since CUPS uses the UNIX username - and password account information, the authentication information could - be used to gain access to accounts (possibly priviledged accounts) on - the server.
    2. -
    3. 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. However, 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. The next minor release of CUPS - will support Digest authentication of the entire message body, - effectively stopping these methods of attack.
    4. -
    5. Local certificate authentication passes 128-bit "certificates" that - identify an authenticated user. Certificates are created on-the-fly - from random data and stored in files under /etc/cups/certs -. They have restricted read permissions: root + system for the root - certificate, and lp + system for CGI certificates. Because certificates - are only available on the local system, the CUPS server does not accept - local authentication unless the client is connected to the localhost - address (127.0.0.1.)
    6. -
    -

    The default CUPS configuration disables remote administration. We do - not recommend that remote administration be enabled for all hosts. - However, if you have a trusted network or subnet, access can be - restricted accordingly. Also, we highly recommend using Digest - authentication when possible. Unfortunately, most web browsers do not - support Digest authentication at this time.

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/ssr.pdf b/doc/ssr.pdf deleted file mode 100644 index 329cd173ef70d413ef1396a37381fd63acf4ca15..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 39878 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%0AE6{>8ehu|XDm2_sLr;f(|AV`skFetp=I&kt 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%0Ag>YxCQ)^?;Ro># z7NHQJ|HI+uUynM!vf6|I0MQ40PbJBSF&J_4kt%^lK2y1Ai+z0edujSVlX6X+ zv^SWEr&B1^P;@^Z&_7+@*_u9Hw7NJkL3f&1Y8OYgxA_Xl;KzMd!Ws;0_nL-NEn*^_sOh(eXdOf439dKA>8XvDz!9=-IJ(nZ$V zSsh7mBJ!&}uC(8^EbY0^WXttIZ6Ot4+Fl7_kvq?|+{9&e3n>sX(S<$7 zt|vil8>ONg+u>TYR5qZ0j>MNCFWspo44B#~o?>WYa;iA+iQk8mX6bdh=+t9z{r#zo zD(p$;6vy+;vYWAe7xBb22qm94h|&zw>;MEtaK;>Yt~Ko(--gs|Cf}}3YiAa>9%B!T zr&&MmS?Xl17%*9Mee*`c(un@*alFQqrqyobFCilhkgw={6O)JtOzB6BzBMyd?LZI07 zah~%d<9V{RoUhq)nuxxwMzR?E4n2?!$rwjgHC9}6Z)m(|sc7V0;*yqC zbBnW7ovAAQh59yER!+V|u}o9rD)y|aoGfNlod5mDN#y;crQrQ&?XfzZD-vVx6!N1^ z6^#W|hG zXqH38W3%{{SsZu1XOpuZyfg%*HUcu3s@F(;bz;23DNhanM+UnbS9bLS(e>sZtcxK2 zH}}237-0W&y8A0jCNSVnzD!PumA4-S5Ohu+kh^`kdhenfZUlsoo!6vN(ydl?L|&1o z)2N2kAk9nSoxzHg?PB;9v1=OxIu%*R3;uwovbY0`q0G+DYiSvP&(Flc2UN;SYpw3FcAh7rw{QLmm%%<0)QQRw!K8Ns<YpOem+6a_x(;vM&o#I4us=F^iNkg;dytxBr$ zZd#iA_(?m%{v>8Yntgk;Y^CxOrAn#6qFC+*%X`+TJko9&cG=lUuYk#6N~@h|)_r6Y zN5hn~aX-V|42kr}hQ|%pjGZpvTh_%V<*?{Rq&U5xxl?%*5!3?*xPF1-@8uXu9Gekb z-M!VcWK?={%RsG^T19)%tzM=khtn;jDabd(v{7cVDWbEVAt(b_ ztN`j+ViBJ>8a*Q9&|@`0?_K|3Z4B{W*pGqurTrM7|L%Sa0OZ`GMC!}SG(NX6gWGerHum5A`=xmMBR((r>sBA@APdIBEAh6_Jc2wAAR|wmj5(_szV`VImN%i{!H~C#XLVqv= z{ZD2<46+U;NV~u6{4^{m4Db!DkRNQo{ynY0zi8$Bmez0kC740V+Ca~OLBIgTt388) zslEAMen9^Py?+MsN8s=uoZ>_e9QLh66u*i{14lbk2Ui9`lo*oL4Qk)^c*@~7b<{$;qZZ^8xs*t8Mo;ljT)i3(R3X=RGy7^QxSUptTi z%D#hxp25E`{WXu!pREe`eHw?~KmS{6pnpy7w^qJxSok|Y#1B@0zsU6OX_WqC`rGC$ zz#wK}ZEvq<=gRuCJX7D%`$Gc)qAAiJr2knoicuw`ou&OxOa8V`0)J3%AoxF(3_`UG zJ8LV~pBE1O)@|SqLi$Z=yx*oHLV6B*7S_hUAMXF>gyic7DLq$fM+Xi?Q!8T&Y@!1ovs4o15Uhyb8phxq#S$@drt@HHR9 z4;b)k+xr0n0ny3>fxix1KVo0gLVS|4 zLeO|YfW9Vp`2hp}1cN}(xI#dGg25nY@gg`OXj~!SKfw^tANfN~1)xAQ49E#W!$2Si z8U{wIa})+cFAsvo3ku^z$Do`rGz|8W@;K2rKxqaTjE*7D{X@Xf;y@Wj;{^yrYvZU6 z4gjKKa5SG$x1#ZfYT}$|7!&|T$KYtO0bx*dpE<#3u>s*gbpO!XGYUiJ9t1$3`3C}m z;piAAnq3eG1VG2o>kZX^LFgE|e;_b=9f2Sqbe|zGH10uA0D2ry^!5UR!qMY^fzjiD zaiYh;2}F;B6N(-O9Gz2Cm-(?gl*>?b?6)j7KVTp@`gQ0WfMDqD3Iv0pX$c4h2mQzk zh!X%ryB7`sqS=50VE{A?3`M^VU5h~oIP^zfz+bsR!$4?pfKmGLV>JK(he_q4i%d6aoRDV+b@GP;`v| zLpecc96;e9^zsm3wCi91^f+KZPIL@}rq5s)_$L??t*?SnGLFUzj1z{A!8y?}1iB4Q zAexq-Fa$aVf`8+SgPoqK1=0@hYsxlLH{{m|5r=}c_19_N@6VayRz}tgzs~^0g*A8} z`bY@G044D-xFJ-}0D?dm8XABNAOJ%E+(-`w;rq{5pq^Lo>>c#%9DbXFfl*TqDBg`5 JBC?`*{}1&5$2tH2 diff --git a/doc/ssr.shtml b/doc/ssr.shtml deleted file mode 100644 index 0eb283b65..000000000 --- a/doc/ssr.shtml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - CUPS Software Security Report - - - -

    Scope

    - -

    Identification

    - -

    This software security report provides an analysis of possible security -concerns for the Common UNIX Printing System ("CUPS") Version 1.2.

    - - - -

    Document Overview

    - -

    This software security report is organized into the following sections:

    - -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Local Access Risks
    • -
    • 4 - Remote Access Risks
    • -
    • A - Glossary
    • -
    - - - -

    Local Access Risks

    - -

    Local access risks are those that can be exploited only with a local user -account. This section does not address issues related to dissemination of the -root password or other security issues associated with the UNIX operating -system. - -

    Security Breaches

    - -

    There is one known security vulnerability with local access: - -

      - -
    1. Device URIs are passed to backend filters in argv[0] and in - an environment variable. Since device URIs can contain - usernames and passwords it may be possible for a local user to - gain access to a remote resource. - -

      We recommend that any password-protected accounts used for - remote printing have limited access priviledges so that the - possible damages can be minimized. - -

      The device URI is "sanitized" (the username and password are - removed) when sent to an IPP client so that a remote user - cannot exploit this vulnerability. - -

    - -

    Remote Access Risks

    - -

    Remote access risks are those that can be exploited without a local user -account and/or from a remote system. This section does not address issues -related to network or firewall security. - -

    Denial of Service Attacks

    - -

    Like all Internet services, the CUPS server is vulnerable to denial of -service attacks, including: - -

      - -
    1. Establishing multiple connections to the server until the server - will accept no more. - -

      This cannot be protected against by the current software. It - is possible that future versions of the CUPS software could be - configured to limit the number of connections allowed from a - single host, however that still would not prevent a distributed - attack. - -

    2. Repeatedly opening and closing connections to the server as fast - as possible. - -

      There is no easy way of protecting against this in the CUPS - software. If the attack is coming from outside the local - network it might be possible to filter such an attack, however - once the connection request has been received by the server it - must at least accept the connection to find out who is - connecting. - -

    3. Flooding the network with broadcast packets on port 631. - -

      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. - -

    4. Sending partial IPP requests; specifically, sending part of an - attribute value and then stopping transmission. - -

      The current code is structured to read and write the IPP - request data on-the-fly, so there is no easy way to protect - against this for large attribute values. - -

    5. Sending large/long print jobs to printers, preventing other users - from printing. - -

      There are limited facilities for protecting against large print - jobs (the MaxRequestSize attribute), however this will - not protect printers from malicious users and print files that - generate hundreds or thousands of pages. In general, we recommend - restricting printer access to known hosts or networks, and adding - user-level access control as needed for expensive printers. - -

    - -

    Security Breaches

    - -

    The current CUPS server supports Basic, Digest, and local certificate -authentication: - -

      - -
    1. Basic authentication essentially places the clear text of - the username and password on the network. Since CUPS uses the - UNIX username and password account information, the - authentication information could be used to gain access to - accounts (possibly priviledged accounts) on the server. - -
    2. 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. However, 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. The next minor release of CUPS will support - Digest authentication of the entire message body, effectively - stopping these methods of attack. - -
    3. Local certificate authentication passes 128-bit - "certificates" that identify an authenticated user. - Certificates are created on-the-fly from random data and stored - in files under /etc/cups/certs. They have - restricted read permissions: root + system for the root - certificate, and lp + system for CGI certificates. Because - certificates are only available on the local system, the CUPS - server does not accept local authentication unless the client - is connected to the localhost address (127.0.0.1.) - -
    - -

    The default CUPS configuration disables remote administration. We do -not recommend that remote administration be enabled for all hosts. -However, if you have a trusted network or subnet, access can be -restricted accordingly. - -Also, we highly recommend using Digest authentication when possible. -Unfortunately, most web browsers do not support Digest authentication -at this time. - - - - - diff --git a/doc/stp.html b/doc/stp.html deleted file mode 100644 index e354cd49a..000000000 --- a/doc/stp.html +++ /dev/null @@ -1,262 +0,0 @@ - - - -CUPS Software Test Plan - - - - - - - -


    -

    CUPS Software Test Plan


    -CUPS-STP-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Test Procedure -
    -
    4 IPP Compliance Tests - -5 Command Tests - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This software test plan provides detailed tests that are used to - evaluate the stability and compliance of the Common UNIX Printing - System ("CUPS") Version 1.2.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This software test plan is organized into the following sections:

    -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Test Procedure
    • -
    • 4 - IPP Compliance Tests
    • -
    • 5 - Command Tests
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Test Procedure

    -

    The test software and data files are located in the test - subdirectory of the source distribution. A script is provided to - compile the ipptest program and run all of the tests that - follow, producing a success/fail report.

    -

    The test target of the top-level makefile can be used to - run this script:

    -
      -
      -make test
      -
      -
    -

    or you can run the test script directly:

    -
      -
      -cd test
      -./run-stp-tests
      -
      -
    -

    A Software Test Report is stored in HTML and PDF files that are - generated using the HTMLDOC - software.

    -

    4 IPP Compliance Tests

    -

    This section describes the tests used to validate the IPP standards - compliance of the CUPS server.

    -

    4.1 Request Tests

    -

    These tests verify that the CUPS scheduler only accepts valid IPP - requests that start with the attributes-charset and -attributes-natural-language attributes and also contain a -printer-uri or job-uri attribute.

    -

    It also verifies that the CUPS scheduler always responds with -attributes-charset and attributes-natural-language - attributes, using default values if they are not provided by the - client.

    -

    4.2 CUPS Printer Operation Tests

    -

    These tests verify that the CUPS printer operations are supported and - function properly. Two printers called Test1 and -Test2 are created, one as a PostScript printer and one as a - raster printer.

    -

    4.3 Job Operation Tests

    -

    These test verify that the CUPS scheduler accepts print jobs for all - supported file formats and that the cancel-job, -hold-job, and resume-job operations work.

    -

    5 Command Tests

    -

    This section describes the tests used to validate the Berkeley and - System V commands included with CUPS.

    -

    5.1 lpadmin

    -

    This test verifies that printers can be added, modified, and - defaulted using the lpadmin command.

    -

    5.2 lpc

    -

    This test verifies that the lpc command can show the - current status of all print queues.

    -

    5.3 lpq

    -

    This test verifies that the lpq command lists any jobs - in the queue.

    -

    5.4 lpstat

    -

    This test verifies that the lpstat command works with - all reports using the "-t" option.

    -

    5.5 lp

    -

    This test verifies that the lp command works with both - the default destination and a specific destination.

    -

    5.6 lpr

    -

    This test verifies that the lpr command works with both - the default destination and a specific destination.

    -

    5.7 lprm

    -

    This test verifies that the lprm command can properly - cancel a job.

    -

    5.8 cancel

    -

    This test verifies that the cancel command can properly - cancel a job or all jobs.

    -

    5.9 lpinfo

    -

    This test verifies that the lpinfo command returns a - list of available printer drivers and devices.

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/stp.pdf b/doc/stp.pdf deleted file mode 100644 index 0037bd5e3bf1649b5860589b38410bceb35cc4c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 43329 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 - - - - - - CUPS Software Test Plan - - - -

    Scope

    - -

    Identification

    - -

    This software test plan provides detailed tests that are used -to evaluate the stability and compliance of the Common UNIX -Printing System ("CUPS") Version 1.2. - - - -

    Document Overview

    - -

    This software test plan is organized into the following sections: - -

      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Test Procedure
    • -
    • 4 - IPP Compliance Tests
    • -
    • 5 - Command Tests
    • -
    • A - Glossary
    • -
    - - - -

    Test Procedure

    - -

    The test software and data files are located in the test -subdirectory of the source distribution. A script is provided to compile -the ipptest program and run all of the tests that follow, -producing a success/fail report. - -

    The test target of the top-level makefile can be used to -run this script: - -

      -make test
      -
    - -

    or you can run the test script directly: - -

      -cd test
      -./run-stp-tests
      -
    - -

    A Software Test Report is stored in HTML and PDF files that -are generated using the -HTMLDOC software. - -

    IPP Compliance Tests

    - -

    This section describes the tests used to validate the IPP -standards compliance of the CUPS server. - -

    Request Tests

    - -

    These tests verify that the CUPS scheduler only accepts valid -IPP requests that start with the attributes-charset -and attributes-natural-language attributes and also -contain a printer-uri or job-uri attribute. - -

    It also verifies that the CUPS scheduler always responds with -attributes-charset and -attributes-natural-language attributes, using -default values if they are not provided by the client. - -

    CUPS Printer Operation Tests

    - -

    These tests verify that the CUPS printer operations are supported -and function properly. Two printers called Test1 and -Test2 are created, one as a PostScript printer and one -as a raster printer. - -

    Job Operation Tests

    - -

    These test verify that the CUPS scheduler accepts print jobs for -all supported file formats and that the cancel-job, -hold-job, and resume-job operations work. - -

    Command Tests

    - -

    This section describes the tests used to validate the -Berkeley and System V commands included with CUPS. - -

    lpadmin

    - -

    This test verifies that printers can be added, modified, and -defaulted using the lpadmin command. - -

    lpc

    - -

    This test verifies that the lpc command can show -the current status of all print queues. - -

    lpq

    - -

    This test verifies that the lpq command lists -any jobs in the queue. - -

    lpstat

    - -

    This test verifies that the lpstat command works -with all reports using the "-t" option. - -

    lp

    - -

    This test verifies that the lp command works -with both the default destination and a specific destination. - -

    lpr

    - -

    This test verifies that the lpr command works -with both the default destination and a specific destination. - -

    lprm

    - -

    This test verifies that the lprm command can -properly cancel a job. - -

    cancel

    - -

    This test verifies that the cancel command can -properly cancel a job or all jobs. - -

    lpinfo

    - -

    This test verifies that the lpinfo command -returns a list of available printer drivers and devices. - - - - - diff --git a/doc/sum.html b/doc/sum.html deleted file mode 100644 index 2135cb6d2..000000000 --- a/doc/sum.html +++ /dev/null @@ -1,1732 +0,0 @@ - - - -CUPS Software Users Manual - - - - - - - -


    -

    CUPS Software Users Manual


    -CUPS-SUM-1.2.0
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    Preface - -1 - Printing System Overview - -2 - Using the Printing System - -3 - Standard Printer Options - -4 - Saving Printer Options and Defaults - -A - Software License Agreement - -
    -

    Preface

    -

    This software users manual describes how to use the Common UNIX - Printing SystemTM ("CUPSTM") Version 1.2.0.

    -

    System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    - - -

    Document Overview

    -

    This software users manual is organized into the following sections:

    - -

    Notation Conventions

    -

    Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below: -

    - - - - - - - - - - - - -
    Example   Description
     
    lpstat -
    lpstat(1)
       The names of commands; - the first mention of a command or function in a chapter is followed by - a manual page section number.
     
    /var -
    /usr/share/cups/data/testprint.ps
        -File and directory names.
     
    Request ID is Printer-123 -   Screen output.
     
    lp -d printer filename ENTER -   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are - written using the period (.) to indicate the decimal point.
    -
    - - -

    -

    Abbreviations

    - The following abbreviations are used throughout this manual: -
      -
      -
      kb
      -
      Kilobytes, or 1024 bytes -
       
      -
      Mb
      -
      Megabytes, or 1048576 bytes -
       
      -
      Gb
      -
      Gigabytes, or 1073741824 bytes -
       
      -
      -
    -

    Other References

    -
      -
      -
      CUPS Software Administrators Manual
      -
      An administration guide for the CUPS software. -
       
      -
      CUPS Software Programmers Manual
      -
      A programmer guide for interfacing with and/or extending the CUPS - software. -
       
      -
      -
    -

    1 - Printing System Overview

    -

    This chapter provides an overview of how the Common UNIX Printing - System works.

    -

    The Printing Problem

    -

    For years the printing problem has plagued UNIX. Unlike - Microsoft® Windows® or Mac OS, UNIX has no standard interface or system - in place for supporting printers. Among the solutions currently - available, the Berkeley and System V printing systems are the most - prevalent.

    -

    These printing systems support line printers (text only) or - PostScript printers (text and graphics), and with some coaxing they can - be made to support a full range of printers and file formats. However, - because each varient of the UNIX operating system uses a different - printing system than the next developing printer drivers for a wide - range of printers and operating systems is extremely difficult. That - combined with the limited volume of customers for each UNIX varient has - forced most printer vendors to give up supporting UNIX entirely.

    -

    CUPS is designed to eliminate the printing problem. One common - printing system can be used by all UNIX varients to support the - printing needs of users. Printer vendors can use its modular filter - interface to develop a single driver program that supports a wide range - of file formats with little or no effort. Since CUPS provides both the - System V and Berkeley printing commands, users (and applications) can - reap the benefits of this new technology with no changes.

    -

    The Technology

    -

    CUPS is based upon an emerging Internet standard called the Internet - Printing Protocol. IPP has been embraced by dozens of printer and - printer server manufacturers and is supported by Microsoft Windows - 2000.

    -

    IPP defines a standard protocol for printing as well as managing - print jobs and printer options like media size, resolution, and so - forth. Like all IP-based protocols, IPP can be used locally or over the - Internet to printers hundreds or thousands of miles away. Unlike other - protocols, however, IPP also supports access control, authentication, - and encryption, making it a much more capable and secure printing - solution than older ones.

    -

    IPP is layered on top of the Hyper-Text Transport Protocol ("HTTP") - which is the basis of web servers on the Internet. This allows users to - view documentation, check status information on a printer or server, - and manage their printers, classes, and jobs using their web browser.

    -

    CUPS provides a complete IPP/1.1 based printing system that provides - Basic, Digest, and local certificate authentication and user, domain, - or IP-based access control. TLS encryption will be available in future - versions of CUPS.

    -

    Jobs

    -

    Each file or set of files that is submitted for printing is called a - job. Jobs are identified by a unique number starting at 1 and are - assigned to a particular destination, usually a printer. Jobs can also - have options associated with them such as media size, number of copies, - and priority.

    -

    Classes

    -

    CUPS supports collections of printers known as classes. Jobs - sent to a class are forwarded to the first available printer in the - class.

    -

    Filters

    -

    Filters allow a user or application to print many types of files - without extra effort. Print jobs sent to a CUPS server are filtered - before sending them to a printer. Some filters convert job files to - different formats that the printer can understand. Others perform page - selection and ordering tasks.

    -

    CUPS provides filters for printing many types of image files, HP-GL/2 - files, PDF files, and text files. CUPS also supplies PostScript and - image file Raster Image Processor ("RIP") filters that convert - PostScript or image files into bitmaps that can be sent to a raster - printer.

    -

    Backends

    -

    Backends perform the most important task of all - they send the - filtered print data to the printer.

    -

    CUPS provides backends for printing over parallel, serial, and USB - ports, and over the network via the IPP, JetDirect (AppSocket), and - Line Printer Daemon ("LPD") protocols. Additional backends are - available in network service packages such as the SMB backend included - with the popular SAMBA software.

    -

    Backends are also used to determine the available devices. On startup - each backend is asked for a list of devices it supports, and any - information that is available. This allows the parallel backend to tell - CUPS that an EPSON Stylus Color 600 printer is attached to parallel - port 1, for example.

    -

    Printer Drivers

    -

    Printer drivers in CUPS consist of one of more filters specific to a - printer. CUPS includes sample printer drivers for Hewlett-Packard - LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color, - and Stylus Photo printers. While these drivers do not generate optimal - output for the different printer models, they do provide basic printing - and demonstrate how you can write your own printer drivers and - incorporate them into CUPS.

    -

    Networking

    -

    Printers and classes on the local system are automatically shared - with other systems on the network. This allows you to setup one system - to print to a printer and use this system as a printer server or spool - host for all of the others. Users may then select a local printer by - name or a remote printer using "name@server".

    -

    CUPS also provides implicit classes, which are collections of - printers and/or classes with the same name. This allows you to setup - multiple servers pointing to the same physical network printer, for - example, so that you aren't relying on a single system for printing. - Because this also works with printer classes, you can setup multiple - servers and printers and never worry about a single point of failure - unless all of the printers and servers go down!

    -

    2 - Using the Printing System -

    -

    This chapter shows you how to submit, query, and cancel print jobs to - different printers.

    -

    Submitting Files for Printing

    -

    CUPS provides both the System V (lp(1)) and Berkeley ( -lpr(1)) printing commands. Type the following command to print a - file to the default (or only) printer on the system:

    -
      -
      -lp filename ENTER
      -
      -
    -

    or:

    -
      -
      -lpr filename ENTER
      -
      -
    -

    CUPS understands many different types of files directly, including - PostScript and image files. This allows you to print from inside your - applications or at the command-line, whichever is most convenient!

    -

    Choosing a Printer

    -

    Many systems will have more than one printer available to the user. - These printers can be attached to the local system via a parallel, - serial, or USB port, or available over the network.

    -

    Use the lpstat(1) command to see a list of available - printers:

    -
      -
      -lpstat -p -d ENTER
      -
      -
    -

    The -p option specifies that you want to see a list of - printers, and the -d option reports the current default - printer or class.

    -

    Use the -d option with the lp command to - print to a specific printer:

    -
      -
      -lp -d printer filename ENTER
      -
      -
    -

    or the -P option with the lpr command:

    -
      -
      -lpr -P printer filename ENTER
      -
      -
    -

    Setting Printer Options

    -

    For many types of files, the default printer options may be - sufficient for your needs. However, there may be times when you need to - change the options for a particular file you are printing.

    -

    The lp and lpr commands allow you to pass - printer options using the -o option:

    -
      -
      -lp -o landscape -o scaling=75 -o media=A4 filename.jpg
      -lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
      -
      -
    -

    The available printer options vary depending on the printer. The - standard options are described in Chapter - 3, "Standard Printing Options".

    -

    Printing Multiple Copies

    -

    Both the lp and lpr commands have options - for printing more than one copy of a file:

    -
      -
      -lp -n num-copies filename ENTER
      -lpr -#num-copies filename ENTER
      -
      -
    -

    Copies are normally not collated for you. Use the -o - Collate=True option to get collated copies :

    -
      -
      -lp -n num-copies -o Collate=True filename ENTER
      -lpr -#num-copies -o Collate=True filename ENTER
      -
      -
    - - -

    Checking the Printer Status from the Command-Line

    -

    The lpstat command can be used to check for jobs that - you have submitted for printing:

    -
      -
      -lpstat ENTER
      -Printer-1 johndoe 4427776
      -Printer-2 johndoe 15786
      -Printer-3 johndoe 372842
      -
      -
    -

    The jobs are listed in the order they will be printed. Use the --p option to see which files and printers are active:

    -
      -
      -lpstat -p ENTER
      -printer DeskJet now printing DeskJet-1.
      -
      -
    - - -

    Use the -o and -p options together to show - the jobs and the printers:

    -
      -
      -lpstat -o -p ENTER
      -Printer-1 johndoe 4427776
      -Printer-2 johndoe 15786
      -Printer-3 johndoe 372842
      -printer DeskJet now printing DeskJet-1.
      -
      -
    -

    Checking the Printer Status from the Web

    -

    Since CUPS uses the Internet Printing Protocol, it is also a - fully-functional web server. To use your web browser to monitor the - printers on your system, open the URL:

    - -

    From there you can view the status of classes, jobs, and printers - with the click of a button!

    -

    Canceling a Print Job

    -

    The cancel(1) and lprm(1) commands cancel a - print job:

    -
      -
      -cancel job-id ENTER
      -lprm job-id ENTER
      -
      -
    -

    The job-id is the number that was reported to you by the - lp or lpstat commands.

    -

    3 - Standard Printer - Options

    -

    This chapter describes the standard printer options that are - available when printing with the lp and lpr - commands.

    -

    General Options

    -

    The following options apply when printing all types of files. - -

    -

    Selecting the Media Size, Type, and Source

    -

    The -o media=xyz option sets the media size, type, - and/or source:

    -
      -
      -lp -o media=Letter filename ENTER
      -lp -o media=Letter,MultiPurpose filename ENTER
      -lpr -o media=Letter,Transparency filename ENTER
      -lpr -o media=Letter,MultiPurpose,Transparency filename ENTER
      -
      -
    - - -

    The available media sizes, types, and sources depend on the printer, - but most support the following options (case is not significant):

    -
      -
    • Letter - US Letter (8.5x11 inches, or 216x279mm)
    • -
    • Legal - US Legal (8.5x14 inches, or 216x356mm)
    • -
    • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm)
    • -
    • COM10 - US #10 Envelope (9.5x4.125 inches, or - 241x105mm)
    • -
    • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
    • -
    • Transparency - Transparency media type or source
    • -
    • Upper - Upper paper tray
    • -
    • Lower - Lower paper tray
    • -
    • MultiPurpose - Multi-purpose paper tray
    • -
    • LargeCapacity - Large capacity paper tray
    • -
    -

    The actual options supported are defined in the printer's PPD file in - the PageSize, InputSlot, and MediaType - options.

    -

    Setting the Orientation

    -

    The -o landscape option will rotate the page 90 degrees - to print in landscape orientation:

    -
      -
      -lp -o landscape filename ENTER
      -lpr -o landscape filename ENTER
      -
      -
    -

    Printing On Both Sides of the Paper

    -

    The -o sides=two-sided-short-edge and -o - sides=two-sided-long-edge options will enable duplexing on the - printer, if the printer supports it. The -o - sides=two-sided-short-edge option is suitable for landscape - pages, while the -o sides=two-sided-long-edge option is - suitable for portrait pages:

    -
      -
      -lp -o sides=two-sided-short-edge filename ENTER
      -lp -o sides=two-sided-long-edge filename ENTER
      -lpr -o sides=two-sided-long-edge filename ENTER
      -
      -
    -

    The default is to print single-sided:

    -
      -
      -lp -o sides=one-sided filename ENTER
      -lpr -o sides=one-sided filename ENTER
      -
      -
    -

    Banner Options

    -

    The following options apply when printing all types of files.

    -

    Selecting the Banner Page(s)

    -

    The -o jobsheets=start,end option sets the banner - page(s) to use for a job:

    -
      -
      -lp -o job-sheets=none filename ENTER
      -lp -o job-sheets=standard filename ENTER
      -lpr -o job-sheets=classified,classified filename ENTER
      -
      -
    -

    If only one banner file is specified, it will be printed before the - files in the job. If a second banner file is specified, it is printed - after the files in the job.

    -

    The available banner pages depend on the local system configuration; - CUPS includes the following banner files:

    -
      -
    • none - Do not produce a banner page.
    • -
    • classified - A banner page with a "classified" label at - the top and bottom.
    • -
    • confidential - A banner page with a "confidential" - label at the top and bottom.
    • -
    • secret - A banner page with a "secret" label at the top - and bottom.
    • -
    • standard - A banner page with no label at the top and - bottom.
    • -
    • topsecret - A banner page with a "top secret" label at - the top and bottom.
    • -
    • unclassified - A banner page with an "unclassified" - label at the top and bottom.
    • -
    -

    Document Options

    -

    The following options apply when printing all types of files.

    -

    Selecting a Range of Pages

    -

    The -o page-ranges=pages option selects a range of pages - for printing:

    -
      -
      -lp -o page-ranges=1 filename ENTER
      -lp -o page-ranges=1-4 filename ENTER
      -lp -o page-ranges=1-4,7,9-12 filename ENTER
      -lpr -o page-ranges=1-4,7,9-12 filename ENTER
      -
      -
    -

    As shown above, the pages value can be a single page, a - range of pages, or a collection of page numbers and ranges separated by - commas. The pages will always be printed in ascending order, regardless - of the order of the pages in the page-ranges option.

    -

    The default is to print all pages.

    -

    Selecting Even or Odd Pages

    -

    Use the -o page-set=set option to select the even or odd - pages:

    -
      -
      -lp -o page-set=odd filename ENTER
      -lp -o page-set=even filename ENTER
      -lpr -o page-set=even filename ENTER
      -
      -
    -

    The default is to print all pages.

    -

    N-Up Printing

    -

    The -o number-up=value option selects N-Up printing. - N-Up printing places multiple document pages on a single printed page. - CUPS supports 1, 2, 4, 6, 9, and 16-Up formats; the default format is - 1-Up:

    -
      -
      -lp -o number-up=1 filename ENTER
      -lp -o number-up=2 filename ENTER
      -lp -o number-up=4 filename ENTER
      -lpr -o number-up=16 filename ENTER
      -
      -
    -

    The -o page-border=value option chooses the border to - draw around each page:

    -
      -
    • -o page-border=double; draw two hairline borders around - each page
    • -
    • -o page-border=double-thick; draw two 1pt borders - around each page
    • -
    • -o page-border=none; do not draw a border (default)
    • -
    • -o page-border=single; draw one hairline border around - each page
    • -
    • -o page-border=single-thick; draw one 1pt border around - each page
    • -
    -

    The -o number-up-layout=value option chooses the layout - of the pages on each output page:

    -
      -
    • -o number-up-layout=btlr; Bottom to top, left to right
    • -
    • -o number-up-layout=btrl; Bottom to top, right to left
    • -
    • -o number-up-layout=lrbt; Left to right, bottom to top
    • -
    • -o number-up-layout=lrtb; Left to right, top to bottom - (default)
    • -
    • -o number-up-layout=rlbt; Right to left, bottom to top
    • -
    • -o number-up-layout=rltb; Right to left, top to bottom
    • -
    • -o number-up-layout=tblr; Top to bottom, left to right
    • -
    • -o number-up-layout=tbrl; Top to bottom, right to left
    • -
    -

    Setting the Brightness

    -

    You can control the overall brightness of the printed output using - the -o brightness=percent option:

    -
      -
      -lp -o brightness=120 filename ENTER
      -lpr -o brightness=120 filename ENTER
      -
      -
    -

    Values greater than 100 will lighten the print, while values less - than 100 will darken it.

    -

    Setting the Gamma Correction

    -

    You can control the overall gamma correction of the printed output - using the -o gamma=value option:

    -
      -
      -lp -o gamma=1700 filename ENTER
      -lpr -o gamma=1700 filename ENTER
      -
      -
    -

    Values greater than 1000 will lighten the print, while values less - than 1000 will darken it. The default gamma is 1000.

    -

    Text Options

    -

    The following options apply when printing text files.

    -

    Setting the Number of Characters Per Inch

    -

    The -o cpi=value option sets the number of characters - per inch:

    -
      -
      -lp -o cpi=10 filename ENTER
      -lp -o cpi=12 filename ENTER
      -lpr -o cpi=17 filename ENTER
      -
      -
    -

    The default characters per inch is 10.

    -

    Setting the Number of Lines Per Inch

    -

    The -o lpi=value option sets the number of lines per - inch:

    -
      -
      -lp -o lpi=6 filename ENTER
      -lpr -o lpi=8 filename ENTER
      -
      -
    -

    The default lines per inch is 6.

    -

    Setting the Number of Columns

    -

    The -o columns=value option sets the number of text - columns:

    -
      -
      -lp -o columns=2 filename ENTER
      -lpr -o columns=3 filename ENTER
      -
      -
    -

    The default number of columns is 1.

    -

    Setting the Page Margins

    -

    Normally the page margins are set to the hard limits of the printer. - Use the -o page-left=value, -o page-right=value -, -o page-top=value, and -o page-bottom=value - options to adjust the page margins:

    -
      -
      -lp -o page-left=value filename ENTER
      -lp -o page-right=value filename ENTER
      -lp -o page-top=value filename ENTER
      -lp -o page-bottom=value filename ENTER
      -lpr -o page-bottom=value filename ENTER
      -
      -
    -

    The value argument is the margin in points; each point - is 1/72 inch or 0.35mm.

    -

    Pretty Printing

    -

    The -o prettyprint option puts a header at the top of - each page with the page number, job title (usually the filename), and - the date. Also, C and C++ keywords are highlighted, and comment lines - are italicized:

    -
      -
      -lp -o prettyprint filename ENTER
      -lpr -o prettyprint filename ENTER
      -
      -
    -

    Image Options

    -

    The following options apply when printing image files.

    -

    Positioning the Image

    -

    The -o position=name option specifies the position of - the image on the page:

    -
      -
    • center - Center the image on the page (default)
    • -
    • top - Print the image centered at the top of the page
    • -
    • left - Print the image centered on the left of page
    • -
    • right - Print the image centered on the right of the - page
    • -
    • top-left - Print the image at the top left corner of - the page
    • -
    • top-right - Print the image at the top right corner of - the page
    • -
    • bottom - Print the image centered at the bottom of the - page
    • -
    • bottom-left - Print the image at the bottom left corner - of the page
    • -
    • bottom-right - Print the image at the bottom right - corner of the page
    • -
    -

    Scaling the Image

    -

    The -o scaling=percent, -o ppi=value, and --o natural-scaling=percent options change the size of a printed - image:

    -
      -
      -lp -o scaling=percent filename ENTER
      -lp -o ppi=value filename ENTER
      -lpr -o natural-scaling=percent filename ENTER
      -
      -
    -

    The scaling=percent value is a number from 1 to 800 - specifying the size in relation to the page (not the image.) A - scaling of 100 percent will fill the page as completely as the image - aspect ratio allows. A scaling of 200 percent will print on up to 4 - pages.

    -

    The ppi=value value is a number from 1 to 1200 - specifying the resolution of the image in pixels per inch. An image - that is 3000x2400 pixels will print 10x8 inches at 300 pixels per inch, - for example. If the specified resolution makes the image larger than - the page, multiple pages will be printed to satisfy the request.

    -

    The natural-scaling=percent value is a number from 1 to - 800 specifying the size in relation to the natural image size. A - scaling of 100 percent will print the image at its natural size, while - a scaling of 50 percent will print the image at half its natural size. - If the specified scaling makes the image larger than the page, multiple - pages will be printed to satisfy the request.

    -

    Adjusting the Hue (Tint) of an Image

    -

    The -o hue=value option will adjust the hue of the - printed image, much like the tint control on your television:

    -
      -
      -lp -o hue=value filename ENTER
      -lpr -o hue=value filename ENTER
      -
      -
    - - -

    The value argument is a number from -360 to 360 and - represents the color hue rotation. The following table summarizes the - change you'll see with different colors: -

    - - - - - - - - -
    Originalhue=-45hue=45
    RedPurpleYellow-orange
    GreenYellow-greenBlue-green
    YellowOrangeGreen-yellow
    BlueSky-bluePurple
    MagentaIndigoCrimson
    CyanBlue-greenLight-navy-blue
    -
    -

    -

    The default hue adjustment is 0.

    -

    Adjusting the Saturation (Color) of an Image

    -

    The -o saturation=percent option adjusts the saturation - of the colors in an image, much like the color knob on your television:

    -
      -
      -lp -o saturation=percent filename ENTER
      -lpr -o saturation=percent filename ENTER
      -
      -
    -

    The percent argument specifies the color saturation from - 0 to 200. A color saturation of 0 produces a black-and-white print, - while a value of 200 will make the colors extremely intense.

    -

    The default saturation is 100. - -

    -

    HP-GL/2 Options

    -

    The following options apply to HP-GL/2 files.

    -

    Printing in Black

    -

    The -o blackplot option specifies that all pens should - plot in black:

    -
      -
      -lp -o blackplot filename ENTER
      -lpr -o blackplot filename ENTER
      -
      -
    -

    The default is to use the colors defined in the plot file or the - standard pen colors defined in the HP-GL/2 reference manual from - Hewlett Packard.

    -

    Fitting the Plot on the Page

    -

    The -o fitplot option specifies that the plot should be - scaled to fit on the page:

    -
      -
      -lp -o fitplot filename ENTER
      -lpr -o fitplot filename ENTER
      -
      -
    -

    The default is to use the absolute distances specified in the plot - file. -

    - - -
    NOTE: -

    This feature depends upon an accurate plot size (PS) - command in the HP-GL/2 file. If no plot size is given in the file than - the HP-GL/2 filter assumes the plot is ANSI E size.

    -
    -
    -

    -

    Setting the Default Pen Width

    -

    The -o penwidth=value option specifies the default pen - width for HP-GL/2 files:

    -
      -
      -lp -o penwidth=value filename ENTER
      -lpr -o penwidth=value filename ENTER
      -
      -
    -

    The pen width value specifies the pen width in - micrometers. The default value of 1000 produces lines that are 1 - millimeter in width. Specifying a pen width of 0 produces lines that - are exactly 1 pixel wide. -

    - - -
    NOTE: -

    This option is ignored when the pen widths are set in the plot file.

    -
    -
    -

    -

    Raw or Unfiltered Output

    -

    The -o raw option allows you to send files directly to a - printer without filtering. This is sometimes required when printing - from applications that provide their own "printer drivers" for your - printer:

    -
      -
      -lp -o raw filename ENTER
      -lpr -o raw filename ENTER
      -
      -
    -

    The -l option can also be used with the lpr - command to send files directly to a printer:

    -
      -
      -lpr -l filename ENTER
      -
      -
    -

    4 - Saving Printer Options - and Defaults

    -

    This chapter describes how to save printer options for your printer - and set your own default printer.

    -

    Printer Options

    -

    Each printer supports a large number of options, which you learned - about in Chapter 3, "Standard Printer - Options". Rather than specifying these options each time you print - a file, CUPS allows you to save them as "default" options for the - printer.

    -

    The lpoptions(1) command saves the options for your - printers. Like the lp and lpr commands, it - accepts printer options using the -o argument:

    -
      -
      -lpoptions -o prettyprint ENTER
      -lpoptions -o media=A4 -o sides=two-sided-long-edge ENTER
      -lpoptions -o media=Legal -o scaling=100 ENTER
      -
      -
    -

    Once saved, any lp or lpr command will use - them when you print.

    -

    Setting Options for a Specific Printer

    -

    The previous example shows how to set the options for the default - printer. The -p printer option specifies the options are - for another printer:

    -
      -
      -lpoptions -p laserjet -o prettyprint ENTER
      -lpoptions -p laserjet -o media=A4 -o sides=two-sided-long-edge ENTER
      -lpoptions -p deskjet -o media=Legal -o scaling=100 ENTER
      -
      -
    -

    Removing Options

    -

    The previous two examples shows how to set options for the default - and a specific printer. Below, shows you how to remove the saved option - using the -r argument:

    -
      -
      -lpoptions -r prettyprint ENTER
      -lpoptions -p laserjet -r prettyprint ENTER
      -
      -
    -

    Viewing the Current Defaults

    -

    The lpoptions command can also be used to show the - current options by not specifying any new options on the command-line:

    -
      -
      -lpoptions ENTER
      -media=A4 sides=two-sided-long-edge
      -lpoptions -p deskjet ENTER
      -media=Legal scaling=100
      -
      -
    -

    Viewing Options for a Specific Printer

    -

    You can display the supported options using the lpoptions - command with the -l option, as follows:

    -
      -
      -lpoptions -p laserjet -l ENTER
      -
      -
    -

    Setting the Default Printer

    -

    The administrator normally will set a system-wide default printer - that is normally used as the default printer by everyone. Use the --d printer option to set your own default printer:

    -
      -
      -lpoptions -d deskjet ENTER
      -
      -
    -

    The printer can be local (deskjet) or remote ( -deskjet@server).

    -

    Printer Instances

    -

    Besides setting options for each print queue, CUPS supports - printer instances which allow you to define several different sets - of options for each printer. You specify a printer instance using the - slash (/) character:

    -
      -
      -lpoptions -p laserjet/duplex -o sides=two-sided-long-edge ENTER
      -lpoptions -p laserjet/legal -o media=Legal ENTER
      -
      -
    -

    The lp and lpr commands also understand - this notation:

    -
      -
      -lp -d laserjet/duplex filename ENTER
      -lpr -P laserjet/legal filename ENTER
      -
      -
    -

    Removing Instances

    -

    Use the -x printer/instance option to remove a printer - instance that you no longer need:

    -
      -
      -lpoptions -x laserjet ENTER
      -lpoptions -x laserjet/duplex ENTER
      -lpoptions -x laserjet/legal ENTER
      -
      -
    -

    The -x option only removes the default options for that - printer and instance; the original print queue will remain until - deleted with the lpadmin(8) command by the administrator.

    -

    A - Software License Agreement

    -

    Common UNIX Printing System License - Agreement

    -

    Copyright 1997-2003 by Easy Software Products -
    44141 AIRPORT VIEW DR STE 204 -
    HOLLYWOOD, MARYLAND 20636-3111 USA -
    -
    Voice: +1.301.373.9600 -
    Email: cups-info@cups.org -
    WWW: http://www.cups.org

    -

    Introduction

    -

    The Common UNIX Printing SystemTM, ("CUPSTM"), - 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.

    -

    The GNU LGPL applies to the CUPS API library, located in the "cups" - subdirectory of the CUPS source distribution and in the "cups" include - directory and library files in the binary distributions. The GNU GPL - applies to the remainder of the CUPS distribution, including the - "pdftops" filter which is based upon Xpdf and the CUPS imaging library.

    -

    For those not familiar with the GNU GPL, the license basically allows - you to:

    -
      -
    • Use the CUPS software at no charge.
    • -
    • Distribute verbatim copies of the software in source or binary form.
    • -
    • Sell verbatim copies of the software for a media fee, or sell - support for the software.
    • -
    • Distribute or sell printer drivers and filters that use CUPS so long - as source code is made available under the GPL.
    • -
    -

    What this license does not allow you to do is make changes or - add features to CUPS and then sell a binary distribution without source - code. You must provide source for any new drivers, changes, or - additions to the software, and all code must be provided under the GPL - or LGPL as appropriate. The only exceptions to this are the portions of - the CUPS software covered by the Apple operating system license - exceptions outlined later in this license agreement.

    -

    The GNU LGPL relaxes the "link-to" restriction, allowing you to - develop applications that use the CUPS API library under other licenses - and/or conditions as appropriate for your application.

    -

    License Exceptions

    -

    In addition, as the copyright holder of CUPS, Easy Software Products - grants the following special exceptions:

    -
      -
    1. Apple Operating System Development License Exception; -
        -
      1. Software that is developed by any person or entity for an Apple - Operating System ("Apple OS-Developed Software"), including but not - limited to Apple and third party printer drivers, filters, and backends - for an Apple Operating System, that is linked to the CUPS imaging - library or based on any sample filters or backends provided with CUPS - shall not be considered to be a derivative work or collective work - based on the CUPS program and is exempt from the mandatory source code - release clauses of the GNU GPL. You may therefore distribute linked - combinations of the CUPS imaging library with Apple OS-Developed - Software without releasing the source code of the Apple OS-Developed - Software. You may also use sample filters and backends provided with - CUPS to develop Apple OS-Developed Software without releasing the - source code of the Apple OS-Developed Software.
      2. -
      3. An Apple Operating System means any operating system software - developed and/or marketed by Apple Computer, Inc., including but not - limited to all existing releases and versions of Apple's Darwin, Mac OS - X, and Mac OS X Server products and all follow-on releases and future - versions thereof.
      4. -
      5. This exception is only available for Apple OS-Developed Software and - does not apply to software that is distributed for use on other - operating systems.
      6. -
      7. All CUPS software that falls under this license exception have the - following text at the top of each source file:
        This file is - subject to the Apple OS-Developed Software exception.
      8. -
      -
    2. -
    3. OpenSSL Toolkit License Exception; -
        -
      1. Easy Software Products explicitly allows the compilation and - distribution of the CUPS software with the OpenSSL Toolkit.
      2. -
      -
    4. -
    -

    No developer is required to provide these exceptions in a derived - work.

    -

    Trademarks

    -

    Easy Software Products has trademarked the Common UNIX Printing - System, CUPS, and CUPS logo. These names and logos may be used freely - in any direct port or binary distribution of CUPS. Please contract Easy - Software Products for written permission to use them in derivative - products. Our intention is to protect the value of these trademarks and - ensure that any derivative product meets the same high-quality - standards as the original.

    -

    Binary Distribution Rights

    -

    Easy Software Products also sells rights to the CUPS source code - under a binary distribution license for vendors that are unable to - release source code for their drivers, additions, and modifications to - CUPS under the GNU GPL and LGPL. For information please contact us at - the address shown above.

    -

    The Common UNIX Printing System provides a "pdftops" filter that is - based on the Xpdf software. For binary distribution licensing of this - software, please contact:

    Derek B. Noonburg -
    Email: derekn@foolabs.com -
    WWW: - http://www.foolabs.com/xpdf/

    -

    Support

    -

    Easy Software Products sells software support for CUPS as well as a - commercial printing product based on CUPS called ESP Print Pro. You can - find out more at our web site:

    - - - -

    GNU GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright 1989, 1991 Free Software Foundation, Inc.
    -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    -Everyone is permitted to copy and distribute verbatim
    -copies of this license document, but changing it is not allowed.
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public License is - intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users. This - General Public License applies to most of the Free Software - Foundation's software and to any other program whose authors commit to - using it. (Some other Free Software Foundation software is covered by - the GNU Library General Public License instead.) You can apply it to - your programs, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the software, or if you modify it.

    -

    For example, if you distribute copies of such a program, whether - gratis or for a fee, you must give the recipients all the rights that - you have. You must make sure that they, too, receive or can get the - source code. And you must show them these terms so they know their - rights.

    -

    We protect your rights with two steps: (1) copyright the software, - and (2) offer you this license which gives you legal permission to - copy, distribute and/or modify the software.

    -

    Also, for each author's protection and ours, we want to make certain - that everyone understands that there is no warranty for this free - software. If the software is modified by someone else and passed on, we - want its recipients to know that what they have is not the original, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that redistributors of a free - program will individually obtain patent licenses, in effect making the - program proprietary. To prevent this, we have made it clear that any - patent must be licensed for everyone's free use or not licensed at all.

    -

    The precise terms and conditions for copying, distribution and - modification follow.

    -

    GNU GENERAL PUBLIC LICENSE -
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -
      -
    1. This License applies to any program or other work which contains a - notice placed by the copyright holder saying it may be distributed - under the terms of this General Public License. The "Program", below, - refers to any such program or work, and a "work based on the Program" - means either the Program or any derivative work under copyright law: - that is to say, a work containing the Program or a portion of it, - either verbatim or with modifications and/or translated into another - language. (Hereinafter, translation is included without limitation in - the term "modification".) Each licensee is addressed as "you". -

      Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - the Program is not restricted, and the output from the Program is - covered only if its contents constitute a work based on the Program - (independent of having been made by running the Program). Whether that - is true depends on what the Program does.

      -
    2. You may copy and distribute verbatim copies of the Program's source - code as you receive it, in any medium, provided that you conspicuously - and appropriately publish on each copy an appropriate copyright notice - and disclaimer of warranty; keep intact all the notices that refer to - this License and to the absence of any warranty; and give any other - recipients of the Program a copy of this License along with the - Program. -

      You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

      -
    3. You may modify your copy or copies of the Program or any portion of - it, thus forming a work based on the Program, and copy and distribute - such modifications or work under the terms of Section 1 above, provided - that you also meet all of these conditions: -
        -
      1. You must cause the modified files to carry prominent notices stating - that you changed the files and the date of any change.
      2. -
      3. You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any part - thereof, to be licensed as a whole at no charge to all third parties - under the terms of this License.
      4. -
      5. if the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the most ordinary way, to print or display an announcement including - an appropriate copyright notice and a notice that there is no warranty - (or else, saying that you provide a warranty) and that users may - redistribute the program under these conditions, and telling the user - how to view a copy of this License. (Exception: if the Program itself - is interactive but does not normally print such an announcement, your - work based on the Program is not required to print an announcement.)
      6. -
      -

      These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Program, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Program, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

      -

      Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Program.

      -

      In addition, mere aggregation of another work not based on the - Program with the Program (or with a work based on the Program) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

      -
    4. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the terms of - Sections 1 and 2 above provided that you also do one of the following: -
        -
      1. Accompany it with the complete corresponding machine-readable source - code, which must be distributed under the terms of Sections 1 and 2 - above on a medium customarily used for software interchange; or,
      2. -
      3. Accompany it with a written offer, valid for at least three years, - to give any third party, for a charge no more than your cost of - physically performing source distribution, a complete machine-readable - copy of the corresponding source code, to be distributed under the - terms of Sections 1 and 2 above on a medium customarily used for - software interchange; or,
      4. -
      5. Accompany it with the information you received as to the offer to - distribute corresponding source code. (This alternative is allowed only - for noncommercial distribution and only if you received the program in - object code or executable form with such an offer, in accord with - Subsection b above.)
      6. -
      -

      The source code for a work means the preferred form of the work for - making modifications to it. For an executable work, complete source - code means all the source code for all modules it contains, plus any - associated interface definition files, plus the scripts used to control - compilation and installation of the executable. However, as a special - exception, the source code distributed need not include anything that - is normally distributed (in either source or binary form) with the - major components (compiler, kernel, and so on) of the operating system - on which the executable runs, unless that component itself accompanies - the executable.

      -

      If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent access - to copy the source code from the same place counts as distribution of - the source code, even though third parties are not compelled to copy - the source along with the object code.

      -
    5. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt otherwise - to copy, modify, sublicense or distribute the Program is void, and will - automatically terminate your rights under this License. However, - parties who have received copies, or rights, from you under this - License will not have their licenses terminated so long as such parties - remain in full compliance.
    6. -
    7. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to modify or - distribute the Program or its derivative works. These actions are - prohibited by law if you do not accept this License. Therefore, by - modifying or distributing the Program (or any work based on the - Program), you indicate your acceptance of this License to do so, and - all its terms and conditions for copying, distributing or modifying the - Program or works based on it.
    8. -
    9. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program subject to - these terms and conditions. You may not impose any further restrictions - on the recipients' exercise of the rights granted herein. You are not - responsible for enforcing compliance by third parties to this License.
    10. -
    11. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent issues), - conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot - distribute so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you - may not distribute the Program at all. For example, if a patent license - would not permit royalty-free redistribution of the Program by all - those who receive copies directly or indirectly through you, then the - only way you could satisfy both it and this License would be to refrain - entirely from distribution of the Program. -

      If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply and the section as a whole is intended to apply in other - circumstances.

      -

      It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system, which is - implemented by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

      -

      This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

      -
    12. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted interfaces, the - original copyright holder who places the Program under this License may - add an explicit geographical distribution limitation excluding those - countries, so that distribution is permitted only in or among countries - not thus excluded. In such case, this License incorporates the - limitation as if written in the body of this License.
    13. -
    14. The Free Software Foundation may publish revised and/or new versions - of the General Public License from time to time. Such new versions will - be similar in spirit to the present version, but may differ in detail - to address new problems or concerns. -

      Each version is given a distinguishing version number. If the Program - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Program does not specify a version - number of this License, you may choose any version ever published by - the Free Software Foundation.

      -
    15. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to the - author to ask for permission. For software which is copyrighted by the - Free Software Foundation, write to the Free Software Foundation; we - sometimes make exceptions for this. Our decision will be guided by the - two goals of preserving the free status of all derivatives of our free - software and of promoting the sharing and reuse of software generally.
    16. - - - - - - -
    -

    NO WARRANTY

    -
      -
    1. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY - FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN - OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES - PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER - EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE - ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH - YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL - NECESSARY SERVICING, REPAIR OR CORRECTION.
    2. -
    3. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY - AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU - FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR - CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.
    4. -
    -

    END OF TERMS AND CONDITIONS

    - - -

    GNU LIBRARY GENERAL PUBLIC LICENSE

    -

    Version 2, June 1991

    -
    -Copyright (C) 1991 Free Software Foundation, Inc.
    -59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
    -Everyone is permitted to copy and distribute verbatim copies
    -of this license document, but changing it is not allowed.
    -
    -[This is the first released version of the library GPL.  It is
    - numbered 2 because it goes with version 2 of the ordinary GPL.]
    -
    -

    Preamble

    -

    The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public Licenses - are intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users.

    -

    This license, the Library General Public License, applies to some - specially designated Free Software Foundation software, and to any - other libraries whose authors decide to use it. You can use it for your - libraries, too.

    -

    When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

    -

    To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the library, or if you modify it.

    -

    For example, if you distribute copies of the library, whether gratis - or for a fee, you must give the recipients all the rights that we gave - you. You must make sure that they, too, receive or can get the source - code. If you link a program with the library, you must provide complete - object files to the recipients so that they can relink them with the - library, after making changes to the library and recompiling it. And - you must show them these terms so they know their rights.

    -

    Our method of protecting your rights has two steps: (1) copyright the - library, and (2) offer you this license which gives you legal - permission to copy, distribute and/or modify the library.

    -

    Also, for each distributor's protection, we want to make certain that - everyone understands that there is no warranty for this free library. - If the library is modified by someone else and passed on, we want its - recipients to know that what they have is not the original version, so - that any problems introduced by others will not reflect on the original - authors' reputations.

    -

    Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that companies distributing free - software will individually obtain patent licenses, thus in effect - transforming the program into proprietary software. To prevent this, we - have made it clear that any patent must be licensed for everyone's free - use or not licensed at all.

    -

    Most GNU software, including some libraries, is covered by the - ordinary GNU General Public License, which was designed for utility - programs. This license, the GNU Library General Public License, applies - to certain designated libraries. This license is quite different from - the ordinary one; be sure to read it in full, and don't assume that - anything in it is the same as in the ordinary license.

    -

    The reason we have a separate public license for some libraries is - that they blur the distinction we usually make between modifying or - adding to a program and simply using it. Linking a program with a - library, without changing the library, is in some sense simply using - the library, and is analogous to running a utility program or - application program. However, in a textual and legal sense, the linked - executable is a combined work, a derivative of the original library, - and the ordinary General Public License treats it as such.

    -

    Because of this blurred distinction, using the ordinary General - Public License for libraries did not effectively promote software - sharing, because most developers did not use the libraries. We - concluded that weaker conditions might promote sharing better.

    -

    However, unrestricted linking of non-free programs would deprive the - users of those programs of all benefit from the free status of the - libraries themselves. This Library General Public License is intended - to permit developers of non-free programs to use free libraries, while - preserving your freedom as a user of such programs to change the free - libraries that are incorporated in them. (We have not seen how to - achieve this as regards changes in header files, but we have achieved - it as regards changes in the actual functions of the Library.) The hope - is that this will lead to faster development of free libraries.

    -

    The precise terms and conditions for copying, distribution and - modification follow. Pay close attention to the difference between a - "work based on the library" and a "work that uses the library". The - former contains code derived from the library, while the latter only - works together with the library.

    -

    Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

    -

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    -

    0. This License Agreement applies to any software - library which contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of this - Library General Public License (also called "this License"). Each - licensee is addressed as "you".

    -

    A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables.

    -

    The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or translated - straightforwardly into another language. (Hereinafter, translation is - included without limitation in the term "modification".)

    -

    "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code means - all the source code for all modules it contains, plus any associated - interface definition files, plus the scripts used to control - compilation and installation of the library.

    -

    Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - a program using the Library is not restricted, and output from such a - program is covered only if its contents constitute a work based on the - Library (independent of the use of the Library in a tool for writing - it). Whether that is true depends on what the Library does and what the - program that uses the Library does.

    -

    1. You may copy and distribute verbatim copies of - the Library's complete source code as you receive it, in any medium, - provided that you conspicuously and appropriately publish on each copy - an appropriate copyright notice and disclaimer of warranty; keep intact - all the notices that refer to this License and to the absence of any - warranty; and distribute a copy of this License along with the Library.

    -

    You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

    -

    2. You may modify your copy or copies of the Library - or any portion of it, thus forming a work based on the Library, and - copy and distribute such modifications or work under the terms of - Section 1 above, provided that you also meet all of these conditions:

    -
      -
    1. The modified work must itself be a software library. -

      -
    2. You must cause the files modified to carry prominent notices stating - that you changed the files and the date of any change. -

      -
    3. You must cause the whole of the work to be licensed at no charge to - all third parties under the terms of this License. -

      -
    4. If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses the - facility, other than as an argument passed when the facility is - invoked, then you must make a good faith effort to ensure that, in the - event an application does not supply such function or table, the - facility still operates, and performs whatever part of its purpose - remains meaningful. -

      (For example, a function in a library to compute square roots has a - purpose that is entirely well-defined independent of the application. - Therefore, Subsection 2d requires that any application-supplied - function or table used by this function must be optional: if the - application does not supply it, the square root function must still - compute square roots.)

      -
    5. - - - -
    -

    These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Library, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Library, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

    -

    Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Library.

    -

    In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

    -

    3. You may opt to apply the terms of the ordinary - GNU General Public License instead of this License to a given copy of - the Library. To do this, you must alter all the notices that refer to - this License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer version - than version 2 of the ordinary GNU General Public License has appeared, - then you can specify that version instead if you wish.) Do not make any - other change in these notices.

    -

    Once this change is made in a given copy, it is irreversible for that - copy, so the ordinary GNU General Public License applies to all - subsequent copies and derivative works made from that copy.

    -

    This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

    -

    4. You may copy and distribute the Library (or a - portion or derivative of it, under Section 2) in object code or - executable form under the terms of Sections 1 and 2 above provided that - you accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange.

    -

    If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy the - source code from the same place satisfies the requirement to distribute - the source code, even though third parties are not compelled to copy - the source along with the object code.

    -

    5. A program that contains no derivative of any - portion of the Library, but is designed to work with the Library by - being compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of the - Library, and therefore falls outside the scope of this License.

    -

    However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because it - contains portions of the Library), rather than a "work that uses the - library". The executable is therefore covered by this License. Section - 6 states terms for distribution of such executables.

    -

    When a "work that uses the Library" uses material from a header file - that is part of the Library, the object code for the work may be a - derivative work of the Library even though the source code is not. - Whether this is true is especially significant if the work can be - linked without the Library, or if the work is itself a library. The - threshold for this to be true is not precisely defined by law.

    -

    If such an object file uses only numerical parameters, data structure - layouts and accessors, and small macros and small inline functions (ten - lines or less in length), then the use of the object file is - unrestricted, regardless of whether it is legally a derivative work. - (Executables containing this object code plus portions of the Library - will still fall under Section 6.)

    -

    Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section 6. - Any executables containing that work also fall under Section 6, whether - or not they are linked directly with the Library itself.

    -

    6. As an exception to the Sections above, you may - also compile or link a "work that uses the Library" with the Library to - produce a work containing portions of the Library, and distribute that - work under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications.

    -

    You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered by - this License. You must supply a copy of this License. If the work - during execution displays copyright notices, you must include the - copyright notice for the Library among them, as well as a reference - directing the user to the copy of this License. Also, you must do one - of these things:

    -
      -
    1. Accompany the work with the complete corresponding machine-readable - source code for the Library including whatever changes were used in the - work (which must be distributed under Sections 1 and 2 above); and, if - the work is an executable linked with the Library, with the complete - machine-readable "work that uses the Library", as object code and/or - source code, so that the user can modify the Library and then relink to - produce a modified executable containing the modified Library. (It is - understood that the user who changes the contents of definitions files - in the Library will not necessarily be able to recompile the - application to use the modified definitions.) -

      -
    2. Accompany the work with a written offer, valid for at least three - years, to give the same user the materials specified in Subsection 6a, - above, for a charge no more than the cost of performing this - distribution. -

      -
    3. If distribution of the work is made by offering access to copy from - a designated place, offer equivalent access to copy the above specified - materials from the same place. -

      -
    4. Verify that the user has already received a copy of these materials - or that you have already sent this user a copy.
    5. - - - -
    -

    For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special exception, - the source code distributed need not include anything that is normally - distributed (in either source or binary form) with the major components - (compiler, kernel, and so on) of the operating system on which the - executable runs, unless that component itself accompanies the - executable.

    -

    It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you cannot - use both them and the Library together in an executable that you - distribute.

    -

    7. You may place library facilities that are a work - based on the Library side-by-side in a single library together with - other library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution of the - work based on the Library and of the other library facilities is - otherwise permitted, and provided that you do these two things:

    -
      -
    1. Accompany the combined library with a copy of the same work based on - the Library, uncombined with any other library facilities. This must be - distributed under the terms of the Sections above. -

      -
    2. Give prominent notice with the combined library of the fact that - part of it is a work based on the Library, and explaining where to find - the accompanying uncombined form of the same work.
    3. - -
    -

    8. You may not copy, modify, sublicense, link with, - or distribute the Library except as expressly provided under this - License. Any attempt otherwise to copy, modify, sublicense, link with, - or distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have received - copies, or rights, from you under this License will not have their - licenses terminated so long as such parties remain in full compliance.

    -

    9. You are not required to accept this License, - since you have not signed it. However, nothing else grants you - permission to modify or distribute the Library or its derivative works. - These actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work based - on the Library), you indicate your acceptance of this License to do so, - and all its terms and conditions for copying, distributing or modifying - the Library or works based on it.

    -

    10. Each time you redistribute the Library (or any - work based on the Library), the recipient automatically receives a - license from the original licensor to copy, distribute, link with or - modify the Library subject to these terms and conditions. You may not - impose any further restrictions on the recipients' exercise of the - rights granted herein. You are not responsible for enforcing compliance - by third parties to this License.

    -

    11. If, as a consequence of a court judgment or - allegation of patent infringement or for any other reason (not limited - to patent issues), conditions are imposed on you (whether by court - order, agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this License. If - you cannot distribute so as to satisfy simultaneously your obligations - under this License and any other pertinent obligations, then as a - consequence you may not distribute the Library at all. For example, if - a patent license would not permit royalty-free redistribution of the - Library by all those who receive copies directly or indirectly through - you, then the only way you could satisfy both it and this License would - be to refrain entirely from distribution of the Library.

    -

    If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply, and the section as a whole is intended to apply in other - circumstances.

    -

    It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system which is implemented - by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

    -

    This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

    -

    12. If the distribution and/or use of the Library is - restricted in certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Library under - this License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only in or - among countries not thus excluded. In such case, this License - incorporates the limitation as if written in the body of this License.

    -

    13. The Free Software Foundation may publish revised - and/or new versions of the Library General Public License from time to - time. Such new versions will be similar in spirit to the present - version, but may differ in detail to address new problems or concerns.

    -

    Each version is given a distinguishing version number. If the Library - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Library does not specify a license - version number, you may choose any version ever published by the Free - Software Foundation.

    -

    14. If you wish to incorporate parts of the Library - into other free programs whose distribution conditions are incompatible - with these, write to the author to ask for permission. For software - which is copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free status - of all derivatives of our free software and of promoting the sharing - and reuse of software generally.

    -

    NO WARRANTY

    -

    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, - THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    -

    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR - AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO - MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL - OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.

    -

    END OF TERMS AND CONDITIONS

    - - diff --git a/doc/sum.pdf b/doc/sum.pdf deleted file mode 100644 index 629621b6442371b5259485d27f742d4094ba2d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 106950 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

    kBq7XD|n( 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 Rx#HfgimTVJzj^=d)jwoWr)>ZL diff --git a/doc/sum.shtml b/doc/sum.shtml deleted file mode 100644 index 7e18260c2..000000000 --- a/doc/sum.shtml +++ /dev/null @@ -1,933 +0,0 @@ - - - - - - - CUPS Software Users Manual - - - -

    Preface

    - -

    This software users manual describes how to use the Common UNIX Printing -SystemTM ("CUPSTM") Version 1.2.0. - - - - -

    Document Overview

    - -

    This software users manual is organized into the following sections:

    - -
    - -

    Notation Conventions

    - -

    Various font and syntax conventions are used in this guide. Examples and -their meanings and uses are explained below: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Example   Description
     
    lpstat
    - lpstat(1)
       The names of commands; the first mention of a command or - function in a chapter is followed by a manual page section - number.
     
    /var
    - /usr/share/cups/data/testprint.ps
       File and directory names.
     
    Request ID is Printer-123   Screen output.
     
    lp -d printer filename ENTER   Literal user input; special keys like ENTER are - in ALL CAPS.
     
    12.3   Numbers in the text are written using the period (.) to indicate - the decimal point.
    - - -

    Abbreviations

    - -The following abbreviations are used throughout this manual: - -
      -
      - -
      kb -
      Kilobytes, or 1024 bytes
        - -
      Mb -
      Megabytes, or 1048576 bytes
        - -
      Gb -
      Gigabytes, or 1073741824 bytes
        - -
      -
    - -

    Other References

    - -
      -
      - -
      CUPS Software Administrators Manual - -
      An administration guide for the CUPS software.
        - -
      CUPS Software Programmers Manual - -
      A programmer guide for interfacing with and/or extending the CUPS - software.
        - -
      -
    - - - - - -

    2 - Using the Printing System

    - -

    This chapter shows you how to submit, query, and cancel print jobs to -different printers. - -

    Submitting Files for Printing

    - -

    CUPS provides both the System V (lp(1)) and Berkeley -(lpr(1)) printing commands. Type the following command to -print a file to the default (or only) printer on the system: - -

      -lp filename ENTER
      -
    - -

    or: - -

      -lpr filename ENTER
      -
    - -

    CUPS understands many different types of files directly, including -PostScript and image files. This allows you to print from inside your -applications or at the command-line, whichever is most convenient! - -

    Choosing a Printer

    - -

    Many systems will have more than one printer available to the user. These -printers can be attached to the local system via a parallel, serial, or USB -port, or available over the network. - -

    Use the lpstat(1) command to see a list of available printers: - -

      -lpstat -p -d ENTER
      -
    - -

    The -p option specifies that you want to see a -list of printers, and the -d option reports the -current default printer or class. - -

    Use the -d option with the lp command to -print to a specific printer: - -

      -lp -d printer filename ENTER
      -
    - -

    or the -P option with the lpr command: - -

      -lpr -P printer filename ENTER
      -
    - -

    Setting Printer Options

    - -

    For many types of files, the default printer options may be sufficient for -your needs. However, there may be times when you need to change the options -for a particular file you are printing. - -

    The lp and lpr commands allow you to pass -printer options using the -o option: - -

      -lp -o landscape -o scaling=75 -o media=A4 filename.jpg
      -lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
      -
    - -

    The available printer options vary depending on the printer. The standard -options are described in Chapter 3, "Standard -Printing Options". - -

    Printing Multiple Copies

    - -

    Both the lp and lpr commands have options for -printing more than one copy of a file: - -

      -lp -n num-copies filename ENTER
      -lpr -#num-copies filename ENTER
      -
    - -

    Copies are normally not collated for you. Use the -o -Collate=True option to get collated copies : - -

      -lp -n num-copies -o Collate=True filename ENTER
      -lpr -#num-copies -o Collate=True filename ENTER
      -
    - - -

    Checking the Printer Status from the Command-Line

    - -

    The lpstat command can be used to check for jobs that you -have submitted for printing: - -

      -lpstat ENTER
      -Printer-1 johndoe 4427776
      -Printer-2 johndoe 15786
      -Printer-3 johndoe 372842
      -
    - -

    The jobs are listed in the order they will be printed. Use the --p option to see which files and printers are active: - -

      -lpstat -p ENTER
      -printer DeskJet now printing DeskJet-1.
      -
    - - -

    Use the -o and -p options together to show -the jobs and the printers: - -

      -lpstat -o -p ENTER
      -Printer-1 johndoe 4427776
      -Printer-2 johndoe 15786
      -Printer-3 johndoe 372842
      -printer DeskJet now printing DeskJet-1.
      -
    - -

    Checking the Printer Status from the Web

    - -

    Since CUPS uses the Internet Printing Protocol, it is also a -fully-functional web server. To use your web browser to monitor the -printers on your system, open the URL: - -

    - -

    From there you can view the status of classes, jobs, and printers -with the click of a button! - -

    Canceling a Print Job

    - -

    The cancel(1) and lprm(1) commands cancel -a print job: - -

      -cancel job-id ENTER
      -lprm job-id ENTER
      -
    - -

    The job-id is the number that was reported to you by -the lp or lpstat commands. - - -

    3 - Standard Printer Options

    - -

    This chapter describes the standard printer options that are available -when printing with the lp and lpr commands. - -

    General Options

    - -

    The following options apply when printing all types of files. - - -

    Selecting the Media Size, Type, and Source

    - -

    The -o media=xyz option sets the media size, type, -and/or source: - -

      -lp -o media=Letter filename ENTER
      -lp -o media=Letter,MultiPurpose filename ENTER
      -lpr -o media=Letter,Transparency filename ENTER
      -lpr -o media=Letter,MultiPurpose,Transparency filename ENTER
      -
    - - -

    The available media sizes, types, and sources depend on the printer, but -most support the following options (case is not significant): - -

      - -
    • Letter - US Letter (8.5x11 inches, or 216x279mm) - -
    • Legal - US Legal (8.5x14 inches, or 216x356mm) - -
    • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm) - -
    • COM10 - US #10 Envelope (9.5x4.125 inches, or - 241x105mm) - -
    • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm) - -
    • Transparency - Transparency media type or source - -
    • Upper - Upper paper tray - -
    • Lower - Lower paper tray - -
    • MultiPurpose - Multi-purpose paper tray - -
    • LargeCapacity - Large capacity paper tray - -
    - -

    The actual options supported are defined in the printer's PPD file -in the PageSize, InputSlot, and -MediaType options. - -

    Setting the Orientation

    - -

    The -o landscape option will rotate the page 90 degrees -to print in landscape orientation: - -

      -lp -o landscape filename ENTER
      -lpr -o landscape filename ENTER
      -
    - -

    Printing On Both Sides of the Paper

    - -

    The -o sides=two-sided-short-edge and -o -sides=two-sided-long-edge options will enable duplexing on the -printer, if the printer supports it. The -o -sides=two-sided-short-edge option is suitable for landscape -pages, while the -o sides=two-sided-long-edge option is -suitable for portrait pages: - -

      -lp -o sides=two-sided-short-edge filename ENTER
      -lp -o sides=two-sided-long-edge filename ENTER
      -lpr -o sides=two-sided-long-edge filename ENTER
      -
    - -

    The default is to print single-sided: - -

      -lp -o sides=one-sided filename ENTER
      -lpr -o sides=one-sided filename ENTER
      -
    - -

    Banner Options

    - -

    The following options apply when printing all types of files. - -

    Selecting the Banner Page(s)

    - -

    The -o jobsheets=start,end option sets the banner page(s) to -use for a job: - -

      -lp -o job-sheets=none filename ENTER
      -lp -o job-sheets=standard filename ENTER
      -lpr -o job-sheets=classified,classified filename ENTER
      -
    - -

    If only one banner file is specified, it will be printed before the -files in the job. If a second banner file is specified, it is printed after -the files in the job. - -

    The available banner pages depend on the local system configuration; CUPS -includes the following banner files: - -

      - -
    • none - Do not produce a banner page. - -
    • classified - A banner page with a "classified" - label at the top and bottom. - -
    • confidential - A banner page with a - "confidential" label at the top and bottom. - -
    • secret - A banner page with a "secret" label - at the top and bottom. - -
    • standard - A banner page with no label at the - top and bottom. - -
    • topsecret - A banner page with a "top secret" - label at the top and bottom. - -
    • unclassified - A banner page with an - "unclassified" label at the top and bottom. - -
    - -

    Document Options

    - -

    The following options apply when printing all types of files. - -

    Selecting a Range of Pages

    - -

    The -o page-ranges=pages option selects a range of -pages for printing: - -

      -lp -o page-ranges=1 filename ENTER
      -lp -o page-ranges=1-4 filename ENTER
      -lp -o page-ranges=1-4,7,9-12 filename ENTER
      -lpr -o page-ranges=1-4,7,9-12 filename ENTER
      -
    - -

    As shown above, the pages value can be a single page, a -range of pages, or a collection of page numbers and ranges separated by -commas. The pages will always be printed in ascending order, regardless -of the order of the pages in the page-ranges option. - -

    The default is to print all pages. - -

    Selecting Even or Odd Pages

    - -

    Use the -o page-set=set option to select the even or odd pages: - -

      -lp -o page-set=odd filename ENTER
      -lp -o page-set=even filename ENTER
      -lpr -o page-set=even filename ENTER
      -
    - -

    The default is to print all pages. - -

    N-Up Printing

    - -

    The -o number-up=value option selects N-Up printing. -N-Up printing places multiple document pages on a single printed page. -CUPS supports 1, 2, 4, 6, 9, and 16-Up formats; the default format is -1-Up: - -

      -lp -o number-up=1 filename ENTER
      -lp -o number-up=2 filename ENTER
      -lp -o number-up=4 filename ENTER
      -lpr -o number-up=16 filename ENTER
      -
    - -

    The -o page-border=value option chooses the border -to draw around each page: - -

      -
    • -o page-border=double; draw two hairline borders around each page
    • -
    • -o page-border=double-thick; draw two 1pt borders around each page
    • -
    • -o page-border=none; do not draw a border (default)
    • -
    • -o page-border=single; draw one hairline border around each page
    • -
    • -o page-border=single-thick; draw one 1pt border around each page
    • -
    - -

    The -o number-up-layout=value option chooses the layout -of the pages on each output page: - -

      -
    • -o number-up-layout=btlr; Bottom to top, left to right
    • -
    • -o number-up-layout=btrl; Bottom to top, right to left
    • -
    • -o number-up-layout=lrbt; Left to right, bottom to top
    • -
    • -o number-up-layout=lrtb; Left to right, top to bottom (default)
    • -
    • -o number-up-layout=rlbt; Right to left, bottom to top
    • -
    • -o number-up-layout=rltb; Right to left, top to bottom
    • -
    • -o number-up-layout=tblr; Top to bottom, left to right
    • -
    • -o number-up-layout=tbrl; Top to bottom, right to left
    • -
    - -

    Setting the Brightness

    - -

    You can control the overall brightness of the printed output using the --o brightness=percent option: - -

      -lp -o brightness=120 filename ENTER
      -lpr -o brightness=120 filename ENTER
      -
    - -

    Values greater than 100 will lighten the print, while values less than -100 will darken it. - -

    Setting the Gamma Correction

    - -

    You can control the overall gamma correction of the printed output -using the -o gamma=value option: - -

      -lp -o gamma=1700 filename ENTER
      -lpr -o gamma=1700 filename ENTER
      -
    - -

    Values greater than 1000 will lighten the print, while values less -than 1000 will darken it. The default gamma is 1000. - -

    Text Options

    - -

    The following options apply when printing text files. - -

    Setting the Number of Characters Per Inch

    - -

    The -o cpi=value option sets the number of characters per inch: - -

      -lp -o cpi=10 filename ENTER
      -lp -o cpi=12 filename ENTER
      -lpr -o cpi=17 filename ENTER
      -
    - -

    The default characters per inch is 10. - -

    Setting the Number of Lines Per Inch

    - -

    The -o lpi=value option sets the number of lines per inch: - -

      -lp -o lpi=6 filename ENTER
      -lpr -o lpi=8 filename ENTER
      -
    - -

    The default lines per inch is 6. - -

    Setting the Number of Columns

    - -

    The -o columns=value option sets the number of text columns: - -

      -lp -o columns=2 filename ENTER
      -lpr -o columns=3 filename ENTER
      -
    - -

    The default number of columns is 1. - -

    Setting the Page Margins

    - -

    Normally the page margins are set to the hard limits of the printer. -Use the -o page-left=value, -o -page-right=value, -o page-top=value, and -o -page-bottom=value options to adjust the page margins: - -

      -lp -o page-left=value filename ENTER
      -lp -o page-right=value filename ENTER
      -lp -o page-top=value filename ENTER
      -lp -o page-bottom=value filename ENTER
      -lpr -o page-bottom=value filename ENTER
      -
    - -

    The value argument is the margin in points; each point is 1/72 inch -or 0.35mm. - -

    Pretty Printing

    - -

    The -o prettyprint option puts a header at the top of each page with the -page number, job title (usually the filename), and the date. Also, C and C++ -keywords are highlighted, and comment lines are italicized: - -

      -lp -o prettyprint filename ENTER
      -lpr -o prettyprint filename ENTER
      -
    - -

    Image Options

    - -

    The following options apply when printing image files. - -

    Positioning the Image

    - -

    The -o position=name option specifies the position of the -image on the page: - -

      - -
    • center - Center the image on the page (default) - -
    • top - Print the image centered at the top of the page - -
    • left - Print the image centered on the left of page - -
    • right - Print the image centered on the right of the page - -
    • top-left - Print the image at the top left corner of - the page - -
    • top-right - Print the image at the top right corner of - the page - -
    • bottom - Print the image centered at the bottom of - the page - -
    • bottom-left - Print the image at the bottom left - corner of the page - -
    • bottom-right - Print the image at the bottom right - corner of the page - -
    - -

    Scaling the Image

    - -

    The -o scaling=percent, -o -ppi=value, and -o natural-scaling=percent -options change the size of a printed image: - -

      -lp -o scaling=percent filename ENTER
      -lp -o ppi=value filename ENTER
      -lpr -o natural-scaling=percent filename ENTER
      -
    - -

    The scaling=percent value is a number from 1 to 800 -specifying the size in relation to the page (not the image.) A -scaling of 100 percent will fill the page as completely as the image -aspect ratio allows. A scaling of 200 percent will print on up to 4 -pages. - -

    The ppi=value value is a number from 1 to 1200 specifying the -resolution of the image in pixels per inch. An image that is 3000x2400 -pixels will print 10x8 inches at 300 pixels per inch, for example. If -the specified resolution makes the image larger than the page, multiple -pages will be printed to satisfy the request. - -

    The natural-scaling=percent value is a number -from 1 to 800 specifying the size in relation to the natural -image size. A scaling of 100 percent will print the image at its -natural size, while a scaling of 50 percent will print the image -at half its natural size. If the specified scaling makes the -image larger than the page, multiple pages will be printed to -satisfy the request. - -

    Adjusting the Hue (Tint) of an Image

    - -

    The -o hue=value option will adjust the hue of the -printed image, much like the tint control on your television: - -

      -lp -o hue=value filename ENTER
      -lpr -o hue=value filename ENTER
      -
    - - -

    The value argument is a number from -360 to 360 and represents the -color hue rotation. The following table summarizes the change you'll see with -different colors: - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Originalhue=-45hue=45
    RedPurpleYellow-orange
    GreenYellow-greenBlue-green
    YellowOrangeGreen-yellow
    BlueSky-bluePurple
    MagentaIndigoCrimson
    CyanBlue-greenLight-navy-blue
    - -

    The default hue adjustment is 0. - -

    Adjusting the Saturation (Color) of an Image

    - -

    The -o saturation=percent option adjusts the saturation -of the colors in an image, much like the color knob on your television: - -

      -lp -o saturation=percent filename ENTER
      -lpr -o saturation=percent filename ENTER
      -
    - -

    The percent argument specifies the color saturation -from 0 to 200. A color saturation of 0 produces a black-and-white -print, while a value of 200 will make the colors extremely intense. - -

    The default saturation is 100. - - -

    HP-GL/2 Options

    - -

    The following options apply to HP-GL/2 files. - -

    Printing in Black

    - -

    The -o blackplot option specifies that all pens should -plot in black: - -

      -lp -o blackplot filename ENTER
      -lpr -o blackplot filename ENTER
      -
    - -

    The default is to use the colors defined in the plot file or the -standard pen colors defined in the HP-GL/2 reference manual from -Hewlett Packard. - -

    Fitting the Plot on the Page

    - -

    The -o fitplot option specifies that the plot should be -scaled to fit on the page: - -

      -lp -o fitplot filename ENTER
      -lpr -o fitplot filename ENTER
      -
    - -

    The default is to use the absolute distances specified in the plot -file. - -

    - - - -
    - NOTE: - -

    This feature depends upon an accurate plot size (PS) - command in the HP-GL/2 file. If no plot size is given in the file - than the HP-GL/2 filter assumes the plot is ANSI E size. -

    - -

    Setting the Default Pen Width

    - -

    The -o penwidth=value option specifies the default pen -width for HP-GL/2 files: - -

      -lp -o penwidth=value filename ENTER
      -lpr -o penwidth=value filename ENTER
      -
    - -

    The pen width value specifies the pen width in micrometers. -The default value of 1000 produces lines that are 1 millimeter in width. -Specifying a pen width of 0 produces lines that are exactly 1 pixel wide. - -

    - - - -
    - NOTE: - -

    This option is ignored when the pen widths are set in the - plot file. -

    - -

    Raw or Unfiltered Output

    - -

    The -o raw option allows you to send files directly to -a printer without filtering. This is sometimes required when printing -from applications that provide their own "printer drivers" for your -printer: - -

      -lp -o raw filename ENTER
      -lpr -o raw filename ENTER
      -
    - -

    The -l option can also be used with the -lpr command to send files directly to a printer: - -

      -lpr -l filename ENTER
      -
    - - -

    4 - Saving Printer Options and Defaults

    - -

    This chapter describes how to save printer options for your printer and -set your own default printer. - -

    Printer Options

    - -

    Each printer supports a large number of options, which you learned about -in Chapter 3, "Standard Printer Options". -Rather than specifying these options each time you print a file, CUPS allows -you to save them as "default" options for the printer. - -

    The lpoptions(1) command saves the options for your printers. -Like the lp and lpr commands, it accepts printer -options using the -o argument: - -

      -lpoptions -o prettyprint ENTER
      -lpoptions -o media=A4 -o sides=two-sided-long-edge ENTER
      -lpoptions -o media=Legal -o scaling=100 ENTER
      -
    - -

    Once saved, any lp or lpr command will -use them when you print. - -

    Setting Options for a Specific Printer

    - -

    The previous example shows how to set the options for the default -printer. The -p printer option specifies the options are -for another printer: - -

      -lpoptions -p laserjet -o prettyprint ENTER
      -lpoptions -p laserjet -o media=A4 -o sides=two-sided-long-edge ENTER
      -lpoptions -p deskjet -o media=Legal -o scaling=100 ENTER
      -
    - -

    Removing Options

    - -

    The previous two examples shows how to set options for the default -and a specific printer. Below, shows you how to remove the saved -option using the -r argument: - -

      -lpoptions -r prettyprint ENTER
      -lpoptions -p laserjet -r prettyprint ENTER
      -
    - -

    Viewing the Current Defaults

    - -

    The lpoptions command can also be used to show the current -options by not specifying any new options on the command-line: - -

      -lpoptions ENTER
      -media=A4 sides=two-sided-long-edge
      -lpoptions -p deskjet ENTER
      -media=Legal scaling=100
      -
    - -

    Viewing Options for a Specific Printer

    - -

    You can display the supported options using the lpoptions -command with the -l option, as follows: - -

      -lpoptions -p laserjet -l ENTER
      -
    - -

    Setting the Default Printer

    - -

    The administrator normally will set a system-wide default printer -that is normally used as the default printer by everyone. Use the --d printer option to set your own default printer: - -

      -lpoptions -d deskjet ENTER
      -
    - -

    The printer can be local (deskjet) or remote -(deskjet@server). - -

    Printer Instances

    - -

    Besides setting options for each print queue, CUPS supports -printer instances which allow you to define several different -sets of options for each printer. You specify a printer instance using -the slash (/) character: - -

      -lpoptions -p laserjet/duplex -o sides=two-sided-long-edge ENTER
      -lpoptions -p laserjet/legal -o media=Legal ENTER
      -
    - -

    The lp and lpr commands also understand -this notation: - -

      -lp -d laserjet/duplex filename ENTER
      -lpr -P laserjet/legal filename ENTER
      -
    - -

    Removing Instances

    - -

    Use the -x printer/instance option to remove a printer -instance that you no longer need: - -

      -lpoptions -x laserjet ENTER
      -lpoptions -x laserjet/duplex ENTER
      -lpoptions -x laserjet/legal ENTER
      -
    - -

    The -x option only removes the default options for that -printer and instance; the original print queue will remain until deleted -with the lpadmin(8) command by the administrator. - - -

    A - Software License -Agreement

    - - - - - diff --git a/doc/svd.html b/doc/svd.html deleted file mode 100644 index d2e8a592b..000000000 --- a/doc/svd.html +++ /dev/null @@ -1,296 +0,0 @@ - - - -CUPS Software Version Description - - - - - - - -

    -

    CUPS Software Version Description


    -CUPS-SVD-1.2
    -Easy Software Products
    -Copyright 1997-2003, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Additions - -4 Changes - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    - This software version description document provides release information - for the Common UNIX Printing System ("CUPS") Version 1.1. -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This software version description document is organized into the - following sections:

    - -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Additions

    -

    CUPS 1.2 includes many new features from the 1.0.x releases.

    -

    3.1 Filters

    -

    3.1.1 imagetoraster, imagetops -

    -

    The image file filters have been upgraded to support conversion of - Microsoft Bitmap ("BMP") and Alias PIX files.

    -

    3.1.2 pdftops

    -

    A new pdftops filter has been developed that is based on the - excellent Xpdf 0.90 software from Derek B. Noonburg. The new filter is - faster, smaller, and considerably more reliable than the - Ghostscript-based filter in CUPS 1.0.

    -

    3.1.3 pstoraster

    -

    The pstoraster filter has been integrated with GNU - GhostScript 5.50. The new RIP supports most Level 3 PostScript language - features.

    -

    3.1.4 rastertoepson

    -

    The new rastertoepson filter supports EPSON printers - using the ESC/P or ESC/P2 command sets. PPDs are supplied for 9-pin, - 24-pin, Stylus Color, and Stylus Photo printers.

    -

    3.2 User-Defined Printers and Options

    -

    The new lpoptions command allows users to configure - default document options and create additional "instances" of existing - printers, each with unique options.

    -

    The lp, lpr, and lpstat - commands have been upgraded to use this option and printer instance - information automatically.

    -

    3.3 Daemons

    -

    CUPS 1.2 includes two new daemons that provide enhanced network - printing support.

    -

    3.3.1 cups-lpd

    -

    The cups-lpd daemon provides support for clients using - the Line Printer Daemon protocol.

    -

    3.3.2 cups-polld

    -

    The cups-polld daemon provides remote polling services - for the scheduler.

    -

    3.4 Commands

    -

    CUPS 1.2 includes several new printing commands.

    -

    3.4.1 lpoptions

    -

    The lpoptions command provides user-defined printers and - options.

    -

    3.4.2 lpmove

    -

    The lpmove command moves a print job to a new - destination.

    -

    3.4.3 lpinfo

    -

    The lpinfo command lists the available PPD files or - devices.

    -

    3.5 IPP Implementation

    -

    CUPS 1.2 adds support for the set-job-attributes - extension operation as well as two new CUPS-specific extension - operations to determine which devices and printer drivers are available - on the system.

    -

    Further information on the CUPS implementation of IPP can be found in - CUPS-IPP-1.2.

    -

    4 Changes

    -

    CUPS 1.2 includes many changes from the 1.1.x releases.

    -

    4.1 Directory Structure

    -

    The directory structure in CUPS 1.2 has been modified to conform to - the Filesystem Hierarchy Standard, 2.2. The following table describes - the new file locations. -

    - - - - - - - - - - - - - - - - -
    Table 1: Directory structure changes - from CUPS 1.1.x to 1.2.x.
    DescriptionCUPS 1.1.xCUPS 1.2.x
    Backends/var/cups/backend/usr/lib/cups/backend
    CGI programs/var/cups/cgi-bin -/usr/lib/cups/cgi-bin
    Configuration files/var/cups/conf/etc/cups
    Documentation/usr/share/cups/doc -/usr/share/doc/cups
    Filter programs/var/cups/filter -/usr/lib/cups/filter
    Interface scripts/var/cups/interfaces -/etc/cups/interfaces
    Locale data/usr/lib/locale/usr/share/locale
    Log files/var/cups/logs/var/log/cups
    PPD files/var/cups/ppd/etc/cups/ppd
    Request files/var/cups/requests/var/spool/cups
    -
    -

    -

    4.2 IPP Implementation

    -

    CUPS 1.2 is based on version 1.1 of the Internet Printing Protocol.

    -

    The new scheduler supports the create-job and -send-document operations. In addition, the job-sheets -, job-sheets-default, and job-sheets-supported - attributes are now supported for banner pages.

    -

    The CUPS-get-printers and CUPS-get-classes - operations have been upgraded to support limited filtering based upon - the printer-type, printer-location, -printer-info, and printer-make-and-model attributes.

    -

    The CUPS-add-printer operation now supports the -ppd-name attribute to specify a locally-available PPD file rather - than sending the PPD file from the client with the request.

    -

    Further information on the CUPS implementation of IPP can be found in - CUPS-IPP-1.2.

    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/svd.pdf b/doc/svd.pdf deleted file mode 100644 index 22be31bc6ca26a1753d407b669974cd9c4e009e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 45647 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 - - - - - CUPS Software Version Description - - - -

    Scope

    - -

    Identification

    - -This software version description document provides release information for the -Common UNIX Printing System ("CUPS") Version 1.1. - - - -

    Document Overview

    - -

    This software version description document is organized into the following -sections:

    - - - - - -

    Additions

    - -

    CUPS 1.2 includes many new features from the 1.0.x releases. - -

    Filters

    - -

    imagetoraster, imagetops

    - -

    The image file filters have been upgraded to support conversion of -Microsoft Bitmap ("BMP") and Alias PIX files. - -

    pdftops

    - -

    A new pdftops filter has been developed that is based on the -excellent Xpdf 0.90 software from Derek B. Noonburg. The new filter is -faster, smaller, and considerably more reliable than the -Ghostscript-based filter in CUPS 1.0. - -

    pstoraster

    - -

    The pstoraster filter has been integrated with GNU -GhostScript 5.50. The new RIP supports most Level 3 PostScript language -features. - -

    rastertoepson

    - -

    The new rastertoepson filter supports EPSON printers -using the ESC/P or ESC/P2 command sets. PPDs are supplied for 9-pin, -24-pin, Stylus Color, and Stylus Photo printers. - -

    User-Defined Printers and Options

    - -

    The new lpoptions command allows users to configure default -document options and create additional "instances" of existing printers, -each with unique options. - -

    The lp, lpr, and lpstat commands -have been upgraded to use this option and printer instance information -automatically. - -

    Daemons

    - -

    CUPS 1.2 includes two new daemons that provide enhanced network printing -support. - -

    cups-lpd

    - -

    The cups-lpd daemon provides support for clients using the -Line Printer Daemon protocol. - -

    cups-polld

    - -

    The cups-polld daemon provides remote polling services for -the scheduler. - -

    Commands

    - -

    CUPS 1.2 includes several new printing commands. - -

    lpoptions

    - -

    The lpoptions command provides user-defined printers and -options. - -

    lpmove

    - -

    The lpmove command moves a print job to a new destination. - -

    lpinfo

    - -

    The lpinfo command lists the available PPD files or devices. - -

    IPP Implementation

    - -

    CUPS 1.2 adds support for the set-job-attributes -extension operation as well as two new CUPS-specific extension -operations to determine which devices and printer drivers are available -on the system. - -

    Further information on the CUPS implementation of IPP can be found -in CUPS-IPP-1.2. - - -

    Changes

    - -

    CUPS 1.2 includes many changes from the 1.1.x releases. - -

    Directory Structure

    - -

    The directory structure in CUPS 1.2 has been modified to conform to the -Filesystem Hierarchy Standard, 2.2. The following table describes the -new file locations. - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 1: Directory structure changes from CUPS 1.1.x to 1.2.x.
    DescriptionCUPS 1.1.xCUPS 1.2.x
    Backends/var/cups/backend/usr/lib/cups/backend
    CGI programs/var/cups/cgi-bin/usr/lib/cups/cgi-bin
    Configuration files/var/cups/conf/etc/cups
    Documentation/usr/share/cups/doc/usr/share/doc/cups
    Filter programs/var/cups/filter/usr/lib/cups/filter
    Interface scripts/var/cups/interfaces/etc/cups/interfaces
    Locale data/usr/lib/locale/usr/share/locale
    Log files/var/cups/logs/var/log/cups
    PPD files/var/cups/ppd/etc/cups/ppd
    Request files/var/cups/requests/var/spool/cups
    - -

    IPP Implementation

    - -

    CUPS 1.2 is based on version 1.1 of the Internet Printing Protocol. - -

    The new scheduler supports the create-job and -send-document operations. In addition, the -job-sheets, job-sheets-default, and -job-sheets-supported attributes are now supported for -banner pages. - -

    The CUPS-get-printers and CUPS-get-classes -operations have been upgraded to support limited filtering based upon -the printer-type, printer-location, -printer-info, and printer-make-and-model -attributes. - -

    The CUPS-add-printer operation now supports the -ppd-name attribute to specify a locally-available PPD file -rather than sending the PPD file from the client with the request. - -

    Further information on the CUPS implementation of IPP can be found -in CUPS-IPP-1.2. - - - - - diff --git a/doc/translation.html b/doc/translation.html deleted file mode 100644 index 2718fd170..000000000 --- a/doc/translation.html +++ /dev/null @@ -1,605 +0,0 @@ - - - -CUPS Translation Guide - - - - - - - -


    -

    CUPS Translation Guide


    -CUPS-TRANS-1.2
    -Easy Software Products
    -Copyright 2001-2002, All Rights Reserved
    -
    -
    -

    Table of Contents

    -
    -
    1 Scope - -2 References - -3 Character Sets -
    -
    4 Message Catalogs -
    -
    5 Web Interfaces - -A Glossary - -
    -

    1 Scope

    -

    1.1 Identification

    -

    This translation guide provides instructions for creating - translations of the CUPS message catalogs and web pages for the Common - UNIX Printing System ("CUPS") Version 1.2 software.

    -

    1.2 System Overview

    -

    CUPS provides a portable printing layer for UNIX®-based operating - systems. It has been developed by Easy - Software Products to promote a standard printing solution for all - UNIX vendors and users. CUPS provides the System V and Berkeley - command-line interfaces.

    -

    CUPS uses the Internet Printing Protocol ("IPP") as the basis for - managing print jobs and queues. The Line Printer Daemon ("LPD") Server - Message Block ("SMB"), and AppSocket (a.k.a. JetDirect) protocols are - also supported with reduced functionality. CUPS adds network printer - browsing and PostScript Printer Description ("PPD") based printing - options to support real-world printing under UNIX.

    -

    CUPS also includes a customized version of GNU Ghostscript (currently - based off GNU Ghostscript 5.50) and an image file RIP that are used to - support non-PostScript printers. Sample drivers for HP and EPSON - printers are included that use these filters.

    -

    1.3 Document Overview

    -

    This translation guide is organized into the following sections:

    -
      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Character Sets
    • -
    • 4 - Message Catalogs
    • -
    • 5 - Web Interfaces
    • -
    • A - Glossary
    • -
    -

    2 References

    -

    2.1 CUPS Documentation

    -

    The following CUPS documentation is referenced by this document:

    -
      -
    • CUPS-CMP-1.2: CUPS Configuration Management Plan
    • -
    • CUPS-IDD-1.2: CUPS System Interface Design Description
    • -
    • CUPS-IPP-1.2: CUPS Implementation of IPP
    • -
    • CUPS-SAM-1.2.x: CUPS Software Administrators Manual
    • -
    • CUPS-SDD-1.2: CUPS Software Design Description
    • -
    • CUPS-SPM-1.2.x: CUPS Software Programming Manual
    • -
    • CUPS-SSR-1.2: CUPS Software Security Report
    • -
    • CUPS-STP-1.2: CUPS Software Test Plan
    • -
    • CUPS-SUM-1.2.x: CUPS Software Users Manual
    • -
    • CUPS-SVD-1.2: CUPS Software Version Description
    • -
    -

    2.2 Other Documents

    -

    The following non-CUPS documents are referenced by this document:

    - -

    3 Character Sets

    -

    CUPS uses character set files to define the mapping of local - character sets to Unicode code points, as well as the fonts that should - be used for different ranges of characters.

    -

    CUPS includes files for common 8-bit encodings as well as UTF-8 for - Unicode text. The format of these files is described in the CUPS - Interface Design Description (IDD) document. Current character sets are - enumerated in the CUPS API, so in order to add a new character set you - must patch the CUPS source as well as provide a new charset file.

    -

    CUPS 1.2 supports the following character sets:

    -
      -
    • iso-8859-1
    • -
    • iso-8859-2
    • -
    • iso-8859-3
    • -
    • iso-8859-4
    • -
    • iso-8859-5
    • -
    • iso-8859-6
    • -
    • iso-8859-7
    • -
    • iso-8859-8
    • -
    • iso-8859-9
    • -
    • iso-8859-10
    • -
    • iso-8859-13
    • -
    • iso-8859-14
    • -
    • iso-8859-15
    • -
    • koi8-r
    • -
    • koi8-u
    • -
    • us-ascii
    • -
    • utf-8
    • -
    • windows-874
    • -
    • windows-1250
    • -
    • windows-1251
    • -
    • windows-1252
    • -
    • windows-1253
    • -
    • windows-1254
    • -
    • windows-1255
    • -
    • windows-1256
    • -
    • windows-1257
    • -
    • windows-1258
    • -
    -

    4 Message Catalogs

    -

    CUPS message catalogs are text files that identify the default - character set for the locale and a list of localized message strings - for the CUPS software. The format of the message catalog files is - described in the CUPS IDD.

    -

    Message catalogs are named cups_ll, cups_ll_CC, - or cups_ll_CC.charset, where "ll" is the standard 2-letter - abbreviation for the language, "CC" is the standard 2-letter - abbreviation for the country, and "charset" is the charset name which - may differ from the list above.

    -

    Each message catalog file is stored in a subdirectory named ll -, ll_CC, or ll_CC.charset to match the trailing - portion of the message catalog filename.

    -

    When translating a new message catalog, copy the cups_C - message catalog file to a new subdirectory; to translate the message - catalog to Canadian French, you would type the following commands:

    -
      -
      -cd locale ENTER
      -mkdir fr_CA ENTER
      -cp C/cups_C fr_CA/cups_fr_CA ENTER
      -
      -
    -

    Alternatively, you could copy the existing cups_fr message - catalog and then make any changes necessary.

    -

    Once you have make your copy of the file, edit it using your favorite - text editor to translate the text to the desired language. Be sure to - preserve any numbers starting in the first column, as they indicate a - new message number - you'll see this for the HTTP status messages.

    -

    Finally, add your locale to the list of locales in the makefile and - run the following command to install it:

    -
      -
      -make install ENTER
      -
      -
    -

    5 Web Interfaces

    -

    The CUPS scheduler provides a web interface that can be used to do - many common printing and administration tasks. The built-in web server - supports localization of web pages through the use of subdirectories - for each locale, e.g. "fr" for French, "de" for German, "fr_ca" for - French in Canada, and so forth.

    -

    5.1 Template Files

    -

    Template files are HTML files with special formatting characters in - them that allow substition of variables and arrays. The CUPS CGI - programs (admin.cgi, classes.cgi, -jobs.cgi, and printers.cgi) use these template file - to provide dynamic content for the web interface. Template files are - installed in the /usr/share/cups/templates directory by - default.

    -

    Translated versions of the template files should be installed in the - appropriate subdirectories under /usr/share/cups/templates. - For example, Canadian French template files should be stored in the - /usr/share/cups/templates/fr_CA directory.

    -

    5.1.1 Inserting Attributes and Values

    -

    Template files consist of HTML with variable substitutions for named - inside curley braces "{name}". Variable names are generally the IPP - attribute names with the hyphen ("-") replaced by the underscore ("_") - character. For example, the job-printer-uri attribute is - renamed to job_printer_uri.

    -

    Curley braces ("{" and "}") to indicate substitutions, and the - backslash ("\") character for quoting. To insert any of these special - characters as-is you need to use the HTML &name; mechanism - or prefix each special character with the backslash ("\".)

    -

    You substitute the value of a variable using {NAME} in - your template file. If the variable is undefined then the {NAME} - string is output as-is.

    -

    To substitute an empty string if the variable is undefined, use -{?NAME} instead.

    -

    5.1.2 Array Substitutions

    -

    The number of array elements can be inserted using {#NAME} -. If the array is undefined then 0 is output. The current array element - (starting at 1) is inserted with {#}.

    -

    Arrays are handled using {[NAME] at the beginning of a - section and } at the end. The information between the - closing bracket ("]") and closing brace ("}") is repeated for as many - elements as are in the named array. For example, the following template - will display a list of each job in the job_id array:

    -
      -
      -<TABLE>
      -<TR>
      -	<TH>Job ID</TH>
      -	<TH>Destination</TH>
      -	<TH>Title</TH>
      -</TR>
      -
      -{[job_id]
      -<TR>
      -	<TD>{?job_id}</TD>
      -	<TD>{?job_printer_name}</TD>
      -	<TD>{?job_name}</TD>
      -</TR>
      -}
      -</TABLE>
      -
      -
    -

    Arrays can be nested, however all elements within the curley braces - ("{" and "}") are indexed using the innermost array.

    -

    5.1.3 Conditional Tests

    -

    Templates can also test variables against specific values and - conditionally include text in the template. The format is:

    -
      -
      -{variable?true:false}
      -{variable=value?true:false}
      -{variable!value?true:false}
      -{variable<value?true:false}
      -{variable>value?true:false}
      -
      -
    -

    where true is the text that is included if the condition - is true and false is the text that is included if the - condition is false. A value of # is replaced with the - current element number (starting at 1.)

    -

    The character after the variable name specifies the condition to - test: -

    - - - - - - - -
    CharCondition
    ?True if variable exists.
    =True if variable is equal to value -.
    !True if variable is not equal to value -.
    <True if variable is less than value -.
    >True if variable is greater than value -.
    -
    -

    -

    5.1.4 Template File List

    -

    The following template files are used by the web interface:

    -
    -
    add-class.tmpl
    -
    This is the initial form that is shown to add a new printer class.
    -
    add-printer.tmpl
    -
    This is the initial form that is shown to add a new printer.
    -
    admin-op.tmpl
    -
    This is the template that is used to display an error message when - the admin interface sees an undefined operation name.
    -
    admin.tmpl
    -
    This is the template that shows the initial menu of operations (add - a class, manage classes, etc.)
    -
    choose-device.tmpl
    -
    This is the form that shows the list of available devices.
    -
    choose-make.tmpl
    -
    This is the form that shows the list of available manufacturers.
    -
    choose-members.tmpl
    -
    This is the form that shows the list of available printers that can - be added to a class.
    -
    choose-model.tmpl
    -
    This is the form that shows the list of available printer - models/drivers.
    -
    choose-serial.tmpl
    -
    This is the form that allows the user to choose a serial port and - any options.
    -
    choose-uri.tmpl
    -
    This is the form that allows the user to enter a device URI for - network printers.
    -
    class-added.tmpl
    -
    This template shows the "class added" message.
    -
    class-confirm.tmpl
    -
    This is the template used to confirm the deletion of a class.
    -
    class-deleted.tmpl
    -
    This template shows the "class deleted" message.
    -
    classes.tmpl
    -
    This template shows one or more printer classes.
    -
    class-modified.tmpl
    -
    This template shows the "class modified" message.
    -
    config-printer.tmpl
    -
    This template starts the printer configuration form.
    -
    config-printer2.tmpl
    -
    This template ends the printer configuration form.
    -
    error.tmpl
    -
    This template displays a generic error message.
    -
    header.tmpl
    -
    This template is used as the standard header on all dynamic content.
    -
    job-cancel.tmpl
    -
    This template shows "job cancelled".
    -
    job-hold.tmpl
    -
    This template shows "job held".
    -
    job-op.tmpl
    -
    This is the template that is used to display an error message when - the job interface sees an undefined operation name.
    -
    job-release.tmpl
    -
    This template shows "job released".
    -
    job-restart.tmpl
    -
    This template shows "job restarted".
    -
    jobs.tmpl
    -
    This template is used to list the print jobs on a server, class, or - printer.
    -
    modify-class.tmpl
    -
    This template is used as the first form when modifying a class.
    -
    modify-printer.tmpl
    -
    This template is used as the first form when modifying a printer.
    -
    option-boolean.tmpl
    -
    This template is used to select a boolean PPD option.
    -
    option-header.tmpl
    -
    This template is used to start a PPD option group.
    -
    option-pickmany.tmpl
    -
    This template is used to select a multi-valued PPD option.
    -
    option-pickone.tmpl
    -
    This template is used to select a single-valued PPD option.
    -
    option-trailer.tmpl
    -
    This template is used to end a PPD option group.
    -
    printer-accept.tmpl
    -
    This template shows "printer now accepting jobs".
    -
    printer-added.tmpl
    -
    This template shows "printer added".
    -
    printer-configured.tmpl
    -
    This template shows "printer configured".
    -
    printer-confirm.tmpl
    -
    This template asks the user to confirm the deletion of a printer.
    -
    printer-deleted.tmpl
    -
    This template shows "printer deleted".
    -
    printer-modified.tmpl
    -
    This template shows "printer modified".
    -
    printer-purge.tmpl
    -
    This template shows "printer has been purged of all jobs".
    -
    printer-reject.tmpl
    -
    This template shows "printer now rejecting jobs".
    -
    printer-start.tmpl
    -
    This template shows "printer started".
    -
    printers.tmpl
    -
    This template is used to list information on one or more printers.
    -
    printer-stop.tmpl
    -
    This template shows "printer stopped".
    -
    test-page.tmpl
    -
    This template shows "test page printed".
    -
    trailer.tmpl
    -
    This template is used as the standard trailer on all dynamic - content.
    -
    -

    5.2 CGI Programs

    -

    CUPS uses four CGI programs to manage the dynamic web interfaces:

    -
      -
    • admin.cgi
    • -
    • classes.cgi
    • -
    • jobs.cgi
    • -
    • printers.cgi
    • -
    -

    5.2.1 admin.cgi

    -

    The admin.cgi program handles all of the printer and - class administration functions and is run for all direct accesses to - the /admin resource. For most operations it uses the -PRINTER_NAME and OP form variables to specify the - action requested.

    -

    The following OP values are supported:

    -
    -
    accept-jobs
    -
    Accepts jobs on the named destination.
    -
    add-class
    -
    Adds a new printer class. This operation also adds several other - form variables: -
    -
    MEMBER_URIS
    -
    Sets the members of the class. Multiple MEMBER_URIS - values can be provided.
    -
    PRINTER_INFO
    -
    Sets the printer-info attribute for the printer class, which is - usually the printer description.
    -
    PRINTER_LOCATION
    -
    Sets the printer-location attribute for the printer class.
    -
    -
    -
    add-printer
    -
    Adds a new printer. This operation also adds several other form - variables: -
    -
    BAUDRATE
    -
    Sets the baud rate for serial devices.
    -
    BITS
    -
    Sets the number of data bits for serial devices.
    -
    DEVICE_URI
    -
    Sets the device URI for the printer.
    -
    FLOW
    -
    Sets the flow control for serial devices.
    -
    PARITY
    -
    Sets the parity checking for serial devices.
    -
    PPD_NAME
    -
    Sets the driver name for the printer ("raw" for a raw queue.)
    -
    PRINTER_INFO
    -
    Sets the printer-info attribute for the printer, which is usually - the printer description.
    -
    PRINTER_LOCATION
    -
    Sets the printer-location attribute for the printer.
    -
    -
    -
    config-printer
    -
    Configures an existing printer. This operation uses form variables - of the same name as the options in the printer's PPD file.
    -
    delete-class
    -
    Deletes a printer class. The form variable CONFIRM may - be set to any value to bypass the confirmation page.
    -
    delete-printer
    -
    Deletes a printer. The form variable CONFIRM may be set - to any value to bypass the confirmation page.
    -
    modify-class
    -
    Modifies a printer class. See the add-class operation for a list of - form variables.
    -
    modify-printer
    -
    Modifies a printer. See the add-printer operation for a list of form - variables.
    -
    purge-jobs
    -
    Purges all jobs on the named destination.
    -
    reject-jobs
    -
    Rejects new jobs on the named destination.
    -
    start-printer
    -
    Starts the named destination.
    -
    stop-printer
    -
    Stops the named destination.
    -
    -

    5.2.2 classes.cgi

    -

    The classes.cgi program is responsible for listing class - information, including jobs destined for that class. It is for all - direct accesses to the /classes resource and supports the - optional form variables OP and WHICH_JOBS. If - no form variables are supplied then the CGI lists all or a specific - class and the active jobs on each class.

    -

    The following WHICH_JOBS values are supported:

    -
    -
    completed
    -
    Show only the completed jobs.
    -
    not-completed
    -
    Show only the active jobs.
    -
    -

    The following OP values are supported:

    -
    -
    print-test-page
    -
    Print a PostScript test page.
    -
    -

    5.2.3 jobs.cgi

    -

    The jobs.cgi program handles all of the job functions - and is run for all direct accesses to the /jobs resource. - For most operations it uses the JOB_ID, OP, - and WHICH_JOBS form variables to specify the action - requested.

    -

    The following WHICH_JOBS values are supported:

    -
    -
    completed
    -
    Show only the completed jobs.
    -
    not-completed
    -
    Show only the active jobs.
    -
    -

    The following OP values are supported:

    -
    -
    job-cancel
    -
    Cancels a job.
    -
    job-hold
    -
    Holds a job indefinitely.
    -
    job-release
    -
    Releases a job for printing.
    -
    job-restart
    -
    Restarts a stopped, cancelled, completed, or aborted print job.
    -
    -

    5.2.4 printers.cgi

    -

    The printers.cgi program is responsible for listing - printer information, including jobs destined for that printer. It is - for all direct accesses to the /printers resource and - supports the optional form variables OP and -WHICH_JOBS. If no form variables are supplied then the CGI lists - all or a specific printer and the active jobs on each printer.

    -

    The following WHICH_JOBS values are supported:

    -
    -
    completed
    -
    Show only the completed jobs.
    -
    not-completed
    -
    Show only the active jobs.
    -
    -

    The following OP values are supported:

    -
    -
    print-test-page
    -
    Print a PostScript test page.
    -
    -

    A Glossary

    -

    A.1 Terms

    -
    -
    C
    -
    A computer language.
    -
    parallel
    -
    Sending or receiving data more than 1 bit at a time.
    -
    pipe
    -
    A one-way communications channel between two programs.
    -
    serial
    -
    Sending or receiving data 1 bit at a time.
    -
    socket
    -
    A two-way network communications channel.
    -
    -

    A.2 Acronyms

    -
    -
    ASCII
    -
    American Standard Code for Information Interchange
    -
    CUPS
    -
    Common UNIX Printing System
    -
    ESC/P
    -
    EPSON Standard Code for Printers
    -
    FTP
    -
    File Transfer Protocol
    -
    HP-GL
    -
    Hewlett-Packard Graphics Language
    -
    HP-PCL
    -
    Hewlett-Packard Page Control Language
    -
    HP-PJL
    -
    Hewlett-Packard Printer Job Language
    -
    IETF
    -
    Internet Engineering Task Force
    -
    IPP
    -
    Internet Printing Protocol
    -
    ISO
    -
    International Standards Organization
    -
    LPD
    -
    Line Printer Daemon
    -
    MIME
    -
    Multimedia Internet Mail Exchange
    -
    PPD
    -
    PostScript Printer Description
    -
    SMB
    -
    Server Message Block
    -
    TFTP
    -
    Trivial File Transfer Protocol
    -
    - - diff --git a/doc/translation.pdf b/doc/translation.pdf deleted file mode 100644 index 75a4fa938c1d03d82142f73bcb5e4263df2c5f89..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 50787 zc-pLc2|QG7`~M@^No5ULN@dGzW^5s33&|j2EMtsiEW?Z;gbp&KcamQA`4~R_x4@;3s#6I zSQKxMJ9G$ioPc*AVXy=VXK!~m2Rud;BC8+^g@|h6J^ctSPR`z<5Jg4#gHSLSDyoGh z`iYw09ld?g1gt1+rZ-VWRNc)@6iJ~aiXyQ@EWrosAS(&dBw*3rE_jb4Xm6~<5hV%- zumVI542B`Va?)VnL=t4`;_Zf&&@?-4B5F!Ndl22IGemVrE)G~pkUGiR8BdV-9qivC z0=ywq5&x?!lB%j$4+lV9R_J%NP5nHvAT19J-oeGg33SB8(Gg3)dSI|bD^VB}MD#>s zupsOyj2qe=KprG_dn|$I;^YBxz`MDj2_R1_0fY7M2BF=7Ga}lZdgZe+8I?;5Sr+XCAbh>L7r|TA_#+bcSnQVT|9tufQ1X*0R-59=nV45 z67V3r2NvY*iwAi-6R=p2Bc4P6IlA~@K}45RAR^WW>jA=2d3v}2gc!UV-UAqRccGoR zVTnW#){BI8136JVfh7RKVTly`g3#U|b&v)~6LbWm1=0rTfOJ86prastkO9aLbPQw! zIu0@hAweb}Q;-?x1jrm@0Xhk?1lbeN7+0(}RV91ilqTxt=r{E+E-n}s0*2%cB6&Cf zR>9y2SU>_aAU7Ih55j;PK!7eFCy+D91%v~+g4{svAP*28}nQ1t+L6VMJ=cQnBjMEnJiHWd%33ReW3bZ`NJ zl_LL-aq58g^#D<$krH8Ul(5E-2$Z1q1Ni}=Vo$)kVm&BEBw{htDEQ6>^DU7;c!Gl? z5JA*{qJX<$-SISkyWyQ&FlaXqyf?_%&(j%TNWeO|P@u35Aa^u|BCZ40i4v%k$fkuf z5WGYZHLeM?ApU-Z#*nAS%zq3G7 z&4309%{Mb(X_K+E$=DwzW53UGq0zX|Xk31varsVz1hw^E-AB@W1D$i*@tCdIQDtx6B~_2WJ1M zEd=_1;rIvdLjH&RF!6J@$GiPK^_PUOFtW!1P3Ze)?i@$Q~L2l4P0l>-@IJ)8hSxFQ@b zO8uy+61{=dlsoIGzUfrkfOHwIbKQx=ekY>Gi&j6Mg4WXVyW{C^mp7#F^LJPzp0@lI z8Q5G+RGHSOJy?rpoC9D_Pzj1O`!e@8Ps!V&qqGid)X{Ccrb(LStbsD-W#chtR3h?yK)>%C}*5P>pI(O1$?=Yc)_0dUpuupQQ6G_i*k8(%mSzKdNthZy> zmh`UPZg*Og%+e9rqC+PxGrp19`{pQN7UjNEOVMv^rZ$%%~FsrSln6nDk>==3FN zUg;x>kS*r%M@)|mmXswH=6BLfadDV-(MfZ277NdR1n+I)28-^Nmu(E-AmRrNLT%W(CyQ1x$4-hiXyj z%Ug^Gt*`4n942^aa`^juG+IKt3}nYVi#l@@HLt-+EkX{-3tomeNXF%{q)!W<`|#wg z)Y!f1a(U?rU6s#6-JW^@pgkA&NFIF!M2(=bGBR)EbMDDtKTDVl}`C(X{4@P zTGx$%rtStf>M31wKFZ9YHhckH9Fuq6t>mJSztiyKZLen!WJh_)`^$!Fv@Rrt=S92u z+{(;P8`-&I8=ps;$o|qk=5uV1Vy+qy#LQGvdDyU8uf)xF7(3{i#!AZOH?>EHCkx+U zk@V|8ol@6_hKNNFxBqOvh>9AS4kA(7T2~VHdrcH(-yPqU= z_SEgOH{%%S8cHm&v~@_z9OrXu(!8+>0YC#L)ul<7sU7@H^_n#AA8%91j**WabTvtpu_NL7HkUSBducCbYIlVDr8@FspV04In;nIiv zN+B;uC*PgYvJ?sa5)W(fnOA1nvRe!h_tI**hprCRF;glNy=N^C5G(O8ucbek<72+TV7vgzN+2 z7t^`$e*f{?*_Ipcajy;|=*1&*ae8 z5wDt1=T%Z-s>OZo-FBoWw>{||IHgo3hG5?HSE$eo`~IR`8{mNrA>wW|ku9qac22wS zkT35QZ0abyc=}SEnM-M1C6mrQG1jxzbYex5{=QzU+wi`1N8&WFn@mUd2ViB zKg2wJ__B$y)IBlbX)eZ(gi|%nCMsi-a;STQ4@R{3-;~D6yyAaVmnA}c?PfMCHNv8A zbN0gW#2&ABVEkCi+O$e*nZ+0qb~~01DiD$;g^&m)2_L&3Cq^`jM9b45H~uJN&0J=j4~b${UQ>hRKm?z)w#Xo>I|qW0NI*HRxLa%!4>nx5JWYF~fg#2iO1 z?ETw_+TsoZX?1=ybh>KcFGiTKH)PmzpCuU?Jo9AeK}Ua{q&(?)J^i_xQ;-!&a=`60C)Lx4?94@G= z+&iuHIi(|~cIZf{u&A$B?XUnG$HU~grf}HZUSvB8X&I?h7dMcG=HuGdn|;auy?66F zI#Yg9ji*ZIdAXCHtlarHg~;f1Bu5KKPI2LE^Zgg7nkQySrG#z0g&lTTs1_)_DStPn zL|D!F-o_$I@|^2)=Tmd0Z%RA2qmrji`^Xxm`@FYX78&IM52MH0;5{6zBvs{viEVad zE6{<4jWF8J6@gQ;~Iiw>J9WBHD|qA&?Kbv1O;Y z+y#0IFVUOFjWv-T8@g)poufFQR$H6gw6|AJEwZ>Os&?wM1R1?|Z|@}$;U)htnA>bz znLPGfGX%ak3-VnqbEnAhS#_-52vQJUn}bA^97x#l`v*KI_gJE!j=&Unj@i^05c7%9jzxm6mES{kU;JS;n^ByvsP-PGms zoLWgAwp40cLT9$$btyH3AKy4m5p{I0*z&!~MnT!;qnxPF+DwF$$hhss&MoG-&`io50^5=T&2s)+f{mO zO!kD3Z1JUJ?X7&WQ%l;DPtEp!;+;Mr^3epK`Pvj!?ZX-t!l$i*8F=%%zUHytaw0Oi?z}zQT zC_binUz+*XUBWo88+Lb-Gw$Z;zwH|kX>7dmYH&ICwB5j9|$hoc)YH4{DhMn`=s$1Vl8B8cV zf{h*vmE4c?{fKJpA5z{JH35@d#ZN)&Vv?XS(Ih=ow_!xvH5;aPWvL|98w+$j`>wn- zX^R1Fe0&;YxMqi1-X7T1KgFlUeHn!4?Iy%&e`gbFWLX+7?Irn*uJRc=6sX0>;bNPx&;*qD;mMi7Zhy z08a_8-BB+wU1sfRJw_4toI}QRH$;ihU9zsp)@urk_+_Mwe7#*}hf1=ynh;OOkqu`f zC!kFP6PhbikSpT^gle;LqPy1wqV{<(cV6Pu<&xYE{1#7=WB4vF(!jbz z{FWIb?B(W(b-_uSmbjqH%|QHN{nhepWpnNqRE9TOB-C{e2Cm8_ywF~HC0NPb5VkX+ z>{$I=rOG3X75_@Vs>t>^75xt0#%23JVrx4#`1L2H(%cOzvVS~ki6i!fR4IzLWe7D- zR6HnS-db$EFX8j!(I)d}Slcu1RTAb8kCET9F;>M6HO{pb|J6GOoR`ebDdt~h18&YU z&>v}>g1Hj-~{PJ-(yxF!f)SU>n_t#vP(f~8RJWK~>M(KdR! z+jrj!!7T1@*tNiw8c#oH60#fFr^Ix^^7T%;0d?G$X|p}MorR%v+iT+|f2@;rh0#g-A% zXvy244>MC&^z(J!GiaCHYGhsaffG($ENNO~whv2!oMA8Bv$Kvh-SasnT=is>P!`m@ zTv+|cF5U&_TXEtVACB)30nXaZ_nfmzViQ}q#LRT_1FQdo=Q?|Ybgpju%TfiiBX&#C z>gAH;_#?;@VkN@+4#)AWp60oCDF?-TtNnzSU};nM%Q8K4F~NR1^U`g@5}s0jeP-IB zRVQ|lQ{-cWV7TW4T@c$@UI?>J_=mjy<})fOtAlM zZB#ewe*RTiiS0|8dzdFWeDB^mz|z>s#l9ZP_+GE3=;PM=YO663dC@_k!(6jx94hpU z3itZoK5WDli#@=vO8DzC(c)BS@#jqLi}s`82l$5rlrhl$*rq-s*y~7czFc+(cL(o6tYn zdnPv{YWg9|In6DfSe?W) z4|S%=KfilwhbDL3bDpRA*RkwHVyYhRcX7Fe@E3_6<9x5kB@@@d9v{!>DctfUDn4Sh z@Yc9N;VbjjeP*pUoeT?;uE<#3TMkKsS3CNkdHg*7a((J_Vw?Kxj>4?>Elt(uEko`P zq$!U{Ou*>|l&C8#9E(u+oSTW&;CL;?=P$3xUgpVrIxl3fb$b|2 zWocsOIqH-qyTtChVXcQ}apzqs3maVP*#@>EGWLBn{OssFvh!KzwU>%|d<$(6{JLEF z2Sixgt{^V@YFph3a$>*k?o};J{y>A%q)tw--L%dh<-^5Tj{^UnRz~Lv=X)i~N1= zV`r7#pncWvvHF^Q8EriBq|v{7FF!}K5a*eMb%tlD*T?Fh`aGW_J7?_FoRBpWwRRt~ z4at-04ap@jj9(9J)GD2N_>!lKv*{Hou$oRV=!IhLm#pBH3+>&7C6^aCNrn8pYCKFY zOA_g?iMNy9R43aAo-EBhYxU7qY2(DbEU(#`eLI8vv`=D|Yu2Wi4#=LPQ*OU+o}yR< z$&qPhQch?-W8E>>8ocIP{k2?KM|Kiw;CiuOHr=mt1xJ!qiAyo^`M1tx^l+-63*SOV7HsYKx}=30mokCGR*6B}nw#o|BWE z;ceS;Tm4<6hEm~pCAVymfOLkJmfeN->6$xx-(EZ4u5{CjBweH-)mt+M8vZNgX>s;G zB*8WtrSI?5G{+V1TKy#Ls+`W4rCVf2r_Fm5n<2#Bepi@llBD*beyry~XnpocMj_dw z{%>|BSC1uIE5FYn93m$bhh3t3I0QN zq^RqfyPeT*Z%EhOtA|*>=1d4a>HS!KI6RLp$bGK6QYWZH)vaUbBKD4|FxjS}4rZZR zdWhrId`?_U9^d0s?8iF=Ri8)R-Z?RpZL_{u2TIWNhwmW;=*h|^+2(FX3EdmNQMI-` zG%Atr#tePM_#XCN9lu6wQdK~S!K0FnPQ2m%cJg@R$5fZ%@t z0!91;qVQ)BIRu~s6hbi?0l0 z^^3#bfx!Rl6fh;UAc|Cb0f>lyfr5ZRenR=jq=zB^6gdS2!0AxnFPw@f_b*W76u>{B z$p0Bd9!?2k7y{6Uf(ZQ=D9~R}6#k5Ypm+odRREk%LHtb^Lw<}f1m)@n6vaQI$SF{Y z3k*s{g#6a~Kcc|EKUEjlpA%mW2B&zR>KzK=@4WwGAj1$p#TX3oXI-F_l!pN6FGod` z`xhusnBq?;&_APq6)8!nC=bLK1@SlDhyGYzAito%{)hror2K^_z-3`n#NT)y`eTg2 z<$v-%OzzJp3Q&so!C*iam?Hdl-v0>&3je8r!T#9pVQ^}@hXVBraO&^cJp}p>RSfp$ zeh-tQ_Io&d6A}6^P=4txus=6^7>v^JA@UTnQ4qoZ0tF8JDfMBSsc%KgDcV{FNn33o zY3l(btz#o;Jrzl7dPrJVLelyMl2+M~wAzcL6-OkkdLe1$1xd?)BrQRav{u*`q}T@ym-3vfy;rMB!}O{p$QMgHN1EXe;skbl+5DgBSKhNE8xHq`Y$JgLT7uVhNz*N3=~qrpG{V zFtDaPe*B27i6<6g>mw%%ll63P{6VchcU(E@GE0uSc%;_f|Du=N&w3&LKS+Mu0BQJ( ztba}`N`;dH5{lYUDOLQx$cp$`R)v3#1sANhqb#1_1R^+MD8CShyrQi4DeoV|Qv6pn z1z1ifLSz+bRqVfrrSS7he&GL2EGQ-Vei91~`Bz1VQc9tes!b_-|0xz#jvvH={?B45 z{2~_Y&tgI3zpq)Tb@IQ6^~)=fa{sefzc>;8=RAOcVVlJo28f9GZ}|=XIS=57|4}Ri z!1iac{v7g9U@43M#G*8KiirOuJ>frxJY3;_7VFp8`g6!b<>e`v2)JL7D&l_$dHByE zj{twGhO{0cM{7ZHwB7@!H61vu+rViga2g3!obPoL@ps@;nkW(2A^wc>cMR*hI1sH6 zRF;4DRm9&BYT)AT;!U)YfJjPs|NRdsvP8;%$4FX(j-lPL)Vm0(-z6Znz$tw56e@{8 zY@Wg-5mZ4XfH4Ky358N|^Asv6Pt7t3n4~;aO9?qid8*73a7lR>?F5)0FZb<~asmH- z0nA5yzW{j1f4>0uC~RH;M2g=|f$0k1?-x)>1<3acn4|*q`-PmO0u3D@sX)U?^%bWVg(N0(*<^KjeyhWi*gq3~+>P9yd2T;LU9gc#{sYNe9`a`?e|iwjJ8s2yJ?e zb<@(oag%Oy!?S4vR>ic@2K^^>zqE0WkhAueZmf zTDLEikW$;n%@3VB_&n)-6t`dELzj*#d%UvV7om+T`N*%MQ+ZdGNB5VieRg)87NiTE zTeF$nGh6&nJo0vS@K^LkU*E>G?eZLHtYBz;R^;o-)IgJw@5VdW_>G4J$Y7%E|s?|Z8!uJXagm)Q6R2XL@$T?*Cz}cJQD`ZRY$TC~2avEnvd~4G?%XGnG%)Zpu-FHj-^5)7qN#jfni=L@g zAk6JfdRI~rhm8Acvh)jlpxwdokkP*M40^{6;hsxG#j>R7!;0^jY({nC_VivpW;LuikiR(?EwLukX1rf2@9yqu+J+7(R2iaw%ppx1YW|F3=9!d{x6ki>L~bBCcvG zeVM=$)$~*feUgPNxT=(|&CCZZb{fl(&$N<*w5D|Cxm9ks@~*$17;txJO)?$xA_?*NXxx=Bp^DJr z+K)=Y9WO@7dGJU6@Uobu>O6kMPp0W;>&CY9xUCEJPGH4TJo?2WI+tvxKgf6WDc<93 z8L@Zj{>*PKQ=GT5MD`J}J_7PN5kq$C4=vWW3(6f`7sio{3Ti7(UtJsI&5vUd#<_dH z>OLmb^5}-B6MOy0rw7@_xx1Ag4eC{TTNbOHKM5|4JXx&zWYVH9c8=>aYk79-e4M>b zYw@8j=a0QbO9?Bj+Z7EZ_xILm-L;O2u*_NSn-49JC5mdebl!!qU@TJC9rJo7WEBdX4i$(`+FvKWEYEdNHJFwR?)l%Ki|5MeF= zL@qp6npbaY)0f1?m)n+G2h3aRByi7n$0}`0^63YAG#(0A(>-u7F?!$WVjoSA}W!D&73$klm2Imc*v?w=G z8T#OU?uFktLoLp)yex!Vx$NT+7%iT-jm!&I`tZ0Ryf}`>I$&aFkYm&YzngLT{hE>~ zwdO_giN?eF;N_(o4Y=Op%}$ReJZsAW_MMbLN{9JQSFSDA+ABq)y87r|cYBmQ3o>`z zD6ufmNvZ0C7)_*A%6EI8gqX)Tx+?ihzr)Ss6%%J7pKbRwPG6nmw{9QmelJyS7h?Hp zm7`p+=e5oOwy_-J-K}XaD!QyJd_~RyDtGb~uazm^&1 zEKh(nc-K4#=OV&|-4`P%V0)M2;|kNU7V~t)=waNhbRF9mMs7CV?Cwr{((A(H-M+7Q zqxWA+!}XhKC-e=?&f=D<+=1Jv?`p=ijm%$QtiV;7mR)@peEQ-)l}MH1F3ddOZ86t> z*Hf_jxF0)|9^Noun~R&iXFAk$&j{?sHnu!%Fi&_c>#<@T;}OFvbKG@f&T=F$)W;TF zg|Y4)+q&3sC)1|;eXN6R;o+Dp^T7|(YOc0Lekm2%uQQ{Ky>9G3HJg$R8Cx>!TAiK= z7;;A1)elsSUh3$Wl^*PNRw%KzI2g0bT7ET!aZh9DTt#(mPa9k_hU`9zBa)4Z4#%`@ z69J~@6;C}WdGV^Tu0Bd2^#~w_@*}VQDXrk;wuAge88SFI#@2bnaIOdyse8t~c@_tc z$5el*>cCcDrdc;EN4(ej+kl`LX>`4mmuy$nXEuL4{lb~$D(gls*~H~T&DqvigSwSK zSDpS+J0P}?M_4LzFLQSBvvoD8Fp2{sFRrtV<+(eFyzV%=xb#(D`n3iCJy4mw`yKn( zwM=6!_T{@V!_DP=*A?XwdmnW%Mrj_5Q@6|5&ws*oZ~r^%gE6-*RiohkY2d6lG7-yL}1+EHRPx7MSLcB$S{95!w=P<25769NQVOGaLgQvq+Z$i95s z^uwU+OvTanUy){*7QlP2F&B3&#uOdCdyVZ2GTF!$yphn!oTrv?(`w1W5d0W_+h=eh z$b7FnpUiu!vgKa=6k|+_ner4|_HAZN`SNmA$NEYr0}d`S3Pe|-!Y)Lhy`dz~1m3Wv*vDerw-^>@C0zYk>~*eBJVZR3q?*4FoRbY< z>~3>cYdj+RA;tbHh^LsC&vD9F|J`t`z4}n6u?@&w8&GvRF)GDyk>^>%APb%9(m$I}nU7T^LWx>NOKXYH+7wUe~jaPJZ_VAh30p#%8y^8q=kCu$p@Ld&5mRYd}K@0QrZtGB?DvjYU53&5-2fZXYGAeRKQS;le}&vET;4q$w|a5QjL z7qXm?Yw3#Hpx|9|(elfu2*|l-Fp!I4{S!AEnQ)<{k|U6@Td>x}pf20ek$ZMQfaqka zuZO9Da60H_1OJKi_}6bN>;S}Kq72&{o`*+&Iq}va#L~aJD1h8WxMRqjw;~1U@ep{# zE#F5DU-|r(zDt3K-7;yMv(P{FW=GF_(b$a>gvt$Mb(@zhZ%!t$g@f^>N)Mg3#hRq= zdFyrfWlpd_{A2rtHhA27f682E7ctPGakhu57emeACz8 zOSa*?GOh|*f{yho+XhtQ8f-EgKVW4F&ASRKL(u`3`m{NH&sCZW=iNFTFusRaJu*BN zRT=FU@!ZO(mp6A;z@_A(grX-l#To!asYw7s?NYA519Pw&2!Ikc*AscE z4B4=DE2fB+LE{EU7%A{@b0G6VhHt>Qpi$_vdA8+!u3@duHWIk`i6#>8OaX+{Ecvar zp+&Ya7cWNL;`UesT;$+zRZ`)_WR@sLB~@lu`-Cs8n%|*LzzM%y(46SZZtC2_*;Jk}P=y2h7#~OPXX11K9Lh`#3 zH9+(ri;4r$)z<<2bX(7cgI~36k;m0&;P%U80D>gucN#~FB$sgJvLo(H*+R8qk`3l< zZ1|j$3=Z&OrTE*pbCL{pI8w(iB|qD|!pc15wojJCbvalrxo(KQxKN54%aGz%&CxJ` z0hCvykgz1$>5tS83O>wO^gUcvg5N?zc+WCG4C(BXw={?|)Z4Lcf5E+V-XxLpDhFfx zwL;@7HAR^VX z3jx|LPYS>7jz~KhU5Zq=t_;sOKB=(rw&-V52SAeGu`JQJJGcHj<@2`g0^+uNiWzpF zGzOBlxM$tB8_d!6;j6>#XJ`oJ-dZau+LG}k@kR~mp#%7|_2C#CtDI7hZCJ<9`@+Nu zp~*Xv4(D_bz?6q54-$3luk z8P2<~W&>spoVEH=kya$Z(C~%(v!9A7OcKnS@x< zDKJ!fvgR^UbUXvmqeI}3HxpRiQkX6=yRs5r5W@VT4vmIDf0lv`c_uOIi~w9RqqNrQ zVolwbJ-tBU-braw$$Vh{aYD_l>uh+JfkiX}`hvi=s3K8H9srr#6WGnIwq$QGC}dlE zJAQy|?6rML;nsO*{Dk+*Y!>}4Pm9p%fWzmL3i*j3k#$u>gPcrPHcMWcdv;ji{xNa| z6b%^@Iq8&C#lm-mR)dGlDr_7)rSUt|4RRw1zmXAj{nt7U^lL z718_)E0RxFw?}s{SuJhftaW5WNFobhQ%W^#sNgoBSnV~2dtoPUyBB0^ko(5MdVN5B z#iMI-G7Vn}+loL*)dPE@?$p=~?F?j?XJ5Pa{#EBH*D0&735ERgHWo0nUb+HBo=G1e zk+X2fvUPos-836-#$P~vg5xNikDk`w-5r7E>Q15U`7l$`rC( z$%!kDNGwXwuA+3WV}r)O^l?sN0xT?^NAl!RBm~P)h{uo z_T^}Xr6!{%OM48ar$r72-Zy_pzq7>}nhSKD$69XdE#Gs1A4CxD6{qmRcn3F912PN_vy-b{M@Sgk+ zD`DDeJ_HfF2l72k{FSC(=(L-|hYG*ezj1)P>YCAtNyAp%-m>)6h3yb+c_Gvii$;bfP+Wz)F&!N>b zuG50SL+I*NjdKk1S*!5Xps~nwCzZ?!ZBD`N_dH=8wc2q1XuX9(ynxCF ztH%dyx+}unfy4`1m=7Q5GD?`6R>K%Cgbo9lhTqud-<5qq7@oW)>R4alr%%nXbBWq< ztNZh6Jcn=_2KAwS7y_3HMtxx-Xd^r3LXbUm?xo}l!sz{!$u?ji6-i@(_{+1E(vt!JuMEA0`Md#FZDp_)qyZ-y6>t@>O8SN7sV3FkR-(j z3&$l(*2$T?l$b^+Fsg-?&KBxt6&km4V=ha6NU69OwRXZ~>9pDW7|tNeiLqS5HH#|> z%ERsy*=3N$3^3FNic!8yqVGEwYK0NY0x+KON|fMLo?z;)-#N6v?P)u`XcG+Ucr-;^ z5na8Y)xj2#u7lf8scJyU@oxyF9?rWgWa9xvAN9@ZooG>>oc}TdJ^||(!Wdd|uh-pv z&rsX37tWNsl&hANjVe>erbbe%KVC4+w z{vQ6Q+kEUgaa{%r%&?AhZNr6V2I^t^i}yg;10dJc=ZbRu9$~J2mWSWbkXsGF^EPzA zc#jnDM+@h=Q0UOe(_7U~>Lu#PkAe3;A%%k>Ip_!P|e4 z)0i3s-(}=dnY8jSKZ`NK)?fG2=TcGWSf!a{Oxs9VBSbcK{Y40+czw@DJ`PflL~};u=_-RNgC^z zN(l6CJx936C4g;5tfo`h)*Npa=&X*MRV$L9OaelTVtoK4tw{85ENTa#K&4l?EIb(Q z*`?ENvAxpXW1-@?F68qUZbUASG$fUsrp*Csy>QbPtRXl{G5#y8Au&w}`9;a(*?OGZ zA~By|M*L;Ar1&asnJHWjvW&hcDc&%kae47tXz3JV@x>z?e89ScduNS-n7RQQ%VI0{ z&bkK|kEdr{6wM0X3OOiVJ)qI#8`Etd*5O~q$?9T1bL@E5MgDmM0p-ZR=qAy zv0Fe0>b}_qP>I1!balTm`IM@h@5suM>mtT7#)I6*8VmIcm`Kzpd-SQA3+TCnwih+* zqkBFL&hpe)92W~6W>rtj*?!(7{AN`WYe?b=W?YvkbKL_C(JY=l{N(Kop{zOmi`DZo z4Fg7tNv!CWHSo0@%IJ=kyW1`4_;Qn2)p1!G7n5l`v_}KnEm}>P0n6-QH)qC_XiT1% zVv4Ke5AdsxmOcVr7CeolU>djNUF;e1x_b^V-*H3ft+_7Yb_P;g5mF)p)xeO2p%i6^ zdF%u;2=9>$&pg$4wkW~(P^QLKBI`3#W{i3`bActX1j!bRa!dUe2chJ}Fq*;&+KFt4eu>`IuE zdvs|6r->Ld?2mS$2ynLOriP`7NXv8Rn9++lb7!9Uw67@|_UxR_Xuz#oiEI-C4bIzh zlQcANSr;!RONyU&0US6A^wUgGA?e3W@A}4WR-kUa?vv#sY}-o&TWU%Wt>l=$At?m7Y7~}zFP542Irq$ZTRDmIq;xFY7ibv~FN5K1m5t~d5 z7^SPT`et4wREw5UlSSa@Ax`KP1OTNicAtbjX5Y` zxfw}RVr@eTQ!0Y>5=en>kko+x0+QFGVyMR?e@}xhK*-Qr z=0V{7<@qBRWs@(_$ikZ%++jSo`SU3uzhwH%ys7q?}-OGnL+oL5daPEvdh` zV^yq5LrikG5{+15o`~twx=<#j(9*RluHokeERABjHRT^n%&F9{>gzGi23gSzl;$plv&r&4s>IvUf4tryauwLeZ?<_Y4tMrY$Q74YjpvF& zH@Es%i$qNt22%axOpI%(D}(R!&lpu3Ifk_?baj=BMIruP81F;#hmV`@>MVwpsyBS>!_>dA7p@Nl*4t`jQs1^|K+ofy zOkrVLj6v)>gb6UT=tWeW;t@K@Ra>xAf-&KvB=6aMiEFR+Qr7yE$1*@bZO(Cn=Oiw_ zX5~7;HW9W9*6=Y!ol#Soz{6GpNC9loeqwI;@T^(O8fyg0lyIy|TB4;BUCEJX%Q>$s^R}9%wbOY7++q;xs;>Ug-(bcl)pFIjar)HX=Z}WtuMU4gOv?=y?xC%5|6f=+i@E z=IRXdH)7`+OXv-zvFwlK=(?jTZv%UvmSW!^NVObmGxGHObZRZQZ_THD_S}8SGsn3H z6$57>#hZ^rBa>Zc;U{+&CR-7i9@?h0vN)gwmvX+ zGVu7o19tp*LW#;p)w$5!BR)cbP-f4?jE!HZP;nLE0#Y|_X2td@g(?ZCZ* zE0SBIFH}xi+09;R;6rZ-IKcag4N^>bbV_+VOWom7g&n&QP;aBeTVA<*?Mx+C)Q9lI zK52f-p!CE?3Oz5SacPxuEXgMTOL$DgL0+*L2NLrVlutjhnle?*9=uTbGGGLCqQz=! zCLm8=z>MU<#O1G{MSSpNXdp=G3(Gyg(gq#v(8<)q*_6J&#mJ^?O4o7A zGlGJlf&Kl9OXmYIG9NiGZ&U1@O$_sWMo(uco0K%4>}D>yPFScqRYXzkYCv-!_>!*Vq11<#xaW z^QV=YKSQ^jpgpEW!j_=CfLR%q9+nTx)Bj+hx-QCg+IYx8nzMc&!TXfX(ZyCZ#TMt8 zN}>LxkZ)E>bj1(4vI4Q9+xjx9E1I&mzK4G~i0OZ^o8moCL!C`MDxken1Zf8^=F82g zJZ|VChitL_0$Pg1hg3GI`h0C)tSIpPZ@_HI^#fXI72O%DWBpb$n3nhxU9Lh8P9GiwOlc@o^x%fekCk=y^jScUOt`+KUV+`ak`cCSmT?@KpKfC7FNDZ!GqjI`-%|fjl342 zn+o?1N_R_t)8mC#f!$0=!Xu*T(3dM=FH;&+tWEz5w!eu?Vz~+h8%T#&57#PYi(V0q z|Lv1muL1MTFBT}@a8Muiig!PHGN{BTZoGKxKLTdrY=+&;*$f)L@Yvt%SCl8qiZp57qeFfh(m zL6#i|mAH^kJo-}I-&OacU7=uWLC zIMW0npnnP--YgUe58tO=DB{@vT@!SG8Al(R;Qwpxt>d!Vwzgpf6a838H9?X;@WG*Oe2rv`;rN`)eseXa z!73)&z*mw?7ByrjG97RO3jB8S(I?fl9Slt?P ztEmKN-q*!AAmjPyUo~L-`V@!+#+v_RT6DgI{G9b9Ju3G<)mCTjCd~4bpK#bNI86O+ z6H&*}a`|r~2>Rf+wKe?nQ89Hs$~mhhPozKL{z(qso@@oRN$Qo$J4IhNI5Efy7?a$2 zR%1Iyrp$>ehyE@0EW9&+zpy>_*#Q$~!8a$BL_SilII2>h9{D4(^u9KkEE-hfl~k4v zbQmtof8bf;wnC@p_U<@~F)AN6gE`-iUP0$8eNPRuS`y^SvrVP(r4}W?8cT?|+TC#i z^G9DFraA;>6Ievq@D3c-zqwaCHgT|?w*o1s%bvW;OWYAF_;S*8Rl+5;I$L|^4l%nN zn?ZK;>H12hsLNfBs7EgZ_e3TK9Xt`u9~f&jsEaq`%}30@hjWjfAK6%yn(#iOL2Me|=~lZm?XXkgu>M6a?$n2I%H~I1v=* zQV3j8cP(*%j*)b5iL9MejuaSBSC#iz?%F)S=H(tJP%jw zUOAKyyG|L+Eruw3aL6R+P#xa`7mr1V-H?fO6 zmo1rE)%sB0kjyLGlA_7b+fgoAqem9X&11lbsll!j9l)OT2bVq{XtnNL6L`s1(vaoT zBb^hk3d~pM_wGeUth`Rw;N8^+>INAdx@;RuR-g6pPHoF^H9w=NpJ;UAi@_HPO3T+7 zY)R7x?u7y$tXO^KGhsAYjws6L?V`l_Li3w>Z;Uwtb*e`Qr@ zrTP#ts+s~^thuN2e9a9rF*r3l5jTX+;&Y~GnKI6&aKkCLtVAVF4V?bL)veP!(L}%U zEiWhEfiv@r!J@<)!L>DALbt70I7wAfaEbR)5=!MWa7)~(chaI%#ZF#PKUjh98GP(W z86$yed<-M*V0&FVJ1i&ZLLEo#hSSjOw_;~jd{0Nsjk7Olh_#p+=Oj1q3AwfraR*K| zpX{o4qEd5o9q0S8+H6COcV+ihYPWhbmhBZ6kM7sBd?w)@?0V?P`pK7Jjjn%uXENG7 zgJ-}*&Xyy}IA7ijQ-agRdA*1ab}t8+8)fWYO)Bz;$c^UFeRoPn`4szToKIx8mS~UC z1kPJp-YVBizc^fbulTW}M@A>Z#nigF(Loct9qk~?mt~i>+`YINncX&kdUiZcman8w zIimJ%+}A1CzPqezluz|&NW0+l!fX=EYF9Gx@F1CI!lbi)?;vy+r@1E{I2!suIToIq zI>i=79>1|Q-T-@V!o6L7XUoEfWwXtK0-H|;>KdYQ$p6})nC3HAQ<-FHVoGx!)`8RL ze3iGtr+NOaCN>!67q_C+f~giKK1@FDw%ZovW!<^Os|yGp%(zq$iLx$jvxAzS4qJW4Gm1hFOftT1sjE92G;x6qnpS#urYr38tXsbvbxeXot3yj94HZNpFIs^-CZ z4{XicRqUyz*?=JuM{e5obScs~Mc=8#ii6p>5SnFg}jY=wq zl&5`p1QMF?ichB3rY76i3}zqLWH(iygQx2zJDH*jJi4wR8`y+FX(qo*cqp>L)uehc zM)V7lc=S7+0w>=u6au{-ExYYYbH~-#Jw_#y3)vo;d!C(aO43I|xCPmKGtT270Zn@+ z9Ui^N%IXyzwa<(pmGmwyl~smAFPpnq3wMSp+ZU?^2ZhrIIk%clDuUP(l;qX=|rl_es`_ze*sj|NFiN8Xs_Vpv8&^8N? zBXSap;0eQ{H_k5OfM>+adq@36e3P!+*3lkf+17^zbcZ-Y*XwkG?2wQ=}zx25DEJr88P58*cn4VL5 zfY;8kD&-}7#;mTiMw+(mQ)o$|Yh8zQk5`G=TSVPXk@wk^r)Q@->C~s6>WUdpXA|pA zKR)p|+rstOO8laFq{?^JKkS}RT(_fI#a}w*K#dzV^R1)Bkk`J?Iy9(1U?AG$p=TT27$#R^oW;^L140Odotd7`E{A^D^Km@X}CnSxT8*CRxl1zO! z2ecs|apT2jad9izXBZmNqZc?>y!kJR-D15X_7UR~=#}q9Z?c%y#}VYZF+EbeAO;}& zl^soxSKOC9e!($?x3Ay6l)cB%d|PB7R=F#ke3X_p`Wk6kO#54{rezMs3^*H9q+|T6 zFiHun4eD7DI4}8J)`XFc1b-?_LBOA#NK7mf5AcMNQ!m;d|288Hus2mQbK1A%{=3%- z>wKO%z0rgK&U0^yn>fMHYxHRq#i~OI(HT7}y7===v}`I#!t~$1X59$F7luEW@5Xql zx8v2Fz#JxP@Atf}1Z&~at_`P8jS{~1J7O|X=Pc~zOT3G|8E}1qWI3a0&hf$SH8w`J zQa7JPp$ZcOU)+3oVS1zNo0ZkcQg;Mo`MAZhJ3R?`?L>Aw|CMRIK}H3Y@-SW@LB#GF zedFDG-o!F0q426LTW`r(G~MHnZF*^%%<`hQgqql!vkA0NqFZ)#n9ao@D|u97TUUTf za)tutPkYIi^c#dbqs(;Yt&4f>(!+Cs{vS-uRDY<$id>OD|} z#Q|l#N%zz8q^^tJF)wM&4Y&;oh!`IAcz$?^*wBzfS`dB7ddquNH>L|N#1R-PpA2ZA zOfGcBe>kw^szlV?C*R$-u`4+_SXF-mQqD^-0ZE{cqVHNv{gkmI-6#E^t3&LxciZhm z7&FGti=t?=lCz{{se6?{9=@Z$9J&}19# z+|f>e-Abb&Rxf)pcDAgGja(}ZB`ESlnVREN{I=rJ36Oi^4u~o1ldx4~p8J)W;x`6u zmK?YzJ=aONDP8$|+3b{S)#=e`wk6!G3gn>syeE3rq(qlWxq>ZGjbg1zddgI|aBm z7_|B$`uJZv*LY+soyxC;tUO&y(9loX7rb-Y^0sqRMjP%onY4P87IKqaw`EZA5ZL>a z#WP!GedieOQT{dEp7-kH`uDO~ytDf}RyA%?DqJO&zv904!ZYG}Jpy-f{}xGghM@Em zWfx%0p7SGss8s7PlC-Z=lon}W2%m+#w9m8XKghcT&sAU#OHMD@Rg@GJ)qY+vYQNCm zPEfTD;WxyRGcE7AJYswDSfHgob@YmJ*t4awl`q|c z9>l3ugsABQ`VZ0v?0=p<{zw)-rigzf1=z171pw$*@@C(oA~^s=2}@iNPz)FX7XlOk z@Hgi_zKgvr9T-=t z{H!n8T)glon*0r_|KR_?e~ACZ^oyExIYkX41f)a%9LU1nwZ|tP7)4(ZSLrCa-DCc@`I)PYpiMh zx%C>jl~D_)H3B3mV1FN2=@5|;V}uop4R@kVH6yB$1zVrBlO{Tgq3$?#cfa{{TJc<-86Q?zBX zKuP&W6Rsy%9}M9UH0hxJ!=oNQRY77|2QCi}k?}g@^00PfKS*3#+j{pM!n@4G@`0}} ztv^Q#BdrnvM=>|uu$!@qcUwh%Co!Qy=VHniO*pI8z$d(%1;b2FsZq(DIYs)1W(<2{ zpUmIiSBR~avnL5G5>Il#(Q}lIVtL-N@cC$U1g~%_Ma=ESz;kvEzjtgh4Tq(|Q`J+s zsh#0pwEaKG^7oq2#U4`YkNJ+KsMl3__*C6)-DPckm#q3M@8(0S!uvZ@8CPNhRU(ZK z)X*Jq>GqT>SYuj7;$G^S?d$_%SnfsEHIB0S3Z z>RcO;&G>z{dDwtsmj`8n8c#P)Kz>3!2{Y*(%agAh>D_|oE#)PhEO%cnjMG+}HTs7Lk5XR$qgh4~a2b=de zJJ-9p|keQ6ZAE+)wAm{1_ zeEPAnfR1#IJTu=}kELI177qDjx15s1s`cE@#Qmx&&W%;i%zbu)um_3LgMxWGut0<% zxhZ{`S#;X{hNqf&EM&kWt$s%Pf`C9!5F}nf+h2J4ED29yL@-dw*pl=GX`UF1BYH)e zAjXX%Ek#=H8=f3K&9?|F0ZHe-l38{fVGSfNGRj5C4+gGFM&}KNr?*2BRDh{kbUOwU zX6Gi@(!6zQWbPO1H-(nx(K;$F+*4SfiBXswW3Jby*2wm;SZT52yk-!l!KK{-g>v4C zj5yar{GmRe4N?M&E}tjQ^q1a#29oY?j?Ed&%zEl9rhFy#ON*VQA5eVjJy>Pibt6id z(_P3w#&rlr6G#bczm9~6d~eUTE2fAi9m zM^{0#BF$jFSK$0=w;U~*=(Nu_q}e^%jH&Y#*A-fZ_wDiCKYfvgwi$lNXidw>hvgV* zHrkr@@`U<;@9+RG`;|(^h7{Aq+wT*{6?e}X(nwuS#OOq;N3MFRz?ysLL&m?dormiDPmOiE~(re{> z$;v#uxHRIxGx$)~Jj5P$d#Zl0wLRjtN9aJI8C+X_xcETkh5YWij%YOdo;I|4202zT zX`S=J^&sJe)-KcN!00S)*3L-#3;WZhs`#^K*G<^Y^p{p3F#+%D#bM1(%xFB%F&LoVIaSs+Gu=caFKYC<&I&vXbL+3zg@U66B5Naa?Y3D9jmB z&J5m;X2GgeiJRg)@JKFai|M3Vcon~79LlFUiJhlHmz zKOj`j*S3GxH9N6US+SJu0fAF%Rr2Q$F14mNWLd?-R=a}|32ztOs=_ph9xyH?lVxrC zlXGk7&YU24ysNUFJKQBIY>M}yvoL9QaEWun7u^`u!<#C8U)pTjt9SWuWvJyLlOm?f zCm_-rvqa!ouF~rIgdoiB$Yx}=qH&L6@=Xah0@i&RQlM9|7BCrX&fEG?r0w!*1P;+< zhtYjxVeYNXWbpp+GbY2(smnD58$M%73%2`l3lB6YSFpLHN~iTh-ls@sKJ&Pq_^g&y z`9Z(~A0xzc=t)*(Hwts0Xy1pNAS))_bq8M`n(tPp0JPo@!77s!^>O_f}Y7g zp?L5=p?JuDC2juFiW&&|-%6VopT>}qeTmi}MYlN5n=BZqX{p4ipBU1Kz3H`u%F!w= zG?d=D`V-GW|A}W||BsUAcW(ccIV%(aM0I;^M16290MBpD=^4@})mLB8>vOJjrGlmA zZI|})oVdznH67NVDXZ`WeF=!};BuJ(_x+ zAp~qU2MX(<=}817N@x@E{Oy%8S?G)8Ub;Q%O`ZBoJ z=hj|piuF2i8TYku=w6~X4qT+vTLoqZaaP+A85;lH(+8}slYh2Fft0g0czOmfnsYt`s7)vLa0tAZBNp&GKRc)N&bQ;j4! zy{OpNN88nI7}+N=Fru~%DK+Jb=nOJ1=uUH8Ok9>;83a>Lk*e%nKGCTJw+3X#_wq3~ zECxAIMm_5Ge$}(9o!)8PRhuZCBI_P%nSH!Ch?q^$(x8;DWWQxYb6n+w!;AyDLkDDmTht8djV-J82e3b~Mi^_E5)OU(ZYEv=}}1dwj3)n}sOccG`Rn&rgh6Fx>UUGdjFGcVqqE6JJtrk#lsU6V4@8`JPf3 z_xs@YhtsbJ_p#@TClCR_rPKKIPqA*soZ67TZS8JvT=)!~-H&c6pQ$oAlQ^;^*UY4) z3tDMYq$NM;WTLi_BGuRVa<6-ay;h!+PV*Cpf||G7(mzcR%_K!38(7Oo;~+Yi92Sx{Zx7K{>~KwL3JOV=OsM4vK3I1sAK zU=$M4BkPZy9T+Gy;L>_Fg~ilXQ{&q6%{0DOP8G_d8q667L}_p zW)Bi>qA|AK2YJTfF088{nqg?5PthQXJ;<4#j;&b#A~b=cH>%oiG!i#4>A{MV8Eyym z`b_#01=f#mt)em2u~rO6rz0N=zRXdf+K*6gs(CYwp+P}m8U9h~%Du`9mnH7trUgFP zjAX{TrY~kJ&fmlE=z~O1MHS7(XmBbYO$>$&cSH6w-+T9ageLXFuh%0j=QRjvb`s@k za;$V}B*s!c--_<<9XDV%Q4x8!Fq|`Qg;o8bf+BUb@6Ju0dk!xQ-6R3Kdb2)aB6rr1 zl%;6+@htYD$_jd2bj=;REb+nN>-5-~`MD#KpHh202KAg34U*^(?S(E$)5TzT$!;mx z^YWS;jc{bNb+=0xP(2_D3#1Ms85KTRC$^9x)Ywz^};v+N1`pjvQD^2-56Hw9I5N}<$z!e zk`ukAb_F&m?Qq}`?20++M9*2-9CDY={$>dJu?Q%-lX)VwVYDw}S|@{%paGpW-jc?B zhQHXtR`zWlZyJq-wrq_;!CJ95MT}5Q{b0r=Ce86}&83=8w`fKSYy92!4e4H&N@oH^ zX|SJidOjI@ey={`zKcPs74=onD`mZDOIshwJ3&EC*-x!CCCTS3Z!@eDl*wBNQLN@z zH>?^^R^|;g^v!`O7+-0xr52Y9l*`+vJ_P#C_fH$rB2(+YOf_>r`oPSWOcEd2M6Kti zR2S_NJYM|)|NE4G%A$rfF|k`(+Q1%@K^gh{3ZsO1H{rbbyseIvzxg; ziIB%7>zP|_y^inMoPGtJyS@^rfed(77D}8GMb<~Sv*PMoeL{-Kx7Y7Kn{L%8NTqZd zzPUiip*Wk9)xpTaP}s!sZn5g|ShssrWfYT35{}!&czJsEpSbs*)b2pY|00k7Pg(od zo|!{osB8ABCsyMyyb~Ue_x0$07;ol7-UZiOqU?j1Y8MNYI#c>FVlh7}9g%n`sUTiM zb9S^U)=C`~cijYSPUsHR)TGOrmn+4Tq?J*?@hZt@jxGM^7rG%eeyGRz)#r(r{BO zvFpCuAFr>E45yT)5>>#l1m6a_Cz#>|HuI*Mcw-S?EdEqEucK|6r(Ey3DI_iZp=R)1AvFRWnnVrUn4XdIm|X`)xTXkDH~y!EBD@DGCgC3aH~}>>~Ukd(mukuV=lxH%G5!s zcPhKMz-}H)=NhiYB*0!td-^FufvWW~g%Dqvrc?um)`eb)0wo(lgpu-4=3~M#gP;rK z%wcV6%h1DjWmDdI6kd{qlM{=10;R%{3zGe}3zX;|Vx`8Y;^om0*hVnHm?g*q(U@|g zjoNy?VD;R+d;k>&2$WWlO2^HM3mfI#x>WjZv*0h%^X`fjyWEKO+KZk!+(Wo`&zZ;j>V z#%^M|Ml1>?i}QUKXj`~tZQ9TmTVcQad`8YY&s->Mu0jUm0e`>wlOehq*9Vt~EIinY zdd>1%eB}h`dfD!7ZXc4Xsf*yxTlcg(mIV3=J}SGD8%x)N)@$p7cUU5G$&ZeV&}KLb zX~yHqD%C$zS;6IN%2ko)?0}OD@o#*Dc1@$(M)iJ0wsB_VoPN5mT7yA*?}&5q17MZX z^EuyRxYoX>5Y#8oLm)Ofig;?GC(FJyxFFw2^iF*%f2$a@q_>ha@ab&&%_&WAZ1i>F z>NXp>230L7w)`lG13pDv_uO3$q9{DvNkY(_;rCkZTX*jjO!4-??qm#+AjzEa)LZy0R3>TFy-v^d*~4WyvTFmwYt#WHf3X#!vTwbuzy&My?gQ}?qAK9RN z!Q?t{mUGdpQr(H`q2n>a{v@A@rlf+Wd-0Q)W?uXO%?pffS?{ylH?-mp(<;ckZ&XaA z>Z!D64AG)(NRr*zsBG@$j;|L7+>9r9T{L>o{wR`D;+5Oka`z;roNIjNhib&Pt7`dBWcR_&G>bCr} z?2bO^K|zVs!s1G?oxZaPW79G?_TUB23v|m$|C4zEY`1c~>rI=}wU`TqcKUH-NS3P& zqk-4utc~Yp?y;96F8oaV5#x;OqgI4WAefHHR{#;)dl7pzQ0r!~VPW91K6RJr=XVIO zjRL6;n2a)cx}&AFUTx+cR+r)DcjX`(MN*$4GRjvy-bbN zt%_~W?P&B#cVcn-#=+Hr2iK|6W~JA!+TWQ4)3#V#WBK?d`K{?~)7{HMgMK=S7hf|! zCN6%hHS|W$rW4Tu^)1G~RO1^?!;L-dJ)YRLfp2}rN)$NKVh>Z5;V0(nQF2d_hC2QM#{O{ zY|oxMy1vS-Ir)Hk({;yto%=w*G2xVn8`JkeQCfo^-V)Gn#i-~BRAv0ud#`Xa?EniR zG6Vs$|&+f@1aP)$*o z=-m~IuG{YcYKL2`1aS3xApEzuF{emQ(~#8Wvy(MKVH<+}4HX!Zemb~DTkVXVfKxbc(+ z^!VQBoU*(U12=swbGiK8JP+AJ4Y+buHHqK zU5I2ARVBRKa0xM7#?6o-xhG{Vr6ZTg2W6;8GYTed=GG3v@|N+zNh+=OQ**>xMCO|?e%mTIj^-B?>gp|mAy@SlBf47A|2=02u~_# znP<~&K@oIlu?{|{vSE9+};=uhTmxvJv|;{ZIjZq?;= zVdFOio{XQ(J{um2YHnS8RuX)va8AM|>ex*+>;*sdIs;`xV6*xP(uHg6SbZ+ESND20 zMY*=%C_67nz>?LY&;>cA(?OdWFE618BlXK7PU-^ok$holva3ane^SKxEa-0=z)p&Q}mm1;vz3ZB@92&cacS|rx6Xpwn%IOS~_ z-}B&VW|#ljdn_RhQtOGQ1RpnsajkH%Cj(&J%~`dQZK|*Dm{m!)!;OwnUVBd5unEmBQ_dCbsSn=tMePoYG zU;^=Nk_f6@2>%-qkv0WEYY<~A6vPXx*uL5HkhhWzM7B}v*X=c zTU1Y&YQz^Cn43SJ@=e+cq|+uu45$eqN+Mi2B!X;6`O9p#nOnAK3tmgQiGS8{)Rb_{ zl=n?ZkTc1D_S{lacqxeMeE|V>MRT{ztIGGaCmE~=LT_3ged2{rnS8u)Y~Ffu3$s46 zjrhP`+yitTFDxfJ|pxRYDdTYJ}U*fx7~7lAuClOuVh2t zKr7AeUMNd;wKVz6#kHLFLWZ7;k?T-jVL1UU7sD9*M(N?xB4&ip(LwBSzRQxUbcESi z75&H*AMdeW1HjNwsbDRBdNG6^v;BU!+h!VdKX;9d78`BbD8$A4eY z6~={?-XM6Q$!GEe9g@153#Qa-eVTEbtd+5`ZY^&v3J*KVIV_sK?MqGiiQ~`;y&sk? zP->iBI+%7lQc&q zQD8V|0DDNZ%zmG@O5m*%CMk_Ro@^rqFysN9GM&`hO|1dx5t_7+4=HQj)LUagA2b|? zX&?7#t}`p-eiYRmf8_0tByqi(k4`EaZl>H~Z`QQI^Xe)SbTF1Q`oy~q=Jn-4MjoZV z=4>)yUTNi9jYklnm*qjTT^|Il-f>K=V4p+OQZ~^vR6@;wein`FS~y8>X&**T7vB8P zCOYBox_#B@CA>4#B8u$&(gnZN(b}iR-LVp;6rou?Y5KJupKtRkMh88n^62rj=UJ_; z%+p0$(V5>ESU%Hu21B=44c@^H*DHKSdz#n*S|d~wcpqIa<-*>^0p+Yy%?U#y#psm! zGt~rL3DRnUO>Z)SlMw=Gvbx=RhTCIr+IWd?2!ygXeCAH=k>yk66Z7;HENfcHs?t_k zdB$?52Am_)prYk1=}~W^C(Gkd{HW(X)g7WhRR!Mzjl)pa$U>2*z7zsFcZRJ?+?TCA zb}QN>jpWa(@tC@YSZ=bo!u6Hq@%tWOej9ym9aU{Uz?=7t>Hu4S_yZ1n%&_2uQTt*x zQu4$Z29+@K%hDmwhWNBML_daou6XDdl=vZ88R=HQfl<|4T<+hvTq#4o4M+~43KNJ# zXT>hTRB#05kk~F`U1uQIE2y!-Zy+%yM5t5}>v&%p-6u9rpmMgicaM(OKB+yne&~QD z@eH@2F88{3OU86CS!R@l@e~7$zM=*`#LZ0R^^EHT}63p?FeVd+EdmY zN;XYa%*teoC5;#GMBd#H9&3-!*cqCM@DN;%mP%u6C-lsw0%7!z8EUMNJ(1kl`Rbl# zJ|qal-QHL4O0B5N=rD}6-6r3N}*6XpGqk7pxzab|gjE@F3K@Bo+k zg#&QI9G{UzCyHbr>9U^L0Wg%5JuL~Jfa>COXvW4xv7=NKVf zD|?E@Rbh_0MHmSBCu_MN(El@%`480cD@(sfR~2pdYS8PRflSp26$U<}#;E9ufSRs+F8>od#aC+m$=12F>`4h1Q{&%?X6XY+^ir(;*Njgd~ z!1bd1bX$Sd7E4R7J}^F6*0Du^=DO*H_am^@mKepIEo9iIJ-o*HlSv!AK(^O)jOrMq zLx$PRho96|n1~hZbNht&)Re6g@B8KWW#ji^3|;NkC0VpQj^!h#KvTt9IKD_u68q@( zySc4n$x90q9J_eWgeB{Bqu=Sj+4i2weuE#Ijf=NxvX3cQnt!dR+$HK-n(`r)xL=2t z&pS@1(~?usuoDUwnb4aq`w_i?&bm`4!(;1wa=vEHkMEDZv8bRA%+Y3)50Vf3oG4}5 ze=NBf%94exVLfrVZMz>9UM}pD8;lkawH|ciIimGrF52ts=A`MvUr6O;pcZOm)o~s1 zB_M)Fd9hKKc(?B)< zrFr(8@>m*4^hrCi-jvuEquu72$UE4RLLKQKqN6IKT;>wI4vC_>OvkpBZ=a|7IV=e0 zJkBic;*^h{MGBrQ`1eU!n$F7S3&JT|=DxgH zH@S02Y4CtCA7DmurV1|`&!sO=r_U&4VZ8-zeBjt_b8#ki@tp(#zm{rwrLT-Ol8({rO|$!JGYp$Lba|`0wutD+D|P=U^w>_)xlS zTPRQVjPxq8Tzi<-Slz}*!PS}6WQKKfVFu%hO(Ma>ar&cG_u#a_yD9D@e9!Ob42S92 z)u{>4h$old@ChMvZyyPI1hL$Xq2^G?>0ffJv80ytB+k{eg>80YICE*_Ae3IXuheR{Gq zk16fZ>+kr{`l+Jl@J1%fjuIZ}+Q7wV>s7H|1b%P@BW_>5yPznh$Q(i1x@o{HAvQxV z{%X2W|Mor8mmpk){AtC90i)uvJjZTGuBz%&cl$~cG|CRV)#xl=bfZhI)N?w~NpnvhH$N@CWNl`tRgH6#C%3=p?wX(R zM7zs|KP6t3-X5zB^bF3x%2pCmZOxlCB2mq|9!KC=KY^&5R#BnKz|P1ToW+QlQ+fW7 z%2??DN!9$qk3zR~@_HxzL4~h`E4m>aK=uNIu|gq#Y+q+26nR;30!-A zcNr|zJ?Gt$yT*3wNx^8(;ne5~lhagct(HoSJ<49~^RtCy(on9zRckYAWvf^5saMUfx2I3K%Xl?Sjz02k3v7oiOU_TW|kpF&NJtIm8`B6|nVsseHF2(Wuo6jeb~i(Wn4xiTj9Q?9|6z{3AN%=_eweUPp? zP5JWp)rMC)v{Y5^JMl*aOBd6iszEp+*`k6rtVNX`79l+W(G4caTQ?F^hINy%tiIq# z5LUG>2CEb|jn-WnyT(B$cqQxpi#zGysrf+x63+Lymg1@sKk3?kvaSXCuj~>7{SS7D z0k1az@Gy>C-bW<)R}|Gp5n~k71Y=@ghSG^)c%B*HBuze0NpTB%Y>Uwq*@T()p#9U64BbJ>BP zn#iA6B0?BHC`7|0Fb~nlb8Zp*#I^rqRRIk6zqw@i?_bLQm)pU=vTy(cB2e8PA1-e@ z2DsWhbwKF6OeJae^bZnIG-i$S8hM4!Qm<-^axH}Brs=+`ZL zeZ1%kcqNO~izj+xT6qn$7SCyf*G1!TtDQdPa?vQ>Cfeotdw|DriJc!c9+*WVU0dtQ zK9JNG@2rLR)!S(uC3bq_*+9ZAY8dhS@_8GXNu|?DWGBX&@?l{;xOWAP9!*z{t==RL zl?vxl(O*v(@K~xf^b>ztND-C9>cc8P0cer09)Mr6y~=8VHvv{u^1u7>aqlG=rPIgy z0lYgJdLG@^?TH6vu5`uqw4tQ~uo<|M$LUzDU9M@SNH(%A;TZQ~?dp!Y-D1i!qoViAv_-HJF=r$dkSN@zKglpS(<>THUz>(o z{!+xV+HBDqCuzi4_Th`I-0osUt8zd?@r)-`^Kh{sxjYU_hd0;RaKWuJTg4PHuSZWN z`QE`V_Nd`HJ$EU`p~bgpeCgH@lNSF;!`TFGdgeUXSyf*nyl}`e8>_KcqBm|_e>+E~ zxi3U!R`!kJd4>BDtdY=GcXG8Z_x8k>X2tb(dR@E5*sf%O$HL))wDxrNB3;XuiN~xt z;nK2iskl~rz*W?rsH2M>P(_At|Kv)K&7%8 zKQ__Rme#)^y|#UOSD#!b`M&tVl~_`A5dnvbA~%U9Y&Qb}ZUnFjfbwXyJhd*kwb7dV#H;@* z-M^i~3O_f+#@6oKh2QFQDZQ^hz8$Llo#p?kmw)eqZ!IZsDw*1u8!{{D>6;tUSQ*j$ z(IqUu9k{KD{L4YZza3)BDRb`iuN#^nujeQ@M=Er2wN23FRF ze_;RRWLm^;*m5?84u6{ZyCTRR6oH{C0{tF@14tu&|6FcrWNPr+LDxUU`+9WvpSHq( zfPnuU1c*k_$=1%$f=1TC(8j^k@X^mOU|+vL^QTR)?`=Z-0EqZIKroH4m4Us**FXIy zNXXa7`xEj5Le%5sW-TK;`!{s8)YZ$f}S-~j&)2Sg)lXJTmcC(zF=gMNKS^AF1) zKfJFA0sZFy1k(ta=-KEQoRbpGIlui20s3!!hy31m;2+??{}~QKBW-AFd(Ox-LV9+3 z=2pi40!02hz;FHY2O#7JK*%qT9q9Kw1^7-WD2=M2K8^S}0ofSoeK&sodfNG4R04me z(vO@6L1mE&3VrFH%fgwiu(^ee(ZWwLV`g5 zit&|_ENu;K>`X0x3V{ykSge&8wy;_q?6U-Qg;)30!P=I0K!{nvp1>yhza zk7@rC75+Wy53CPC{yi$>uU$zaWom2pQ&=$UJC^*>J}BT)}&|Ptw z^J>P}M$h73#(y7t5b*bW^26YUqLS8MV~OJ{J?h=JFty|`FgE=u0Qf7p{5fiWU|%Tc z?*TwG2IhLUwuZLfLx8^LM9?>gZ#MkykKgfrU@R#3@A1Gi53Kb63ig*MgnTzzpx?6< z^ar+rLjE2MLSt=X`jw0RJs=qLT>?ij2>Ppx2>qUZpz!bX5TLnhZgtMnHco%y|9g7= z(MD9-fqowm0>4q4&A$fUUz`3uV?uwR7AXAhnm#8M0~;$#r+?Er^n1m>ng3nuh`&x8 ze$P<9O(1Olm^ys@A*JVJWpBr+cutz;hQCcOWbN(DO)U*=|8%viwV|be!B?L7z7Ddq zH#h(G-&ZBhZ8es#@bwtu&1OEI+1A{`(OBbVm$-dIZZ-24; zQwD;8ev|*QE-t!IEoLDAUKLHNH8454kQGQ(jQ1D z97Sg&435$tNH`o-KLi3*KP2KuU4ZA-K~Q8s6u$rgAOr$M21Wu%mJNB|1Pxza!s*>7*o{~-H~%72i7QGIY;lcDH$&iqJJ85|WC21UhyAy8#-RG$J7 zKWPsMMezX$070=0^jp>YqYTy0AP`D?oF@bbihdvn5Qr*6?IRErg(H9<7zB7y|l<42EJG7z%)+${+|-83I*57#LMQ7#vkU zI1p7AI208Zjzq;kKu|Fd2viK@PwYJ>jvr+Z0O}Zm0H8or84?8p^4moCM;ROy1B4n! z5D*L%1B@EKke`fG2pEBi0YS-8=k-1WWn4iJkRM~=JOuzjC^97Y$M!&Q07_0dXLit! zwtXGWKol8j?1Rp83d(gz)Z7R@=VBm=42+V?&O-qNK#{?LC^8TL^ - - - - - CUPS Translation Guide - - - -

    Scope

    - -

    Identification

    - -

    This translation guide provides instructions for creating -translations of the CUPS message catalogs and web pages for the -Common UNIX Printing System ("CUPS") Version 1.1 software. - - - -

    Document Overview

    - -

    This translation guide is organized into the following -sections: - -

      -
    • 1 - Scope
    • -
    • 2 - References
    • -
    • 3 - Character Sets
    • -
    • 4 - Message Catalogs
    • -
    • 5 - Web Interfaces
    • -
    • A - Glossary
    • -
    - - - - -

    Character Sets

    - -

    CUPS uses character set files to define the mapping of local -character sets to Unicode code points, as well as the fonts that -should be used for different ranges of characters. - -

    CUPS includes files for common 8-bit encodings as well as -UTF-8 for Unicode text. The format of these files is described -in the CUPS Interface Design Description (IDD) document. -Current character sets are enumerated in the CUPS API, so in -order to add a new character set you must patch the CUPS source -as well as provide a new charset file. - -

    CUPS 1.1 supports the following character sets: - -

      - -
    • iso-8859-1 -
    • iso-8859-2 -
    • iso-8859-3 -
    • iso-8859-4 -
    • iso-8859-5 -
    • iso-8859-6 -
    • iso-8859-7 -
    • iso-8859-8 -
    • iso-8859-9 -
    • iso-8859-10 -
    • iso-8859-13 -
    • iso-8859-14 -
    • iso-8859-15 -
    • koi8-r -
    • koi8-u -
    • us-ascii -
    • utf-8 -
    • windows-874 -
    • windows-1250 -
    • windows-1251 -
    • windows-1252 -
    • windows-1253 -
    • windows-1254 -
    • windows-1255 -
    • windows-1256 -
    • windows-1257 -
    • windows-1258 - -
    - -

    Message Catalogs

    - -

    CUPS message catalogs are text files that identify the -default character set for the locale and a list of localized -message strings for the CUPS software. The format of the -message catalog files is described in the CUPS IDD. - -

    Message catalogs are named cups_ll, -cups_ll_CC, or cups_ll_CC.charset, where -"ll" is the standard 2-letter abbreviation for the language, -"CC" is the standard 2-letter abbreviation for the country, and -"charset" is the charset name which may differ from the list -above. - -

    Each message catalog file is stored in a subdirectory named -ll, ll_CC, or ll_CC.charset to -match the trailing portion of the message catalog filename. - -

    When translating a new message catalog, copy the cups_C -message catalog file to a new subdirectory; to translate the -message catalog to Canadian French, you would type the following -commands: - -

      -cd locale ENTER
      -mkdir fr_CA ENTER
      -cp C/cups_C fr_CA/cups_fr_CA ENTER
      -
    - -

    Alternatively, you could copy the existing cups_fr -message catalog and then make any changes necessary. - -

    Once you have make your copy of the file, edit it using your -favorite text editor to translate the text to the desired -language. Be sure to preserve any numbers starting in the first -column, as they indicate a new message number - you'll see this -for the HTTP status messages. - -

    Finally, add your locale to the list of locales in the -makefile and run the following command to install it: - -

      -make install ENTER
      -
    - -

    Web Interfaces

    - -

    The CUPS scheduler provides a web interface that can be used -to do many common printing and administration tasks. The built-in -web server supports localization of web pages through the use of -subdirectories for each locale, e.g. "fr" for French, "de" for -German, "fr_ca" for French in Canada, and so forth. - -

    Template Files

    - -

    Template files are HTML files with special formatting -characters in them that allow substition of variables and -arrays. The CUPS CGI programs (admin.cgi, -classes.cgi, jobs.cgi, and -printers.cgi) use these template file to provide -dynamic content for the web interface. Template files are -installed in the /usr/share/cups/templates directory -by default. - -

    Translated versions of the template files should be installed -in the appropriate subdirectories under -/usr/share/cups/templates. For example, Canadian -French template files should be stored in the -/usr/share/cups/templates/fr_CA directory. - -

    Inserting Attributes and Values

    - -

    Template files consist of HTML with variable substitutions -for named inside curley braces "{name}". Variable names are -generally the IPP attribute names with the hyphen ("-") replaced -by the underscore ("_") character. For example, the -job-printer-uri attribute is renamed to -job_printer_uri. - -

    Curley braces ("{" and "}") to indicate substitutions, and -the backslash ("\") character for quoting. To insert any of -these special characters as-is you need to use the HTML -&name; mechanism or prefix each special -character with the backslash ("\".)

    - -

    You substitute the value of a variable using -{NAME} in your template file. If the variable is -undefined then the {NAME} string is output -as-is.

    - -

    To substitute an empty string if the variable is undefined, use -{?NAME} instead.

    - -

    Array Substitutions

    - -

    The number of array elements can be inserted using -{#NAME}. If the array is undefined then 0 is -output. The current array element (starting at 1) is inserted -with {#}.

    - -

    Arrays are handled using {[NAME] at the beginning of a -section and } at the end. The information between the closing -bracket ("]") and closing brace ("}") is repeated for as many elements as -are in the named array. For example, the following template will display -a list of each job in the job_id array:

    - -
      -<TABLE>
      -<TR>
      -	<TH>Job ID</TH>
      -	<TH>Destination</TH>
      -	<TH>Title</TH>
      -</TR>
      -
      -{[job_id]
      -<TR>
      -	<TD>{?job_id}</TD>
      -	<TD>{?job_printer_name}</TD>
      -	<TD>{?job_name}</TD>
      -</TR>
      -}
      -</TABLE>
      -
    - -

    Arrays can be nested, however all elements within the curley -braces ("{" and "}") are indexed using the innermost array.

    - -

    Conditional Tests

    - -

    Templates can also test variables against specific values and -conditionally include text in the template. The format is: - -

      -{variable?true:false}
      -{variable=value?true:false}
      -{variable!value?true:false}
      -{variable<value?true:false}
      -{variable>value?true:false}
      -
    - -

    where true is the text that is included if the -condition is true and false is the text that is -included if the condition is false. A value of # is -replaced with the current element number (starting at 1.) - -

    The character after the variable name specifies the condition -to test: - -

    - - - - - - - - - - - - - - - - - - - - - - - - -
    CharCondition
    ?True if variable exists.
    =True if variable is equal to value.
    !True if variable is not equal to value.
    <True if variable is less than value.
    >True if variable is greater than value.
    - -

    Template File List

    - -

    The following template files are used by the web interface: - -

    - -
    add-class.tmpl - -
    This is the initial form that is shown to add a new - printer class. - -
    add-printer.tmpl - -
    This is the initial form that is shown to add a new - printer. - -
    admin-op.tmpl - -
    This is the template that is used to display an error - message when the admin interface sees an undefined - operation name. - -
    admin.tmpl - -
    This is the template that shows the initial menu of - operations (add a class, manage classes, etc.) - -
    choose-device.tmpl - -
    This is the form that shows the list of available - devices. - -
    choose-make.tmpl - -
    This is the form that shows the list of available - manufacturers. - -
    choose-members.tmpl - -
    This is the form that shows the list of available - printers that can be added to a class. - -
    choose-model.tmpl - -
    This is the form that shows the list of available - printer models/drivers. - -
    choose-serial.tmpl - -
    This is the form that allows the user to choose - a serial port and any options. - -
    choose-uri.tmpl - -
    This is the form that allows the user to enter - a device URI for network printers. - -
    class-added.tmpl - -
    This template shows the "class added" message. - -
    class-confirm.tmpl - -
    This is the template used to confirm the - deletion of a class. - -
    class-deleted.tmpl - -
    This template shows the "class deleted" message. - -
    classes.tmpl - -
    This template shows one or more printer classes. - -
    class-modified.tmpl - -
    This template shows the "class modified" message. - -
    config-printer.tmpl - -
    This template starts the printer configuration form. - -
    config-printer2.tmpl - -
    This template ends the printer configuration form. - -
    error.tmpl - -
    This template displays a generic error message. - -
    header.tmpl - -
    This template is used as the standard header on all dynamic - content. - -
    job-cancel.tmpl - -
    This template shows "job cancelled". - -
    job-hold.tmpl - -
    This template shows "job held". - -
    job-op.tmpl - -
    This is the template that is used to display an - error message when the job interface sees an undefined - operation name. - -
    job-release.tmpl - -
    This template shows "job released". - -
    job-restart.tmpl - -
    This template shows "job restarted". - -
    jobs.tmpl - -
    This template is used to list the print jobs on a server, - class, or printer. - -
    modify-class.tmpl - -
    This template is used as the first form when modifying a - class. - -
    modify-printer.tmpl - -
    This template is used as the first form when modifying a - printer. - -
    option-boolean.tmpl - -
    This template is used to select a boolean PPD option. - -
    option-header.tmpl - -
    This template is used to start a PPD option group. - -
    option-pickmany.tmpl - -
    This template is used to select a multi-valued PPD option. - -
    option-pickone.tmpl - -
    This template is used to select a single-valued PPD option. - -
    option-trailer.tmpl - -
    This template is used to end a PPD option group. - -
    printer-accept.tmpl - -
    This template shows "printer now accepting jobs". - -
    printer-added.tmpl - -
    This template shows "printer added". - -
    printer-configured.tmpl - -
    This template shows "printer configured". - -
    printer-confirm.tmpl - -
    This template asks the user to confirm the deletion of a printer. - -
    printer-deleted.tmpl - -
    This template shows "printer deleted". - -
    printer-modified.tmpl - -
    This template shows "printer modified". - -
    printer-purge.tmpl - -
    This template shows "printer has been purged of all jobs". - -
    printer-reject.tmpl - -
    This template shows "printer now rejecting jobs". - -
    printer-start.tmpl - -
    This template shows "printer started". - -
    printers.tmpl - -
    This template is used to list information on one or more - printers. - -
    printer-stop.tmpl - -
    This template shows "printer stopped". - -
    test-page.tmpl - -
    This template shows "test page printed". - -
    trailer.tmpl - -
    This template is used as the standard trailer on all dynamic - content. - -
    - -

    CGI Programs

    - -

    CUPS uses four CGI programs to manage the dynamic web interfaces: - -

      - -
    • admin.cgi
    • -
    • classes.cgi
    • -
    • jobs.cgi
    • -
    • printers.cgi
    • - -
    - -

    admin.cgi

    - -

    The admin.cgi program handles all of the printer -and class administration functions and is run for all direct -accesses to the /admin resource. For most operations it uses the -PRINTER_NAME and OP form variables to -specify the action requested. - -

    The following OP values are supported: - -

    - -
    accept-jobs
    - -
    Accepts jobs on the named destination.
    - -
    add-class
    - -
    Adds a new printer class. This operation also adds - several other form variables: - -
    - -
    MEMBER_URIS
    - -
    Sets the members of the class. Multiple - MEMBER_URIS values can be - provided.
    - -
    PRINTER_INFO
    - -
    Sets the printer-info attribute for the - printer class, which is usually the printer - description.
    - -
    PRINTER_LOCATION
    - -
    Sets the printer-location attribute for the - printer class.
    - -
    - -
    - -
    add-printer
    - -
    Adds a new printer. This operation also adds several other - form variables: - -
    - -
    BAUDRATE
    - -
    Sets the baud rate for serial devices.
    - -
    BITS
    - -
    Sets the number of data bits for serial devices.
    - -
    DEVICE_URI
    - -
    Sets the device URI for the printer.
    - -
    FLOW
    - -
    Sets the flow control for serial devices.
    - -
    PARITY
    - -
    Sets the parity checking for serial devices.
    - -
    PPD_NAME
    - -
    Sets the driver name for the printer ("raw" for a - raw queue.)
    - -
    PRINTER_INFO
    - -
    Sets the printer-info attribute for the - printer, which is usually the printer - description.
    - -
    PRINTER_LOCATION
    - -
    Sets the printer-location attribute for the - printer.
    - -
    - -
    - -
    config-printer
    - -
    Configures an existing printer. This operation uses - form variables of the same name as the options in the - printer's PPD file.
    - -
    delete-class
    - -
    Deletes a printer class. The form variable CONFIRM - may be set to any value to bypass the confirmation page.
    - -
    delete-printer
    - -
    Deletes a printer. The form variable CONFIRM - may be set to any value to bypass the confirmation page.
    - -
    modify-class
    - -
    Modifies a printer class. See the add-class operation for a - list of form variables.
    - -
    modify-printer
    - -
    Modifies a printer. See the add-printer operation for a - list of form variables.
    - -
    purge-jobs
    - -
    Purges all jobs on the named destination.
    - -
    reject-jobs
    - -
    Rejects new jobs on the named destination.
    - -
    start-printer
    - -
    Starts the named destination.
    - -
    stop-printer
    - -
    Stops the named destination.
    - -
    - - -

    classes.cgi

    - -

    The classes.cgi program is responsible for -listing class information, including jobs destined for that -class. It is for all direct accesses to the /classes resource -and supports the optional form variables OP and -WHICH_JOBS. If no form variables are supplied then -the CGI lists all or a specific class and the active jobs on -each class. - -

    The following WHICH_JOBS values are supported: - -

    - -
    completed
    - -
    Show only the completed jobs.
    - -
    not-completed
    - -
    Show only the active jobs.
    - -
    - -

    The following OP values are supported: - -

    - -
    print-test-page
    - -
    Print a PostScript test page.
    - -
    - -

    jobs.cgi

    - -

    The jobs.cgi program handles all of the job -functions and is run for all direct accesses to the /jobs -resource. For most operations it uses the -JOB_ID, OP, and -WHICH_JOBS form variables to specify the action -requested. - -

    The following WHICH_JOBS values are supported: - -

    - -
    completed
    - -
    Show only the completed jobs.
    - -
    not-completed
    - -
    Show only the active jobs.
    - -
    - -

    The following OP values are supported: - -

    - -
    job-cancel
    - -
    Cancels a job.
    - -
    job-hold
    - -
    Holds a job indefinitely.
    - -
    job-release
    - -
    Releases a job for printing.
    - -
    job-restart
    - -
    Restarts a stopped, cancelled, completed, or aborted - print job.
    - -
    - -

    printers.cgi

    - -

    The printers.cgi program is responsible for -listing printer information, including jobs destined for that -printer. It is for all direct accesses to the /printers resource -and supports the optional form variables OP and -WHICH_JOBS. If no form variables are supplied then -the CGI lists all or a specific printer and the active jobs on -each printer. - -

    The following WHICH_JOBS values are supported: - -

    - -
    completed
    - -
    Show only the completed jobs.
    - -
    not-completed
    - -
    Show only the active jobs.
    - -
    - -

    The following OP values are supported: - -

    - -
    print-test-page
    - -
    Print a PostScript test page.
    - -
    - - - - - - diff --git a/filter/pstops.c b/filter/pstops.c index 0a2de3196..3f230052f 100644 --- a/filter/pstops.c +++ b/filter/pstops.c @@ -1,5 +1,5 @@ /* - * "$Id: pstops.c 5092 2006-02-09 00:54:31Z mike $" + * "$Id: pstops.c 5205 2006-02-28 21:05:24Z mike $" * * PostScript filter for the Common UNIX Printing System (CUPS). * @@ -2185,11 +2185,11 @@ start_nup(int number, /* I - Page number */ */ printf("%d %d translate\n", -lbrt[0], -lbrt[1]); - printf("0 0 %.1f %.1f ESPrc\n", w, l); + printf("0 0 %d %d ESPrc\n", lbrt[2] - lbrt[0], lbrt[3] - lbrt[1]); } } /* - * End of "$Id: pstops.c 5092 2006-02-09 00:54:31Z mike $". + * End of "$Id: pstops.c 5205 2006-02-28 21:05:24Z mike $". */ diff --git a/locale/Makefile b/locale/Makefile index eb0a3d697..1fef472e7 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5193 2006-02-27 20:27:07Z mike $" +# "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $" # # Locale file makefile for the Common UNIX Printing System (CUPS). # @@ -28,7 +28,7 @@ include ../Makedefs # Locales... # -LOCALES = ja +LANGUAGES = ja # @@ -59,7 +59,7 @@ depend: install: all $(INSTALL_DIR) -m 755 $(LOCALEDIR) - for loc in $(LOCALES) ; do \ + for loc in $(LANGUAGES) ; do \ $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \ $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ done @@ -81,7 +81,7 @@ pot: -e '1,$$s/charset=CHARSET/charset=utf-8/'; \ cat cups.footer) > cups.pot.N mv cups.pot.N cups.pot - for loc in $(LOCALES) ; do \ + for loc in $(LANGUAGES) ; do \ echo Merging changes into cups_$$loc.po... ; \ msgmerge -o cups_$$loc.po cups_$$loc.po cups.pot ; \ done @@ -102,5 +102,5 @@ translate.o: ../cups/http.h ../cups/i18n.h ../cups/language.h ../cups/string.h # -# End of "$Id: Makefile 5193 2006-02-27 20:27:07Z mike $". +# End of "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $". # diff --git a/packaging/cups.list.in b/packaging/cups.list.in index 2f19c85ba..a26298856 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -1,5 +1,5 @@ # -# "$Id: cups.list.in 5193 2006-02-27 20:27:07Z mike $" +# "$Id: cups.list.in 5224 2006-03-04 02:00:43Z mike $" # # ESP Package Manager (EPM) file list for the Common UNIX Printing # System (CUPS). @@ -28,7 +28,7 @@ %copyright 1993-2006 by Easy Software Products, All Rights Reserved. %vendor Easy Software Products %license LICENSE.txt -%readme README.txt +%readme packaging/cups.license %version @CUPS_VERSION@ %description The Common UNIX Printing System provides a portable printing %description layer for UNIX(r) operating systems. It has been developed by @@ -388,6 +388,7 @@ f 0644 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a d 0755 root sys $DOCDIR/help - f 0644 root sys $DOCDIR/help doc/help/api*.html +f 0644 root sys $DOCDIR/help doc/help/spec*.html %subpackage # Documentation files @@ -395,9 +396,21 @@ d 0755 root sys $DOCDIR - f 0644 root sys $DOCDIR doc/*.css f 0644 root sys $DOCDIR doc/*.html d 0755 root sys $DOCDIR/help - -f 0644 root sys $DOCDIR/help doc/*-reference.html +f 0644 root sys $DOCDIR/help/cgi.html doc/help/cgi.html +f 0644 root sys $DOCDIR/help/glossary.html doc/help/glossary.html +f 0644 root sys $DOCDIR/help/license.html doc/help/license.html +f 0644 root sys $DOCDIR/help/network.html doc/help/network.html +f 0644 root sys $DOCDIR/help/options.html doc/help/options.html +f 0644 root sys $DOCDIR/help/overview.html doc/help/overview.html +f 0644 root sys $DOCDIR/help/security.html doc/help/security.html +f 0644 root sys $DOCDIR/help/standard.html doc/help/standard.html +f 0644 root sys $DOCDIR/help/translation.html doc/help/translation.html +f 0644 root sys $DOCDIR/help/whatsnew.html doc/help/whatsnew.html +f 0644 root sys $DOCDIR/help doc/help/man-*.html +f 0644 root sys $DOCDIR/help doc/help/ref-*.html d 0755 root sys $DOCDIR/images - f 0644 root sys $DOCDIR/images doc/images/*.gif +f 0644 root sys $DOCDIR/images doc/images/*.png f 0644 root sys $DOCDIR/robots.txt doc/robots.txt # Japanese documentation files @@ -460,5 +473,5 @@ f 0644 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.$MAN8EXT i 0755 root sys cups init/cups.sh # -# End of "$Id: cups.list.in 5193 2006-02-27 20:27:07Z mike $". +# End of "$Id: cups.list.in 5224 2006-03-04 02:00:43Z mike $". # diff --git a/packaging/cups.readme b/packaging/cups.readme new file mode 100644 index 000000000..c2f964832 --- /dev/null +++ b/packaging/cups.readme @@ -0,0 +1,290 @@ +README - CUPS v1.2.0b1 - 01/10/2006 +----------------------------------- + +***************************************************************** +***************************************************************** +**** **** +**** WARNING: THIS IS BETA RELEASE SOFTWARE AND MAY BE **** +**** TOTALLY UNSTABLE. DO NOT USE IN ENVIRONMENTS **** +**** WHERE RELIABLE SOFTWARE IS REQUIRED! **** +**** **** +***************************************************************** +***************************************************************** + +Looking for compile instructions? Read the file "INSTALL.txt" +instead... + +***************************************************************** +***************************************************************** +**** **** +**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO **** +**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION **** +**** OF A STANDARD GHOSTSCRIPT RELEASE. **** +**** **** +***************************************************************** +***************************************************************** + + +INTRODUCTION + +CUPS provides a portable printing layer for UNIX(r)-based +operating systems. It has been developed by Easy Software +Products to promote a standard printing solution for all UNIX +vendors and users. CUPS provides the System V and Berkeley +command-line interfaces. + +CUPS uses the Internet Printing Protocol ("IPP") as the basis +for managing print jobs and queues. The Line Printer Daemon +("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a. +JetDirect) protocols are also supported with reduced +functionality. CUPS adds network printer browsing and +PostScript Printer Description ("PPD") based printing options to +support real-world printing under UNIX. + +CUPS includes an image file RIP that supports printing of image +files to non-PostScript printers. A customized version of GNU +Ghostscript for CUPS called ESP Ghostscript is available +separately to support printing of PostScript files within the +CUPS driver framework. Sample drivers for Dymo, EPSON, HP, and +OKIDATA printers are included that use these filters. + +Drivers for thousands of printers are provided with our ESP +Print Pro software, available at: + + http://www.easysw.com/printpro/ + +CUPS is licensed under the GNU General Public License and GNU +Library General Public License. Please contact Easy Software +Products for commercial support and "binary distribution" +rights. + + +SYSTEM REQUIREMENTS + +Binary distributions require a minimum of 10MB of free disk +space. We do not recommend using CUPS on a workstation with less +than 32MB of RAM or a PC with less than 16MB of RAM. + +If you are installing from source you'll need ANSI-compliant C +and C++ compilers and optionally one or more image file support +libraries. Complete source installation instructions can be +found in the file "INSTALL.txt". + + +SOFTWARE REQUIREMENTS + +The following operating system software is required to install +one of the binary distributions from Easy Software Products: + + - AIX 4.3 or higher + - HP-UX 11.00 or higher + - IRIX 6.5 or higher + - Linux 2.4 with glibc 2.2 or higher + - Solaris 7 or higher (SPARC or Intel) + + +INSTALLING "PORTABLE" CUPS DISTRIBUTIONS + +We are currently distributing "portable" CUPS binary +distributions in TAR format with installation and removal +scripts generated by our ESP Package Manager (EPM) software, +which is available from: + + http://www.easysw.com/epm + +WARNING: Installing CUPS will overwrite your existing printing +system. Backup files are made by the installation script and +restored by the removal script, so if you experience problems +you should be able to remove the CUPS software to restore your +previous configuration. However, Easy Software Products makes +no warranty for this and will not be liable for any lost +revenues, etc. + +To install the CUPS software you will need to be logged in as +root (doing an "su" is good enough). Once you are the root +user, run the installation script with: + + ./cups.install ENTER + +After asking you a few yes/no questions the CUPS software will +be installed and the scheduler will be started automatically. + + +INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS + +The host-specific distributions use the operating system +software installation tools. To install a host-specific +distribution please consult the CUPS Software Administrators +Manual or your operating system documentation. + + +READING THE DOCUMENTATION + +Once you have installed the software you can access the +documentation (and a bunch of other stuff) on-line at: + + http://localhost:631 + +If you're having trouble getting that far, the documentation is +located in the "/usr/share/doc/cups" directory in the binary +distributions, and under the "doc" directory in the source +archives. + +Please read the documentation before asking questions. + + +GETTING SUPPORT AND OTHER RESOURCES + +If you have problems, READ THE DOCUMENTATION FIRST! We also +provide many discussion forums which are available at: + + http://www.cups.org/newsgroups.php + +Commercial support (with a guaranteed response time) is available +from Easy Software Products. For more information see: + + http://www.easysw.com/cups/ + +See the CUPS web site at "http://www.cups.org/" for other site +links. + + +SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER + +CUPS 1.2 includes a web-based administration tool that allows you +to manage printers, classes, and jobs on your server. To access +the printer administration tools open the following URL in your +browser: + + http://localhost:631/admin + +You will be asked for the administration password (root or any +other user in the sys/system/root group on your system) and then +shown a menu of available functions. + +DO NOT use the hostname for your machine - it will not work with +the default CUPS configuration. To enable administration access +on other addresses, consult the CUPS Software Administrators +Manual. + + +SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE + +CUPS works best with PPD (PostScript Printer Description) +files. In a pinch you can also use System V style printer +interface scripts. + +Six sample PPD files are provided with this distribution that +utilize the PostScript and image file RIPs and the sample EPSON +and HP printer drivers. To add the sample DeskJet driver to the +system for a printer connected to the parallel port, use one of +the following commands: + + HP-UX: + + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E + + IRIX: + + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E + + Linux: + + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E + + Solaris: + + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E + /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E + +Similarly, for the other sample drivers you can use: + + Driver PPD File + ----------------------------- ------------ + Dymo Label Printers dymo.ppd + EPSON Stylus Color Series stcolor.ppd + EPSON Stylus Photo Series stphoto.ppd + EPSON Stylus New Color Series stcolor2.ppd + EPSON Stylus New Photo Series stphoto2.ppd + EPSON 9-pin Series epson9.ppd + EPSON 24-pin Series epson24.ppd + HP DeskJet Series deskjet.ppd + HP New DeskJet Series deskjet2.ppd + HP LaserJet Series laserjet.ppd + OKIDATA 9-Pin Series okidata9.ppd + OKIDATA 24-Pin Series okidat24.ppd + +These sample drivers provide basic printing capabilities, but +generally do not exercise the full potential of the printers or +CUPS. For commercial printer drivers check out our ESP Print +Pro software at: + + http://www.easysw.com/printpro/ + + +PRINTING FILES + +CUPS provides both the System V "lp" and Berkeley "lpr" commands +for printing: + + lp filename + lpr filename + +Both the "lp" and "lpr" commands support printing options for +the driver: + + lp -omedia=A4 -oresolution=600dpi filename + lpr -omedia=A4 -oresolution=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. + +If you have an application that generates output specifically +for your printer then you need to use the "-oraw" or "-l" +options: + + lp -oraw filename + lpr -l filename + +This will prevent the filters from misinterpreting your print +file. + + +LEGAL STUFF + +CUPS is Copyright 1993-2006 by Easy Software Products. CUPS, +the CUPS logo, and the Common UNIX Printing System are the +trademark property of Easy Software Products. + +The MD5 Digest code is Copyright 1999 Aladdin Enterprises. + +The PDF filter (pdftops) is based on the Xpdf software, +Copyright 1996-2005 by Derek B. Noonburg. + +This software is based in part on the work of the Independent +JPEG Group. + +CUPS is provided under the terms 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 "LICENSE.html", +"LICENSE.txt", or "cups.license" files for more information. + +For commercial licensing information, please contact: + + Attn: CUPS Licensing Information + Easy Software Products + 44141 Airport View Drive, Suite 204 + Hollywood, Maryland 20636 USA + + Voice: +1.301.373.9600 + Email: cups-info@cups.org + WWW: http://www.cups.org + +Note that commercial licensors may also require a license from +Derek B. Noonburg who developed the Xpdf software used to print +PDF files. diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index 1cdee7751..2516be253 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -1,5 +1,5 @@ # -# "$Id: cups.spec.in 5193 2006-02-27 20:27:07Z mike $" +# "$Id: cups.spec.in 5224 2006-03-04 02:00:43Z mike $" # # RPM "spec" file for the Common UNIX Printing System (CUPS). # @@ -232,11 +232,17 @@ rm -rf $RPM_BUILD_ROOT %dir /usr/share/doc/cups /usr/share/doc/cups/*.* %dir /usr/share/doc/cups/help -/usr/share/doc/cups/help/*-reference.html +/usr/share/doc/cups/help/cgi.html +/usr/share/doc/cups/help/glossary.html +/usr/share/doc/cups/help/license.html /usr/share/doc/cups/help/man-*.html /usr/share/doc/cups/help/network.html +/usr/share/doc/cups/help/options.html /usr/share/doc/cups/help/overview.html +/usr/share/doc/cups/help/ref-*.html +/usr/share/doc/cups/help/security.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/* @@ -323,5 +329,5 @@ rm -rf $RPM_BUILD_ROOT # -# End of "$Id: cups.spec.in 5193 2006-02-27 20:27:07Z mike $". +# End of "$Id: cups.spec.in 5224 2006-03-04 02:00:43Z mike $". # diff --git a/pstoraster/README.pstoraster b/pstoraster/README.pstoraster deleted file mode 100644 index 980def219..000000000 --- a/pstoraster/README.pstoraster +++ /dev/null @@ -1,73 +0,0 @@ -README.pstoraster - 11/14/2003 ------------------------------- - -INTRODUCTION - - This directory contains the CUPS "driver" for Ghostscript - 7.x and 8.x, the pstoraster script that is used to run - Ghostscript as a CUPS filter, the pstoraster.convs file that - defines the PostScript to raster filter for CUPS drivers, a - makefile fragment that adds the CUPS driver, and the wrapper - script (pstopxl) and PPD files (pxl*.ppd) to support PCL - XL/PCL 6 printers. - - This software is included with both the CUPS and ESP - Ghostscript 7.07.1 distributions. While the files will also - compile with earlier versions of Ghostscript, there are bugs - in older versions of Ghostscript which may cause problems. - - Also, this driver may not be used in any commercial - Ghostscript distributions without prior written - permission/licensing from Easy Software Products. See the - contact information in the file "gdevcups.c" for more - information. - - -COMPILING ESP GHOSTSCRIPT WITH THE CUPS DRIVER - - Normally the CUPS driver will be automatically included when - you use the configure script supplied with ESP Ghostscript. - - Once you have compiled and installed Ghostscript, restart - the cupsd process, either by sending the HUP signal to the - process or using the init script supplied with CUPS. - - To use the PCL XL/PCL 6 drivers, make sure that you also - configure Ghostscript with the pxlmono and pxlcolor drivers. - - -COMPILING AFPL/GNU GHOSTSCRIPT WITH THE CUPS DRIVER - - Before configuring AFPL or GNU Ghostscript, first copy this - directory to the Ghostscript source directory, e.g.: - - cp -r pstoraster /some/path/to/ghostscript-7.07 - - Then apply the appropriate patch: - - cd /some/path/to/ghostscript-7.07 - patch -p1 pstoraster/gs707-lib.patch - - or: - - cd /some/path/to/ghostscript-8.11 - patch -p1 pstoraster/gs811-lib.patch - - Next, run the configure script to configure the Ghostscript - software: - - ./configure [any configure options you want] - - Finally, add the following include line to the end of the - makefile: - - include pstoraster/cups.mak - - and add "$(DD)cups.dev" to any of the DEVICE_DEVS lines. - - Once you have compiled and installed Ghostscript, restart - the cupsd process, either by sending the HUP signal to the - process or using the init script supplied with CUPS. - - To use the PCL XL/PCL 6 drivers, make sure that you also - configure Ghostscript with the pxlmono and pxlcolor drivers. diff --git a/pstoraster/cups.mak b/pstoraster/cups.mak deleted file mode 100644 index 129e8b8af..000000000 --- a/pstoraster/cups.mak +++ /dev/null @@ -1,53 +0,0 @@ -# -# "$Id: cups.mak 4493 2005-02-18 02:09:53Z mike $" -# -# CUPS driver makefile for Ghostscript. -# -# Copyright 2001-2005 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -### ----------------- CUPS Ghostscript Driver ---------------------- ### - -cups_= $(GLOBJ)gdevcups.$(OBJ) - -CUPSSERVER= $(install_prefix)`cups-config --serverbin` -CUPSCONFIG= $(install_prefix)`cups-config --serverroot` -CUPSDATA= $(install_prefix)`cups-config --datadir` - -$(DD)cups.dev: $(cups_) $(GLD)page.dev - $(ADDMOD) $(DD)cups -lib cupsimage -lib cups - $(SETPDEV2) $(DD)cups $(cups_) - -$(GLOBJ)gdevcups.$(OBJ): pstoraster/gdevcups.c $(PDEVH) - $(GLCC) $(GLO_)gdevcups.$(OBJ) $(C_) pstoraster/gdevcups.c - -install: install-cups - -install-cups: - -mkdir -p $(CUPSSERVER)/filter - $(INSTALL_PROGRAM) pstoraster/pstoraster $(CUPSSERVER)/filter - $(INSTALL_PROGRAM) pstoraster/pstopxl $(CUPSSERVER)/filter - -mkdir -p $(CUPSCONFIG) - $(INSTALL_DATA) pstoraster/pstoraster.convs $(CUPSCONFIG) - -mkdir -p $(CUPSDATA)/model - $(INSTALL_DATA) pstoraster/pxlcolor.ppd $(CUPSDATA)/model - $(INSTALL_DATA) pstoraster/pxlmono.ppd $(CUPSDATA)/model - - -# -# End of "$Id: cups.mak 4493 2005-02-18 02:09:53Z mike $". -# diff --git a/pstoraster/gdevcups.c b/pstoraster/gdevcups.c deleted file mode 100644 index 89a5df20e..000000000 --- a/pstoraster/gdevcups.c +++ /dev/null @@ -1,4464 +0,0 @@ -/* - * "$Id: gdevcups.c 4493 2005-02-18 02:09:53Z mike $" - * - * GNU Ghostscript raster output driver for the Common UNIX Printing - * System (CUPS). - * - * Copyright 1993-2005 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Easy Software Products and are protected by Federal - * copyright law. Distribution and use rights are outlined in the file - * "LICENSE.txt" which should have been included with this file. If this - * file is missing or damaged please contact Easy Software Products - * at: - * - * Attn: CUPS Licensing Information - * Easy Software Products - * 44141 Airport View Drive, Suite 204 - * Hollywood, Maryland 20636 USA - * - * Voice: (301) 373-9600 - * EMail: cups-info@cups.org - * WWW: http://www.cups.org/ - * - * 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. - * - * Contents: - * - * cups_close() - Close the output file. - * cups_get_matrix() - Generate the default page matrix. - * cups_get_params() - Get pagedevice parameters. - * cups_get_space_params() - Get space parameters from the RIP_CACHE env var. - * cups_map_color_rgb() - Map a color index to an RGB color. - * cups_map_cielab() - Map CIE Lab transformation... - * cups_map_rgb_color() - Map an RGB color to a color index. We map the - * RGB color to the output colorspace & bits (we - * figure out the format when we output a page). - * cups_open() - Open the output file and initialize things. - * cups_print_pages() - Send one or more pages to the output file. - * cups_put_params() - Set pagedevice parameters. - * cups_set_color_info() - Set the color information structure based on - * the required output. - * cups_print_chunked() - Print a page of chunked pixels. - * cups_print_banded() - Print a page of banded pixels. - * cups_print_planar() - Print a page of planar pixels. - */ - -/* - * Include necessary headers... - */ - -#include "std.h" /* to stop stdlib.h redefining types */ -#include "gdevprn.h" -#include "gsparam.h" -#include "gsexit.h" - -#include -#include -#include -#include -#include - -#undef private -#define private - - -/* - * Check if we are compiling against CUPS 1.2. If so, enable - * certain extended attributes and use a different page header - * structure and write function... - */ - -#ifdef CUPS_RASTER_SYNCv1 -# define cups_page_header_t cups_page_header2_t -# define cupsRasterWriteHeader cupsRasterWriteHeader2 -#endif /* CUPS_RASTER_SYNCv1 */ - - -/* - * Newer versions of Ghostscript don't provide gs_exit() function anymore. - * It has been renamed to gs_to_exit()... - */ - -#ifdef dev_t_proc_encode_color -# define gs_exit gs_to_exit -#endif /* dev_t_proc_encode_color */ - - -/* - * CIE XYZ color constants... - */ - -#define D65_X (0.412453 + 0.357580 + 0.180423) -#define D65_Y (0.212671 + 0.715160 + 0.072169) -#define D65_Z (0.019334 + 0.119193 + 0.950227) - - -/* - * Size of a tile in pixels... - */ - -#define CUPS_TILE_SIZE 256 - - -/* - * Size of profile LUTs... - */ - -#ifdef dev_t_proc_encode_color -# define CUPS_MAX_VALUE frac_1 -#else -# define CUPS_MAX_VALUE gx_max_color_value -#endif /* dev_t_proc_encode_color */ - - -/* - * Macros... - */ - -#define x_dpi (pdev->HWResolution[0]) -#define y_dpi (pdev->HWResolution[1]) -#define cups ((gx_device_cups *)pdev) - -/* - * Macros from ; we can't include because it also - * defines DEBUG, one of our flags to insert various debugging code. - */ - -#ifndef max -# define max(a,b) ((a)<(b) ? (b) : (a)) -#endif /* !max */ - -#ifndef min -# define min(a,b) ((a)>(b) ? (b) : (a)) -#endif /* !min */ - -#ifndef abs -# define abs(x) ((x)>=0 ? (x) : -(x)) -#endif /* !abs */ - - -/* - * Procedures - */ - -private dev_proc_close_device(cups_close); -private dev_proc_get_initial_matrix(cups_get_matrix); -private int cups_get_params(gx_device *, gs_param_list *); -private dev_proc_open_device(cups_open); -private int cups_print_pages(gx_device_printer *, FILE *, int); -private int cups_put_params(gx_device *, gs_param_list *); -private void cups_set_color_info(gx_device *); -private dev_proc_sync_output(cups_sync_output); -private prn_dev_proc_get_space_params(cups_get_space_params); - -#ifdef dev_t_proc_encode_color -private cm_map_proc_gray(cups_map_gray); -private cm_map_proc_rgb(cups_map_rgb); -private cm_map_proc_cmyk(cups_map_cmyk); -private dev_proc_decode_color(cups_decode_color); -private dev_proc_encode_color(cups_encode_color); -private dev_proc_get_color_mapping_procs(cups_get_color_mapping_procs); - -static const gx_cm_color_map_procs cups_color_mapping_procs = -{ - cups_map_gray, - cups_map_rgb, - cups_map_cmyk -}; -#else -private dev_proc_map_cmyk_color(cups_map_cmyk_color); -private dev_proc_map_color_rgb(cups_map_color_rgb); -private dev_proc_map_rgb_color(cups_map_rgb_color); -#endif /* dev_t_proc_encode_color */ - - -/* - * The device descriptors... - */ - -typedef struct gx_device_cups_s -{ - gx_device_common; /* Standard GhostScript device stuff */ - gx_prn_device_common; /* Standard printer device stuff */ - int page; /* Page number */ - cups_raster_t *stream; /* Raster stream */ - cups_page_header_t header; /* PostScript page device info */ - int landscape; /* Non-zero if this is landscape */ -} gx_device_cups; - -private gx_device_procs cups_procs = -{ - cups_open, - cups_get_matrix, - cups_sync_output, - gdev_prn_output_page, - cups_close, -#ifdef dev_t_proc_encode_color - NULL, /* map_rgb_color */ - NULL, /* map_color_rgb */ -#else - cups_map_rgb_color, - cups_map_color_rgb, -#endif /* dev_t_proc_encode_color */ - NULL, /* fill_rectangle */ - NULL, /* tile_rectangle */ - NULL, /* copy_mono */ - NULL, /* copy_color */ - NULL, /* draw_line */ - gx_default_get_bits, - cups_get_params, - cups_put_params, -#ifdef dev_t_proc_encode_color - NULL, /* map_cmyk_color */ -#else - cups_map_cmyk_color, -#endif /* dev_t_proc_encode_color */ - NULL, /* get_xfont_procs */ - NULL, /* get_xfont_device */ - NULL, /* map_rgb_alpha_color */ - gx_page_device_get_page_device, - NULL, /* get_alpha_bits */ - NULL, /* copy_alpha */ - NULL, /* get_band */ - NULL, /* copy_rop */ - NULL, /* fill_path */ - NULL, /* stroke_path */ - NULL, /* fill_mask */ - NULL, /* fill_trapezoid */ - NULL, /* fill_parallelogram */ - NULL, /* fill_triangle */ - NULL, /* draw_thin_line */ - NULL, /* begin_image */ - NULL, /* image_data */ - NULL, /* end_image */ - NULL, /* strip_tile_rectangle */ - NULL /* strip_copy_rop */ -#ifdef dev_t_proc_encode_color - , - NULL, /* get_clipping_box */ - NULL, /* begin_typed_image */ - NULL, /* get_bits_rectangle */ - NULL, /* map_color_rgb_alpha */ - NULL, /* create_compositor */ - NULL, /* get_hardware_params */ - NULL, /* text_begin */ - NULL, /* finish_copydevice */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - cups_get_color_mapping_procs, - NULL, /* get_color_comp_index */ - cups_encode_color, - cups_decode_color -#endif /* dev_t_proc_encode_color */ -}; - -#define prn_device_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_pages)\ - std_device_full_body_type(dtype, &procs, dname, &st_device_printer,\ - (int)((long)(w10) * (xdpi) / 10),\ - (int)((long)(h10) * (ydpi) / 10),\ - xdpi, ydpi,\ - ncomp, depth, mg, mc, dg, dc,\ - -(lo) * (xdpi), -(to) * (ydpi),\ - (lm) * 72.0, (bm) * 72.0,\ - (rm) * 72.0, (tm) * 72.0\ - ),\ - prn_device_body_copies_rest_(print_pages) - -gx_device_cups gs_cups_device = -{ - prn_device_body_copies(gx_device_cups,/* type */ - cups_procs, /* procedures */ - "cups", /* device name */ - 85, /* initial width */ - 110, /* initial height */ - 100, /* initial x resolution */ - 100, /* initial y resolution */ - 0, /* initial left offset */ - 0, /* initial top offset */ - 0, /* initial left margin */ - 0, /* initial bottom margin */ - 0, /* initial right margin */ - 0, /* initial top margin */ - 1, /* number of color components */ - 1, /* number of color bits */ - 1, /* maximum gray value */ - 0, /* maximum color value */ - 2, /* number of gray values */ - 0, /* number of color values */ - cups_print_pages), - /* print procedure */ - 0, /* page */ - NULL, /* stream */ - { /* header */ - "", /* MediaClass */ - "", /* MediaColor */ - "", /* MediaType */ - "", /* OutputType */ - 0, /* AdvanceDistance */ - CUPS_ADVANCE_NONE, /* AdvanceMedia */ - CUPS_FALSE, /* Collate */ - CUPS_CUT_NONE, /* CutMedia */ - CUPS_FALSE, /* Duplex */ - { 100, 100 }, /* HWResolution */ - { 0, 0, 612, 792 }, /* ImagingBoundingBox */ - CUPS_FALSE, /* InsertSheet */ - CUPS_JOG_NONE, /* Jog */ - CUPS_EDGE_TOP, /* LeadingEdge */ - { 0, 0 }, /* Margins */ - CUPS_FALSE, /* ManualFeed */ - 0, /* MediaPosition */ - 0, /* MediaWeight */ - CUPS_FALSE, /* MirrorPrint */ - CUPS_FALSE, /* NegativePrint */ - 1, /* NumCopies */ - CUPS_ORIENT_0, /* Orientation */ - CUPS_FALSE, /* OutputFaceUp */ - { 612, 792 }, /* PageSize */ - CUPS_FALSE, /* Separations */ - CUPS_FALSE, /* TraySwitch */ - CUPS_FALSE, /* Tumble */ - 850, /* cupsWidth */ - 1100, /* cupsHeight */ - 0, /* cupsMediaType */ - 1, /* cupsBitsPerColor */ - 1, /* cupsBitsPerPixel */ - 107, /* cupsBytesPerLine */ - CUPS_ORDER_CHUNKED, /* cupsColorOrder */ - CUPS_CSPACE_K, /* cupsColorSpace */ - 0, /* cupsCompression */ - 0, /* cupsRowCount */ - 0, /* cupsRowFeed */ - 0 /* cupsRowStep */ - } -}; - -/* - * Globals... - */ - -static gx_color_value cupsDecodeLUT[256]; - /* Output color to RGB value LUT */ -static unsigned char cupsEncodeLUT[gx_max_color_value + 1]; - /* RGB value to output color LUT */ - -static ppd_file_t *cupsPPD = 0; /* PPD file for this device */ -static char *cupsProfile = NULL; - /* Current simple color profile string */ -static int cupsHaveProfile = 0; - /* Has a color profile been defined? */ -static int cupsMatrix[3][3][CUPS_MAX_VALUE + 1]; - /* Color transform matrix LUT */ -static int cupsDensity[CUPS_MAX_VALUE + 1]; - /* Density LUT */ -static unsigned char cupsRevLower1[16] = - { /* Lower 1-bit reversal table */ - 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, - 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f - }, - cupsRevUpper1[16] = - { /* Upper 1-bit reversal table */ - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0 - }, - cupsRevLower2[16] = - { /* Lower 2-bit reversal table */ - 0x00, 0x04, 0x08, 0x0c, 0x01, 0x05, 0x09, 0x0d, - 0x02, 0x06, 0x0a, 0x0e, 0x03, 0x07, 0x0b, 0x0f - }, - cupsRevUpper2[16] = - { /* Upper 2-bit reversal table */ - 0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0, - 0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0 - }; - - -/* - * Local functions... - */ - -static double cups_map_cielab(double, double); -static void cups_print_chunked(gx_device_printer *, unsigned char *, - unsigned char *, int); -static void cups_print_banded(gx_device_printer *, unsigned char *, - unsigned char *, int); -static void cups_print_planar(gx_device_printer *, unsigned char *, - unsigned char *, int); - -/*static void cups_set_margins(gx_device *);*/ - - -/* - * 'cups_close()' - Close the output file. - */ - -private int -cups_close(gx_device *pdev) /* I - Device info */ -{ -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_close(%p)\n", pdev); -#endif /* DEBUG */ - - if (cups->stream != NULL) - { - cupsRasterClose(cups->stream); - cups->stream = NULL; - } - -#if 0 /* Can't do this here because put_params() might close the device */ - if (cupsPPD != NULL) - { - ppdClose(cupsPPD); - cupsPPD = NULL; - } - - if (cupsProfile != NULL) - { - free(cupsProfile); - cupsProfile = NULL; - } -#endif /* 0 */ - - return (gdev_prn_close(pdev)); -} - - -#ifdef dev_t_proc_encode_color -/* - * 'cups_decode_color()' - Decode a color value. - */ - -private int /* O - Status (0 = OK) */ -cups_decode_color(gx_device *pdev, /* I - Device info */ - gx_color_index ci, /* I - Color index */ - gx_color_value *cv) /* O - Colors */ -{ - int i; /* Looping var */ - int shift; /* Bits to shift */ - int mask; /* Bits to mask */ - - - if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm && - cups->header.cupsBitsPerColor == 1) - { - /* - * KCMYcm data is represented internally by Ghostscript as CMYK... - */ - - cv[0] = (ci & 0x20) ? frac_1 : frac_0; - cv[1] = (ci & 0x12) ? frac_1 : frac_0; - cv[2] = (ci & 0x09) ? frac_1 : frac_0; - cv[3] = (ci & 0x04) ? frac_1 : frac_0; - } - else - { - shift = cups->header.cupsBitsPerColor; - mask = (1 << shift) - 1; - - for (i = cups->color_info.num_components - 1; i > 0; i --, ci >>= shift) - cv[i] = cupsDecodeLUT[ci & mask]; - - cv[0] = cupsDecodeLUT[ci & mask]; - } - - return (0); -} - - -/* - * 'cups_encode_color()' - Encode a color value. - */ - -private gx_color_index /* O - Color index */ -cups_encode_color(gx_device *pdev, - /* I - Device info */ - const gx_color_value *cv) - /* I - Colors */ -{ - int i; /* Looping var */ - gx_color_index ci; /* Color index */ - int shift; /* Bits to shift */ - - - /* - * Encode the color index... - */ - - shift = cups->header.cupsBitsPerColor; - - for (ci = cupsEncodeLUT[cv[0]], i = 1; - i < cups->color_info.num_components; - i ++) - ci = (ci << shift) | cupsEncodeLUT[cv[i]]; - - /* - * Handle 6-color output... - */ - - if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm && - cups->header.cupsBitsPerColor == 1) - { - /* - * Welcome to hackville, where we map CMYK data to the - * light inks in draft mode... Map blue to light magenta and - * cyan and green to light cyan and yellow... - */ - - ci <<= 2; /* Leave room for light inks */ - - if (ci == 0x18) /* Blue */ - ci = 0x11; /* == cyan + light magenta */ - else if (ci == 0x14) /* Green */ - ci = 0x06; /* == light cyan + yellow */ - } - - /* - * Range check the return value... - */ - - if (ci == gx_no_color_index) - ci --; - - /* - * Return the color index... - */ - - return (ci); -} - - -/* - * 'cups_get_color_mapping_procs()' - Get the list of color mapping procedures. - */ - -private const gx_cm_color_map_procs * /* O - List of device procedures */ -cups_get_color_mapping_procs(const gx_device *pdev) - /* I - Device info */ -{ - return (&cups_color_mapping_procs); -} -#endif /* dev_t_proc_encode_color */ - - -/* - * 'cups_get_matrix()' - Generate the default page matrix. - */ - -private void -cups_get_matrix(gx_device *pdev, /* I - Device info */ - gs_matrix *pmat) /* O - Physical transform matrix */ -{ -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_get_matrix(%p, %p)\n", pdev, pmat); -#endif /* DEBUG */ - - /* - * Set the raster width and height... - */ - - cups->header.cupsWidth = cups->width; - cups->header.cupsHeight = cups->height; - - /* - * Set the transform matrix... - */ - - fprintf(stderr, "DEBUG: cups->header.Duplex = %d\n", cups->header.Duplex); - fprintf(stderr, "DEBUG: cups->page = %d\n", cups->page); - - if (cupsPPD) - { - fprintf(stderr, "DEBUG: cupsPPD = %p\n", cupsPPD); - fprintf(stderr, "DEBUG: cupsPPD->flip_duplex = %d\n", cupsPPD->flip_duplex); - } - - if (cups->landscape) - { - /* - * Do landscape orientation... - */ - - if (cups->header.Duplex && !cups->header.Tumble && - cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1)) - { - pmat->xx = 0.0; - pmat->xy = (float)cups->header.HWResolution[0] / 72.0; - pmat->yx = -(float)cups->header.HWResolution[1] / 72.0; - pmat->yy = 0.0; - pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[2] / 72.0; - pmat->ty = (float)cups->header.HWResolution[1] * - ((float)cups->header.PageSize[0] - pdev->HWMargins[3]) / 72.0; - } - else - { - pmat->xx = 0.0; - pmat->xy = (float)cups->header.HWResolution[0] / 72.0; - pmat->yx = (float)cups->header.HWResolution[1] / 72.0; - pmat->yy = 0.0; - pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[0] / 72.0; - pmat->ty = -(float)cups->header.HWResolution[1] * pdev->HWMargins[1] / 72.0; - } - } - else if (cups->header.Duplex && !cups->header.Tumble && - cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1)) - { - pmat->xx = (float)cups->header.HWResolution[0] / 72.0; - pmat->xy = 0.0; - pmat->yx = 0.0; - pmat->yy = (float)cups->header.HWResolution[1] / 72.0; - pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[2] / 72.0; - pmat->ty = -(float)cups->header.HWResolution[1] * pdev->HWMargins[3] / 72.0; - } - else - { - pmat->xx = (float)cups->header.HWResolution[0] / 72.0; - pmat->xy = 0.0; - pmat->yx = 0.0; - pmat->yy = -(float)cups->header.HWResolution[1] / 72.0; - pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[0] / 72.0; - pmat->ty = (float)cups->header.HWResolution[1] * - ((float)cups->header.PageSize[1] - pdev->HWMargins[3]) / 72.0; - } - - fprintf(stderr, "DEBUG: width = %d, height = %d\n", cups->width, - cups->height); - fprintf(stderr, "DEBUG: PageSize = [ %d %d ], HWResolution = [ %d %d ]\n", - cups->header.PageSize[0], cups->header.PageSize[1], - cups->header.HWResolution[0], cups->header.HWResolution[1]); - fprintf(stderr, "DEBUG: HWMargins = [ %.3f %.3f %.3f %.3f ]\n", - pdev->HWMargins[0], pdev->HWMargins[1], pdev->HWMargins[2], - pdev->HWMargins[3]); - fprintf(stderr, "DEBUG: matrix = [ %.3f %.3f %.3f %.3f %.3f %.3f ]\n", - pmat->xx, pmat->xy, pmat->yx, pmat->yy, pmat->tx, pmat->ty); -} - - -/* - * 'cups_get_params()' - Get pagedevice parameters. - */ - -private int /* O - Error status */ -cups_get_params(gx_device *pdev, /* I - Device info */ - gs_param_list *plist) /* I - Parameter list */ -{ -#ifdef CUPS_RASTER_SYNCv1 - int i; /* Looping var */ - char name[255]; /* Attribute name */ -#endif /* CUPS_RASTER_SYNCv1 */ - int code; /* Return code */ - gs_param_string s; /* Temporary string value */ - bool b; /* Temporary boolean value */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_get_params(%p, %p)\n", pdev, plist); -#endif /* DEBUG */ - - /* - * First process the "standard" page device parameters... - */ - -#ifdef DEBUG - fputs("DEBUG2: before gdev_prn_get_params()\n", stderr); -#endif /* DEBUG */ - - if ((code = gdev_prn_get_params(pdev, plist)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: after gdev_prn_get_params()\n", stderr); -#endif /* DEBUG */ - - /* - * Then write the CUPS parameters... - */ - -#ifdef DEBUG - fputs("DEBUG2: Adding MediaClass\n", stderr); -#endif /* DEBUG */ - - param_string_from_string(s, cups->header.MediaClass); - if ((code = param_write_string(plist, "MediaClass", &s)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding AdvanceDistance\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "AdvanceDistance", - (int *)&(cups->header.AdvanceDistance))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding AdvanceDistance\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "AdvanceMedia", - (int *)&(cups->header.AdvanceMedia))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding Collate\n", stderr); -#endif /* DEBUG */ - - b = cups->header.Collate; - if ((code = param_write_bool(plist, "Collate", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding CutMedia\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "CutMedia", - (int *)&(cups->header.CutMedia))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding InsertSheet\n", stderr); -#endif /* DEBUG */ - - b = cups->header.InsertSheet; - if ((code = param_write_bool(plist, "InsertSheet", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding Jog\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "Jog", - (int *)&(cups->header.Jog))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding LeadingEdge\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "LeadingEdge", - (int *)&(cups->header.LeadingEdge))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding ManualFeed\n", stderr); -#endif /* DEBUG */ - - b = cups->header.ManualFeed; - if ((code = param_write_bool(plist, "ManualFeed", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding MediaPosition\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "MediaPosition", - (int *)&(cups->header.MediaPosition))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding MirrorPrint\n", stderr); -#endif /* DEBUG */ - - b = cups->header.MirrorPrint; - if ((code = param_write_bool(plist, "MirrorPrint", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding NegativePrint\n", stderr); -#endif /* DEBUG */ - - b = cups->header.NegativePrint; - if ((code = param_write_bool(plist, "NegativePrint", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding OutputFaceUp\n", stderr); -#endif /* DEBUG */ - - b = cups->header.OutputFaceUp; - if ((code = param_write_bool(plist, "OutputFaceUp", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding Separations\n", stderr); -#endif /* DEBUG */ - - b = cups->header.Separations; - if ((code = param_write_bool(plist, "Separations", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding TraySwitch\n", stderr); -#endif /* DEBUG */ - - b = cups->header.TraySwitch; - if ((code = param_write_bool(plist, "TraySwitch", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding Tumble\n", stderr); -#endif /* DEBUG */ - - b = cups->header.Tumble; - if ((code = param_write_bool(plist, "Tumble", &b)) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsWidth\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsWidth", - (int *)&(cups->header.cupsWidth))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsHeight\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsHeight", - (int *)&(cups->header.cupsHeight))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsMediaType\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsMediaType", - (int *)&(cups->header.cupsMediaType))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsBitsPerColor\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsBitsPerColor", - (int *)&(cups->header.cupsBitsPerColor))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsBitsPerPixel\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsBitsPerPixel", - (int *)&(cups->header.cupsBitsPerPixel))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsBytesPerLine\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsBytesPerLine", - (int *)&(cups->header.cupsBytesPerLine))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsColorOrder\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsColorOrder", - (int *)&(cups->header.cupsColorOrder))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsColorSpace\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsColorSpace", - (int *)&(cups->header.cupsColorSpace))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsCompression\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsCompression", - (int *)&(cups->header.cupsCompression))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsRowCount\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsRowCount", - (int *)&(cups->header.cupsRowCount))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsRowFeed\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsRowFeed", - (int *)&(cups->header.cupsRowFeed))) < 0) - return (code); - -#ifdef DEBUG - fputs("DEBUG2: Adding cupsRowStep\n", stderr); -#endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsRowStep", - (int *)&(cups->header.cupsRowStep))) < 0) - return (code); - -#ifdef CUPS_RASTER_SYNCv1 -# ifdef DEBUG - fputs("DEBUG2: Adding cupsNumColors\n", stderr); -# endif /* DEBUG */ - - if ((code = param_write_int(plist, "cupsNumColors", - (int *)&(cups->header.cupsNumColors))) < 0) - return (code); - -# ifdef DEBUG - fputs("DEBUG2: Adding cupsInteger\n", stderr); -# endif /* DEBUG */ - - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsInteger%d", i); - if ((code = param_write_int(plist, name, - (int *)(cups->header.cupsInteger + i))) < 0) - return (code); - } - -# ifdef DEBUG - fputs("DEBUG2: Adding cupsReal\n", stderr); -# endif /* DEBUG */ - - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsReal%d", i); - if ((code = param_write_float(plist, name, - cups->header.cupsReal + i)) < 0) - return (code); - } - -# ifdef DEBUG - fputs("DEBUG2: Adding cupsString\n", stderr); -# endif /* DEBUG */ - - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsReal%d", i); - param_string_from_string(s, cups->header.cupsString[i]); - if ((code = param_write_string(plist, name, &s)) < 0) - return (code); - } - -# ifdef DEBUG - fputs("DEBUG2: Adding cupsMarkerType\n", stderr); -# endif /* DEBUG */ - - param_string_from_string(s, cups->header.cupsMarkerType); - if ((code = param_write_string(plist, "cupsMarkerType", &s)) < 0) - return (code); - -# ifdef DEBUG - fputs("DEBUG2: Adding cupsRenderingIntent\n", stderr); -# endif /* DEBUG */ - - param_string_from_string(s, cups->header.cupsRenderingIntent); - if ((code = param_write_string(plist, "cupsRenderingIntent", &s)) < 0) - return (code); -#endif /* CUPS_RASTER_SYNCv1 */ - -#ifdef DEBUG - fputs("DEBUG2: Leaving cups_get_params()\n", stderr); -#endif /* DEBUG */ - - return (0); -} - - -/* - * 'cups_get_space_params()' - Get space parameters from the RIP_CACHE env var. - */ - -void -cups_get_space_params(const gx_device_printer *pdev, - /* I - Printer device */ - gdev_prn_space_params *space_params) - /* O - Space parameters */ -{ - float cache_size; /* Size of tile cache in bytes */ - char *cache_env, /* Cache size environment variable */ - cache_units[255]; /* Cache size units */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_get_space_params(%p, %p)\n", pdev, space_params); -#endif /* DEBUG */ - - if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL) - { - switch (sscanf(cache_env, "%f%254s", &cache_size, cache_units)) - { - case 0 : - cache_size = 8 * 1024 * 1024; - break; - case 1 : - cache_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; - break; - case 2 : - if (tolower(cache_units[0]) == 'g') - cache_size *= 1024 * 1024 * 1024; - else if (tolower(cache_units[0]) == 'm') - cache_size *= 1024 * 1024; - else if (tolower(cache_units[0]) == 'k') - cache_size *= 1024; - else if (tolower(cache_units[0]) == 't') - cache_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; - break; - } - } - else - cache_size = 8 * 1024 * 1024; - - fprintf(stderr, "DEBUG: cache_size = %.0f\n", cache_size); - - space_params->MaxBitmap = (int)cache_size; - space_params->BufferSpace = (int)cache_size / 10; -} - - -/* - * 'cups_map_cielab()' - Map CIE Lab transformation... - */ - -static double /* O - Adjusted color value */ -cups_map_cielab(double x, /* I - Raw color value */ - double xn) /* I - Whitepoint color value */ -{ - double x_xn; /* Fraction of whitepoint */ - - - x_xn = x / xn; - - if (x_xn > 0.008856) - return (cbrt(x_xn)); - else - return (7.787 * x_xn + 16.0 / 116.0); -} - - -#ifdef dev_t_proc_encode_color -/* - * 'cups_map_cmyk()' - Map a CMYK color value to device colors. - */ - -private void -cups_map_cmyk(gx_device *pdev, /* I - Device info */ - frac c, /* I - Cyan value */ - frac m, /* I - Magenta value */ - frac y, /* I - Yellow value */ - frac k, /* I - Black value */ - frac *out) /* O - Device colors */ -{ - int c0, c1, c2; /* Temporary color values */ - float rr, rg, rb, /* Real RGB colors */ - ciex, ciey, ciez, /* CIE XYZ colors */ - ciey_yn, /* Normalized luminance */ - ciel, ciea, cieb; /* CIE Lab colors */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_cmyk(%p, %d, %d, %d, %d, %p)\n", - pdev, c, m, y, k, out); -#endif /* DEBUG */ - - /* - * Convert the CMYK color to the destination colorspace... - */ - - switch (cups->header.cupsColorSpace) - { - case CUPS_CSPACE_W : - c0 = frac_1 - (c * 31 + m * 61 + y * 8) / 100 - k; - - if (c0 < 0) - out[0] = 0; - else if (c0 > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c0]; - break; - - case CUPS_CSPACE_RGBA : - out[3] = frac_1; - - case CUPS_CSPACE_RGB : - c0 = frac_1 - c - k; - c1 = frac_1 - m - k; - c2 = frac_1 - y - k; - - if (c0 < 0) - out[0] = 0; - else if (c0 > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c0]; - - if (c1 < 0) - out[1] = 0; - else if (c1 > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[c1]; - - if (c2 < 0) - out[2] = 0; - else if (c2 > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[c2]; - break; - - default : - case CUPS_CSPACE_K : - c0 = (c * 31 + m * 61 + y * 8) / 100 + k; - - if (c0 < 0) - out[0] = 0; - else if (c0 > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c0]; - break; - - case CUPS_CSPACE_CMY : - c0 = c + k; - c1 = m + k; - c2 = y + k; - - if (c0 < 0) - out[0] = 0; - else if (c0 > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c0]; - - if (c1 < 0) - out[1] = 0; - else if (c1 > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[c1]; - - if (c2 < 0) - out[2] = 0; - else if (c2 > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[c2]; - break; - - case CUPS_CSPACE_YMC : - c0 = y + k; - c1 = m + k; - c2 = c + k; - - if (c0 < 0) - out[0] = 0; - else if (c0 > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c0]; - - if (c1 < 0) - out[1] = 0; - else if (c1 > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[c1]; - - if (c2 < 0) - out[2] = 0; - else if (c2 > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[c2]; - break; - - case CUPS_CSPACE_CMYK : - if (c < 0) - out[0] = 0; - else if (c > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[c]; - - if (m < 0) - out[1] = 0; - else if (m > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[m]; - - if (y < 0) - out[2] = 0; - else if (y > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[y]; - - if (k < 0) - out[3] = 0; - else if (k > frac_1) - out[3] = (frac)cupsDensity[frac_1]; - else - out[3] = (frac)cupsDensity[k]; - break; - - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - if (y < 0) - out[0] = 0; - else if (y > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[y]; - - if (m < 0) - out[1] = 0; - else if (m > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[m]; - - if (c < 0) - out[2] = 0; - else if (c > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[c]; - - if (k < 0) - out[3] = 0; - else if (k > frac_1) - out[3] = (frac)cupsDensity[frac_1]; - else - out[3] = (frac)cupsDensity[k]; - break; - - case CUPS_CSPACE_KCMYcm : - case CUPS_CSPACE_KCMY : - if (k < 0) - out[0] = 0; - else if (k > frac_1) - out[0] = (frac)cupsDensity[frac_1]; - else - out[0] = (frac)cupsDensity[k]; - - if (c < 0) - out[1] = 0; - else if (c > frac_1) - out[1] = (frac)cupsDensity[frac_1]; - else - out[1] = (frac)cupsDensity[c]; - - if (m < 0) - out[2] = 0; - else if (m > frac_1) - out[2] = (frac)cupsDensity[frac_1]; - else - out[2] = (frac)cupsDensity[m]; - - if (y < 0) - out[3] = 0; - else if (y > frac_1) - out[3] = (frac)cupsDensity[frac_1]; - else - out[3] = (frac)cupsDensity[y]; - break; - -# ifdef CUPS_RASTER_HAVE_COLORIMETRIC - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - /* - * Convert CMYK to sRGB... - */ - - c0 = frac_1 - c - k; - c1 = frac_1 - m - k; - c2 = frac_1 - y - k; - - if (c0 < 0) - c0 = 0; - else if (c0 > frac_1) - c0 = frac_1; - - if (c1 < 0) - c1 = 0; - else if (c1 > frac_1) - c1 = frac_1; - - if (c2 < 0) - c2 = 0; - else if (c2 > frac_1) - c2 = frac_1; - - /* - * Convert sRGB to linear RGB... - */ - - rr = pow((double)c0 / (double)frac_1, 0.58823529412); - rg = pow((double)c1 / (double)frac_1, 0.58823529412); - rb = pow((double)c2 / (double)frac_1, 0.58823529412); - - /* - * Convert to CIE XYZ... - */ - - ciex = 0.412453 * rr + 0.357580 * rg + 0.180423 * rb; - ciey = 0.212671 * rr + 0.715160 * rg + 0.072169 * rb; - ciez = 0.019334 * rr + 0.119193 * rg + 0.950227 * rb; - - if (cups->header.cupsColorSpace == CUPS_CSPACE_CIEXYZ) - { - /* - * Convert to an integer XYZ color value... - */ - - if (ciex > 1.0) - c0 = frac_1; - else if (ciex > 0.0) - c0 = (int)(ciex * frac_1); - else - c0 = 0; - - if (ciey > 1.0) - c1 = frac_1; - else if (ciey > 0.0) - c1 = (int)(ciey * frac_1); - else - c1 = 0; - - if (ciez > 1.0) - c2 = frac_1; - else if (ciez > 0.0) - c2 = (int)(ciez * frac_1); - else - c2 = 0; - } - else - { - /* - * Convert CIE XYZ to Lab... - */ - - ciey_yn = ciey / D65_Y; - - if (ciey_yn > 0.008856) - ciel = 116 * cbrt(ciey_yn) - 16; - else - ciel = 903.3 * ciey_yn; - - ciea = 500 * (cups_map_cielab(ciex, D65_X) - - cups_map_cielab(ciey, D65_Y)); - cieb = 200 * (cups_map_cielab(ciey, D65_Y) - - cups_map_cielab(ciez, D65_Z)); - - /* - * Scale the L value and bias the a and b values by 128 - * so that all values are in the range of 0 to 255. - */ - - ciel *= 2.55; - ciea += 128; - cieb += 128; - - /* - * Convert to frac values... - */ - - if (ciel < 0.0) - c0 = 0; - else if (ciel < 255.0) - c0 = (int)(ciel * frac_1 / 255.0); - else - c0 = frac_1; - - if (ciea < 0.0) - c1 = 0; - else if (ciea < 255.0) - c1 = (int)(ciea * frac_1 / 255.0); - else - c1 = frac_1; - - if (cieb < 0.0) - c2 = 0; - else if (cieb < 255.0) - c2 = (int)(cieb * frac_1 / 255.0); - else - c2 = frac_1; - } - - /* - * Put the final color value together... - */ - - out[0] = c0; - out[1] = c1; - out[2] = c2; - break; -# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ - } - - switch (cups->color_info.num_components) - { - default : - case 1 : -#ifdef DEBUG - fprintf(stderr, "DEBUG2: \\=== COLOR %d\n", out[0]); -#endif /* DEBUG */ - break; - - case 3 : -#ifdef DEBUG - fprintf(stderr, "DEBUG2: \\=== COLOR %d, %d, %d\n", - out[0], out[1], out[2]); -#endif /* DEBUG */ - break; - - case 4 : -#ifdef DEBUG - fprintf(stderr, "DEBUG2: \\=== COLOR %d, %d, %d, %d\n", - out[0], out[1], out[2], out[3]); -#endif /* DEBUG */ - break; - } -} - - -/* - * 'cups_map_gray()' - Map a grayscale value to device colors. - */ - -private void -cups_map_gray(gx_device *pdev, /* I - Device info */ - frac g, /* I - Grayscale value */ - frac *out) /* O - Device colors */ -{ -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_gray(%p, %d, %p)\n", - pdev, g, out); -#endif /* DEBUG */ - - /* - * Just use the CMYK mapper... - */ - - cups_map_cmyk(pdev, 0, 0, 0, frac_1 - g, out); -} - - -/* - * 'cups_map_rgb()' - Map a RGB color value to device colors. - */ - -private void -cups_map_rgb(gx_device *pdev, - /* I - Device info */ - const gs_imager_state *pis,/* I - Device state */ - frac r, /* I - Red value */ - frac g, /* I - Green value */ - frac b, /* I - Blue value */ - frac *out)/* O - Device colors */ -{ - frac c, m, y, k; /* CMYK values */ - frac mk; /* Maximum K value */ - int tc, tm, ty; /* Temporary color values */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_rgb(%p, %p, %d, %d, %d, %p)\n", - pdev, pis, r, g, b, out); -#endif /* DEBUG */ - - /* - * Compute CMYK values... - */ - - c = frac_1 - r; - m = frac_1 - g; - y = frac_1 - b; - k = min(c, min(m, y)); - - if ((mk = max(c, max(m, y))) > k) - k = (int)((float)k * (float)k * (float)k / ((float)mk * (float)mk)); - - c -= k; - m -= k; - y -= k; - - /* - * Do color correction as needed... - */ - - if (cupsHaveProfile) - { - /* - * Color correct CMY... - */ - - tc = cupsMatrix[0][0][c] + - cupsMatrix[0][1][m] + - cupsMatrix[0][2][y]; - tm = cupsMatrix[1][0][c] + - cupsMatrix[1][1][m] + - cupsMatrix[1][2][y]; - ty = cupsMatrix[2][0][c] + - cupsMatrix[2][1][m] + - cupsMatrix[2][2][y]; - - if (tc < 0) - c = 0; - else if (tc > frac_1) - c = frac_1; - else - c = (frac)tc; - - if (tm < 0) - m = 0; - else if (tm > frac_1) - m = frac_1; - else - m = (frac)tm; - - if (ty < 0) - y = 0; - else if (ty > frac_1) - y = frac_1; - else - y = (frac)ty; - } - - /* - * Use the CMYK mapping function to produce the device colors... - */ - - cups_map_cmyk(pdev, c, m, y, k, out); -} -#else -/* - * 'cups_map_cmyk_color()' - Map a CMYK color to a color index. - * - * This function is only called when a 4 or 6 color colorspace is - * selected for output. CMYK colors are *not* corrected but *are* - * density adjusted. - */ - -private gx_color_index /* O - Color index */ -cups_map_cmyk_color(gx_device *pdev, - /* I - Device info */ - gx_color_value c, /* I - Cyan value */ - gx_color_value m, /* I - Magenta value */ - gx_color_value y, /* I - Yellow value */ - gx_color_value k) /* I - Black value */ -{ - gx_color_index i; /* Temporary index */ - gx_color_value ic, im, iy, ik; /* Integral CMYK values */ - - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_cmyk_color(%p, %d, %d, %d, %d)\n", pdev, - c, m, y, k); -# endif /* DEBUG */ - - /* - * Setup the color info data as needed... - */ - - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); - - /* - * Density correct... - */ - - if (cupsHaveProfile) - { - c = cupsDensity[c]; - m = cupsDensity[m]; - y = cupsDensity[y]; - k = cupsDensity[k]; - } - - ic = cupsEncodeLUT[c]; - im = cupsEncodeLUT[m]; - iy = cupsEncodeLUT[y]; - ik = cupsEncodeLUT[k]; - - /* - * Convert the CMYK color to a color index... - */ - - switch (cups->header.cupsColorSpace) - { - default : - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((ic << 1) | im) << 1) | iy) << 1) | ik; - break; - case 2 : - i = (((((ic << 2) | im) << 2) | iy) << 2) | ik; - break; - case 4 : - i = (((((ic << 4) | im) << 4) | iy) << 4) | ik; - break; - case 8 : - i = (((((ic << 8) | im) << 8) | iy) << 8) | ik; - break; - } - break; - - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((iy << 1) | im) << 1) | ic) << 1) | ik; - break; - case 2 : - i = (((((iy << 2) | im) << 2) | ic) << 2) | ik; - break; - case 4 : - i = (((((iy << 4) | im) << 4) | ic) << 4) | ik; - break; - case 8 : - i = (((((iy << 8) | im) << 8) | ic) << 8) | ik; - break; - } - break; - - case CUPS_CSPACE_KCMYcm : - if (cups->header.cupsBitsPerColor == 1) - { - if (ik) - i = 32; - else - i = 0; - - if (ic && im) - i |= 17; - else if (ic && iy) - i |= 6; - else if (im && iy) - i |= 12; - else if (ic) - i |= 16; - else if (im) - i |= 8; - else if (iy) - i |= 4; - break; - } - - case CUPS_CSPACE_KCMY : - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((ik << 1) | ic) << 1) | im) << 1) | iy; - break; - case 2 : - i = (((((ik << 2) | ic) << 2) | im) << 2) | iy; - break; - case 4 : - i = (((((ik << 4) | ic) << 4) | im) << 4) | iy; - break; - case 8 : - i = (((((ik << 8) | ic) << 8) | im) << 8) | iy; - break; - } - break; - } - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: CMYK (%d,%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n", - c, m, y, k, (unsigned)i, ic, im, iy, ik); -# endif /* DEBUG */ - - /* - * Make sure we don't get a CMYK color of 255, 255, 255, 255... - */ - - if (i == gx_no_color_index) - i --; - - return (i); -} - - -/* - * 'cups_map_color_rgb()' - Map a color index to an RGB color. - */ - -private int -cups_map_color_rgb(gx_device *pdev,/* I - Device info */ - gx_color_index color,/* I - Color index */ - gx_color_value prgb[3]) - /* O - RGB values */ -{ - unsigned char c0, c1, c2, c3; /* Color index components */ - gx_color_value k, divk; /* Black & divisor */ - - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_color_rgb(%p, %d, %p)\n", pdev, - (unsigned)color, prgb); -# endif /* DEBUG */ - - /* - * Setup the color info data as needed... - */ - - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: COLOR %08x = ", (unsigned)color); -# endif /* DEBUG */ - - /* - * Extract the color components from the color index... - */ - - switch (cups->header.cupsBitsPerColor) - { - default : - c3 = color & 1; - color >>= 1; - c2 = color & 1; - color >>= 1; - c1 = color & 1; - color >>= 1; - c0 = color; - break; - case 2 : - c3 = color & 3; - color >>= 2; - c2 = color & 3; - color >>= 2; - c1 = color & 3; - color >>= 2; - c0 = color; - break; - case 4 : - c3 = color & 15; - color >>= 4; - c2 = color & 15; - color >>= 4; - c1 = color & 15; - color >>= 4; - c0 = color; - break; - case 8 : - c3 = color & 255; - color >>= 8; - c2 = color & 255; - color >>= 8; - c1 = color & 255; - color >>= 8; - c0 = color; - break; - } - - /* - * Convert the color components to RGB... - */ - - switch (cups->header.cupsColorSpace) - { - case CUPS_CSPACE_K : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - prgb[0] = - prgb[1] = - prgb[2] = cupsDecodeLUT[c3]; - break; - - case CUPS_CSPACE_W : - prgb[0] = - prgb[1] = - prgb[2] = cupsDecodeLUT[c3]; - break; - - case CUPS_CSPACE_RGB : - prgb[0] = cupsDecodeLUT[c1]; - prgb[1] = cupsDecodeLUT[c2]; - prgb[2] = cupsDecodeLUT[c3]; - break; - - case CUPS_CSPACE_RGBA : - prgb[0] = cupsDecodeLUT[c0]; - prgb[1] = cupsDecodeLUT[c1]; - prgb[2] = cupsDecodeLUT[c2]; - break; - - case CUPS_CSPACE_CMY : - prgb[0] = cupsDecodeLUT[c1]; - prgb[1] = cupsDecodeLUT[c2]; - prgb[2] = cupsDecodeLUT[c3]; - break; - - case CUPS_CSPACE_YMC : - prgb[0] = cupsDecodeLUT[c3]; - prgb[1] = cupsDecodeLUT[c2]; - prgb[2] = cupsDecodeLUT[c1]; - break; - - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - k = cupsDecodeLUT[c0]; - divk = gx_max_color_value - k; - if (divk == 0) - { - prgb[0] = 0; - prgb[1] = 0; - prgb[2] = 0; - } - else - { - prgb[0] = gx_max_color_value + divk - - gx_max_color_value * c1 / divk; - prgb[1] = gx_max_color_value + divk - - gx_max_color_value * c2 / divk; - prgb[2] = gx_max_color_value + divk - - gx_max_color_value * c3 / divk; - } - break; - - case CUPS_CSPACE_CMYK : - k = cupsDecodeLUT[c3]; - divk = gx_max_color_value - k; - if (divk == 0) - { - prgb[0] = 0; - prgb[1] = 0; - prgb[2] = 0; - } - else - { - prgb[0] = gx_max_color_value + divk - - gx_max_color_value * c0 / divk; - prgb[1] = gx_max_color_value + divk - - gx_max_color_value * c1 / divk; - prgb[2] = gx_max_color_value + divk - - gx_max_color_value * c2 / divk; - } - break; - - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - k = cupsDecodeLUT[c3]; - divk = gx_max_color_value - k; - if (divk == 0) - { - prgb[0] = 0; - prgb[1] = 0; - prgb[2] = 0; - } - else - { - prgb[0] = gx_max_color_value + divk - - gx_max_color_value * c2 / divk; - prgb[1] = gx_max_color_value + divk - - gx_max_color_value * c1 / divk; - prgb[2] = gx_max_color_value + divk - - gx_max_color_value * c0 / divk; - } - break; - -# ifdef CUPS_RASTER_HAVE_COLORIMETRIC - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - break; -# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ - } - -# ifdef DEBUG - fprintf(stderr, "%d,%d,%d\n", prgb[0], prgb[1], prgb[2]); -# endif /* DEBUG */ - - return (0); -} - - -/* - * 'cups_map_rgb_color()' - Map an RGB color to a color index. We map the - * RGB color to the output colorspace & bits (we - * figure out the format when we output a page). - */ - -private gx_color_index /* O - Color index */ -cups_map_rgb_color(gx_device *pdev,/* I - Device info */ - gx_color_value r, /* I - Red value */ - gx_color_value g, /* I - Green value */ - gx_color_value b) /* I - Blue value */ -{ - gx_color_index i; /* Temporary index */ - gx_color_value ic, im, iy, ik; /* Integral CMYK values */ - gx_color_value mk; /* Maximum K value */ - int tc, tm, ty; /* Temporary color values */ - float rr, rg, rb, /* Real RGB colors */ - ciex, ciey, ciez, - /* CIE XYZ colors */ - ciey_yn, /* Normalized luminance */ - ciel, ciea, cieb; - /* CIE Lab colors */ - - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_map_rgb_color(%p, %d, %d, %d)\n", pdev, r, g, b); -# endif /* DEBUG */ - - /* - * Setup the color info data as needed... - */ - - if (pdev->color_info.num_components == 0) - cups_set_color_info(pdev); - - /* - * Do color correction as needed... - */ - - if (cupsHaveProfile) - { - /* - * Compute CMYK values... - */ - - ic = gx_max_color_value - r; - im = gx_max_color_value - g; - iy = gx_max_color_value - b; - ik = min(ic, min(im, iy)); - - if ((mk = max(ic, max(im, iy))) > ik) - ik = (int)((float)ik * (float)ik * (float)ik / ((float)mk * (float)mk)); - - ic -= ik; - im -= ik; - iy -= ik; - - /* - * Color correct CMY... - */ - - tc = cupsMatrix[0][0][ic] + - cupsMatrix[0][1][im] + - cupsMatrix[0][2][iy] + - ik; - tm = cupsMatrix[1][0][ic] + - cupsMatrix[1][1][im] + - cupsMatrix[1][2][iy] + - ik; - ty = cupsMatrix[2][0][ic] + - cupsMatrix[2][1][im] + - cupsMatrix[2][2][iy] + - ik; - - /* - * Density correct combined CMYK... - */ - - if (tc < 0) - r = gx_max_color_value; - else if (tc > gx_max_color_value) - r = gx_max_color_value - cupsDensity[gx_max_color_value]; - else - r = gx_max_color_value - cupsDensity[tc]; - - if (tm < 0) - g = gx_max_color_value; - else if (tm > gx_max_color_value) - g = gx_max_color_value - cupsDensity[gx_max_color_value]; - else - g = gx_max_color_value - cupsDensity[tm]; - - if (ty < 0) - b = gx_max_color_value; - else if (ty > gx_max_color_value) - b = gx_max_color_value - cupsDensity[gx_max_color_value]; - else - b = gx_max_color_value - cupsDensity[ty]; - } - - /* - * Convert the RGB color to a color index... - */ - - switch (cups->header.cupsColorSpace) - { - case CUPS_CSPACE_W : - i = cupsEncodeLUT[(r * 31 + g * 61 + b * 8) / 100]; - break; - - case CUPS_CSPACE_RGB : - ic = cupsEncodeLUT[r]; - im = cupsEncodeLUT[g]; - iy = cupsEncodeLUT[b]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((ic << 1) | im) << 1) | iy; - break; - case 2 : - i = (((ic << 2) | im) << 2) | iy; - break; - case 4 : - i = (((ic << 4) | im) << 4) | iy; - break; - case 8 : - i = (((ic << 8) | im) << 8) | iy; - break; - } - break; - - case CUPS_CSPACE_RGBA : - ic = cupsEncodeLUT[r]; - im = cupsEncodeLUT[g]; - iy = cupsEncodeLUT[b]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((ic << 1) | im) << 1) | iy) << 1) | 0x01; - break; - case 2 : - i = (((((ic << 2) | im) << 2) | iy) << 2) | 0x03; - break; - case 4 : - i = (((((ic << 4) | im) << 4) | iy) << 4) | 0x0f; - break; - case 8 : - i = (((((ic << 8) | im) << 8) | iy) << 8) | 0xff; - break; - } - break; - - default : - i = cupsEncodeLUT[gx_max_color_value - (r * 31 + g * 61 + b * 8) / 100]; - break; - - case CUPS_CSPACE_CMY : - ic = cupsEncodeLUT[gx_max_color_value - r]; - im = cupsEncodeLUT[gx_max_color_value - g]; - iy = cupsEncodeLUT[gx_max_color_value - b]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((ic << 1) | im) << 1) | iy; - break; - case 2 : - i = (((ic << 2) | im) << 2) | iy; - break; - case 4 : - i = (((ic << 4) | im) << 4) | iy; - break; - case 8 : - i = (((ic << 8) | im) << 8) | iy; - break; - } - break; - - case CUPS_CSPACE_YMC : - ic = cupsEncodeLUT[gx_max_color_value - r]; - im = cupsEncodeLUT[gx_max_color_value - g]; - iy = cupsEncodeLUT[gx_max_color_value - b]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((iy << 1) | im) << 1) | ic; - break; - case 2 : - i = (((iy << 2) | im) << 2) | ic; - break; - case 4 : - i = (((iy << 4) | im) << 4) | ic; - break; - case 8 : - i = (((iy << 8) | im) << 8) | ic; - break; - } - break; - - case CUPS_CSPACE_CMYK : - ic = gx_max_color_value - r; - im = gx_max_color_value - g; - iy = gx_max_color_value - b; - ik = min(ic, min(im, iy)); - - if ((mk = max(ic, max(im, iy))) > ik) - ik = (int)((float)ik * (float)ik * (float)ik / - ((float)mk * (float)mk)); - - ic = cupsEncodeLUT[ic - ik]; - im = cupsEncodeLUT[im - ik]; - iy = cupsEncodeLUT[iy - ik]; - ik = cupsEncodeLUT[ik]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((ic << 1) | im) << 1) | iy) << 1) | ik; - break; - case 2 : - i = (((((ic << 2) | im) << 2) | iy) << 2) | ik; - break; - case 4 : - i = (((((ic << 4) | im) << 4) | iy) << 4) | ik; - break; - case 8 : - i = (((((ic << 8) | im) << 8) | iy) << 8) | ik; - break; - } - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: CMY (%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n", - r, g, b, (unsigned)i, ic, im, iy, ik); -# endif /* DEBUG */ - break; - - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - ic = gx_max_color_value - r; - im = gx_max_color_value - g; - iy = gx_max_color_value - b; - ik = min(ic, min(im, iy)); - - if ((mk = max(ic, max(im, iy))) > ik) - ik = (int)((float)ik * (float)ik * (float)ik / - ((float)mk * (float)mk)); - - ic = cupsEncodeLUT[ic - ik]; - im = cupsEncodeLUT[im - ik]; - iy = cupsEncodeLUT[iy - ik]; - ik = cupsEncodeLUT[ik]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((iy << 1) | im) << 1) | ic) << 1) | ik; - break; - case 2 : - i = (((((iy << 2) | im) << 2) | ic) << 2) | ik; - break; - case 4 : - i = (((((iy << 4) | im) << 4) | ic) << 4) | ik; - break; - case 8 : - i = (((((iy << 8) | im) << 8) | ic) << 8) | ik; - break; - } - break; - - case CUPS_CSPACE_KCMYcm : - if (cups->header.cupsBitsPerColor == 1) - { - ic = gx_max_color_value - r; - im = gx_max_color_value - g; - iy = gx_max_color_value - b; - ik = min(ic, min(im, iy)); - - if ((mk = max(ic, max(im, iy))) > ik) - ik = (int)((float)ik * (float)ik * (float)ik / - ((float)mk * (float)mk)); - - ic = cupsEncodeLUT[ic - ik]; - im = cupsEncodeLUT[im - ik]; - iy = cupsEncodeLUT[iy - ik]; - ik = cupsEncodeLUT[ik]; - if (ik) - i = 32; - else if (ic && im) - i = 17; - else if (ic && iy) - i = 6; - else if (im && iy) - i = 12; - else if (ic) - i = 16; - else if (im) - i = 8; - else if (iy) - i = 4; - else - i = 0; - break; - } - - case CUPS_CSPACE_KCMY : - ic = gx_max_color_value - r; - im = gx_max_color_value - g; - iy = gx_max_color_value - b; - ik = min(ic, min(im, iy)); - - if ((mk = max(ic, max(im, iy))) > ik) - ik = (int)((float)ik * (float)ik * (float)ik / - ((float)mk * (float)mk)); - - ic = cupsEncodeLUT[ic - ik]; - im = cupsEncodeLUT[im - ik]; - iy = cupsEncodeLUT[iy - ik]; - ik = cupsEncodeLUT[ik]; - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((((ik << 1) | ic) << 1) | im) << 1) | iy; - break; - case 2 : - i = (((((ik << 2) | ic) << 2) | im) << 2) | iy; - break; - case 4 : - i = (((((ik << 4) | ic) << 4) | im) << 4) | iy; - break; - case 8 : - i = (((((ik << 8) | ic) << 8) | im) << 8) | iy; - break; - } - break; - -# ifdef CUPS_RASTER_HAVE_COLORIMETRIC - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - /* - * Convert sRGB to linear RGB... - */ - - rr = pow((double)r / (double)gx_max_color_value, 0.58823529412); - rg = pow((double)g / (double)gx_max_color_value, 0.58823529412); - rb = pow((double)b / (double)gx_max_color_value, 0.58823529412); - - /* - * Convert to CIE XYZ... - */ - - ciex = 0.412453 * rr + 0.357580 * rg + 0.180423 * rb; - ciey = 0.212671 * rr + 0.715160 * rg + 0.072169 * rb; - ciez = 0.019334 * rr + 0.119193 * rg + 0.950227 * rb; - - if (cups->header.cupsColorSpace == CUPS_CSPACE_CIEXYZ) - { - /* - * Convert to an integer XYZ color value... - */ - - if (ciex > 1.0) - ic = 255; - else if (ciex > 0.0) - ic = (int)(ciex * 255.0); - else - ic = 0; - - if (ciey > 1.0) - im = 255; - else if (ciey > 0.0) - im = (int)(ciey * 255.0); - else - im = 0; - - if (ciez > 1.0) - iy = 255; - else if (ciez > 0.0) - iy = (int)(ciez * 255.0); - else - iy = 0; - } - else - { - /* - * Convert CIE XYZ to Lab... - */ - - ciey_yn = ciey / D65_Y; - - if (ciey_yn > 0.008856) - ciel = 116 * cbrt(ciey_yn) - 16; - else - ciel = 903.3 * ciey_yn; - - ciea = 500 * (cups_map_cielab(ciex, D65_X) - - cups_map_cielab(ciey, D65_Y)); - cieb = 200 * (cups_map_cielab(ciey, D65_Y) - - cups_map_cielab(ciez, D65_Z)); - - /* - * Scale the L value and bias the a and b values by 128 - * so that all values are in the range of 0 to 255. - */ - - ciel *= 2.55; - ciea += 128; - cieb += 128; - - /* - * Convert to 8-bit values... - */ - - if (ciel < 0.0) - ic = 0; - else if (ciel < 255.0) - ic = ciel; - else - ic = 255; - - if (ciea < 0.0) - im = 0; - else if (ciea < 255.0) - im = ciea; - else - im = 255; - - if (cieb < 0.0) - iy = 0; - else if (cieb < 255.0) - iy = cieb; - else - iy = 255; - } - - /* - * Put the final color value together... - */ - - switch (cups->header.cupsBitsPerColor) - { - default : - i = (((ic << 1) | im) << 1) | iy; - break; - case 2 : - i = (((ic << 2) | im) << 2) | iy; - break; - case 4 : - i = (((ic << 4) | im) << 4) | iy; - break; - case 8 : - i = (((ic << 8) | im) << 8) | iy; - break; - } - break; -# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ - } - -# ifdef DEBUG - fprintf(stderr, "DEBUG2: RGB %d,%d,%d = %08x\n", r, g, b, (unsigned)i); -# endif /* DEBUG */ - - return (i); -} -#endif /* dev_t_proc_encode_color */ - - -/* - * 'cups_open()' - Open the output file and initialize things. - */ - -private int /* O - Error status */ -cups_open(gx_device *pdev) /* I - Device info */ -{ - int code; /* Return status */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_open(%p)\n", pdev); -#endif /* DEBUG */ - - cups->printer_procs.get_space_params = cups_get_space_params; - - if (cups->page == 0) - { - fputs("INFO: Processing page 1...\n", stderr); - cups->page = 1; - } - - cups_set_color_info(pdev); - - if ((code = gdev_prn_open(pdev)) != 0) - return (code); - - if (cupsPPD == NULL) - cupsPPD = ppdOpenFile(getenv("PPD")); - - return (0); -} - - -/* - * 'cups_print_pages()' - Send one or more pages to the output file. - */ - -private int /* O - 0 if everything is OK */ -cups_print_pages(gx_device_printer *pdev, - /* I - Device info */ - FILE *fp, /* I - Output file */ - int num_copies) - /* I - Number of copies */ -{ - int copy; /* Copy number */ - int srcbytes; /* Byte width of scanline */ - unsigned char *src, /* Scanline data */ - *dst; /* Bitmap data */ - - - (void)fp; /* reference unused file pointer to prevent compiler warning */ - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_print_pages(%p, %p, %d)\n", pdev, fp, - num_copies); -#endif /* DEBUG */ - - /* - * Figure out the number of bytes per line... - */ - - switch (cups->header.cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerPixel * - cups->header.cupsWidth + 7) / 8; - break; - - case CUPS_ORDER_BANDED : - if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm && - cups->header.cupsBitsPerColor == 1) - cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor * - cups->header.cupsWidth + 7) / 8 * 6; - else - cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor * - cups->header.cupsWidth + 7) / 8 * - cups->color_info.num_components; - break; - - case CUPS_ORDER_PLANAR : - cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor * - cups->header.cupsWidth + 7) / 8; - break; - } - - /* - * Compute the width of a scanline and allocate input/output buffers... - */ - - srcbytes = gdev_prn_raster(pdev); - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cupsBitsPerPixel = %d, cupsWidth = %d, cupsBytesPerLine = %d, srcbytes = %d\n", - cups->header.cupsBitsPerPixel, cups->header.cupsWidth, - cups->header.cupsBytesPerLine, srcbytes); -#endif /* DEBUG */ - - src = (unsigned char *)gs_malloc(srcbytes, 1, "cups_print_pages"); - - if (src == NULL) /* can't allocate input buffer */ - return_error(gs_error_VMerror); - - /* - * Need an output buffer, too... - */ - - dst = (unsigned char *)gs_malloc(cups->header.cupsBytesPerLine, 2, - "cups_print_pages"); - - if (dst == NULL) /* can't allocate working area */ - return_error(gs_error_VMerror); - - /* - * See if the stream has been initialized yet... - */ - - if (cups->stream == NULL) - { - if ((cups->stream = cupsRasterOpen(fileno(cups->file), - CUPS_RASTER_WRITE)) == NULL) - { - perror("ERROR: Unable to open raster stream - "); - gs_exit(0); - } - } - - /* - * Output a page of graphics... - */ - - if (num_copies < 1) - num_copies = 1; - - if (cupsPPD != NULL && !cupsPPD->manual_copies) - { - cups->header.NumCopies = num_copies; - num_copies = 1; - } - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cupsWidth = %d, cupsHeight = %d, cupsBytesPerLine = %d\n", - cups->header.cupsWidth, cups->header.cupsHeight, - cups->header.cupsBytesPerLine); -#endif /* DEBUG */ - - for (copy = num_copies; copy > 0; copy --) - { - cupsRasterWriteHeader(cups->stream, &(cups->header)); - - if (pdev->color_info.num_components == 1) - cups_print_chunked(pdev, src, dst, srcbytes); - else - switch (cups->header.cupsColorOrder) - { - case CUPS_ORDER_CHUNKED : - cups_print_chunked(pdev, src, dst, srcbytes); - break; - case CUPS_ORDER_BANDED : - cups_print_banded(pdev, src, dst, srcbytes); - break; - case CUPS_ORDER_PLANAR : - cups_print_planar(pdev, src, dst, srcbytes); - break; - } - } - - /* - * Free temporary storage and return... - */ - - gs_free((char *)src, srcbytes, 1, "cups_print_pages"); - gs_free((char *)dst, cups->header.cupsBytesPerLine, 1, "cups_print_pages"); - - cups->page ++; - fprintf(stderr, "INFO: Processing page %d...\n", cups->page); - - return (0); -} - - -/* - * 'cups_put_params()' - Set pagedevice parameters. - */ - -private int /* O - Error status */ -cups_put_params(gx_device *pdev, /* I - Device info */ - gs_param_list *plist) /* I - Parameter list */ -{ - int i; /* Looping var */ -#ifdef CUPS_RASTER_SYNCv1 - char name[255]; /* Name of attribute */ -#endif /* CUPS_RASTER_SYNCv1 */ - float margins[4]; /* Physical margins of print */ - ppd_size_t *size; /* Page size */ - int code; /* Error code */ - int intval; /* Integer value */ - bool boolval; /* Boolean value */ - float floatval; /* Floating point value */ - gs_param_string stringval; /* String value */ - gs_param_float_array arrayval; /* Float array value */ - int size_set; /* Was the size set? */ - int color_set; /* Were the color attrs set? */ - gdev_prn_space_params sp; /* Space parameter data */ - int width, /* New width of page */ - height; /* New height of page */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_put_params(%p, %p)\n", pdev, plist); -#endif /* DEBUG */ - - /* - * Process other options for CUPS... - */ - -#define stringoption(name, sname) \ - if ((code = param_read_string(plist, sname, &stringval)) < 0) \ - { \ - param_signal_error(plist, sname, code); \ - return (code); \ - } \ - else if (code == 0) \ - { \ - strncpy(cups->header.name, (const char *)stringval.data, \ - stringval.size); \ - cups->header.name[stringval.size] = '\0'; \ - } - -#define intoption(name, sname, type) \ - if ((code = param_read_int(plist, sname, &intval)) < 0) \ - { \ - param_signal_error(plist, sname, code); \ - return (code); \ - } \ - else if (code == 0) \ - { \ - fprintf(stderr, "DEBUG: Setting %s to %d...\n", sname, intval); \ - cups->header.name = (type)intval; \ - } - -#define floatoption(name, sname) \ - if ((code = param_read_float(plist, sname, &floatval)) < 0) \ - { \ - param_signal_error(plist, sname, code); \ - return (code); \ - } \ - else if (code == 0) \ - cups->header.name = (unsigned)floatval; - -#define booloption(name, sname) \ - if ((code = param_read_bool(plist, sname, &boolval)) < 0) \ - { \ - if ((code = param_read_null(plist, sname)) < 0) \ - { \ - param_signal_error(plist, sname, code); \ - return (code); \ - } \ - if (code == 0) \ - cups->header.name = CUPS_FALSE; \ - } \ - else if (code == 0) \ - cups->header.name = (cups_bool_t)boolval; - -#define arrayoption(name, sname, count) \ - if ((code = param_read_float_array(plist, sname, &arrayval)) < 0) \ - { \ - if ((code = param_read_null(plist, sname)) < 0) \ - { \ - param_signal_error(plist, sname, code); \ - return (code); \ - } \ - if (code == 0) \ - for (i = 0; i < count; i ++) \ - cups->header.name[i] = 0; \ - } \ - else if (code == 0) \ - { \ - for (i = 0; i < count; i ++) \ - cups->header.name[i] = (unsigned)arrayval.data[i]; \ - } - - size_set = param_read_float_array(plist, ".MediaSize", &arrayval) == 0 || - param_read_float_array(plist, "PageSize", &arrayval) == 0; - color_set = param_read_int(plist, "cupsColorSpace", &intval) == 0 || - param_read_int(plist, "cupsBitsPerColor", &intval) == 0; - - stringoption(MediaClass, "MediaClass") - stringoption(MediaColor, "MediaColor") - stringoption(MediaType, "MediaType") - stringoption(OutputType, "OutputType") - floatoption(AdvanceDistance, "AdvanceDistance") - intoption(AdvanceMedia, "AdvanceMedia", cups_adv_t) - booloption(Collate, "Collate") - intoption(CutMedia, "CutMedia", cups_cut_t) - booloption(Duplex, "Duplex") - arrayoption(ImagingBoundingBox, "ImagingBoundingBox", 4) - booloption(InsertSheet, "InsertSheet") - intoption(Jog, "Jog", cups_jog_t) - intoption(LeadingEdge, "LeadingEdge", cups_edge_t) - arrayoption(Margins, "Margins", 2) - booloption(ManualFeed, "ManualFeed") - intoption(MediaPosition, "cupsMediaPosition", unsigned) /* Compatibility */ - intoption(MediaPosition, "MediaPosition", unsigned) - floatoption(MediaWeight, "MediaWeight") - booloption(MirrorPrint, "MirrorPrint") - booloption(NegativePrint, "NegativePrint") - intoption(Orientation, "Orientation", cups_orient_t) - booloption(OutputFaceUp, "OutputFaceUp") - booloption(Separations, "Separations") - booloption(TraySwitch, "TraySwitch") - booloption(Tumble, "Tumble") - intoption(cupsMediaType, "cupsMediaType", unsigned) - intoption(cupsBitsPerColor, "cupsBitsPerColor", unsigned) - intoption(cupsColorOrder, "cupsColorOrder", cups_order_t) - intoption(cupsColorSpace, "cupsColorSpace", cups_cspace_t) - intoption(cupsCompression, "cupsCompression", unsigned) - intoption(cupsRowCount, "cupsRowCount", unsigned) - intoption(cupsRowFeed, "cupsRowFeed", unsigned) - intoption(cupsRowStep, "cupsRowStep", unsigned) - -#ifdef CUPS_RASTER_SYNCv1 - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsInteger%d", i); - intoption(cupsInteger[i], name, unsigned) - } - - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsReal%d", i); - floatoption(cupsReal[i], name) - } - - for (i = 0; i < 16; i ++) - { - sprintf(name, "cupsString%d", i); - stringoption(cupsString[i], name) - } - - stringoption(cupsMarkerType, "cupsMarkerType"); - stringoption(cupsRenderingIntent, "cupsRenderingIntent"); -#endif /* CUPS_RASTER_SYNCv1 */ - - if ((code = param_read_string(plist, "cupsProfile", &stringval)) < 0) - { - param_signal_error(plist, "cupsProfile", code); - return (code); - } - else if (code == 0) - { - if (cupsProfile != NULL) - free(cupsProfile); - - cupsProfile = strdup(stringval.data); - } - - cups_set_color_info(pdev); - - /* - * Then process standard page device options... - */ - - if ((code = gdev_prn_put_params(pdev, plist)) < 0) - return (code); - - /* - * Update margins/sizes as needed... - */ - - if (size_set) - { - /* - * Compute the page margins... - */ - - fprintf(stderr, "DEBUG: Updating PageSize to [%.0f %.0f]...\n", - cups->MediaSize[0], cups->MediaSize[1]); - - memset(margins, 0, sizeof(margins)); - - cups->landscape = 0; - - if (cupsPPD != NULL) - { - /* - * Find the matching page size... - */ - - for (i = cupsPPD->num_sizes, size = cupsPPD->sizes; - i > 0; - i --, size ++) - if (fabs(cups->MediaSize[1] - size->length) < 5.0 && - fabs(cups->MediaSize[0] - size->width) < 5.0) - break; - - if (i > 0) - { - /* - * Standard size... - */ - - fprintf(stderr, "DEBUG: size = %s\n", size->name); - - gx_device_set_media_size(pdev, size->width, size->length); - - margins[0] = size->left / 72.0; - margins[1] = size->bottom / 72.0; - margins[2] = (size->width - size->right) / 72.0; - margins[3] = (size->length - size->top) / 72.0; - } - else - { - /* - * No matching portrait size; look for a matching size in - * landscape orientation... - */ - - for (i = cupsPPD->num_sizes, size = cupsPPD->sizes; - i > 0; - i --, size ++) - if (fabs(cups->MediaSize[0] - size->length) < 5.0 && - fabs(cups->MediaSize[1] - size->width) < 5.0) - break; - - if (i > 0) - { - /* - * Standard size in landscape orientation... - */ - - fprintf(stderr, "DEBUG: landscape size = %s\n", size->name); - - gx_device_set_media_size(pdev, size->length, size->width); - - cups->landscape = 1; - - margins[0] = size->left / 72.0; - margins[1] = size->bottom / 72.0; - margins[2] = (size->width - size->right) / 72.0; - margins[3] = (size->length - size->top) / 72.0; - } - else - { - /* - * Custom size... - */ - - fputs("DEBUG: size = Custom\n", stderr); - - for (i = 0; i < 4; i ++) - margins[i] = cupsPPD->custom_margins[i] / 72.0; - } - } - - fprintf(stderr, "DEBUG: margins[] = [ %f %f %f %f ]\n", - margins[0], margins[1], margins[2], margins[3]); - } - - /* - * Set the margins to update the bitmap size... - */ - - gx_device_set_margins(pdev, margins, false); - } - - /* - * Set CUPS raster header values... - */ - - cups->header.HWResolution[0] = pdev->HWResolution[0]; - cups->header.HWResolution[1] = pdev->HWResolution[1]; - - cups->header.Margins[0] = pdev->HWMargins[0]; - cups->header.Margins[1] = pdev->HWMargins[1]; - - cups->header.PageSize[0] = pdev->MediaSize[0]; - cups->header.PageSize[1] = pdev->MediaSize[1]; - - cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0]; - cups->header.ImagingBoundingBox[1] = pdev->HWMargins[3]; - cups->header.ImagingBoundingBox[2] = pdev->MediaSize[0] - pdev->HWMargins[2]; - cups->header.ImagingBoundingBox[3] = pdev->MediaSize[1] - pdev->HWMargins[1]; - - /* - * Reallocate memory if the size or color depth was changed... - */ - - if (color_set || size_set) - { - /* - * Make sure the page image is the correct size - current Ghostscript - * does not keep track of the margins in the bitmap size... - */ - - if (cups->landscape) - { - width = (pdev->MediaSize[1] - pdev->HWMargins[0] - pdev->HWMargins[2]) * - pdev->HWResolution[0] / 72.0f + 0.499f; - height = (pdev->MediaSize[0] - pdev->HWMargins[1] - pdev->HWMargins[3]) * - pdev->HWResolution[1] / 72.0f + 0.499f; - } - else - { - width = (pdev->MediaSize[0] - pdev->HWMargins[0] - pdev->HWMargins[2]) * - pdev->HWResolution[0] / 72.0f + 0.499f; - height = (pdev->MediaSize[1] - pdev->HWMargins[1] - pdev->HWMargins[3]) * - pdev->HWResolution[1] / 72.0f + 0.499f; - } - - /* - * Don't reallocate memory unless the device has been opened... - */ - - if (pdev->is_open) - { - /* - * Device is open, so reallocate... - */ - - fprintf(stderr, "DEBUG: Reallocating memory, [%.0f %.0f] = %dx%d pixels...\n", - pdev->MediaSize[0], pdev->MediaSize[1], width, height); - - sp = ((gx_device_printer *)pdev)->space_params; - - if ((code = gdev_prn_reallocate_memory(pdev, &sp, width, height)) < 0) - return (code); - } - else - { - /* - * Device isn't yet open, so just save the new width and height... - */ - - fprintf(stderr, "DEBUG: Setting initial media size, [%.0f %.0f] = %dx%d pixels...\n", - pdev->MediaSize[0], pdev->MediaSize[1], width, height); - - pdev->width = width; - pdev->height = height; - } - } - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: ppd = %p\n", cupsPPD); - fprintf(stderr, "DEBUG2: PageSize = [ %.3f %.3f ]\n", - pdev->MediaSize[0], pdev->MediaSize[1]); - fprintf(stderr, "DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n", - margins[0], margins[1], margins[2], margins[3]); - fprintf(stderr, "DEBUG2: HWResolution = [ %.3f %.3f ]\n", - pdev->HWResolution[0], pdev->HWResolution[1]); - fprintf(stderr, "DEBUG2: width = %d, height = %d\n", - pdev->width, pdev->height); - fprintf(stderr, "DEBUG2: HWMargins = [ %.3f %.3f %.3f %.3f ]\n", - pdev->HWMargins[0], pdev->HWMargins[1], - pdev->HWMargins[2], pdev->HWMargins[3]); -#endif /* DEBUG */ - - return (0); -} - - -/* - * 'cups_set_color_info()' - Set the color information structure based on - * the required output. - */ - -private void -cups_set_color_info(gx_device *pdev) /* I - Device info */ -{ - int i, j, k; /* Looping vars */ - int max_lut; /* Maximum LUT value */ - float d, g; /* Density and gamma correction */ - float m[3][3]; /* Color correction matrix */ - char resolution[41]; /* Resolution string */ - ppd_profile_t *profile; /* Color profile information */ - - -#ifdef DEBUG - fprintf(stderr, "DEBUG2: cups_set_color_info(%p)\n", pdev); -#endif /* DEBUG */ - - switch (cups->header.cupsColorSpace) - { - default : - case CUPS_CSPACE_W : - case CUPS_CSPACE_K : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor; - cups->color_info.depth = cups->header.cupsBitsPerPixel; - cups->color_info.num_components = 1; - break; - - case CUPS_CSPACE_CMY : - case CUPS_CSPACE_YMC : - case CUPS_CSPACE_RGB : - if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED) - cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor; - else if (cups->header.cupsBitsPerColor < 8) - cups->header.cupsBitsPerPixel = 4 * cups->header.cupsBitsPerColor; - else - cups->header.cupsBitsPerPixel = 3 * cups->header.cupsBitsPerColor; - - if (cups->header.cupsBitsPerColor < 8) - cups->color_info.depth = 4 * cups->header.cupsBitsPerColor; - else - cups->color_info.depth = 3 * cups->header.cupsBitsPerColor; - - cups->color_info.num_components = 3; - break; - - case CUPS_CSPACE_KCMYcm : - if (cups->header.cupsBitsPerColor == 1) - { - cups->header.cupsBitsPerPixel = 8; - cups->color_info.depth = 8; - cups->color_info.num_components = 4; - break; - } - - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED) - cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor; - else - cups->header.cupsBitsPerPixel = 4 * cups->header.cupsBitsPerColor; - - cups->color_info.depth = 4 * cups->header.cupsBitsPerColor; - cups->color_info.num_components = 4; - break; - -#ifdef CUPS_RASTER_HAVE_COLORIMETRIC - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : - /* - * Colorimetric color spaces currently are implemented as 24-bit - * mapping to XYZ or Lab, which are then converted as needed to - * the final representation... - * - * This code enforces a minimum output depth of 8 bits per - * component... - */ - - if (cups->header.cupsBitsPerColor < 8) - cups->header.cupsBitsPerColor = 8; - - if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED) - cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor; - else - cups->header.cupsBitsPerPixel = 3 * cups->header.cupsBitsPerColor; - - cups->color_info.depth = 24; - cups->color_info.num_components = 3; - break; -#endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ - } - -#ifdef dev_t_proc_encode_color - switch (cups->header.cupsColorSpace) - { - default : - cups->color_info.gray_index = GX_CINFO_COMP_NO_INDEX; - break; - - case CUPS_CSPACE_W : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_K : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - case CUPS_CSPACE_KCMYcm : - case CUPS_CSPACE_KCMY : - cups->color_info.gray_index = 0; - break; - - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - cups->color_info.gray_index = 3; - break; - } - - switch (cups->header.cupsColorSpace) - { - default : - case CUPS_CSPACE_W : - case CUPS_CSPACE_WHITE : - case CUPS_CSPACE_RGB : -# ifdef CUPS_RASTER_HAVE_COLORIMETRIC - case CUPS_CSPACE_CIEXYZ : - case CUPS_CSPACE_CIELab : - case CUPS_CSPACE_ICC1 : - case CUPS_CSPACE_ICC2 : - case CUPS_CSPACE_ICC3 : - case CUPS_CSPACE_ICC4 : - case CUPS_CSPACE_ICC5 : - case CUPS_CSPACE_ICC6 : - case CUPS_CSPACE_ICC7 : - case CUPS_CSPACE_ICC8 : - case CUPS_CSPACE_ICC9 : - case CUPS_CSPACE_ICCA : - case CUPS_CSPACE_ICCB : - case CUPS_CSPACE_ICCC : - case CUPS_CSPACE_ICCD : - case CUPS_CSPACE_ICCE : - case CUPS_CSPACE_ICCF : -# endif /* CUPS_RASTER_HAVE_COLORIMETRIC */ - cups->color_info.polarity = GX_CINFO_POLARITY_ADDITIVE; - break; - - case CUPS_CSPACE_K : - case CUPS_CSPACE_GOLD : - case CUPS_CSPACE_SILVER : - case CUPS_CSPACE_CMY : - case CUPS_CSPACE_YMC : - case CUPS_CSPACE_KCMYcm : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - cups->color_info.polarity = GX_CINFO_POLARITY_SUBTRACTIVE; - break; - } - - cups->color_info.separable_and_linear = GX_CINFO_SEP_LIN_NONE; -#endif /* dev_t_proc_encode_color */ - - if ((i = cups->header.cupsBitsPerColor) > 8) - i = 8; - - max_lut = (1 << i) - 1; - - switch (cups->color_info.num_components) - { - default : - case 1 : - cups->color_info.max_gray = max_lut; - cups->color_info.max_color = 0; - cups->color_info.dither_grays = max_lut + 1; - cups->color_info.dither_colors = 0; - break; - - case 3 : - cups->color_info.max_gray = 0; - cups->color_info.max_color = max_lut; - cups->color_info.dither_grays = 0; - cups->color_info.dither_colors = max_lut + 1; - break; - - case 4 : - cups->color_info.max_gray = max_lut; - cups->color_info.max_color = max_lut; - cups->color_info.dither_grays = max_lut + 1; - cups->color_info.dither_colors = max_lut + 1; - break; - } - - /* - * Enable/disable CMYK color support... - */ - -#ifdef dev_t_proc_encode_color - cups->color_info.max_components = cups->color_info.num_components; -#endif /* dev_t_proc_encode_color */ - - /* - * Tell Ghostscript to forget any colors it has cached... - */ - - gx_device_decache_colors(pdev); - - /* - * Compute the lookup tables... - */ - - for (i = 0; i <= gx_max_color_value; i ++) - { - cupsEncodeLUT[i] = (max_lut * i + gx_max_color_value / 2) / - gx_max_color_value; - -#ifdef DEBUG - if (i == 0 || cupsEncodeLUT[i] != cupsEncodeLUT[i - 1]) - fprintf(stderr, "DEBUG2: cupsEncodeLUT[%d] = %d\n", i, cupsEncodeLUT[i]); -#endif /* DEBUG */ - } - - for (i = 0; i < cups->color_info.dither_grays; i ++) - cupsDecodeLUT[i] = gx_max_color_value * i / max_lut; - - fprintf(stderr, "DEBUG: num_components = %d, depth = %d\n", - cups->color_info.num_components, cups->color_info.depth); - fprintf(stderr, "DEBUG: cupsColorSpace = %d, cupsColorOrder = %d\n", - cups->header.cupsColorSpace, cups->header.cupsColorOrder); - fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d, cupsBitsPerColor = %d\n", - cups->header.cupsBitsPerPixel, cups->header.cupsBitsPerColor); - fprintf(stderr, "DEBUG: max_gray = %d, dither_grays = %d\n", - cups->color_info.max_gray, cups->color_info.dither_grays); - fprintf(stderr, "DEBUG: max_color = %d, dither_colors = %d\n", - cups->color_info.max_color, cups->color_info.dither_colors); - - /* - * Set the color profile as needed... - */ - - cupsHaveProfile = 0; - -#ifdef dev_t_proc_encode_color - if (cupsProfile) -#else - if (cupsProfile && cups->header.cupsBitsPerColor == 8) -#endif /* dev_t_proc_encode_color */ - { - fprintf(stderr, "DEBUG: Using user-defined profile \"%s\"...\n", cupsProfile); - - if (sscanf(cupsProfile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", &d, &g, - m[0] + 0, m[0] + 1, m[0] + 2, - m[1] + 0, m[1] + 1, m[1] + 2, - m[2] + 0, m[2] + 1, m[2] + 2) != 11) - fputs("DEBUG: User-defined profile does not contain 11 integers!\n", stderr); - else - { - cupsHaveProfile = 1; - - d *= 0.001f; - g *= 0.001f; - m[0][0] *= 0.001f; - m[0][1] *= 0.001f; - m[0][2] *= 0.001f; - m[1][0] *= 0.001f; - m[1][1] *= 0.001f; - m[1][2] *= 0.001f; - m[2][0] *= 0.001f; - m[2][1] *= 0.001f; - m[2][2] *= 0.001f; - } - } -#ifdef dev_t_proc_encode_color - else if (cupsPPD) -#else - else if (cupsPPD && cups->header.cupsBitsPerColor == 8) -#endif /* dev_t_proc_encode_color */ - { - /* - * Find the appropriate color profile... - */ - - if (pdev->HWResolution[0] != pdev->HWResolution[1]) - sprintf(resolution, "%.0fx%.0fdpi", pdev->HWResolution[0], - pdev->HWResolution[1]); - else - sprintf(resolution, "%.0fdpi", pdev->HWResolution[0]); - - for (i = 0, profile = cupsPPD->profiles; - i < cupsPPD->num_profiles; - i ++, profile ++) - if ((strcmp(profile->resolution, resolution) == 0 || - profile->resolution[0] == '-') && - (strcmp(profile->media_type, cups->header.MediaType) == 0 || - profile->media_type[0] == '-')) - break; - - /* - * If we found a color profile, use it! - */ - - if (i < cupsPPD->num_profiles) - { - fputs("DEBUG: Using color profile in PPD file!\n", stderr); - - cupsHaveProfile = 1; - - d = profile->density; - g = profile->gamma; - - memcpy(m, profile->matrix, sizeof(m)); - } - } - - if (cupsHaveProfile) - { - for (i = 0; i < 3; i ++) - for (j = 0; j < 3; j ++) - for (k = 0; k <= CUPS_MAX_VALUE; k ++) - { - cupsMatrix[i][j][k] = (int)((float)k * m[i][j] + 0.5); - -#ifdef DEBUG - if ((k & 4095) == 0) - fprintf(stderr, "DEBUG2: cupsMatrix[%d][%d][%d] = %d\n", - i, j, k, cupsMatrix[i][j][k]); -#endif /* DEBUG */ - } - - - for (k = 0; k <= CUPS_MAX_VALUE; k ++) - { - cupsDensity[k] = (int)((float)CUPS_MAX_VALUE * d * - pow((float)k / (float)CUPS_MAX_VALUE, g) + - 0.5); - -#ifdef DEBUG - if ((k & 4095) == 0) - fprintf(stderr, "DEBUG2: cupsDensity[%d] = %d\n", k, cupsDensity[k]); -#endif /* DEBUG */ - } - } - else - { - for (k = 0; k <= CUPS_MAX_VALUE; k ++) - cupsDensity[k] = k; - } -} - - -/* - * 'cups_sync_output()' - Keep the user informed of our status... - */ - -private int /* O - Error status */ -cups_sync_output(gx_device *pdev) /* I - Device info */ -{ - fprintf(stderr, "INFO: Processing page %d...\n", cups->page); - - return (0); -} - - -/* - * 'cups_print_chunked()' - Print a page of chunked pixels. - */ - -static void -cups_print_chunked(gx_device_printer *pdev, - /* I - Printer device */ - unsigned char *src, - /* I - Scanline buffer */ - unsigned char *dst, - /* I - Bitmap buffer */ - int srcbytes) - /* I - Number of bytes in src */ -{ - int y; /* Looping var */ - unsigned char *srcptr, /* Pointer to data */ - *dstptr; /* Pointer to bits */ - int count; /* Count for loop */ - int flip; /* Flip scanline? */ - - - if (cups->header.Duplex && !cups->header.Tumble && - cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1)) - flip = 1; - else - flip = 0; - - fprintf(stderr, "DEBUG: cups_print_chunked - flip = %d, height = %d\n", - flip, cups->height); - - /* - * Loop through the page bitmap and write chunked pixels, reversing as - * needed... - */ - - for (y = 0; y < cups->height; y ++) - { - /* - * Grab the scanline data... - */ - - if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0) - { - fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y); - gs_exit(1); - } - - if (flip) - { - /* - * Flip the raster data before writing it... - */ - - if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0) - memset(dst, 0, cups->header.cupsBytesPerLine); - else - { - dstptr = dst; - count = srcbytes; - - switch (cups->color_info.depth) - { - case 1 : /* B&W bitmap */ - for (srcptr += srcbytes - 1; - count > 0; - count --, srcptr --, dstptr ++) - { - *dstptr = cupsRevUpper1[*srcptr & 15] | - cupsRevLower1[*srcptr >> 4]; - } - break; - - case 2 : /* 2-bit grayscale */ - for (srcptr += srcbytes - 1; - count > 0; - count --, srcptr --, dstptr ++) - { - *dstptr = cupsRevUpper2[*srcptr & 15] | - cupsRevLower2[*srcptr >> 4]; - } - break; - - case 4 : /* 4-bit grayscale, or RGB, CMY, or CMYK bitmap */ - for (srcptr += srcbytes - 1; - count > 0; - count --, srcptr --, dstptr ++) - *dstptr = (*srcptr >> 4) | (*srcptr << 4); - break; - - case 8 : /* 8-bit grayscale, or 2-bit RGB, CMY, or CMYK image */ - for (srcptr += srcbytes - 1; - count > 0; - count --, srcptr --, dstptr ++) - *dstptr = *srcptr; - break; - - case 16 : /* 4-bit RGB, CMY or CMYK image */ - for (srcptr += srcbytes - 2; - count > 0; - count -= 2, srcptr -= 2, dstptr += 2) - { - dstptr[0] = srcptr[0]; - dstptr[1] = srcptr[1]; - } - break; - - case 24 : /* 8-bit RGB or CMY image */ - for (srcptr += srcbytes - 3; - count > 0; - count -= 3, srcptr -= 3, dstptr += 3) - { - dstptr[0] = srcptr[0]; - dstptr[1] = srcptr[1]; - dstptr[2] = srcptr[2]; - } - break; - - case 32 : /* 4-bit RGB, CMY or CMYK bitmap */ - for (srcptr += srcbytes - 4; - count > 0; - count -= 4, srcptr -= 4, dstptr += 4) - { - dstptr[0] = srcptr[0]; - dstptr[1] = srcptr[1]; - dstptr[2] = srcptr[2]; - dstptr[3] = srcptr[3]; - } - break; - } - } - - /* - * Write the bitmap data to the raster stream... - */ - - cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine); - } - else - { - /* - * Write the scanline data to the raster stream... - */ - - cupsRasterWritePixels(cups->stream, srcptr, cups->header.cupsBytesPerLine); - } - } -} - - -/* - * 'cups_print_banded()' - Print a page of banded pixels. - */ - -static void -cups_print_banded(gx_device_printer *pdev, - /* I - Printer device */ - unsigned char *src, - /* I - Scanline buffer */ - unsigned char *dst, - /* I - Bitmap buffer */ - int srcbytes) - /* I - Number of bytes in src */ -{ - int x; /* Looping var */ - int y; /* Looping var */ - int bandbytes; /* Bytes per band */ - unsigned char bit; /* Current bit */ - unsigned char temp; /* Temporary variable */ - unsigned char *srcptr; /* Pointer to data */ - unsigned char *cptr, *mptr, *yptr, /* Pointer to components */ - *kptr, *lcptr, *lmptr; /* ... */ - int flip; /* Flip scanline? */ - - - if (cups->header.Duplex && !cups->header.Tumble && - cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1)) - flip = 1; - else - flip = 0; - - fprintf(stderr, "DEBUG: cups_print_banded - flip = %d, height = %d\n", - flip, cups->height); - - /* - * Loop through the page bitmap and write banded pixels... We have - * to separate each chunked color as needed... - */ - - bandbytes = (cups->header.cupsWidth * cups->header.cupsBitsPerColor + 7) / 8; - - for (y = 0; y < cups->height; y ++) - { - /* - * Grab the scanline data... - */ - - if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0) - { - fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y); - gs_exit(1); - } - - /* - * Separate the chunked colors into their components... - */ - - if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0) - memset(dst, 0, cups->header.cupsBytesPerLine); - else - { - if (flip) - cptr = dst + bandbytes - 1; - else - cptr = dst; - - mptr = cptr + bandbytes; - yptr = mptr + bandbytes; - kptr = yptr + bandbytes; - lcptr = yptr + bandbytes; - lmptr = lcptr + bandbytes; - - switch (cups->header.cupsBitsPerColor) - { - default : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - for (x = cups->width, bit = flip ? 1 << (x & 7) : 128; - x > 0; - x --, srcptr ++) - { - if (*srcptr & 0x40) - *cptr |= bit; - if (*srcptr & 0x20) - *mptr |= bit; - if (*srcptr & 0x10) - *yptr |= bit; - - if (flip) - { - if (bit < 128) - bit <<= 1; - else - { - cptr --; - mptr --; - yptr --; - bit = 1; - } - } - else - bit >>= 1; - - x --; - if (x == 0) - break; - - if (*srcptr & 0x4) - *cptr |= bit; - if (*srcptr & 0x2) - *mptr |= bit; - if (*srcptr & 0x1) - *yptr |= bit; - - if (flip) - { - if (bit < 128) - bit <<= 1; - else - { - cptr --; - mptr --; - yptr --; - bit = 1; - } - } - else if (bit > 1) - bit >>= 1; - else - { - cptr ++; - mptr ++; - yptr ++; - bit = 128; - } - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - for (x = cups->width, bit = flip ? 1 << (x & 7) : 128; - x > 0; - x --, srcptr ++) - { - if (*srcptr & 0x80) - *cptr |= bit; - if (*srcptr & 0x40) - *mptr |= bit; - if (*srcptr & 0x20) - *yptr |= bit; - if (*srcptr & 0x10) - *kptr |= bit; - - if (flip) - { - if (bit < 128) - bit <<= 1; - else - { - cptr --; - mptr --; - yptr --; - kptr --; - bit = 1; - } - } - else - bit >>= 1; - - x --; - if (x == 0) - break; - - if (*srcptr & 0x8) - *cptr |= bit; - if (*srcptr & 0x4) - *mptr |= bit; - if (*srcptr & 0x2) - *yptr |= bit; - if (*srcptr & 0x1) - *kptr |= bit; - - if (flip) - { - if (bit < 128) - bit <<= 1; - else - { - cptr --; - mptr --; - yptr --; - kptr --; - bit = 1; - } - } - else if (bit > 1) - bit >>= 1; - else - { - cptr ++; - mptr ++; - yptr ++; - kptr ++; - bit = 128; - } - } - break; - case CUPS_CSPACE_KCMYcm : - for (x = cups->width, bit = flip ? 1 << (x & 7) : 128; - x > 0; - x --, srcptr ++) - { - /* - * Note: Because of the way the pointers are setup, - * the following code is correct even though - * the names don't match... - */ - - if (*srcptr & 0x20) - *cptr |= bit; - if (*srcptr & 0x10) - *mptr |= bit; - if (*srcptr & 0x08) - *yptr |= bit; - if (*srcptr & 0x04) - *kptr |= bit; - if (*srcptr & 0x02) - *lcptr |= bit; - if (*srcptr & 0x01) - *lmptr |= bit; - - if (flip) - { - if (bit < 128) - bit <<= 1; - else - { - cptr --; - mptr --; - yptr --; - kptr --; - lcptr --; - lmptr --; - bit = 1; - } - } - else if (bit > 1) - bit >>= 1; - else - { - cptr ++; - mptr ++; - yptr ++; - kptr ++; - lcptr ++; - lmptr ++; - bit = 128; - } - } - break; - } - break; - - case 2 : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - for (x = cups->width, bit = flip ? 3 << (2 * (x & 3)) : 0xc0; - x > 0; - x --, srcptr ++) - switch (bit) - { - case 0xc0 : - if ((temp = *srcptr & 0x30) != 0) - *cptr |= temp << 2; - if ((temp = *srcptr & 0x0c) != 0) - *mptr |= temp << 4; - if ((temp = *srcptr & 0x03) != 0) - *yptr |= temp << 6; - - if (flip) - { - bit = 0x03; - cptr --; - mptr --; - yptr --; - } - else - bit = 0x30; - break; - case 0x30 : - if ((temp = *srcptr & 0x30) != 0) - *cptr |= temp; - if ((temp = *srcptr & 0x0c) != 0) - *mptr |= temp << 2; - if ((temp = *srcptr & 0x03) != 0) - *yptr |= temp << 4; - - if (flip) - bit = 0xc0; - else - bit = 0x0c; - break; - case 0x0c : - if ((temp = *srcptr & 0x30) != 0) - *cptr |= temp >> 2; - if ((temp = *srcptr & 0x0c) != 0) - *mptr |= temp; - if ((temp = *srcptr & 0x03) != 0) - *yptr |= temp << 2; - - if (flip) - bit = 0x30; - else - bit = 0x03; - break; - case 0x03 : - if ((temp = *srcptr & 0x30) != 0) - *cptr |= temp >> 4; - if ((temp = *srcptr & 0x0c) != 0) - *mptr |= temp >> 2; - if ((temp = *srcptr & 0x03) != 0) - *yptr |= temp; - - if (flip) - bit = 0x0c; - else - { - bit = 0xc0; - cptr ++; - mptr ++; - yptr ++; - } - break; - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - for (x = cups->width, bit = flip ? 3 << (2 * (x & 3)) : 0xc0; - x > 0; - x --, srcptr ++) - switch (bit) - { - case 0xc0 : - if ((temp = *srcptr & 0xc0) != 0) - *cptr |= temp; - if ((temp = *srcptr & 0x30) != 0) - *mptr |= temp << 2; - if ((temp = *srcptr & 0x0c) != 0) - *yptr |= temp << 4; - if ((temp = *srcptr & 0x03) != 0) - *kptr |= temp << 6; - - if (flip) - { - bit = 0x03; - cptr --; - mptr --; - yptr --; - kptr --; - } - else - bit = 0x30; - break; - case 0x30 : - if ((temp = *srcptr & 0xc0) != 0) - *cptr |= temp >> 2; - if ((temp = *srcptr & 0x30) != 0) - *mptr |= temp; - if ((temp = *srcptr & 0x0c) != 0) - *yptr |= temp << 2; - if ((temp = *srcptr & 0x03) != 0) - *kptr |= temp << 4; - - if (flip) - bit = 0xc0; - else - bit = 0x0c; - break; - case 0x0c : - if ((temp = *srcptr & 0xc0) != 0) - *cptr |= temp >> 4; - if ((temp = *srcptr & 0x30) != 0) - *mptr |= temp >> 2; - if ((temp = *srcptr & 0x0c) != 0) - *yptr |= temp; - if ((temp = *srcptr & 0x03) != 0) - *kptr |= temp << 2; - - if (flip) - bit = 0x30; - else - bit = 0x03; - break; - case 0x03 : - if ((temp = *srcptr & 0xc0) != 0) - *cptr |= temp >> 6; - if ((temp = *srcptr & 0x30) != 0) - *mptr |= temp >> 4; - if ((temp = *srcptr & 0x0c) != 0) - *yptr |= temp >> 2; - if ((temp = *srcptr & 0x03) != 0) - *kptr |= temp; - - if (flip) - bit = 0x0c; - else - { - bit = 0xc0; - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - break; - } - break; - } - break; - - case 4 : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - for (x = cups->width, bit = flip && (x & 1) ? 0xf0 : 0x0f; - x > 0; - x --, srcptr += 2) - switch (bit) - { - case 0xf0 : - if ((temp = srcptr[0] & 0x0f) != 0) - *cptr |= temp << 4; - if ((temp = srcptr[1] & 0xf0) != 0) - *mptr |= temp; - if ((temp = srcptr[1] & 0x0f) != 0) - *yptr |= temp << 4; - - bit = 0x0f; - - if (flip) - { - cptr --; - mptr --; - yptr --; - } - break; - case 0x0f : - if ((temp = srcptr[0] & 0x0f) != 0) - *cptr |= temp; - if ((temp = srcptr[1] & 0xf0) != 0) - *mptr |= temp >> 4; - if ((temp = srcptr[1] & 0x0f) != 0) - *yptr |= temp; - - bit = 0xf0; - - if (!flip) - { - cptr ++; - mptr ++; - yptr ++; - } - break; - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - for (x = cups->width, bit = flip && (x & 1) ? 0xf0 : 0x0f; - x > 0; - x --, srcptr += 2) - switch (bit) - { - case 0xf0 : - if ((temp = srcptr[0] & 0xf0) != 0) - *cptr |= temp; - if ((temp = srcptr[0] & 0x0f) != 0) - *mptr |= temp << 4; - if ((temp = srcptr[1] & 0xf0) != 0) - *yptr |= temp; - if ((temp = srcptr[1] & 0x0f) != 0) - *kptr |= temp << 4; - - bit = 0x0f; - - if (flip) - { - cptr --; - mptr --; - yptr --; - kptr --; - } - break; - case 0x0f : - if ((temp = srcptr[0] & 0xf0) != 0) - *cptr |= temp >> 4; - if ((temp = srcptr[0] & 0x0f) != 0) - *mptr |= temp; - if ((temp = srcptr[1] & 0xf0) != 0) - *yptr |= temp >> 4; - if ((temp = srcptr[1] & 0x0f) != 0) - *kptr |= temp; - - bit = 0xf0; - - if (!flip) - { - cptr ++; - mptr ++; - yptr ++; - kptr ++; - } - break; - } - break; - } - break; - - case 8 : - switch (cups->header.cupsColorSpace) - { - default : - if (flip) - for (x = cups->width; x > 0; x --) - { - *cptr-- = *srcptr++; - *mptr-- = *srcptr++; - *yptr-- = *srcptr++; - } - else - for (x = cups->width; x > 0; x --) - { - *cptr++ = *srcptr++; - *mptr++ = *srcptr++; - *yptr++ = *srcptr++; - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - if (flip) - for (x = cups->width; x > 0; x --) - { - *cptr-- = *srcptr++; - *mptr-- = *srcptr++; - *yptr-- = *srcptr++; - *kptr-- = *srcptr++; - } - else - for (x = cups->width; x > 0; x --) - { - *cptr++ = *srcptr++; - *mptr++ = *srcptr++; - *yptr++ = *srcptr++; - *kptr++ = *srcptr++; - } - break; - } - break; - } - } - - /* - * Write the bitmap data to the raster stream... - */ - - cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine); - } -} - - -/* - * 'cups_print_planar()' - Print a page of planar pixels. - */ - -static void -cups_print_planar(gx_device_printer *pdev, - /* I - Printer device */ - unsigned char *src, - /* I - Scanline buffer */ - unsigned char *dst, - /* I - Bitmap buffer */ - int srcbytes) - /* I - Number of bytes in src */ -{ - int x; /* Looping var */ - int y; /* Looping var */ - int z; /* Looping var */ - unsigned char srcbit; /* Current source bit */ - unsigned char dstbit; /* Current destination bit */ - unsigned char temp; /* Temporary variable */ - unsigned char *srcptr; /* Pointer to data */ - unsigned char *dstptr; /* Pointer to bitmap */ - - - /**** NOTE: Currently planar output doesn't support flipped duplex!!! ****/ - - /* - * Loop through the page bitmap and write planar pixels... We have - * to separate each chunked color as needed... - */ - - for (z = 0; z < pdev->color_info.num_components; z ++) - for (y = 0; y < cups->height; y ++) - { - /* - * Grab the scanline data... - */ - - if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0) - { - fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y); - gs_exit(1); - } - - /* - * Pull the individual color planes out of the pixels... - */ - - if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0) - memset(dst, 0, cups->header.cupsBytesPerLine); - else - switch (cups->header.cupsBitsPerColor) - { - default : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - for (dstptr = dst, x = cups->width, srcbit = 64 >> z, - dstbit = 128; - x > 0; - x --) - { - if (*srcptr & srcbit) - *dstptr |= dstbit; - - if (srcbit >= 16) - srcbit >>= 4; - else - { - srcbit = 64 >> z; - srcptr ++; - } - - if (dstbit > 1) - dstbit >>= 1; - else - { - dstbit = 128; - dstptr ++; - } - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - for (dstptr = dst, x = cups->width, srcbit = 128 >> z, - dstbit = 128; - x > 0; - x --) - { - if (*srcptr & srcbit) - *dstptr |= dstbit; - - if (srcbit >= 16) - srcbit >>= 4; - else - { - srcbit = 128 >> z; - srcptr ++; - } - - if (dstbit > 1) - dstbit >>= 1; - else - { - dstbit = 128; - dstptr ++; - } - } - break; - case CUPS_CSPACE_KCMYcm : - for (dstptr = dst, x = cups->width, srcbit = 32 >> z, - dstbit = 128; - x > 0; - x --, srcptr ++) - { - if (*srcptr & srcbit) - *dstptr |= dstbit; - - if (dstbit > 1) - dstbit >>= 1; - else - { - dstbit = 128; - dstptr ++; - } - } - break; - } - break; - - case 2 : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - for (dstptr = dst, x = cups->width, srcbit = 48 >> (z * 2), - dstbit = 0xc0; - x > 0; - x --, srcptr ++) - { - if ((temp = *srcptr & srcbit) != 0) - { - if (srcbit == dstbit) - *dstptr |= temp; - else - { - switch (srcbit) - { - case 0x30 : - temp >>= 4; - break; - case 0x0c : - temp >>= 2; - break; - } - - switch (dstbit) - { - case 0xc0 : - *dstptr |= temp << 6; - break; - case 0x30 : - *dstptr |= temp << 4; - break; - case 0x0c : - *dstptr |= temp << 2; - break; - case 0x03 : - *dstptr |= temp; - break; - } - } - } - - if (dstbit > 0x03) - dstbit >>= 2; - else - { - dstbit = 0xc0; - dstptr ++; - } - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - for (dstptr = dst, x = cups->width, srcbit = 192 >> (z * 2), - dstbit = 0xc0; - x > 0; - x --, srcptr ++) - { - if ((temp = *srcptr & srcbit) != 0) - { - if (srcbit == dstbit) - *dstptr |= temp; - else - { - switch (srcbit) - { - case 0xc0 : - temp >>= 6; - break; - case 0x30 : - temp >>= 4; - break; - case 0x0c : - temp >>= 2; - break; - } - - switch (dstbit) - { - case 0xc0 : - *dstptr |= temp << 6; - break; - case 0x30 : - *dstptr |= temp << 4; - break; - case 0x0c : - *dstptr |= temp << 2; - break; - case 0x03 : - *dstptr |= temp; - break; - } - } - } - - if (dstbit > 0x03) - dstbit >>= 2; - else - { - dstbit = 0xc0; - dstptr ++; - } - } - break; - } - break; - - case 4 : - memset(dst, 0, cups->header.cupsBytesPerLine); - - switch (cups->header.cupsColorSpace) - { - default : - if (z > 0) - srcptr ++; - - if (z == 1) - srcbit = 0xf0; - else - srcbit = 0x0f; - - for (dstptr = dst, x = cups->width, dstbit = 0xf0; - x > 0; - x --, srcptr += 2) - { - if ((temp = *srcptr & srcbit) != 0) - { - if (srcbit == dstbit) - *dstptr |= temp; - else - { - if (srcbit == 0xf0) - temp >>= 4; - - if (dstbit == 0xf0) - *dstptr |= temp << 4; - else - *dstptr |= temp; - } - } - - if (dstbit == 0xf0) - dstbit = 0x0f; - else - { - dstbit = 0xf0; - dstptr ++; - } - } - break; - case CUPS_CSPACE_GMCK : - case CUPS_CSPACE_GMCS : - case CUPS_CSPACE_RGBA : - case CUPS_CSPACE_CMYK : - case CUPS_CSPACE_YMCK : - case CUPS_CSPACE_KCMY : - case CUPS_CSPACE_KCMYcm : - if (z > 1) - srcptr ++; - - if (z & 1) - srcbit = 0x0f; - else - srcbit = 0xf0; - - for (dstptr = dst, x = cups->width, dstbit = 0xf0; - x > 0; - x --, srcptr += 2) - { - if ((temp = *srcptr & srcbit) != 0) - { - if (srcbit == dstbit) - *dstptr |= temp; - else - { - if (srcbit == 0xf0) - temp >>= 4; - - if (dstbit == 0xf0) - *dstptr |= temp << 4; - else - *dstptr |= temp; - } - } - - if (dstbit == 0xf0) - dstbit = 0x0f; - else - { - dstbit = 0xf0; - dstptr ++; - } - } - break; - } - break; - - case 8 : - for (srcptr += z, dstptr = dst, x = cups->header.cupsBytesPerLine; - x > 0; - srcptr += pdev->color_info.num_components, x --) - *dstptr++ = *srcptr; - break; - } - - /* - * Write the bitmap data to the raster stream... - */ - - cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine); - } -} - - -/* - * End of "$Id: gdevcups.c 4493 2005-02-18 02:09:53Z mike $". - */ diff --git a/pstoraster/gs707-lib.patch b/pstoraster/gs707-lib.patch deleted file mode 100644 index 32b011dd9..000000000 --- a/pstoraster/gs707-lib.patch +++ /dev/null @@ -1,110 +0,0 @@ -diff -u ghostscript-7.07/lib/gs_init.ps ghostscript-7.07-easysw/lib/gs_init.ps ---- ghostscript-7.07/lib/gs_init.ps 2003-04-12 10:02:38.000000000 -0400 -+++ ghostscript-7.07-easysw/lib/gs_init.ps 2003-11-14 16:38:44.000000000 -0500 -@@ -119,6 +119,7 @@ - currentdict /NOFONTPATH known /NOFONTPATH exch def - currentdict /NOGC known /NOGC exch def - currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if -+currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def - currentdict /NOPAGEPROMPT known /NOPAGEPROMPT exch def - currentdict /NOPAUSE known /NOPAUSE exch def - currentdict /NOPLATFONTS known /NOPLATFONTS exch def -diff -u ghostscript-7.07/lib/gs_setpd.ps ghostscript-7.07-easysw/lib/gs_setpd.ps ---- ghostscript-7.07/lib/gs_setpd.ps 2003-04-12 10:02:38.000000000 -0400 -+++ ghostscript-7.07-easysw/lib/gs_setpd.ps 2003-11-14 16:38:06.000000000 -0500 -@@ -324,21 +324,42 @@ - } bind - .dicttomark readonly def - --% Define the keys used in input attribute matching. --/.inputattrkeys [ -- /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet -- % The following are documented in Adobe's supplement for v2017. -- /LeadingEdge /MediaClass --] readonly def --% Define other keys used in media selection. --/.inputselectionkeys [ -- /MediaPosition /Orientation --] readonly def -- --% Define the keys used in output attribute matching. --/.outputattrkeys [ -- /OutputType --] readonly def -+% M. Sweet, Easy Software Products: -+% -+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media -+% selection policies for setpagedevice. This is used by CUPS to support -+% the standard Adobe media attributes. -+NOMEDIAATTRS { -+ % Define only PageSize for input attribute matching. -+ /.inputattrkeys [ -+ /PageSize -+ ] readonly def -+ % Define no other keys used in media selection. -+ /.inputselectionkeys [ -+ /noInputSelectionsKeys -+ ] readonly def -+ -+ % Define no keys used in output attribute matching. -+ /.outputattrkeys [ -+ /noOutputAttrKeys -+ ] readonly def -+} { -+ % Define the keys used in input attribute matching. -+ /.inputattrkeys [ -+ /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet -+ % The following are documented in Adobe's supplement for v2017. -+ /LeadingEdge /MediaClass -+ ] readonly def -+ % Define other keys used in media selection. -+ /.inputselectionkeys [ -+ /MediaPosition /Orientation -+ ] readonly def -+ -+ % Define the keys used in output attribute matching. -+ /.outputattrkeys [ -+ /OutputType -+ ] readonly def -+} ifelse - - % Define all the parameters that should always be copied to the merged - % dictionary. -@@ -367,7 +388,13 @@ - /PageSize false % obsolete alias for .MediaSize - /InputAttributes false - .inputattrkeys -- { dup /PageSize eq -+ % M. Sweet, Easy Software Products: -+ % -+ % Treat LeadingEdge like PageSize so that a common Ghostscript driver -+ % doesn't need the NOMEDIAATTRS definition. -+ % -+ % { dup /PageSize eq -+ { dup dup /PageSize eq exch /LeadingEdge eq or - { pop } - { { 2 index /InputAttributes .knownget { null eq } { true } ifelse } } - ifelse -@@ -442,11 +469,22 @@ - % They are expected to consume the top 2 operands. - % NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize) - % the same as 0, i.e., we signal an error. -+% -+% M. Sweet, Easy Software Products: -+% -+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media -+% selection policies for setpagedevice. This is used by CUPS to support -+% the standard Adobe media attributes. - 0 { % Set errorinfo and signal a configurationerror. -+ NOMEDIAATTRS { -+ % NOMEDIAATTRS means that the default policy is 7... -+ pop 2 index exch 7 put -+ } { - pop dup 4 index exch get 2 array astore - $error /errorinfo 3 -1 roll put - cleartomark - /setpagedevice load /configurationerror signalerror -+ } ifelse - } bind - 1 { % Roll back the failed request to its previous status. - DEBUG { (Rolling back.) = pstack flush } if diff --git a/pstoraster/gs811-lib.patch b/pstoraster/gs811-lib.patch deleted file mode 100644 index 9cd125305..000000000 --- a/pstoraster/gs811-lib.patch +++ /dev/null @@ -1,110 +0,0 @@ -diff -u ghostscript-8.11/lib/gs_init.ps ghostscript-8.11-easysw/lib/gs_init.ps ---- ghostscript-8.11/lib/gs_init.ps 2003-07-30 03:26:55.000000000 -0400 -+++ ghostscript-8.11-easysw/lib/gs_init.ps 2003-11-13 13:04:17.000000000 -0500 -@@ -139,6 +139,7 @@ - currentdict /NOFONTPATH known /NOFONTPATH exch def - currentdict /NOGC known /NOGC exch def - currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if -+currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def - currentdict /NOOUTERSAVE known /NOOUTERSAVE exch def - currentdict /NOPAGEPROMPT known /NOPAGEPROMPT exch def - currentdict /NOPAUSE known /NOPAUSE exch def -diff -u ghostscript-8.11/lib/gs_setpd.ps ghostscript-8.11-easysw/lib/gs_setpd.ps ---- ghostscript-8.11/lib/gs_setpd.ps 2003-04-12 14:08:18.000000000 -0400 -+++ ghostscript-8.11-easysw/lib/gs_setpd.ps 2003-11-14 16:32:55.000000000 -0500 -@@ -344,21 +344,42 @@ - } bind - .dicttomark readonly def - --% Define the keys used in input attribute matching. --/.inputattrkeys [ -- /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet -- % The following are documented in Adobe's supplement for v2017. -- /LeadingEdge /MediaClass --] readonly def --% Define other keys used in media selection. --/.inputselectionkeys [ -- /MediaPosition /Orientation --] readonly def -- --% Define the keys used in output attribute matching. --/.outputattrkeys [ -- /OutputType --] readonly def -+% M. Sweet, Easy Software Products: -+% -+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media -+% selection policies for setpagedevice. This is used by CUPS to support -+% the standard Adobe media attributes. -+NOMEDIAATTRS { -+ % Define only PageSize for input attribute matching. -+ /.inputattrkeys [ -+ /PageSize -+ ] readonly def -+ % Define no other keys used in media selection. -+ /.inputselectionkeys [ -+ /noInputSelectionsKeys -+ ] readonly def -+ -+ % Define no keys used in output attribute matching. -+ /.outputattrkeys [ -+ /noOutputAttrKeys -+ ] readonly def -+} { -+ % Define the keys used in input attribute matching. -+ /.inputattrkeys [ -+ /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet -+ % The following are documented in Adobe's supplement for v2017. -+ /LeadingEdge /MediaClass -+ ] readonly def -+ % Define other keys used in media selection. -+ /.inputselectionkeys [ -+ /MediaPosition /Orientation -+ ] readonly def -+ -+ % Define the keys used in output attribute matching. -+ /.outputattrkeys [ -+ /OutputType -+ ] readonly def -+} ifelse - - % Define all the parameters that should always be copied to the merged - % dictionary. -@@ -387,7 +408,13 @@ - /PageSize //false % obsolete alias for .MediaSize - /InputAttributes //false - .inputattrkeys -- { dup /PageSize eq -+ % M. Sweet, Easy Software Products: -+ % -+ % Treat LeadingEdge like PageSize so that a common Ghostscript driver -+ % doesn't need the NOMEDIAATTRS definition. -+ % -+ % { dup /PageSize eq -+ { dup dup /PageSize eq exch /LeadingEdge eq or - { pop } - { { 2 index /InputAttributes .knownget { //null eq } { //true } ifelse } } - ifelse -@@ -468,11 +495,22 @@ - % They are expected to consume the top 2 operands. - % NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize) - % the same as 0, i.e., we signal an error. -+% -+% M. Sweet, Easy Software Products: -+% -+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media -+% selection policies for setpagedevice. This is used by CUPS to support -+% the standard Adobe media attributes. - 0 { % Set errorinfo and signal a configurationerror. -+ NOMEDIAATTRS { -+ % NOMEDIAATTRS means that the default policy is 7... -+ pop 2 index exch 7 put -+ } { - pop dup 4 index exch get 2 array astore - $error /errorinfo 3 -1 roll put - cleartomark - /setpagedevice load /configurationerror signalerror -+ } ifelse - } bind - 1 { % Roll back the failed request to its previous status. - SETPDDEBUG { (Rolling back.) = pstack flush } if diff --git a/pstoraster/pstopxl b/pstoraster/pstopxl deleted file mode 100644 index 227f5f4cd..000000000 --- a/pstoraster/pstopxl +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -# -# "$Id: pstopxl 4076 2004-02-24 21:59:13Z mike $" -# -# CUPS PCL XL/PCL 6 filter script for Ghostscript. -# -# Copyright 2001-2003 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Installation directories... -prefix=/usr/local -exec_prefix=${prefix} -bindir=/usr/lib/cups/filter - -# Set the library/font path... -GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" -export GS_LIB - -# Determine the PCL XL/PCL 6 driver to use... -if test "x$PPD" != x; then - colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'` - case "$colordevice" in - *True* | *true*) - device="pxlcolor" - ;; - *) - device="pxlmono" - ;; - esac -else - device="pxlmono" -fi - -# Options we use with Ghostscript... -gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH" -gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=$device -sstdout=%stderr" - -# See if we have a filename on the command-line... -if test -z "$6"; then - ifile="-" -else - ifile="$6" -fi - -echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2 -echo DEBUG: Running $bindir/gsrip $gsopts -sOUTPUTFILE="%stdout" "$ifile" 1>&2 - -# Now run Ghostscript... -$bindir/gsrip $gsopts -sOUTPUTFILE="%stdout" "$ifile" - -# -# End of "$Id: pstopxl 4076 2004-02-24 21:59:13Z mike $". -# diff --git a/pstoraster/pstopxl.in b/pstoraster/pstopxl.in deleted file mode 100755 index c57d15e0c..000000000 --- a/pstoraster/pstopxl.in +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -# -# "$Id: pstopxl.in 4493 2005-02-18 02:09:53Z mike $" -# -# CUPS PCL XL/PCL 6 filter script for Ghostscript. -# -# Copyright 2001-2005 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Installation directories... -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ - -# Set the library/font path... -GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" -export GS_LIB - -# Determine the PCL XL/PCL 6 driver to use... -if test "x$PPD" != x; then - colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'` - case "$colordevice" in - *True* | *true*) - device="pxlcolor" - ;; - *) - device="pxlmono" - ;; - esac -else - device="pxlmono" -fi - -# Options we use with Ghostscript... -gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH" -gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=$device -sstdout=%stderr" - -# See if we have a filename on the command-line... -if test -z "$6"; then - ifile="-" -else - ifile="$6" -fi - -echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2 -echo DEBUG: Running $bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" "$ifile" 1>&2 - -# Now run Ghostscript... -$bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" "$ifile" - -# -# End of "$Id: pstopxl.in 4493 2005-02-18 02:09:53Z mike $". -# diff --git a/pstoraster/pstoraster b/pstoraster/pstoraster deleted file mode 100755 index e5ec266c8..000000000 --- a/pstoraster/pstoraster +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# -# "$Id: pstoraster 4493 2005-02-18 02:09:53Z mike $" -# -# CUPS filter script for Ghostscript. -# -# Copyright 2001-2005 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Installation directories... -prefix=/usr/local -exec_prefix=${prefix} -bindir=${exec_prefix}/bin - -# Set the library/font path... -GS_FONTPATH="$CUPS_FONTPATH" -export GS_FONTPATH - -# Options we use with Ghostscript... -gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH " -gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=cups -sstdout=%stderr" - -# See if we have a profile=n,n,n,n,n,n,n,n,n,n,n option... -profile="" -for option in $5; do - case $option in - profile=*) - profile="-scupsProfile=`echo $option | awk -F= '{print $2}'`" - ;; - esac -done - -# Now run Ghostscript... -$bindir/gs $gsopts -sOUTPUTFILE="%stdout" $profile $6 - -# -# End of "$Id: pstoraster 4493 2005-02-18 02:09:53Z mike $". -# diff --git a/pstoraster/pstoraster.convs b/pstoraster/pstoraster.convs deleted file mode 100644 index 9e5f0006a..000000000 --- a/pstoraster/pstoraster.convs +++ /dev/null @@ -1,29 +0,0 @@ -# -# "$Id: pstoraster.convs 4493 2005-02-18 02:09:53Z mike $" -# -# MIME converts file for Ghostscript. -# -# Copyright 1997-2005 by Easy Software Products. -# -# These coded instructions, statements, and computer programs are the -# property of Easy Software Products and are protected by Federal -# copyright law. Distribution and use rights are outlined in the file -# "LICENSE.txt" which should have been included with this file. If this -# file is missing or damaged please contact Easy Software Products -# at: -# -# Attn: CUPS Licensing Information -# Easy Software Products -# 44141 Airport View Drive, Suite 204 -# Hollywood, Maryland 20636 USA -# -# Voice: (301) 373-9600 -# EMail: cups-info@cups.org -# WWW: http://www.cups.org -# - -application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster - -# -# End of "$Id: pstoraster.convs 4493 2005-02-18 02:09:53Z mike $". -# diff --git a/pstoraster/pstoraster.in b/pstoraster/pstoraster.in deleted file mode 100755 index 4019009d6..000000000 --- a/pstoraster/pstoraster.in +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -# -# "$Id: pstoraster.in 4493 2005-02-18 02:09:53Z mike $" -# -# CUPS raster filter script for Ghostscript. -# -# Copyright 2001-2005 by Easy Software Products. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Installation directories... -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ - -# Set the library/font path... -GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" -export GS_LIB - -# Options we use with Ghostscript... -gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH" -gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=cups -sstdout=%stderr" - -# See if we have a profile=n,n,n,n,n,n,n,n,n,n,n option... -profile="" -for option in $5; do - case $option in - profile=*) - profile="<>setpagedevice" - ;; - esac -done - -# See if we have a filename on the command-line... -if test -z "$6"; then - ifile="-" -else - ifile="$6" -fi - -echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2 -echo DEBUG: Running $bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" -c"$profile" "$ifile" 1>&2 - -# Now run Ghostscript... -$bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" -c"$profile" "$ifile" - -# -# End of "$Id: pstoraster.in 4493 2005-02-18 02:09:53Z mike $". -# diff --git a/pstoraster/pxlcolor.ppd b/pstoraster/pxlcolor.ppd deleted file mode 100644 index c7d16ecd4..000000000 --- a/pstoraster/pxlcolor.ppd +++ /dev/null @@ -1,205 +0,0 @@ -*PPD-Adobe: "4.3" -*% -*% "$Id: pxlcolor.ppd 4493 2005-02-18 02:09:53Z mike $" -*% -*% Sample color PCL XL/PCL 6 driver PPD file for the Common UNIX -*% Printing System (CUPS). -*% -*% Copyright 1997-2005 by Easy Software Products. -*% -*% These coded instructions, statements, and computer programs are the -*% property of Easy Software Products and are protected by Federal -*% copyright law. Distribution and use rights are outlined in the file -*% "LICENSE.txt" which should have been included with this file. If this -*% file is missing or damaged please contact Easy Software Products -*% at: -*% -*% Attn: CUPS Licensing Information -*% Easy Software Products -*% 44141 Airport View Drive, Suite 204 -*% Hollywood, Maryland 20636 USA -*% -*% Voice: (301) 373-9600 -*% EMail: cups-info@cups.org -*% WWW: http://www.cups.org -*% -*FormatVersion: "4.3" -*FileVersion: "1.1" -*LanguageVersion: English -*LanguageEncoding: ISOLatin1 -*PCFileName: "PCLCOLOR.PPD" -*Manufacturer: "ESP" -*Product: "(CUPS v1.1)" -*cupsVersion: 1.1 -*cupsManualCopies: False -*cupsFilter: "application/vnd.cups-postscript 0 pstopxl" -*ModelName: "HP Color LaserJet Series PCL 6" -*ShortNickName: "HP Color LaserJet Series PCL 6" -*NickName: "HP Color LaserJet Series PCL 6 CUPS v1.1" -*PSVersion: "(3010.000) 707" -*LanguageLevel: "3" -*ColorDevice: True -*DefaultColorSpace: RGB -*FileSystem: False -*Throughput: "8" -*LandscapeOrientation: Plus90 -*TTRasterizer: Type42 - -*UIConstraints: *PageSize Executive *InputSlot Envelope -*UIConstraints: *PageSize Letter *InputSlot Envelope -*UIConstraints: *PageSize Legal *InputSlot Envelope -*UIConstraints: *PageSize Tabloid *InputSlot Envelope -*UIConstraints: *PageSize A3 *InputSlot Envelope -*UIConstraints: *PageSize A4 *InputSlot Envelope -*UIConstraints: *PageSize A5 *InputSlot Envelope -*UIConstraints: *PageSize B5 *InputSlot Envelope -*UIConstraints: *Duplex *Option1 False - -*OpenUI *PageSize/Media Size: PickOne -*OrderDependency: 10 AnySetup *PageSize -*DefaultPageSize: Letter -*PageSize Letter/US Letter: "<>setpagedevice" -*PageSize Legal/US Legal: "<>setpagedevice" -*PageSize Executive/US Executive: "<>setpagedevice" -*PageSize Tabloid/US Tabloid: "<>setpagedevice" -*PageSize A3/A3: "<>setpagedevice" -*PageSize A4/A4: "<>setpagedevice" -*PageSize A5/A5: "<>setpagedevice" -*PageSize B5/B5 (JIS): "<>setpagedevice" -*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" -*PageSize Env10/Envelope #10: "<>setpagedevice" -*PageSize EnvC5/Envelope C5: "<>setpagedevice" -*PageSize EnvDL/Envelope DL: "<>setpagedevice" -*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" -*CloseUI: *PageSize - -*OpenUI *PageRegion: PickOne -*OrderDependency: 10 AnySetup *PageRegion -*DefaultPageRegion: Letter -*PageRegion Letter/US Letter: "<>setpagedevice" -*PageRegion Legal/US Legal: "<>setpagedevice" -*PageRegion Executive/US Executive: "<>setpagedevice" -*PageRegion Tabloid/US Tabloid: "<>setpagedevice" -*PageRegion A3/A3: "<>setpagedevice" -*PageRegion A4/A4: "<>setpagedevice" -*PageRegion A5/A5: "<>setpagedevice" -*PageRegion B5/B5 (JIS): "<>setpagedevice" -*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" -*PageRegion Env10/Envelope #10: "<>setpagedevice" -*PageRegion EnvC5/Envelope C5: "<>setpagedevice" -*PageRegion EnvDL/Envelope DL: "<>setpagedevice" -*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" -*CloseUI: *PageRegion - -*DefaultImageableArea: Letter -*ImageableArea Letter/US Letter: "12 12 600 780" -*ImageableArea Legal/US Legal: "12 12 600 996" -*ImageableArea Executive/US Executive: "12 12 510 708" -*ImageableArea Tabloid/US Tabloid: "12 12 780 1212" -*ImageableArea A3/A3: "12 12 830 1179" -*ImageableArea A4/A4: "12 12 583 830" -*ImageableArea A5/A5: "12 12 409 583" -*ImageableArea B5/JIS B5: "12 12 504 717" -*ImageableArea EnvISOB5/B5 (ISO): "12 12 469 697" -*ImageableArea Env10/Com-10: "12 12 285 672" -*ImageableArea EnvC5/EnvC5: "12 12 447 637" -*ImageableArea EnvDL/EnvDL: "12 12 300 612" -*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528" - -*DefaultPaperDimension: Letter -*PaperDimension Letter/US Letter: "612 792" -*PaperDimension Legal/US Legal: "612 1008" -*PaperDimension Executive/US Executive: "522 756" -*PaperDimension Tabloid/US Tabloid: "792 1224" -*PaperDimension A3/A3: "842 1191" -*PaperDimension A4/A4: "595 842" -*PaperDimension A5/A5: "421 595" -*PaperDimension B5/B5 (JIS): "516 729" -*PaperDimension EnvISOB5/Envelope B5: "499 709" -*PaperDimension Env10/Envelope #10: "297 684" -*PaperDimension EnvC5/Envelope C5: "459 649" -*PaperDimension EnvDL/Envelope DL: "312 624" -*PaperDimension EnvMonarch/Envelope Monarch: "279 540" - -*OpenUI *InputSlot/Media Source: PickOne -*OrderDependency: 10 AnySetup *InputSlot -*DefaultInputSlot: Default -*InputSlot Default/Default: "<>setpagedevice" -*InputSlot Tray1/Tray 1: "<>setpagedevice" -*InputSlot Tray2/Tray 2: "<>setpagedevice" -*InputSlot Tray3/Tray 3: "<>setpagedevice" -*InputSlot Tray4/Tray 4: "<>setpagedevice" -*InputSlot Manual/Manual Feed: "<>setpagedevice" -*InputSlot Envelope/Envelope Feed: "<>setpagedevice" -*CloseUI: *InputSlot - -*OpenUI *ColorModel/Output Mode: PickOne -*OrderDependency: 10 AnySetup *ColorModel -*DefaultColorModel: RGB -*ColorModel RGB/Color: "<>setpagedevice" -*ColorModel Gray/Grayscale: "<>setpagedevice" -*CloseUI: *ColorModel - -*OpenUI *Resolution/Output Resolution: PickOne -*OrderDependency: 20 AnySetup *Resolution -*DefaultResolution: 300dpi -*Resolution 150dpi/150 DPI: "<>setpagedevice" -*Resolution 300dpi/300 DPI: "<>setpagedevice" -*Resolution 600dpi/600 DPI: "<>setpagedevice" -*CloseUI: *Resolution - -*OpenUI *Duplex/Double-Sided Printing: PickOne -*OrderDependency: 20 AnySetup *Duplex -*DefaultDuplex: None -*Duplex None/Off: "<>setpagedevice" -*Duplex DuplexNoTumble/Long Edge (Standard): "<>setpagedevice" -*Duplex DuplexTumble/Short Edge (Flip): "<>setpagedevice" -*CloseUI: *Duplex - -*OpenGroup: InstallableOptions -*OpenUI *Option1/Duplexer: Boolean -*DefaultOption1: False -*Option1 True/Installed: "" -*Option1 False/Not Installed: "" -*CloseUI: *Option1 -*CloseGroup: InstallableOptions - -*DefaultFont: Courier -*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM -*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM -*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM -*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM -*Font Bookman-Demi: Standard "(001.004S)" Standard ROM -*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM -*Font Bookman-Light: Standard "(001.004S)" Standard ROM -*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM -*Font Courier: Standard "(002.004S)" Standard ROM -*Font Courier-Bold: Standard "(002.004S)" Standard ROM -*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM -*Font Courier-Oblique: Standard "(002.004S)" Standard ROM -*Font Helvetica: Standard "(001.006S)" Standard ROM -*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM -*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM -*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM -*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM -*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM -*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM -*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM -*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM -*Font Palatino-Bold: Standard "(001.005S)" Standard ROM -*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM -*Font Palatino-Italic: Standard "(001.005S)" Standard ROM -*Font Palatino-Roman: Standard "(001.005S)" Standard ROM -*Font Symbol: Special "(001.007S)" Special ROM -*Font Times-Bold: Standard "(001.007S)" Standard ROM -*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM -*Font Times-Italic: Standard "(001.007S)" Standard ROM -*Font Times-Roman: Standard "(001.007S)" Standard ROM -*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM -*Font ZapfDingbats: Special "(001.004S)" Standard ROM -*% -*% End of "$Id: pxlcolor.ppd 4493 2005-02-18 02:09:53Z mike $". -*% diff --git a/pstoraster/pxlmono.ppd b/pstoraster/pxlmono.ppd deleted file mode 100644 index 1870ca0bb..000000000 --- a/pstoraster/pxlmono.ppd +++ /dev/null @@ -1,199 +0,0 @@ -*PPD-Adobe: "4.3" -*% -*% "$Id: pxlmono.ppd 4493 2005-02-18 02:09:53Z mike $" -*% -*% Sample monochrome PCL XL/PCL 6 driver PPD file for the Common UNIX -*% Printing System (CUPS). -*% -*% Copyright 1997-2005 by Easy Software Products. -*% -*% These coded instructions, statements, and computer programs are the -*% property of Easy Software Products and are protected by Federal -*% copyright law. Distribution and use rights are outlined in the file -*% "LICENSE.txt" which should have been included with this file. If this -*% file is missing or damaged please contact Easy Software Products -*% at: -*% -*% Attn: CUPS Licensing Information -*% Easy Software Products -*% 44141 Airport View Drive, Suite 204 -*% Hollywood, Maryland 20636 USA -*% -*% Voice: (301) 373-9600 -*% EMail: cups-info@cups.org -*% WWW: http://www.cups.org -*% -*FormatVersion: "4.3" -*FileVersion: "1.1" -*LanguageVersion: English -*LanguageEncoding: ISOLatin1 -*PCFileName: "PCLMONO.PPD" -*Manufacturer: "ESP" -*Product: "(CUPS v1.1)" -*cupsVersion: 1.1 -*cupsManualCopies: False -*cupsFilter: "application/vnd.cups-postscript 0 pstopxl" -*ModelName: "HP LaserJet Series PCL 6" -*ShortNickName: "HP LaserJet Series PCL 6" -*NickName: "HP LaserJet Series PCL 6 CUPS v1.1" -*PSVersion: "(3010.000) 707" -*LanguageLevel: "3" -*ColorDevice: False -*DefaultColorSpace: Gray -*FileSystem: False -*Throughput: "8" -*LandscapeOrientation: Plus90 -*TTRasterizer: Type42 - -*UIConstraints: *PageSize Executive *InputSlot Envelope -*UIConstraints: *PageSize Letter *InputSlot Envelope -*UIConstraints: *PageSize Legal *InputSlot Envelope -*UIConstraints: *PageSize Tabloid *InputSlot Envelope -*UIConstraints: *PageSize A3 *InputSlot Envelope -*UIConstraints: *PageSize A4 *InputSlot Envelope -*UIConstraints: *PageSize A5 *InputSlot Envelope -*UIConstraints: *PageSize B5 *InputSlot Envelope -*UIConstraints: *Duplex *Option1 False - -*OpenUI *PageSize/Media Size: PickOne -*OrderDependency: 10 AnySetup *PageSize -*DefaultPageSize: Letter -*PageSize Letter/US Letter: "<>setpagedevice" -*PageSize Legal/US Legal: "<>setpagedevice" -*PageSize Executive/US Executive: "<>setpagedevice" -*PageSize Tabloid/US Tabloid: "<>setpagedevice" -*PageSize A3/A3: "<>setpagedevice" -*PageSize A4/A4: "<>setpagedevice" -*PageSize A5/A5: "<>setpagedevice" -*PageSize B5/B5 (JIS): "<>setpagedevice" -*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" -*PageSize Env10/Envelope #10: "<>setpagedevice" -*PageSize EnvC5/Envelope C5: "<>setpagedevice" -*PageSize EnvDL/Envelope DL: "<>setpagedevice" -*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" -*CloseUI: *PageSize - -*OpenUI *PageRegion: PickOne -*OrderDependency: 10 AnySetup *PageRegion -*DefaultPageRegion: Letter -*PageRegion Letter/US Letter: "<>setpagedevice" -*PageRegion Legal/US Legal: "<>setpagedevice" -*PageRegion Executive/US Executive: "<>setpagedevice" -*PageRegion Tabloid/US Tabloid: "<>setpagedevice" -*PageRegion A3/A3: "<>setpagedevice" -*PageRegion A4/A4: "<>setpagedevice" -*PageRegion A5/A5: "<>setpagedevice" -*PageRegion B5/B5 (JIS): "<>setpagedevice" -*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" -*PageRegion Env10/Envelope #10: "<>setpagedevice" -*PageRegion EnvC5/Envelope C5: "<>setpagedevice" -*PageRegion EnvDL/Envelope DL: "<>setpagedevice" -*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" -*CloseUI: *PageRegion - -*DefaultImageableArea: Letter -*ImageableArea Letter/US Letter: "12 12 600 780" -*ImageableArea Legal/US Legal: "12 12 600 996" -*ImageableArea Executive/US Executive: "12 12 510 708" -*ImageableArea Tabloid/US Tabloid: "12 12 780 1212" -*ImageableArea A3/A3: "12 12 830 1179" -*ImageableArea A4/A4: "12 12 583 830" -*ImageableArea A5/A5: "12 12 409 583" -*ImageableArea B5/JIS B5: "12 12 504 717" -*ImageableArea EnvISOB5/B5 (ISO): "12 12 469 697" -*ImageableArea Env10/Com-10: "12 12 285 672" -*ImageableArea EnvC5/EnvC5: "12 12 447 637" -*ImageableArea EnvDL/EnvDL: "12 12 300 612" -*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528" - -*DefaultPaperDimension: Letter -*PaperDimension Letter/US Letter: "612 792" -*PaperDimension Legal/US Legal: "612 1008" -*PaperDimension Executive/US Executive: "522 756" -*PaperDimension Tabloid/US Tabloid: "792 1224" -*PaperDimension A3/A3: "842 1191" -*PaperDimension A4/A4: "595 842" -*PaperDimension A5/A5: "421 595" -*PaperDimension B5/B5 (JIS): "516 729" -*PaperDimension EnvISOB5/Envelope B5: "499 709" -*PaperDimension Env10/Envelope #10: "297 684" -*PaperDimension EnvC5/Envelope C5: "459 649" -*PaperDimension EnvDL/Envelope DL: "312 624" -*PaperDimension EnvMonarch/Envelope Monarch: "279 540" - -*OpenUI *InputSlot/Media Source: PickOne -*OrderDependency: 10 AnySetup *InputSlot -*DefaultInputSlot: Default -*InputSlot Default/Default: "<>setpagedevice" -*InputSlot Tray1/Tray 1: "<>setpagedevice" -*InputSlot Tray2/Tray 2: "<>setpagedevice" -*InputSlot Tray3/Tray 3: "<>setpagedevice" -*InputSlot Tray4/Tray 4: "<>setpagedevice" -*InputSlot Manual/Manual Feed: "<>setpagedevice" -*InputSlot Envelope/Envelope Feed: "<>setpagedevice" -*CloseUI: *InputSlot - -*OpenUI *Resolution/Output Resolution: PickOne -*OrderDependency: 20 AnySetup *Resolution -*DefaultResolution: 600dpi -*Resolution 150dpi/150 DPI: "<>setpagedevice" -*Resolution 300dpi/300 DPI: "<>setpagedevice" -*Resolution 600dpi/600 DPI: "<>setpagedevice" -*Resolution 1200dpi/1200 DPI: "<>setpagedevice" -*CloseUI: *Resolution - -*OpenUI *Duplex/Double-Sided Printing: PickOne -*OrderDependency: 20 AnySetup *Duplex -*DefaultDuplex: None -*Duplex None/Off: "<>setpagedevice" -*Duplex DuplexNoTumble/Long Edge (Standard): "<>setpagedevice" -*Duplex DuplexTumble/Short Edge (Flip): "<>setpagedevice" -*CloseUI: *Duplex - -*OpenGroup: InstallableOptions -*OpenUI *Option1/Duplexer: Boolean -*DefaultOption1: False -*Option1 True/Installed: "" -*Option1 False/Not Installed: "" -*CloseUI: *Option1 -*CloseGroup: InstallableOptions - -*DefaultFont: Courier -*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM -*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM -*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM -*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM -*Font Bookman-Demi: Standard "(001.004S)" Standard ROM -*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM -*Font Bookman-Light: Standard "(001.004S)" Standard ROM -*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM -*Font Courier: Standard "(002.004S)" Standard ROM -*Font Courier-Bold: Standard "(002.004S)" Standard ROM -*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM -*Font Courier-Oblique: Standard "(002.004S)" Standard ROM -*Font Helvetica: Standard "(001.006S)" Standard ROM -*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM -*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM -*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM -*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM -*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM -*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM -*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM -*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM -*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM -*Font Palatino-Bold: Standard "(001.005S)" Standard ROM -*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM -*Font Palatino-Italic: Standard "(001.005S)" Standard ROM -*Font Palatino-Roman: Standard "(001.005S)" Standard ROM -*Font Symbol: Special "(001.007S)" Special ROM -*Font Times-Bold: Standard "(001.007S)" Standard ROM -*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM -*Font Times-Italic: Standard "(001.007S)" Standard ROM -*Font Times-Roman: Standard "(001.007S)" Standard ROM -*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM -*Font ZapfDingbats: Special "(001.004S)" Standard ROM -*% -*% End of "$Id: pxlmono.ppd 4493 2005-02-18 02:09:53Z mike $". -*% diff --git a/scheduler/auth.c b/scheduler/auth.c index bee2ad395..7843fe15b 100644 --- a/scheduler/auth.c +++ b/scheduler/auth.c @@ -1,5 +1,5 @@ /* - * "$Id: auth.c 5197 2006-02-27 21:30:20Z mike $" + * "$Id: auth.c 5222 2006-03-03 18:57:56Z mike $" * * Authorization routines for the Common UNIX Printing System (CUPS). * @@ -1618,7 +1618,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */ if (!strcasecmp(con->http.hostname, "localhost")) { /* - * Access from localhost (127.0.0.1 or :::1) is always allowed... + * Access from localhost (127.0.0.1 or ::1) is always allowed... */ auth = AUTH_ALLOW; @@ -2156,5 +2156,5 @@ to64(char *s, /* O - Output string */ /* - * End of "$Id: auth.c 5197 2006-02-27 21:30:20Z mike $". + * End of "$Id: auth.c 5222 2006-03-03 18:57:56Z mike $". */ diff --git a/scheduler/auth.h b/scheduler/auth.h index 2d4dcb326..e18f8defa 100644 --- a/scheduler/auth.h +++ b/scheduler/auth.h @@ -1,5 +1,5 @@ /* - * "$Id: auth.h 5069 2006-02-04 05:24:35Z mike $" + * "$Id: auth.h 5222 2006-03-03 18:57:56Z mike $" * * Authorization definitions for the Common UNIX Printing System (CUPS) * scheduler. @@ -125,6 +125,10 @@ VAR cups_array_t *Locations VALUE(NULL); /* Authorization locations */ VAR int DefaultAuthType VALUE(AUTH_BASIC); /* Default AuthType, if not specified */ +#ifdef HAVE_SSL +VAR http_encryption_t DefaultEncryption VALUE(HTTP_ENCRYPT_REQUIRED); + /* Default encryption for authentication */ +#endif /* HAVE_SSL */ /* @@ -156,5 +160,5 @@ extern http_status_t cupsdIsAuthorized(cupsd_client_t *con, const char *owner); /* - * End of "$Id: auth.h 5069 2006-02-04 05:24:35Z mike $". + * End of "$Id: auth.h 5222 2006-03-03 18:57:56Z mike $". */ diff --git a/scheduler/cert.c b/scheduler/cert.c index 195db7842..91c2af888 100644 --- a/scheduler/cert.c +++ b/scheduler/cert.c @@ -1,5 +1,5 @@ /* - * "$Id: cert.c 5080 2006-02-05 18:28:27Z mike $" + * "$Id: cert.c 5213 2006-03-02 00:37:34Z mike $" * * Authentication certificate routines for the Common UNIX * Printing System (CUPS). @@ -174,7 +174,7 @@ cupsdAddCert(int pid, /* I - Process ID */ /* Others */ acl_create_entry(&acl, &entry); acl_get_permset(entry, &permset); - acl_add_perm(permset, ACL_READ); + acl_add_perm(permset, 0); acl_set_tag_type(entry, ACL_OTHER); acl_set_permset(entry, permset); @@ -415,5 +415,5 @@ cupsdInitCerts(void) /* - * End of "$Id: cert.c 5080 2006-02-05 18:28:27Z mike $". + * End of "$Id: cert.c 5213 2006-03-02 00:37:34Z mike $". */ diff --git a/scheduler/client.c b/scheduler/client.c index c9ae16f01..f9226223d 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -1,5 +1,5 @@ /* - * "$Id: client.c 5200 2006-02-28 00:10:32Z mike $" + * "$Id: client.c 5225 2006-03-04 12:28:10Z mike $" * * Client routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -41,6 +41,7 @@ * get_file() - Get a filename and state info. * install_conf_file() - Install a configuration file. * is_path_absolute() - Is a path absolute and free of relative elements. + * make_certificate() - Make a self-signed SSL/TLS certificate. * pipe_command() - Pipe the output of a command to the remote client. */ @@ -54,6 +55,9 @@ #ifdef HAVE_CDSASSL # include #endif /* HAVE_CDSASSL */ +#ifdef HAVE_GNUTLS +# include +#endif /* HAVE_GNUTLS */ /* @@ -69,6 +73,9 @@ static char *get_file(cupsd_client_t *con, struct stat *filestats, char *filename, int len); static http_status_t install_conf_file(cupsd_client_t *con); static int is_path_absolute(const char *path); +#ifdef HAVE_GNUTLS +static void make_certificate(void); +#endif /* HAVE_GNUTLS */ static int pipe_command(cupsd_client_t *con, int infile, int *outfile, char *command, char *options, int root); @@ -698,6 +705,20 @@ cupsdEncryptClient(cupsd_client_t *con) /* I - Client to encrypt */ gnutls_certificate_server_credentials *credentials; /* TLS credentials */ + + /* + * Verify that we have a certificate... + */ + + if (access(ServerKey, 0) || access(ServerCertificate, 0)) + { + /* + * Nope, make a self-signed certificate... + */ + + make_certificate(); + } + /* * Create the SSL object and perform the SSL handshake... */ @@ -727,7 +748,7 @@ cupsdEncryptClient(cupsd_client_t *con) /* I - Client to encrypt */ gnutls_init(&(conn->session), GNUTLS_SERVER); gnutls_set_default_priority(conn->session); gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials); - gnutls_transport_set_ptr(conn->session, con->http.fd); + gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)con->http.fd); error = gnutls_handshake(conn->session); @@ -2256,6 +2277,23 @@ int /* O - 1 if successful, 0 otherwise */ cupsdSendError(cupsd_client_t *con, /* I - Connection */ http_status_t code) /* I - Error code */ { +#ifdef HAVE_SSL + /* + * Force client to upgrade for authentication if that is how the + * server is configured... + */ + + if (code == HTTP_UNAUTHORIZED && + DefaultEncryption == HTTP_ENCRYPT_REQUIRED && + strcasecmp(con->http.hostname, "localhost") && + !con->http.tls) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendError: Encryption before authentication!"); + code = HTTP_UPGRADE_REQUIRED; + } +#endif /* HAVE_SSL */ + /* * Put the request in the access_log file... */ @@ -2416,12 +2454,20 @@ cupsdSendHeader(cupsd_client_t *con, /* I - Client to send to */ http_status_t code, /* I - HTTP status code */ char *type) /* I - MIME type of document */ { + /* + * Send the HTTP status header... + */ + 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 (code == HTTP_CONTINUE) { + /* + * 100-continue doesn't send any headers... + */ + if (httpPrintf(HTTP(con), "\r\n") < 0) return (0); else @@ -2589,17 +2635,19 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ if (!strncasecmp(buf, "Location:", 9)) cupsdSendHeader(con, HTTP_SEE_OTHER, NULL); else if (!strncasecmp(buf, "Status:", 7)) - cupsdSendHeader(con, atoi(buf + 7), NULL); + cupsdSendError(con, atoi(buf + 7)); else + { cupsdSendHeader(con, HTTP_OK, NULL); - if (con->http.version == HTTP_1_1) - { - con->http.data_encoding = HTTP_ENCODE_CHUNKED; + if (con->http.version == HTTP_1_1) + { + con->http.data_encoding = HTTP_ENCODE_CHUNKED; - if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0) - return (0); - } + if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0) + return (0); + } + } con->sent_header = 1; } @@ -2646,26 +2694,26 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ return (1); } else if (bytes == 0) - { con->http.activity = time(NULL); - return (1); - } } - if (httpWrite2(HTTP(con), buf, bytes) < 0) + if (bytes > 0) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: %d Write of %d bytes failed!", - con->http.fd, bytes); + if (httpWrite2(HTTP(con), buf, bytes) < 0) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdWriteClient: %d Write of %d bytes failed!", + con->http.fd, bytes); - cupsdCloseClient(con); - return (0); - } + cupsdCloseClient(con); + return (0); + } - con->bytes += bytes; + con->bytes += bytes; - if (con->http.state == HTTP_WAITING) - bytes = 0; + if (con->http.state == HTTP_WAITING) + bytes = 0; + } } if (bytes <= 0) @@ -3247,6 +3295,148 @@ is_path_absolute(const char *path) /* I - Input path */ } +#ifdef HAVE_GNUTLS +/* + * 'make_certificate()' - Make a self-signed SSL/TLS certificate. + */ + +static void +make_certificate(void) +{ + 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 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 server key - %s", + gnutls_strerror(result)); + gnutls_x509_privkey_deinit(key); + return; + } + else if ((fp = cupsFileOpen(ServerKey, "w")) != NULL) + { + cupsFileWrite(fp, (char *)buffer, bytes); + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_INFO, "Created server key file \"%s\"...", + ServerKey); + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create server key file \"%s\" - %s", + ServerKey, strerror(errno)); + gnutls_x509_privkey_deinit(key); + return; + } + + /* + * Create the self-signed certificate... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Generating self-signed 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 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 10-year server certificate file \"%s\"...", + ServerCertificate); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create server certificate file \"%s\" - %s", + ServerCertificate, strerror(errno)); + + /* + * Cleanup... + */ + + gnutls_x509_crt_deinit(crt); + gnutls_x509_privkey_deinit(key); +} +#endif /* HAVE_GNUTLS */ + + /* * 'pipe_command()' - Pipe the output of a command to the remote client. */ @@ -3569,5 +3759,5 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ /* - * End of "$Id: client.c 5200 2006-02-28 00:10:32Z mike $". + * End of "$Id: client.c 5225 2006-03-04 12:28:10Z mike $". */ diff --git a/scheduler/conf.c b/scheduler/conf.c index cc8c782b4..ccb02579c 100644 --- a/scheduler/conf.c +++ b/scheduler/conf.c @@ -1,5 +1,5 @@ /* - * "$Id: conf.c 5167 2006-02-25 02:11:44Z mike $" + * "$Id: conf.c 5222 2006-03-03 18:57:56Z mike $" * * Configuration routines for the Common UNIX Printing System (CUPS). * @@ -152,7 +152,6 @@ static cupsd_var_t variables[] = { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING }, { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING }, { "RIPCache", &RIPCache, CUPSD_VARTYPE_STRING }, - { "RunAsUser", &RunAsUser, CUPSD_VARTYPE_BOOLEAN }, { "RootCertDuration", &RootCertDuration, CUPSD_VARTYPE_INTEGER }, { "ServerAdmin", &ServerAdmin, CUPSD_VARTYPE_STRING }, { "ServerBin", &ServerBin, CUPSD_VARTYPE_STRING }, @@ -363,6 +362,9 @@ cupsdReadConfiguration(void) ConfigFilePerm = CUPS_DEFAULT_CONFIG_FILE_PERM; DefaultAuthType = AUTH_BASIC; +#ifdef HAVE_SSL + DefaultEncryption = HTTP_ENCRYPT_REQUIRED; +#endif /* HAVE_SSL */ JobRetryLimit = 5; JobRetryInterval = 300; FileDevice = FALSE; @@ -385,7 +387,6 @@ cupsdReadConfiguration(void) MaxRequestSize = 0; ReloadTimeout = 60; RootCertDuration = 300; - RunAsUser = FALSE; Timeout = DEFAULT_TIMEOUT; NumSystemGroups = 0; @@ -446,10 +447,7 @@ cupsdReadConfiguration(void) if (!status) return (0); - if (RunAsUser) - RunUser = User; - else - RunUser = getuid(); + RunUser = getuid(); /* * Use the default system group if none was supplied in cupsd.conf... @@ -2672,6 +2670,28 @@ read_configuration(cups_file_t *fp) /* I - File to read from */ return (0); } } +#ifdef HAVE_SSL + else if (!strcasecmp(line, "DefaultEncryption")) + { + /* + * DefaultEncryption {Never,IfRequested,Required} + */ + + if (!value || !strcasecmp(value, "never")) + DefaultEncryption = HTTP_ENCRYPT_NEVER; + else if (!strcasecmp(value, "required")) + DefaultEncryption = HTTP_ENCRYPT_REQUIRED; + else if (!strcasecmp(value, "ifrequested")) + DefaultEncryption = HTTP_ENCRYPT_IF_REQUESTED; + else + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown default encryption %s on line %d.", + value, linenum); + return (0); + } + } +#endif /* HAVE_SSL */ else if (!strcasecmp(line, "User")) { /* @@ -3217,5 +3237,5 @@ read_policy(cups_file_t *fp, /* I - Configuration file */ /* - * End of "$Id: conf.c 5167 2006-02-25 02:11:44Z mike $". + * End of "$Id: conf.c 5222 2006-03-03 18:57:56Z mike $". */ diff --git a/scheduler/conf.h b/scheduler/conf.h index ee151148c..7b6eea95c 100644 --- a/scheduler/conf.h +++ b/scheduler/conf.h @@ -1,5 +1,5 @@ /* - * "$Id: conf.h 5200 2006-02-28 00:10:32Z mike $" + * "$Id: conf.h 5216 2006-03-02 17:47:53Z mike $" * * Configuration file definitions for the Common UNIX Printing System (CUPS) * scheduler. @@ -160,8 +160,6 @@ VAR int ClassifyOverride VALUE(0), /* Timeout before reload from SIGHUP */ RootCertDuration VALUE(300), /* Root certificate update interval */ - RunAsUser VALUE(FALSE), - /* Run as unpriviledged user? */ RunUser, /* User to run as, used for files */ PrintcapFormat VALUE(PRINTCAP_BSD), /* Format of printcap file? */ @@ -212,5 +210,5 @@ extern int cupsdLogPage(cupsd_job_t *job, const char *page); /* - * End of "$Id: conf.h 5200 2006-02-28 00:10:32Z mike $". + * End of "$Id: conf.h 5216 2006-03-02 17:47:53Z mike $". */ diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c index eda350c52..e5b546050 100644 --- a/scheduler/cups-lpd.c +++ b/scheduler/cups-lpd.c @@ -1,5 +1,5 @@ /* - * "$Id: cups-lpd.c 5196 2006-02-27 21:23:00Z mike $" + * "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $" * * Line Printer Daemon interface for the Common UNIX Printing System (CUPS). * @@ -732,8 +732,6 @@ get_printer(http_t *http, /* I - HTTP connection */ CFRelease(plist); } - - CFRelease(prefsok); } CFRelease(prefsurl); @@ -1708,5 +1706,5 @@ smart_gets(char *s, /* I - Pointer to line buffer */ /* - * End of "$Id: cups-lpd.c 5196 2006-02-27 21:23:00Z mike $". + * End of "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $". */ diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c index f4c72b9ec..9cb76dfd4 100644 --- a/scheduler/dirsvc.c +++ b/scheduler/dirsvc.c @@ -1,5 +1,5 @@ /* - * "$Id: dirsvc.c 5178 2006-02-26 00:24:23Z mike $" + * "$Id: dirsvc.c 5223 2006-03-04 01:10:17Z mike $" * * Directory services routines for the Common UNIX Printing System (CUPS). * @@ -641,10 +641,11 @@ cupsdSendBrowseDelete( cupsd_printer_t *p) /* I - Printer to delete */ { /* - * Only announce if browsing is enabled... + * Only announce if browsing is enabled and this is a local queue... */ - if (!Browsing || !p->shared) + if (!Browsing || !p->shared || + (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) return; /* @@ -843,8 +844,8 @@ cupsdSendCUPSBrowse(cupsd_printer_t *p) /* I - Printer to send */ * printer-make-and-model attributes... */ - dequote(location, p->location, sizeof(p->location)); - dequote(info, p->info, sizeof(p->info)); + dequote(location, p->location, sizeof(location)); + dequote(info, p->info, sizeof(info)); dequote(make_model, p->make_model ? p->make_model : "Unknown", sizeof(make_model)); @@ -3110,5 +3111,5 @@ slp_url_callback( /* - * End of "$Id: dirsvc.c 5178 2006-02-26 00:24:23Z mike $". + * End of "$Id: dirsvc.c 5223 2006-03-04 01:10:17Z mike $". */ diff --git a/scheduler/main.c b/scheduler/main.c index 018fba69a..b0b581cde 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -1,5 +1,5 @@ /* - * "$Id: main.c 5157 2006-02-23 20:58:57Z mike $" + * "$Id: main.c 5216 2006-03-02 17:47:53Z mike $" * * Scheduler main loop for the Common UNIX Printing System (CUPS). * @@ -428,11 +428,7 @@ main(int argc, /* I - Number of command-line args */ */ #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - if (RunAsUser) - sigset(SIGHUP, sigterm_handler); - else - sigset(SIGHUP, sighup_handler); - + sigset(SIGHUP, sighup_handler); sigset(SIGPIPE, SIG_IGN); sigset(SIGTERM, sigterm_handler); #elif defined(HAVE_SIGACTION) @@ -440,12 +436,7 @@ main(int argc, /* I - Number of command-line args */ sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGHUP); - - if (RunAsUser) - action.sa_handler = sigterm_handler; - else - action.sa_handler = sighup_handler; - + action.sa_handler = sighup_handler; sigaction(SIGHUP, &action, NULL); sigemptyset(&action.sa_mask); @@ -458,11 +449,7 @@ main(int argc, /* I - Number of command-line args */ action.sa_handler = sigterm_handler; sigaction(SIGTERM, &action, NULL); #else - if (RunAsUser) - signal(SIGHUP, sigterm_handler); - else - signal(SIGHUP, sighup_handler); - + signal(SIGHUP, sighup_handler); signal(SIGPIPE, SIG_IGN); signal(SIGTERM, sigterm_handler); #endif /* HAVE_SIGSET */ @@ -520,18 +507,6 @@ main(int argc, /* I - Number of command-line args */ cupsdStartSystemMonitor(); - /* - * If the administrator has configured the server to run as an unpriviledged - * user, change to that user now... - */ - - if (RunAsUser) - { - setgid(Group); - setgroups(1, &Group); - setuid(User); - } - /* * Catch signals... */ @@ -2338,5 +2313,5 @@ usage(int status) /* O - Exit status */ /* - * End of "$Id: main.c 5157 2006-02-23 20:58:57Z mike $". + * End of "$Id: main.c 5216 2006-03-02 17:47:53Z mike $". */ diff --git a/standards/rfc4122.txt b/standards/rfc4122.txt new file mode 100644 index 000000000..31ceaab4b --- /dev/null +++ b/standards/rfc4122.txt @@ -0,0 +1,1795 @@ + + + + + + +Network Working Group P. Leach +Request for Comments: 4122 Microsoft +Category: Standards Track M. Mealling + Refactored Networks, LLC + R. Salz + DataPower Technology, Inc. + July 2005 + + + A Universally Unique IDentifier (UUID) URN Namespace + +Status of This Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2005). + +Abstract + + This specification defines a Uniform Resource Name namespace for + UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally + Unique IDentifier). A UUID is 128 bits long, and can guarantee + uniqueness across space and time. UUIDs were originally used in the + Apollo Network Computing System and later in the Open Software + Foundation's (OSF) Distributed Computing Environment (DCE), and then + in Microsoft Windows platforms. + + This specification is derived from the DCE specification with the + kind permission of the OSF (now known as The Open Group). + Information from earlier versions of the DCE specification have been + incorporated into this document. + + + + + + + + + + + + + + +Leach, et al. Standards Track [Page 1] + +RFC 4122 A UUID URN Namespace July 2005 + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 3. Namespace Registration Template . . . . . . . . . . . . . . . 3 + 4. Specification . . . . . . . . . . . . . . . . . . . . . . . . 5 + 4.1. Format. . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 4.1.1. Variant. . . . . . . . . . . . . . . . . . . . . . 6 + 4.1.2. Layout and Byte Order. . . . . . . . . . . . . . . 6 + 4.1.3. Version. . . . . . . . . . . . . . . . . . . . . . 7 + 4.1.4. Timestamp. . . . . . . . . . . . . . . . . . . . . 8 + 4.1.5. Clock Sequence . . . . . . . . . . . . . . . . . . 8 + 4.1.6. Node . . . . . . . . . . . . . . . . . . . . . . . 9 + 4.1.7. Nil UUID . . . . . . . . . . . . . . . . . . . . . 9 + 4.2. Algorithms for Creating a Time-Based UUID . . . . . . . . 9 + 4.2.1. Basic Algorithm. . . . . . . . . . . . . . . . . . 10 + 4.2.2. Generation Details . . . . . . . . . . . . . . . . 12 + 4.3. Algorithm for Creating a Name-Based UUID. . . . . . . . . 13 + 4.4. Algorithms for Creating a UUID from Truly Random or + Pseudo-Random Numbers . . . . . . . . . . . . . . . . . . 14 + 4.5. Node IDs that Do Not Identify the Host. . . . . . . . . . 15 + 5. Community Considerations . . . . . . . . . . . . . . . . . . . 15 + 6. Security Considerations . . . . . . . . . . . . . . . . . . . 16 + 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 16 + 8. Normative References . . . . . . . . . . . . . . . . . . . . . 16 + A. Appendix A - Sample Implementation . . . . . . . . . . . . . . 18 + B. Appendix B - Sample Output of utest . . . . . . . . . . . . . 29 + C. Appendix C - Some Name Space IDs . . . . . . . . . . . . . . . 30 + +1. Introduction + + This specification defines a Uniform Resource Name namespace for + UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally + Unique IDentifier). A UUID is 128 bits long, and requires no central + registration process. + + The information here is meant to be a concise guide for those wishing + to implement services using UUIDs as URNs. Nothing in this document + should be construed to override the DCE standards that defined UUIDs. + + There is an ITU-T Recommendation and ISO/IEC Standard [3] that are + derived from earlier versions of this document. Both sets of + specifications have been aligned, and are fully technically + compatible. In addition, a global registration function is being + provided by the Telecommunications Standardisation Bureau of ITU-T; + for details see . + + + + + +Leach, et al. Standards Track [Page 2] + +RFC 4122 A UUID URN Namespace July 2005 + + +2. Motivation + + One of the main reasons for using UUIDs is that no centralized + authority is required to administer them (although one format uses + IEEE 802 node identifiers, others do not). As a result, generation + on demand can be completely automated, and used for a variety of + purposes. The UUID generation algorithm described here supports very + high allocation rates of up to 10 million per second per machine if + necessary, so that they could even be used as transaction IDs. + + UUIDs are of a fixed size (128 bits) which is reasonably small + compared to other alternatives. This lends itself well to sorting, + ordering, and hashing of all sorts, storing in databases, simple + allocation, and ease of programming in general. + + Since UUIDs are unique and persistent, they make excellent Uniform + Resource Names. The unique ability to generate a new UUID without a + registration process allows for UUIDs to be one of the URNs with the + lowest minting cost. + +3. Namespace Registration Template + + Namespace ID: UUID + Registration Information: + Registration date: 2003-10-01 + + Declared registrant of the namespace: + JTC 1/SC6 (ASN.1 Rapporteur Group) + + Declaration of syntactic structure: + A UUID is an identifier that is unique across both space and time, + with respect to the space of all UUIDs. Since a UUID is a fixed + size and contains a time field, it is possible for values to + rollover (around A.D. 3400, depending on the specific algorithm + used). A UUID can be used for multiple purposes, from tagging + objects with an extremely short lifetime, to reliably identifying + very persistent objects across a network. + + The internal representation of a UUID is a specific sequence of + bits in memory, as described in Section 4. To accurately + represent a UUID as a URN, it is necessary to convert the bit + sequence to a string representation. + + Each field is treated as an integer and has its value printed as a + zero-filled hexadecimal digit string with the most significant + digit first. The hexadecimal values "a" through "f" are output as + lower case characters and are case insensitive on input. + + + + +Leach, et al. Standards Track [Page 3] + +RFC 4122 A UUID URN Namespace July 2005 + + + The formal definition of the UUID string representation is + provided by the following ABNF [7]: + + UUID = time-low "-" time-mid "-" + time-high-and-version "-" + clock-seq-and-reserved + clock-seq-low "-" node + time-low = 4hexOctet + time-mid = 2hexOctet + time-high-and-version = 2hexOctet + clock-seq-and-reserved = hexOctet + clock-seq-low = hexOctet + node = 6hexOctet + hexOctet = hexDigit hexDigit + hexDigit = + "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / + "a" / "b" / "c" / "d" / "e" / "f" / + "A" / "B" / "C" / "D" / "E" / "F" + + The following is an example of the string representation of a UUID as + a URN: + + urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + + Relevant ancillary documentation: + [1][2] + Identifier uniqueness considerations: + This document specifies three algorithms to generate UUIDs: the + first leverages the unique values of 802 MAC addresses to + guarantee uniqueness, the second uses pseudo-random number + generators, and the third uses cryptographic hashing and + application-provided text strings. As a result, the UUIDs + generated according to the mechanisms here will be unique from all + other UUIDs that have been or will be assigned. + + Identifier persistence considerations: + UUIDs are inherently very difficult to resolve in a global sense. + This, coupled with the fact that UUIDs are temporally unique + within their spatial context, ensures that UUIDs will remain as + persistent as possible. + + Process of identifier assignment: + Generating a UUID does not require that a registration authority + be contacted. One algorithm requires a unique value over space + for each generator. This value is typically an IEEE 802 MAC + address, usually already available on network-connected hosts. + The address can be assigned from an address block obtained from + the IEEE registration authority. If no such address is available, + + + +Leach, et al. Standards Track [Page 4] + +RFC 4122 A UUID URN Namespace July 2005 + + + or privacy concerns make its use undesirable, Section 4.5 + specifies two alternatives. Another approach is to use version 3 + or version 4 UUIDs as defined below. + + Process for identifier resolution: + Since UUIDs are not globally resolvable, this is not applicable. + + Rules for Lexical Equivalence: + Consider each field of the UUID to be an unsigned integer as shown + in the table in section Section 4.1.2. Then, to compare a pair of + UUIDs, arithmetically compare the corresponding fields from each + UUID in order of significance and according to their data type. + Two UUIDs are equal if and only if all the corresponding fields + are equal. + + As an implementation note, equality comparison can be performed on + many systems by doing the appropriate byte-order canonicalization, + and then treating the two UUIDs as 128-bit unsigned integers. + + UUIDs, as defined in this document, can also be ordered + lexicographically. For a pair of UUIDs, the first one follows the + second if the most significant field in which the UUIDs differ is + greater for the first UUID. The second precedes the first if the + most significant field in which the UUIDs differ is greater for + the second UUID. + + Conformance with URN Syntax: + The string representation of a UUID is fully compatible with the + URN syntax. When converting from a bit-oriented, in-memory + representation of a UUID into a URN, care must be taken to + strictly adhere to the byte order issues mentioned in the string + representation section. + + Validation mechanism: + Apart from determining whether the timestamp portion of the UUID + is in the future and therefore not yet assignable, there is no + mechanism for determining whether a UUID is 'valid'. + + Scope: + UUIDs are global in scope. + +4. Specification + +4.1. Format + + The UUID format is 16 octets; some bits of the eight octet variant + field specified below determine finer structure. + + + + +Leach, et al. Standards Track [Page 5] + +RFC 4122 A UUID URN Namespace July 2005 + + +4.1.1. Variant + + The variant field determines the layout of the UUID. That is, the + interpretation of all other bits in the UUID depends on the setting + of the bits in the variant field. As such, it could more accurately + be called a type field; we retain the original term for + compatibility. The variant field consists of a variable number of + the most significant bits of octet 8 of the UUID. + + The following table lists the contents of the variant field, where + the letter "x" indicates a "don't-care" value. + + Msb0 Msb1 Msb2 Description + + 0 x x Reserved, NCS backward compatibility. + + 1 0 x The variant specified in this document. + + 1 1 0 Reserved, Microsoft Corporation backward + compatibility + + 1 1 1 Reserved for future definition. + + Interoperability, in any form, with variants other than the one + defined here is not guaranteed, and is not likely to be an issue in + practice. + +4.1.2. Layout and Byte Order + + To minimize confusion about bit assignments within octets, the UUID + record definition is defined only in terms of fields that are + integral numbers of octets. The fields are presented with the most + significant one first. + + Field Data Type Octet Note + # + + time_low unsigned 32 0-3 The low field of the + bit integer timestamp + + time_mid unsigned 16 4-5 The middle field of the + bit integer timestamp + + time_hi_and_version unsigned 16 6-7 The high field of the + bit integer timestamp multiplexed + with the version number + + + + + +Leach, et al. Standards Track [Page 6] + +RFC 4122 A UUID URN Namespace July 2005 + + + clock_seq_hi_and_rese unsigned 8 8 The high field of the + rved bit integer clock sequence + multiplexed with the + variant + + clock_seq_low unsigned 8 9 The low field of the + bit integer clock sequence + + node unsigned 48 10-15 The spatially unique + bit integer node identifier + + In the absence of explicit application or presentation protocol + specification to the contrary, a UUID is encoded as a 128-bit object, + as follows: + + The fields are encoded as 16 octets, with the sizes and order of the + fields defined above, and with each field encoded with the Most + Significant Byte first (known as network byte order). Note that the + field names, particularly for multiplexed fields, follow historical + practice. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_low | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | time_mid | time_hi_and_version | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |clk_seq_hi_res | clk_seq_low | node (0-1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | node (2-5) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +4.1.3. Version + + The version number is in the most significant 4 bits of the time + stamp (bits 4 through 7 of the time_hi_and_version field). + + The following table lists the currently-defined versions for this + UUID variant. + + Msb0 Msb1 Msb2 Msb3 Version Description + + 0 0 0 1 1 The time-based version + specified in this document. + + 0 0 1 0 2 DCE Security version, with + embedded POSIX UIDs. + + + +Leach, et al. Standards Track [Page 7] + +RFC 4122 A UUID URN Namespace July 2005 + + + 0 0 1 1 3 The name-based version + specified in this document + that uses MD5 hashing. + + 0 1 0 0 4 The randomly or pseudo- + randomly generated version + specified in this document. + + 0 1 0 1 5 The name-based version + specified in this document + that uses SHA-1 hashing. + + The version is more accurately a sub-type; again, we retain the term + for compatibility. + +4.1.4. Timestamp + + The timestamp is a 60-bit value. For UUID version 1, this is + represented by Coordinated Universal Time (UTC) as a count of 100- + nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of + Gregorian reform to the Christian calendar). + + For systems that do not have UTC available, but do have the local + time, they may use that instead of UTC, as long as they do so + consistently throughout the system. However, this is not recommended + since generating the UTC from local time only needs a time zone + offset. + + For UUID version 3 or 5, the timestamp is a 60-bit value constructed + from a name as described in Section 4.3. + + For UUID version 4, the timestamp is a randomly or pseudo-randomly + generated 60-bit value, as described in Section 4.4. + +4.1.5. Clock Sequence + + For UUID version 1, the clock sequence is used to help avoid + duplicates that could arise when the clock is set backwards in time + or if the node ID changes. + + If the clock is set backwards, or might have been set backwards + (e.g., while the system was powered off), and the UUID generator can + not be sure that no UUIDs were generated with timestamps larger than + the value to which the clock was set, then the clock sequence has to + be changed. If the previous value of the clock sequence is known, it + can just be incremented; otherwise it should be set to a random or + high-quality pseudo-random value. + + + + +Leach, et al. Standards Track [Page 8] + +RFC 4122 A UUID URN Namespace July 2005 + + + Similarly, if the node ID changes (e.g., because a network card has + been moved between machines), setting the clock sequence to a random + number minimizes the probability of a duplicate due to slight + differences in the clock settings of the machines. If the value of + clock sequence associated with the changed node ID were known, then + the clock sequence could just be incremented, but that is unlikely. + + The clock sequence MUST be originally (i.e., once in the lifetime of + a system) initialized to a random number to minimize the correlation + across systems. This provides maximum protection against node + identifiers that may move or switch from system to system rapidly. + The initial value MUST NOT be correlated to the node identifier. + + For UUID version 3 or 5, the clock sequence is a 14-bit value + constructed from a name as described in Section 4.3. + + For UUID version 4, clock sequence is a randomly or pseudo-randomly + generated 14-bit value as described in Section 4.4. + +4.1.6. Node + + For UUID version 1, the node field consists of an IEEE 802 MAC + address, usually the host address. For systems with multiple IEEE + 802 addresses, any available one can be used. The lowest addressed + octet (octet number 10) contains the global/local bit and the + unicast/multicast bit, and is the first octet of the address + transmitted on an 802.3 LAN. + + For systems with no IEEE address, a randomly or pseudo-randomly + generated value may be used; see Section 4.5. The multicast bit must + be set in such addresses, in order that they will never conflict with + addresses obtained from network cards. + + For UUID version 3 or 5, the node field is a 48-bit value constructed + from a name as described in Section 4.3. + + For UUID version 4, the node field is a randomly or pseudo-randomly + generated 48-bit value as described in Section 4.4. + +4.1.7. Nil UUID + + The nil UUID is special form of UUID that is specified to have all + 128 bits set to zero. + +4.2. Algorithms for Creating a Time-Based UUID + + Various aspects of the algorithm for creating a version 1 UUID are + discussed in the following sections. + + + +Leach, et al. Standards Track [Page 9] + +RFC 4122 A UUID URN Namespace July 2005 + + +4.2.1. Basic Algorithm + + The following algorithm is simple, correct, and inefficient: + + o Obtain a system-wide global lock + + o From a system-wide shared stable store (e.g., a file), read the + UUID generator state: the values of the timestamp, clock sequence, + and node ID used to generate the last UUID. + + o Get the current time as a 60-bit count of 100-nanosecond intervals + since 00:00:00.00, 15 October 1582. + + o Get the current node ID. + + o If the state was unavailable (e.g., non-existent or corrupted), or + the saved node ID is different than the current node ID, generate + a random clock sequence value. + + o If the state was available, but the saved timestamp is later than + the current timestamp, increment the clock sequence value. + + o Save the state (current timestamp, clock sequence, and node ID) + back to the stable store. + + o Release the global lock. + + o Format a UUID from the current timestamp, clock sequence, and node + ID values according to the steps in Section 4.2.2. + + If UUIDs do not need to be frequently generated, the above algorithm + may be perfectly adequate. For higher performance requirements, + however, issues with the basic algorithm include: + + o Reading the state from stable storage each time is inefficient. + + o The resolution of the system clock may not be 100-nanoseconds. + + o Writing the state to stable storage each time is inefficient. + + o Sharing the state across process boundaries may be inefficient. + + Each of these issues can be addressed in a modular fashion by local + improvements in the functions that read and write the state and read + the clock. We address each of them in turn in the following + sections. + + + + + +Leach, et al. Standards Track [Page 10] + +RFC 4122 A UUID URN Namespace July 2005 + + +4.2.1.1. Reading Stable Storage + + The state only needs to be read from stable storage once at boot + time, if it is read into a system-wide shared volatile store (and + updated whenever the stable store is updated). + + If an implementation does not have any stable store available, then + it can always say that the values were unavailable. This is the + least desirable implementation because it will increase the frequency + of creation of new clock sequence numbers, which increases the + probability of duplicates. + + If the node ID can never change (e.g., the net card is inseparable + from the system), or if any change also reinitializes the clock + sequence to a random value, then instead of keeping it in stable + store, the current node ID may be returned. + +4.2.1.2. System Clock Resolution + + The timestamp is generated from the system time, whose resolution may + be less than the resolution of the UUID timestamp. + + If UUIDs do not need to be frequently generated, the timestamp can + simply be the system time multiplied by the number of 100-nanosecond + intervals per system time interval. + + If a system overruns the generator by requesting too many UUIDs + within a single system time interval, the UUID service MUST either + return an error, or stall the UUID generator until the system clock + catches up. + + A high resolution timestamp can be simulated by keeping a count of + the number of UUIDs that have been generated with the same value of + the system time, and using it to construct the low order bits of the + timestamp. The count will range between zero and the number of + 100-nanosecond intervals per system time interval. + + Note: If the processors overrun the UUID generation frequently, + additional node identifiers can be allocated to the system, which + will permit higher speed allocation by making multiple UUIDs + potentially available for each time stamp value. + +4.2.1.3. Writing Stable Storage + + The state does not always need to be written to stable store every + time a UUID is generated. The timestamp in the stable store can be + periodically set to a value larger than any yet used in a UUID. As + long as the generated UUIDs have timestamps less than that value, and + + + +Leach, et al. Standards Track [Page 11] + +RFC 4122 A UUID URN Namespace July 2005 + + + the clock sequence and node ID remain unchanged, only the shared + volatile copy of the state needs to be updated. Furthermore, if the + timestamp value in stable store is in the future by less than the + typical time it takes the system to reboot, a crash will not cause a + reinitialization of the clock sequence. + +4.2.1.4. Sharing State Across Processes + + If it is too expensive to access shared state each time a UUID is + generated, then the system-wide generator can be implemented to + allocate a block of time stamps each time it is called; a per- + process generator can allocate from that block until it is exhausted. + +4.2.2. Generation Details + + Version 1 UUIDs are generated according to the following algorithm: + + o Determine the values for the UTC-based timestamp and clock + sequence to be used in the UUID, as described in Section 4.2.1. + + o For the purposes of this algorithm, consider the timestamp to be a + 60-bit unsigned integer and the clock sequence to be a 14-bit + unsigned integer. Sequentially number the bits in a field, + starting with zero for the least significant bit. + + o Set the time_low field equal to the least significant 32 bits + (bits zero through 31) of the timestamp in the same order of + significance. + + o Set the time_mid field equal to bits 32 through 47 from the + timestamp in the same order of significance. + + o Set the 12 least significant bits (bits zero through 11) of the + time_hi_and_version field equal to bits 48 through 59 from the + timestamp in the same order of significance. + + o Set the four most significant bits (bits 12 through 15) of the + time_hi_and_version field to the 4-bit version number + corresponding to the UUID version being created, as shown in the + table above. + + o Set the clock_seq_low field to the eight least significant bits + (bits zero through 7) of the clock sequence in the same order of + significance. + + + + + + + +Leach, et al. Standards Track [Page 12] + +RFC 4122 A UUID URN Namespace July 2005 + + + o Set the 6 least significant bits (bits zero through 5) of the + clock_seq_hi_and_reserved field to the 6 most significant bits + (bits 8 through 13) of the clock sequence in the same order of + significance. + + o Set the two most significant bits (bits 6 and 7) of the + clock_seq_hi_and_reserved to zero and one, respectively. + + o Set the node field to the 48-bit IEEE address in the same order of + significance as the address. + +4.3. Algorithm for Creating a Name-Based UUID + + The version 3 or 5 UUID is meant for generating UUIDs from "names" + that are drawn from, and unique within, some "name space". The + concept of name and name space should be broadly construed, and not + limited to textual names. For example, some name spaces are the + domain name system, URLs, ISO Object IDs (OIDs), X.500 Distinguished + Names (DNs), and reserved words in a programming language. The + mechanisms or conventions used for allocating names and ensuring + their uniqueness within their name spaces are beyond the scope of + this specification. + + The requirements for these types of UUIDs are as follows: + + o The UUIDs generated at different times from the same name in the + same namespace MUST be equal. + + o The UUIDs generated from two different names in the same namespace + should be different (with very high probability). + + o The UUIDs generated from the same name in two different namespaces + should be different with (very high probability). + + o If two UUIDs that were generated from names are equal, then they + were generated from the same name in the same namespace (with very + high probability). + + The algorithm for generating a UUID from a name and a name space are + as follows: + + o Allocate a UUID to use as a "name space ID" for all UUIDs + generated from names in that name space; see Appendix C for some + pre-defined values. + + o Choose either MD5 [4] or SHA-1 [8] as the hash algorithm; If + backward compatibility is not an issue, SHA-1 is preferred. + + + + +Leach, et al. Standards Track [Page 13] + +RFC 4122 A UUID URN Namespace July 2005 + + + o Convert the name to a canonical sequence of octets (as defined by + the standards or conventions of its name space); put the name + space ID in network byte order. + + o Compute the hash of the name space ID concatenated with the name. + + o Set octets zero through 3 of the time_low field to octets zero + through 3 of the hash. + + o Set octets zero and one of the time_mid field to octets 4 and 5 of + the hash. + + o Set octets zero and one of the time_hi_and_version field to octets + 6 and 7 of the hash. + + o Set the four most significant bits (bits 12 through 15) of the + time_hi_and_version field to the appropriate 4-bit version number + from Section 4.1.3. + + o Set the clock_seq_hi_and_reserved field to octet 8 of the hash. + + o Set the two most significant bits (bits 6 and 7) of the + clock_seq_hi_and_reserved to zero and one, respectively. + + o Set the clock_seq_low field to octet 9 of the hash. + + o Set octets zero through five of the node field to octets 10 + through 15 of the hash. + + o Convert the resulting UUID to local byte order. + +4.4. Algorithms for Creating a UUID from Truly Random or + Pseudo-Random Numbers + + The version 4 UUID is meant for generating UUIDs from truly-random or + pseudo-random numbers. + + The algorithm is as follows: + + o Set the two most significant bits (bits 6 and 7) of the + clock_seq_hi_and_reserved to zero and one, respectively. + + o Set the four most significant bits (bits 12 through 15) of the + time_hi_and_version field to the 4-bit version number from + Section 4.1.3. + + o Set all the other bits to randomly (or pseudo-randomly) chosen + values. + + + +Leach, et al. Standards Track [Page 14] + +RFC 4122 A UUID URN Namespace July 2005 + + + See Section 4.5 for a discussion on random numbers. + +4.5. Node IDs that Do Not Identify the Host + + This section describes how to generate a version 1 UUID if an IEEE + 802 address is not available, or its use is not desired. + + One approach is to contact the IEEE and get a separate block of + addresses. At the time of writing, the application could be found at + , and the cost + was US$550. + + A better solution is to obtain a 47-bit cryptographic quality random + number and use it as the low 47 bits of the node ID, with the least + significant bit of the first octet of the node ID set to one. This + bit is the unicast/multicast bit, which will never be set in IEEE 802 + addresses obtained from network cards. Hence, there can never be a + conflict between UUIDs generated by machines with and without network + cards. (Recall that the IEEE 802 spec talks about transmission + order, which is the opposite of the in-memory representation that is + discussed in this document.) + + For compatibility with earlier specifications, note that this + document uses the unicast/multicast bit, instead of the arguably more + correct local/global bit. + + Advice on generating cryptographic-quality random numbers can be + found in RFC1750 [5]. + + In addition, items such as the computer's name and the name of the + operating system, while not strictly speaking random, will help + differentiate the results from those obtained by other systems. + + The exact algorithm to generate a node ID using these data is system + specific, because both the data available and the functions to obtain + them are often very system specific. A generic approach, however, is + to accumulate as many sources as possible into a buffer, use a + message digest such as MD5 [4] or SHA-1 [8], take an arbitrary 6 + bytes from the hash value, and set the multicast bit as described + above. + +5. Community Considerations + + The use of UUIDs is extremely pervasive in computing. They comprise + the core identifier infrastructure for many operating systems + (Microsoft Windows) and applications (the Mozilla browser) and in + many cases, become exposed to the Web in many non-standard ways. + + + + +Leach, et al. Standards Track [Page 15] + +RFC 4122 A UUID URN Namespace July 2005 + + + This specification attempts to standardize that practice as openly as + possible and in a way that attempts to benefit the entire Internet. + +6. Security Considerations + + Do not assume that UUIDs are hard to guess; they should not be used + as security capabilities (identifiers whose mere possession grants + access), for example. A predictable random number source will + exacerbate the situation. + + Do not assume that it is easy to determine if a UUID has been + slightly transposed in order to redirect a reference to another + object. Humans do not have the ability to easily check the integrity + of a UUID by simply glancing at it. + + Distributed applications generating UUIDs at a variety of hosts must + be willing to rely on the random number source at all hosts. If this + is not feasible, the namespace variant should be used. + +7. Acknowledgments + + This document draws heavily on the OSF DCE specification for UUIDs. + Ted Ts'o provided helpful comments, especially on the byte ordering + section which we mostly plagiarized from a proposed wording he + supplied (all errors in that section are our responsibility, + however). + + We are also grateful to the careful reading and bit-twiddling of Ralf + S. Engelschall, John Larmouth, and Paul Thorpe. Professor Larmouth + was also invaluable in achieving coordination with ISO/IEC. + +8. Normative References + + [1] Zahn, L., Dineen, T., and P. Leach, "Network Computing + Architecture", ISBN 0-13-611674-4, January 1990. + + [2] "DCE: Remote Procedure Call", Open Group CAE Specification C309, + ISBN 1-85912-041-5, August 1994. + + [3] ISO/IEC 9834-8:2004 Information Technology, "Procedures for the + operation of OSI Registration Authorities: Generation and + registration of Universally Unique Identifiers (UUIDs) and their + use as ASN.1 Object Identifier components" ITU-T Rec. X.667, + 2004. + + [4] Rivest, R., "The MD5 Message-Digest Algorithm ", RFC 1321, April + 1992. + + + + +Leach, et al. Standards Track [Page 16] + +RFC 4122 A UUID URN Namespace July 2005 + + + [5] Eastlake, D., 3rd, Schiller, J., and S. Crocker, "Randomness + Requirements for Security", BCP 106, RFC 4086, June 2005. + + [6] Moats, R., "URN Syntax", RFC 2141, May 1997. + + [7] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 2234, November 1997. + + [8] National Institute of Standards and Technology, "Secure Hash + Standard", FIPS PUB 180-1, April 1995, + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Leach, et al. Standards Track [Page 17] + +RFC 4122 A UUID URN Namespace July 2005 + + +Appendix A. Appendix A - Sample Implementation + + This implementation consists of 5 files: uuid.h, uuid.c, sysdep.h, + sysdep.c and utest.c. The uuid.* files are the system independent + implementation of the UUID generation algorithms described above, + with all the optimizations described above except efficient state + sharing across processes included. The code has been tested on Linux + (Red Hat 4.0) with GCC (2.7.2), and Windows NT 4.0 with VC++ 5.0. + The code assumes 64-bit integer support, which makes it much clearer. + + All the following source files should have the following copyright + notice included: + +copyrt.h + +/* +** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & +** Digital Equipment Corporation, Maynard, Mass. +** Copyright (c) 1998 Microsoft. +** To anyone who acknowledges that this file is provided "AS IS" +** without any express or implied warranty: permission to use, copy, +** modify, and distribute this file for any purpose is hereby +** granted without fee, provided that the above copyright notices and +** this notice appears in all source code copies, and that none of +** the names of Open Software Foundation, Inc., Hewlett-Packard +** Company, Microsoft, or Digital Equipment Corporation be used in +** advertising or publicity pertaining to distribution of the software +** without specific, written prior permission. Neither Open Software +** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital +** Equipment Corporation makes any representations about the +** suitability of this software for any purpose. +*/ + + +uuid.h + +#include "copyrt.h" +#undef uuid_t +typedef struct { + unsigned32 time_low; + unsigned16 time_mid; + unsigned16 time_hi_and_version; + unsigned8 clock_seq_hi_and_reserved; + unsigned8 clock_seq_low; + byte node[6]; +} uuid_t; + + + + +Leach, et al. Standards Track [Page 18] + +RFC 4122 A UUID URN Namespace July 2005 + + +/* uuid_create -- generate a UUID */ +int uuid_create(uuid_t * uuid); + +/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a + "name" from a "name space" */ +void uuid_create_md5_from_name( + uuid_t *uuid, /* resulting UUID */ + uuid_t nsid, /* UUID of the namespace */ + void *name, /* the name from which to generate a UUID */ + int namelen /* the length of the name */ +); + +/* uuid_create_sha1_from_name -- create a version 5 (SHA-1) UUID + using a "name" from a "name space" */ +void uuid_create_sha1_from_name( + + uuid_t *uuid, /* resulting UUID */ + uuid_t nsid, /* UUID of the namespace */ + void *name, /* the name from which to generate a UUID */ + int namelen /* the length of the name */ +); + +/* uuid_compare -- Compare two UUID's "lexically" and return + -1 u1 is lexically before u2 + 0 u1 is equal to u2 + 1 u1 is lexically after u2 + Note that lexical ordering is not temporal ordering! +*/ +int uuid_compare(uuid_t *u1, uuid_t *u2); + + +uuid.c + +#include "copyrt.h" +#include +#include +#include +#include +#include "sysdep.h" +#include "uuid.h" + +/* various forward declarations */ +static int read_state(unsigned16 *clockseq, uuid_time_t *timestamp, + uuid_node_t *node); +static void write_state(unsigned16 clockseq, uuid_time_t timestamp, + uuid_node_t node); +static void format_uuid_v1(uuid_t *uuid, unsigned16 clockseq, + uuid_time_t timestamp, uuid_node_t node); + + + +Leach, et al. Standards Track [Page 19] + +RFC 4122 A UUID URN Namespace July 2005 + + +static void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], + int v); +static void get_current_time(uuid_time_t *timestamp); +static unsigned16 true_random(void); + +/* uuid_create -- generator a UUID */ +int uuid_create(uuid_t *uuid) +{ + uuid_time_t timestamp, last_time; + unsigned16 clockseq; + uuid_node_t node; + uuid_node_t last_node; + int f; + + /* acquire system-wide lock so we're alone */ + LOCK; + /* get time, node ID, saved state from non-volatile storage */ + get_current_time(×tamp); + get_ieee_node_identifier(&node); + f = read_state(&clockseq, &last_time, &last_node); + + /* if no NV state, or if clock went backwards, or node ID + changed (e.g., new network card) change clockseq */ + if (!f || memcmp(&node, &last_node, sizeof node)) + clockseq = true_random(); + else if (timestamp < last_time) + clockseq++; + + /* save the state for next time */ + write_state(clockseq, timestamp, node); + + UNLOCK; + + /* stuff fields into the UUID */ + format_uuid_v1(uuid, clockseq, timestamp, node); + return 1; +} + +/* format_uuid_v1 -- make a UUID from the timestamp, clockseq, + and node ID */ +void format_uuid_v1(uuid_t* uuid, unsigned16 clock_seq, + uuid_time_t timestamp, uuid_node_t node) +{ + /* Construct a version 1 uuid with the information we've gathered + plus a few constants. */ + uuid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); + uuid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); + uuid->time_hi_and_version = + + + +Leach, et al. Standards Track [Page 20] + +RFC 4122 A UUID URN Namespace July 2005 + + + (unsigned short)((timestamp >> 48) & 0x0FFF); + uuid->time_hi_and_version |= (1 << 12); + uuid->clock_seq_low = clock_seq & 0xFF; + uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8; + uuid->clock_seq_hi_and_reserved |= 0x80; + memcpy(&uuid->node, &node, sizeof uuid->node); +} + +/* data type for UUID generator persistent state */ +typedef struct { + uuid_time_t ts; /* saved timestamp */ + uuid_node_t node; /* saved node ID */ + unsigned16 cs; /* saved clock sequence */ +} uuid_state; + +static uuid_state st; + +/* read_state -- read UUID generator state from non-volatile store */ +int read_state(unsigned16 *clockseq, uuid_time_t *timestamp, + uuid_node_t *node) +{ + static int inited = 0; + FILE *fp; + + /* only need to read state once per boot */ + if (!inited) { + fp = fopen("state", "rb"); + if (fp == NULL) + return 0; + fread(&st, sizeof st, 1, fp); + fclose(fp); + inited = 1; + } + *clockseq = st.cs; + *timestamp = st.ts; + *node = st.node; + return 1; +} + +/* write_state -- save UUID generator state back to non-volatile + storage */ +void write_state(unsigned16 clockseq, uuid_time_t timestamp, + uuid_node_t node) +{ + static int inited = 0; + static uuid_time_t next_save; + FILE* fp; + + + + +Leach, et al. Standards Track [Page 21] + +RFC 4122 A UUID URN Namespace July 2005 + + + if (!inited) { + next_save = timestamp; + inited = 1; + } + + /* always save state to volatile shared state */ + st.cs = clockseq; + st.ts = timestamp; + st.node = node; + if (timestamp >= next_save) { + fp = fopen("state", "wb"); + fwrite(&st, sizeof st, 1, fp); + fclose(fp); + /* schedule next save for 10 seconds from now */ + next_save = timestamp + (10 * 10 * 1000 * 1000); + } +} + +/* get-current_time -- get time as 60-bit 100ns ticks since UUID epoch. + Compensate for the fact that real clock resolution is + less than 100ns. */ +void get_current_time(uuid_time_t *timestamp) +{ + static int inited = 0; + static uuid_time_t time_last; + static unsigned16 uuids_this_tick; + uuid_time_t time_now; + + if (!inited) { + get_system_time(&time_now); + uuids_this_tick = UUIDS_PER_TICK; + inited = 1; + } + + for ( ; ; ) { + get_system_time(&time_now); + + /* if clock reading changed since last UUID generated, */ + if (time_last != time_now) { + /* reset count of uuids gen'd with this clock reading */ + uuids_this_tick = 0; + time_last = time_now; + break; + } + if (uuids_this_tick < UUIDS_PER_TICK) { + uuids_this_tick++; + break; + } + + + +Leach, et al. Standards Track [Page 22] + +RFC 4122 A UUID URN Namespace July 2005 + + + /* going too fast for our clock; spin */ + } + /* add the count of uuids to low order bits of the clock reading */ + *timestamp = time_now + uuids_this_tick; +} + +/* true_random -- generate a crypto-quality random number. + **This sample doesn't do that.** */ +static unsigned16 true_random(void) +{ + static int inited = 0; + uuid_time_t time_now; + + if (!inited) { + get_system_time(&time_now); + time_now = time_now / UUIDS_PER_TICK; + srand((unsigned int) + (((time_now >> 32) ^ time_now) & 0xffffffff)); + inited = 1; + } + + return rand(); +} + +/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a + "name" from a "name space" */ +void uuid_create_md5_from_name(uuid_t *uuid, uuid_t nsid, void *name, + int namelen) +{ + MD5_CTX c; + unsigned char hash[16]; + uuid_t net_nsid; + + /* put name space ID in network byte order so it hashes the same + no matter what endian machine we're on */ + net_nsid = nsid; + net_nsid.time_low = htonl(net_nsid.time_low); + net_nsid.time_mid = htons(net_nsid.time_mid); + net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); + + MD5Init(&c); + MD5Update(&c, &net_nsid, sizeof net_nsid); + MD5Update(&c, name, namelen); + MD5Final(hash, &c); + + /* the hash is in network byte order at this point */ + format_uuid_v3or5(uuid, hash, 3); +} + + + +Leach, et al. Standards Track [Page 23] + +RFC 4122 A UUID URN Namespace July 2005 + + +void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name, + int namelen) +{ + SHA_CTX c; + unsigned char hash[20]; + uuid_t net_nsid; + + /* put name space ID in network byte order so it hashes the same + no matter what endian machine we're on */ + net_nsid = nsid; + net_nsid.time_low = htonl(net_nsid.time_low); + net_nsid.time_mid = htons(net_nsid.time_mid); + net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); + + SHA1_Init(&c); + SHA1_Update(&c, &net_nsid, sizeof net_nsid); + SHA1_Update(&c, name, namelen); + SHA1_Final(hash, &c); + + /* the hash is in network byte order at this point */ + format_uuid_v3or5(uuid, hash, 5); +} + +/* format_uuid_v3or5 -- make a UUID from a (pseudo)random 128-bit + number */ +void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], int v) +{ + /* convert UUID to local byte order */ + memcpy(uuid, hash, sizeof *uuid); + uuid->time_low = ntohl(uuid->time_low); + uuid->time_mid = ntohs(uuid->time_mid); + uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version); + + /* put in the variant and version bits */ + uuid->time_hi_and_version &= 0x0FFF; + uuid->time_hi_and_version |= (v << 12); + uuid->clock_seq_hi_and_reserved &= 0x3F; + uuid->clock_seq_hi_and_reserved |= 0x80; +} + +/* uuid_compare -- Compare two UUID's "lexically" and return */ +#define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1; +int uuid_compare(uuid_t *u1, uuid_t *u2) +{ + int i; + + CHECK(u1->time_low, u2->time_low); + CHECK(u1->time_mid, u2->time_mid); + + + +Leach, et al. Standards Track [Page 24] + +RFC 4122 A UUID URN Namespace July 2005 + + + CHECK(u1->time_hi_and_version, u2->time_hi_and_version); + CHECK(u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved); + CHECK(u1->clock_seq_low, u2->clock_seq_low) + for (i = 0; i < 6; i++) { + if (u1->node[i] < u2->node[i]) + return -1; + if (u1->node[i] > u2->node[i]) + return 1; + } + return 0; +} +#undef CHECK + + +sysdep.h + +#include "copyrt.h" +/* remove the following define if you aren't running WIN32 */ +#define WININC 0 + +#ifdef WININC +#include +#else +#include +#include +#include +#endif + +#include "global.h" +/* change to point to where MD5 .h's live; RFC 1321 has sample + implementation */ +#include "md5.h" + +/* set the following to the number of 100ns ticks of the actual + resolution of your system's clock */ +#define UUIDS_PER_TICK 1024 + +/* Set the following to a calls to get and release a global lock */ +#define LOCK +#define UNLOCK + +typedef unsigned long unsigned32; +typedef unsigned short unsigned16; +typedef unsigned char unsigned8; +typedef unsigned char byte; + +/* Set this to what your compiler uses for 64-bit data type */ +#ifdef WININC + + + +Leach, et al. Standards Track [Page 25] + +RFC 4122 A UUID URN Namespace July 2005 + + +#define unsigned64_t unsigned __int64 +#define I64(C) C +#else +#define unsigned64_t unsigned long long +#define I64(C) C##LL +#endif + +typedef unsigned64_t uuid_time_t; +typedef struct { + char nodeID[6]; +} uuid_node_t; + +void get_ieee_node_identifier(uuid_node_t *node); +void get_system_time(uuid_time_t *uuid_time); +void get_random_info(char seed[16]); + + +sysdep.c + +#include "copyrt.h" +#include +#include "sysdep.h" + +/* system dependent call to get IEEE node ID. + This sample implementation generates a random node ID. */ +void get_ieee_node_identifier(uuid_node_t *node) +{ + static inited = 0; + static uuid_node_t saved_node; + char seed[16]; + FILE *fp; + + if (!inited) { + fp = fopen("nodeid", "rb"); + if (fp) { + fread(&saved_node, sizeof saved_node, 1, fp); + fclose(fp); + } + else { + get_random_info(seed); + seed[0] |= 0x01; + memcpy(&saved_node, seed, sizeof saved_node); + fp = fopen("nodeid", "wb"); + if (fp) { + fwrite(&saved_node, sizeof saved_node, 1, fp); + fclose(fp); + } + } + + + +Leach, et al. Standards Track [Page 26] + +RFC 4122 A UUID URN Namespace July 2005 + + + inited = 1; + } + + *node = saved_node; +} + +/* system dependent call to get the current system time. Returned as + 100ns ticks since UUID epoch, but resolution may be less than + 100ns. */ +#ifdef _WINDOWS_ + +void get_system_time(uuid_time_t *uuid_time) +{ + ULARGE_INTEGER time; + + /* NT keeps time in FILETIME format which is 100ns ticks since + Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. + The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) + + 18 years and 5 leap days. */ + GetSystemTimeAsFileTime((FILETIME *)&time); + time.QuadPart += + + (unsigned __int64) (1000*1000*10) // seconds + * (unsigned __int64) (60 * 60 * 24) // days + * (unsigned __int64) (17+30+31+365*18+5); // # of days + *uuid_time = time.QuadPart; +} + +/* Sample code, not for use in production; see RFC 1750 */ +void get_random_info(char seed[16]) +{ + MD5_CTX c; + struct { + MEMORYSTATUS m; + SYSTEM_INFO s; + FILETIME t; + LARGE_INTEGER pc; + DWORD tc; + DWORD l; + char hostname[MAX_COMPUTERNAME_LENGTH + 1]; + } r; + + MD5Init(&c); + GlobalMemoryStatus(&r.m); + GetSystemInfo(&r.s); + GetSystemTimeAsFileTime(&r.t); + QueryPerformanceCounter(&r.pc); + r.tc = GetTickCount(); + + + +Leach, et al. Standards Track [Page 27] + +RFC 4122 A UUID URN Namespace July 2005 + + + r.l = MAX_COMPUTERNAME_LENGTH + 1; + GetComputerName(r.hostname, &r.l); + MD5Update(&c, &r, sizeof r); + MD5Final(seed, &c); +} + +#else + +void get_system_time(uuid_time_t *uuid_time) +{ + struct timeval tp; + + gettimeofday(&tp, (struct timezone *)0); + + /* Offset between UUID formatted times and Unix formatted times. + UUID UTC base time is October 15, 1582. + Unix base time is January 1, 1970.*/ + *uuid_time = ((unsigned64)tp.tv_sec * 10000000) + + ((unsigned64)tp.tv_usec * 10) + + I64(0x01B21DD213814000); +} + +/* Sample code, not for use in production; see RFC 1750 */ +void get_random_info(char seed[16]) +{ + MD5_CTX c; + struct { + struct sysinfo s; + struct timeval t; + char hostname[257]; + } r; + + MD5Init(&c); + sysinfo(&r.s); + gettimeofday(&r.t, (struct timezone *)0); + gethostname(r.hostname, 256); + MD5Update(&c, &r, sizeof r); + MD5Final(seed, &c); +} + +#endif + +utest.c + +#include "copyrt.h" +#include "sysdep.h" +#include +#include "uuid.h" + + + +Leach, et al. Standards Track [Page 28] + +RFC 4122 A UUID URN Namespace July 2005 + + +uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */ + 0x6ba7b810, + 0x9dad, + 0x11d1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 +}; + +/* puid -- print a UUID */ +void puid(uuid_t u) +{ + int i; + + printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid, + u.time_hi_and_version, u.clock_seq_hi_and_reserved, + u.clock_seq_low); + for (i = 0; i < 6; i++) + printf("%2.2x", u.node[i]); + printf("\n"); +} + +/* Simple driver for UUID generator */ +void main(int argc, char **argv) +{ + uuid_t u; + int f; + + uuid_create(&u); + printf("uuid_create(): "); puid(u); + + f = uuid_compare(&u, &u); + printf("uuid_compare(u,u): %d\n", f); /* should be 0 */ + f = uuid_compare(&u, &NameSpace_DNS); + printf("uuid_compare(u, NameSpace_DNS): %d\n", f); /* s.b. 1 */ + f = uuid_compare(&NameSpace_DNS, &u); + printf("uuid_compare(NameSpace_DNS, u): %d\n", f); /* s.b. -1 */ + uuid_create_md5_from_name(&u, NameSpace_DNS, "www.widgets.com", 15); + printf("uuid_create_md5_from_name(): "); puid(u); +} + +Appendix B. Appendix B - Sample Output of utest + + uuid_create(): 7d444840-9dc0-11d1-b245-5ffdce74fad2 + uuid_compare(u,u): 0 + uuid_compare(u, NameSpace_DNS): 1 + uuid_compare(NameSpace_DNS, u): -1 + uuid_create_md5_from_name(): e902893a-9d22-3c7e-a7b8-d6e313b71d9f + + + + + +Leach, et al. Standards Track [Page 29] + +RFC 4122 A UUID URN Namespace July 2005 + + +Appendix C. Appendix C - Some Name Space IDs + + This appendix lists the name space IDs for some potentially + interesting name spaces, as initialized C structures and in the + string representation defined above. + + /* Name string is a fully-qualified domain name */ + uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */ + 0x6ba7b810, + 0x9dad, + 0x11d1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 + }; + + /* Name string is a URL */ + uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */ + 0x6ba7b811, + 0x9dad, + 0x11d1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 + }; + + /* Name string is an ISO OID */ + uuid_t NameSpace_OID = { /* 6ba7b812-9dad-11d1-80b4-00c04fd430c8 */ + 0x6ba7b812, + 0x9dad, + 0x11d1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 + }; + + /* Name string is an X.500 DN (in DER or a text output format) */ + uuid_t NameSpace_X500 = { /* 6ba7b814-9dad-11d1-80b4-00c04fd430c8 */ + 0x6ba7b814, + 0x9dad, + 0x11d1, + 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8 + }; + + + + + + + + + + + + + + +Leach, et al. Standards Track [Page 30] + +RFC 4122 A UUID URN Namespace July 2005 + + +Authors' Addresses + + Paul J. Leach + Microsoft + 1 Microsoft Way + Redmond, WA 98052 + US + + Phone: +1 425-882-8080 + EMail: paulle@microsoft.com + + + Michael Mealling + Refactored Networks, LLC + 1635 Old Hwy 41 + Suite 112, Box 138 + Kennesaw, GA 30152 + US + + Phone: +1-678-581-9656 + EMail: michael@refactored-networks.com + URI: http://www.refactored-networks.com + + + Rich Salz + DataPower Technology, Inc. + 1 Alewife Center + Cambridge, MA 02142 + US + + Phone: +1 617-864-0455 + EMail: rsalz@datapower.com + URI: http://www.datapower.com + + + + + + + + + + + + + + + + + + +Leach, et al. Standards Track [Page 31] + +RFC 4122 A UUID URN Namespace July 2005 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2005). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at ietf- + ipr@ietf.org. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + +Leach, et al. Standards Track [Page 32] + diff --git a/standards/wake-on-lan.pdf b/standards/wake-on-lan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07d97f44392d52b17c4dae4427fb572cc8f1936e GIT binary patch literal 37276 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
    diff --git a/templates/add-printer.tmpl b/templates/add-printer.tmpl index dd913312f..cff93eb29 100644 --- a/templates/add-printer.tmpl +++ b/templates/add-printer.tmpl @@ -21,7 +21,7 @@

    diff --git a/templates/admin.tmpl b/templates/admin.tmpl index 989c46be2..0c34c4939 100644 --- a/templates/admin.tmpl +++ b/templates/admin.tmpl @@ -5,34 +5,34 @@

    Add Printer -Add Printer +Manage Printers {have_samba?Export Printers to Samba:}

    {#device_uri=0?:

    New Printers Found:

      {[device_uri]
    • {device_make_and_model} ({device_info}) Add This Printer
    • }
    }

    Classes

    -Add Class -Manage Classes

    Jobs

    -Manage
+<A HREF=Manage
 Jobs

    @@ -42,16 +42,16 @@ Jobs" CLASS="button">

    Edit Configuration
+SRC= View Access Log View Error Log View Page Log

    @@ -66,7 +66,7 @@ CLASS="button"> Allow users to cancel any job (not just their own)
    Save debugging information for troubleshooting

    -

    +

    diff --git a/templates/choose-device.tmpl b/templates/choose-device.tmpl index 440e539f0..6076477e1 100644 --- a/templates/choose-device.tmpl +++ b/templates/choose-device.tmpl @@ -19,7 +19,7 @@ - + diff --git a/templates/choose-make.tmpl b/templates/choose-make.tmpl index 5bc0e67ec..65e35afdf 100644 --- a/templates/choose-make.tmpl +++ b/templates/choose-make.tmpl @@ -22,7 +22,7 @@ - + @@ -35,7 +35,7 @@ TYPE="FILE" NAME="PPD_FILE"> - + diff --git a/templates/choose-model.tmpl b/templates/choose-model.tmpl index c0c2ef2c0..aa523080f 100644 --- a/templates/choose-model.tmpl +++ b/templates/choose-model.tmpl @@ -27,7 +27,7 @@ TYPE="FILE" NAME="PPD_FILE"> - + diff --git a/templates/choose-serial.tmpl b/templates/choose-serial.tmpl index f90dd6a01..e0bbb1b97 100644 --- a/templates/choose-serial.tmpl +++ b/templates/choose-serial.tmpl @@ -40,7 +40,7 @@ - + diff --git a/templates/choose-uri.tmpl b/templates/choose-uri.tmpl index ae72d1c17..5124c4ddd 100644 --- a/templates/choose-uri.tmpl +++ b/templates/choose-uri.tmpl @@ -33,7 +33,7 @@ Printers" for the correct URI to use with your printer.

    - + diff --git a/templates/class-confirm.tmpl b/templates/class-confirm.tmpl index 4a9afc6de..b2122929f 100644 --- a/templates/class-confirm.tmpl +++ b/templates/class-confirm.tmpl @@ -3,5 +3,5 @@

    Delete Class

    diff --git a/templates/classes.tmpl b/templates/classes.tmpl index a69dd7b53..17ee9e4a0 100644 --- a/templates/classes.tmpl +++ b/templates/classes.tmpl @@ -15,38 +15,38 @@

    -Print Test Page +Print Test Page {printer_state=5? -Start Class +Start Class : -Stop Class +Stop Class } {printer_is_accepting_jobs=0? -Accept Jobs +Accept Jobs : -Reject Jobs +Reject Jobs } -Cancel All Jobs +Cancel All Jobs {printer_is_shared=0? -Publish Printer +Publish Printer : -Unpublish Printer +Unpublish Printer } -Modify Class +Modify Class -Delete Class +Delete Class -Set As Default +Set As Default -Set Allowed Users +Set Allowed Users

    diff --git a/templates/edit-config.tmpl.in b/templates/edit-config.tmpl.in index 7ca5da795..775938cf6 100644 --- a/templates/edit-config.tmpl.in +++ b/templates/edit-config.tmpl.in @@ -22,6 +22,9 @@ function reset_config() "BrowseAllow @LOCAL\\n" + "\\n" + "\\n" + +"# Authenticate against system accounts by default...\\n" + +"DefaultAuthType Basic\\n" + +"\\n" + "# Restrict access to the server...\\n" + "\\n" + " Order allow,deny\\n" + @@ -42,9 +45,6 @@ function reset_config() " Allow localhost\\n" + "\\n" + "\\n" + -"# Authenticate against system accounts by default...\\n" + -"DefaultAuthType Basic\\n" + -"\\n" + "# Set the default printer/job policies...\\n" + "\\n" + " # Job-related operations must be done by the owner or an adminstrator...\\n" + diff --git a/templates/help-header.tmpl b/templates/help-header.tmpl index 21e0ec445..b1dcc9306 100644 --- a/templates/help-header.tmpl +++ b/templates/help-header.tmpl @@ -4,7 +4,9 @@

    Search in {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}:

    +TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Search"> +Clear

    @@ -24,5 +26,22 @@ TYPE="IMAGE" SRC="/images/search.gif" ALT="Search">

    {[QTEXT]

    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Ô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 F`wtb9$D{xN diff --git a/doc/images/accept-jobs.gif b/doc/images/button-accept-jobs.gif similarity index 100% rename from doc/images/accept-jobs.gif rename to doc/images/button-accept-jobs.gif diff --git a/doc/images/add-class.gif b/doc/images/button-add-class.gif similarity index 100% rename from doc/images/add-class.gif rename to doc/images/button-add-class.gif diff --git a/doc/images/add-printer.gif b/doc/images/button-add-printer.gif similarity index 100% rename from doc/images/add-printer.gif rename to doc/images/button-add-printer.gif diff --git a/doc/images/add-this-printer.gif b/doc/images/button-add-this-printer.gif similarity index 100% rename from doc/images/add-this-printer.gif rename to doc/images/button-add-this-printer.gif diff --git a/doc/images/cancel-all-jobs.gif b/doc/images/button-cancel-all-jobs.gif similarity index 100% rename from doc/images/cancel-all-jobs.gif rename to doc/images/button-cancel-all-jobs.gif diff --git a/doc/images/cancel-job.gif b/doc/images/button-cancel-job.gif similarity index 100% rename from doc/images/cancel-job.gif rename to doc/images/button-cancel-job.gif diff --git a/doc/images/change-settings.gif b/doc/images/button-change-settings.gif similarity index 100% rename from doc/images/change-settings.gif rename to doc/images/button-change-settings.gif diff --git a/doc/images/clean-print-heads.gif b/doc/images/button-clean-print-heads.gif similarity index 100% rename from doc/images/clean-print-heads.gif rename to doc/images/button-clean-print-heads.gif diff --git a/doc/images/button-clear.gif b/doc/images/button-clear.gif new file mode 100644 index 0000000000000000000000000000000000000000..dcb9c44f1c0216fdbfae8e69737c4d5f41ca43d9 GIT binary patch literal 359 zc-nLKbhEHbG-eQCXc1t@NHxgGwk|1luB!`bYm4pf4Dad7m_9Xm`pk-Di(7W>UV7s6 z?i*K+J$riR)0Yo_{{8+>B2fIv!pOxSz@Wnb1Ry&dSf41U^aUs~WUN}3vzv?6a^AZS zENgf<{Fns#84oDeM;nsDl!JJ-%U-k3A|ZpU;Eo0?DL zC}U%@)ns(=U<+BUGyBH%dsQdq`SzsoMDuYMcSc6XF;wz$^6*w)*5zPiR#U#_;JQ6* PszSK|D^IH;1A{dH3g(}K literal 0 Hc-jL100001 diff --git a/doc/images/continue.gif b/doc/images/button-continue.gif similarity index 100% rename from doc/images/continue.gif rename to doc/images/button-continue.gif diff --git a/doc/images/delete-class.gif b/doc/images/button-delete-class.gif similarity index 100% rename from doc/images/delete-class.gif rename to doc/images/button-delete-class.gif diff --git a/doc/images/delete-printer.gif b/doc/images/button-delete-printer.gif similarity index 100% rename from doc/images/delete-printer.gif rename to doc/images/button-delete-printer.gif diff --git a/doc/images/edit-configuration-file.gif b/doc/images/button-edit-configuration-file.gif similarity index 100% rename from doc/images/edit-configuration-file.gif rename to doc/images/button-edit-configuration-file.gif diff --git a/doc/images/export-samba.gif b/doc/images/button-export-samba.gif similarity index 100% rename from doc/images/export-samba.gif rename to doc/images/button-export-samba.gif diff --git a/doc/images/help.gif b/doc/images/button-help.gif similarity index 100% rename from doc/images/help.gif rename to doc/images/button-help.gif diff --git a/doc/images/hold-job.gif b/doc/images/button-hold-job.gif similarity index 100% rename from doc/images/hold-job.gif rename to doc/images/button-hold-job.gif diff --git a/doc/images/manage-classes.gif b/doc/images/button-manage-classes.gif similarity index 100% rename from doc/images/manage-classes.gif rename to doc/images/button-manage-classes.gif diff --git a/doc/images/manage-jobs.gif b/doc/images/button-manage-jobs.gif similarity index 100% rename from doc/images/manage-jobs.gif rename to doc/images/button-manage-jobs.gif diff --git a/doc/images/manage-printers.gif b/doc/images/button-manage-printers.gif similarity index 100% rename from doc/images/manage-printers.gif rename to doc/images/button-manage-printers.gif diff --git a/doc/images/manage-server.gif b/doc/images/button-manage-server.gif similarity index 100% rename from doc/images/manage-server.gif rename to doc/images/button-manage-server.gif diff --git a/doc/images/modify-class.gif b/doc/images/button-modify-class.gif similarity index 100% rename from doc/images/modify-class.gif rename to doc/images/button-modify-class.gif diff --git a/doc/images/modify-printer.gif b/doc/images/button-modify-printer.gif similarity index 100% rename from doc/images/modify-printer.gif rename to doc/images/button-modify-printer.gif diff --git a/doc/images/move-job.gif b/doc/images/button-move-job.gif similarity index 100% rename from doc/images/move-job.gif rename to doc/images/button-move-job.gif diff --git a/doc/images/move-jobs.gif b/doc/images/button-move-jobs.gif similarity index 100% rename from doc/images/move-jobs.gif rename to doc/images/button-move-jobs.gif diff --git a/doc/images/print-self-test-page.gif b/doc/images/button-print-self-test-page.gif similarity index 100% rename from doc/images/print-self-test-page.gif rename to doc/images/button-print-self-test-page.gif diff --git a/doc/images/print-test-page.gif b/doc/images/button-print-test-page.gif similarity index 100% rename from doc/images/print-test-page.gif rename to doc/images/button-print-test-page.gif diff --git a/doc/images/publish-printer.gif b/doc/images/button-publish-printer.gif similarity index 100% rename from doc/images/publish-printer.gif rename to doc/images/button-publish-printer.gif diff --git a/doc/images/reject-jobs.gif b/doc/images/button-reject-jobs.gif similarity index 100% rename from doc/images/reject-jobs.gif rename to doc/images/button-reject-jobs.gif diff --git a/doc/images/release-job.gif b/doc/images/button-release-job.gif similarity index 100% rename from doc/images/release-job.gif rename to doc/images/button-release-job.gif diff --git a/doc/images/restart-job.gif b/doc/images/button-restart-job.gif similarity index 100% rename from doc/images/restart-job.gif rename to doc/images/button-restart-job.gif diff --git a/doc/images/save-changes.gif b/doc/images/button-save-changes.gif similarity index 100% rename from doc/images/save-changes.gif rename to doc/images/button-save-changes.gif diff --git a/doc/images/search.gif b/doc/images/button-search.gif similarity index 100% rename from doc/images/search.gif rename to doc/images/button-search.gif diff --git a/doc/images/set-allowed-users.gif b/doc/images/button-set-allowed-users.gif similarity index 100% rename from doc/images/set-allowed-users.gif rename to doc/images/button-set-allowed-users.gif diff --git a/doc/images/set-as-default.gif b/doc/images/button-set-as-default.gif similarity index 100% rename from doc/images/set-as-default.gif rename to doc/images/button-set-as-default.gif diff --git a/doc/images/set-printer-options.gif b/doc/images/button-set-printer-options.gif similarity index 100% rename from doc/images/set-printer-options.gif rename to doc/images/button-set-printer-options.gif diff --git a/doc/images/show-active.gif b/doc/images/button-show-active.gif similarity index 100% rename from doc/images/show-active.gif rename to doc/images/button-show-active.gif diff --git a/doc/images/show-all.gif b/doc/images/button-show-all.gif similarity index 100% rename from doc/images/show-all.gif rename to doc/images/button-show-all.gif diff --git a/doc/images/show-completed.gif b/doc/images/button-show-completed.gif similarity index 100% rename from doc/images/show-completed.gif rename to doc/images/button-show-completed.gif diff --git a/doc/images/show-next.gif b/doc/images/button-show-next.gif similarity index 100% rename from doc/images/show-next.gif rename to doc/images/button-show-next.gif diff --git a/doc/images/show-previous.gif b/doc/images/button-show-previous.gif similarity index 100% rename from doc/images/show-previous.gif rename to doc/images/button-show-previous.gif diff --git a/doc/images/sort-ascending.gif b/doc/images/button-sort-ascending.gif similarity index 100% rename from doc/images/sort-ascending.gif rename to doc/images/button-sort-ascending.gif diff --git a/doc/images/sort-descending.gif b/doc/images/button-sort-descending.gif similarity index 100% rename from doc/images/sort-descending.gif rename to doc/images/button-sort-descending.gif diff --git a/doc/images/start-class.gif b/doc/images/button-start-class.gif similarity index 100% rename from doc/images/start-class.gif rename to doc/images/button-start-class.gif diff --git a/doc/images/start-printer.gif b/doc/images/button-start-printer.gif similarity index 100% rename from doc/images/start-printer.gif rename to doc/images/button-start-printer.gif diff --git a/doc/images/stop-class.gif b/doc/images/button-stop-class.gif similarity index 100% rename from doc/images/stop-class.gif rename to doc/images/button-stop-class.gif diff --git a/doc/images/stop-printer.gif b/doc/images/button-stop-printer.gif similarity index 100% rename from doc/images/stop-printer.gif rename to doc/images/button-stop-printer.gif diff --git a/doc/images/unpublish-printer.gif b/doc/images/button-unpublish-printer.gif similarity index 100% rename from doc/images/unpublish-printer.gif rename to doc/images/button-unpublish-printer.gif diff --git a/doc/images/use-default-config.gif b/doc/images/button-use-default-config.gif similarity index 100% rename from doc/images/use-default-config.gif rename to doc/images/button-use-default-config.gif diff --git a/doc/images/view-access-log.gif b/doc/images/button-view-access-log.gif similarity index 100% rename from doc/images/view-access-log.gif rename to doc/images/button-view-access-log.gif diff --git a/doc/images/view-error-log.gif b/doc/images/button-view-error-log.gif similarity index 100% rename from doc/images/view-error-log.gif rename to doc/images/button-view-error-log.gif diff --git a/doc/images/view-page-log.gif b/doc/images/button-view-page-log.gif similarity index 100% rename from doc/images/view-page-log.gif rename to doc/images/button-view-page-log.gif diff --git a/doc/images/button-view-printable-version.gif b/doc/images/button-view-printable-version.gif new file mode 100644 index 0000000000000000000000000000000000000000..693dd43a14ce5eecf72756e7805985ff71096ae3 GIT binary patch literal 743 zc-nLKbhEHboX#M^&?3N)k!p~eZCz62Tw5E|-jUGV8Q#~QIelvK^qCbambUNQx!}y% zy?5_idimo1hmUXn{QLc%M4Mm}=?hR~$XK;5=k>k!}gxmxolubHC6YQ)VSRl~r@%Uv0^ozpKsXH`g8+^Sl8M|&o&(_u*syZ7$b z-M(|rKF6?HCN@UDthlz0u2ZSHmJ?>Yd;j6%jlmnRlDOn7>2mQmZkE{`P<6J4GA7{WHW zEb2P2)@;|FAD_e29&mBk2yw}JiCk8eb?nxPUG-%}pRCVfuc^cVaC~-ZXl!OXB=Ekf z;k;vbvYnre$LEw@Mz$XAUZH6V4l=VJ+NO~4;DJEm;jVBEh8T^KhldxcTfh5LX`rYR zqmz8>`5}FtV$LlhmCg+eFD^3J*>X&1_%0RneT$KIS=f{P3`shRcbNZiFT9}Bkgb>( zBVnw_bw%{#?C*}H^R*^zbGZM_YmR!}_VOSGU%NkcC%+sCHkO~eB)GH0>(+-+8dR22K0w}s6}@2g=@ZiGFhkLYY68j$IR3~3m-`)25SJ< Cp-;O2 literal 0 Hc-jL100001 diff --git a/doc/images/cancel.gif b/doc/images/cancel.gif deleted file mode 100644 index f183b567941d75f7d2a8f22e4ce9b73d2377041f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 383 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 qtn}27d_Z`ztX3 literal 591 zc-jF^08~U*5-X9+fD*emQ%-t<0(_wQriGZ zZZazx6{;H!rfZ&NF^DjR%UP$gL12(v1z%TG%JvI>t<>1d$R6}E?QFaBuG=p#CYq`w ziZLKnI#?fMDjR}LReukMU5I;WPjg%#kve@k4n}f;gCRUfWn^cOf{Z>uD@%zdL!5^? zZErJON@0|Ace@NlyuZK^mQ+k1!FGr)XqH-AsBeLx4HT-7rY(4&t$Tq1JGN%5Vb2<> zecNi2Y_Y^HEYhh!)TfI?l!TXqlgPG)&Q*(hvyg$SQ4d$HfyWfAV+V3h%sVe{>bzsg*v?&fS|wvO z;ipJR`P$Vo+Q`t9b~&`r2nMgIIb~O{sU$>Hj3ZL$G-e2z&tV~XEGM?mG=|~0JOR9Q zx~ivQkCoAuorL9KVzjCZsL7LY2n_~8V(13pGyvmhOX_!0g^}SfQhCYc7E-lJ z<8mqB@6klgfj#Q`%u%b%(iC7vD_0O};S&#LvOb}>9YnB~>XIW%d3BaYhzM(>GRB~0 zFrl4c{!(`{Okt{tJ(sb!5}DI%@Dx;B@|5J*;qU$?8QeVQ>viyE2Cb&1&70FFgU_{d d<`(xg{4v$bVfLjbU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/images/cups-black-button.scm b/doc/images/cups-black-button.scm new file mode 100644 index 000000000..23cf817de --- /dev/null +++ b/doc/images/cups-black-button.scm @@ -0,0 +1,80 @@ +; CUPS Black Button +; Create a flat rounded button + +(define (script-fu-cups-black-button text text-color button-height button-color bg-color) + (let* ( + (img (car (gimp-image-new 256 256 RGB))) + (old-fg (car (gimp-palette-get-foreground))) + (old-bg (car (gimp-palette-get-background))) + (font-size (+ (/ (* 3 button-height) 5) 1)) + (dummy (gimp-palette-set-foreground text-color)) + (text-layer (car (gimp-text-fontname img -1 0 0 text 0 + TRUE font-size PIXELS + "Sans L,"))) + (text-width (car (gimp-drawable-width text-layer))) + (text-height (car (gimp-drawable-height text-layer))) + (button-width (+ text-width button-height)) + (bg-layer (car (gimp-layer-new img button-width button-height + RGBA-IMAGE "Background" 100 + NORMAL-MODE))) + ) + + ; Disable undo while we do our work... + (gimp-image-undo-disable img) + + ; Resize the image as needed... + (gimp-image-resize img button-width button-height 0 0) + (gimp-image-add-layer img bg-layer 1) + (gimp-layer-set-preserve-trans text-layer TRUE) + + ; Clear the background... + (gimp-selection-clear img) + (gimp-palette-set-background bg-color) + (gimp-edit-fill bg-layer 1) + + ; Make selections as needed for a rounded box. + (gimp-rect-select img (* 0.5 button-height) 0 + (- button-width button-height) button-height + REPLACE 0 0) + (gimp-ellipse-select img (- button-width button-height) 0 + button-height button-height ADD 1 0 0) + (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0) + + ; Fill in the background... + (gimp-palette-set-background button-color) + (gimp-edit-fill bg-layer 1) + + ; Clear the border around the button image... + (gimp-selection-invert img) + (gimp-edit-clear bg-layer) + (gimp-selection-clear img) + + ; Restore original colors... + (gimp-palette-set-foreground old-fg) + (gimp-palette-set-background old-bg) + + ; Translate the text later to center it... + (gimp-layer-translate text-layer (* 0.5 button-height) + (- (* 0.5 (- button-height text-height)) 1)) + + ; Then flatten the image... + (gimp-image-merge-visible-layers img CLIP-TO-IMAGE) + (gimp-convert-indexed img 0 0 16 0 1 "") + (gimp-image-undo-enable img) + (gimp-display-new img) + ) +) + +(script-fu-register "script-fu-cups-black-button" + "/Btns/CUPS Black Button" + "CUPS Black Button" + "Michael Sweet " + "Michael Sweet " + "2000" + "" + SF-VALUE "Text String" "\"Button\"" + SF-COLOR "Text Color" '(255 255 255) + SF-VALUE "Button Size (in pixels)" "20" + SF-COLOR "Button Color" '(0 0 0) + SF-COLOR "Background Color" '(212 212 164) +) diff --git a/doc/images/cups-block-diagram.gif b/doc/images/cups-block-diagram.gif index 2fe505e44b91deeb805b568a4db3a0fb508b0805..59fee5b10a57a3f6317cc633ea95fa89ad2c8324 100644 GIT binary patch literal 41582 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

  • {QTEXT}{QPTEXT? (in {QPTEXT}):}
  • } {QTEXT?:} :

    No matches found.

    } -{HELPTITLE?
    :}:} -{HELPTITLE?

    {HELPTITLE}

    :} +
    :} +{HELPTITLE?

    {HELPTITLE} +View Printable Version

    :

    CUPS Help Pages

    + +

    This is the CUPS on-line help interface. Enter search words +above or click on any of the documentation links to display +on-line help information.

    + +

    If you are new to CUPS, read the "Overview of CUPS" page. Veteran users +should read the "What's New in CUPS +1.2" page.

    + +

    The CUPS Home Page also +provides many resources including user discussion forums, answers +to frequently-asked questions, and a form for submitting bug +reports and feature requests.

    } diff --git a/templates/help-printable.tmpl b/templates/help-printable.tmpl new file mode 100644 index 000000000..305112a33 --- /dev/null +++ b/templates/help-printable.tmpl @@ -0,0 +1,11 @@ + + + + + {HELPTITLE} + + + + + +

    {HELPTITLE}

    diff --git a/templates/ja/add-class.tmpl b/templates/ja/add-class.tmpl index 8db1395d2..eee2ef993 100644 --- a/templates/ja/add-class.tmpl +++ b/templates/ja/add-class.tmpl @@ -26,7 +26,7 @@ - + diff --git a/templates/ja/add-printer.tmpl b/templates/ja/add-printer.tmpl index 65c09d6c2..aac93808b 100644 --- a/templates/ja/add-printer.tmpl +++ b/templates/ja/add-printer.tmpl @@ -21,7 +21,7 @@ - + diff --git a/templates/ja/admin.tmpl b/templates/ja/admin.tmpl index 8edfde698..3d1efb014 100644 --- a/templates/ja/admin.tmpl +++ b/templates/ja/admin.tmpl @@ -5,34 +5,34 @@

    プリンタの追加 -プリンタの追加 +プリンタの管理 {have_samba?プリンタをSambaにエキスポート:}

    {#device_uri=0?:

    新しいプリンタが見つかりました:

      {[device_uri]
    • {device_make_and_model} ({device_info}) このプリンタを追加
    • }
    }

    クラス

    -クラスの追加 -クラスの管理

    ジョブ

    -ジョブの管理 +ジョブの管理

          @@ -41,15 +41,15 @@ ALT="クラスの管理" CLASS="button">

    設定ファイルの編集 +SRC="/images/button-edit-configuration-file.gif" ALT="設定ファイルの編集" CLASS="button"> アクセスログの表示 エラーログの表示 ページログの表示

    @@ -64,7 +64,7 @@ CLASS="button"> どのジョブであってもキャンセルすることを (たとえ所有者でなくても) ユーザに許可
    トラブルシューティングのためにデバッグ情報を保存

    -

    +

    diff --git a/templates/ja/choose-device.tmpl b/templates/ja/choose-device.tmpl index 022ce5f62..303bf279f 100644 --- a/templates/ja/choose-device.tmpl +++ b/templates/ja/choose-device.tmpl @@ -19,7 +19,7 @@ - + diff --git a/templates/ja/choose-make.tmpl b/templates/ja/choose-make.tmpl index 4e60161bb..87cd06fc3 100644 --- a/templates/ja/choose-make.tmpl +++ b/templates/ja/choose-make.tmpl @@ -22,7 +22,7 @@ - + @@ -35,7 +35,7 @@ TYPE="FILE" NAME="PPD_FILE"> - + diff --git a/templates/ja/choose-model.tmpl b/templates/ja/choose-model.tmpl index 6bc223408..53bd69b3e 100644 --- a/templates/ja/choose-model.tmpl +++ b/templates/ja/choose-model.tmpl @@ -27,7 +27,7 @@ TYPE="FILE" NAME="PPD_FILE"> - + diff --git a/templates/ja/choose-serial.tmpl b/templates/ja/choose-serial.tmpl index 7917540da..e66b52d21 100644 --- a/templates/ja/choose-serial.tmpl +++ b/templates/ja/choose-serial.tmpl @@ -40,7 +40,7 @@ - + diff --git a/templates/ja/choose-uri.tmpl b/templates/ja/choose-uri.tmpl index ca7fa0443..33dd2f7fd 100644 --- a/templates/ja/choose-uri.tmpl +++ b/templates/ja/choose-uri.tmpl @@ -34,7 +34,7 @@ - + diff --git a/templates/ja/class-confirm.tmpl b/templates/ja/class-confirm.tmpl index f8eb454d6..382f1f51f 100644 --- a/templates/ja/class-confirm.tmpl +++ b/templates/ja/class-confirm.tmpl @@ -3,5 +3,5 @@

    クラスの削除

    diff --git a/templates/ja/classes.tmpl b/templates/ja/classes.tmpl index aeaef9925..67dcf8048 100644 --- a/templates/ja/classes.tmpl +++ b/templates/ja/classes.tmpl @@ -17,38 +17,38 @@

    -テストページの印刷 +テストページの印刷 {printer_state=5? -クラスを開始 +クラスを開始 : -クラスを停止 +クラスを停止 } {printer_is_accepting_jobs=0? -ジョブを受け付け +ジョブを受け付け : -ジョブを拒否 +ジョブを拒否 } -すべてのジョブをキャンセル +すべてのジョブをキャンセル {printer_is_shared=0? -プリンタを公開 +プリンタを公開 : -プリンタを非公開 +プリンタを非公開 } -クラスの変更 +クラスの変更 -クラスの削除 +クラスの削除 -デフォルトに設定 +デフォルトに設定 -許可するユーザの設定 +許可するユーザの設定

    diff --git a/templates/ja/help-header.tmpl b/templates/ja/help-header.tmpl index 24d67e267..da92e2320 100644 --- a/templates/ja/help-header.tmpl +++ b/templates/ja/help-header.tmpl @@ -4,7 +4,7 @@

    {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメント}} 内を検索:

    +TYPE="IMAGE" SRC="/images/button-search.gif" ALT="検索">

    diff --git a/templates/ja/job-move.tmpl b/templates/ja/job-move.tmpl index 601e3f9bf..bfb630e98 100644 --- a/templates/ja/job-move.tmpl +++ b/templates/ja/job-move.tmpl @@ -15,7 +15,7 @@ - + diff --git a/templates/ja/jobs-header.tmpl b/templates/ja/jobs-header.tmpl index 1ed1049ef..7310f3c9c 100644 --- a/templates/ja/jobs-header.tmpl +++ b/templates/ja/jobs-header.tmpl @@ -1,15 +1,15 @@

    {?which_jobs=?完了したジョブを表示 +SRC="/images/button-show-completed.gif" CLASS="button" ALT="完了したジョブを表示"> すべてのジョブを表示:{which_jobs=all?:{which_jobs=all?完了したジョブを表示 +SRC="/images/button-show-completed.gif" CLASS="button" ALT="完了したジョブを表示"> アクティブなジョブを表示::アクティブなジョブを表示 +SRC="/images/button-show-active.gif" CLASS="button" ALT="アクティブなジョブを表示"> すべてのジョブを表示}}

    +SRC="/images/button-show-all.gif" CLASS="button" ALT="すべてのジョブを表示">}}

    {total=0?ジョブはありません:{total} 個の{?which_jobs=?アクティブな:{which_jobs=all?:完了した}}ジョブのうち {#job_id} 個を表示中}。

    diff --git a/templates/ja/jobs.tmpl b/templates/ja/jobs.tmpl index 492a9c98c..371bc30be 100644 --- a/templates/ja/jobs.tmpl +++ b/templates/ja/jobs.tmpl @@ -23,18 +23,18 @@ {job_preserved>0? -ジョブの再印刷:} +ジョブの再印刷:} {job_state=4? -ジョブを解放:} +ジョブを解放:} {job_state=3? -ジョブをホールド:} +ジョブをホールド:} {job_state<7? -ジョブをキャンセル +ジョブをキャンセル ジョブを移動:} +SRC="/images/button-move-job.gif" ALT="ジョブを移動" CLASS="button">:}   } diff --git a/templates/ja/modify-class.tmpl b/templates/ja/modify-class.tmpl index e3ff08d8c..11f362d14 100644 --- a/templates/ja/modify-class.tmpl +++ b/templates/ja/modify-class.tmpl @@ -27,7 +27,7 @@ - + diff --git a/templates/ja/modify-printer.tmpl b/templates/ja/modify-printer.tmpl index 14bab6831..9fdd15970 100644 --- a/templates/ja/modify-printer.tmpl +++ b/templates/ja/modify-printer.tmpl @@ -22,7 +22,7 @@ - + diff --git a/templates/ja/option-trailer.tmpl b/templates/ja/option-trailer.tmpl index 82566538f..f7b1eb714 100644 --- a/templates/ja/option-trailer.tmpl +++ b/templates/ja/option-trailer.tmpl @@ -1,5 +1,5 @@ - + diff --git a/templates/ja/pager.tmpl b/templates/ja/pager.tmpl index 914d1d646..13aa87463 100644 --- a/templates/ja/pager.tmpl +++ b/templates/ja/pager.tmpl @@ -1,7 +1,7 @@ - - - + + +
    {PREVURL?前を表示: }{ORDER=dec?昇順にソート:降順にソート}{NEXTURL?次を表示: }{PREVURL?前を表示: }{ORDER=dec?昇順にソート:降順にソート}{NEXTURL?次を表示: }
    diff --git a/templates/ja/printer-confirm.tmpl b/templates/ja/printer-confirm.tmpl index a4eb0e77f..7a2fe776c 100644 --- a/templates/ja/printer-confirm.tmpl +++ b/templates/ja/printer-confirm.tmpl @@ -3,5 +3,5 @@

    プリンタの削除

    diff --git a/templates/ja/printers.tmpl b/templates/ja/printers.tmpl index a23959cb5..f0a39dd64 100644 --- a/templates/ja/printers.tmpl +++ b/templates/ja/printers.tmpl @@ -17,42 +17,42 @@

    -テストページの印刷 +テストページの印刷 {printer_state=5? -プリタを開始 +プリタを開始 : -プリンタを停止 +プリンタを停止 } {printer_is_accepting_jobs=0? -ジョブを受け付け +ジョブを受け付け : -ジョブを拒否 +ジョブを拒否 } -すべてのジョブの移動 +すべてのジョブの移動 -すべてのジョブをキャンセル +すべてのジョブをキャンセル {printer_is_shared=0? -プリンタを公開 +プリンタを公開 : -プリンタを非公開 +プリンタを非公開 } -プリンタの変更 +プリンタの変更 -プリンタオプションの設定 +プリンタオプションの設定 -プリンタの削除 +プリンタの削除 -デフォルトに設定 +デフォルトに設定 -許可するユーザの設定 +許可するユーザの設定

    diff --git a/templates/ja/samba-export.tmpl b/templates/ja/samba-export.tmpl index 46587f623..87b84790e 100644 --- a/templates/ja/samba-export.tmpl +++ b/templates/ja/samba-export.tmpl @@ -48,7 +48,7 @@ onChange="select_printers()"> すべてのプリンタをエキスポート - diff --git a/templates/ja/search.tmpl b/templates/ja/search.tmpl index 04c8e17a5..deaac319b 100644 --- a/templates/ja/search.tmpl +++ b/templates/ja/search.tmpl @@ -5,6 +5,6 @@

    {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?クラス:{SECTION=jobs?ジョブ:プリンタ}}} 内を検索:

    +TYPE="IMAGE" SRC="/images/button-search.gif" ALT="検索">

    diff --git a/templates/ja/users.tmpl b/templates/ja/users.tmpl index fb4e3dde4..ff6ea2fd2 100644 --- a/templates/ja/users.tmpl +++ b/templates/ja/users.tmpl @@ -18,7 +18,7 @@ - + diff --git a/templates/job-move.tmpl b/templates/job-move.tmpl index 65d8e9821..df2f37348 100644 --- a/templates/job-move.tmpl +++ b/templates/job-move.tmpl @@ -15,7 +15,7 @@ - + diff --git a/templates/jobs-header.tmpl b/templates/jobs-header.tmpl index 45743a18a..5a660611f 100644 --- a/templates/jobs-header.tmpl +++ b/templates/jobs-header.tmpl @@ -1,15 +1,15 @@

    {?which_jobs=?Show Completed Jobs +SRC="/images/button-show-completed.gif" CLASS="button" ALT="Show Completed Jobs"> Show All Jobs:{which_jobs=all?:{which_jobs=all?Show Completed Jobs +SRC="/images/button-show-completed.gif" CLASS="button" ALT="Show Completed Jobs"> Show Active Jobs::Show Active Jobs +SRC="/images/button-show-active.gif" CLASS="button" ALT="Show Active Jobs"> Show All Jobs}}

    +SRC="/images/button-show-all.gif" CLASS="button" ALT="Show All Jobs">}}

    {total=0?No jobs:Showing {#job_id} of {total} {?which_jobs=?active:{which_jobs=all?:completed}} job{total=1?:s}}.

    diff --git a/templates/jobs.tmpl b/templates/jobs.tmpl index b18604edc..4f22096f3 100644 --- a/templates/jobs.tmpl +++ b/templates/jobs.tmpl @@ -23,18 +23,18 @@ {job_preserved>0? -Reprint Job:} +Reprint Job:} {job_state=4? -Release Job:} +Release Job:} {job_state=3? -Hold Job:} +Hold Job:} {job_state<7? -Cancel Job +Cancel Job Move Job:} +SRC="/images/button-move-job.gif" ALT="Move Job" CLASS="button">:}   } diff --git a/templates/modify-class.tmpl b/templates/modify-class.tmpl index 4cacc2654..88839ec48 100644 --- a/templates/modify-class.tmpl +++ b/templates/modify-class.tmpl @@ -27,7 +27,7 @@ - + diff --git a/templates/modify-printer.tmpl b/templates/modify-printer.tmpl index 37847a59e..af72cf996 100644 --- a/templates/modify-printer.tmpl +++ b/templates/modify-printer.tmpl @@ -22,7 +22,7 @@ - + diff --git a/templates/option-trailer.tmpl b/templates/option-trailer.tmpl index a8ff4c6fe..d689a442d 100644 --- a/templates/option-trailer.tmpl +++ b/templates/option-trailer.tmpl @@ -1,5 +1,5 @@ - + diff --git a/templates/pager.tmpl b/templates/pager.tmpl index 4f017c280..975f5923a 100644 --- a/templates/pager.tmpl +++ b/templates/pager.tmpl @@ -1,7 +1,7 @@ - - - + + +
    {PREVURL?Show Previous: }{ORDER=dec?Sort Ascending:Sort Descending}{NEXTURL?Show Next: }{PREVURL?Show Previous: }{ORDER=dec?Sort Ascending:Sort Descending}{NEXTURL?Show Next: }
    diff --git a/templates/printer-confirm.tmpl b/templates/printer-confirm.tmpl index 046acb93d..054d3895f 100644 --- a/templates/printer-confirm.tmpl +++ b/templates/printer-confirm.tmpl @@ -3,5 +3,5 @@

    Delete Printer

    diff --git a/templates/printers.tmpl b/templates/printers.tmpl index da2824457..79e4ddd81 100644 --- a/templates/printers.tmpl +++ b/templates/printers.tmpl @@ -17,46 +17,46 @@

    -Print Test Page +Print Test Page {?cupscommand=1? -Clean Print Heads +Clean Print Heads -Print Self Test Page:} +Print Self Test Page:} {printer_state=5? -Start Printer +Start Printer : -Stop Printer +Stop Printer } {printer_is_accepting_jobs=0? -Accept Jobs +Accept Jobs : -Reject Jobs +Reject Jobs } -Move All Jobs +Move All Jobs -Cancel All Jobs +Cancel All Jobs {printer_is_shared=0? -Publish Printer +Publish Printer : -Unpublish Printer +Unpublish Printer } -Modify Printer +Modify Printer -Set Printer Options +Set Printer Options -Delete Printer +Delete Printer -Set As Default +Set As Default -Set Allowed Users +Set Allowed Users

    diff --git a/templates/samba-export.tmpl b/templates/samba-export.tmpl index 0510f550c..426465905 100644 --- a/templates/samba-export.tmpl +++ b/templates/samba-export.tmpl @@ -47,7 +47,7 @@ onChange="select_printers()"> Export All Printers - diff --git a/templates/search.tmpl b/templates/search.tmpl index 8fc2ac7c6..e1c7c9e74 100644 --- a/templates/search.tmpl +++ b/templates/search.tmpl @@ -5,6 +5,9 @@

    Search in {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classes:{SECTION=jobs?Jobs:Printers}}}:

    +TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Search"> +Clear

    diff --git a/templates/users.tmpl b/templates/users.tmpl index 61c6e474b..b2594f092 100644 --- a/templates/users.tmpl +++ b/templates/users.tmpl @@ -18,7 +18,7 @@ - + -- 2.39.2