Find the status of printer with the api

Michael Sweet mike at easysw.com
Thu Aug 10 07:51:58 PDT 2006


picavet wrote:
> I search to find the method to recuperate the status of printer with the CUPS API.
> I try to use cupsGetDests but i don't find the "printer-state".
> 
> How I can do to recuperate this status

What version of CUPS are you using?

For CUPS 1.2 and higher, you can use the cupsGetDests() function and
then look for the printer-state attribute in the options array:

     int num_dests;
     cups_dest_t *dests, *dest;
     const char *value;
     ipp_pstate_t printer_state;


     num_dests = cupsGetDests(&dests);
     dest = cupsGetDest("myprinter", NULL, num_dests, dests);
     value = cupsGetOption("printer-state", dest->num_options, 
dest->options);
     if (value)
       printer_state = (ipp_pstate_t)atoi(value);
     else
       printer_state = IPP_PRINTER_IDLE;

For all versions of CUPS, you can also send an IPP request to the
scheduler (IPP_GET_PRINTER_ATTRIBUTES); the following code is for
CUPS 1.2, but will work with some modification for 1.1 (see the
1.1 programmer's manual or the CUPS book for a template):

     ipp_pstate_t
     get_printer_state(const char *printer_name)
     {
     http_t *http;
     ipp_t *request, *response;
     ipp_attribute_t *attr;
     ipp_pstate_t printer_state;
     char uri[1024];


     http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
     request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);

     httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp",
                      NULL, cupsServer(), ippPort(), "/printers/%s",
                      printer_name);
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                  "printer-uri", NULL, uri);
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
                  "requested-attributes", NULL, "printer-state");

     response = cupsDoRequest(http, request, "/");
     if ((attr = ippFindAttribute(response, "printer-state", 
IPP_TAG_ENUM)) != NULL)
       printer_state = (ipp_pstate_t)attr->values[0].integer;
     else
       printer_state = IPP_PRINTER_IDLE;

     ippDelete(response);

     return (printer_state);
     }

-- 
______________________________________________________________________
Michael Sweet, Easy Software Products           mike at easysw dot com
Internet Printing and Document Software          http://www.easysw.com




More information about the cups mailing list