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
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
g_free(session->filename);
g_free(session->agent_name);
g_free(session->agent_path);
+ g_free(session->owner);
g_free(session);
}
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
gchar *agent_name;
gchar *agent_path;
guint agent_watch;
+ gchar *owner; /* Session owner */
GPtrArray *pending;
};