Printers: Use system-config-printer's GroupPhysicalDevices method
If available, use DBus method GroupPhysicalDevices which removes duplicates from list of found devices. This method is available in system-config-printer since version 1.3.5 (#654742).
This commit is contained in:
parent
8951bc41a7
commit
eb18692613
1 changed files with 106 additions and 8 deletions
|
@ -53,6 +53,10 @@
|
|||
#define FIREWALLD_PATH "/org/fedoraproject/FirewallD"
|
||||
#define FIREWALLD_IFACE "org.fedoraproject.FirewallD"
|
||||
|
||||
#define SCP_BUS "org.fedoraproject.Config.Printing"
|
||||
#define SCP_PATH "/org/fedoraproject/Config/Printing"
|
||||
#define SCP_IFACE "org.fedoraproject.Config.Printing"
|
||||
|
||||
#define ALLOWED_CHARACTERS "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/"
|
||||
|
||||
static void pp_new_printer_dialog_hide (PpNewPrinterDialog *pp);
|
||||
|
@ -296,16 +300,19 @@ devices_get_cb (GObject *source_object,
|
|||
PpNewPrinterDialog *pp = user_data;
|
||||
cups_dest_t *dests;
|
||||
GHashTable *devices = NULL;
|
||||
GDBusProxy *proxy;
|
||||
GtkWidget *widget = NULL;
|
||||
GVariant *dg_output = NULL;
|
||||
gboolean already_present;
|
||||
GError *error = NULL;
|
||||
gchar *new_name = NULL;
|
||||
gchar *device_uri = NULL;
|
||||
char *ret_error = NULL;
|
||||
gint i, j;
|
||||
gint i, j, k;
|
||||
gint name_index;
|
||||
gint num_dests;
|
||||
|
||||
|
||||
dg_output = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
|
||||
res,
|
||||
&error);
|
||||
|
@ -445,22 +452,112 @@ devices_get_cb (GObject *source_object,
|
|||
* Show devices with device-id.
|
||||
* Other preferences should apply here.
|
||||
*/
|
||||
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
NULL,
|
||||
SCP_BUS,
|
||||
SCP_PATH,
|
||||
SCP_IFACE,
|
||||
NULL,
|
||||
&error);
|
||||
|
||||
if (proxy)
|
||||
{
|
||||
GVariantBuilder device_list;
|
||||
GVariantBuilder device_hash;
|
||||
GVariant *input = NULL;
|
||||
GVariant *output = NULL;
|
||||
GVariant *array = NULL;
|
||||
GVariant *subarray = NULL;
|
||||
|
||||
g_variant_builder_init (&device_list, G_VARIANT_TYPE ("a{sv}"));
|
||||
|
||||
for (i = 0; i < pp->num_devices; i++)
|
||||
{
|
||||
for (j = 0; j < pp->num_devices; j++)
|
||||
if (pp->devices[i].device_uri)
|
||||
{
|
||||
if (i != j)
|
||||
g_variant_builder_init (&device_hash, G_VARIANT_TYPE ("a{ss}"));
|
||||
|
||||
if (pp->devices[i].device_id)
|
||||
g_variant_builder_add (&device_hash,
|
||||
"{ss}",
|
||||
"device-id",
|
||||
pp->devices[i].device_id);
|
||||
|
||||
if (pp->devices[i].device_make_and_model)
|
||||
g_variant_builder_add (&device_hash,
|
||||
"{ss}",
|
||||
"device-make-and-model",
|
||||
pp->devices[i].device_make_and_model);
|
||||
|
||||
if (pp->devices[i].device_class)
|
||||
g_variant_builder_add (&device_hash,
|
||||
"{ss}",
|
||||
"device-class",
|
||||
pp->devices[i].device_class);
|
||||
|
||||
g_variant_builder_add (&device_list,
|
||||
"{sv}",
|
||||
pp->devices[i].device_uri,
|
||||
g_variant_builder_end (&device_hash));
|
||||
}
|
||||
}
|
||||
|
||||
input = g_variant_new ("(v)", g_variant_builder_end (&device_list));
|
||||
|
||||
output = g_dbus_proxy_call_sync (proxy,
|
||||
"GroupPhysicalDevices",
|
||||
input,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
60000,
|
||||
NULL,
|
||||
&error);
|
||||
|
||||
if (output && g_variant_n_children (output) == 1)
|
||||
{
|
||||
if (g_strcmp0 (pp->devices[i].display_name, pp->devices[j].display_name) == 0)
|
||||
array = g_variant_get_child_value (output, 0);
|
||||
if (array)
|
||||
{
|
||||
if (pp->devices[i].device_id && !pp->devices[j].show)
|
||||
for (i = 0; i < g_variant_n_children (array); i++)
|
||||
{
|
||||
subarray = g_variant_get_child_value (array, i);
|
||||
if (subarray)
|
||||
{
|
||||
device_uri = g_strdup (g_variant_get_string (
|
||||
g_variant_get_child_value (subarray, 0),
|
||||
NULL));
|
||||
|
||||
for (k = 0; k < pp->num_devices; k++)
|
||||
if (g_str_has_prefix (pp->devices[k].device_uri, device_uri))
|
||||
pp->devices[k].show = TRUE;
|
||||
|
||||
g_free (device_uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (output)
|
||||
g_variant_unref (output);
|
||||
g_variant_unref (input);
|
||||
g_object_unref (proxy);
|
||||
}
|
||||
|
||||
if (error &&
|
||||
error->domain == G_DBUS_ERROR &&
|
||||
(error->code == G_DBUS_ERROR_SERVICE_UNKNOWN ||
|
||||
error->code == G_DBUS_ERROR_UNKNOWN_METHOD))
|
||||
{
|
||||
g_warning ("Install system-config-printer which provides \
|
||||
DBus method \"GroupPhysicalDevices\" to group duplicates in device list.");
|
||||
|
||||
for (i = 0; i < pp->num_devices; i++)
|
||||
pp->devices[i].show = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < pp->num_devices; i++)
|
||||
if (!pp->devices[i].device_id)
|
||||
pp->devices[i].show = FALSE;
|
||||
}
|
||||
|
||||
g_hash_table_destroy (devices);
|
||||
|
@ -1059,7 +1156,8 @@ actualize_devices_list (PpNewPrinterDialog *pp)
|
|||
|
||||
for (i = 0; i < pp->num_devices; i++)
|
||||
{
|
||||
if (pp->devices[i].device_id || pp->devices[i].device_ppd_uri)
|
||||
if ((pp->devices[i].device_id || pp->devices[i].device_ppd_uri) &&
|
||||
pp->devices[i].show)
|
||||
{
|
||||
if (g_strcmp0 (pp->devices[i].device_class, "network") == 0)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue