X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=cups%2Fipp-support.c;h=d45ec0c9cd2645c382e2046e9f6547e6648516c2;hb=9e24f768b9051731c70c64eb931ebcffbaae4577;hp=f6380d8ac524dc6f8ab7764dcffc33f59ad94ea6;hpb=9c0e8e5d83879f36c798e1d84a4a947109bc0204;p=thirdparty%2Fcups.git diff --git a/cups/ipp-support.c b/cups/ipp-support.c index f6380d8ac..d45ec0c9c 100644 --- a/cups/ipp-support.c +++ b/cups/ipp-support.c @@ -1,39 +1,11 @@ /* - * "$Id$" + * Internet Printing Protocol support functions for CUPS. * - * Internet Printing Protocol support functions for CUPS. + * Copyright © 2007-2018 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * - * Copyright 2007-2013 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * ippAttributeString() - Convert the attribute's value to a string. - * ippCreateRequestedArray() - Create a CUPS array of attribute names from - * the given requested-attributes attribute. - * ippEnumString() - Return a string corresponding to the enum - * value. - * ippEnumValue() - Return the value associated with a given enum - * string. - * ippErrorString() - Return a name for the given status code. - * ippErrorValue() - Return a status code for the given name. - * ippOpString() - Return a name for the given operation id. - * ippOpValue() - Return an operation id for the given name. - * ippPort() - Return the default IPP port number. - * ippSetPort() - Set the default port number. - * ippTagString() - Return the tag name corresponding to a tag - * value. - * ippTagValue() - Return the tag value corresponding to a tag - * name. - * ipp_col_string() - Convert a collection to a string. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -41,12 +13,21 @@ */ #include "cups-private.h" +#include "debug-internal.h" /* * Local globals... */ +static const char * const ipp_states[] = + { + "IPP_STATE_ERROR", + "IPP_STATE_IDLE", + "IPP_STATE_HEADER", + "IPP_STATE_ATTRIBUTE", + "IPP_STATE_DATA" + }; static const char * const ipp_status_oks[] = /* "OK" status codes */ { /* (name) = abandoned standard value */ "successful-ok", @@ -87,7 +68,12 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "client-error-document-password-error", "client-error-document-permission-error", "client-error-document-security-error", - "client-error-document-unprintable-error" + "client-error-document-unprintable-error", + "client-error-account-info-needed", + "client-error-account-closed", + "client-error-account-limit-reached", + "client-error-account-authorization-failed", + "client-error-not-fetchable" }, * const ipp_status_480s[] = /* Vendor client errors */ { @@ -153,73 +139,117 @@ static const char * const ipp_std_ops[] = /* 0x0000 - 0x000f */ "0x0000", "0x0001", - "Print-Job", - "Print-URI", - "Validate-Job", - "Create-Job", - "Send-Document", - "Send-URI", - "Cancel-Job", - "Get-Job-Attributes", - "Get-Jobs", - "Get-Printer-Attributes", - "Hold-Job", - "Release-Job", - "Restart-Job", + "Print-Job", /* RFC 8011 */ + "Print-URI", /* RFC 8011 */ + "Validate-Job", /* RFC 8011 */ + "Create-Job", /* RFC 8011 */ + "Send-Document", /* RFC 8011 */ + "Send-URI", /* RFC 8011 */ + "Cancel-Job", /* RFC 8011 */ + "Get-Job-Attributes", /* RFC 8011 */ + "Get-Jobs", /* RFC 8011 */ + "Get-Printer-Attributes", /* RFC 8011 */ + "Hold-Job", /* RFC 8011 */ + "Release-Job", /* RFC 8011 */ + "Restart-Job", /* RFC 8011 */ "0x000f", /* 0x0010 - 0x001f */ - "Pause-Printer", - "Resume-Printer", - "Purge-Jobs", - "Set-Printer-Attributes", - "Set-Job-Attributes", - "Get-Printer-Supported-Values", - "Create-Printer-Subscription", - "Create-Job-Subscription", - "Get-Subscription-Attributes", - "Get-Subscriptions", - "Renew-Subscription", - "Cancel-Subscription", - "Get-Notifications", + "Pause-Printer", /* RFC 8011 */ + "Resume-Printer", /* RFC 8011 */ + "Purge-Jobs", /* RFC 8011 */ + "Set-Printer-Attributes", /* RFC 3380 */ + "Set-Job-Attributes", /* RFC 3380 */ + "Get-Printer-Supported-Values", /* RFC 3380 */ + "Create-Printer-Subscriptions", /* RFC 3995 */ + "Create-Job-Subscriptions", /* RFC 3995 */ + "Get-Subscription-Attributes", /* RFC 3995 */ + "Get-Subscriptions", /* RFC 3995 */ + "Renew-Subscription", /* RFC 3995 */ + "Cancel-Subscription", /* RFC 3995 */ + "Get-Notifications", /* RFC 3996 */ "(Send-Notifications)", - "(Get-Resource-Attributes)", + "Get-Resource-Attributes", /* IPP System */ "(Get-Resource-Data)", /* 0x0020 - 0x002f */ - "(Get-Resources)", + "Get-Resources", /* IPP System */ "(Get-Printer-Support-Files)", - "Enable-Printer", - "Disable-Printer", - "Pause-Printer-After-Current-Job", - "Hold-New-Jobs", - "Release-Held-New-Jobs", - "Deactivate-Printer", - "Activate-Printer", - "Restart-Printer", - "Shutdown-Printer", - "Startup-Printer", - "Reprocess-Job", - "Cancel-Current-Job", - "Suspend-Current-Job", - "Resume-Job", - - /* 0x0030 - 0x003e */ - "Promote-Job", - "Schedule-Job-After", + "Enable-Printer", /* RFC 3998 */ + "Disable-Printer", /* RFC 3998 */ + "Pause-Printer-After-Current-Job", /* RFC 3998 */ + "Hold-New-Jobs", /* RFC 3998 */ + "Release-Held-New-Jobs", /* RFC 3998 */ + "Deactivate-Printer", /* RFC 3998 */ + "Activate-Printer", /* RFC 3998 */ + "Restart-Printer", /* RFC 3998 */ + "Shutdown-Printer", /* RFC 3998 */ + "Startup-Printer", /* RFC 3998 */ + "Reprocess-Job", /* RFC 3998 */ + "Cancel-Current-Job", /* RFC 3998 */ + "Suspend-Current-Job", /* RFC 3998 */ + "Resume-Job", /* RFC 3998 */ + + /* 0x0030 - 0x003f */ + "Promote-Job", /* RFC 3998 */ + "Schedule-Job-After", /* RFC 3998 */ "0x0032", - "Cancel-Document", - "Get-Document-Attributes", - "Get-Documents", - "Delete-Document", - "Set-Document-Attributes", - "Cancel-Jobs", - "Cancel-My-Jobs", - "Resubmit-Job", - "Close-Job", - "Identify-Printer", - "Validate-Document", - "Send-Hardcopy-Document" + "Cancel-Document", /* IPP DocObject */ + "Get-Document-Attributes", /* IPP DocObject */ + "Get-Documents", /* IPP DocObject */ + "Delete-Document", /* IPP DocObject */ + "Set-Document-Attributes", /* IPP DocObject */ + "Cancel-Jobs", /* IPP JPS2 */ + "Cancel-My-Jobs", /* IPP JPS2 */ + "Resubmit-Job", /* IPP JPS2 */ + "Close-Job", /* IPP JPS2 */ + "Identify-Printer", /* IPP JPS3 */ + "Validate-Document", /* IPP JPS3 */ + "Add-Document-Images", /* IPP Scan */ + "Acknowledge-Document", /* IPP INFRA */ + + /* 0x0040 - 0x004f */ + "Acknowledge-Identify-Printer", /* IPP INFRA */ + "Acknowledge-Job", /* IPP INFRA */ + "Fetch-Document", /* IPP INFRA */ + "Fetch-Job", /* IPP INFRA */ + "Get-Output-Device-Attributes", /* IPP INFRA */ + "Update-Active-Jobs", /* IPP INFRA */ + "Deregister-Output-Device", /* IPP INFRA */ + "Update-Document-Status", /* IPP INFRA */ + "Update-Job-Status", /* IPP INFRA */ + "Update-Output-Device-Attributes", /* IPP INFRA */ + "Get-Next-Document-Data", /* IPP Scan */ + "Allocate-Printer-Resources", /* IPP System */ + "Create-Printer", /* IPP System */ + "Deallocate-Printer-Resources", /* IPP System */ + "Delete-Printer", /* IPP System */ + "Get-Printers", /* IPP System */ + + /* 0x0050 - 0x005f */ + "Shutdown-One-Printer", /* IPP System */ + "Startup-One-Printer", /* IPP System */ + "Cancel-Resource", /* IPP System */ + "Create-Resource", /* IPP System */ + "Install-Resource", /* IPP System */ + "Send-Resource-Data", /* IPP System */ + "Set-Resource-Attributes", /* IPP System */ + "Create-Resource-Subscriptions", /* IPP System */ + "Create-System-Subscriptions", /* IPP System */ + "Disable-All-Printers", /* IPP System */ + "Enable-All-Printers", /* IPP System */ + "Get-System-Attributes", /* IPP System */ + "Get-System-Supported-Values", /* IPP System */ + "Pause-All-Printers", /* IPP System */ + "Pause-All-Printers-After-Current-Job", /* IPP System */ + "Register-Output-Device", /* IPP System */ + + /* 0x0060 - 0x0064 */ + "Restart-System", /* IPP System */ + "Resume-All-Printers", /* IPP System */ + "Set-System-Attributes", /* IPP System */ + "Shutdown-All-Printers", /* IPP System */ + "Startup-All-Printers" /* IPP System */ }, * const ipp_cups_ops[] = { @@ -241,7 +271,8 @@ static const char * const ipp_std_ops[] = }, * const ipp_cups_ops2[] = { - "CUPS-Get-Document" + "CUPS-Get-Document", + "CUPS-Create-Local-Printer" }, * const ipp_tag_names[] = { /* Value/group tag names */ @@ -256,14 +287,15 @@ static const char * const ipp_std_ops[] = "unsupported-attributes-tag", /* 0x05 */ "subscription-attributes-tag", - /* 0x06 */ + /* 0x06 - RFC 3995 */ "event-notification-attributes-tag", - /* 0x07 */ - "(resource-attributes-tag)", - /* 0x08 */ + /* 0x07 - RFC 3995 */ + "resource-attributes-tag", + /* 0x08 - IPP System */ "document-attributes-tag", - /* 0x09 */ - "0x0a", /* 0x0a */ + /* 0x09 - IPP DocObject */ + "system-attributes-tag", + /* 0x0a - IPP System */ "0x0b", /* 0x0b */ "0x0c", /* 0x0c */ "0x0d", /* 0x0d */ @@ -274,9 +306,9 @@ static const char * const ipp_std_ops[] = "unknown", /* 0x12 */ "no-value", /* 0x13 */ "0x14", /* 0x14 */ - "not-settable", /* 0x15 */ - "delete-attribute", /* 0x16 */ - "admin-define", /* 0x17 */ + "not-settable", /* 0x15 - RFC 3380 */ + "delete-attribute", /* 0x16 - RFC 3380 */ + "admin-define", /* 0x17 - RFC 3380 */ "0x18", /* 0x18 */ "0x19", /* 0x19 */ "0x1a", /* 0x1a */ @@ -334,7 +366,7 @@ static const char * const ipp_document_states[] = "pending", "4", "processing", - "6", + "processing-stopped", /* IPP INFRA */ "canceled", "aborted", "completed" @@ -353,8 +385,8 @@ static const char * const ipp_document_states[] = "bale", "booklet-maker", "jog-offset", - "15", - "16", + "coat", /* IPP Finishings 2.0 */ + "laminate", /* IPP Finishings 2.0 */ "17", "18", "19", @@ -370,10 +402,10 @@ static const char * const ipp_document_states[] = "staple-dual-top", "staple-dual-right", "staple-dual-bottom", - "32", - "33", - "34", - "35", + "staple-triple-left", /* IPP Finishings 2.0 */ + "staple-triple-top", /* IPP Finishings 2.0 */ + "staple-triple-right",/* IPP Finishings 2.0 */ + "staple-triple-bottom",/* IPP Finishings 2.0 */ "36", "37", "38", @@ -408,37 +440,38 @@ static const char * const ipp_document_states[] = "67", "68", "69", - "punch-top-left", - "punch-bottom-left", - "punch-top-right", - "punch-bottom-right", - "punch-dual-left", - "punch-dual-top", - "punch-dual-right", - "punch-dual-bottom", - "punch-triple-left", - "punch-triple-top", - "punch-triple-right", - "punch-triple-bottom", - "punch-quad-left", - "punch-quad-top", - "punch-quad-right", - "punch-quad-bottom", - "86", - "87", - "88", - "89", - "fold-accordian", - "fold-double-gate", - "fold-gate", - "fold-half", - "fold-half-z", - "fold-left-gate", - "fold-letter", - "fold-parallel", - "fold-poster", - "fold-right-gate", - "fold-z" + "punch-top-left", /* IPP Finishings 2.0 */ + "punch-bottom-left", /* IPP Finishings 2.0 */ + "punch-top-right", /* IPP Finishings 2.0 */ + "punch-bottom-right", /* IPP Finishings 2.0 */ + "punch-dual-left", /* IPP Finishings 2.0 */ + "punch-dual-top", /* IPP Finishings 2.0 */ + "punch-dual-right", /* IPP Finishings 2.0 */ + "punch-dual-bottom", /* IPP Finishings 2.0 */ + "punch-triple-left", /* IPP Finishings 2.0 */ + "punch-triple-top", /* IPP Finishings 2.0 */ + "punch-triple-right", /* IPP Finishings 2.0 */ + "punch-triple-bottom",/* IPP Finishings 2.0 */ + "punch-quad-left", /* IPP Finishings 2.0 */ + "punch-quad-top", /* IPP Finishings 2.0 */ + "punch-quad-right", /* IPP Finishings 2.0 */ + "punch-quad-bottom", /* IPP Finishings 2.0 */ + "punch-multiple-left",/* IPP Finishings 2.1/Canon */ + "punch-multiple-top", /* IPP Finishings 2.1/Canon */ + "punch-multiple-right",/* IPP Finishings 2.1/Canon */ + "punch-multiple-bottom",/* IPP Finishings 2.1/Canon */ + "fold-accordian", /* IPP Finishings 2.0 */ + "fold-double-gate", /* IPP Finishings 2.0 */ + "fold-gate", /* IPP Finishings 2.0 */ + "fold-half", /* IPP Finishings 2.0 */ + "fold-half-z", /* IPP Finishings 2.0 */ + "fold-left-gate", /* IPP Finishings 2.0 */ + "fold-letter", /* IPP Finishings 2.0 */ + "fold-parallel", /* IPP Finishings 2.0 */ + "fold-poster", /* IPP Finishings 2.0 */ + "fold-right-gate", /* IPP Finishings 2.0 */ + "fold-z", /* IPP Finishings 2.0 */ + "fold-engineering-z" /* IPP Finishings 2.1 */ }, * const ipp_finishings_vendor[] = { @@ -572,7 +605,8 @@ static const char * const ipp_document_states[] = "portrait", "landscape", "reverse-landscape", - "reverse-portrait" + "reverse-portrait", + "none" }, * const ipp_print_qualities[] = { /* print-quality enums */ @@ -584,7 +618,21 @@ static const char * const ipp_document_states[] = { /* printer-state enums */ "idle", "processing", - "stopped", + "stopped" + }, + * const ipp_resource_states[] = + { /* resource-state enums */ + "pending", + "available", + "installed", + "canceled", + "aborted" + }, + * const ipp_system_states[] = + { /* system-state enums */ + "idle", + "processing", + "stopped" }; @@ -602,7 +650,7 @@ static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize); * trailing nul. The buffer pointer can be NULL to get the required length, * just like (v)snprintf. * - * @since CUPS 1.6/OS X 10.8@ + * @since CUPS 1.6/macOS 10.8@ */ size_t /* O - Number of bytes less nul */ @@ -650,53 +698,51 @@ ippAttributeString( ptr = ippEnumString(attr->name, val->integer); if (buffer && bufptr < bufend) - strlcpy(bufptr, ptr, bufend - bufptr + 1); + strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; case IPP_TAG_INTEGER : if (buffer && bufptr < bufend) - bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d", val->integer); + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d", val->integer); else bufptr += snprintf(temp, sizeof(temp), "%d", val->integer); break; case IPP_TAG_BOOLEAN : if (buffer && bufptr < bufend) - strlcpy(bufptr, val->boolean ? "true" : "false", - bufend - bufptr + 1); + strlcpy(bufptr, val->boolean ? "true" : "false", (size_t)(bufend - bufptr + 1)); bufptr += val->boolean ? 4 : 5; break; case IPP_TAG_RANGE : if (buffer && bufptr < bufend) - bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d-%d", - val->range.lower, val->range.upper); + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d-%d", val->range.lower, val->range.upper); else - bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, - val->range.upper); + bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, val->range.upper); break; case IPP_TAG_RESOLUTION : - if (buffer && bufptr < bufend) - bufptr += snprintf(bufptr, bufend - bufptr + 1, "%dx%d%s", - val->resolution.xres, val->resolution.yres, - val->resolution.units == IPP_RES_PER_INCH ? - "dpi" : "dpcm"); + if (val->resolution.xres == val->resolution.yres) + { + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + else + bufptr += snprintf(temp, sizeof(temp), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + } + else if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else - bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", - val->resolution.xres, val->resolution.yres, - val->resolution.units == IPP_RES_PER_INCH ? - "dpi" : "dpcm"); + bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); break; case IPP_TAG_DATE : { unsigned year; /* Year */ - year = (val->date[0] << 8) + val->date[1]; + year = ((unsigned)val->date[0] << 8) + (unsigned)val->date[1]; if (val->date[9] == 0 && val->date[10] == 0) snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ", @@ -710,7 +756,7 @@ ippAttributeString( val->date[10]); if (buffer && bufptr < bufend) - strlcpy(bufptr, temp, bufend - bufptr + 1); + strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } @@ -754,7 +800,7 @@ ippAttributeString( bufptr ++; if (buffer && bufptr < bufend) - strlcpy(bufptr, val->string.language, bufend - bufptr); + strlcpy(bufptr, val->string.language, (size_t)(bufend - bufptr)); bufptr += strlen(val->string.language); if (buffer && bufptr < bufend) @@ -765,8 +811,7 @@ ippAttributeString( case IPP_TAG_BEGIN_COLLECTION : if (buffer && bufptr < bufend) - bufptr += ipp_col_string(val->collection, bufptr, - bufend - bufptr + 1); + bufptr += ipp_col_string(val->collection, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ipp_col_string(val->collection, NULL, 0); break; @@ -788,11 +833,9 @@ ippAttributeString( else if (!isprint(*ptr & 255)) { if (buffer && bufptr < bufend) - bufptr += snprintf(bufptr, bufend - bufptr + 1, "\\%03o", - *ptr & 255); + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *ptr & 255); else - bufptr += snprintf(temp, sizeof(temp), "\\%03o", - *ptr & 255); + bufptr += snprintf(temp, sizeof(temp), "\\%03o", *ptr & 255); } else { @@ -806,7 +849,7 @@ ippAttributeString( default : ptr = ippTagString(attr->value_tag); if (buffer && bufptr < bufend) - strlcpy(bufptr, ptr, bufend - bufptr + 1); + strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; } @@ -817,7 +860,7 @@ ippAttributeString( else if (bufend) *bufend = '\0'; - return (bufptr - buffer); + return ((size_t)(bufptr - buffer)); } @@ -838,7 +881,7 @@ ippAttributeString( * "attribute-name")@ will return a non-NULL pointer. The array must be freed * using the @code cupsArrayDelete@ function. * - * @since CUPS 1.7/OS X 10.9@ + * @since CUPS 1.7/macOS 10.9@ */ cups_array_t * /* O - CUPS array or @code NULL@ if all */ @@ -847,6 +890,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ int i, j, /* Looping vars */ count, /* Number of values */ added; /* Was name added? */ + ipp_op_t op; /* IPP operation code */ ipp_attribute_t *requested; /* requested-attributes attribute */ cups_array_t *ra; /* Requested attributes array */ const char *value; /* Current value */ @@ -882,25 +926,31 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "document-state-message", "document-state-reasons", "document-uri", - "document-uuid", + "document-uuid", /* IPP JPS3 */ "errors-count", "finishings-actual", "finishings-col-actual", "force-front-side-actual", "imposition-template-actual", "impressions", + "impressions-col", "impressions-completed", + "impressions-completed-col", "impressions-completed-current-copy", "insert-sheet-actual", "k-octets", "k-octets-processed", "last-document", + "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-input-tray-check-actual", "media-sheets", + "media-sheets-col", "media-sheets-completed", + "media-sheets-completed-col", "more-info", + "multiple-object-handling-actual", /* IPP 3D */ "number-up-actual", "orientation-requested-actual", "output-bin-actual", @@ -910,14 +960,21 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "page-order-received-actual", "page-ranges-actual", "pages", + "pages-col", "pages-completed", + "pages-completed-col", "pages-completed-current-copy", + "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", + "print-accuracy-actual", /* IPP 3D */ + "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", + "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ + "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "printer-up-time", "separator-sheets-actual", @@ -937,6 +994,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ }; static const char * const document_template[] = { /* document-template group */ + "chamber-humidity", /* IPP 3D */ + "chamber-humidity-default", /* IPP 3D */ + "chamber-humidity-supported", /* IPP 3D */ + "chamber-temperature", /* IPP 3D */ + "chamber-temperature-default", /* IPP 3D */ + "chamber-temperature-supported", /* IPP 3D */ "copies", "copies-default", "copies-supported", @@ -951,9 +1014,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "feed-orientation-supported", "finishings", "finishings-col", + "finishings-col-database", "finishings-col-default", + "finishings-col-ready", "finishings-col-supported", "finishings-default", + "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", @@ -972,12 +1038,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "insert-sheet", "insert-sheet-default", "insert-sheet-supported", + "material-amount-units-supported", /* IPP 3D */ + "material-diameter-supported", /* IPP 3D */ + "material-purpose-supported", /* IPP 3D */ + "material-rate-supported", /* IPP 3D */ + "material-rate-units-supported", /* IPP 3D */ + "material-shell-thickness-supported",/* IPP 3D */ + "material-temperature-supported", /* IPP 3D */ + "material-type-supported", /* IPP 3D */ + "materials-col", /* IPP 3D */ + "materials-col-database", /* IPP 3D */ + "materials-col-default", /* IPP 3D */ + "materials-col-ready", /* IPP 3D */ + "materials-col-supported", /* IPP 3D */ + "max-materials-col-supported", /* IPP 3D */ "max-stitching-locations-supported", "media", "media-back-coating-supported", "media-bottom-margin-supported", "media-col", "media-col-default", + "media-col-ready", "media-col-supported", "media-color-supported", "media-default", @@ -992,6 +1073,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", + "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", @@ -1004,6 +1086,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", + "multiple-object-handling", /* IPP 3D */ + "multiple-object-handling-default", /* IPP 3D */ + "multiple-object-handling-supported",/* IPP 3D */ "number-up", "number-up-default", "number-up-supported", @@ -1032,15 +1117,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", + "platform-temperature", /* IPP 3D */ + "platform-temperature-default", /* IPP 3D */ + "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", + "print-accuracy", /* IPP 3D */ + "print-accuracy-default", /* IPP 3D */ + "print-accuracy-supported", /* IPP 3D */ + "print-base", /* IPP 3D */ + "print-base-default", /* IPP 3D */ + "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", + "print-objects", /* IPP 3D */ + "print-objects-default", /* IPP 3D */ + "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", @@ -1050,6 +1147,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ + "print-supports", /* IPP 3D */ + "print-supports-default", /* IPP 3D */ + "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", @@ -1091,6 +1191,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ }; static const char * const job_description[] = { /* job-description group */ + "chamber-humidity-actual", /* IPP 3D */ + "chamber-temperature-actual", /* IPP 3D */ "compression-supplied", "copies-actual", "cover-back-actual", @@ -1134,27 +1236,34 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-hold-until-actual", "job-id", "job-impressions", + "job-impressions-col", "job-impressions-completed", + "job-impressions-completed-col", "job-k-octets", "job-k-octets-processed", "job-mandatory-attributes", "job-media-progress", /* CUPS extension */ "job-media-sheets", + "job-media-sheets-col", "job-media-sheets-completed", + "job-media-sheets-completed-col", "job-message-from-operator", "job-more-info", "job-name", "job-originating-host-name", /* CUPS extension */ "job-originating-user-name", - "job-originating-user-uri", + "job-originating-user-uri", /* IPP JPS3 */ "job-pages", + "job-pages-col", "job-pages-completed", + "job-pages-completed-col", "job-pages-completed-current-copy", "job-printer-state-message", /* CUPS extension */ "job-printer-state-reasons", /* CUPS extension */ "job-printer-up-time", "job-printer-uri", "job-priority-actual", + "job-resource-ids", /* IPP System */ "job-save-printer-make-and-model", "job-sheet-message-actual", "job-sheets-actual", @@ -1163,11 +1272,13 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-state-message", "job-state-reasons", "job-uri", - "job-uuid", + "job-uuid", /* IPP JPS3 */ + "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-check-input-tray-actual", "multiple-document-handling-actual", + "multiple-object-handling-actual", /* IPP 3D */ "number-of-documents", "number-of-intervening-jobs", "number-up-actual", @@ -1175,16 +1286,25 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "original-requesting-user-name", "output-bin-actual", "output-device-assigned", + "output-device-job-state", /* IPP INFRA */ + "output-device-job-state-message", /* IPP INFRA */ + "output-device-job-state-reasons", /* IPP INFRA */ + "output-device-uuid-assigned", /* IPP INFRA */ "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", + "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", + "print-accuracy-actual", /* IPP 3D */ + "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", + "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ + "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "separator-sheets-actual", "sheet-collate-actual", @@ -1206,6 +1326,13 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ }; static const char * const job_template[] = { /* job-template group */ + "accuracy-units-supported", /* IPP 3D */ + "chamber-humidity", /* IPP 3D */ + "chamber-humidity-default", /* IPP 3D */ + "chamber-humidity-supported", /* IPP 3D */ + "chamber-temperature", /* IPP 3D */ + "chamber-temperature-default", /* IPP 3D */ + "chamber-temperature-supported", /* IPP 3D */ "confirmation-sheet-print", /* IPP FaxOut */ "confirmation-sheet-print-default", "copies", @@ -1228,9 +1355,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "feed-orientation-supported", "finishings", "finishings-col", + "finishings-col-database", "finishings-col-default", + "finishings-col-ready", "finishings-col-supported", "finishings-default", + "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", @@ -1313,6 +1443,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-sheets-default", "job-sheets-supported", "logo-uri-schemes-supported", + "material-amount-units-supported", /* IPP 3D */ + "material-diameter-supported", /* IPP 3D */ + "material-purpose-supported", /* IPP 3D */ + "material-rate-supported", /* IPP 3D */ + "material-rate-units-supported", /* IPP 3D */ + "material-shell-thickness-supported",/* IPP 3D */ + "material-temperature-supported", /* IPP 3D */ + "material-type-supported", /* IPP 3D */ + "materials-col", /* IPP 3D */ + "materials-col-database", /* IPP 3D */ + "materials-col-default", /* IPP 3D */ + "materials-col-ready", /* IPP 3D */ + "materials-col-supported", /* IPP 3D */ + "max-materials-col-supported", /* IPP 3D */ "max-save-info-supported", "max-stitching-locations-supported", "media", @@ -1320,6 +1464,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "media-bottom-margin-supported", "media-col", "media-col-default", + "media-col-ready", "media-col-supported", "media-color-supported", "media-default", @@ -1334,6 +1479,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", + "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", @@ -1346,6 +1492,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", + "multiple-object-handling", /* IPP 3D */ + "multiple-object-handling-default", /* IPP 3D */ + "multiple-object-handling-supported",/* IPP 3D */ "number-of-retries", /* IPP FaxOut */ "number-of-retries-default", "number-of-retries-supported", @@ -1359,8 +1508,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "output-bin-default", "output-bin-supported", "output-device", - "output-device-default", "output-device-supported", + "output-device-uuid-supported", /* IPP INFRA */ "output-mode", /* CUPS extension */ "output-mode-default", /* CUPS extension */ "output-mode-supported", /* CUPS extension */ @@ -1383,15 +1532,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", + "platform-temperature", /* IPP 3D */ + "platform-temperature-default", /* IPP 3D */ + "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", + "print-accuracy", /* IPP 3D */ + "print-accuracy-default", /* IPP 3D */ + "print-accuracy-supported", /* IPP 3D */ + "print-base", /* IPP 3D */ + "print-base-default", /* IPP 3D */ + "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", + "print-objects", /* IPP 3D */ + "print-objects-default", /* IPP 3D */ + "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", @@ -1401,6 +1562,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ + "print-supports", /* IPP 3D */ + "print-supports-default", /* IPP 3D */ + "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", @@ -1459,6 +1623,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ static const char * const printer_description[] = { /* printer-description group */ "auth-info-required", /* CUPS extension */ + "chamber-humidity-current", /* IPP 3D */ + "chamber-temperature-current", /* IPP 3D */ "charset-configured", "charset-supported", "color-supported", @@ -1481,6 +1647,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "document-natural-language-default", "document-natural-language-supported", "document-password-supported", + "document-privacy-attributes", /* IPP Privacy Attributes */ + "document-privacy-scope", /* IPP Privacy Attributes */ "generated-natural-language-supported", "identify-actions-default", "identify-actions-supported", @@ -1501,10 +1669,14 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-page-limit", /* CUPS extension */ "job-password-encryption-supported", "job-password-supported", + "job-presets-supported", /* IPP Presets */ + "job-privacy-attributes", /* IPP Privacy Attributes */ + "job-privacy-scope", /* IPP Privacy Attributes */ "job-quota-period", /* CUPS extension */ "job-resolvers-supported", "job-settable-attributes-supported", "job-spooling-supported", + "job-triggers-supported", /* IPP Presets */ "jpeg-k-octets-supported", /* CUPS extension */ "jpeg-x-dimension-supported", /* CUPS extension */ "jpeg-y-dimension-supported", /* CUPS extension */ @@ -1518,8 +1690,6 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "marker-message", /* CUPS extension */ "marker-names", /* CUPS extension */ "marker-types", /* CUPS extension */ - "media-col-ready", - "media-ready", "member-names", /* CUPS extension */ "member-uris", /* CUPS extension */ "multiple-destination-uris-supported",/* IPP FaxOut */ @@ -1531,16 +1701,23 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pages-per-minute", "pages-per-minute-color", "pdf-k-octets-supported", /* CUPS extension */ + "pdf-features-supported", /* IPP 3D */ "pdf-versions-supported", /* CUPS extension */ "pdl-override-supported", + "platform-shape", /* IPP 3D */ "port-monitor", /* CUPS extension */ "port-monitor-supported", /* CUPS extension */ "preferred-attributes-supported", "printer-alert", "printer-alert-description", + "printer-camera-image-uri", /* IPP 3D */ "printer-charge-info", "printer-charge-info-uri", "printer-commands", /* CUPS extension */ + "printer-config-change-date-time", + "printer-config-change-time", + "printer-config-changes", /* IPP System */ + "printer-contact-col", /* IPP System */ "printer-current-time", "printer-detailed-status-messages", "printer-device-id", @@ -1550,13 +1727,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "printer-fax-modem-info", /* IPP FaxOut */ "printer-fax-modem-name", /* IPP FaxOut */ "printer-fax-modem-number", /* IPP FaxOut */ + "printer-firmware-name", /* PWG 5110.1 */ + "printer-firmware-patches", /* PWG 5110.1 */ + "printer-firmware-string-version", /* PWG 5110.1 */ + "printer-firmware-version", /* PWG 5110.1 */ "printer-geo-location", "printer-get-attributes-supported", "printer-icc-profiles", "printer-icons", + "printer-id", /* IPP System */ "printer-info", + "printer-input-tray", /* IPP JPS3 */ "printer-is-accepting-jobs", "printer-is-shared", /* CUPS extension */ + "printer-is-temporary", /* CUPS extension */ "printer-kind", /* IPP Paid Printing */ "printer-location", "printer-make-and-model", @@ -1570,6 +1754,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "printer-native-formats", "printer-organization", "printer-organizational-unit", + "printer-output-tray", /* IPP JPS3 */ + "printer-service-type", /* IPP System */ "printer-settable-attributes-supported", "printer-state", "printer-state-change-date-time", @@ -1594,6 +1780,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "requesting-user-name-denied", /* CUPS extension */ "requesting-user-uri-supported", "subordinate-printers-supported", + "subscription-privacy-attributes", /* IPP Privacy Attributes */ + "subscription-privacy-scope", /* IPP Privacy Attributes */ "urf-supported", /* CUPS extension */ "uri-authentication-supported", "uri-security-supported", @@ -1603,17 +1791,54 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "xri-security-supported", "xri-uri-scheme-supported" }; + static const char * const resource_description[] = + { /* resource-description group - IPP System */ + "resource-info", + "resource-name" + }; + static const char * const resource_status[] = + { /* resource-status group - IPP System */ + "date-time-at-canceled", + "date-time-at-creation", + "date-time-at-installed", + "resource-data-uri", + "resource-format", + "resource-id", + "resource-k-octets", + "resource-state", + "resource-state-message", + "resource-state-reasons", + "resource-string-version", + "resource-type", + "resource-use-count", + "resource-uuid", + "resource-version", + "time-at-canceled", + "time-at-creation", + "time-at-installed" + }; + static const char * const resource_template[] = + { /* resource-template group - IPP System */ + "resource-format", + "resource-format-supported", + "resource-info", + "resource-name", + "resource-type", + "resource-type-supported" + }; static const char * const subscription_description[] = { /* subscription-description group */ "notify-job-id", "notify-lease-expiration-time", "notify-printer-up-time", "notify-printer-uri", + "notify-resource-id", /* IPP System */ + "notify-system-uri", /* IPP System */ "notify-sequence-number", "notify-subscriber-user-name", "notify-subscriber-user-uri", "notify-subscription-id", - "subscriptions-uuid" + "notify-subscription-uuid" /* IPP JPS3 */ }; static const char * const subscription_template[] = { /* subscription-template group */ @@ -1635,21 +1860,73 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "notify-time-interval", "notify-user-data" }; + static const char * const system_description[] = + { /* system-description group - IPP System */ + "charset-configured", + "charset-supported", + "generated-natural-language-supported", + "ipp-features-supported", + "ipp-versions-supported", + "natural-language-configured", + "operations-supported", + "power-calendar-policy-col", + "power-event-policy-col", + "power-timeout-policy-col", + "printer-creation-attributes-supported", + "resource-settable-attributes-supported", + "system-contact-col", + "system-current-time", + "system-default-printer-id", + "system-device-id", + "system-geo-location", + "system-info", + "system-location", + "system-mandatory-printer-attributes", + "system-make-and-model", + "system-message-from-operator", + "system-name", + "system-settable-attributes-supported", + "system-strings-languages-supported", + "system-strings-uri", + "system-xri-supported" + }; + static const char * const system_status[] = + { /* system-status group - IPP System */ + "power-log-col", + "power-state-capabilities-col", + "power-state-counters-col", + "power-state-monitor-col", + "power-state-transitions-col", + "system-config-change-date-time", + "system-config-change-time", + "system-config-changes", + "system-configured-printers", + "system-configured-resources", + "system-serial-number", + "system-state", + "system-state-change-date-time", + "system-state-change-time", + "system-state-message", + "system-state-reasons", + "system-up-time", + "system-uuid" + }; /* * Get the requested-attributes attribute... */ - if ((requested = ippFindAttribute(request, "requested-attributes", - IPP_TAG_KEYWORD)) == NULL) + op = ippGetOperation(request); + + if ((requested = ippFindAttribute(request, "requested-attributes", IPP_TAG_KEYWORD)) == NULL) { /* * The Get-Jobs operation defaults to "job-id" and "job-uri", all others * default to "all"... */ - if (ippGetOperation(request) == IPP_OP_GET_JOBS) + if (op == IPP_OP_GET_JOBS) { ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); @@ -1680,12 +1957,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ added = 0; value = ippGetString(requested, i, NULL); - if (!strcmp(value, "document-description") || !strcmp(value, "all")) + if (!strcmp(value, "document-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_DOCUMENT_ATTRIBUTES || op == IPP_OP_GET_DOCUMENTS))) { - for (j = 0; - j < (int)(sizeof(document_description) / - sizeof(document_description[0])); - j ++) + for (j = 0; j < (int)(sizeof(document_description) / sizeof(document_description[0])); j ++) cupsArrayAdd(ra, (void *)document_description[j]); added = 1; @@ -1693,67 +1967,92 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ if (!strcmp(value, "document-template") || !strcmp(value, "all")) { - for (j = 0; - j < (int)(sizeof(document_template) / sizeof(document_template[0])); - j ++) + for (j = 0; j < (int)(sizeof(document_template) / sizeof(document_template[0])); j ++) cupsArrayAdd(ra, (void *)document_template[j]); added = 1; } - if (!strcmp(value, "job-description") || !strcmp(value, "all")) + if (!strcmp(value, "job-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS))) { - for (j = 0; - j < (int)(sizeof(job_description) / sizeof(job_description[0])); - j ++) + for (j = 0; j < (int)(sizeof(job_description) / sizeof(job_description[0])); j ++) cupsArrayAdd(ra, (void *)job_description[j]); added = 1; } - if (!strcmp(value, "job-template") || !strcmp(value, "all")) + if (!strcmp(value, "job-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_PRINTER_ATTRIBUTES))) { - for (j = 0; - j < (int)(sizeof(job_template) / sizeof(job_template[0])); - j ++) + for (j = 0; j < (int)(sizeof(job_template) / sizeof(job_template[0])); j ++) cupsArrayAdd(ra, (void *)job_template[j]); added = 1; } - if (!strcmp(value, "printer-description") || !strcmp(value, "all")) + if (!strcmp(value, "printer-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_PRINTER_ATTRIBUTES || op == IPP_OP_GET_PRINTERS || op == IPP_OP_CUPS_GET_DEFAULT || op == IPP_OP_CUPS_GET_PRINTERS || op == IPP_OP_CUPS_GET_CLASSES))) { - for (j = 0; - j < (int)(sizeof(printer_description) / - sizeof(printer_description[0])); - j ++) + for (j = 0; j < (int)(sizeof(printer_description) / sizeof(printer_description[0])); j ++) cupsArrayAdd(ra, (void *)printer_description[j]); added = 1; } - if (!strcmp(value, "subscription-description") || !strcmp(value, "all")) + if (!strcmp(value, "resource-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) { - for (j = 0; - j < (int)(sizeof(subscription_description) / - sizeof(subscription_description[0])); - j ++) + for (j = 0; j < (int)(sizeof(resource_description) / sizeof(resource_description[0])); j ++) + cupsArrayAdd(ra, (void *)resource_description[j]); + + added = 1; + } + + if (!strcmp(value, "resource-status") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) + { + for (j = 0; j < (int)(sizeof(resource_status) / sizeof(resource_status[0])); j ++) + cupsArrayAdd(ra, (void *)resource_status[j]); + + added = 1; + } + + if (!strcmp(value, "resource-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES || op == IPP_OP_GET_SYSTEM_ATTRIBUTES))) + { + for (j = 0; j < (int)(sizeof(resource_template) / sizeof(resource_template[0])); j ++) + cupsArrayAdd(ra, (void *)resource_template[j]); + + added = 1; + } + + if (!strcmp(value, "subscription-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) + { + for (j = 0; j < (int)(sizeof(subscription_description) / sizeof(subscription_description[0])); j ++) cupsArrayAdd(ra, (void *)subscription_description[j]); added = 1; } - if (!strcmp(value, "subscription-template") || !strcmp(value, "all")) + if (!strcmp(value, "subscription-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) { - for (j = 0; - j < (int)(sizeof(subscription_template) / - sizeof(subscription_template[0])); - j ++) + for (j = 0; j < (int)(sizeof(subscription_template) / sizeof(subscription_template[0])); j ++) cupsArrayAdd(ra, (void *)subscription_template[j]); added = 1; } + if (!strcmp(value, "system-description") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) + { + for (j = 0; j < (int)(sizeof(system_description) / sizeof(system_description[0])); j ++) + cupsArrayAdd(ra, (void *)system_description[j]); + + added = 1; + } + + if (!strcmp(value, "system-status") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) + { + for (j = 0; j < (int)(sizeof(system_status) / sizeof(system_status[0])); j ++) + cupsArrayAdd(ra, (void *)system_status[j]); + + added = 1; + } + if (!added) cupsArrayAdd(ra, (void *)value); } @@ -1777,59 +2076,31 @@ ippEnumString(const char *attrname, /* I - Attribute name */ * Check for standard enum values... */ - if (!strcmp(attrname, "document-state") && - enumvalue >= 3 && - enumvalue < (3 + (int)(sizeof(ipp_document_states) / - sizeof(ipp_document_states[0])))) + if (!strcmp(attrname, "document-state") && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0])))) return (ipp_document_states[enumvalue - 3]); - else if (!strcmp(attrname, "finishings") || - !strcmp(attrname, "finishings-actual") || - !strcmp(attrname, "finishings-default") || - !strcmp(attrname, "finishings-ready") || - !strcmp(attrname, "finishings-supported") || - !strcmp(attrname, "job-finishings") || - !strcmp(attrname, "job-finishings-default") || - !strcmp(attrname, "job-finishings-supported")) + else if (!strcmp(attrname, "finishings") || !strcmp(attrname, "finishings-actual") || !strcmp(attrname, "finishings-default") || !strcmp(attrname, "finishings-ready") || !strcmp(attrname, "finishings-supported") || !strcmp(attrname, "job-finishings") || !strcmp(attrname, "job-finishings-default") || !strcmp(attrname, "job-finishings-supported")) { - if (enumvalue >= 3 && - enumvalue < (3 + (int)(sizeof(ipp_finishings) / - sizeof(ipp_finishings[0])))) + if (enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0])))) return (ipp_finishings[enumvalue - 3]); - else if (enumvalue >= 0x40000000 && - enumvalue <= (0x40000000 + (int)(sizeof(ipp_finishings_vendor) / - sizeof(ipp_finishings_vendor[0])))) + else if (enumvalue >= 0x40000000 && enumvalue <= (0x40000000 + (int)(sizeof(ipp_finishings_vendor) / sizeof(ipp_finishings_vendor[0])))) return (ipp_finishings_vendor[enumvalue - 0x40000000]); } - else if ((!strcmp(attrname, "job-collation-type") || - !strcmp(attrname, "job-collation-type-actual")) && - enumvalue >= 3 && - enumvalue < (3 + (int)(sizeof(ipp_job_collation_types) / - sizeof(ipp_job_collation_types[0])))) + else if ((!strcmp(attrname, "job-collation-type") || !strcmp(attrname, "job-collation-type-actual")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_job_collation_types) / sizeof(ipp_job_collation_types[0])))) return (ipp_job_collation_types[enumvalue - 3]); - else if (!strcmp(attrname, "job-state") && - enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED) + else if (!strcmp(attrname, "job-state") && enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED) return (ipp_job_states[enumvalue - IPP_JSTATE_PENDING]); else if (!strcmp(attrname, "operations-supported")) return (ippOpString((ipp_op_t)enumvalue)); - else if ((!strcmp(attrname, "orientation-requested") || - !strcmp(attrname, "orientation-requested-actual") || - !strcmp(attrname, "orientation-requested-default") || - !strcmp(attrname, "orientation-requested-supported")) && - enumvalue >= 3 && - enumvalue < (3 + (int)(sizeof(ipp_orientation_requesteds) / - sizeof(ipp_orientation_requesteds[0])))) + else if ((!strcmp(attrname, "orientation-requested") || !strcmp(attrname, "orientation-requested-actual") || !strcmp(attrname, "orientation-requested-default") || !strcmp(attrname, "orientation-requested-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_orientation_requesteds) / sizeof(ipp_orientation_requesteds[0])))) return (ipp_orientation_requesteds[enumvalue - 3]); - else if ((!strcmp(attrname, "print-quality") || - !strcmp(attrname, "print-quality-actual") || - !strcmp(attrname, "print-quality-default") || - !strcmp(attrname, "print-quality-supported")) && - enumvalue >= 3 && - enumvalue < (3 + (int)(sizeof(ipp_print_qualities) / - sizeof(ipp_print_qualities[0])))) + else if ((!strcmp(attrname, "print-quality") || !strcmp(attrname, "print-quality-actual") || !strcmp(attrname, "print-quality-default") || !strcmp(attrname, "print-quality-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0])))) return (ipp_print_qualities[enumvalue - 3]); - else if (!strcmp(attrname, "printer-state") && - enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED) + else if (!strcmp(attrname, "printer-state") && enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED) return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]); + else if (!strcmp(attrname, "resource-state") && enumvalue >= IPP_RSTATE_PENDING && enumvalue <= IPP_RSTATE_ABORTED) + return (ipp_resource_states[enumvalue - IPP_RSTATE_PENDING]); + else if (!strcmp(attrname, "system-state") && enumvalue >= IPP_SSTATE_IDLE && enumvalue <= IPP_SSTATE_STOPPED) + return (ipp_system_states[enumvalue - IPP_SSTATE_IDLE]); /* * Not a standard enum value, just return the decimal equivalent... @@ -1858,7 +2129,7 @@ ippEnumValue(const char *attrname, /* I - Attribute name */ */ if (isdigit(*enumstring & 255)) - return (strtol(enumstring, NULL, 0)); + return ((int)strtol(enumstring, NULL, 0)); /* * Otherwise look up the string... @@ -1921,6 +2192,16 @@ ippEnumValue(const char *attrname, /* I - Attribute name */ num_strings = (int)(sizeof(ipp_printer_states) / sizeof(ipp_printer_states[0])); strings = ipp_printer_states; } + else if (!strcmp(attrname, "resource-state")) + { + num_strings = (int)(sizeof(ipp_resource_states) / sizeof(ipp_resource_states[0])); + strings = ipp_resource_states; + } + else if (!strcmp(attrname, "system-state")) + { + num_strings = (int)(sizeof(ipp_system_states) / sizeof(ipp_system_states[0])); + strings = ipp_system_states; + } else return (-1); @@ -1953,7 +2234,7 @@ ippErrorString(ipp_status_t error) /* I - Error status */ else if (error == IPP_STATUS_CUPS_SEE_OTHER) return ("cups-see-other"); else if (error >= IPP_STATUS_ERROR_BAD_REQUEST && - error <= IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) + error <= IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED) return (ipp_status_400s[error - IPP_STATUS_ERROR_BAD_REQUEST]); else if (error >= 0x480 && error <= IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED) @@ -1979,13 +2260,13 @@ ippErrorString(ipp_status_t error) /* I - Error status */ /* * 'ippErrorValue()' - Return a status code for the given name. * - * @since CUPS 1.2/OS X 10.5@ + * @since CUPS 1.2/macOS 10.5@ */ ipp_status_t /* O - IPP status code */ ippErrorValue(const char *name) /* I - Name */ { - int i; + size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) @@ -2021,7 +2302,7 @@ ippErrorValue(const char *name) /* I - Name */ /* * 'ippOpString()' - Return a name for the given operation id. * - * @since CUPS 1.2/OS X 10.5@ + * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Name */ @@ -2034,14 +2315,14 @@ ippOpString(ipp_op_t op) /* I - Operation ID */ * See if the operation ID is a known value... */ - if (op >= IPP_OP_PRINT_JOB && op <= IPP_OP_VALIDATE_DOCUMENT) + if (op >= IPP_OP_PRINT_JOB && op < (ipp_op_t)(sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0]))) return (ipp_std_ops[op]); else if (op == IPP_OP_PRIVATE) return ("windows-ext"); else if (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD) return (ipp_cups_ops[op - IPP_OP_CUPS_GET_DEFAULT]); - else if (op == IPP_OP_CUPS_GET_DOCUMENT) - return (ipp_cups_ops2[0]); + else if (op >= IPP_OP_CUPS_GET_DOCUMENT && op <= IPP_OP_CUPS_CREATE_LOCAL_PRINTER) + return (ipp_cups_ops2[op - IPP_OP_CUPS_GET_DOCUMENT]); /* * No, build an "0xxxxx" operation string... @@ -2056,13 +2337,13 @@ ippOpString(ipp_op_t op) /* I - Operation ID */ /* * 'ippOpValue()' - Return an operation id for the given name. * - * @since CUPS 1.2/OS X 10.5@ + * @since CUPS 1.2/macOS 10.5@ */ ipp_op_t /* O - Operation ID */ ippOpValue(const char *name) /* I - Textual name */ { - int i; + size_t i; /* Looping var */ if (!strncmp(name, "0x", 2)) @@ -2083,6 +2364,12 @@ ippOpValue(const char *name) /* I - Textual name */ if (!_cups_strcasecmp(name, ipp_cups_ops2[i])) return ((ipp_op_t)(i + 0x4027)); + if (!_cups_strcasecmp(name, "Create-Job-Subscription")) + return (IPP_OP_CREATE_JOB_SUBSCRIPTIONS); + + if (!_cups_strcasecmp(name, "Create-Printer-Subscription")) + return (IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS); + if (!_cups_strcasecmp(name, "CUPS-Add-Class")) return (IPP_OP_CUPS_ADD_MODIFY_CLASS); @@ -2127,12 +2414,28 @@ ippSetPort(int p) /* I - Port number to use */ } +/* + * 'ippStateString()' - Return the name corresponding to a state value. + * + * @since CUPS 2.0/OS 10.10@ + */ + +const char * /* O - State name */ +ippStateString(ipp_state_t state) /* I - State value */ +{ + if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA) + return (ipp_states[state - IPP_STATE_ERROR]); + else + return ("UNKNOWN"); +} + + /* * 'ippTagString()' - Return the tag name corresponding to a tag value. * - * The returned names are defined in RFC 2911 and 3382. + * The returned names are defined in RFC 8011 and the IANA IPP Registry. * - * @since CUPS 1.4/OS X 10.6@ + * @since CUPS 1.4/macOS 10.6@ */ const char * /* O - Tag name */ @@ -2150,15 +2453,15 @@ ippTagString(ipp_tag_t tag) /* I - Tag value */ /* * 'ippTagValue()' - Return the tag value corresponding to a tag name. * - * The tag names are defined in RFC 2911 and 3382. + * The tag names are defined in RFC 8011 and the IANA IPP Registry. * - * @since CUPS 1.4/OS X 10.6@ + * @since CUPS 1.4/macOS 10.6@ */ ipp_tag_t /* O - Tag value */ ippTagValue(const char *name) /* I - Tag name */ { - int i; /* Looping var */ + size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++) @@ -2208,6 +2511,14 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */ ipp_attribute_t *attr; /* Current member attribute */ + if (!col) + { + if (buffer) + *buffer = '\0'; + + return (0); + } + bufptr = buffer; bufend = buffer + bufsize - 1; @@ -2222,12 +2533,12 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */ prefix = ' '; if (buffer && bufptr < bufend) - bufptr += snprintf(bufptr, bufend - bufptr + 1, "%s=", attr->name); + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%s=", attr->name); else bufptr += strlen(attr->name) + 1; if (buffer && bufptr < bufend) - bufptr += ippAttributeString(attr, bufptr, bufend - bufptr + 1); + bufptr += ippAttributeString(attr, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ippAttributeString(attr, temp, sizeof(temp)); } @@ -2243,10 +2554,5 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */ *bufptr = '}'; bufptr ++; - return (bufptr - buffer); + return ((size_t)(bufptr - buffer)); } - - -/* - * End of "$Id$". - */