diff --git a/src/adapter.c b/src/adapter.c
index 3d994c5..fadb905 100644
--- a/src/adapter.c
+++ b/src/adapter.c
gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
{
+ struct agent *agent;
+
adapter->up = up;
adapter->already_up = 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);
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 6b27608..5030cb0 100644
--- a/src/adapter.h
+++ b/src/adapter.h
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 823ce31..3c460de 100644
--- a/src/agent.c
+++ b/src/agent.c
#include "dbus-common.h"
#include "adapter.h"
#include "device.h"
+#include "manager.h"
#include "agent.h"
#define IO_CAPABILITY_DISPLAYONLY 0x00
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;
}
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)
if (agent->ref > 0)
return;
- if (agent == default_agent)
- default_agent = NULL;
-
if (agent->request) {
DBusError err;
agent_pincode_cb pincode_cb;
if (!agent)
return btd_error_does_not_exist(msg);
- default_agent = agent;
+ set_default_agent(agent);
return dbus_message_new_method_return(msg);
}
g_dbus_unregister_interface(btd_get_dbus_connection(),
"/org/bluez", "org.bluez.AgentManager1");
+ default_agent = NULL;
g_hash_table_destroy(agent_list);
}