| /* |
| * "$Id: ipp-support.c 6879 2007-08-29 20:26:50Z mike $" |
| * |
| * Internet Printing Protocol support functions for the Common UNIX |
| * Printing System (CUPS). |
| * |
| * Copyright 2007 by Apple Inc. |
| * Copyright 1997-2007 by Easy Software Products, all rights reserved. |
| * |
| * These coded instructions, statements, and computer programs are the |
| * property of Apple Inc. and are protected by Federal copyright |
| * law. Distribution and use rights are outlined in the file "LICENSE.txt" |
| * which should have been included with this file. If this file is |
| * file is missing or damaged, see the license at "http://www.cups.org/". |
| * |
| * This file is subject to the Apple OS-Developed Software exception. |
| * |
| * Contents: |
| * |
| * ippErrorString() - Return a name for the given status code. |
| * ippErrorValue() - Return a status code for the given name. |
| * ippOpString() - Return a name for the given operation id. |
| * ippOpValue() - Return an operation id for the given name. |
| * ippPort() - Return the default IPP port number. |
| * ippSetPort() - Set the default port number. |
| */ |
| |
| /* |
| * Include necessary headers... |
| */ |
| |
| #include "globals.h" |
| #include "debug.h" |
| #include <stdlib.h> |
| |
| |
| /* |
| * Local globals... |
| */ |
| |
| static const char * const ipp_status_oks[] = /* "OK" status codes */ |
| { |
| "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 */ |
| { |
| "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-print-support-file-not-found" |
| }, |
| * 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" |
| }; |
| static char * const ipp_std_ops[] = |
| { |
| /* 0x0000 - 0x000f */ |
| "", "", "Print-Job", "Print-URI", |
| "Validate-Job", "Create-Job", "Send-Document", |
| "Send-URI", "Cancel-Job", "Get-Job-Attributes", |
| "Get-Jobs", "Get-Printer-Attributes", |
| "Hold-Job", "Release-Job", "Restart-Job", "", |
| |
| /* 0x0010 - 0x001f */ |
| "Pause-Printer", "Resume-Printer", |
| "Purge-Jobs", "Set-Printer-Attributes", |
| "Set-Job-Attributes", |
| "Get-Printer-Supported-Values", |
| "Create-Printer-Subscription", |
| "Create-Job-Subscription", |
| "Get-Subscription-Attributes", |
| "Get-Subscriptions", "Renew-Subscription", |
| "Cancel-Subscription", "Get-Notifications", |
| "Send-Notifications", "", "", |
| |
| /* 0x0020 - 0x002f */ |
| "", |
| "Get-Printer-Support-Files", |
| "Enable-Printer", |
| "Disable-Printer", |
| "Pause-Printer-After-Current-Job", |
| "Hold-New-Jobs", |
| "Release-Held-New-Jobs", |
| "Deactivate-Printer", |
| "Activate-Printer", |
| "Restart-Printer", |
| "Shutdown-Printer", |
| "Startup-Printer", |
| "Reprocess-Job", |
| "Cancel-Current-Job", |
| "Suspend-Current-Job", |
| "Resume-Job", |
| |
| /* 0x0030 - 0x0031 */ |
| "Promote-Job", |
| "Schedule-Job-After" |
| }, |
| * 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" |
| }; |
| |
| |
| /* |
| * '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_OK && error <= IPP_OK_EVENTS_COMPLETE) |
| return (ipp_status_oks[error]); |
| else if (error == IPP_REDIRECTION_OTHER_SITE) |
| return ("redirection-other-site"); |
| else if (error == CUPS_SEE_OTHER) |
| return ("cups-see-other"); |
| else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND) |
| return (ipp_status_400s[error - IPP_BAD_REQUEST]); |
| else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED) |
| return (ipp_status_500s[error - IPP_INTERNAL_ERROR]); |
| |
| /* |
| * No, build an "unknown-xxxx" error string... |
| */ |
| |
| sprintf(cg->ipp_unknown, "unknown-%04x", error); |
| |
| return (cg->ipp_unknown); |
| } |
| |
| |
| /* |
| * 'ippErrorValue()' - Return a status code for the given name. |
| * |
| * @since CUPS 1.2@ |
| */ |
| |
| ipp_status_t /* O - IPP status code */ |
| ippErrorValue(const char *name) /* I - Name */ |
| { |
| int i; |
| |
| |
| for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) |
| if (!strcasecmp(name, ipp_status_oks[i])) |
| return ((ipp_status_t)i); |
| |
| if (!strcasecmp(name, "redirection-other-site")) |
| return (IPP_REDIRECTION_OTHER_SITE); |
| |
| if (!strcasecmp(name, "cups-see-other")) |
| return (CUPS_SEE_OTHER); |
| |
| for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++) |
| if (!strcasecmp(name, ipp_status_400s[i])) |
| return ((ipp_status_t)(i + 0x400)); |
| |
| for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++) |
| if (!strcasecmp(name, ipp_status_500s[i])) |
| return ((ipp_status_t)(i + 0x500)); |
| |
| return ((ipp_status_t)-1); |
| } |
| |
| |
| /* |
| * 'ippOpString()' - Return a name for the given operation id. |
| * |
| * @since CUPS 1.2@ |
| */ |
| |
| 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_PRINT_JOB && op <= IPP_SCHEDULE_JOB_AFTER) |
| return (ipp_std_ops[op]); |
| else if (op == IPP_PRIVATE) |
| return ("windows-ext"); |
| else if (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD) |
| return (ipp_cups_ops[op - CUPS_GET_DEFAULT]); |
| else if (op == CUPS_GET_DOCUMENT) |
| return (ipp_cups_ops2[0]); |
| |
| /* |
| * No, build an "unknown-xxxx" operation string... |
| */ |
| |
| sprintf(cg->ipp_unknown, "unknown-%04x", op); |
| |
| return (cg->ipp_unknown); |
| } |
| |
| |
| /* |
| * 'ippOpValue()' - Return an operation id for the given name. |
| * |
| * @since CUPS 1.2@ |
| */ |
| |
| ipp_op_t /* O - Operation ID */ |
| ippOpValue(const char *name) /* I - Textual name */ |
| { |
| int i; |
| |
| |
| for (i = 0; i < (sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])); i ++) |
| if (!strcasecmp(name, ipp_std_ops[i])) |
| return ((ipp_op_t)i); |
| |
| if (!strcasecmp(name, "windows-ext")) |
| return (IPP_PRIVATE); |
| |
| for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++) |
| if (!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 (!strcasecmp(name, ipp_cups_ops2[i])) |
| return ((ipp_op_t)(i + 0x4027)); |
| |
| if (!strcasecmp(name, "CUPS-Add-Class")) |
| return (CUPS_ADD_MODIFY_CLASS); |
| |
| if (!strcasecmp(name, "CUPS-Add-Printer")) |
| return (CUPS_ADD_MODIFY_PRINTER); |
| |
| return ((ipp_op_t)-1); |
| } |
| |
| |
| /* |
| * 'ippPort()' - Return the default IPP port number. |
| */ |
| |
| int /* O - Port number */ |
| ippPort(void) |
| { |
| const char *ipp_port; /* IPP_PORT environment variable */ |
| struct servent *port; /* Port number info */ |
| int portnum; /* Port number */ |
| _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ |
| |
| |
| DEBUG_puts("ippPort()"); |
| |
| if (!cg->ipp_port) |
| { |
| /* |
| * See if the server definition includes the port number... |
| */ |
| |
| DEBUG_puts("ippPort: Not initialized..."); |
| |
| cupsServer(); |
| |
| #ifdef DEBUG |
| if (cg->ipp_port) |
| DEBUG_puts(("ippPort: Set via cupsServer()...")); |
| #endif /* DEBUG */ |
| } |
| |
| if (!cg->ipp_port) |
| { |
| if ((ipp_port = getenv("IPP_PORT")) != NULL) |
| { |
| DEBUG_puts("ippPort: Set via IPP_PORT..."); |
| portnum = atoi(ipp_port); |
| } |
| else if ((port = getservbyname("ipp", NULL)) == NULL) |
| { |
| DEBUG_puts("ippPort: Set via CUPS_DEFAULT_IPP_PORT..."); |
| portnum = CUPS_DEFAULT_IPP_PORT; |
| } |
| else |
| { |
| DEBUG_puts("ippPort: Set via ipp service entry..."); |
| portnum = ntohs(port->s_port); |
| } |
| |
| if (portnum > 0) |
| cg->ipp_port = portnum; |
| } |
| |
| DEBUG_printf(("ippPort: Returning %d...\n", 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)\n", p)); |
| |
| _cupsGlobals()->ipp_port = p; |
| } |
| |
| |
| /* |
| * End of "$Id: ipp-support.c 6879 2007-08-29 20:26:50Z mike $". |
| */ |