/*
* IPP backend for CUPS.
*
- * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 2007-2019 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
# define kPMPrintUIToolAgent "com.apple.printuitool.agent"
# define kPMStartJob 100
# define kPMWaitForJob 101
-# ifdef HAVE_XPC_PRIVATE_H
-# include <xpc/private.h>
-# else
extern void xpc_connection_set_target_uid(xpc_connection_t connection,
uid_t uid);
-# endif /* HAVE_XPC_PRIVATE_H */
#endif /* HAVE_GSSAPI && HAVE_XPC */
monitor.printer_state = IPP_PSTATE_IDLE;
monitor.retryable = argc == 6 && document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf");
+ fprintf(stderr, "DEBUG: retryable=%d\n", monitor.retryable);
+
if (create_job)
{
monitor.job_name = argv[3];
const char *sides = cupsGetOption("sides", num_options, options);
- if (!strncmp(sides, "two-sided-", 10))
+ if (!sides || !strncmp(sides, "two-sided-", 10))
{
fputs("DEBUG: Unable to do two-sided printing, setting sides to 'one-sided'.\n", stderr);
num_options = cupsAddOption("sides", "one-sided", num_options, &options);
response = cupsGetResponse(http, resource);
ippDelete(request);
- fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n",
- ippErrorString(cupsLastError()), cupsLastErrorString());
+ fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n", ippErrorString(cupsLastError()), cupsLastErrorString());
debug_attributes(response);
- ippDelete(response);
if (cupsLastError() > IPP_STATUS_OK_CONFLICTING && !job_canceled)
{
+ ipp_attribute_t *reasons = ippFindAttribute(response, "job-state-reasons", IPP_TAG_KEYWORD);
+ /* job-state-reasons values */
+
ipp_status = cupsLastError();
- _cupsLangPrintFilter(stderr, "ERROR",
- _("Unable to add document to print job."));
+ if (ippContainsString(reasons, "document-format-error"))
+ ipp_status = IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR;
+ else if (ippContainsString(reasons, "document-unprintable"))
+ ipp_status = IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE;
+
+ ippDelete(response);
+ _cupsLangPrintFilter(stderr, "ERROR", _("Unable to add document to print job."));
break;
}
else
{
+ ippDelete(response);
+
password_tries = 0;
if (num_files == 0 || fd < 0)
fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
copies_remaining --;
}
- else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
+ else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED || ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
argc == 6 &&
document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf"))
{
else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
fputs("JOBSTATE: account-authorization-failed\n", stderr);
- if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN ||
- ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
+ if (job_canceled)
+ return (CUPS_BACKEND_OK);
+ else if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN || ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
return (CUPS_BACKEND_AUTH_REQUIRED);
else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
}
}
- fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
- ippEnumString("job-state", monitor->job_state));
+ fprintf(stderr, "DEBUG: (monitor) job-state = %s\n", ippEnumString("job-state", (int)monitor->job_state));
if (!job_canceled &&
(monitor->job_state == IPP_JSTATE_CANCELED ||
ippDelete(response);
- fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
- ippEnumString("job-state", monitor->job_state));
+ fprintf(stderr, "DEBUG: (monitor) job-state = %s\n", ippEnumString("job-state", (int)monitor->job_state));
if (!job_canceled &&
(monitor->job_state == IPP_JSTATE_CANCELED ||