From: Jaganath Kanakkassery <jaganath.k@samsung.com>
To: linux-bluetooth@vger.kernel.org
Cc: Jaganath Kanakkassery <jaganath.k@samsung.com>
Subject: [PATCH obexd v2 2/3] client: Wait for abort completion before Transfer.Cancel returns
Date: Fri, 04 May 2012 15:27:05 +0530 [thread overview]
Message-ID: <1336125426-30445-2-git-send-email-jaganath.k@samsung.com> (raw)
In-Reply-To: <1336125426-30445-1-git-send-email-jaganath.k@samsung.com>
A new callback is given to g_obex_cancel_transfer() which will be
called when abort completes and then only "Cancel" method reply will
be sent to user
---
client/transfer.c | 65 ++++++++++++++++++++++++++++++++++------------------
1 files changed, 42 insertions(+), 23 deletions(-)
diff --git a/client/transfer.c b/client/transfer.c
index 411a7c0..d796239 100644
--- a/client/transfer.c
+++ b/client/transfer.c
@@ -59,6 +59,7 @@ struct obc_transfer {
struct obc_transfer_params *params;
struct transfer_callback *callback;
DBusConnection *conn;
+ DBusMessage *msg;
char *agent; /* Transfer agent */
char *path; /* Transfer path */
gchar *filename; /* Transfer file location */
@@ -136,37 +137,51 @@ static DBusMessage *obc_transfer_get_properties(DBusConnection *connection,
return reply;
}
-static void obc_transfer_abort(struct obc_transfer *transfer)
+static void abort_complete(GObex *obex, GError *err, gpointer user_data)
{
+ struct obc_transfer *transfer = user_data;
struct transfer_callback *callback = transfer->callback;
+ DBusMessage *reply;
- if (transfer->xfer > 0) {
- g_obex_cancel_transfer(transfer->xfer);
- transfer->xfer = 0;
- }
+ transfer->xfer = 0;
- if (transfer->obex != NULL) {
- g_obex_unref(transfer->obex);
- transfer->obex = NULL;
- }
+ reply = dbus_message_new_method_return(transfer->msg);
+ if (reply)
+ g_dbus_send_message(transfer->conn, reply);
- if (callback) {
- GError *err;
+ dbus_message_unref(transfer->msg);
+ transfer->msg = NULL;
- err = g_error_new(OBC_TRANSFER_ERROR, -ECANCELED, "%s",
- strerror(ECANCELED));
- callback->func(transfer, transfer->transferred, err,
+ if (callback) {
+ if (err) {
+ callback->func(transfer, transfer->transferred, err,
callback->data);
- g_error_free(err);
+ } else {
+ GError *abort_err;
+
+ abort_err = g_error_new(OBC_TRANSFER_ERROR, -ECANCELED, "%s",
+ "Transfer cancelled by user");
+ callback->func(transfer, transfer->transferred, abort_err,
+ callback->data);
+ g_error_free(abort_err);
+ }
}
}
+static gboolean obc_transfer_abort(struct obc_transfer *transfer)
+{
+ if (transfer->xfer == 0)
+ return FALSE;
+
+ return g_obex_cancel_transfer(transfer->xfer, abort_complete,
+ transfer);
+}
+
static DBusMessage *obc_transfer_cancel(DBusConnection *connection,
DBusMessage *message, void *user_data)
{
struct obc_transfer *transfer = user_data;
const gchar *sender;
- DBusMessage *reply;
sender = dbus_message_get_sender(message);
if (g_strcmp0(transfer->agent, sender) != 0)
@@ -174,18 +189,19 @@ static DBusMessage *obc_transfer_cancel(DBusConnection *connection,
"org.openobex.Error.NotAuthorized",
"Not Authorized");
- reply = dbus_message_new_method_return(message);
- if (!reply)
- return NULL;
+ if (!obc_transfer_abort(transfer))
+ return g_dbus_create_error(message,
+ "org.openobex.Error.Failed",
+ "Failed");
- obc_transfer_abort(transfer);
+ transfer->msg = dbus_message_ref(message);
- return reply;
+ return NULL;
}
static GDBusMethodTable obc_transfer_methods[] = {
{ "GetProperties", "", "a{sv}", obc_transfer_get_properties },
- { "Cancel", "", "", obc_transfer_cancel },
+ { "Cancel", "", "", obc_transfer_cancel, G_DBUS_METHOD_FLAG_ASYNC },
{ }
};
@@ -194,7 +210,7 @@ static void obc_transfer_free(struct obc_transfer *transfer)
DBG("%p", transfer);
if (transfer->xfer)
- g_obex_cancel_transfer(transfer->xfer);
+ g_obex_cancel_transfer(transfer->xfer, NULL, NULL);
if (transfer->op == G_OBEX_OP_GET &&
transfer->transferred != transfer->size)
@@ -211,6 +227,9 @@ static void obc_transfer_free(struct obc_transfer *transfer)
if (transfer->conn)
dbus_connection_unref(transfer->conn);
+ if (transfer->msg)
+ dbus_message_unref(transfer->msg);
+
if (transfer->obex)
g_obex_unref(transfer->obex);
--
1.7.1
next prev parent reply other threads:[~2012-05-04 9:57 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-04 9:57 [PATCH obexd v2 1/3] gobex: Add callback and userdata parameter to g_obex_cancel_transfer() Jaganath Kanakkassery
2012-05-04 9:57 ` Jaganath Kanakkassery [this message]
2012-05-04 9:57 ` [PATCH obexd v2 3/3] gobex: Remove g_idle_add to exit main loop in test_stream_put_req_abort() Jaganath Kanakkassery
2012-05-04 14:05 ` [PATCH obexd v2 1/3] gobex: Add callback and userdata parameter to g_obex_cancel_transfer() Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1336125426-30445-2-git-send-email-jaganath.k@samsung.com \
--to=jaganath.k@samsung.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).