diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-08-10 16:11:07 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-08-10 16:57:47 +0200 |
commit | 3a9cb2d04060da71765e2b52898b80a0fcf2ef21 (patch) | |
tree | 8de0fca0e3acec2d240f3c88e856865972949e9f /plugins/bluetooth.c | |
parent | 5a44160d91e5214c0506cae8c79e13d994031200 (diff) | |
download | connman-3a9cb2d04060da71765e2b52898b80a0fcf2ef21.tar.gz connman-3a9cb2d04060da71765e2b52898b80a0fcf2ef21.tar.bz2 connman-3a9cb2d04060da71765e2b52898b80a0fcf2ef21.zip |
Watch for Bluetooth device changes
By watching for UUIDs changes, the Bluetooth networks are created at
pairing time, no need to restart ConnMan to see them showing up.
Diffstat (limited to 'plugins/bluetooth.c')
-rw-r--r-- | plugins/bluetooth.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c index 410d0bb9..2bc32c3e 100644 --- a/plugins/bluetooth.c +++ b/plugins/bluetooth.c @@ -534,6 +534,31 @@ static gboolean adapter_changed(DBusConnection *connection, return TRUE; } +static gboolean device_changed(DBusConnection *connection, + DBusMessage *message, void *user_data) +{ + const char *path = dbus_message_get_path(message); + DBusMessageIter iter, value; + const char *key; + + DBG("path %s", path); + + if (dbus_message_iter_init(message, &iter) == FALSE) + return TRUE; + + dbus_message_iter_get_basic(&iter, &key); + + dbus_message_iter_next(&iter); + dbus_message_iter_recurse(&iter, &value); + + DBG("key %s", key); + + if (g_str_equal(key, "UUIDs") == TRUE) + add_network(NULL, path); + + return TRUE; +} + static void adapter_properties_reply(DBusPendingCall *call, void *user_data) { char *path = user_data; @@ -903,6 +928,7 @@ static guint watch; static guint added_watch; static guint removed_watch; static guint adapter_watch; +static guint device_watch; static guint network_watch; static int bluetooth_init(void) @@ -931,13 +957,19 @@ static int bluetooth_init(void) PROPERTY_CHANGED, adapter_changed, NULL, NULL); + device_watch = g_dbus_add_signal_watch(connection, NULL, NULL, + BLUEZ_DEVICE_INTERFACE, + PROPERTY_CHANGED, device_changed, + NULL, NULL); + network_watch = g_dbus_add_signal_watch(connection, NULL, NULL, BLUEZ_NETWORK_INTERFACE, PROPERTY_CHANGED, network_changed, NULL, NULL); if (watch == 0 || added_watch == 0 || removed_watch == 0 - || adapter_watch == 0 || network_watch == 0) { + || adapter_watch == 0 || network_watch == 0 + || device_watch == 0) { err = -EIO; goto remove; } @@ -966,6 +998,7 @@ remove: g_dbus_remove_watch(connection, added_watch); g_dbus_remove_watch(connection, removed_watch); g_dbus_remove_watch(connection, adapter_watch); + g_dbus_remove_watch(connection, device_watch); g_dbus_remove_watch(connection, network_watch); dbus_connection_unref(connection); @@ -979,6 +1012,7 @@ static void bluetooth_exit(void) g_dbus_remove_watch(connection, added_watch); g_dbus_remove_watch(connection, removed_watch); g_dbus_remove_watch(connection, adapter_watch); + g_dbus_remove_watch(connection, device_watch); g_dbus_remove_watch(connection, network_watch); bluetooth_disconnect(connection, NULL); |