diff --git a/cups-cups-get-classes.patch b/cups-cups-get-classes.patch new file mode 100644 index 0000000..196f5f1 --- /dev/null +++ b/cups-cups-get-classes.patch @@ -0,0 +1,90 @@ +diff -up cups-1.4rc1/cups/dest.c.cups-get-classes cups-1.4rc1/cups/dest.c +--- cups-1.4rc1/cups/dest.c.cups-get-classes 2009-05-13 22:39:17.000000000 +0100 ++++ cups-1.4rc1/cups/dest.c 2009-07-28 22:17:40.285709944 +0100 +@@ -1735,6 +1735,7 @@ cups_get_sdests(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__ */ +@@ -1791,6 +1792,8 @@ cups_get_sdests(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, +@@ -1848,6 +1851,23 @@ cups_get_sdests(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") || +@@ -1939,6 +1959,28 @@ cups_get_sdests(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; +@@ -1955,6 +1997,16 @@ cups_get_sdests(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 = cups_get_sdests (http, CUPS_GET_CLASSES, name, ++ num_dests, dests); ++ ++ /* + * Return the count... + */ + diff --git a/cups.spec b/cups.spec index 36bd6c8..6899c4f 100644 --- a/cups.spec +++ b/cups.spec @@ -58,7 +58,8 @@ Patch31: cups-str3254.patch Patch32: cups-str3253.patch Patch33: cups-str3266.patch Patch34: cups-str3262.patch -Patch35: cups-avahi.patch +Patch35: cups-cups-get-classes.patch +Patch36: cups-avahi.patch Patch100: cups-lspp.patch Epoch: 1 Url: http://www.cups.org/ @@ -214,7 +215,8 @@ module. %patch32 -p1 -b .str3253 %patch33 -p1 -b .str3266 %patch34 -p1 -b .str3262 -#%patch35 -p1 -b .avahi +%patch35 -p1 -b .cups-get-classes +#%patch36 -p1 -b .avahi %if %lspp %patch100 -p1 -b .lspp @@ -508,6 +510,9 @@ rm -rf $RPM_BUILD_ROOT %changelog * Tue Jul 28 2009 Tim Waugh 1:1.4-0.rc1.12 +- Cheaply restore compatibility with 1.1.x by having cups_get_sdests() + perform a CUPS_GET_CLASSES request if it is not sure it is talking + to CUPS 1.2 or later (bug #512866). - Prevent ipp backend looping with bad IPP devices (bug #476424, STR #3262). - Fixed Device ID reporting in the usb backend (STR #3266).