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
This commit is contained in:
Marek Kasik 2017-08-30 17:56:00 +02:00
parent 49ab093f26
commit 3d233743ec
3 changed files with 66 additions and 1 deletions

View File

@ -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);

View File

@ -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);

View File

@ -48,6 +48,7 @@ struct _GtkPrinterCups
GtkPrinter parent_instance;
gchar *device_uri;
gchar *original_device_uri;
gchar *printer_uri;
gchar *hostname;
gint port;