From c41bbfa7d0cd3c16e6ac144e8030bb60c6341053 Mon Sep 17 00:00:00 2001 From: Mario Sanchez Prada Date: Mon, 13 Jun 2016 14:56:01 +0100 Subject: [PATCH] printers: Check all supported CUPS commands, not just the first one Use an array of strings to store every supported command and check the desired command against the elements in that list, instead of simply checking the first one. https://bugzilla.gnome.org/show_bug.cgi?id=766861 --- panels/printers/pp-maintenance-command.c | 34 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/panels/printers/pp-maintenance-command.c b/panels/printers/pp-maintenance-command.c index 8f043d472..d03482efb 100644 --- a/panels/printers/pp-maintenance-command.c +++ b/panels/printers/pp-maintenance-command.c @@ -296,9 +296,9 @@ _pp_maintenance_command_is_supported (const gchar *printer_name, ipp_t *request; ipp_t *response = NULL; gchar *printer_uri; - gchar *printer_commands = NULL; - gchar *printer_commands_lowercase = NULL; gchar *command_lowercase; + GPtrArray *available_commands = NULL; + int i; printer_uri = g_strdup_printf ("ipp://localhost/printers/%s", printer_name); @@ -313,29 +313,41 @@ _pp_maintenance_command_is_supported (const gchar *printer_name, { if (ippGetStatusCode (response) <= IPP_OK_CONFLICT) { + int commands_count; + attr = ippFindAttribute (response, "printer-commands", IPP_TAG_ZERO); - if (attr != NULL && ippGetCount (attr) > 0 && + commands_count = attr != NULL ? ippGetCount (attr) : 0; + if (commands_count > 0 && ippGetValueTag (attr) != IPP_TAG_NOVALUE && (ippGetValueTag (attr) == IPP_TAG_KEYWORD)) { - printer_commands = g_strdup (ippGetString (attr, 0, NULL)); + available_commands = g_ptr_array_new_full (commands_count, g_free); + for (i = 0; i < commands_count; ++i) + { + /* Array gains ownership of the lower-cased string */ + g_ptr_array_add (available_commands, g_ascii_strdown (ippGetString (attr, i, NULL), -1)); + } } } ippDelete (response); } - if (printer_commands != NULL) + if (available_commands != NULL) { command_lowercase = g_ascii_strdown (command, -1); - printer_commands_lowercase = g_ascii_strdown (printer_commands, -1); - - if (g_strcmp0 (printer_commands_lowercase, command_lowercase) == 0) - is_supported = TRUE; + for (i = 0; i < available_commands->len; ++i) + { + const gchar *available_command = g_ptr_array_index (available_commands, i); + if (g_strcmp0 (available_command, command_lowercase) == 0) + { + is_supported = TRUE; + break; + } + } g_free (command_lowercase); - g_free (printer_commands_lowercase); - g_free (printer_commands); + g_ptr_array_free (available_commands, TRUE); } g_free (printer_uri);