From 999d9b9ac1f8e7d25f620661b99ae6068560c3f1 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 16 Apr 2009 18:20:08 -0300 Subject: Emit Manager.AdapterAdded only when adapter is ready. Emitting Manager.AdapterAdded without adapter being ready may cause Adapter.GetProperties to return properties in an invalid state. --- src/adapter.c | 22 ++++++++++++++-------- src/adapter.h | 1 + src/manager.c | 22 ++++++++++------------ src/manager.h | 1 + 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 44a93b1aa..a60fa77fb 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1243,7 +1243,7 @@ static DBusMessage *get_properties(DBusConnection *conn, dict_append_entry(&dict, "Class", DBUS_TYPE_UINT32, &class); /* Powered */ - value = adapter->up ? TRUE : FALSE; + value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE; dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value); /* Discoverable */ @@ -2057,15 +2057,10 @@ static int adapter_up(struct btd_adapter *adapter, int dd) } proceed: - if (dev_down == FALSE) { + if (dev_down == FALSE) hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &scan_mode); - emit_property_changed(connection, adapter->path, - ADAPTER_INTERFACE, "Powered", - DBUS_TYPE_BOOLEAN, &powered); - } - if (adapter->initialized == FALSE) { load_drivers(adapter); load_devices(adapter); @@ -2077,12 +2072,18 @@ proceed: adapter->initialized = TRUE; adapter_update(adapter, 0, FALSE); + + manager_add_adapter(adapter->path); } if (dev_down) { ioctl(dd, HCIDEVDOWN, adapter->dev_id); + adapter->off_requested = TRUE; return 1; - } + } else + emit_property_changed(connection, adapter->path, + ADAPTER_INTERFACE, "Powered", + DBUS_TYPE_BOOLEAN, &powered); return 0; } @@ -2520,6 +2521,11 @@ int adapter_get_state(struct btd_adapter *adapter) return adapter->state; } +gboolean adapter_is_ready(struct btd_adapter *adapter) +{ + return adapter->initialized; +} + struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter, struct remote_dev_info *match) { diff --git a/src/adapter.h b/src/adapter.h index 6d9dd2c90..8111d6f39 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -106,6 +106,7 @@ const gchar *adapter_get_path(struct btd_adapter *adapter); void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr); void adapter_set_state(struct btd_adapter *adapter, int state); int adapter_get_state(struct btd_adapter *adapter); +gboolean adapter_is_ready(struct btd_adapter *adapter); struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter, struct remote_dev_info *match); void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr, diff --git a/src/manager.c b/src/manager.c index 761affbda..0cf0d59bc 100644 --- a/src/manager.c +++ b/src/manager.c @@ -227,6 +227,10 @@ static DBusMessage *get_properties(DBusConnection *conn, array = g_new0(char *, g_slist_length(adapters) + 1); for (i = 0, list = adapters; list; list = list->next, i++) { struct btd_adapter *adapter = list->data; + + if (!adapter_is_ready(adapter)) + continue; + array[i] = (char *) adapter_get_path(adapter); } dict_append_array(&dict, "Adapters", DBUS_TYPE_OBJECT_PATH, &array, i); @@ -273,6 +277,10 @@ static void manager_update_adapters(void) array = g_new0(char *, g_slist_length(adapters) + 1); for (i = 0, list = adapters; list; list = list->next, i++) { struct btd_adapter *adapter = list->data; + + if (!adapter_is_ready(adapter)) + continue; + array[i] = (char *) adapter_get_path(adapter); } @@ -405,23 +413,13 @@ GSList *manager_get_adapters(void) return adapters; } -static void manager_add_adapter(struct btd_adapter *adapter) +void manager_add_adapter(const char *path) { - const gchar *path = adapter_get_path(adapter); - - adapters = g_slist_append(adapters, adapter); - g_dbus_emit_signal(connection, "/", MANAGER_INTERFACE, "AdapterAdded", DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); - if (default_adapter_id < 0) { - int new_default = hci_get_route(NULL); - - manager_set_default_adapter(new_default); - } - manager_update_adapters(); } @@ -439,7 +437,7 @@ int manager_register_adapter(int id, gboolean devup) if (!adapter) return -1; - manager_add_adapter(adapter); + adapters = g_slist_append(adapters, adapter); return 0; } diff --git a/src/manager.h b/src/manager.h index 3df19ac5b..9a959c78b 100644 --- a/src/manager.h +++ b/src/manager.h @@ -37,6 +37,7 @@ int manager_register_adapter(int id, gboolean devup); int manager_unregister_adapter(int id); int manager_start_adapter(int id); int manager_stop_adapter(int id); +void manager_add_adapter(const char *path); int manager_get_default_adapter(); void manager_set_default_adapter(int id); int manager_update_adapter(uint16_t id, uint8_t svc, gboolean starting); -- cgit v1.2.1