diff -up cups-1.5.0/cups/dest.c.cups-get-classes cups-1.5.0/cups/dest.c --- cups-1.5.0/cups/dest.c.cups-get-classes 2011-05-20 04:49:49.000000000 +0100 +++ cups-1.5.0/cups/dest.c 2011-09-14 12:10:05.111635428 +0100 @@ -534,6 +534,7 @@ _cupsGetDests(http_t *http, /* I - char uri[1024]; /* printer-uri value */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ + int get_classes; /* Whether we need to fetch class */ #ifdef __APPLE__ char media_default[41]; /* Default paper size */ #endif /* __APPLE__ */ @@ -590,6 +591,8 @@ _cupsGetDests(http_t *http, /* I - * printer-uri [for IPP_GET_PRINTER_ATTRIBUTES] */ + get_classes = (op == CUPS_GET_PRINTERS); + request = ippNewRequest(op); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, @@ -647,6 +650,23 @@ _cupsGetDests(http_t *http, /* I - attr->value_tag != IPP_TAG_URI) continue; + if (get_classes && + + /* Is this a class? */ + ((attr->value_tag == IPP_TAG_ENUM && + !strcmp(attr->name, "printer-type") && + (attr->values[0].integer & CUPS_PRINTER_CLASS)) || + + /* Or, is this an attribute from CUPS 1.2 or later? */ + !strcmp(attr->name, "auth-info-required") || + !strncmp(attr->name, "marker-", 7) || + !strcmp(attr->name, "printer-commands") || + !strcmp(attr->name, "printer-is-shared"))) + /* We are talking to a recent enough CUPS server that + * CUPS_GET_PRINTERS returns classes as well. + */ + get_classes = 0; + if (!strcmp(attr->name, "auth-info-required") || !strcmp(attr->name, "device-uri") || !strcmp(attr->name, "marker-change-time") || @@ -738,6 +758,28 @@ _cupsGetDests(http_t *http, /* I - continue; } + /* + * If we sent a CUPS_GET_CLASSES request, check whether + * CUPS_GET_PRINTERS already gave us this destination and exit + * early if so. + */ + + if (op == CUPS_GET_CLASSES && num_dests > 0) + { + int diff; + cups_find_dest (printer_name, NULL, num_dests, *dests, 0, &diff); + if (diff == 0) + { + /* + * Found it. The CUPS server already gave us the classes in + * its CUPS_GET_PRINTERS response. + */ + + cupsFreeOptions(num_options, options); + break; + } + } + if ((dest = cups_add_dest(printer_name, NULL, &num_dests, dests)) != NULL) { dest->num_options = num_options; @@ -754,6 +796,15 @@ _cupsGetDests(http_t *http, /* I - } /* + * If this is a CUPS_GET_PRINTERS request but we didn't see any + * classes we might be talking to an older CUPS server that requires + * CUPS_GET_CLASSES as well. + */ + + if (get_classes) + num_dests = _cupsGetDests (http, CUPS_GET_CLASSES, name, dests); + + /* * Return the count... */