#include "cups-private.h"
char *
cupsNotifySubject(cups_lang_t *lang,
ipp_t *event)
{
char buffer[1024];
const char *prefix,
*state;
ipp_attribute_t *job_id,
*job_name,
*job_state,
*printer_name,
*printer_state,
*printer_uri,
*subscribed;
if (!event || !lang)
return (NULL);
job_id = ippFindAttribute(event, "notify-job-id", IPP_TAG_INTEGER);
job_name = ippFindAttribute(event, "job-name", IPP_TAG_NAME);
job_state = ippFindAttribute(event, "job-state", IPP_TAG_ENUM);
printer_name = ippFindAttribute(event, "printer-name", IPP_TAG_NAME);
printer_state = ippFindAttribute(event, "printer-state", IPP_TAG_ENUM);
printer_uri = ippFindAttribute(event, "notify-printer-uri", IPP_TAG_URI);
subscribed = ippFindAttribute(event, "notify-subscribed-event",
IPP_TAG_KEYWORD);
if (job_id && printer_name && printer_uri && job_state)
{
prefix = _cupsLangString(lang, _("Print Job:"));
switch (job_state->values[0].integer)
{
case IPP_JSTATE_PENDING :
state = _cupsLangString(lang, _("pending"));
break;
case IPP_JSTATE_HELD :
state = _cupsLangString(lang, _("held"));
break;
case IPP_JSTATE_PROCESSING :
state = _cupsLangString(lang, _("processing"));
break;
case IPP_JSTATE_STOPPED :
state = _cupsLangString(lang, _("stopped"));
break;
case IPP_JSTATE_CANCELED :
state = _cupsLangString(lang, _("canceled"));
break;
case IPP_JSTATE_ABORTED :
state = _cupsLangString(lang, _("aborted"));
break;
case IPP_JSTATE_COMPLETED :
state = _cupsLangString(lang, _("completed"));
break;
default :
state = _cupsLangString(lang, _("unknown"));
break;
}
snprintf(buffer, sizeof(buffer), "%s %s-%d (%s) %s",
prefix,
printer_name->values[0].string.text,
job_id->values[0].integer,
job_name ? job_name->values[0].string.text :
_cupsLangString(lang, _("untitled")),
state);
}
else if (printer_uri && printer_name && printer_state)
{
prefix = _cupsLangString(lang, _("Printer:"));
switch (printer_state->values[0].integer)
{
case IPP_PSTATE_IDLE :
state = _cupsLangString(lang, _("idle"));
break;
case IPP_PSTATE_PROCESSING :
state = _cupsLangString(lang, _("processing"));
break;
case IPP_PSTATE_STOPPED :
state = _cupsLangString(lang, _("stopped"));
break;
default :
state = _cupsLangString(lang, _("unknown"));
break;
}
snprintf(buffer, sizeof(buffer), "%s %s %s",
prefix,
printer_name->values[0].string.text,
state);
}
else if (subscribed)
strlcpy(buffer, subscribed->values[0].string.text, sizeof(buffer));
else
return (NULL);
return (strdup(buffer));
}
char *
cupsNotifyText(cups_lang_t *lang,
ipp_t *event)
{
ipp_attribute_t *notify_text;
if (!event || !lang)
return (NULL);
if ((notify_text = ippFindAttribute(event, "notify-text",
IPP_TAG_TEXT)) == NULL)
return (NULL);
return (strdup(notify_text->values[0].string.text));
}