diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2008-03-14 19:16:30 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-03-14 19:16:30 +0000 |
commit | 6a61b7495a0557ce79499a6815cdfbe672bf6cfb (patch) | |
tree | 5e7511a83ecbf300954a530d0fe73f7100feaef8 /hcid/adapter.c | |
parent | f53dce601c8b8ee28bc8b5d354aaa56b454b1a71 (diff) |
Add initial code for new agent interface
Diffstat (limited to 'hcid/adapter.c')
-rw-r--r-- | hcid/adapter.c | 56 |
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; } |