[gnome-bluetooth] lib: Make default adapter work properly again



commit 68852faa5a957d14480e72e8e63bc8e1196d19cf
Author: Gustavo Padovan <gustavo padovan collabora co uk>
Date:   Tue Jun 11 15:47:00 2013 +0100

    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

 lib/bluetooth-client.c |  102 +++++++++++++++++++----------------------------
 1 files changed, 41 insertions(+), 61 deletions(-)
---
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index 63fb0f5..4081f66 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]