#include <config.h>
#endif
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gdbus.h>
+
#include "connman.h"
-int __connman_agent_init(void)
+static DBusConnection *connection = NULL;
+static guint agent_watch = 0;
+static gchar *agent_path = NULL;
+static gchar *agent_sender = NULL;
+
+static void agent_free(void)
{
- DBG("");
+ agent_watch = 0;
- return 0;
+ g_free(agent_sender);
+ agent_sender = NULL;
+
+ g_free(agent_path);
+ agent_path = NULL;
}
-void __connman_agent_cleanup(void)
+static gboolean agent_disconnect(void *data)
+{
+ DBG("data %p", data);
+
+ agent_free();
+
+ return TRUE;
+}
+
+int __connman_agent_register(const char *sender, const char *path)
{
- DBG("");
+ DBG("sender %s path %s", sender, path);
+
+ if (agent_path != NULL)
+ return -EEXIST;
+
+ agent_sender = g_strdup(sender);
+ agent_path = g_strdup(path);
+
+ agent_watch = g_dbus_add_disconnect_watch(connection, sender,
+ agent_disconnect, NULL, NULL);
+
+ return 0;
}
-int __connman_agent_register(const char *path)
+int __connman_agent_unregister(const char *sender, const char *path)
{
- DBG("");
+ DBG("sender %s path %s", sender, path);
+
+ if (agent_path == NULL)
+ return -ENOENT;
+
+ if (agent_watch > 0)
+ g_dbus_remove_watch(connection, agent_watch);
+
+ agent_free();
return 0;
}
-int __connman_agent_unregister(const char *path)
+int __connman_agent_init(DBusConnection *conn)
{
- DBG("");
+ DBG("conn %p", conn);
+
+ connection = dbus_connection_ref(conn);
+ if (connection == NULL)
+ return -1;
return 0;
}
+
+void __connman_agent_cleanup(void)
+{
+ DBusMessage *msg;
+
+ DBG("conn %p", connection);
+
+ if (agent_watch > 0)
+ g_dbus_remove_watch(connection, agent_watch);
+
+ msg = dbus_message_new_method_call(agent_sender, agent_path,
+ CONNMAN_AGENT_INTERFACE, "Release");
+
+ dbus_message_set_no_reply(msg, TRUE);
+
+ dbus_connection_send(connection, msg, NULL);
+
+ dbus_message_unref(msg);
+
+ agent_free();
+
+ dbus_connection_unref(connection);
+}
#define CONNMAN_SERVICE "org.freedesktop.connman"
+#define CONNMAN_AGENT_INTERFACE CONNMAN_SERVICE ".Agent"
+
#define CONNMAN_MANAGER_PATH "/"
#define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager"
int __connman_manager_init(DBusConnection *conn, int compat);
void __connman_manager_cleanup(void);
-int __connman_agent_init(void);
+int __connman_agent_init(DBusConnection *conn);
void __connman_agent_cleanup(void);
-int __connman_agent_register(const char *path);
-int __connman_agent_unregister(const char *path);
+int __connman_agent_register(const char *sender, const char *path);
+int __connman_agent_unregister(const char *sender, const char *path);
#include <connman/plugin.h>
DBusMessage *msg, void *data)
{
DBusMessage *reply;
- const char *path;
+ const char *sender, *path;
DBG("conn %p", conn);
+ sender = dbus_message_get_sender(msg);
+
dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
dbus_message_append_args(reply, DBUS_TYPE_INVALID);
- __connman_agent_register(path);
+ __connman_agent_register(sender, path);
return reply;
}
DBusMessage *msg, void *data)
{
DBusMessage *reply;
- const char *path;
+ const char *sender, *path;
DBG("conn %p", conn);
+ sender = dbus_message_get_sender(msg);
+
dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
dbus_message_append_args(reply, DBUS_TYPE_INVALID);
- __connman_agent_unregister(path);
+ __connman_agent_unregister(sender, path);
return reply;
}