[cups.general] Getting capability info from IPP printers
Michael Sweet
msweet at apple.com
Tue Feb 19 09:35:44 PST 2013
Till,
First, you can trim requested-attributes to just:
job-template
printer-description
media-col-database
since all of the -default and -supported values are covered by the job-template group.
Second, you need to use IPP_TAG_KEYWORD when you add the requested-attributes strings, not IPP_TAG_NAME...
On 2013-02-19, at 10:47 AM, Till Kamppeter <till.kamppeter at gmail.com> wrote:
> Hi,
>
> to allow driverless printiung on network-connected printers, especially
> from mobile devices I want to poll capability information from the
> printer, where I want to support IPP printers with known PDLs, like
> PostScript, PCL, IPP Everywhere, ... The program should then
> automatically generate a PPD file or at least select the most suitable
> generic one, depending on how much info the printer provides.
>
> Using ipptool of CUPS I have no problem to poll info from IPP printers,
> running
>
> ipptool -X <IPP URI of the printer> cap.ipptool
>
> cap.ipptool contains:
>
> ----------
> IGNORE-ERRORS yes
> {
> NAME "Get printer attributes using Get-Printer-Attributes"
> OPERATION Get-Printer-Attributes
> GROUP operation-attributes-tag
> ATTR charset attributes-charset utf-8
> ATTR language attributes-natural-language en
> ATTR uri printer-uri $uri
> ATTR keyword requested-attributes
> job-template,printer-description,printer-resolution-supported,print-color-mode-supported,print-quality-supported,media-supported,media-default,media-ready,output-bin-supported,finishings-supported,color-supported,sides-supported,number-up-supported,page-ranges-supported,all,media-col-database
> }
> ----------
>
> Now I want to poll with my own C program. It contains:
>
> ----------
> char *uri;
> http_t *http;
> ipp_t *request, *response;
> int i;
> char scheme[10], userpass[1024], host_name[1024], resource[1024];
> static const char * const requested_attrs[] =
> {
> "printer-description",
> "document-format-supported",
> "color-supported",
> "pages-per-minute",
> "pages-per-minute-color",
> "media-supported",
> "media-ready",
> "media-default",
> "media-type-supported",
> "media-source-supported",
> "media-col-database",
> "sides-supported",
> "sides-default",
> "output-bin-supported",
> "output-bin-default",
> "finishings-supported",
> "finishings-default",
> "print-color-mode-supported",
> "print-color-mode-default",
> "output-mode-supported",
> "output-mode-default",
> "print-quality-supported",
> "print-quality-default",
> "printer-resolution-supported",
> "printer-resolution-default",
> "copies-supported",
> "copies-default",
> "all"
> };
> uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri,
> scheme, sizeof(scheme),
> userpass, sizeof(userpass),
> host_name, sizeof(host_name),
> &(port),
> resource, sizeof(resource));
> if (uri_status != HTTP_URI_OK)
> goto fail;
> if ((http = httpConnect(host_name, port)) ==
> NULL) {
> goto fail;
> }
> request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
> /*ippSetRequestId(request, (CUPS_RAND() % 1000) * 137 + 1);*/
> /*ippAddSeparator(request);*/
> /*ippSetVersion(request, 1, 1);*/
> /*ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
> "attributes-charset", NULL, "utf-8");*/
> /*ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
> "attributes-natural-language", NULL, "en");*/
> ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
> "printer-uri", NULL, p->uri);
> /*ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
> "requesting-user-name", NULL, cupsUser());*/
> ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
> "requested-attributes",
> sizeof(requested_attrs) / sizeof(requested_attrs[0]),
> NULL, requested_attrs);
> /*int status = cupsSendRequest(http, request, resource,
> ippLength(request));
> response = cupsGetResponse(http, resource);*/
> response = cupsDoRequest(http, request, resource);
> if (response == NULL) {
> httpClose(http);
> goto fail;
> }
> printf("cups-browsed: Remote printer %s: %s (%s)\n",
> p->uri, ippErrorString(cupsLastError()),
> cupsLastErrorString());
> ipp_attribute_t *attr;
> attr = ippFirstAttribute(response);
> while (attr) {
> printf("Attr: %s\n",
> ippGetName(attr));
> for (i = 0; i < ippGetCount(attr); i ++)
> printf("Value: %s\n",
> ippGetString(attr, i, NULL));
> attr = ippNextAttribute(response);
> }
> attr = ippFindAttribute(response,
> "document-format-supported",
> IPP_TAG_ZERO);
> if (attr)
> for (i = 0; i < ippGetCount(attr); i ++)
> printf("Format: %s\n",
> ippGetString(attr, i, NULL));
> else
> printf("Not found.\n");
>
> /* Clean up */
> ippDelete(response);
> httpClose(http);
> fail:
> ----------
>
> With this I always get client-error-bad-request, independent whwther I
> run it as shown here or whatever combination of lines which are
> currently commented out I activated. I tried with several HP printers
> (HP Color LaserJet CM3530 MFP, HP LaserJet P3005, HP OfficeJet Pro 8500
> A910) and the Canon iR-ADV C5000s-B1, all with the same result, and all
> work with ipptool. I also tried to remove and re-add items from the list
> of requested attributes.
>
> Note: I am using this code only for directly talking with network
> printers, not for remote CUPS queues.
>
> Any idea what I am doing wrong?
>
> Till
>
>
> _______________________________________________
> cups mailing list
> cups at easysw.com
> http://lists.easysw.com/mailman/listinfo/cups
_________________________________________________________
Michael Sweet, Senior Printing System Engineer, PWG Chair
More information about the cups
mailing list