From cbe97d81dcb9afee4d02f487958c92c6f19c6ae8 Mon Sep 17 00:00:00 2001 From: mike Date: Tue, 11 Dec 2012 16:41:45 +0000 Subject: [PATCH] Check all support files at the start of a job. git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@10746 7a7537e8-13f0-0310-91df-b6672ffda945 --- cups/ppd-cache.c | 36 ++++++++++++++++++++++++++++++++++++ cups/ppd-private.h | 3 ++- scheduler/job.c | 25 ++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c index 11087a96bb..9fe3d6c7de 100644 --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c @@ -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... */ diff --git a/cups/ppd-private.h b/cups/ppd-private.h index 03b014783d..23514b440c 100644 --- a/cups/ppd-private.h +++ b/cups/ppd-private.h @@ -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. */ }; diff --git a/scheduler/job.c b/scheduler/job.c index 3d42bdac9b..41d7685f09 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -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... */ -- 2.47.2