Hi Mikel, On Tue, Feb 21, 2012 at 10:46 AM, Mikel Astiz <mikel.astiz.oss@xxxxxxxxx> wrote: > From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> > > 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. > - 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 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html