Commit 52e3c095 authored by Marek Kašík's avatar Marek Kašík

printing: Don't show duplicate printers

Check UUID for printers obtained via DNSSD whether
they are already installed on local CUPS server.
Don't show such printers.

Not all printers published via DNSSD have UUID entry though.

https://bugzilla.gnome.org/show_bug.cgi?id=786794
parent f29007c1
......@@ -1899,7 +1899,8 @@ static const char * const printer_attrs[] =
"ipp-versions-supported",
"multiple-document-handling-supported",
"copies-supported",
"number-up-supported"
"number-up-supported",
"device-uri"
};
/* Attributes we're interested in for printers without PPD */
......@@ -1996,11 +1997,13 @@ typedef struct
int number_of_covers;
gchar *output_bin_default;
GList *output_bin_supported;
gchar *original_device_uri;
} PrinterSetupInfo;
static void
printer_setup_info_free (PrinterSetupInfo *info)
{
g_free (info->original_device_uri);
g_free (info->state_msg);
g_strfreev (info->covers);
g_slice_free (PrinterSetupInfo, info);
......@@ -2376,6 +2379,10 @@ cups_printer_handle_attribute (GtkPrintBackendCups *cups_backend,
info->output_bin_supported = g_list_reverse (info->output_bin_supported);
}
else if (g_strcmp0 (ippGetName (attr), "device-uri") == 0)
{
info->original_device_uri = g_strdup (ippGetString (attr, 0, NULL));
}
else
{
GTK_NOTE (PRINTING,
......@@ -2464,6 +2471,7 @@ cups_create_printer (GtkPrintBackendCups *cups_backend,
cups_printer->default_cover_before = g_strdup (info->default_cover_before);
cups_printer->default_cover_after = g_strdup (info->default_cover_after);
cups_printer->original_device_uri = g_strdup (info->original_device_uri);
if (info->default_number_up > 0)
cups_printer->default_number_up = info->default_number_up;
......@@ -2830,9 +2838,54 @@ typedef struct
guint printer_state;
gchar *type;
gchar *domain;
gchar *UUID;
GtkPrintBackendCups *backend;
} AvahiConnectionTestData;
static GtkPrinter *
find_printer_by_uuid (GtkPrintBackendCups *backend,
const gchar *UUID)
{
GtkPrinterCups *printer;
GtkPrinter *result = NULL;
GList *printers;
GList *iter;
gchar *printer_uuid;
printers = gtk_print_backend_get_printer_list (GTK_PRINT_BACKEND (backend));
for (iter = printers; iter != NULL; iter = iter->next)
{
printer = GTK_PRINTER_CUPS (iter->data);
if (printer->original_device_uri != NULL)
{
printer_uuid = g_strrstr (printer->original_device_uri, "uuid=");
if (printer_uuid != NULL && strlen (printer_uuid) >= 41)
{
printer_uuid += 5;
printer_uuid = g_strndup (printer_uuid, 36);
#if GLIB_CHECK_VERSION(2, 52, 0)
if (g_uuid_string_is_valid (printer_uuid))
#endif
{
if (g_strcmp0 (printer_uuid, UUID) == 0)
{
result = GTK_PRINTER (printer);
g_free (printer_uuid);
break;
}
}
g_free (printer_uuid);
}
}
}
g_list_free (printers);
return result;
}
/*
* Create new GtkPrinter from informations included in TXT records.
*/
......@@ -2878,6 +2931,10 @@ create_cups_printer_from_avahi_data (AvahiConnectionTestData *data)
set_info_state_message (info);
printer = gtk_print_backend_find_printer (GTK_PRINT_BACKEND (data->backend), data->printer_name);
if (printer == NULL && data->UUID != NULL)
printer = find_printer_by_uuid (data->backend, data->UUID);
if (printer == NULL)
{
printer = cups_create_printer (data->backend, info);
......@@ -3080,6 +3137,11 @@ avahi_service_resolver_cb (GObject *source_object,
if (data->printer_state != 0 || endptr != value)
data->got_printer_state = TRUE;
}
else if (g_strcmp0 (key, "UUID") == 0)
{
if (*value != '\0')
data->UUID = g_strdup (value);
}
g_clear_pointer (&key, g_free);
g_clear_pointer (&value, g_free);
......
......@@ -100,6 +100,7 @@ static void
gtk_printer_cups_init (GtkPrinterCups *printer)
{
printer->device_uri = NULL;
printer->original_device_uri = NULL;
printer->printer_uri = NULL;
printer->state = 0;
printer->hostname = NULL;
......@@ -151,6 +152,7 @@ gtk_printer_cups_finalize (GObject *object)
printer = GTK_PRINTER_CUPS (object);
g_free (printer->device_uri);
g_free (printer->original_device_uri);
g_free (printer->printer_uri);
g_free (printer->hostname);
g_free (printer->ppd_name);
......
......@@ -48,6 +48,7 @@ struct _GtkPrinterCups
GtkPrinter parent_instance;
gchar *device_uri;
gchar *original_device_uri;
gchar *printer_uri;
gchar *hostname;
gint port;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment