Re: [MOD] STR #4190: Send-Document failure ignored

Michael Sweet <[email protected]> Fri, 21 Sep 2012 07:40:41 -0700 (PDT)
Newsgroups gmane.comp.printing.cups.bugs
Message-ID <[email protected]>
DO NOT REPLY TO THIS MESSAGE.  INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.

[STR Closed w/Resolution]

Fixed in Subversion repository.

The attached change falls back to Print-Job on IPP/1.0 printers, which
allows for a workaround for broken IPP/1.1 and later printers - just add
"?version=1.0" to the end of the device URI.

I also took the opportunity to fix the handling of
authenticated-but-not-authorized print situations (previously we spun on
Create-Job/Print-Job on client-error-not-authorized).

Link: http://www.cups.org/str.php?L4190
Version: 1.5.4
Fix Version: 1.7-current (r10612)

_______________________________________________
cups-bugs mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/cups-bugs
str4190.patch (text/plain, 2.2 KB)
Index: backend/ipp.c
===================================================================
--- backend/ipp.c	(revision 10611)
+++ backend/ipp.c	(working copy)
@@ -1279,6 +1279,16 @@
   }
 
  /*
+  * If the printer only claims to support IPP/1.0, or if the user specifically
+  * included version=1.0 in the URI, then do not try to use Create-Job or
+  * Send-Document.  This is another dreaded compatibility hack, but unfortunately
+  * there are enough broken printers out there that we need this for now...
+  */
+
+  if (version == 10)
+    create_job = send_document = 0;
+
+ /*
   * Start monitoring the printer in the background...
   */
 
@@ -1494,10 +1504,9 @@
 	  goto cleanup;
 	}
       }
-      else if (ipp_status == IPP_ERROR_JOB_CANCELED)
+      else if (ipp_status == IPP_ERROR_JOB_CANCELED ||
+               ipp_status == IPP_NOT_AUTHORIZED)
         goto cleanup;
-      else if (ipp_status == IPP_NOT_AUTHORIZED)
-        continue;
       else
       {
        /*
@@ -1678,14 +1687,35 @@
              ipp_status == IPP_NOT_POSSIBLE ||
 	     ipp_status == IPP_PRINTER_BUSY)
       continue;
-    else if (ipp_status == IPP_REQUEST_VALUE)
+    else if (ipp_status == IPP_REQUEST_VALUE ||
+             ipp_status == IPP_ERROR_JOB_CANCELED ||
+             ipp_status == IPP_NOT_AUTHORIZED)
     {
      /*
-      * Print file is too large, abort this job...
+      * Print file is too large, job was canceled, or we need new
+      * authentication data...
       */
 
       goto cleanup;
     }
+    else if (ipp_status == IPP_NOT_FOUND)
+    {
+     /*
+      * Printer does not actually implement support for Create-Job/
+      * Send-Document, so log the conformance issue and stop the printer.
+      */
+
+      fputs("DEBUG: This printer claims to support Create-Job and "
+            "Send-Document, but those operations failed.\n", stderr);
+      fputs("DEBUG: Add '?version=1.0' to the device URI to use legacy "
+            "compatibility mode.\n", stderr);
+      update_reasons(NULL, "+cups-ipp-conformance-failure-report,"
+			   "cups-ipp-missing-send-document");
+
+      ipp_status = IPP_INTERNAL_ERROR;	/* Force queue to stop */
+
+      goto cleanup;
+    }
     else
       copies_remaining --;