1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Notification routines for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2013 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 2005-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
15*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker * 'cupsNotifySubject()' - Return the subject for the given notification message.
20*5e7646d2SAndroid Build Coastguard Worker *
21*5e7646d2SAndroid Build Coastguard Worker * The returned string must be freed by the caller using @code free@.
22*5e7646d2SAndroid Build Coastguard Worker *
23*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
24*5e7646d2SAndroid Build Coastguard Worker */
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker char * /* O - Subject string or @code NULL@ */
cupsNotifySubject(cups_lang_t * lang,ipp_t * event)27*5e7646d2SAndroid Build Coastguard Worker cupsNotifySubject(cups_lang_t *lang, /* I - Language data */
28*5e7646d2SAndroid Build Coastguard Worker ipp_t *event) /* I - Event data */
29*5e7646d2SAndroid Build Coastguard Worker {
30*5e7646d2SAndroid Build Coastguard Worker char buffer[1024]; /* Subject buffer */
31*5e7646d2SAndroid Build Coastguard Worker const char *prefix, /* Prefix on subject */
32*5e7646d2SAndroid Build Coastguard Worker *state; /* Printer/job state string */
33*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *job_id, /* notify-job-id */
34*5e7646d2SAndroid Build Coastguard Worker *job_name, /* job-name */
35*5e7646d2SAndroid Build Coastguard Worker *job_state, /* job-state */
36*5e7646d2SAndroid Build Coastguard Worker *printer_name, /* printer-name */
37*5e7646d2SAndroid Build Coastguard Worker *printer_state, /* printer-state */
38*5e7646d2SAndroid Build Coastguard Worker *printer_uri, /* notify-printer-uri */
39*5e7646d2SAndroid Build Coastguard Worker *subscribed; /* notify-subscribed-event */
40*5e7646d2SAndroid Build Coastguard Worker
41*5e7646d2SAndroid Build Coastguard Worker
42*5e7646d2SAndroid Build Coastguard Worker /*
43*5e7646d2SAndroid Build Coastguard Worker * Range check input...
44*5e7646d2SAndroid Build Coastguard Worker */
45*5e7646d2SAndroid Build Coastguard Worker
46*5e7646d2SAndroid Build Coastguard Worker if (!event || !lang)
47*5e7646d2SAndroid Build Coastguard Worker return (NULL);
48*5e7646d2SAndroid Build Coastguard Worker
49*5e7646d2SAndroid Build Coastguard Worker /*
50*5e7646d2SAndroid Build Coastguard Worker * Get the required attributes...
51*5e7646d2SAndroid Build Coastguard Worker */
52*5e7646d2SAndroid Build Coastguard Worker
53*5e7646d2SAndroid Build Coastguard Worker job_id = ippFindAttribute(event, "notify-job-id", IPP_TAG_INTEGER);
54*5e7646d2SAndroid Build Coastguard Worker job_name = ippFindAttribute(event, "job-name", IPP_TAG_NAME);
55*5e7646d2SAndroid Build Coastguard Worker job_state = ippFindAttribute(event, "job-state", IPP_TAG_ENUM);
56*5e7646d2SAndroid Build Coastguard Worker printer_name = ippFindAttribute(event, "printer-name", IPP_TAG_NAME);
57*5e7646d2SAndroid Build Coastguard Worker printer_state = ippFindAttribute(event, "printer-state", IPP_TAG_ENUM);
58*5e7646d2SAndroid Build Coastguard Worker printer_uri = ippFindAttribute(event, "notify-printer-uri", IPP_TAG_URI);
59*5e7646d2SAndroid Build Coastguard Worker subscribed = ippFindAttribute(event, "notify-subscribed-event",
60*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_KEYWORD);
61*5e7646d2SAndroid Build Coastguard Worker
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker if (job_id && printer_name && printer_uri && job_state)
64*5e7646d2SAndroid Build Coastguard Worker {
65*5e7646d2SAndroid Build Coastguard Worker /*
66*5e7646d2SAndroid Build Coastguard Worker * Job event...
67*5e7646d2SAndroid Build Coastguard Worker */
68*5e7646d2SAndroid Build Coastguard Worker
69*5e7646d2SAndroid Build Coastguard Worker prefix = _cupsLangString(lang, _("Print Job:"));
70*5e7646d2SAndroid Build Coastguard Worker
71*5e7646d2SAndroid Build Coastguard Worker switch (job_state->values[0].integer)
72*5e7646d2SAndroid Build Coastguard Worker {
73*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_PENDING :
74*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("pending"));
75*5e7646d2SAndroid Build Coastguard Worker break;
76*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_HELD :
77*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("held"));
78*5e7646d2SAndroid Build Coastguard Worker break;
79*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_PROCESSING :
80*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("processing"));
81*5e7646d2SAndroid Build Coastguard Worker break;
82*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_STOPPED :
83*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("stopped"));
84*5e7646d2SAndroid Build Coastguard Worker break;
85*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_CANCELED :
86*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("canceled"));
87*5e7646d2SAndroid Build Coastguard Worker break;
88*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_ABORTED :
89*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("aborted"));
90*5e7646d2SAndroid Build Coastguard Worker break;
91*5e7646d2SAndroid Build Coastguard Worker case IPP_JSTATE_COMPLETED :
92*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("completed"));
93*5e7646d2SAndroid Build Coastguard Worker break;
94*5e7646d2SAndroid Build Coastguard Worker default :
95*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("unknown"));
96*5e7646d2SAndroid Build Coastguard Worker break;
97*5e7646d2SAndroid Build Coastguard Worker }
98*5e7646d2SAndroid Build Coastguard Worker
99*5e7646d2SAndroid Build Coastguard Worker snprintf(buffer, sizeof(buffer), "%s %s-%d (%s) %s",
100*5e7646d2SAndroid Build Coastguard Worker prefix,
101*5e7646d2SAndroid Build Coastguard Worker printer_name->values[0].string.text,
102*5e7646d2SAndroid Build Coastguard Worker job_id->values[0].integer,
103*5e7646d2SAndroid Build Coastguard Worker job_name ? job_name->values[0].string.text :
104*5e7646d2SAndroid Build Coastguard Worker _cupsLangString(lang, _("untitled")),
105*5e7646d2SAndroid Build Coastguard Worker state);
106*5e7646d2SAndroid Build Coastguard Worker }
107*5e7646d2SAndroid Build Coastguard Worker else if (printer_uri && printer_name && printer_state)
108*5e7646d2SAndroid Build Coastguard Worker {
109*5e7646d2SAndroid Build Coastguard Worker /*
110*5e7646d2SAndroid Build Coastguard Worker * Printer event...
111*5e7646d2SAndroid Build Coastguard Worker */
112*5e7646d2SAndroid Build Coastguard Worker
113*5e7646d2SAndroid Build Coastguard Worker prefix = _cupsLangString(lang, _("Printer:"));
114*5e7646d2SAndroid Build Coastguard Worker
115*5e7646d2SAndroid Build Coastguard Worker switch (printer_state->values[0].integer)
116*5e7646d2SAndroid Build Coastguard Worker {
117*5e7646d2SAndroid Build Coastguard Worker case IPP_PSTATE_IDLE :
118*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("idle"));
119*5e7646d2SAndroid Build Coastguard Worker break;
120*5e7646d2SAndroid Build Coastguard Worker case IPP_PSTATE_PROCESSING :
121*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("processing"));
122*5e7646d2SAndroid Build Coastguard Worker break;
123*5e7646d2SAndroid Build Coastguard Worker case IPP_PSTATE_STOPPED :
124*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("stopped"));
125*5e7646d2SAndroid Build Coastguard Worker break;
126*5e7646d2SAndroid Build Coastguard Worker default :
127*5e7646d2SAndroid Build Coastguard Worker state = _cupsLangString(lang, _("unknown"));
128*5e7646d2SAndroid Build Coastguard Worker break;
129*5e7646d2SAndroid Build Coastguard Worker }
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker snprintf(buffer, sizeof(buffer), "%s %s %s",
132*5e7646d2SAndroid Build Coastguard Worker prefix,
133*5e7646d2SAndroid Build Coastguard Worker printer_name->values[0].string.text,
134*5e7646d2SAndroid Build Coastguard Worker state);
135*5e7646d2SAndroid Build Coastguard Worker }
136*5e7646d2SAndroid Build Coastguard Worker else if (subscribed)
137*5e7646d2SAndroid Build Coastguard Worker strlcpy(buffer, subscribed->values[0].string.text, sizeof(buffer));
138*5e7646d2SAndroid Build Coastguard Worker else
139*5e7646d2SAndroid Build Coastguard Worker return (NULL);
140*5e7646d2SAndroid Build Coastguard Worker
141*5e7646d2SAndroid Build Coastguard Worker /*
142*5e7646d2SAndroid Build Coastguard Worker * Duplicate and return the subject string...
143*5e7646d2SAndroid Build Coastguard Worker */
144*5e7646d2SAndroid Build Coastguard Worker
145*5e7646d2SAndroid Build Coastguard Worker return (strdup(buffer));
146*5e7646d2SAndroid Build Coastguard Worker }
147*5e7646d2SAndroid Build Coastguard Worker
148*5e7646d2SAndroid Build Coastguard Worker
149*5e7646d2SAndroid Build Coastguard Worker /*
150*5e7646d2SAndroid Build Coastguard Worker * 'cupsNotifyText()' - Return the text for the given notification message.
151*5e7646d2SAndroid Build Coastguard Worker *
152*5e7646d2SAndroid Build Coastguard Worker * The returned string must be freed by the caller using @code free@.
153*5e7646d2SAndroid Build Coastguard Worker *
154*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.2/macOS 10.5@
155*5e7646d2SAndroid Build Coastguard Worker */
156*5e7646d2SAndroid Build Coastguard Worker
157*5e7646d2SAndroid Build Coastguard Worker char * /* O - Message text or @code NULL@ */
cupsNotifyText(cups_lang_t * lang,ipp_t * event)158*5e7646d2SAndroid Build Coastguard Worker cupsNotifyText(cups_lang_t *lang, /* I - Language data */
159*5e7646d2SAndroid Build Coastguard Worker ipp_t *event) /* I - Event data */
160*5e7646d2SAndroid Build Coastguard Worker {
161*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *notify_text; /* notify-text */
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker
164*5e7646d2SAndroid Build Coastguard Worker /*
165*5e7646d2SAndroid Build Coastguard Worker * Range check input...
166*5e7646d2SAndroid Build Coastguard Worker */
167*5e7646d2SAndroid Build Coastguard Worker
168*5e7646d2SAndroid Build Coastguard Worker if (!event || !lang)
169*5e7646d2SAndroid Build Coastguard Worker return (NULL);
170*5e7646d2SAndroid Build Coastguard Worker
171*5e7646d2SAndroid Build Coastguard Worker /*
172*5e7646d2SAndroid Build Coastguard Worker * Get the notify-text attribute from the server...
173*5e7646d2SAndroid Build Coastguard Worker */
174*5e7646d2SAndroid Build Coastguard Worker
175*5e7646d2SAndroid Build Coastguard Worker if ((notify_text = ippFindAttribute(event, "notify-text",
176*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_TEXT)) == NULL)
177*5e7646d2SAndroid Build Coastguard Worker return (NULL);
178*5e7646d2SAndroid Build Coastguard Worker
179*5e7646d2SAndroid Build Coastguard Worker /*
180*5e7646d2SAndroid Build Coastguard Worker * Return a copy...
181*5e7646d2SAndroid Build Coastguard Worker */
182*5e7646d2SAndroid Build Coastguard Worker
183*5e7646d2SAndroid Build Coastguard Worker return (strdup(notify_text->values[0].string.text));
184*5e7646d2SAndroid Build Coastguard Worker }
185