]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Check all support files at the start of a job.
authormike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Tue, 11 Dec 2012 16:41:45 +0000 (16:41 +0000)
committermike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Tue, 11 Dec 2012 16:41:45 +0000 (16:41 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@10746 7a7537e8-13f0-0310-91df-b6672ffda945

cups/ppd-cache.c
cups/ppd-private.h
scheduler/job.c

index 11087a96bbecf58cc48237c5d00d3e14b46c8654..9fe3d6c7de50268ebd6fe8545c48f24fda92df20 100644 (file)
@@ -576,6 +576,15 @@ _ppdCacheCreateWithFile(
       else
         pc->mandatory = _cupsArrayNewStrings(value, ' ');
     }
+    else if (!_cups_strcasecmp(line, "SupportFile"))
+    {
+      if (!pc->support_files)
+        pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+                                          (cups_acopy_func_t)_cupsStrAlloc,
+                                          (cups_afree_func_t)_cupsStrFree);
+
+      cupsArrayAdd(pc->support_files, value);
+    }
     else
     {
       DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line,
@@ -1404,6 +1413,22 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
   if ((ppd_attr = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
     pc->mandatory = _cupsArrayNewStrings(ppd_attr->value, ' ');
 
+ /*
+  * Support files...
+  */
+
+  pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+                                   (cups_acopy_func_t)_cupsStrAlloc,
+                                   (cups_afree_func_t)_cupsStrFree);
+
+  for (ppd_attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
+       ppd_attr;
+       ppd_attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL))
+    cupsArrayAdd(pc->support_files, ppd_attr->value);
+
+  if ((ppd_attr = ppdFindAttr(ppd, "APPrinterIconPath", NULL)) != NULL)
+    cupsArrayAdd(pc->support_files, ppd_attr->value);
+
  /*
   * Return the cache data...
   */
@@ -1509,6 +1534,8 @@ _ppdCacheDestroy(_ppd_cache_t *pc)        /* I - PPD cache and mapping data */
 
   cupsArrayDelete(pc->mandatory);
 
+  cupsArrayDelete(pc->support_files);
+
   free(pc);
 }
 
@@ -2419,6 +2446,15 @@ _ppdCacheWriteFile(
        value = (char *)cupsArrayNext(pc->mandatory))
     cupsFilePutConf(fp, "Mandatory", value);
 
+ /*
+  * Support files...
+  */
+
+  for (value = (char *)cupsArrayFirst(pc->support_files);
+       value;
+       value = (char *)cupsArrayNext(pc->support_files))
+    cupsFilePutConf(fp, "SupportFile", value);
+
  /*
   * IPP attributes, if any...
   */
index 03b014783d3a1e8be4cd8301e4f6ea208817f732..23514b440cd38930c2315de4494ddd9f24b652e8 100644 (file)
@@ -49,7 +49,7 @@ extern "C" {
  * Constants...
  */
 
-#  define _PPD_CACHE_VERSION   5       /* Version number in cache file */
+#  define _PPD_CACHE_VERSION   6       /* Version number in cache file */
 
 
 /*
@@ -147,6 +147,7 @@ struct _ppd_cache_s                 /**** PPD cache and PWG conversion data ****/
   char         *password;              /* cupsJobPassword value */
   cups_array_t *mandatory;             /* cupsMandatory value */
   char         *charge_info_uri;       /* cupsChargeInfoURI value */
+  cups_array_t *support_files;         /* Support files - ICC profiles, etc. */
 };
 
 
index 3d42bdac9b656125323c4c41c90ab5f070bcef91..41d7685f09bd5fe73c6378f62e4a11b061d86292 100644 (file)
@@ -1111,9 +1111,6 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
   * Now create processes for all of the filters...
   */
 
-  cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
-                                      "cups-insecure-filter-warning");
-
   for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
        filter;
        i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
@@ -4407,6 +4404,9 @@ static void
 start_job(cupsd_job_t     *job,                /* I - Job ID */
           cupsd_printer_t *printer)    /* I - Printer to print job */
 {
+  const char   *filename;              /* Support filename */
+
+
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
                   job, job->id, printer, printer->name);
 
@@ -4460,6 +4460,25 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
   else
     job->cancel_time = 0;
 
+ /*
+  * Check for support files...
+  */
+
+  cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
+                                      "cups-insecure-filter-warning");
+
+  if (printer->pc)
+  {
+    for (filename = (const char *)cupsArrayFirst(printer->pc->support_files);
+         filename;
+         filename = (const char *)cupsArrayNext(printer->pc->support_files))
+    {
+      if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_FILE, !RunUser,
+                        cupsdLogFCMessage, printer))
+        break;
+    }
+  }
+
  /*
   * Setup the last exit status and security profiles...
   */