[cups.development] Feature resquest extend lpstat job info

Michael Sweet msweet at apple.com
Fri Feb 3 15:59:17 PST 2012


The ipptool command is provided for this sort of thing...

On Feb 1, 2012, at 10:56 AM, EmanuelSan at gmail.com wrote:

> I need more information about jobs from the command "lpstat". I implemented a patch to address this request.
> 
> The output has its fields separated by tabs, to facilitate use by scripts. I implemented an option "-I" that uses the variable long_status to provide the new output.
> 
> The output contains information on copies (attr "copies"), priority ("job-priority"), status ("job-state") and page count ("page-count-informed," I need some help will implement this attribute).
> 
> Example of use:
> 
> Ex.:  ./lpstat -I Printer01
> Date                    Pri     Cop     Size    #Pages  User    State           Job             Title
> 2012-01-26 22:55:19     30      5       620     0       ems     held            Printer01-84    Services 1
> 2012-01-26 22:56:03     30      5       627     0       henry   held            Printer01-85    Services 2
> 2012-01-26 22:56:45     33      9       633     0       henry   held            Printer01-86    Services 3
> 2012-01-26 22:57:35     60      9       645     0       henry   pending         Printer01-87    Services 4
> 2012-01-26 23:06:15     56      11      1       0       ems     held            Printer01-88    resolv
> 2012-01-27 00:32:04     55      2       1       0       carli   held            Printer01-94    (stdin)
> 2012-01-27 11:24:17     50      1       128     0       ems     held            Printer01-95    smbprn.00000015 Test Page
> 2012-01-31 19:35:10     50      3       1       0       henry   held            Printer01-99    resolv
> 2012-01-31 20:17:20     50      10      2       0       henry   completed       Printer01-100   resolv 2
> 2012-01-31 20:17:59     50      10      3       0       henry   held            Printer01-101   resolv 3
> 2012-01-31 20:19:41     50      2       25      0       henry   completed       Printer01-102   test.ps
> 
> 
> I have patches for CUPS 1.4.2 (in use by RedHat Enterprise 6.2), 1.4.8, 1.5.0 and 1.6svn-r10201 (see below).
> 
> --- lpstat.c-ORIG       2011-10-07 18:05:19.000000000 -0300
> +++ lpstat.c    2012-02-01 15:11:49.312872177 -0300
> @@ -313,6 +313,8 @@ main(int  argc,                             /* I - Number of comm
>              long_status = 2;
>            break;
> 
> +        case 'I' : /* Show many jobs info by destination with tab separated fields */
> +           long_status = 5;
>         case 'o' : /* Show jobs by destination */
>            op = 'o';
> 
> @@ -1257,6 +1259,45 @@ show_devices(const char  *printers,      /* I
> 
> 
> /*
> + * 'job_state_string()' - return string with job state
> + */
> +
> +static char *                                  /* O - static string with job state */
> +job_state_string(const ipp_jstate_t jobstate)  /* I - job state enum */
> +{
> +    char *state;
> +
> +    switch (jobstate)
> +    {
> +      case IPP_JOB_PENDING :
> +          state = _("pending");
> +          break;
> +      case IPP_JOB_HELD :
> +          state = _("held");
> +          break;
> +      case IPP_JOB_PROCESSING :
> +          state = _("processing");
> +          break;
> +      case IPP_JOB_STOPPED :
> +          state = _("stopped");
> +          break;
> +      case IPP_JOB_CANCELED :
> +          state = _("canceled");
> +          break;
> +      case IPP_JOB_ABORTED :
> +          state = _("aborted");
> +          break;
> +      case IPP_JOB_COMPLETED :
> +          state = _("completed");
> +          break;
> +      default :
> +          state = _("unknown");
> +          break;
> +    }
> +    return state;
> +}
> +
> +/*
>  * 'show_jobs()' - Show active print jobs.
>  */
> 
> @@ -1275,10 +1316,16 @@ show_jobs(const char *dests,            /* I - Des
>   const char   *dest,                  /* Pointer into job-printer-uri */
>                *username,              /* Pointer to job-originating-user-name */
>                *title,                 /* Pointer to job-name */
> +                *state_string,          /* Pointer to job-state */
>                *message;               /* Pointer to job-printer-state-message */
>   int          rank,                   /* Rank in queue */
>                jobid,                  /* job-id */
> +                jobpriority,            /* job-priority */
> +                jobcopies,              /* copies */
> +                pagecountinf,           /* page count informed */
>                size;                   /* job-k-octets */
> +  ipp_jstate_t  jobstate;               /* job-state */
> +
>   time_t       jobtime;                /* time-at-creation */
>   struct tm    *jobdate;               /* Date & time */
>   char         temp[255],              /* Temporary buffer */
> @@ -1292,6 +1339,10 @@ show_jobs(const char *dests,             /* I - Des
>                  "job-printer-state-message",
>                  "job-printer-uri",
>                  "job-state-reasons",
> +                 "job-state",
> +                 "job-priority",
> +                 "copies",
> +                 "page-count-informed",
>                  "time-at-creation"
>                };
> 
> @@ -1347,6 +1398,9 @@ show_jobs(const char *dests,              /* I - Des
>       return (1);
>     }
> 
> +    if (long_status == 5)
> +      _cupsLangPrintf(stdout, "Date              \tPri\tCop\tSize\t#Pages\tUser\tState     \tJob       \tTitle\n");
> +
>     rank = -1;
> 
>     for (attr = response->attrs; attr != NULL; attr = attr->next)
> @@ -1373,6 +1427,11 @@ show_jobs(const char *dests,             /* I - Des
>       title    = "no title";
>       message  = NULL;
>       reasons  = NULL;
> +      state_string = "";
> +      jobstate = IPP_JOB_PENDING;
> +      jobpriority = 0;
> +      jobcopies   = 1;
> +      pagecountinf = 0;
> 
>       while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
>       {
> @@ -1404,9 +1463,27 @@ show_jobs(const char *dests,             /* I - Des
>                 attr->value_tag == IPP_TAG_KEYWORD)
>          reasons = attr;
> 
> +        if (!strcmp(attr->name, "job-state") &&
> +           attr->value_tag == IPP_TAG_ENUM)
> +         jobstate = attr->values[0].integer;
> +
> +        if (!strcmp(attr->name, "job-priority") &&
> +           attr->value_tag == IPP_TAG_INTEGER)
> +         jobpriority = attr->values[0].integer;
> +
> +        if (!strcmp(attr->name, "copies") &&
> +           attr->value_tag == IPP_TAG_INTEGER)
> +         jobcopies = attr->values[0].integer;
> +
> +        if (!strcmp(attr->name, "page-count-informed") &&
> +           attr->value_tag == IPP_TAG_INTEGER)
> +         pagecountinf = attr->values[0].integer;
> +
>         attr = attr->next;
>       }
> 
> +      state_string = job_state_string (jobstate);
> +
>      /*
>       * See if we have everything needed...
>       */
> @@ -1443,6 +1520,20 @@ show_jobs(const char *dests,             /* I - Des
>                          temp, username ? username : "unknown",
>                          size, title ? title : "unknown", date);
>        }
> +       else if (long_status == 5)
> +       {
> +        /*
> +         * Show the output format for EMS long version
> +         */
> +
> +         if (!strftime(date, sizeof(date), "%F %T", jobdate))
> +           strcpy(date, "Unknown");
> +
> +          _cupsLangPrintf(stdout, "%s\t%d\t%d\t%d\t%d\t%s\t%-10s\t%s\t%s\n",
> +                          date, jobpriority, jobcopies, size,
> +                          pagecountinf, username ? username : "unknown",
> +                          state_string, temp, title);
> +       }
>        else
>        {
>          if (!strftime(date, sizeof(date), "%c", jobdate))
> @@ -1456,7 +1547,8 @@ show_jobs(const char *dests,              /* I - Des
>            _cupsLangPrintf(stdout, "%-23s %-13s %8.0f   %s",
>                            temp, username ? username : "unknown",
>                            1024.0 * size, date);
> -          if (long_status)
> +
> +          if (long_status && long_status != 5)
>           {
>            if (message)
>              _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
> 
> 
> _______________________________________________
> cups-dev mailing list
> cups-dev at easysw.com
> http://lists.easysw.com/mailman/listinfo/cups-dev

_________________________________________________________
Michael Sweet, Senior Printing System Engineer, PWG Chair





More information about the cups-devel mailing list