/*
- * "$Id: job.c 7000 2007-09-28 19:47:00Z mike $"
+ * "$Id: job.c 7005 2007-10-01 23:45:48Z mike $"
*
* Job management routines for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007 by Apple Inc.
+ * Copyright 2007-2008 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
cupsd_job_t *job; /* New job record */
- job = calloc(sizeof(cupsd_job_t), 1);
+ if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL)
+ return (NULL);
job->id = NextJobId ++;
job->priority = priority;
job->current_file = 0;
- if (!JobHistory || !JobFiles || purge || (job->dtype & CUPS_PRINTER_REMOTE))
+ if (!JobHistory || !JobFiles || purge)
{
for (i = 1; i <= job->num_files; i ++)
{
}
}
- if (JobHistory && !purge && !(job->dtype & CUPS_PRINTER_REMOTE))
+ if (JobHistory && !purge)
{
/*
* Save job state info...
for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
job;
job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ {
+ if (!job->dest || !job->username)
+ cupsdLoadJob(job);
+
+ if (!job->dest || !job->username)
+ continue;
+
if ((dest == NULL || !strcmp(job->dest, dest)) &&
(username == NULL || !strcmp(job->username, username)))
{
cupsdCancelJob(job, purge, IPP_JOB_CANCELED);
}
+ }
cupsdCheckJobs();
}
job->hold_until < time(NULL))
{
if (job->pending_timeout)
- cupsdTimeoutJob(job); /* Add trailing banner as needed */
+ {
+ /* Add trailing banner as needed */
+ if (cupsdTimeoutJob(job))
+ continue;
+ }
job->state->values[0].integer = IPP_JOB_PENDING;
job->state_value = IPP_JOB_PENDING;
job->state->values[0].integer = IPP_JOB_HELD;
job->state_value = IPP_JOB_HELD;
+ job->current_file = 0;
cupsdSaveJob(job);
job->backend = 0;
}
+ cupsdDestroyProfile(job->profile);
+ job->profile = NULL;
+
cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing print pipes [ %d %d ]...",
job->id, job->print_pipes[0], job->print_pipes[1]);
cupsdClearString(&job->auth_username);
cupsdClearString(&job->auth_domain);
cupsdClearString(&job->auth_password);
+
#ifdef HAVE_GSSAPI
/*
* Destroy the credential cache and clear the KRB5CCNAME env var string.
title[IPP_MAX_NAME],
/* Job title string */
copies[255], /* # copies string */
- *envp[MAX_ENV + 15],
+ *envp[MAX_ENV + 16],
/* Environment variables */
charset[255], /* CHARSET env variable */
class_name[255],/* CLASS env variable */
final_content_type[1024],
/* FINAL_CONTENT_TYPE env variable */
lang[255], /* LANG env variable */
+#ifdef __APPLE__
+ apple_language[255],
+ /* APPLE_LANGUAGE env variable */
+#endif /* __APPLE__ */
ppd[1024], /* PPD env variable */
printer_name[255],
/* PRINTER env variable */
else
argv = calloc(8, sizeof(char *));
+ if (!argv)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate argument array!");
+ cupsArrayDelete(filters);
+
+ FilterLevel -= job->cost;
+
+ cupsdStopPrinter(printer, 0);
+ return;
+ }
+
sprintf(jobid, "%d", job->id);
argv[0] = printer->name;
attr = ippFindAttribute(job->attrs, "attributes-natural-language",
IPP_TAG_LANGUAGE);
+#ifdef __APPLE__
+ strcpy(apple_language, "APPLE_LANGUAGE=");
+ _cupsAppleLanguage(attr->values[0].string.text,
+ apple_language + 15, sizeof(apple_language) - 15);
+#endif /* __APPLE__ */
+
switch (strlen(attr->values[0].string.text))
{
default :
envp[envc ++] = charset;
envp[envc ++] = lang;
+#ifdef __APPLE__
+ envp[envc ++] = apple_language;
+#endif /* __APPLE__ */
envp[envc ++] = ppd;
envp[envc ++] = rip_max_cache;
envp[envc ++] = content_type;
envp[envc] = NULL;
for (i = 0; i < envc; i ++)
- if (!strncmp(envp[i], "AUTH_", 5))
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"AUTH_%c****\"",
+ if (!strncmp(envp[i], "CUPSD_AUTH_", 5))
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"CUPSD_AUTH_%c****\"",
job->id, i, envp[i][5]);
else if (strncmp(envp[i], "DEVICE_URI=", 11))
cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"%s\"",
job->status = 0;
memset(job->filters, 0, sizeof(job->filters));
+ if (!job->profile)
+ job->profile = cupsdCreateProfile(job->id);
+
for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
filter;
i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[0], job->side_pipes[0], 0,
- job->filters + i);
+ job->profile, job->filters + i);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"[Job %d] start_job: Closing filter pipes for slot %d "
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[1], job->side_pipes[1],
- backroot, &(job->backend));
+ backroot, job->profile, &(job->backend));
if (pid == 0)
{
* job sheet count...
*/
- if (job->sheets != NULL)
+ if (job->sheets)
{
if (!strncasecmp(message, "total ", 6))
{
cupsdLogPage(job, message);
- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
- "Printed %d page(s).", job->sheets->values[0].integer);
+ if (job->sheets)
+ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
+ "Printed %d page(s).", job->sheets->values[0].integer);
}
else if (loglevel == CUPSD_LOG_STATE)
{
/*
- * End of "$Id: job.c 7000 2007-09-28 19:47:00Z mike $".
+ * End of "$Id: job.c 7005 2007-10-01 23:45:48Z mike $".
*/