Thread (18 messages) 18 messages, 2 authors, 2012-02-21

Re: [PATCH obexd 6/9] client: terminate queued transfers properly

flat view

From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Date: 2012-02-21 11:40:16

Hi Mikel,

On Tue, Feb 21, 2012 at 10:46 AM, Mikel Astiz [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Mikel Astiz <redacted>

Previous implementation of session_terminate_transfer assumed that the
transfer being terminated would always be the active one. However, it
should be possible to cancel any queued transfer using the D-Bus api.
---
 client/session.c |   32 ++++++++++++++++++++++++--------
 1 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/client/session.c b/client/session.c
index eaabcf9..50a6a5d 100644
--- a/client/session.c
+++ b/client/session.c
@@ -762,18 +762,34 @@ static void session_terminate_transfer(struct obc_session *session,
 {
       struct pending_request *p = session->p;

-       if (p == NULL || p->transfer != transfer)
-               return;
-
       obc_session_ref(session);

-       if (p->func)
-               p->func(session, gerr, p->data);
+       if (p != NULL && p->transfer == transfer) {
+               if (p->func)
+                       p->func(session, gerr, p->data);

-       pending_request_free(p);
-       session->p = NULL;
+               pending_request_free(p);
+               session->p = NULL;
Maybe a goto would be better here, since calling to callback and
freeing the pending request should common.
quoted hunk ↗ jump to hunk
-       session_process_queue(session);
+               session_process_queue(session);
+       } else {
+               GList *l;
+
+               for (l = session->queue->head; l; l = l->next) {
+                       p = l->data;
+
+                       if (p->transfer != transfer)
+                               continue;
+
+                       g_queue_delete_link(session->queue, l);
+
+                       if (p->func)
+                               p->func(session, gerr, p->data);
+
+                       pending_request_free(p);
+                       break;
+               }
+       }
And here you can make use of g_queue_find_custom like we do in
g_obex_cancel_req.


-- 
Luiz Augusto von Dentz
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help