| Imported from gentoo: |
| http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/net-print/libgnomecups/files/libgnomecups-0.2.3-cups-1.6.patch |
| |
| From ae783efde4fa69578651994505462f02b8639220 Mon Sep 17 00:00:00 2001 |
| From: Alexandre Rostovtsev <tetromino@gentoo.org> |
| Date: Tue, 7 Aug 2012 06:53:09 -0400 |
| Subject: [PATCH] Use CUPS-1.6 IPP API getter/setter functions |
| |
| CUPS 1.6 makes various structures private and introduces these ippGet |
| and ippSet functions for all of the fields in these structures. |
| http://www.cups.org/str.php?L3928 |
| |
| We define our own accessors when building against CUPS < 1.6. |
| |
| Based on work by Jiri Popelka <jpopelka@redhat.com> at |
| https://bugzilla.gnome.org/show_bug.cgi?id=679759 |
| --- |
| libgnomecups/gnome-cups-printer.c | 48 +++++++++++++++++++++++++++++------- |
| libgnomecups/gnome-cups-queue.c | 43 +++++++++++++++++++++++++++------ |
| libgnomecups/gnome-cups-request.c | 44 ++++++++++++++++++++++++++++----- |
| 3 files changed, 110 insertions(+), 25 deletions(-) |
| |
| diff --git a/libgnomecups/gnome-cups-printer.c b/libgnomecups/gnome-cups-printer.c |
| index c924af0..f5e1ef7 100644 |
| --- a/libgnomecups/gnome-cups-printer.c |
| +++ b/libgnomecups/gnome-cups-printer.c |
| @@ -37,6 +37,34 @@ |
| |
| #define UPDATE_TIMEOUT 5000 |
| |
| +#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5) |
| +#define HAVE_CUPS_1_6 1 |
| +#endif |
| + |
| +#ifndef HAVE_CUPS_1_6 |
| +#define ippGetCount(attr) attr->num_values |
| +#define ippGetName(attr) attr->name |
| +#define ippGetInteger(attr, element) attr->values[element].integer |
| +#define ippGetString(attr, element, language) attr->values[element].string.text |
| + |
| +static ipp_attribute_t * |
| +ippFirstAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp) |
| + return (NULL); |
| + return (ipp->current = ipp->attrs); |
| +} |
| + |
| +static ipp_attribute_t * |
| +ippNextAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp || !ipp->current) |
| + return (NULL); |
| + return (ipp->current = ipp->current->next); |
| +} |
| +#endif |
| + |
| + |
| struct _GnomeCupsPPDFile { |
| char name[1]; |
| }; |
| @@ -173,9 +201,9 @@ map_reasons (GnomeCupsPrinter *printer, |
| printer->details->state_reasons = NULL; |
| |
| /* cf. RFC2911 4.4.12 */ |
| - for (i = 0; i < attr->num_values; i++) { |
| + for (i = 0; i < ippGetCount (attr); i++) { |
| const char *p; |
| - const char *keyword = attr->values [i].string.text; |
| + const char *keyword = ippGetString (attr, i, NULL); |
| |
| reason = g_new (GnomeCupsPrinterReason, 1); |
| |
| @@ -224,8 +252,8 @@ gnome_cups_printer_get_info (GnomeCupsPrinter *printer) |
| return printer->details->info; |
| } |
| |
| -#define MAP_INT(v,a) {if (!g_ascii_strcasecmp (attr->name, (a))) { if ((v) != attr->values[0].integer) { changed = TRUE; } (v) = attr->values[0].integer; }} |
| -#define MAP_STRING(v,a) {if (!g_ascii_strcasecmp (attr->name, (a))) { if (!v || strcmp (v, attr->values[0].string.text)) { g_free (v); changed = TRUE; (v) = g_strdup (attr->values[0].string.text); }}} |
| +#define MAP_INT(v,a) {if (!g_ascii_strcasecmp (ippGetName (attr), (a))) { if ((v) != ippGetInteger (attr, 0)) { changed = TRUE; } (v) = ippGetInteger (attr, 0); }} |
| +#define MAP_STRING(v,a) {if (!g_ascii_strcasecmp (ippGetName (attr), (a))) { if (!v || strcmp (v, ippGetString (attr, 0, NULL))) { g_free (v); changed = TRUE; (v) = g_strdup (ippGetString (attr, 0, NULL)); }}} |
| |
| static void |
| attributes_update_cb (guint id, |
| @@ -243,14 +271,14 @@ attributes_update_cb (guint id, |
| changed = FALSE; |
| |
| if (!error && response) { |
| - for (attr = response->attrs; attr != NULL; attr = attr->next) { |
| - if (!attr->name) { |
| + for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) { |
| + if (!ippGetName (attr)) { |
| continue; |
| } |
| - if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !strcmp (attr->name, "attributes-charset")) { |
| + if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !strcmp (ippGetName (attr), "attributes-charset")) { |
| continue; |
| } |
| - if (!g_ascii_strcasecmp (attr->name, "printer-state-reasons")) { |
| + if (!g_ascii_strcasecmp (ippGetName (attr), "printer-state-reasons")) { |
| map_reasons (printer, attr); |
| } |
| MAP_INT (printer->details->state, "printer-state"); |
| @@ -570,7 +598,7 @@ get_default (void) |
| |
| attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME); |
| if (attr) { |
| - name = g_strdup (attr->values[0].string.text); |
| + name = g_strdup (ippGetString (attr, 0, NULL)); |
| } else { |
| name = NULL; |
| } |
| @@ -698,7 +726,7 @@ get_printer_names (void) |
| attr = ippFindAttribute (response, "printer-name", IPP_TAG_NAME); |
| while (attr) { |
| ret = g_list_prepend (ret, |
| - g_strdup (attr->values[0].string.text)); |
| + g_strdup (ippGetString (attr, 0, NULL))); |
| |
| attr = ippFindNextAttribute (response, |
| "printer-name", |
| diff --git a/libgnomecups/gnome-cups-queue.c b/libgnomecups/gnome-cups-queue.c |
| index 9f98ed9..298db42 100644 |
| --- a/libgnomecups/gnome-cups-queue.c |
| +++ b/libgnomecups/gnome-cups-queue.c |
| @@ -15,6 +15,33 @@ |
| |
| #define UPDATE_TIMEOUT 3000 |
| |
| +#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5) |
| +#define HAVE_CUPS_1_6 1 |
| +#endif |
| + |
| +#ifndef HAVE_CUPS_1_6 |
| +#define ippGetName(attr) attr->name |
| +#define ippGetInteger(attr, element) attr->values[element].integer |
| +#define ippGetString(attr, element, language) attr->values[element].string.text |
| + |
| +static ipp_attribute_t * |
| +ippFirstAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp) |
| + return (NULL); |
| + return (ipp->current = ipp->attrs); |
| +} |
| + |
| +static ipp_attribute_t * |
| +ippNextAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp || !ipp->current) |
| + return (NULL); |
| + return (ipp->current = ipp->current->next); |
| +} |
| +#endif |
| + |
| + |
| struct _GnomeCupsQueueDetails { |
| char *queue_name; |
| GList *jobs; |
| @@ -199,8 +226,8 @@ finish_job (GnomeCupsJob *job) |
| job->size = job->size * 1024; |
| } |
| |
| -#define MAP_STR(dest, src) { if (!g_ascii_strcasecmp (attr->name, (src))) { if ((dest) != NULL) g_free (dest); (dest) = g_strdup (attr->values[0].string.text);}} |
| -#define MAP_INT(dest, src) { if (!g_ascii_strcasecmp (attr->name, (src))) { (dest) = attr->values[0].integer; } } |
| +#define MAP_STR(dest, src) { if (!g_ascii_strcasecmp (ippGetName (attr), (src))) { if ((dest) != NULL) g_free (dest); (dest) = g_strdup (ippGetString (attr, 0, NULL));}} |
| +#define MAP_INT(dest, src) { if (!g_ascii_strcasecmp (ippGetName (attr), (src))) { (dest) = ippGetInteger (attr, 0); } } |
| |
| static void |
| get_jobs_cb (guint id, |
| @@ -231,8 +258,8 @@ get_jobs_cb (guint id, |
| |
| if (response) { |
| job = g_new0 (GnomeCupsJob, 1); |
| - for (attr = response->attrs; attr != NULL; attr = attr->next) { |
| - if (attr->name == NULL) { |
| + for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) { |
| + if (ippGetName (attr) == NULL) { |
| if (job->name) { |
| finish_job (job); |
| jobs = g_list_prepend (jobs, job); |
| @@ -244,7 +271,7 @@ get_jobs_cb (guint id, |
| continue; |
| } |
| |
| - if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !g_ascii_strcasecmp (attr->name, "attributes-charset")) { |
| + if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !g_ascii_strcasecmp (ippGetName (attr), "attributes-charset")) { |
| continue; |
| |
| } |
| @@ -355,8 +382,8 @@ gnome_cups_queue_get_job_nocache (GnomeCupsQueue *queue, |
| |
| if (response) { |
| job = g_new0 (GnomeCupsJob, 1); |
| - for (attr = response->attrs; attr != NULL; attr = attr->next) { |
| - if (attr->name == NULL) { |
| + for (attr = ippFirstAttribute (response); attr != NULL; attr = ippNextAttribute (response)) { |
| + if (ippGetName (attr) == NULL) { |
| if (job->name) { |
| finish_job (job); |
| } else { |
| @@ -366,7 +393,7 @@ gnome_cups_queue_get_job_nocache (GnomeCupsQueue *queue, |
| break; |
| } |
| |
| - if (!g_ascii_strcasecmp (attr->name, "attributes-charset") || !g_ascii_strcasecmp (attr->name, "attributes-charset")) { |
| + if (!g_ascii_strcasecmp (ippGetName (attr), "attributes-charset") || !g_ascii_strcasecmp (ippGetName (attr), "attributes-charset")) { |
| continue; |
| } |
| |
| diff --git a/libgnomecups/gnome-cups-request.c b/libgnomecups/gnome-cups-request.c |
| index c94f623..13f0948 100644 |
| --- a/libgnomecups/gnome-cups-request.c |
| +++ b/libgnomecups/gnome-cups-request.c |
| @@ -19,6 +19,36 @@ |
| #define STOP_UNUSED_THREADS_TIMEOUT 60 |
| #define CLOSE_UNUSED_CONNECTIONS_TIMEOUT 30 |
| |
| +#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5) |
| +#define HAVE_CUPS_1_6 1 |
| +#endif |
| + |
| +#ifndef HAVE_CUPS_1_6 |
| +#define ippGetCount(attr) attr->num_values |
| +#define ippGetValueTag(attr) attr->value_tag |
| +#define ippGetName(attr) attr->name |
| +#define ippGetBoolean(attr, element) attr->values[element].boolean |
| +#define ippGetInteger(attr, element) attr->values[element].integer |
| +#define ippGetString(attr, element, language) attr->values[element].string.text |
| + |
| +static ipp_attribute_t * |
| +ippFirstAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp) |
| + return (NULL); |
| + return (ipp->current = ipp->attrs); |
| +} |
| + |
| +static ipp_attribute_t * |
| +ippNextAttribute(ipp_t *ipp) |
| +{ |
| + if (!ipp || !ipp->current) |
| + return (NULL); |
| + return (ipp->current = ipp->current->next); |
| +} |
| +#endif |
| + |
| + |
| typedef struct |
| { |
| GMutex *mutex; |
| @@ -276,14 +306,14 @@ dump_request (ipp_t const *req) |
| unsigned i; |
| ipp_attribute_t *attr; |
| |
| - for (attr = req->attrs; attr != NULL; attr = attr->next) { |
| - g_print ("%s", attr->name); |
| - for (i = 0 ; i < attr->num_values ; i++) { |
| + for (attr = ippFirstAttribute (req); attr != NULL; attr = ippNextAttribute (req)) { |
| + g_print ("%s", ippGetName (attr)); |
| + for (i = 0 ; i < ippGetCount (attr) ; i++) { |
| g_print ("\t[%d] = ", i); |
| - switch (attr->value_tag & ~IPP_TAG_COPY) { |
| + switch (ippGetValueTag (attr) & ~IPP_TAG_COPY) { |
| case IPP_TAG_INTEGER: |
| case IPP_TAG_ENUM: |
| - g_print ("%d\n", attr->values[i].integer); |
| + g_print ("%d\n", ippGetInteger (attr, i)); |
| break; |
| |
| case IPP_TAG_STRING: |
| @@ -294,11 +324,11 @@ dump_request (ipp_t const *req) |
| case IPP_TAG_CHARSET: |
| case IPP_TAG_LANGUAGE: |
| case IPP_TAG_MIMETYPE: |
| - g_print ("'%s'\n", attr->values[i].string.text); |
| + g_print ("'%s'\n", ippGetString (attr, i, NULL)); |
| break; |
| |
| case IPP_TAG_BOOLEAN: |
| - g_print ("%s\n", (int)attr->values[i].boolean ? "true" : "false"); |
| + g_print ("%s\n", (int)ippGetBoolean (attr, i) ? "true" : "false"); |
| break; |
| |
| default: |
| -- |
| 1.7.8.6 |
| |