/* * "$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 /* * 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 $". */