From 4e0fc2150dece1a949183fdbf8bca820ae497da9 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Fri, 27 Feb 2015 16:01:07 +0200 Subject: [PATCH] agent: DBus agent register and unregister Implement DBus agent register and unregister functions. --- src/agent.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/src/agent.c b/src/agent.c index 2bfcef5f..feb72237 100644 --- a/src/agent.c +++ b/src/agent.c @@ -30,18 +30,120 @@ #include "src/dbus.h" #include "src/agent.h" +struct agent { + char *owner; + char *path; + unsigned int disconnect_watch; + uint32_t pending_id; + struct l_timeout *timeout; + int timeout_secs; + struct l_queue *requests; +}; + +static struct agent *default_agent = NULL; + +static void agent_free(void *data) +{ + struct agent *agent = data; + + l_debug("agent free %p", agent); + + if (agent->timeout) + l_timeout_remove(agent->timeout); + + if (agent->disconnect_watch) + l_dbus_remove_watch(dbus_get_bus(), agent->disconnect_watch); + + l_free(agent->owner); + l_free(agent->path); + l_free(agent); + + default_agent = NULL; +} + +static void agent_disconnect(struct l_dbus *dbus, void *user_data) +{ + struct agent *agent = user_data; + + l_debug("agent %s disconnected", agent->owner); + + l_idle_oneshot(agent_free, agent, NULL); +} + +static struct agent *agent_create(struct l_dbus *dbus, const char *name, + const char *path) +{ + struct agent *agent; + + agent = l_new(struct agent, 1); + + agent->owner = l_strdup(name); + agent->path = l_strdup(path); + agent->requests = l_queue_new(); + agent->disconnect_watch = l_dbus_add_disconnect_watch(dbus, name, + agent_disconnect, + agent, NULL); + return agent; +} + static struct l_dbus_message *agent_register(struct l_dbus *dbus, struct l_dbus_message *message, void *user_data) { - return NULL; + struct l_dbus_message *reply; + struct agent *agent; + const char *path; + + if (default_agent) + return dbus_error_already_exists(message); + + l_debug("agent register called"); + + if (!l_dbus_message_get_arguments(message, "o", &path)) + return dbus_error_invalid_args(message); + + agent = agent_create(dbus, l_dbus_message_get_sender(message), path); + if (!agent) + return dbus_error_failed(message); + + default_agent = agent; + + l_debug("agent %s path %s", agent->owner, agent->path); + + reply = l_dbus_message_new_method_return(message); + + l_dbus_message_set_arguments(reply, ""); + + return reply; } static struct l_dbus_message *agent_unregister(struct l_dbus *dbus, struct l_dbus_message *message, void *user_data) { - return NULL; + struct l_dbus_message *reply; + const char *path, *sender; + + if (!default_agent) + return dbus_error_failed(message); + + l_debug("agent unregister"); + + if (!l_dbus_message_get_arguments(message, "o", &path)) + return dbus_error_invalid_args(message); + + sender = l_dbus_message_get_sender(message); + + if (!strcmp(default_agent->owner, sender)) + return dbus_error_not_found(message); + + agent_free(default_agent); + + reply = l_dbus_message_new_method_return(message); + + l_dbus_message_set_arguments(reply, ""); + + return reply; } bool agent_setup(struct l_dbus_interface *interface)