summaryrefslogtreecommitdiffstats
path: root/hcid/adapter.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2008-03-14 19:16:30 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2008-03-14 19:16:30 +0000
commit6a61b7495a0557ce79499a6815cdfbe672bf6cfb (patch)
tree5e7511a83ecbf300954a530d0fe73f7100feaef8 /hcid/adapter.c
parentf53dce601c8b8ee28bc8b5d354aaa56b454b1a71 (diff)
Add initial code for new agent interface
Diffstat (limited to 'hcid/adapter.c')
-rw-r--r--hcid/adapter.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c
index e26e2af6..0b1a3c9f 100644
--- a/hcid/adapter.c
+++ b/hcid/adapter.c
@@ -64,6 +64,7 @@
#include "error.h"
#include "glib-helper.h"
#include "logging.h"
+#include "agent.h"
#define NUM_ELEMENTS(table) (sizeof(table)/sizeof(const char *))
@@ -3621,33 +3622,76 @@ static DBusHandlerResult find_device(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
+static void agent_exited(const char *name, struct adapter *adapter)
+{
+ debug("Agent %s exited without calling Unregister", name);
+
+ agent_destroy(adapter->agent, TRUE);
+
+ adapter->agent = NULL;
+}
+
+static void agent_removed(struct agent *agent, struct adapter *adapter)
+{
+ if (adapter->agent == agent)
+ adapter->agent = NULL;
+}
+
static DBusHandlerResult register_agent(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- char *agent_path;
+ const char *path, *name;
+ struct agent *agent;
+ struct adapter *adapter = data;
if (!hcid_dbus_use_experimental())
return error_unknown_method(conn, msg);
- if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH,
- &agent_path, DBUS_TYPE_INVALID))
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID))
return error_invalid_arguments(conn, msg, NULL);
+ if (adapter->agent)
+ return error_already_exists(conn, msg, "Agent already exists");
+
+ name = dbus_message_get_sender(msg);
+
+ agent = agent_create(name, path, NULL,
+ (agent_remove_cb) agent_removed, adapter);
+ if (!agent)
+ return error_failed(conn, msg, "Failed to create a new agent");
+
+ adapter->agent = agent;
+
+ name_listener_add(conn, name, (name_cb_t) agent_exited, adapter);
+
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult unregister_agent(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- char *agent_path;
+ const char *path, *name;
+ struct adapter *adapter = data;
if (!hcid_dbus_use_experimental())
return error_unknown_method(conn, msg);
- if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH,
- &agent_path, DBUS_TYPE_INVALID))
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID))
return error_invalid_arguments(conn, msg, NULL);
+ name = dbus_message_get_sender(msg);
+
+ if (!adapter->agent || !agent_matches(adapter->agent, name, path))
+ return error_does_not_exist(conn, msg, "No such agent");
+
+ name_listener_remove(conn, name, (name_cb_t) agent_exited,
+ adapter);
+
+ agent_destroy(adapter->agent, FALSE);
+ adapter->agent = NULL;
+
return DBUS_HANDLER_RESULT_HANDLED;
}