summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-04-16 18:20:08 -0300
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-04-16 18:20:08 -0300
commit999d9b9ac1f8e7d25f620661b99ae6068560c3f1 (patch)
treee691dd62a9be0cfa4b46396ff4fac9cc2a0b4fb9
parentdbfd944d832fbef2fb5ba9a69974697810f36d1a (diff)
downloadbluez-999d9b9ac1f8e7d25f620661b99ae6068560c3f1.tar.gz
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.
-rw-r--r--src/adapter.c22
-rw-r--r--src/adapter.h1
-rw-r--r--src/manager.c22
-rw-r--r--src/manager.h1
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);