/*
- * "$Id$"
+ * "$Id: ipp.c 11495 2013-12-22 05:29:16Z msweet $"
*
- * IPP backend for CUPS.
+ * IPP backend for CUPS.
*
- * Copyright 2007-2013 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * "LICENSE" which should have been included with this file. If this
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * 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"
+ * "LICENSE" which should have been included with this file. If this
+ * 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:
- *
- * main() - Send a file to the printer or server.
- * cancel_job() - Cancel a print job.
- * check_printer_state() - Check the printer state.
- * monitor_printer() - Monitor the printer state.
- * new_request() - Create a new print creation or validation
- * request.
- * password_cb() - Disable the password prompt for
- * cupsDoFileRequest().
- * quote_string() - Quote a string value.
- * report_attr() - Report an IPP attribute value.
- * report_printer_state() - Report the printer state.
- * run_as_user() - Run the IPP backend as the printing user.
- * sigterm_handler() - Handle 'terminate' signals that stop the backend.
- * timeout_cb() - Handle HTTP timeouts.
- * update_reasons() - Update the printer-state-reasons values.
+ * This file is subject to the Apple OS-Developed Software exception.
*/
/*
"media-col-supported",
"multiple-document-handling-supported",
"operations-supported",
+ "print-color-mode-supported",
"printer-alert",
"printer-alert-description",
"printer-is-accepting-jobs",
ppd_file_t *ppd,
ipp_attribute_t *media_col_sup,
ipp_attribute_t *doc_handling_sup,
- int print_color_mode);
+ ipp_attribute_t *print_color_mode_sup);
static const char *password_cb(const char *prompt, http_t *http,
const char *method, const char *resource,
int *user_data);
ipp_attribute_t *doc_handling_sup; /* multiple-document-handling-supported */
ipp_attribute_t *printer_state; /* printer-state attribute */
ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */
+ ipp_attribute_t *print_color_mode_sup;/* Does printer support print-color-mode? */
int create_job = 0, /* Does printer support Create-Job? */
get_job_attrs = 0, /* Does printer support Get-Job-Attributes? */
send_document = 0, /* Does printer support Send-Document? */
validate_job = 0, /* Does printer support Validate-Job? */
- print_color_mode = 0; /* Does printer support print-color-mode? */
- int copies, /* Number of copies for job */
+ copies, /* Number of copies for job */
copies_remaining; /* Number of copies remaining */
const char *content_type, /* CONTENT_TYPE environment variable */
*final_content_type, /* FINAL_CONTENT_TYPE environment var */
delay = _cupsNextDelay(delay, &prev_delay);
ippDelete(supported);
- supported = NULL;
+ supported = NULL;
+ ipp_status = IPP_STATUS_ERROR_BUSY;
continue;
}
}
media_col_sup->values[i].string.text);
}
- print_color_mode = ippFindAttribute(supported,
- "print-color-mode-supported",
- IPP_TAG_KEYWORD) != NULL;
+ print_color_mode_sup = ippFindAttribute(supported, "print-color-mode-supported", IPP_TAG_KEYWORD);
if ((operations_sup = ippFindAttribute(supported, "operations-supported",
IPP_TAG_ENUM)) != NULL)
request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2],
monitor.job_name, num_options, options, compression,
copies_sup ? copies : 1, document_format, pc, ppd,
- media_col_sup, doc_handling_sup, print_color_mode);
+ media_col_sup, doc_handling_sup, print_color_mode_sup);
response = cupsDoRequest(http, request, resource);
version, uri, argv[2], monitor.job_name, num_options,
options, compression, copies_sup ? copies : 1,
document_format, pc, ppd, media_col_sup,
- doc_handling_sup, print_color_mode);
+ doc_handling_sup, print_color_mode_sup);
/*
* Do the request...
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, argv[2]);
- if ((i + 1) >= num_files)
- ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1);
+ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document",
+ (i + 1) >= num_files);
if (document_format)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
ppd_file_t *ppd, /* I - PPD file data */
ipp_attribute_t *media_col_sup, /* I - media-col-supported values */
ipp_attribute_t *doc_handling_sup, /* I - multiple-document-handling-supported values */
- int print_color_mode) /* I - Printer supports print-color-mode */
+ ipp_attribute_t *print_color_mode_sup)
+ /* I - Printer supports print-color-mode */
{
int i; /* Looping var */
ipp_t *request; /* Request data */
strlen(keyword));
break;
default :
+ if (!strcmp(mandatory, "print-color-mode") && !strcmp(keyword, "monochrome"))
+ {
+ if (ippContainsString(print_color_mode_sup, "auto-monochrome"))
+ keyword = "auto-monochrome";
+ else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome"))
+ keyword = "process-monochrome";
+ }
+
ippAddString(request, IPP_TAG_JOB, value_tag, mandatory,
NULL, keyword);
break;
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin",
NULL, keyword);
- color_attr_name = print_color_mode ? "print-color-mode" : "output-mode";
+ color_attr_name = print_color_mode_sup ? "print-color-mode" : "output-mode";
if ((keyword = cupsGetOption("print-color-mode", num_options,
- options)) != NULL)
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, color_attr_name,
- NULL, keyword);
- else if ((choice = ppdFindMarkedChoice(ppd, "ColorModel")) != NULL)
+ options)) == NULL)
{
- if (!_cups_strcasecmp(choice->choice, "Gray"))
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD,
- color_attr_name, NULL, "monochrome");
- else
- ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD,
- color_attr_name, NULL, "color");
+ if ((choice = ppdFindMarkedChoice(ppd, "ColorModel")) != NULL)
+ {
+ if (!_cups_strcasecmp(choice->choice, "Gray"))
+ keyword = "monochrome";
+ else
+ keyword = "color";
+ }
+ }
+
+ if (keyword && !strcmp(keyword, "monochrome"))
+ {
+ if (ippContainsString(print_color_mode_sup, "auto-monochrome"))
+ keyword = "auto-monochrome";
+ else if (ippContainsString(print_color_mode_sup, "process-monochrome") && !ippContainsString(print_color_mode_sup, "monochrome"))
+ keyword = "process-monochrome";
}
+ if (keyword)
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, color_attr_name,
+ NULL, keyword);
+
if ((keyword = cupsGetOption("print-quality", num_options,
options)) != NULL)
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
{
if (*s == '\\' || *s == '\"' || *s == '\'')
{
- if (q < (qend - 3))
+ if (qptr < (qend - 4))
{
*qptr++ = '\\';
*qptr++ = '\\';
}
/*
- * End of "$Id$".
+ * End of "$Id: ipp.c 11495 2013-12-22 05:29:16Z msweet $".
*/