Index: client.c =================================================================== RCS file: /cvsroot/bluez/gnome/common/client.c,v retrieving revision 1.17 diff -u -p -r1.17 client.c --- client.c 24 Jul 2007 21:23:59 -0000 1.17 +++ client.c 24 Jul 2007 23:03:02 -0000 @@ -35,9 +35,9 @@ #include "dbus-glue.h" -static DBusGConnection *conn; +static DBusGConnection *conn = NULL; -static GtkTreeStore *store; +static GtkTreeStore *store = NULL; #define BLUETOOTH_CLIENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ BLUETOOTH_TYPE_CLIENT, BluetoothClientPrivate)) @@ -46,20 +46,44 @@ typedef struct _BluetoothClientPrivate B struct _BluetoothClientPrivate { gboolean registered; + gchar *default_adapter; + gboolean discovery_on_default; }; +static void default_adapter_changed(DBusGProxy *object, + const char *path, BluetoothClient *self); + G_DEFINE_TYPE(BluetoothClient, bluetooth_client, G_TYPE_OBJECT) static void bluetooth_client_init(BluetoothClient *self) { BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); + DBusGProxy *object; + + object = dbus_g_proxy_new_for_name(conn, "org.bluez", + "/org/bluez", "org.bluez.Manager"); + + dbus_g_proxy_add_signal(object, "DefaultAdapterChanged", + G_TYPE_STRING, G_TYPE_INVALID); + + dbus_g_proxy_connect_signal(object, "DefaultAdapterChanged", + G_CALLBACK(default_adapter_changed), conn, NULL); + + manager_default_adapter(object, &priv->default_adapter, NULL); priv->registered = FALSE; } static void bluetooth_client_finalize(GObject *object) { - //BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(object); + BluetoothClient *self = BLUETOOTH_CLIENT (object); + BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); + + g_free(priv->default_adapter); + priv->default_adapter = NULL; + + //FIXME cancel disco on _all_ devices + //bluetooth_client_cancel_discovery(self, NULL); } static void bluetooth_client_set_property(GObject *object, guint prop_id, @@ -351,9 +375,7 @@ static void update_adapter(DBusGProxy *o gtk_tree_store_set(store, iter, COLUMN_ADDRESS, address, COLUMN_NAME, name, -1); - //adapter_list_remote_devices(object, &array, &error); - - adapter_list_bondings(object, &array, &error); + adapter_list_remote_devices(object, &array, &error); if (error == NULL) { while (*array) { @@ -488,11 +510,30 @@ static void adapter_removed(DBusGProxy * remove_adapter(path); } +static void default_adapter_changed(DBusGProxy *object, + const char *path, BluetoothClient *self) +{ + BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); + gboolean discovery_on_default; + + discovery_on_default = priv->discovery_on_default; + + /* If we started a discovery on the default adapter, cancel it + * and restart a new one on the new default adapter */ + if (discovery_on_default) + bluetooth_client_cancel_discovery(self, NULL); + + g_free(priv->default_adapter); + priv->default_adapter = g_strdup(path); + + if (discovery_on_default) + bluetooth_client_discover_devices(self, NULL); +} + static void setup_manager(void) { DBusGProxy *object; GError *error = NULL; - char *default_adapter = NULL; char **array = NULL; object = dbus_g_proxy_new_for_name(conn, "org.bluez", @@ -510,8 +551,6 @@ static void setup_manager(void) dbus_g_proxy_connect_signal(object, "AdapterRemoved", G_CALLBACK(adapter_removed), conn, NULL); - manager_default_adapter(object, &default_adapter, NULL); - manager_list_adapters(object, &array, &error); if (error == NULL) { @@ -646,11 +685,15 @@ gboolean bluetooth_client_create_bonding gboolean bluetooth_client_discover_devices(BluetoothClient *self, gchar *adapter) { + BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); GtkTreeIter iter; gboolean cont; cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); + if (!adapter && !priv->default_adapter) + return FALSE; + while (cont == TRUE) { DBusGProxy *object; gchar *path; @@ -659,9 +702,12 @@ gboolean bluetooth_client_discover_devic COLUMN_PATH, &path, COLUMN_OBJECT, &object, -1); - if (g_ascii_strcasecmp(path, adapter) == 0) { + if ((adapter == NULL && g_ascii_strcasecmp(path, priv->default_adapter) == 0) + || g_ascii_strcasecmp(path, adapter) == 0) { dbus_g_proxy_call(object, "DiscoverDevices", NULL, G_TYPE_INVALID); + if (!adapter) + priv->discovery_on_default = TRUE; return TRUE; } @@ -673,10 +719,13 @@ gboolean bluetooth_client_discover_devic gboolean bluetooth_client_cancel_discovery(BluetoothClient *self, gchar *adapter) { + BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); GtkTreeIter iter; gboolean cont; cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); + if (!adapter && !priv->default_adapter) + return FALSE; while (cont == TRUE) { DBusGProxy *object; @@ -686,9 +735,12 @@ gboolean bluetooth_client_cancel_discove COLUMN_PATH, &path, COLUMN_OBJECT, &object, -1); - if (g_ascii_strcasecmp(path, adapter) == 0) { + if ((adapter == NULL && g_ascii_strcasecmp(path, priv->default_adapter) == 0) + || g_ascii_strcasecmp(path, adapter) == 0) { dbus_g_proxy_call(object, "CancelDiscovery", NULL, G_TYPE_INVALID); + if (!adapter) + priv->discovery_on_default = FALSE; return TRUE; } @@ -786,19 +838,24 @@ static gboolean device_active_filter(Gtk GtkTreeModel *bluetooth_client_get_model_for_adapter(BluetoothClient *self, gchar *adapter) { + BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(self); GtkTreeModel *model; GtkTreeIter iter; gboolean cont; cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); + if (!adapter && !priv->default_adapter) + return FALSE; + while (cont == TRUE) { gchar *path; gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, COLUMN_PATH, &path, -1); - if (!g_ascii_strcasecmp(path, adapter)) { + if ((adapter == NULL && !g_ascii_strcasecmp(path, priv->default_adapter)) + || !g_ascii_strcasecmp(path, adapter)) { GtkTreePath *path; path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);