Setting printer status from STOPPED to IDLE

Michael Sweet mike at easysw.com
Tue Dec 19 05:47:13 PST 2006


Bawenang wrote:
>> Bawenang wrote:
>>> Hi, I've read in the development forum:
>>>
>>> QUOTE from
>>> http://www.cups.org/newsgroups.php?s933+gcups.development+v941+T1:
>>> "The standard CUPS backends only use this exit code for absolutely
>>> fatal conditions such as bad URIs and other errors that require the
>>> administrator/user to manually fix the problem."
>>>
>>> So if my application runs into this error and the admin has fixed the
>>> problem manually, how do I set the status to IDLE again from STOPPED
>>> in my application? My plan is I'll just make a button that can be
>>> clicked by the admin to clear the jobs queue and set the status to
>>> IDLE. I know that to clear the queue I'll just call cupsCancelJob().
>>> But how to set the printer status? I believe there's a function
>>> called SetPrinterState() in printers.h. Do I have to call that
>>> function? If I do, what are the parameters? I can't find the
>>> explanation anywhere.
>> You need to use the CUPS-Add-Modify-Printer IPP operation, passing
>> the printer-uri and printer-state values in addition to the
>> attributes-natural-language and attributes-charset values.
>>
>> The CUPS web interface includes help on the CUPS API:
>>
>>      http://localhost:631/help
>>
>> The following code snippet (not tested) will start the named printer:
>>
>>      #include <cups/cups.h>
>>
>>      void
>>      start_printer(const char *name)
>>      {
>>        http_t *http = httpConnectEncrypt(cupsServer(), ippPort(),
>>                                          cupsEncryption());
>>        ipp_t *request;
>>        char uri[1024];
>>
>>
>>        httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp",
>>                         NULL, "localhost", ippPort(), "/printers/%s",
>>                         name);
>>
>>        request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
>>        ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
>>                     "printer-uri", NULL, uri);
>>        ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM,
>>                      "printer-state", IPP_PRINTER_IDLE);
>>
>>        ippDelete(cupsDoRequest(http, "/admin/", request));
>>        httpClose(http);
>>
>>        if (cupsLastError() != IPP_OK)
>>        {
>>          // Display error
>>          puts(cupsLastErrorString());
>>        }
>>      }
>>
>> If you are developing a GUI application, make sure you register a
>> password callback function that will ask for a username and
>> password (the standard callback asks on the current console/terminal
>> window...)
>>
>> --
>> ______________________________________________________________________
>> Michael Sweet, Easy Software Products           mike at easysw dot com
>> Internet Printing and Publishing Software        http://www.easysw.com
> 
> 
> Thanks a lot. BTW, after I read Kurt Pfeifle's reply about using cupsenable printer_name, I wanted to ask about something. What's the difference of using the snippet and just simply call: system("cupsenable printer_name"); ? I've tried the cupsenable and it worked so maybe if it wasn't any different I'll try the more direct system call.

Basically, if you using the command then the user may need to enter
a password on the command-line (if there is a console associated with
the application, that is).

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




More information about the cups mailing list