summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-06-11 15:47:00 +0100
committerBastien Nocera <hadess@hadess.net>2013-06-18 21:37:06 +0200
commit68852faa5a957d14480e72e8e63bc8e1196d19cf (patch)
tree86cc16ddc4da8ba03557c95363899192b5ef5538 /lib
parent7cb107b17d6caedf0afc2b8b8d9072e60b75ab80 (diff)
downloadgnome-bluetooth-68852faa5a957d14480e72e8e63bc8e1196d19cf.tar.gz
lib: Make default adapter work properly again
BlueZ has removed the DefaultAdapter concept so now we use the first adapter plugged as the default adapter. In case the default adapter is removed we iter to find a new adapter to replace as default adapter, in case it exists we call default_adapter_changed() to setup it as the new default. We were able to get rid of some loops in the code in favor to a better implementation using get_iter_from_path() to get the desired iter. https://bugzilla.gnome.org/show_bug.cgi?id=701399
Diffstat (limited to 'lib')
-rw-r--r--lib/bluetooth-client.c102
1 files changed, 41 insertions, 61 deletions
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index 63fb0f58..4081f669 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -475,44 +475,25 @@ default_adapter_changed (ObjectManager *manager,
{
BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
GtkTreeIter iter;
- gboolean cont;
- gboolean powered = FALSE;
- gboolean found = FALSE;
-
- if (priv->default_adapter) {
- gtk_tree_row_reference_free (priv->default_adapter);
- priv->default_adapter = NULL;
- }
-
- cont = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store), &iter);
-
- while (cont == TRUE) {
- GDBusProxy *adapter;
- const char *adapter_path;
-
- gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
- BLUETOOTH_COLUMN_PROXY, &adapter,
- BLUETOOTH_COLUMN_POWERED, &powered, -1);
-
- adapter_path = g_dbus_proxy_get_object_path (adapter);
+ GtkTreePath *tree_path;
+ gboolean powered;
- found = g_str_equal (path, adapter_path);
+ g_assert (!priv->default_adapter);
- g_object_unref (adapter);
+ if (get_iter_from_path (priv->store, &iter, path) == FALSE)
+ return;
- if (found != FALSE) {
- GtkTreePath *tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
- priv->default_adapter = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->store), tree_path);
- gtk_tree_path_free (tree_path);
- }
+ tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->store), &iter);
+ priv->default_adapter = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->store), tree_path);
+ gtk_tree_path_free (tree_path);
- gtk_tree_store_set (priv->store, &iter,
- BLUETOOTH_COLUMN_DEFAULT, found, -1);
+ gtk_tree_store_set (priv->store, &iter,
+ BLUETOOTH_COLUMN_DEFAULT, TRUE, -1);
- cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(priv->store), &iter);
- }
+ gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+ BLUETOOTH_COLUMN_POWERED, &powered, -1);
- if (found && powered) {
+ if (powered) {
g_object_notify (G_OBJECT (client), "default-adapter");
g_object_notify (G_OBJECT (client), "default-adapter-powered");
g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
@@ -570,7 +551,7 @@ adapter_g_properties_changed (GDBusProxy *adapter,
BLUETOOTH_COLUMN_POWERED, powered, -1);
gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
BLUETOOTH_COLUMN_DEFAULT, &is_default, -1);
- if (is_default != FALSE) {
+ if (is_default != FALSE && powered) {
g_object_notify (G_OBJECT (client), "default-adapter");
g_object_notify (G_OBJECT (client), "default-adapter-powered");
g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
@@ -660,7 +641,8 @@ adapter_added (ObjectManager *manager,
g_signal_connect (G_OBJECT (adapter), "g-properties-changed",
G_CALLBACK (adapter_g_properties_changed), client);
- default_adapter_changed (manager, path, client);
+ if (!priv->default_adapter)
+ default_adapter_changed (manager, path, client);
g_object_unref (properties);
g_object_unref (adapter);
@@ -673,37 +655,36 @@ adapter_removed (ObjectManager *manager,
{
BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
GtkTreeIter iter;
- gboolean cont;
+ gboolean was_default;
- cont = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store), &iter);
+ if (get_iter_from_path (priv->store, &iter, path) == FALSE)
+ return;
- while (cont == TRUE) {
+ gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+ BLUETOOTH_COLUMN_DEFAULT, &was_default, -1);
+
+ if (!was_default)
+ return;
+
+ g_clear_pointer (&priv->default_adapter, gtk_tree_row_reference_free);
+ gtk_tree_store_remove (priv->store, &iter);
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(priv->store),
+ &iter)) {
GDBusProxy *adapter;
const char *adapter_path;
- gboolean found, was_default;
- gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter,
- BLUETOOTH_COLUMN_PROXY, &adapter,
- BLUETOOTH_COLUMN_DEFAULT, &was_default, -1);
+ gtk_tree_model_get (GTK_TREE_MODEL(priv->store), &iter,
+ BLUETOOTH_COLUMN_PROXY, &adapter, -1);
- adapter_path = g_dbus_proxy_get_object_path(adapter);
+ adapter_path = g_dbus_proxy_get_object_path (adapter);
+ default_adapter_changed (manager, adapter_path, client);
- found = g_str_equal(path, adapter_path);
g_object_unref(adapter);
-
- if (found) {
- if (was_default) {
- gtk_tree_row_reference_free (priv->default_adapter);
- priv->default_adapter = NULL;
- g_object_notify (G_OBJECT (client), "default-adapter");
- g_object_notify (G_OBJECT (client), "default-adapter-powered");
- g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
- }
- gtk_tree_store_remove(priv->store, &iter);
- break;
- }
-
- cont = gtk_tree_model_iter_next (GTK_TREE_MODEL(priv->store), &iter);
+ } else {
+ g_object_notify (G_OBJECT (client), "default-adapter");
+ g_object_notify (G_OBJECT (client), "default-adapter-powered");
+ g_object_notify (G_OBJECT (client), "default-adapter-discoverable");
}
}
@@ -819,10 +800,9 @@ bluez_vanished_cb (GDBusConnection *connection,
{
BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
- if (priv->default_adapter) {
- gtk_tree_row_reference_free (priv->default_adapter);
- priv->default_adapter = NULL;
- }
+ if (priv->default_adapter)
+ g_clear_pointer (&priv->default_adapter,
+ gtk_tree_row_reference_free);
gtk_tree_store_clear (priv->store);