[gnome-bluetooth] lib: Make default adapter work properly again
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-bluetooth] lib: Make default adapter work properly again
- Date: Tue, 18 Jun 2013 19:37:16 +0000 (UTC)
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]