/* * Internet Printing Protocol support functions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "debug-internal.h" /* * Local globals... */ static const char * const ipp_states[] = { "IPP_STATE_ERROR", "IPP_STATE_IDLE", "IPP_STATE_HEADER", "IPP_STATE_ATTRIBUTE", "IPP_STATE_DATA" }; static const char * const ipp_status_oks[] = /* "OK" status codes */ { /* (name) = abandoned standard value */ "successful-ok", "successful-ok-ignored-or-substituted-attributes", "successful-ok-conflicting-attributes", "successful-ok-ignored-subscriptions", "(successful-ok-ignored-notifications)", "successful-ok-too-many-events", "(successful-ok-but-cancel-subscription)", "successful-ok-events-complete" }, * const ipp_status_400s[] = /* Client errors */ { /* (name) = abandoned standard value */ "client-error-bad-request", "client-error-forbidden", "client-error-not-authenticated", "client-error-not-authorized", "client-error-not-possible", "client-error-timeout", "client-error-not-found", "client-error-gone", "client-error-request-entity-too-large", "client-error-request-value-too-long", "client-error-document-format-not-supported", "client-error-attributes-or-values-not-supported", "client-error-uri-scheme-not-supported", "client-error-charset-not-supported", "client-error-conflicting-attributes", "client-error-compression-not-supported", "client-error-compression-error", "client-error-document-format-error", "client-error-document-access-error", "client-error-attributes-not-settable", "client-error-ignored-all-subscriptions", "client-error-too-many-subscriptions", "(client-error-ignored-all-notifications)", "(client-error-client-print-support-file-not-found)", "client-error-document-password-error", "client-error-document-permission-error", "client-error-document-security-error", "client-error-document-unprintable-error", "client-error-account-info-needed", "client-error-account-closed", "client-error-account-limit-reached", "client-error-account-authorization-failed", "client-error-not-fetchable" }, * const ipp_status_480s[] = /* Vendor client errors */ { /* 0x0480 - 0x048F */ "0x0480", "0x0481", "0x0482", "0x0483", "0x0484", "0x0485", "0x0486", "0x0487", "0x0488", "0x0489", "0x048A", "0x048B", "0x048C", "0x048D", "0x048E", "0x048F", /* 0x0490 - 0x049F */ "0x0490", "0x0491", "0x0492", "0x0493", "0x0494", "0x0495", "0x0496", "0x0497", "0x0498", "0x0499", "0x049A", "0x049B", "cups-error-account-info-needed", "cups-error-account-closed", "cups-error-account-limit-reached", "cups-error-account-authorization-failed" }, * const ipp_status_500s[] = /* Server errors */ { "server-error-internal-error", "server-error-operation-not-supported", "server-error-service-unavailable", "server-error-version-not-supported", "server-error-device-error", "server-error-temporary-error", "server-error-not-accepting-jobs", "server-error-busy", "server-error-job-canceled", "server-error-multiple-document-jobs-not-supported", "server-error-printer-is-deactivated", "server-error-too-many-jobs", "server-error-too-many-documents" }, * const ipp_status_1000s[] = /* CUPS internal */ { "cups-authentication-canceled", "cups-pki-error", "cups-upgrade-required" }; static const char * const ipp_std_ops[] = { /* 0x0000 - 0x000f */ "0x0000", "0x0001", "Print-Job", /* RFC 8011 */ "Print-URI", /* RFC 8011 */ "Validate-Job", /* RFC 8011 */ "Create-Job", /* RFC 8011 */ "Send-Document", /* RFC 8011 */ "Send-URI", /* RFC 8011 */ "Cancel-Job", /* RFC 8011 */ "Get-Job-Attributes", /* RFC 8011 */ "Get-Jobs", /* RFC 8011 */ "Get-Printer-Attributes", /* RFC 8011 */ "Hold-Job", /* RFC 8011 */ "Release-Job", /* RFC 8011 */ "Restart-Job", /* RFC 8011 */ "0x000f", /* 0x0010 - 0x001f */ "Pause-Printer", /* RFC 8011 */ "Resume-Printer", /* RFC 8011 */ "Purge-Jobs", /* RFC 8011 */ "Set-Printer-Attributes", /* RFC 3380 */ "Set-Job-Attributes", /* RFC 3380 */ "Get-Printer-Supported-Values", /* RFC 3380 */ "Create-Printer-Subscriptions", /* RFC 3995 */ "Create-Job-Subscriptions", /* RFC 3995 */ "Get-Subscription-Attributes", /* RFC 3995 */ "Get-Subscriptions", /* RFC 3995 */ "Renew-Subscription", /* RFC 3995 */ "Cancel-Subscription", /* RFC 3995 */ "Get-Notifications", /* RFC 3996 */ "(Send-Notifications)", "Get-Resource-Attributes", /* IPP System */ "(Get-Resource-Data)", /* 0x0020 - 0x002f */ "Get-Resources", /* IPP System */ "(Get-Printer-Support-Files)", "Enable-Printer", /* RFC 3998 */ "Disable-Printer", /* RFC 3998 */ "Pause-Printer-After-Current-Job", /* RFC 3998 */ "Hold-New-Jobs", /* RFC 3998 */ "Release-Held-New-Jobs", /* RFC 3998 */ "Deactivate-Printer", /* RFC 3998 */ "Activate-Printer", /* RFC 3998 */ "Restart-Printer", /* RFC 3998 */ "Shutdown-Printer", /* RFC 3998 */ "Startup-Printer", /* RFC 3998 */ "Reprocess-Job", /* RFC 3998 */ "Cancel-Current-Job", /* RFC 3998 */ "Suspend-Current-Job", /* RFC 3998 */ "Resume-Job", /* RFC 3998 */ /* 0x0030 - 0x003f */ "Promote-Job", /* RFC 3998 */ "Schedule-Job-After", /* RFC 3998 */ "0x0032", "Cancel-Document", /* IPP DocObject */ "Get-Document-Attributes", /* IPP DocObject */ "Get-Documents", /* IPP DocObject */ "Delete-Document", /* IPP DocObject */ "Set-Document-Attributes", /* IPP DocObject */ "Cancel-Jobs", /* IPP JPS2 */ "Cancel-My-Jobs", /* IPP JPS2 */ "Resubmit-Job", /* IPP JPS2 */ "Close-Job", /* IPP JPS2 */ "Identify-Printer", /* IPP JPS3 */ "Validate-Document", /* IPP JPS3 */ "Add-Document-Images", /* IPP Scan */ "Acknowledge-Document", /* IPP INFRA */ /* 0x0040 - 0x004f */ "Acknowledge-Identify-Printer", /* IPP INFRA */ "Acknowledge-Job", /* IPP INFRA */ "Fetch-Document", /* IPP INFRA */ "Fetch-Job", /* IPP INFRA */ "Get-Output-Device-Attributes", /* IPP INFRA */ "Update-Active-Jobs", /* IPP INFRA */ "Deregister-Output-Device", /* IPP INFRA */ "Update-Document-Status", /* IPP INFRA */ "Update-Job-Status", /* IPP INFRA */ "Update-Output-Device-Attributes", /* IPP INFRA */ "Get-Next-Document-Data", /* IPP Scan */ "Allocate-Printer-Resources", /* IPP System */ "Create-Printer", /* IPP System */ "Deallocate-Printer-Resources", /* IPP System */ "Delete-Printer", /* IPP System */ "Get-Printers", /* IPP System */ /* 0x0050 - 0x005f */ "Shutdown-One-Printer", /* IPP System */ "Startup-One-Printer", /* IPP System */ "Cancel-Resource", /* IPP System */ "Create-Resource", /* IPP System */ "Install-Resource", /* IPP System */ "Send-Resource-Data", /* IPP System */ "Set-Resource-Attributes", /* IPP System */ "Create-Resource-Subscriptions", /* IPP System */ "Create-System-Subscriptions", /* IPP System */ "Disable-All-Printers", /* IPP System */ "Enable-All-Printers", /* IPP System */ "Get-System-Attributes", /* IPP System */ "Get-System-Supported-Values", /* IPP System */ "Pause-All-Printers", /* IPP System */ "Pause-All-Printers-After-Current-Job", /* IPP System */ "Register-Output-Device", /* IPP System */ /* 0x0060 - 0x0064 */ "Restart-System", /* IPP System */ "Resume-All-Printers", /* IPP System */ "Set-System-Attributes", /* IPP System */ "Shutdown-All-Printers", /* IPP System */ "Startup-All-Printers" /* IPP System */ }, * const ipp_cups_ops[] = { "CUPS-Get-Default", "CUPS-Get-Printers", "CUPS-Add-Modify-Printer", "CUPS-Delete-Printer", "CUPS-Get-Classes", "CUPS-Add-Modify-Class", "CUPS-Delete-Class", "CUPS-Accept-Jobs", "CUPS-Reject-Jobs", "CUPS-Set-Default", "CUPS-Get-Devices", "CUPS-Get-PPDs", "CUPS-Move-Job", "CUPS-Authenticate-Job", "CUPS-Get-PPD" }, * const ipp_cups_ops2[] = { "CUPS-Get-Document", "CUPS-Create-Local-Printer" }, * const ipp_tag_names[] = { /* Value/group tag names */ "zero", /* 0x00 */ "operation-attributes-tag", /* 0x01 */ "job-attributes-tag", /* 0x02 */ "end-of-attributes-tag", /* 0x03 */ "printer-attributes-tag", /* 0x04 */ "unsupported-attributes-tag", /* 0x05 */ "subscription-attributes-tag", /* 0x06 - RFC 3995 */ "event-notification-attributes-tag", /* 0x07 - RFC 3995 */ "resource-attributes-tag", /* 0x08 - IPP System */ "document-attributes-tag", /* 0x09 - IPP DocObject */ "system-attributes-tag", /* 0x0a - IPP System */ "0x0b", /* 0x0b */ "0x0c", /* 0x0c */ "0x0d", /* 0x0d */ "0x0e", /* 0x0e */ "0x0f", /* 0x0f */ "unsupported", /* 0x10 */ "default", /* 0x11 */ "unknown", /* 0x12 */ "no-value", /* 0x13 */ "0x14", /* 0x14 */ "not-settable", /* 0x15 - RFC 3380 */ "delete-attribute", /* 0x16 - RFC 3380 */ "admin-define", /* 0x17 - RFC 3380 */ "0x18", /* 0x18 */ "0x19", /* 0x19 */ "0x1a", /* 0x1a */ "0x1b", /* 0x1b */ "0x1c", /* 0x1c */ "0x1d", /* 0x1d */ "0x1e", /* 0x1e */ "0x1f", /* 0x1f */ "0x20", /* 0x20 */ "integer", /* 0x21 */ "boolean", /* 0x22 */ "enum", /* 0x23 */ "0x24", /* 0x24 */ "0x25", /* 0x25 */ "0x26", /* 0x26 */ "0x27", /* 0x27 */ "0x28", /* 0x28 */ "0x29", /* 0x29 */ "0x2a", /* 0x2a */ "0x2b", /* 0x2b */ "0x2c", /* 0x2c */ "0x2d", /* 0x2d */ "0x2e", /* 0x2e */ "0x2f", /* 0x2f */ "octetString", /* 0x30 */ "dateTime", /* 0x31 */ "resolution", /* 0x32 */ "rangeOfInteger", /* 0x33 */ "collection", /* 0x34 */ "textWithLanguage", /* 0x35 */ "nameWithLanguage", /* 0x36 */ "endCollection", /* 0x37 */ "0x38", /* 0x38 */ "0x39", /* 0x39 */ "0x3a", /* 0x3a */ "0x3b", /* 0x3b */ "0x3c", /* 0x3c */ "0x3d", /* 0x3d */ "0x3e", /* 0x3e */ "0x3f", /* 0x3f */ "0x40", /* 0x40 */ "textWithoutLanguage",/* 0x41 */ "nameWithoutLanguage",/* 0x42 */ "0x43", /* 0x43 */ "keyword", /* 0x44 */ "uri", /* 0x45 */ "uriScheme", /* 0x46 */ "charset", /* 0x47 */ "naturalLanguage", /* 0x48 */ "mimeMediaType", /* 0x49 */ "memberAttrName" /* 0x4a */ }; static const char * const ipp_document_states[] = { /* document-state-enums */ "pending", "4", "processing", "processing-stopped", /* IPP INFRA */ "canceled", "aborted", "completed" }, * const ipp_finishings[] = { /* finishings enums */ "none", "staple", "punch", "cover", "bind", "saddle-stitch", "edge-stitch", "fold", "trim", "bale", "booklet-maker", "jog-offset", "coat", /* IPP Finishings 2.0 */ "laminate", /* IPP Finishings 2.0 */ "17", "18", "19", "staple-top-left", "staple-bottom-left", "staple-top-right", "staple-bottom-right", "edge-stitch-left", "edge-stitch-top", "edge-stitch-right", "edge-stitch-bottom", "staple-dual-left", "staple-dual-top", "staple-dual-right", "staple-dual-bottom", "staple-triple-left", /* IPP Finishings 2.0 */ "staple-triple-top", /* IPP Finishings 2.0 */ "staple-triple-right",/* IPP Finishings 2.0 */ "staple-triple-bottom",/* IPP Finishings 2.0 */ "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "bind-left", "bind-top", "bind-right", "bind-bottom", "54", "55", "56", "57", "58", "59", "trim-after-pages", "trim-after-documents", "trim-after-copies", "trim-after-job", "64", "65", "66", "67", "68", "69", "punch-top-left", /* IPP Finishings 2.0 */ "punch-bottom-left", /* IPP Finishings 2.0 */ "punch-top-right", /* IPP Finishings 2.0 */ "punch-bottom-right", /* IPP Finishings 2.0 */ "punch-dual-left", /* IPP Finishings 2.0 */ "punch-dual-top", /* IPP Finishings 2.0 */ "punch-dual-right", /* IPP Finishings 2.0 */ "punch-dual-bottom", /* IPP Finishings 2.0 */ "punch-triple-left", /* IPP Finishings 2.0 */ "punch-triple-top", /* IPP Finishings 2.0 */ "punch-triple-right", /* IPP Finishings 2.0 */ "punch-triple-bottom",/* IPP Finishings 2.0 */ "punch-quad-left", /* IPP Finishings 2.0 */ "punch-quad-top", /* IPP Finishings 2.0 */ "punch-quad-right", /* IPP Finishings 2.0 */ "punch-quad-bottom", /* IPP Finishings 2.0 */ "punch-multiple-left",/* IPP Finishings 2.1/Canon */ "punch-multiple-top", /* IPP Finishings 2.1/Canon */ "punch-multiple-right",/* IPP Finishings 2.1/Canon */ "punch-multiple-bottom",/* IPP Finishings 2.1/Canon */ "fold-accordion", /* IPP Finishings 2.0 */ "fold-double-gate", /* IPP Finishings 2.0 */ "fold-gate", /* IPP Finishings 2.0 */ "fold-half", /* IPP Finishings 2.0 */ "fold-half-z", /* IPP Finishings 2.0 */ "fold-left-gate", /* IPP Finishings 2.0 */ "fold-letter", /* IPP Finishings 2.0 */ "fold-parallel", /* IPP Finishings 2.0 */ "fold-poster", /* IPP Finishings 2.0 */ "fold-right-gate", /* IPP Finishings 2.0 */ "fold-z", /* IPP Finishings 2.0 */ "fold-engineering-z" /* IPP Finishings 2.1 */ }, * const ipp_finishings_vendor[] = { /* 0x40000000 to 0x4000000F */ "0x40000000", "0x40000001", "0x40000002", "0x40000003", "0x40000004", "0x40000005", "0x40000006", "0x40000007", "0x40000008", "0x40000009", "0x4000000A", "0x4000000B", "0x4000000C", "0x4000000D", "0x4000000E", "0x4000000F", /* 0x40000010 to 0x4000001F */ "0x40000010", "0x40000011", "0x40000012", "0x40000013", "0x40000014", "0x40000015", "0x40000016", "0x40000017", "0x40000018", "0x40000019", "0x4000001A", "0x4000001B", "0x4000001C", "0x4000001D", "0x4000001E", "0x4000001F", /* 0x40000020 to 0x4000002F */ "0x40000020", "0x40000021", "0x40000022", "0x40000023", "0x40000024", "0x40000025", "0x40000026", "0x40000027", "0x40000028", "0x40000029", "0x4000002A", "0x4000002B", "0x4000002C", "0x4000002D", "0x4000002E", "0x4000002F", /* 0x40000030 to 0x4000003F */ "0x40000030", "0x40000031", "0x40000032", "0x40000033", "0x40000034", "0x40000035", "0x40000036", "0x40000037", "0x40000038", "0x40000039", "0x4000003A", "0x4000003B", "0x4000003C", "0x4000003D", "0x4000003E", "0x4000003F", /* 0x40000040 - 0x4000004F */ "0x40000040", "0x40000041", "0x40000042", "0x40000043", "0x40000044", "0x40000045", "cups-punch-top-left", "cups-punch-bottom-left", "cups-punch-top-right", "cups-punch-bottom-right", "cups-punch-dual-left", "cups-punch-dual-top", "cups-punch-dual-right", "cups-punch-dual-bottom", "cups-punch-triple-left", "cups-punch-triple-top", /* 0x40000050 - 0x4000005F */ "cups-punch-triple-right", "cups-punch-triple-bottom", "cups-punch-quad-left", "cups-punch-quad-top", "cups-punch-quad-right", "cups-punch-quad-bottom", "0x40000056", "0x40000057", "0x40000058", "0x40000059", "cups-fold-accordion", "cups-fold-double-gate", "cups-fold-gate", "cups-fold-half", "cups-fold-half-z", "cups-fold-left-gate", /* 0x40000060 - 0x40000064 */ "cups-fold-letter", "cups-fold-parallel", "cups-fold-poster", "cups-fold-right-gate", "cups-fold-z" }, * const ipp_job_collation_types[] = { /* job-collation-type enums */ "uncollated-sheets", "collated-documents", "uncollated-documents" }, * const ipp_job_states[] = { /* job-state enums */ "pending", "pending-held", "processing", "processing-stopped", "canceled", "aborted", "completed" }, * const ipp_orientation_requesteds[] = { /* orientation-requested enums */ "portrait", "landscape", "reverse-landscape", "reverse-portrait", "none" }, * const ipp_print_qualities[] = { /* print-quality enums */ "draft", "normal", "high" }, * const ipp_printer_states[] = { /* printer-state enums */ "idle", "processing", "stopped" }, * const ipp_resource_states[] = { /* resource-state enums */ "pending", "available", "installed", "canceled", "aborted" }, * const ipp_system_states[] = { /* system-state enums */ "idle", "processing", "stopped" }; /* * Local functions... */ static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize); /* * 'ippAttributeString()' - Convert the attribute's value to a string. * * Returns the number of bytes that would be written, not including the * trailing nul. The buffer pointer can be NULL to get the required length, * just like (v)snprintf. * * @since CUPS 1.6/macOS 10.8@ */ size_t /* O - Number of bytes less nul */ ippAttributeString( ipp_attribute_t *attr, /* I - Attribute */ char *buffer, /* I - String buffer or NULL */ size_t bufsize) /* I - Size of string buffer */ { int i; /* Looping var */ char *bufptr, /* Pointer into buffer */ *bufend, /* End of buffer */ temp[256]; /* Temporary string */ const char *ptr, /* Pointer into string */ *end; /* Pointer to end of string */ _ipp_value_t *val; /* Current value */ if (!attr || !attr->name) { if (buffer) *buffer = '\0'; return (0); } bufptr = buffer; if (buffer) bufend = buffer + bufsize - 1; else bufend = NULL; for (i = attr->num_values, val = attr->values; i > 0; i --, val ++) { if (val > attr->values) { if (buffer && bufptr < bufend) *bufptr++ = ','; else bufptr ++; } switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { case IPP_TAG_ENUM : ptr = ippEnumString(attr->name, val->integer); if (buffer && bufptr < bufend) strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; case IPP_TAG_INTEGER : if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d", val->integer); else bufptr += snprintf(temp, sizeof(temp), "%d", val->integer); break; case IPP_TAG_BOOLEAN : if (buffer && bufptr < bufend) strlcpy(bufptr, val->boolean ? "true" : "false", (size_t)(bufend - bufptr + 1)); bufptr += val->boolean ? 4 : 5; break; case IPP_TAG_RANGE : if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d-%d", val->range.lower, val->range.upper); else bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, val->range.upper); break; case IPP_TAG_RESOLUTION : if (val->resolution.xres == val->resolution.yres) { if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else bufptr += snprintf(temp, sizeof(temp), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } else if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); break; case IPP_TAG_DATE : { unsigned year; /* Year */ year = ((unsigned)val->date[0] << 8) + (unsigned)val->date[1]; if (val->date[9] == 0 && val->date[10] == 0) snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ", year, val->date[2], val->date[3], val->date[4], val->date[5], val->date[6]); else snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u", year, val->date[2], val->date[3], val->date[4], val->date[5], val->date[6], val->date[8], val->date[9], val->date[10]); if (buffer && bufptr < bufend) strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1)); bufptr += strlen(temp); } break; case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : case IPP_TAG_CHARSET : case IPP_TAG_URI : case IPP_TAG_URISCHEME : case IPP_TAG_MIMETYPE : case IPP_TAG_LANGUAGE : case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : if (!val->string.text) break; for (ptr = val->string.text; *ptr; ptr ++) { if (*ptr == '\\' || *ptr == '\"' || *ptr == '[') { if (buffer && bufptr < bufend) *bufptr = '\\'; bufptr ++; } if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } if (val->string.language) { /* * Add "[language]" to end of string... */ if (buffer && bufptr < bufend) *bufptr = '['; bufptr ++; if (buffer && bufptr < bufend) strlcpy(bufptr, val->string.language, (size_t)(bufend - bufptr)); bufptr += strlen(val->string.language); if (buffer && bufptr < bufend) *bufptr = ']'; bufptr ++; } break; case IPP_TAG_BEGIN_COLLECTION : if (buffer && bufptr < bufend) bufptr += ipp_col_string(val->collection, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ipp_col_string(val->collection, NULL, 0); break; case IPP_TAG_STRING : for (ptr = val->unknown.data, end = ptr + val->unknown.length; ptr < end; ptr ++) { if (*ptr == '\\' || _cups_isspace(*ptr)) { if (buffer && bufptr < bufend) *bufptr = '\\'; bufptr ++; if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } else if (!isprint(*ptr & 255)) { if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *ptr & 255); else bufptr += snprintf(temp, sizeof(temp), "\\%03o", *ptr & 255); } else { if (buffer && bufptr < bufend) *bufptr = *ptr; bufptr ++; } } break; default : ptr = ippTagString(attr->value_tag); if (buffer && bufptr < bufend) strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1)); bufptr += strlen(ptr); break; } } if (buffer && bufptr < bufend) *bufptr = '\0'; else if (bufend) *bufend = '\0'; return ((size_t)(bufptr - buffer)); } /* * 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the * given requested-attributes attribute. * * This function creates a (sorted) CUPS array of attribute names matching the * list of "requested-attribute" values supplied in an IPP request. All IANA- * registered values are supported in addition to the CUPS IPP extension * attributes. * * The @code request@ parameter specifies the request message that was read from * the client. * * @code NULL@ is returned if all attributes should be returned. Otherwise, the * result is a sorted array of attribute names, where @code cupsArrayFind(array, * "attribute-name")@ will return a non-NULL pointer. The array must be freed * using the @code cupsArrayDelete@ function. * * @since CUPS 1.7/macOS 10.9@ */ cups_array_t * /* O - CUPS array or @code NULL@ if all */ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ { int i, j, /* Looping vars */ count, /* Number of values */ added; /* Was name added? */ ipp_op_t op; /* IPP operation code */ ipp_attribute_t *requested; /* requested-attributes attribute */ cups_array_t *ra; /* Requested attributes array */ const char *value; /* Current value */ /* The following lists come from the current IANA IPP registry of attributes */ static const char * const document_description[] = { /* document-description group */ "compression", "copies-actual", "cover-back-actual", "cover-front-actual", "current-page-order", "date-time-at-completed", "date-time-at-creation", "date-time-at-processing", "detailed-status-messages", "document-access-errors", "document-charset", "document-digital-signature", "document-format", "document-format-details", "document-format-detected", "document-format-version", "document-format-version-detected", "document-job-id", "document-job-uri", "document-message", "document-metadata", "document-name", "document-natural-language", "document-number", "document-printer-uri", "document-state", "document-state-message", "document-state-reasons", "document-uri", "document-uuid", /* IPP JPS3 */ "errors-count", "finishings-actual", "finishings-col-actual", "force-front-side-actual", "imposition-template-actual", "impressions", "impressions-col", "impressions-completed", "impressions-completed-col", "impressions-completed-current-copy", "insert-sheet-actual", "k-octets", "k-octets-processed", "last-document", "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-input-tray-check-actual", "media-sheets", "media-sheets-col", "media-sheets-completed", "media-sheets-completed-col", "more-info", "multiple-object-handling-actual", /* IPP 3D */ "number-up-actual", "orientation-requested-actual", "output-bin-actual", "output-device-assigned", "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", "pages", "pages-col", "pages-completed", "pages-completed-col", "pages-completed-current-copy", "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", "print-accuracy-actual", /* IPP 3D */ "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "printer-up-time", "separator-sheets-actual", "sheet-completed-copy-number", "sides-actual", "time-at-completed", "time-at-creation", "time-at-processing", "x-image-position-actual", "x-image-shift-actual", "x-side1-image-shift-actual", "x-side2-image-shift-actual", "y-image-position-actual", "y-image-shift-actual", "y-side1-image-shift-actual", "y-side2-image-shift-actual" }; static const char * const document_template[] = { /* document-template group */ "chamber-humidity", /* IPP 3D */ "chamber-humidity-default", /* IPP 3D */ "chamber-humidity-supported", /* IPP 3D */ "chamber-temperature", /* IPP 3D */ "chamber-temperature-default", /* IPP 3D */ "chamber-temperature-supported", /* IPP 3D */ "copies", "copies-default", "copies-supported", "cover-back", "cover-back-default", "cover-back-supported", "cover-front", "cover-front-default", "cover-front-supported", "feed-orientation", "feed-orientation-default", "feed-orientation-supported", "finishings", "finishings-col", "finishings-col-database", "finishings-col-default", "finishings-col-ready", "finishings-col-supported", "finishings-default", "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", "font-name-requested-supported", "font-size-requested", "font-size-requested-default", "font-size-requested-supported", "force-front-side", "force-front-side-default", "force-front-side-supported", "imposition-template", "imposition-template-default", "imposition-template-supported", "insert-after-page-number-supported", "insert-count-supported", "insert-sheet", "insert-sheet-default", "insert-sheet-supported", "material-amount-units-supported", /* IPP 3D */ "material-diameter-supported", /* IPP 3D */ "material-purpose-supported", /* IPP 3D */ "material-rate-supported", /* IPP 3D */ "material-rate-units-supported", /* IPP 3D */ "material-shell-thickness-supported",/* IPP 3D */ "material-temperature-supported", /* IPP 3D */ "material-type-supported", /* IPP 3D */ "materials-col", /* IPP 3D */ "materials-col-database", /* IPP 3D */ "materials-col-default", /* IPP 3D */ "materials-col-ready", /* IPP 3D */ "materials-col-supported", /* IPP 3D */ "max-materials-col-supported", /* IPP 3D */ "max-stitching-locations-supported", "media", "media-back-coating-supported", "media-bottom-margin-supported", "media-col", "media-col-default", "media-col-ready", "media-col-supported", "media-color-supported", "media-default", "media-front-coating-supported", "media-grain-supported", "media-hole-count-supported", "media-info-supported", "media-input-tray-check", "media-input-tray-check-default", "media-input-tray-check-supported", "media-key-supported", "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", "media-source-supported", "media-supported", "media-thickness-supported", "media-top-margin-supported", "media-type-supported", "media-weight-metric-supported", "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", "multiple-object-handling", /* IPP 3D */ "multiple-object-handling-default", /* IPP 3D */ "multiple-object-handling-supported",/* IPP 3D */ "number-up", "number-up-default", "number-up-supported", "orientation-requested", "orientation-requested-default", "orientation-requested-supported", "output-mode", /* CUPS extension */ "output-mode-default", /* CUPS extension */ "output-mode-supported", /* CUPS extension */ "overrides", "overrides-supported", "page-delivery", "page-delivery-default", "page-delivery-supported", "page-order-received", "page-order-received-default", "page-order-received-supported", "page-ranges", "page-ranges-supported", "pages-per-subset", "pages-per-subset-supported", "pdl-init-file", "pdl-init-file-default", "pdl-init-file-entry-supported", "pdl-init-file-location-supported", "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", "platform-temperature", /* IPP 3D */ "platform-temperature-default", /* IPP 3D */ "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", "print-accuracy", /* IPP 3D */ "print-accuracy-default", /* IPP 3D */ "print-accuracy-supported", /* IPP 3D */ "print-base", /* IPP 3D */ "print-base-default", /* IPP 3D */ "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", "print-objects", /* IPP 3D */ "print-objects-default", /* IPP 3D */ "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ "print-supports", /* IPP 3D */ "print-supports-default", /* IPP 3D */ "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", "separator-sheets", "separator-sheets-default", "separator-sheets-supported", "sheet-collate", "sheet-collate-default", "sheet-collate-supported", "sides", "sides-default", "sides-supported", "stitching-locations-supported", "stitching-offset-supported", "x-image-position", "x-image-position-default", "x-image-position-supported", "x-image-shift", "x-image-shift-default", "x-image-shift-supported", "x-side1-image-shift", "x-side1-image-shift-default", "x-side1-image-shift-supported", "x-side2-image-shift", "x-side2-image-shift-default", "x-side2-image-shift-supported", "y-image-position", "y-image-position-default", "y-image-position-supported", "y-image-shift", "y-image-shift-default", "y-image-shift-supported", "y-side1-image-shift", "y-side1-image-shift-default", "y-side1-image-shift-supported", "y-side2-image-shift", "y-side2-image-shift-default", "y-side2-image-shift-supported" }; static const char * const job_description[] = { /* job-description group */ "chamber-humidity-actual", /* IPP 3D */ "chamber-temperature-actual", /* IPP 3D */ "compression-supplied", "copies-actual", "cover-back-actual", "cover-front-actual", "current-page-order", "date-time-at-completed", "date-time-at-creation", "date-time-at-processing", "destination-statuses", "document-charset-supplied", "document-digital-signature-supplied", "document-format-details-supplied", "document-format-supplied", "document-message-supplied", "document-metadata", "document-name-supplied", "document-natural-language-supplied", "document-overrides-actual", "errors-count", "finishings-actual", "finishings-col-actual", "force-front-side-actual", "imposition-template-actual", "impressions-completed-current-copy", "insert-sheet-actual", "job-account-id-actual", "job-accounting-sheets-actual", "job-accounting-user-id-actual", "job-attribute-fidelity", "job-charge-info", /* CUPS extension */ "job-collation-type", "job-collation-type-actual", "job-copies-actual", "job-cover-back-actual", "job-cover-front-actual", "job-detailed-status-message", "job-document-access-errors", "job-error-sheet-actual", "job-finishings-actual", "job-finishings-col-actual", "job-hold-until-actual", "job-id", "job-impressions", "job-impressions-col", "job-impressions-completed", "job-impressions-completed-col", "job-k-octets", "job-k-octets-processed", "job-mandatory-attributes", "job-media-progress", /* CUPS extension */ "job-media-sheets", "job-media-sheets-col", "job-media-sheets-completed", "job-media-sheets-completed-col", "job-message-from-operator", "job-more-info", "job-name", "job-originating-host-name", /* CUPS extension */ "job-originating-user-name", "job-originating-user-uri", /* IPP JPS3 */ "job-pages", "job-pages-col", "job-pages-completed", "job-pages-completed-col", "job-pages-completed-current-copy", "job-printer-state-message", /* CUPS extension */ "job-printer-state-reasons", /* CUPS extension */ "job-printer-up-time", "job-printer-uri", "job-priority-actual", "job-resource-ids", /* IPP System */ "job-save-printer-make-and-model", "job-sheet-message-actual", "job-sheets-actual", "job-sheets-col-actual", "job-state", "job-state-message", "job-state-reasons", "job-uri", "job-uuid", /* IPP JPS3 */ "materials-col-actual", /* IPP 3D */ "media-actual", "media-col-actual", "media-check-input-tray-actual", "multiple-document-handling-actual", "multiple-object-handling-actual", /* IPP 3D */ "number-of-documents", "number-of-intervening-jobs", "number-up-actual", "orientation-requested-actual", "original-requesting-user-name", "output-bin-actual", "output-device-assigned", "output-device-job-state", /* IPP INFRA */ "output-device-job-state-message", /* IPP INFRA */ "output-device-job-state-reasons", /* IPP INFRA */ "output-device-uuid-assigned", /* IPP INFRA */ "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", "platform-temperature-actual", /* IPP 3D */ "presentation-direction-number-up-actual", "print-accuracy-actual", /* IPP 3D */ "print-base-actual", /* IPP 3D */ "print-color-mode-actual", "print-content-optimize-actual", "print-objects-actual", /* IPP 3D */ "print-quality-actual", "print-rendering-intent-actual", "print-scaling-actual", /* IPP Paid Printing */ "print-supports-actual", /* IPP 3D */ "printer-resolution-actual", "separator-sheets-actual", "sheet-collate-actual", "sheet-completed-copy-number", "sheet-completed-document-number", "sides-actual", "time-at-completed", "time-at-creation", "time-at-processing", "warnings-count", "x-image-position-actual", "x-image-shift-actual", "x-side1-image-shift-actual", "x-side2-image-shift-actual", "y-image-position-actual", "y-image-shift-actual", "y-side1-image-shift-actual", "y-side2-image-shift-actual" }; static const char * const job_template[] = { /* job-template group */ "accuracy-units-supported", /* IPP 3D */ "chamber-humidity", /* IPP 3D */ "chamber-humidity-default", /* IPP 3D */ "chamber-humidity-supported", /* IPP 3D */ "chamber-temperature", /* IPP 3D */ "chamber-temperature-default", /* IPP 3D */ "chamber-temperature-supported", /* IPP 3D */ "confirmation-sheet-print", /* IPP FaxOut */ "confirmation-sheet-print-default", "copies", "copies-default", "copies-supported", "cover-back", "cover-back-default", "cover-back-supported", "cover-front", "cover-front-default", "cover-front-supported", "cover-sheet-info", /* IPP FaxOut */ "cover-sheet-info-default", "cover-sheet-info-supported", "destination-uri-schemes-supported",/* IPP FaxOut */ "destination-uris", /* IPP FaxOut */ "destination-uris-supported", "feed-orientation", "feed-orientation-default", "feed-orientation-supported", "finishings", "finishings-col", "finishings-col-database", "finishings-col-default", "finishings-col-ready", "finishings-col-supported", "finishings-default", "finishings-ready", "finishings-supported", "font-name-requested", "font-name-requested-default", "font-name-requested-supported", "font-size-requested", "font-size-requested-default", "font-size-requested-supported", "force-front-side", "force-front-side-default", "force-front-side-supported", "imposition-template", "imposition-template-default", "imposition-template-supported", "insert-after-page-number-supported", "insert-count-supported", "insert-sheet", "insert-sheet-default", "insert-sheet-supported", "job-account-id", "job-account-id-default", "job-account-id-supported", "job-accounting-sheets" "job-accounting-sheets-default" "job-accounting-sheets-supported" "job-accounting-user-id", "job-accounting-user-id-default", "job-accounting-user-id-supported", "job-copies", "job-copies-default", "job-copies-supported", "job-cover-back", "job-cover-back-default", "job-cover-back-supported", "job-cover-front", "job-cover-front-default", "job-cover-front-supported", "job-delay-output-until", "job-delay-output-until-default", "job-delay-output-until-supported", "job-delay-output-until-time", "job-delay-output-until-time-default", "job-delay-output-until-time-supported", "job-error-action", "job-error-action-default", "job-error-action-supported", "job-error-sheet", "job-error-sheet-default", "job-error-sheet-supported", "job-finishings", "job-finishings-col", "job-finishings-col-default", "job-finishings-col-supported", "job-finishings-default", "job-finishings-supported", "job-hold-until", "job-hold-until-default", "job-hold-until-supported", "job-hold-until-time", "job-hold-until-time-default", "job-hold-until-time-supported", "job-message-to-operator", "job-message-to-operator-default", "job-message-to-operator-supported", "job-phone-number", "job-phone-number-default", "job-phone-number-supported", "job-priority", "job-priority-default", "job-priority-supported", "job-recipient-name", "job-recipient-name-default", "job-recipient-name-supported", "job-save-disposition", "job-save-disposition-default", "job-save-disposition-supported", "job-sheets", "job-sheets-col", "job-sheets-col-default", "job-sheets-col-supported", "job-sheets-default", "job-sheets-supported", "logo-uri-schemes-supported", "material-amount-units-supported", /* IPP 3D */ "material-diameter-supported", /* IPP 3D */ "material-purpose-supported", /* IPP 3D */ "material-rate-supported", /* IPP 3D */ "material-rate-units-supported", /* IPP 3D */ "material-shell-thickness-supported",/* IPP 3D */ "material-temperature-supported", /* IPP 3D */ "material-type-supported", /* IPP 3D */ "materials-col", /* IPP 3D */ "materials-col-database", /* IPP 3D */ "materials-col-default", /* IPP 3D */ "materials-col-ready", /* IPP 3D */ "materials-col-supported", /* IPP 3D */ "max-materials-col-supported", /* IPP 3D */ "max-save-info-supported", "max-stitching-locations-supported", "media", "media-back-coating-supported", "media-bottom-margin-supported", "media-col", "media-col-default", "media-col-ready", "media-col-supported", "media-color-supported", "media-default", "media-front-coating-supported", "media-grain-supported", "media-hole-count-supported", "media-info-supported", "media-input-tray-check", "media-input-tray-check-default", "media-input-tray-check-supported", "media-key-supported", "media-left-margin-supported", "media-order-count-supported", "media-pre-printed-supported", "media-ready", "media-recycled-supported", "media-right-margin-supported", "media-size-supported", "media-source-supported", "media-supported", "media-thickness-supported", "media-top-margin-supported", "media-type-supported", "media-weight-metric-supported", "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", "multiple-object-handling", /* IPP 3D */ "multiple-object-handling-default", /* IPP 3D */ "multiple-object-handling-supported",/* IPP 3D */ "number-of-retries", /* IPP FaxOut */ "number-of-retries-default", "number-of-retries-supported", "number-up", "number-up-default", "number-up-supported", "orientation-requested", "orientation-requested-default", "orientation-requested-supported", "output-bin", "output-bin-default", "output-bin-supported", "output-device", "output-device-supported", "output-device-uuid-supported", /* IPP INFRA */ "output-mode", /* CUPS extension */ "output-mode-default", /* CUPS extension */ "output-mode-supported", /* CUPS extension */ "overrides", "overrides-supported", "page-delivery", "page-delivery-default", "page-delivery-supported", "page-order-received", "page-order-received-default", "page-order-received-supported", "page-ranges", "page-ranges-supported", "pages-per-subset", "pages-per-subset-supported", "pdl-init-file", "pdl-init-file-default", "pdl-init-file-entry-supported", "pdl-init-file-location-supported", "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", "platform-temperature", /* IPP 3D */ "platform-temperature-default", /* IPP 3D */ "platform-temperature-supported", /* IPP 3D */ "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", "print-accuracy", /* IPP 3D */ "print-accuracy-default", /* IPP 3D */ "print-accuracy-supported", /* IPP 3D */ "print-base", /* IPP 3D */ "print-base-default", /* IPP 3D */ "print-base-supported", /* IPP 3D */ "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", "print-objects", /* IPP 3D */ "print-objects-default", /* IPP 3D */ "print-objects-supported", /* IPP 3D */ "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", "print-scaling", /* IPP Paid Printing */ "print-scaling-default", /* IPP Paid Printing */ "print-scaling-supported", /* IPP Paid Printing */ "print-supports", /* IPP 3D */ "print-supports-default", /* IPP 3D */ "print-supports-supported", /* IPP 3D */ "printer-resolution", "printer-resolution-default", "printer-resolution-supported", "proof-print", "proof-print-default", "proof-print-supported", "retry-interval", /* IPP FaxOut */ "retry-interval-default", "retry-interval-supported", "retry-timeout", /* IPP FaxOut */ "retry-timeout-default", "retry-timeout-supported", "save-disposition-supported", "save-document-format-default", "save-document-format-supported", "save-location-default", "save-location-supported", "save-name-subdirectory-supported", "save-name-supported", "separator-sheets", "separator-sheets-default", "separator-sheets-supported", "sheet-collate", "sheet-collate-default", "sheet-collate-supported", "sides", "sides-default", "sides-supported", "stitching-locations-supported", "stitching-offset-supported", "x-image-position", "x-image-position-default", "x-image-position-supported", "x-image-shift", "x-image-shift-default", "x-image-shift-supported", "x-side1-image-shift", "x-side1-image-shift-default", "x-side1-image-shift-supported", "x-side2-image-shift", "x-side2-image-shift-default", "x-side2-image-shift-supported", "y-image-position", "y-image-position-default", "y-image-position-supported", "y-image-shift", "y-image-shift-default", "y-image-shift-supported", "y-side1-image-shift", "y-side1-image-shift-default", "y-side1-image-shift-supported", "y-side2-image-shift", "y-side2-image-shift-default", "y-side2-image-shift-supported" }; static const char * const printer_description[] = { /* printer-description group */ "auth-info-required", /* CUPS extension */ "chamber-humidity-current", /* IPP 3D */ "chamber-temperature-current", /* IPP 3D */ "charset-configured", "charset-supported", "color-supported", "compression-supported", "device-service-count", "device-uri", /* CUPS extension */ "device-uuid", "document-charset-default", "document-charset-supported", "document-creation-attributes-supported", "document-digital-signature-default", "document-digital-signature-supported", "document-format-default", "document-format-details-default", "document-format-details-supported", "document-format-supported", "document-format-varying-attributes", "document-format-version-default", "document-format-version-supported", "document-natural-language-default", "document-natural-language-supported", "document-password-supported", "document-privacy-attributes", /* IPP Privacy Attributes */ "document-privacy-scope", /* IPP Privacy Attributes */ "generated-natural-language-supported", "identify-actions-default", "identify-actions-supported", "input-source-supported", "ipp-features-supported", "ipp-versions-supported", "ippget-event-life", "job-authorization-uri-supported", /* CUPS extension */ "job-constraints-supported", "job-creation-attributes-supported", "job-finishings-col-ready", "job-finishings-ready", "job-ids-supported", "job-impressions-supported", "job-k-limit", /* CUPS extension */ "job-k-octets-supported", "job-media-sheets-supported", "job-page-limit", /* CUPS extension */ "job-password-encryption-supported", "job-password-supported", "job-presets-supported", /* IPP Presets */ "job-privacy-attributes", /* IPP Privacy Attributes */ "job-privacy-scope", /* IPP Privacy Attributes */ "job-quota-period", /* CUPS extension */ "job-resolvers-supported", "job-settable-attributes-supported", "job-spooling-supported", "job-triggers-supported", /* IPP Presets */ "jpeg-k-octets-supported", /* CUPS extension */ "jpeg-x-dimension-supported", /* CUPS extension */ "jpeg-y-dimension-supported", /* CUPS extension */ "landscape-orientation-requested-preferred", /* CUPS extension */ "marker-change-time", /* CUPS extension */ "marker-colors", /* CUPS extension */ "marker-high-levels", /* CUPS extension */ "marker-levels", /* CUPS extension */ "marker-low-levels", /* CUPS extension */ "marker-message", /* CUPS extension */ "marker-names", /* CUPS extension */ "marker-types", /* CUPS extension */ "member-names", /* CUPS extension */ "member-uris", /* CUPS extension */ "multiple-destination-uris-supported",/* IPP FaxOut */ "multiple-document-jobs-supported", "multiple-operation-time-out", "multiple-operation-time-out-action", "natural-language-configured", "operations-supported", "pages-per-minute", "pages-per-minute-color", "pdf-k-octets-supported", /* CUPS extension */ "pdf-features-supported", /* IPP 3D */ "pdf-versions-supported", /* CUPS extension */ "pdl-override-supported", "platform-shape", /* IPP 3D */ "port-monitor", /* CUPS extension */ "port-monitor-supported", /* CUPS extension */ "preferred-attributes-supported", "printer-alert", "printer-alert-description", "printer-camera-image-uri", /* IPP 3D */ "printer-charge-info", "printer-charge-info-uri", "printer-commands", /* CUPS extension */ "printer-config-change-date-time", "printer-config-change-time", "printer-config-changes", /* IPP System */ "printer-contact-col", /* IPP System */ "printer-current-time", "printer-detailed-status-messages", "printer-device-id", "printer-dns-sd-name", /* CUPS extension */ "printer-driver-installer", "printer-fax-log-uri", /* IPP FaxOut */ "printer-fax-modem-info", /* IPP FaxOut */ "printer-fax-modem-name", /* IPP FaxOut */ "printer-fax-modem-number", /* IPP FaxOut */ "printer-firmware-name", /* PWG 5110.1 */ "printer-firmware-patches", /* PWG 5110.1 */ "printer-firmware-string-version", /* PWG 5110.1 */ "printer-firmware-version", /* PWG 5110.1 */ "printer-geo-location", "printer-get-attributes-supported", "printer-icc-profiles", "printer-icons", "printer-id", /* IPP System */ "printer-info", "printer-input-tray", /* IPP JPS3 */ "printer-is-accepting-jobs", "printer-is-shared", /* CUPS extension */ "printer-is-temporary", /* CUPS extension */ "printer-kind", /* IPP Paid Printing */ "printer-location", "printer-make-and-model", "printer-mandatory-job-attributes", "printer-message-date-time", "printer-message-from-operator", "printer-message-time", "printer-more-info", "printer-more-info-manufacturer", "printer-name", "printer-native-formats", "printer-organization", "printer-organizational-unit", "printer-output-tray", /* IPP JPS3 */ "printer-service-type", /* IPP System */ "printer-settable-attributes-supported", "printer-state", "printer-state-change-date-time", "printer-state-change-time", "printer-state-message", "printer-state-reasons", "printer-supply", "printer-supply-description", "printer-supply-info-uri", "printer-type", /* CUPS extension */ "printer-up-time", "printer-uri-supported", "printer-uuid", "printer-xri-supported", "pwg-raster-document-resolution-supported", "pwg-raster-document-sheet-back", "pwg-raster-document-type-supported", "queued-job-count", "reference-uri-schemes-supported", "repertoire-supported", "requesting-user-name-allowed", /* CUPS extension */ "requesting-user-name-denied", /* CUPS extension */ "requesting-user-uri-supported", "smi2699-auth-print-group", /* PWG ippserver extension */ "smi2699-auth-proxy-group", /* PWG ippserver extension */ "smi2699-device-command", /* PWG ippserver extension */ "smi2699-device-format", /* PWG ippserver extension */ "smi2699-device-name", /* PWG ippserver extension */ "smi2699-device-uri", /* PWG ippserver extension */ "subordinate-printers-supported", "subscription-privacy-attributes", /* IPP Privacy Attributes */ "subscription-privacy-scope", /* IPP Privacy Attributes */ "urf-supported", /* CUPS extension */ "uri-authentication-supported", "uri-security-supported", "user-defined-value-supported", "which-jobs-supported", "xri-authentication-supported", "xri-security-supported", "xri-uri-scheme-supported" }; static const char * const resource_description[] = { /* resource-description group - IPP System */ "resource-info", "resource-name" }; static const char * const resource_status[] = { /* resource-status group - IPP System */ "date-time-at-canceled", "date-time-at-creation", "date-time-at-installed", "resource-data-uri", "resource-format", "resource-id", "resource-k-octets", "resource-state", "resource-state-message", "resource-state-reasons", "resource-string-version", "resource-type", "resource-use-count", "resource-uuid", "resource-version", "time-at-canceled", "time-at-creation", "time-at-installed" }; static const char * const resource_template[] = { /* resource-template group - IPP System */ "resource-format", "resource-format-supported", "resource-info", "resource-name", "resource-type", "resource-type-supported" }; static const char * const subscription_description[] = { /* subscription-description group */ "notify-job-id", "notify-lease-expiration-time", "notify-printer-up-time", "notify-printer-uri", "notify-resource-id", /* IPP System */ "notify-system-uri", /* IPP System */ "notify-sequence-number", "notify-subscriber-user-name", "notify-subscriber-user-uri", "notify-subscription-id", "notify-subscription-uuid" /* IPP JPS3 */ }; static const char * const subscription_template[] = { /* subscription-template group */ "notify-attributes", "notify-attributes-supported", "notify-charset", "notify-events", "notify-events-default", "notify-events-supported", "notify-lease-duration", "notify-lease-duration-default", "notify-lease-duration-supported", "notify-max-events-supported", "notify-natural-language", "notify-pull-method", "notify-pull-method-supported", "notify-recipient-uri", "notify-schemes-supported", "notify-time-interval", "notify-user-data" }; static const char * const system_description[] = { /* system-description group - IPP System */ "charset-configured", "charset-supported", "generated-natural-language-supported", "ipp-features-supported", "ipp-versions-supported", "natural-language-configured", "operations-supported", "power-calendar-policy-col", "power-event-policy-col", "power-timeout-policy-col", "printer-creation-attributes-supported", "resource-settable-attributes-supported", "smi2699-auth-group-supported", /* PWG ippserver extension */ "smi2699-device-command-supported", /* PWG ippserver extension */ "smi2699-device-format-format", /* PWG ippserver extension */ "smi2699-device-uri-schemes-supported", /* PWG ippserver extension */ "system-contact-col", "system-current-time", "system-default-printer-id", "system-device-id", "system-geo-location", "system-info", "system-location", "system-mandatory-printer-attributes", "system-make-and-model", "system-message-from-operator", "system-name", "system-settable-attributes-supported", "system-strings-languages-supported", "system-strings-uri", "system-xri-supported" }; static const char * const system_status[] = { /* system-status group - IPP System */ "power-log-col", "power-state-capabilities-col", "power-state-counters-col", "power-state-monitor-col", "power-state-transitions-col", "system-config-change-date-time", "system-config-change-time", "system-config-changes", "system-configured-printers", "system-configured-resources", "system-serial-number", "system-state", "system-state-change-date-time", "system-state-change-time", "system-state-message", "system-state-reasons", "system-up-time", "system-uuid" }; /* * Get the requested-attributes attribute... */ op = ippGetOperation(request); if ((requested = ippFindAttribute(request, "requested-attributes", IPP_TAG_KEYWORD)) == NULL) { /* * The Get-Jobs operation defaults to "job-id" and "job-uri", all others * default to "all"... */ if (op == IPP_OP_GET_JOBS) { ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-uri"); return (ra); } else return (NULL); } /* * If the attribute contains a single "all" keyword, return NULL... */ count = ippGetCount(requested); if (count == 1 && !strcmp(ippGetString(requested, 0, NULL), "all")) return (NULL); /* * Create an array using "strcmp" as the comparison function... */ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); for (i = 0; i < count; i ++) { added = 0; value = ippGetString(requested, i, NULL); if (!strcmp(value, "document-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_DOCUMENT_ATTRIBUTES || op == IPP_OP_GET_DOCUMENTS))) { for (j = 0; j < (int)(sizeof(document_description) / sizeof(document_description[0])); j ++) cupsArrayAdd(ra, (void *)document_description[j]); added = 1; } if (!strcmp(value, "document-template") || !strcmp(value, "all")) { for (j = 0; j < (int)(sizeof(document_template) / sizeof(document_template[0])); j ++) cupsArrayAdd(ra, (void *)document_template[j]); added = 1; } if (!strcmp(value, "job-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS))) { for (j = 0; j < (int)(sizeof(job_description) / sizeof(job_description[0])); j ++) cupsArrayAdd(ra, (void *)job_description[j]); added = 1; } if (!strcmp(value, "job-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_JOB_ATTRIBUTES || op == IPP_OP_GET_JOBS || op == IPP_OP_GET_PRINTER_ATTRIBUTES))) { for (j = 0; j < (int)(sizeof(job_template) / sizeof(job_template[0])); j ++) cupsArrayAdd(ra, (void *)job_template[j]); added = 1; } if (!strcmp(value, "printer-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_PRINTER_ATTRIBUTES || op == IPP_OP_GET_PRINTERS || op == IPP_OP_CUPS_GET_DEFAULT || op == IPP_OP_CUPS_GET_PRINTERS || op == IPP_OP_CUPS_GET_CLASSES))) { for (j = 0; j < (int)(sizeof(printer_description) / sizeof(printer_description[0])); j ++) cupsArrayAdd(ra, (void *)printer_description[j]); added = 1; } if (!strcmp(value, "resource-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) { for (j = 0; j < (int)(sizeof(resource_description) / sizeof(resource_description[0])); j ++) cupsArrayAdd(ra, (void *)resource_description[j]); added = 1; } if (!strcmp(value, "resource-status") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES))) { for (j = 0; j < (int)(sizeof(resource_status) / sizeof(resource_status[0])); j ++) cupsArrayAdd(ra, (void *)resource_status[j]); added = 1; } if (!strcmp(value, "resource-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_RESOURCE_ATTRIBUTES || op == IPP_OP_GET_RESOURCES || op == IPP_OP_GET_SYSTEM_ATTRIBUTES))) { for (j = 0; j < (int)(sizeof(resource_template) / sizeof(resource_template[0])); j ++) cupsArrayAdd(ra, (void *)resource_template[j]); added = 1; } if (!strcmp(value, "subscription-description") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) { for (j = 0; j < (int)(sizeof(subscription_description) / sizeof(subscription_description[0])); j ++) cupsArrayAdd(ra, (void *)subscription_description[j]); added = 1; } if (!strcmp(value, "subscription-template") || (!strcmp(value, "all") && (op == IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES || op == IPP_OP_GET_SUBSCRIPTIONS))) { for (j = 0; j < (int)(sizeof(subscription_template) / sizeof(subscription_template[0])); j ++) cupsArrayAdd(ra, (void *)subscription_template[j]); added = 1; } if (!strcmp(value, "system-description") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) { for (j = 0; j < (int)(sizeof(system_description) / sizeof(system_description[0])); j ++) cupsArrayAdd(ra, (void *)system_description[j]); added = 1; } if (!strcmp(value, "system-status") || (!strcmp(value, "all") && op == IPP_OP_GET_SYSTEM_ATTRIBUTES)) { for (j = 0; j < (int)(sizeof(system_status) / sizeof(system_status[0])); j ++) cupsArrayAdd(ra, (void *)system_status[j]); added = 1; } if (!added) cupsArrayAdd(ra, (void *)value); } return (ra); } /* * 'ippEnumString()' - Return a string corresponding to the enum value. */ const char * /* O - Enum string */ ippEnumString(const char *attrname, /* I - Attribute name */ int enumvalue) /* I - Enum value */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * Check for standard enum values... */ if (!strcmp(attrname, "document-state") && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0])))) return (ipp_document_states[enumvalue - 3]); else if (!strcmp(attrname, "finishings") || !strcmp(attrname, "finishings-actual") || !strcmp(attrname, "finishings-default") || !strcmp(attrname, "finishings-ready") || !strcmp(attrname, "finishings-supported") || !strcmp(attrname, "job-finishings") || !strcmp(attrname, "job-finishings-default") || !strcmp(attrname, "job-finishings-supported")) { if (enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0])))) return (ipp_finishings[enumvalue - 3]); else if (enumvalue >= 0x40000000 && enumvalue < (0x40000000 + (int)(sizeof(ipp_finishings_vendor) / sizeof(ipp_finishings_vendor[0])))) return (ipp_finishings_vendor[enumvalue - 0x40000000]); } else if ((!strcmp(attrname, "job-collation-type") || !strcmp(attrname, "job-collation-type-actual")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_job_collation_types) / sizeof(ipp_job_collation_types[0])))) return (ipp_job_collation_types[enumvalue - 3]); else if (!strcmp(attrname, "job-state") && enumvalue >= IPP_JSTATE_PENDING && enumvalue <= IPP_JSTATE_COMPLETED) return (ipp_job_states[enumvalue - IPP_JSTATE_PENDING]); else if (!strcmp(attrname, "operations-supported")) return (ippOpString((ipp_op_t)enumvalue)); else if ((!strcmp(attrname, "orientation-requested") || !strcmp(attrname, "orientation-requested-actual") || !strcmp(attrname, "orientation-requested-default") || !strcmp(attrname, "orientation-requested-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_orientation_requesteds) / sizeof(ipp_orientation_requesteds[0])))) return (ipp_orientation_requesteds[enumvalue - 3]); else if ((!strcmp(attrname, "print-quality") || !strcmp(attrname, "print-quality-actual") || !strcmp(attrname, "print-quality-default") || !strcmp(attrname, "print-quality-supported")) && enumvalue >= 3 && enumvalue < (3 + (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0])))) return (ipp_print_qualities[enumvalue - 3]); else if (!strcmp(attrname, "printer-state") && enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED) return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]); else if (!strcmp(attrname, "resource-state") && enumvalue >= IPP_RSTATE_PENDING && enumvalue <= IPP_RSTATE_ABORTED) return (ipp_resource_states[enumvalue - IPP_RSTATE_PENDING]); else if (!strcmp(attrname, "system-state") && enumvalue >= IPP_SSTATE_IDLE && enumvalue <= IPP_SSTATE_STOPPED) return (ipp_system_states[enumvalue - IPP_SSTATE_IDLE]); /* * Not a standard enum value, just return the decimal equivalent... */ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "%d", enumvalue); return (cg->ipp_unknown); } /* * 'ippEnumValue()' - Return the value associated with a given enum string. */ int /* O - Enum value or -1 if unknown */ ippEnumValue(const char *attrname, /* I - Attribute name */ const char *enumstring) /* I - Enum string */ { int i, /* Looping var */ num_strings; /* Number of strings to compare */ const char * const *strings; /* Strings to compare */ /* * If the string is just a number, return it... */ if (isdigit(*enumstring & 255)) return ((int)strtol(enumstring, NULL, 0)); /* * Otherwise look up the string... */ if (!strcmp(attrname, "document-state")) { num_strings = (int)(sizeof(ipp_document_states) / sizeof(ipp_document_states[0])); strings = ipp_document_states; } else if (!strcmp(attrname, "finishings") || !strcmp(attrname, "finishings-actual") || !strcmp(attrname, "finishings-default") || !strcmp(attrname, "finishings-ready") || !strcmp(attrname, "finishings-supported")) { for (i = 0; i < (int)(sizeof(ipp_finishings_vendor) / sizeof(ipp_finishings_vendor[0])); i ++) if (!strcmp(enumstring, ipp_finishings_vendor[i])) return (i + 0x40000000); num_strings = (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0])); strings = ipp_finishings; } else if (!strcmp(attrname, "job-collation-type") || !strcmp(attrname, "job-collation-type-actual")) { num_strings = (int)(sizeof(ipp_job_collation_types) / sizeof(ipp_job_collation_types[0])); strings = ipp_job_collation_types; } else if (!strcmp(attrname, "job-state")) { num_strings = (int)(sizeof(ipp_job_states) / sizeof(ipp_job_states[0])); strings = ipp_job_states; } else if (!strcmp(attrname, "operations-supported")) return (ippOpValue(enumstring)); else if (!strcmp(attrname, "orientation-requested") || !strcmp(attrname, "orientation-requested-actual") || !strcmp(attrname, "orientation-requested-default") || !strcmp(attrname, "orientation-requested-supported")) { num_strings = (int)(sizeof(ipp_orientation_requesteds) / sizeof(ipp_orientation_requesteds[0])); strings = ipp_orientation_requesteds; } else if (!strcmp(attrname, "print-quality") || !strcmp(attrname, "print-quality-actual") || !strcmp(attrname, "print-quality-default") || !strcmp(attrname, "print-quality-supported")) { num_strings = (int)(sizeof(ipp_print_qualities) / sizeof(ipp_print_qualities[0])); strings = ipp_print_qualities; } else if (!strcmp(attrname, "printer-state")) { num_strings = (int)(sizeof(ipp_printer_states) / sizeof(ipp_printer_states[0])); strings = ipp_printer_states; } else if (!strcmp(attrname, "resource-state")) { num_strings = (int)(sizeof(ipp_resource_states) / sizeof(ipp_resource_states[0])); strings = ipp_resource_states; } else if (!strcmp(attrname, "system-state")) { num_strings = (int)(sizeof(ipp_system_states) / sizeof(ipp_system_states[0])); strings = ipp_system_states; } else return (-1); for (i = 0; i < num_strings; i ++) if (!strcmp(enumstring, strings[i])) return (i + 3); return (-1); } /* * 'ippErrorString()' - Return a name for the given status code. */ const char * /* O - Text string */ ippErrorString(ipp_status_t error) /* I - Error status */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if the error code is a known value... */ if (error >= IPP_STATUS_OK && error <= IPP_STATUS_OK_EVENTS_COMPLETE) return (ipp_status_oks[error]); else if (error == IPP_STATUS_REDIRECTION_OTHER_SITE) return ("redirection-other-site"); else if (error == IPP_STATUS_CUPS_SEE_OTHER) return ("cups-see-other"); else if (error >= IPP_STATUS_ERROR_BAD_REQUEST && error <= IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED) return (ipp_status_400s[error - IPP_STATUS_ERROR_BAD_REQUEST]); else if (error >= 0x480 && error <= IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED) return (ipp_status_480s[error - 0x0480]); else if (error >= IPP_STATUS_ERROR_INTERNAL && error <= IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS) return (ipp_status_500s[error - IPP_STATUS_ERROR_INTERNAL]); else if (error >= IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED && error <= IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED) return (ipp_status_1000s[error - IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED]); /* * No, build an "0xxxxx" error string... */ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", error); return (cg->ipp_unknown); } /* * 'ippErrorValue()' - Return a status code for the given name. * * @since CUPS 1.2/macOS 10.5@ */ ipp_status_t /* O - IPP status code */ ippErrorValue(const char *name) /* I - Name */ { size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_oks[i])) return ((ipp_status_t)i); if (!_cups_strcasecmp(name, "redirection-other-site")) return (IPP_STATUS_REDIRECTION_OTHER_SITE); if (!_cups_strcasecmp(name, "cups-see-other")) return (IPP_STATUS_CUPS_SEE_OTHER); for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_400s[i])) return ((ipp_status_t)(i + 0x400)); for (i = 0; i < (sizeof(ipp_status_480s) / sizeof(ipp_status_480s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_480s[i])) return ((ipp_status_t)(i + 0x480)); for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_500s[i])) return ((ipp_status_t)(i + 0x500)); for (i = 0; i < (sizeof(ipp_status_1000s) / sizeof(ipp_status_1000s[0])); i ++) if (!_cups_strcasecmp(name, ipp_status_1000s[i])) return ((ipp_status_t)(i + 0x1000)); return ((ipp_status_t)-1); } /* * 'ippOpString()' - Return a name for the given operation id. * * @since CUPS 1.2/macOS 10.5@ */ const char * /* O - Name */ ippOpString(ipp_op_t op) /* I - Operation ID */ { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ /* * See if the operation ID is a known value... */ if (op >= IPP_OP_PRINT_JOB && op < (ipp_op_t)(sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0]))) return (ipp_std_ops[op]); else if (op == IPP_OP_PRIVATE) return ("windows-ext"); else if (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD) return (ipp_cups_ops[op - IPP_OP_CUPS_GET_DEFAULT]); else if (op >= IPP_OP_CUPS_GET_DOCUMENT && op <= IPP_OP_CUPS_CREATE_LOCAL_PRINTER) return (ipp_cups_ops2[op - IPP_OP_CUPS_GET_DOCUMENT]); /* * No, build an "0xxxxx" operation string... */ snprintf(cg->ipp_unknown, sizeof(cg->ipp_unknown), "0x%04x", op); return (cg->ipp_unknown); } /* * 'ippOpValue()' - Return an operation id for the given name. * * @since CUPS 1.2/macOS 10.5@ */ ipp_op_t /* O - Operation ID */ ippOpValue(const char *name) /* I - Textual name */ { size_t i; /* Looping var */ if (!strncmp(name, "0x", 2)) return ((ipp_op_t)strtol(name + 2, NULL, 16)); for (i = 0; i < (sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])); i ++) if (!_cups_strcasecmp(name, ipp_std_ops[i])) return ((ipp_op_t)i); if (!_cups_strcasecmp(name, "windows-ext")) return (IPP_OP_PRIVATE); for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++) if (!_cups_strcasecmp(name, ipp_cups_ops[i])) return ((ipp_op_t)(i + 0x4001)); for (i = 0; i < (sizeof(ipp_cups_ops2) / sizeof(ipp_cups_ops2[0])); i ++) if (!_cups_strcasecmp(name, ipp_cups_ops2[i])) return ((ipp_op_t)(i + 0x4027)); if (!_cups_strcasecmp(name, "Create-Job-Subscription")) return (IPP_OP_CREATE_JOB_SUBSCRIPTIONS); if (!_cups_strcasecmp(name, "Create-Printer-Subscription")) return (IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS); if (!_cups_strcasecmp(name, "CUPS-Add-Class")) return (IPP_OP_CUPS_ADD_MODIFY_CLASS); if (!_cups_strcasecmp(name, "CUPS-Add-Printer")) return (IPP_OP_CUPS_ADD_MODIFY_PRINTER); return (IPP_OP_CUPS_INVALID); } /* * 'ippPort()' - Return the default IPP port number. */ int /* O - Port number */ ippPort(void) { _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ DEBUG_puts("ippPort()"); if (!cg->ipp_port) _cupsSetDefaults(); DEBUG_printf(("1ippPort: Returning %d...", cg->ipp_port)); return (cg->ipp_port); } /* * 'ippSetPort()' - Set the default port number. */ void ippSetPort(int p) /* I - Port number to use */ { DEBUG_printf(("ippSetPort(p=%d)", p)); _cupsGlobals()->ipp_port = p; } /* * 'ippStateString()' - Return the name corresponding to a state value. * * @since CUPS 2.0/OS 10.10@ */ const char * /* O - State name */ ippStateString(ipp_state_t state) /* I - State value */ { if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA) return (ipp_states[state - IPP_STATE_ERROR]); else return ("UNKNOWN"); } /* * 'ippTagString()' - Return the tag name corresponding to a tag value. * * The returned names are defined in RFC 8011 and the IANA IPP Registry. * * @since CUPS 1.4/macOS 10.6@ */ const char * /* O - Tag name */ ippTagString(ipp_tag_t tag) /* I - Tag value */ { tag &= IPP_TAG_CUPS_MASK; if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0]))) return (ipp_tag_names[tag]); else return ("UNKNOWN"); } /* * 'ippTagValue()' - Return the tag value corresponding to a tag name. * * The tag names are defined in RFC 8011 and the IANA IPP Registry. * * @since CUPS 1.4/macOS 10.6@ */ ipp_tag_t /* O - Tag value */ ippTagValue(const char *name) /* I - Tag name */ { size_t i; /* Looping var */ for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++) if (!_cups_strcasecmp(name, ipp_tag_names[i])) return ((ipp_tag_t)i); if (!_cups_strcasecmp(name, "operation")) return (IPP_TAG_OPERATION); else if (!_cups_strcasecmp(name, "job")) return (IPP_TAG_JOB); else if (!_cups_strcasecmp(name, "printer")) return (IPP_TAG_PRINTER); else if (!_cups_strcasecmp(name, "unsupported")) return (IPP_TAG_UNSUPPORTED_GROUP); else if (!_cups_strcasecmp(name, "subscription")) return (IPP_TAG_SUBSCRIPTION); else if (!_cups_strcasecmp(name, "event")) return (IPP_TAG_EVENT_NOTIFICATION); else if (!_cups_strcasecmp(name, "language")) return (IPP_TAG_LANGUAGE); else if (!_cups_strcasecmp(name, "mimetype")) return (IPP_TAG_MIMETYPE); else if (!_cups_strcasecmp(name, "name")) return (IPP_TAG_NAME); else if (!_cups_strcasecmp(name, "text")) return (IPP_TAG_TEXT); else if (!_cups_strcasecmp(name, "begCollection")) return (IPP_TAG_BEGIN_COLLECTION); else return (IPP_TAG_ZERO); } /* * 'ipp_col_string()' - Convert a collection to a string. */ static size_t /* O - Number of bytes */ ipp_col_string(ipp_t *col, /* I - Collection attribute */ char *buffer, /* I - Buffer or NULL */ size_t bufsize) /* I - Size of buffer */ { char *bufptr, /* Position in buffer */ *bufend, /* End of buffer */ prefix = '{', /* Prefix character */ temp[256]; /* Temporary string */ ipp_attribute_t *attr; /* Current member attribute */ if (!col) { if (buffer) *buffer = '\0'; return (0); } bufptr = buffer; bufend = buffer + bufsize - 1; for (attr = col->attrs; attr; attr = attr->next) { if (!attr->name) continue; if (buffer && bufptr < bufend) *bufptr = prefix; bufptr ++; prefix = ' '; if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%s=", attr->name); else bufptr += strlen(attr->name) + 1; if (buffer && bufptr < bufend) bufptr += ippAttributeString(attr, bufptr, (size_t)(bufend - bufptr + 1)); else bufptr += ippAttributeString(attr, temp, sizeof(temp)); } if (prefix == '{') { if (buffer && bufptr < bufend) *bufptr = prefix; bufptr ++; } if (buffer && bufptr < bufend) *bufptr = '}'; bufptr ++; return ((size_t)(bufptr - buffer)); }