diff options
author | Vinicius Costa Gomes <vinicius.gomes@openbossa.org> | 2008-11-10 10:37:14 -0300 |
---|---|---|
committer | Vinicius Costa Gomes <vinicius.gomes@openbossa.org> | 2008-11-10 10:37:14 -0300 |
commit | a2aaa3c0b87e7721c0e32a33ff741512e289fdef (patch) | |
tree | 5e79f1aa6cfc6a43a96f88f72ae3494bf29e4122 | |
parent | b39e5b3eecb0473a261bb1e95c954076ecec89f4 (diff) | |
download | obexd-a2aaa3c0b87e7721c0e32a33ff741512e289fdef.tar.gz |
Adds Session Close method
-rw-r--r-- | client/main.c | 2 | ||||
-rw-r--r-- | client/session.c | 53 | ||||
-rw-r--r-- | client/session.h | 1 |
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; }; |