From 4711fff515c7d510ec7018640b316cfb7f181760 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 17 Dec 2012 12:33:40 +0200 Subject: [PATCH] core: Update adapter IO capability based on default agent --- src/adapter.c | 14 ++++++++++++++ src/adapter.h | 2 ++ src/agent.c | 30 ++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 3d994c5db..fadb905d6 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -2793,6 +2793,8 @@ static void load_config(struct btd_adapter *adapter) gboolean adapter_init(struct btd_adapter *adapter, gboolean up) { + struct agent *agent; + adapter->up = up; adapter->already_up = up; @@ -2805,6 +2807,13 @@ gboolean adapter_init(struct btd_adapter *adapter, gboolean up) return FALSE; } + agent = agent_get(NULL); + if (agent) { + uint8_t io_cap = agent_get_io_capability(agent); + adapter_set_io_capability(adapter, io_cap); + agent_unref(agent); + } + sdp_init_services_list(&adapter->bdaddr); btd_adapter_gatt_server_start(adapter); @@ -3601,6 +3610,11 @@ void adapter_bonding_complete(struct btd_adapter *adapter, check_oob_bonding_complete(adapter, bdaddr, status); } +int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap) +{ + return mgmt_set_io_capability(adapter->dev_id, io_cap); +} + int btd_adapter_read_local_oob_data(struct btd_adapter *adapter) { return mgmt_read_local_oob_data(adapter->dev_id); diff --git a/src/adapter.h b/src/adapter.h index 6b27608dd..5030cb0c2 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -209,6 +209,8 @@ void adapter_bonding_complete(struct btd_adapter *adapter, const bdaddr_t *bdaddr, uint8_t addr_type, uint8_t status); +int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap); + int btd_adapter_read_local_oob_data(struct btd_adapter *adapter); void adapter_read_local_oob_data_complete(struct btd_adapter *adapter, uint8_t *hash, uint8_t *randomizer); diff --git a/src/agent.c b/src/agent.c index 823ce3102..3c460de10 100644 --- a/src/agent.c +++ b/src/agent.c @@ -45,6 +45,7 @@ #include "dbus-common.h" #include "adapter.h" #include "device.h" +#include "manager.h" #include "agent.h" #define IO_CAPABILITY_DISPLAYONLY 0x00 @@ -140,6 +141,23 @@ static void agent_request_free(struct agent_request *req, gboolean destroy) g_free(req); } +static void set_io_cap(struct btd_adapter *adapter, gpointer user_data) +{ + struct agent *agent = user_data; + + adapter_set_io_capability(adapter, agent->capability); +} + +static void set_default_agent(struct agent *agent) +{ + if (default_agent == agent) + return; + + default_agent = agent; + + manager_foreach_adapter(set_io_cap, agent); +} + static void agent_disconnect(DBusConnection *conn, void *user_data) { struct agent *agent = user_data; @@ -152,6 +170,12 @@ static void agent_disconnect(DBusConnection *conn, void *user_data) } g_hash_table_remove(agent_list, agent->owner); + + agent = agent_get(NULL); + if (agent) { + set_default_agent(agent); + agent_unref(agent); + } } struct agent *agent_ref(struct agent *agent) @@ -172,9 +196,6 @@ void agent_unref(struct agent *agent) if (agent->ref > 0) return; - if (agent == default_agent) - default_agent = NULL; - if (agent->request) { DBusError err; agent_pincode_cb pincode_cb; @@ -963,7 +984,7 @@ static DBusMessage *request_default(DBusConnection *conn, DBusMessage *msg, if (!agent) return btd_error_does_not_exist(msg); - default_agent = agent; + set_default_agent(agent); return dbus_message_new_method_return(msg); } @@ -993,5 +1014,6 @@ void btd_agent_cleanup(void) g_dbus_unregister_interface(btd_get_dbus_connection(), "/org/bluez", "org.bluez.AgentManager1"); + default_agent = NULL; g_hash_table_destroy(agent_list); } -- 2.47.3