xref: /aosp_15_r20/external/libcups/cups/notify.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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