summaryrefslogtreecommitdiffstats
path: root/cups-cups-get-classes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'cups-cups-get-classes.patch')
-rw-r--r--cups-cups-get-classes.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/cups-cups-get-classes.patch b/cups-cups-get-classes.patch
new file mode 100644
index 0000000..c998852
--- /dev/null
+++ b/cups-cups-get-classes.patch
@@ -0,0 +1,89 @@
+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...
+ */
+