[cups.development] How to get printer status via CUPS API?

Michael Sweet mike at easysw.com
Wed Jun 18 06:50:53 PDT 2008


Toni Heimala wrote:
> Michael R Sweet wrote:
>> You can either call cupsGetDests and cupsGetDest to get the current
>> printer-state and printer-state-reasons attributes (they are provided
>> as options in the cups_dest_t structure),
> 
> Thanks for the quick response!
> 
> It seems that the "printer-state" field from the options has only value 
> of 3 or 4 when the printer is out of paper or in a ready state and the 
> "printer-state-reasons" value is always "none".
> 
>> or send an
>> IPP_GET_PRINTER_ATTRIBUTES request to get the attributes directly:
>>
>>
>>     const char *name; /* printer name */
>>     http_t *http = httpConnectEncrypt(cupsServer(), ippPort(), 
>> cupsEncryption());
>>     ipp_t *request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
>>     char printer_uri[1024];
>>     ipp_t *response;
>>     ipp_attribute_t *printer_state_message;
>>     ipp_attribute_t *printer_state_reasons;
>>
>>
>>     httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, 
>> sizeof(printer_uri),
>>                      "ipp", NULL, cupsServer(), ippPort(),
>>                      "/printers/%s", name);
>>
>>     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
>>                  "printer-uri", NULL, printer_uri);
>>
>>     response = cupsDoRequest(http, request, "/");
>>
>>     printer_state_message = ippFindAttribute(response, 
>> "printer-state-message",
>>                                              IPP_TAG_TEXT);
>>     printer_state_reasons = ippFindAttribute(response, 
>> "printer-state-reasons",
>>                                              IPP_TAG_KEYWORD);
>>
>>     /* do something wih message and reasons */
>>
>>     ippDelete(response);
>>     httpClose(http);
>>
> 
> Using this approach the "printer_state_message" and 
> "printer_state_reasons" pointers point to the NULL pointer and I 
> couldn't find a reason why that is.
> 
> BTW. httpConnectEncrypt() calls httpInitialize() which calls 
> gnutls_global_init() but httpClose() or any other function do not call 
> gnutls_global_deinit() which would free the acquired resources. This is 
> true for atleast CUPS 1.3.7. See: 
> http://linux.die.net/man/3/gnutls_global_init

This is OK - we only want/need to initialize once, and then the
resources are freed automatically when the process exits.

-- 
______________________________________________________________________
Michael Sweet, Easy Software Products           mike at easysw dot com




More information about the cups mailing list