Diff between 2632843b836aadad9c7d046ef9708cb8908313db and 2874ef9574923716c710862e85a4ab907ba44213

Changed Files

File Additions Deletions Status
obexd/client/main.c +2 -0 modified
obexd/client/session.c +53 -0 modified
obexd/client/session.h +1 -0 modified

Full Patch

diff --git a/obexd/client/main.c b/obexd/client/main.c
index 259d4b0..9595af9 100644
--- a/obexd/client/main.c
+++ b/obexd/client/main.c
@@ -60,6 +60,8 @@ static void create_callback(struct session_data *session, void *user_data)
 		goto done;
 	}
 
+	session->owner = g_strdup(data->sender);
+
 	if (session->target != NULL) {
 		session_register(session);
 		g_dbus_send_reply(data->connection, data->message,
diff --git a/obexd/client/session.c b/obexd/client/session.c
index 90926ad..bdd55d3 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
@@ -115,6 +115,7 @@ static void session_unref(struct session_data *session)
 	g_free(session->filename);
 	g_free(session->agent_name);
 	g_free(session->agent_path);
+	g_free(session->owner);
 	g_free(session);
 }
 
@@ -732,10 +733,62 @@ static DBusMessage *release_agent(DBusConnection *connection,
 	return dbus_message_new_method_return(message);
 }
 
+static void session_shutdown(struct session_data *session)
+{
+	if (session->transfer_path) {
+		agent_notify_error(session->conn, session->agent_name,
+				session->agent_path, session->transfer_path,
+				"The transfer was cancelled");
+
+		g_dbus_unregister_interface(session->conn,
+				session->transfer_path, TRANSFER_INTERFACE);
+		g_free(session->transfer_path);
+
+		session->transfer_path = NULL;
+	}
+
+	if (session->xfer) {
+		gw_obex_xfer_abort(session->xfer, NULL);
+
+		gw_obex_xfer_free(session->xfer);
+		session->xfer = NULL;
+
+		g_free(session->filename);
+		session->filename = NULL;
+
+		g_free(session->name);
+		session->name = NULL;
+
+		/* the transfer was holding a session ref */
+		session_unref(session);
+	}
+
+	session_unref(session);
+}
+
+static DBusMessage *close_session(DBusConnection *connection,
+				DBusMessage *message, void *user_data)
+{
+	struct session_data *session = user_data;
+	const gchar *sender;
+
+	sender = dbus_message_get_sender(message);
+	if (g_str_equal(sender, session->owner) == FALSE)
+		return g_dbus_create_error(message,
+				"org.openobex.Error.NotAuthorized",
+				"Not Authorized");
+
+	session_shutdown(session);
+
+	return dbus_message_new_method_return(message);
+}
+
+
 static GDBusMethodTable session_methods[] = {
 	{ "GetProperties",	"", "a{sv}",	get_properties	},
 	{ "AssignAgent",	"o", "",	assign_agent	},
 	{ "ReleaseAgent",	"o", "",	release_agent	},
+	{ "Close",		"", "",		close_session	},
 	{ }
 };
 
diff --git a/obexd/client/session.h b/obexd/client/session.h
index 6e400ae..affe7f3 100644
--- a/obexd/client/session.h
+++ b/obexd/client/session.h
@@ -52,6 +52,7 @@ struct session_data {
 	gchar *agent_name;
 	gchar *agent_path;
 	guint agent_watch;
+	gchar *owner;		/* Session owner */
 	GPtrArray *pending;
 };