Diff between c21b0f9d014caf9acb9dbe8f98d5b7f8346e4aa6 and 84f15bd2da631ebeef8513d59c5b84f017ed5baa

Changed Files

File Additions Deletions Status
obexd/client/session.c +64 -0 modified

Full Patch

diff --git a/obexd/client/session.c b/obexd/client/session.c
index e39f5b1..e1a6c88 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
@@ -561,15 +561,79 @@ static GDBusMethodTable transfer_methods[] = {
 	{ }
 };
 
+static void agent_disconnected(DBusConnection *connection, void *user_data)
+{
+	struct session_data *session = user_data;
+
+	if (session->agent_name) {
+		g_free(session->agent_name);
+		session->agent_name = NULL;
+	}
+
+	if (session->agent_path) {
+		g_free(session->agent_path);
+		session->agent_path = NULL;
+	}
+}
+
 static DBusMessage *assign_agent(DBusConnection *connection,
 				DBusMessage *message, void *user_data)
 {
+	struct session_data *session = user_data;
+	const gchar *sender;
+	gchar *path;
+
+	if (dbus_message_get_args(message, NULL,
+					DBUS_TYPE_OBJECT_PATH, &path,
+					DBUS_TYPE_INVALID) == FALSE)
+		return g_dbus_create_error(message,
+				"org.openobex.Error.InvalidArguments",
+				"Invalid arguments in method call");
+
+	if (session->agent_path != NULL || session->agent_name != NULL)
+		return g_dbus_create_error(message,
+				"org.openobex.Error.AlreadyExists",
+				"Already exists");
+
+	sender = dbus_message_get_sender(message);
+
+	session->agent_name = g_strdup(sender);
+	session->agent_path = g_strdup(path);
+
+	g_dbus_add_disconnect_watch(connection, sender,
+				agent_disconnected, session, NULL);
+
 	return dbus_message_new_method_return(message);
 }
 
 static DBusMessage *release_agent(DBusConnection *connection,
 				DBusMessage *message, void *user_data)
 {
+	struct session_data *session = user_data;
+	const gchar *sender;
+	gchar *path;
+
+	if (dbus_message_get_args(message, NULL,
+					DBUS_TYPE_OBJECT_PATH, &path,
+					DBUS_TYPE_INVALID) == FALSE)
+		return g_dbus_create_error(message,
+				"org.openobex.Error.InvalidArguments",
+				"Invalid arguments in method call");
+
+	sender = dbus_message_get_sender(message);
+
+	if (g_str_equal(sender, session->agent_name) == FALSE ||
+				g_str_equal(path, session->agent_path) == FALSE)
+		return g_dbus_create_error(message,
+				"org.openobex.Error.NotAuthorized",
+				"Not Authorized");
+
+	g_free(session->agent_name);
+	session->agent_name = NULL;
+
+	g_free(session->agent_path);
+	session->agent_path = NULL;
+
 	return dbus_message_new_method_return(message);
 }