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