summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>2008-11-10 10:37:14 -0300
committerVinicius Costa Gomes <vinicius.gomes@openbossa.org>2008-11-10 10:37:14 -0300
commita2aaa3c0b87e7721c0e32a33ff741512e289fdef (patch)
tree5e79f1aa6cfc6a43a96f88f72ae3494bf29e4122
parentb39e5b3eecb0473a261bb1e95c954076ecec89f4 (diff)
downloadobexd-a2aaa3c0b87e7721c0e32a33ff741512e289fdef.tar.gz
Adds Session Close method
-rw-r--r--client/main.c2
-rw-r--r--client/session.c53
-rw-r--r--client/session.h1
3 files changed, 56 insertions, 0 deletions
diff --git a/client/main.c b/client/main.c
index 259d4b0..9595af9 100644
--- a/client/main.c
+++ b/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/client/session.c b/client/session.c
index 90926ad..bdd55d3 100644
--- a/client/session.c
+++ b/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/client/session.h b/client/session.h
index 6e400ae..affe7f3 100644
--- a/client/session.h
+++ b/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;
};