+ if ((job->reasons = ippFindAttribute(job->attrs, "job-state-reasons",
+ IPP_TAG_KEYWORD)) == NULL)
+ {
+ const char *reason; /* job-state-reason keyword */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[Job %d] Adding missing job-state-reasons attribute to "
+ " control file.", job->id);
+
+ switch (job->state_value)
+ {
+ default :
+ case IPP_JOB_PENDING :
+ if (destptr->state == IPP_PRINTER_STOPPED)
+ reason = "printer-stopped";
+ else
+ reason = "none";
+ break;
+
+ case IPP_JOB_HELD :
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_ZERO)) != NULL &&
+ (attr->value_tag == IPP_TAG_NAME ||
+ attr->value_tag == IPP_TAG_NAMELANG ||
+ attr->value_tag == IPP_TAG_KEYWORD) &&
+ strcmp(attr->values[0].string.text, "no-hold"))
+ reason = "job-hold-until-specified";
+ else
+ reason = "job-incoming";
+ break;
+
+ case IPP_JOB_PROCESSING :
+ reason = "job-printing";
+ break;
+
+ case IPP_JOB_STOPPED :
+ reason = "job-stopped";
+ break;
+
+ case IPP_JOB_CANCELED :
+ reason = "job-canceled-by-user";
+ break;
+
+ case IPP_JOB_ABORTED :
+ reason = "aborted-by-system";
+ break;
+
+ case IPP_JOB_COMPLETED :
+ reason = "job-completed-successfully";
+ break;
+ }
+
+ job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
+ "job-state-reasons", NULL, reason);
+ }
+ else if (job->state_value == IPP_JOB_PENDING)
+ {
+ if (destptr->state == IPP_PRINTER_STOPPED)
+ ippSetString(job->attrs, &job->reasons, 0, "printer-stopped");
+ else
+ ippSetString(job->attrs, &job->reasons, 0, "none");
+ }
+