]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - backend/ipp.c
Import CUPS v1.7.1
[thirdparty/cups.git] / backend / ipp.c
index 7eec579468e8ed0ad1774c26f14a152ac4bfa811..22a350c9cf425819ea9245e0abe3297c034dc662 100644 (file)
@@ -1,36 +1,18 @@
 /*
- * "$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.
  */
 
 /*
@@ -133,6 +115,7 @@ static const char * const pattrs[] =        /* Printer attributes we want */
   "media-col-supported",
   "multiple-document-handling-supported",
   "operations-supported",
+  "print-color-mode-supported",
   "printer-alert",
   "printer-alert-description",
   "printer-is-accepting-jobs",
@@ -180,7 +163,7 @@ static ipp_t                *new_request(ipp_op_t op, int version, const char *uri,
                                     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);
@@ -267,12 +250,12 @@ main(int  argc,                           /* I - Number of command-line args */
   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 */
@@ -1041,7 +1024,8 @@ main(int  argc,                           /* I - Number of command-line args */
        delay = _cupsNextDelay(delay, &prev_delay);
 
        ippDelete(supported);
-       supported = NULL;
+       supported  = NULL;
+       ipp_status = IPP_STATUS_ERROR_BUSY;
        continue;
       }
     }
@@ -1117,9 +1101,7 @@ main(int  argc,                           /* I - Number of command-line args */
                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)
@@ -1401,7 +1383,7 @@ main(int  argc,                           /* I - Number of command-line args */
     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);
 
@@ -1487,7 +1469,7 @@ main(int  argc,                           /* I - Number of command-line args */
                          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...
@@ -1699,8 +1681,8 @@ main(int  argc,                           /* I - Number of command-line args */
          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,
@@ -2500,7 +2482,8 @@ new_request(
     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 */
@@ -2602,17 +2585,27 @@ new_request(
                      "job-password-encryption", NULL, keyword);
       }
 
-      if (pc->account_id &&
-          (keyword = cupsGetOption("job-account-id", num_options,
-                                   options)) != NULL)
-        ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-account-id",
-                     NULL, keyword);
+      if (pc->account_id)
+      {
+        if ((keyword = cupsGetOption("job-account-id", num_options,
+                                    options)) == NULL)
+         keyword = cupsGetOption("job-billing", num_options, options);
 
-      if (pc->accounting_user_id &&
-          (keyword = cupsGetOption("job-accounting-user-id", num_options,
-                                   options)) != NULL)
-        ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME,
-                     "job-accounting-user-id", NULL, keyword);
+        if (keyword)
+         ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME, "job-account-id",
+                      NULL, keyword);
+      }
+
+      if (pc->accounting_user_id)
+      {
+        if ((keyword = cupsGetOption("job-accounting-user-id", num_options,
+                                    options)) == NULL)
+         keyword = user;
+
+        if (keyword)
+         ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAME,
+                      "job-accounting-user-id", NULL, keyword);
+      }
 
       for (mandatory = (char *)cupsArrayFirst(pc->mandatory);
            mandatory;
@@ -2665,6 +2658,14 @@ new_request(
                                   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;
@@ -2739,22 +2740,32 @@ new_request(
        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",
@@ -3016,7 +3027,7 @@ quote_string(const char *s,               /* I - String */
   {
     if (*s == '\\' || *s == '\"' || *s == '\'')
     {
-      if (q < (qend - 3))
+      if (qptr < (qend - 4))
       {
        *qptr++ = '\\';
        *qptr++ = '\\';
@@ -3669,5 +3680,5 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
 }
 
 /*
- * End of "$Id$".
+ * End of "$Id: ipp.c 11495 2013-12-22 05:29:16Z msweet $".
  */