diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2012-12-17 12:12:05 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-12-17 12:50:39 +0200 |
commit | 55ed9fe700efa1c023c01158599a9be3e116a6ee (patch) | |
tree | 57528d17237484655105deeb7188bfb42c7c3d96 /src/agent.c | |
parent | 2d35bbb15b3596f473e8db8448a05bec118c665b (diff) | |
download | bluez-55ed9fe700efa1c023c01158599a9be3e116a6ee.tar.gz |
core: Implement AgentManager1.RequestDefault
Diffstat (limited to 'src/agent.c')
-rw-r--r-- | src/agent.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/src/agent.c b/src/agent.c index ea2f7e54c..6c743f6e6 100644 --- a/src/agent.c +++ b/src/agent.c @@ -58,6 +58,7 @@ #define AGENT_INTERFACE "org.bluez.Agent1" static GHashTable *agent_list; +static struct agent *default_agent = NULL; typedef enum { AGENT_REQUEST_PASSKEY, @@ -174,6 +175,9 @@ void agent_unref(struct agent *agent) if (agent->ref > 0) return; + if (agent == default_agent) + default_agent = NULL; + if (agent->remove_cb) agent->remove_cb(agent, agent->remove_cb_data); @@ -216,13 +220,17 @@ struct agent *agent_get(const char *owner) struct agent *agent; agent = g_hash_table_lookup(agent_list, owner); - if (!agent) - agent = g_hash_table_lookup(agent_list, NULL); + if (agent) + return agent_ref(agent); - if (!agent) - return NULL; + if (default_agent) + return agent_ref(default_agent); - return agent_ref(agent); + agent = g_hash_table_lookup(agent_list, NULL); + if (agent) + return agent_ref(agent); + + return NULL; } struct agent *agent_create(struct btd_adapter *adapter, const char *name, @@ -953,12 +961,30 @@ static DBusMessage *unregister_agent(DBusConnection *conn, return dbus_message_new_method_return(msg); } +static DBusMessage *request_default(DBusConnection *conn, DBusMessage *msg, + void *user_data) +{ + struct agent *agent; + const char *sender; + + sender = dbus_message_get_sender(msg); + + agent = g_hash_table_lookup(agent_list, sender); + if (!agent) + return btd_error_does_not_exist(msg); + + default_agent = agent; + + return dbus_message_new_method_return(msg); +} + static const GDBusMethodTable methods[] = { { GDBUS_METHOD("RegisterAgent", GDBUS_ARGS({ "agent", "o"}, { "capability", "s" }), NULL, register_agent) }, { GDBUS_METHOD("UnregisterAgent", GDBUS_ARGS({ "agent", "o" }), NULL, unregister_agent) }, + { GDBUS_METHOD("RequestDefault", NULL, NULL, request_default ) }, { } }; |