cups/cups-cups-get-classes.patch
Jiri Popelka 5bd20b0884 1.5b2
2011-05-26 16:27:09 +02:00

90 lines
2.8 KiB
Diff

diff -up cups-1.5b1/cups/dest.c.cups-get-classes cups-1.5b1/cups/dest.c
--- cups-1.5b1/cups/dest.c.cups-get-classes 2011-05-20 05:49:49.000000000 +0200
+++ cups-1.5b1/cups/dest.c 2011-05-26 11:06:22.000000000 +0200
@@ -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)
+ {
+ 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...
*/