diff options
author | Luiz Augusto Von Dentz <luiz.dentz-von@nokia.com> | 2009-12-30 14:24:11 +0200 |
---|---|---|
committer | Luiz Augusto Von Dentz <luiz.dentz-von@nokia.com> | 2009-12-31 11:11:34 +0200 |
commit | 8526308d7387b5c91767b2eebd2e1ec2abb5fb03 (patch) | |
tree | 4ab532ec86b052beedf3203e2ddbe266c970a62b /plugins/bluetooth.c | |
parent | 7eb2d1dbb241b1fc258402f57a6fac4dd2229feb (diff) | |
download | connman-8526308d7387b5c91767b2eebd2e1ec2abb5fb03.tar.gz connman-8526308d7387b5c91767b2eebd2e1ec2abb5fb03.tar.bz2 connman-8526308d7387b5c91767b2eebd2e1ec2abb5fb03.zip |
Port bluetooth driver to use g_dbus_add_signal_watch
Diffstat (limited to 'plugins/bluetooth.c')
-rw-r--r-- | plugins/bluetooth.c | 121 |
1 files changed, 59 insertions, 62 deletions
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c index 0647cc48..da150f2e 100644 --- a/plugins/bluetooth.c +++ b/plugins/bluetooth.c @@ -538,7 +538,8 @@ static void check_networks(struct connman_device *device, } } -static void adapter_changed(DBusConnection *connection, DBusMessage *message) +static gboolean adapter_changed(DBusConnection *connection, + DBusMessage *message, void *user_data) { const char *path = dbus_message_get_path(message); struct connman_device *device; @@ -549,10 +550,10 @@ static void adapter_changed(DBusConnection *connection, DBusMessage *message) device = g_hash_table_lookup(bluetooth_devices, path); if (device == NULL) - return; + return TRUE; if (dbus_message_iter_init(message, &iter) == FALSE) - return; + return TRUE; dbus_message_iter_get_basic(&iter, &key); @@ -572,6 +573,8 @@ static void adapter_changed(DBusConnection *connection, DBusMessage *message) } else if (g_str_equal(key, "Devices") == TRUE) { check_networks(device, &value); } + + return TRUE; } static void adapter_properties_reply(DBusPendingCall *call, void *user_data) @@ -676,6 +679,17 @@ done: dbus_message_unref(message); } +static gboolean adapter_added(DBusConnection *connection, DBusMessage *message, + void *user_data) +{ + const char *path; + + dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_INVALID); + add_adapter(connection, path); + return TRUE; +} + static void remove_adapter(DBusConnection *connection, const char *path) { DBG("path %s", path); @@ -683,6 +697,17 @@ static void remove_adapter(DBusConnection *connection, const char *path) g_hash_table_remove(bluetooth_devices, path); } +static gboolean adapter_removed(DBusConnection *connection, DBusMessage *message, + void *user_data) +{ + const char *path; + + dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_INVALID); + remove_adapter(connection, path); + return TRUE; +} + static void list_adapters_reply(DBusPendingCall *call, void *user_data) { DBusMessage *reply; @@ -774,40 +799,10 @@ static void bluetooth_disconnect(DBusConnection *connection, void *user_data) bluetooth_devices = NULL; } -static DBusHandlerResult bluetooth_signal(DBusConnection *connection, - DBusMessage *message, void *user_data) -{ - if (dbus_message_is_signal(message, BLUEZ_ADAPTER_INTERFACE, - PROPERTY_CHANGED) == TRUE) { - adapter_changed(connection, message); - } else if (dbus_message_is_signal(message, BLUEZ_MANAGER_INTERFACE, - ADAPTER_ADDED) == TRUE) { - const char *path; - dbus_message_get_args(message, NULL, - DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID); - add_adapter(connection, path); - } else if (dbus_message_is_signal(message, BLUEZ_MANAGER_INTERFACE, - ADAPTER_REMOVED) == TRUE) { - const char *path; - dbus_message_get_args(message, NULL, - DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID); - remove_adapter(connection, path); - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - static guint watch; - -static const char *added_rule = "type=signal,member=" ADAPTER_ADDED - ",interface=" BLUEZ_MANAGER_INTERFACE; -static const char *removed_rule = "type=signal,member=" ADAPTER_REMOVED - ",interface=" BLUEZ_MANAGER_INTERFACE; - -static const char *adapter_rule = "type=signal,member=" PROPERTY_CHANGED - ",interface=" BLUEZ_ADAPTER_INTERFACE; +static guint added_watch; +static guint removed_watch; +static guint adapter_watch; static int bluetooth_init(void) { @@ -817,10 +812,28 @@ static int bluetooth_init(void) if (connection == NULL) return -EIO; - if (dbus_connection_add_filter(connection, bluetooth_signal, - NULL, NULL) == FALSE) { + watch = g_dbus_add_service_watch(connection, BLUEZ_SERVICE, + bluetooth_connect, bluetooth_disconnect, NULL, NULL); + + added_watch = g_dbus_add_signal_watch(connection, NULL, NULL, + BLUEZ_MANAGER_INTERFACE, + ADAPTER_ADDED, adapter_added, + NULL, NULL); + + removed_watch = g_dbus_add_signal_watch(connection, NULL, NULL, + BLUEZ_MANAGER_INTERFACE, + ADAPTER_REMOVED, adapter_removed, + NULL, NULL); + + adapter_watch = g_dbus_add_signal_watch(connection, NULL, NULL, + BLUEZ_MANAGER_INTERFACE, + PROPERTY_CHANGED, adapter_changed, + NULL, NULL); + + if (watch == 0 || added_watch == 0 || removed_watch == 0 + || adapter_watch == 0) { err = -EIO; - goto unref; + goto remove; } err = connman_network_driver_register(&pan_driver); @@ -833,26 +846,14 @@ static int bluetooth_init(void) goto remove; } - watch = g_dbus_add_service_watch(connection, BLUEZ_SERVICE, - bluetooth_connect, bluetooth_disconnect, NULL, NULL); - if (watch == 0) { - connman_device_driver_unregister(&bluetooth_driver); - connman_network_driver_unregister(&pan_driver); - err = -EIO; - goto remove; - } - - dbus_bus_add_match(connection, added_rule, NULL); - dbus_bus_add_match(connection, removed_rule, NULL); - dbus_bus_add_match(connection, adapter_rule, NULL); - dbus_connection_flush(connection); - return 0; remove: - dbus_connection_remove_filter(connection, bluetooth_signal, NULL); + g_dbus_remove_watch(connection, watch); + g_dbus_remove_watch(connection, added_watch); + g_dbus_remove_watch(connection, removed_watch); + g_dbus_remove_watch(connection, adapter_watch); -unref: dbus_connection_unref(connection); return err; @@ -860,20 +861,16 @@ unref: static void bluetooth_exit(void) { - dbus_bus_remove_match(connection, adapter_rule, NULL); - dbus_bus_remove_match(connection, removed_rule, NULL); - dbus_bus_remove_match(connection, added_rule, NULL); - dbus_connection_flush(connection); - g_dbus_remove_watch(connection, watch); + g_dbus_remove_watch(connection, added_watch); + g_dbus_remove_watch(connection, removed_watch); + g_dbus_remove_watch(connection, adapter_watch); bluetooth_disconnect(connection, NULL); connman_device_driver_unregister(&bluetooth_driver); connman_network_driver_unregister(&pan_driver); - dbus_connection_remove_filter(connection, bluetooth_signal, NULL); - dbus_connection_unref(connection); } |