summaryrefslogtreecommitdiff
path: root/src/agent.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2012-12-17 12:12:05 +0200
committerJohan Hedberg <johan.hedberg@intel.com>2012-12-17 12:50:39 +0200
commit55ed9fe700efa1c023c01158599a9be3e116a6ee (patch)
tree57528d17237484655105deeb7188bfb42c7c3d96 /src/agent.c
parent2d35bbb15b3596f473e8db8448a05bec118c665b (diff)
downloadbluez-55ed9fe700efa1c023c01158599a9be3e116a6ee.tar.gz
core: Implement AgentManager1.RequestDefault
Diffstat (limited to 'src/agent.c')
-rw-r--r--src/agent.c36
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 ) },
{ }
};