summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-09-25 21:54:55 +0200
committerThomas Haller <thaller@redhat.com>2013-09-25 22:57:45 +0200
commitef472259cf02f4d644767d0b270a7978cff917a1 (patch)
treeeb4b42b37fc29d9f0b3cecd12f9279dceb51758b
parent07cc990981de901438efd09f3c34835a5531f606 (diff)
downloadNetworkManager-ef472259cf02f4d644767d0b270a7978cff917a1.tar.gz
bluez: fix emitting of REMOVED signal in manager
Ensure, before emitting the REMOVED signal for devices, that the device was usable before. Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r--src/bluez-manager/nm-bluez-manager.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/bluez-manager/nm-bluez-manager.c b/src/bluez-manager/nm-bluez-manager.c
index 0542be87c0..e24d8600a3 100644
--- a/src/bluez-manager/nm-bluez-manager.c
+++ b/src/bluez-manager/nm-bluez-manager.c
@@ -56,6 +56,9 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
+static void device_initialized (NMBluezDevice *device, gboolean success, NMBluezManager *self);
+static void device_usable (NMBluezDevice *device, GParamSpec *pspec, NMBluezManager *self);
+
static void
emit_bdaddr_added (NMBluezManager *self, NMBluezDevice *device)
{
@@ -82,6 +85,18 @@ nm_bluez_manager_query_devices (NMBluezManager *self)
}
static void
+remove_device (NMBluezManager *self, NMBluezDevice *device)
+{
+ if (nm_bluez_device_get_usable (device)) {
+ g_signal_emit (self, signals[BDADDR_REMOVED], 0,
+ nm_bluez_device_get_address (device),
+ nm_bluez_device_get_path (device));
+ }
+ g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_initialized), self);
+ g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_usable), self);
+}
+
+static void
device_usable (NMBluezDevice *device, GParamSpec *pspec, NMBluezManager *self)
{
gboolean usable = nm_bluez_device_get_usable (device);
@@ -139,11 +154,7 @@ device_removed (GDBusProxy *proxy, const gchar *path, NMBluezManager *self)
if (device) {
g_object_ref (device);
g_hash_table_remove (priv->devices, nm_bluez_device_get_path (device));
-
- g_signal_emit (self, signals[BDADDR_REMOVED], 0,
- nm_bluez_device_get_address (device),
- nm_bluez_device_get_path (device));
-
+ remove_device (NM_BLUEZ_MANAGER (self), device);
g_object_unref (device);
}
}
@@ -284,9 +295,7 @@ name_owner_changed_cb (NMDBusManager *dbus_mgr,
g_hash_table_iter_init (&iter, priv->devices);
while (g_hash_table_iter_next (&iter, NULL, (gpointer) &device))
- g_signal_emit (self, signals[BDADDR_REMOVED], 0,
- nm_bluez_device_get_address (device),
- nm_bluez_device_get_path (device));
+ remove_device (self, device);
g_hash_table_remove_all (priv->devices);
}
}
@@ -307,9 +316,7 @@ bluez_cleanup (NMBluezManager *self, gboolean do_signal)
if (do_signal) {
g_hash_table_iter_init (&iter, priv->devices);
while (g_hash_table_iter_next (&iter, NULL, (gpointer) &device))
- g_signal_emit (self, signals[BDADDR_REMOVED], 0,
- nm_bluez_device_get_address (device),
- nm_bluez_device_get_path (device));
+ remove_device (self, device);
}
g_hash_table_remove_all (priv->devices);