You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2570 lines
80 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

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