diff --git a/obexd/client/session.c b/obexd/client/session.c
index f1bdf18..14248ed 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
void *data;
};
+struct pending_request;
+typedef int (*session_process_t) (struct pending_request *p, GError **err);
+typedef void (*destroy_t) (void *data);
+
struct pending_request {
guint id;
guint req_id;
struct obc_session *session;
+ session_process_t process;
struct obc_transfer *transfer;
session_callback_t func;
void *data;
+ destroy_t destroy;
};
struct setpath_data {
char *owner; /* Session owner */
guint watch;
GQueue *queue;
- guint queue_complete_id;
+ guint process_id;
};
static GSList *sessions = NULL;
}
static struct pending_request *pending_request_new(struct obc_session *session,
+ session_process_t process,
struct obc_transfer *transfer,
session_callback_t func,
- void *data)
+ void *data,
+ destroy_t destroy)
{
struct pending_request *p;
static guint id = 0;
p = g_new0(struct pending_request, 1);
p->id = ++id;
p->session = obc_session_ref(session);
+ p->process = process;
+ p->destroy = destroy;
p->transfer = transfer;
p->func = func;
p->data = data;
static void pending_request_free(struct pending_request *p)
{
+ if (p->destroy)
+ p->destroy(p->data);
+
if (p->transfer)
obc_transfer_unregister(p->transfer);
{
DBG("%p", session);
- if (session->queue_complete_id != 0)
- g_source_remove(session->queue_complete_id);
+ if (session->process_id != 0)
+ g_source_remove(session->process_id);
if (session->queue) {
g_queue_foreach(session->queue, (GFunc) pending_request_free,
{ }
};
-static gboolean session_queue_complete(gpointer data)
+static gboolean session_process(gpointer data)
{
struct obc_session *session = data;
session_process_queue(session);
- session->queue_complete_id = 0;
+ session->process_id = 0;
return FALSE;
}
obc_transfer_set_callback(transfer, transfer_complete, session);
- p = pending_request_new(session, transfer, func, user_data);
+ p = pending_request_new(session, NULL, transfer, func, user_data,
+ NULL);
g_queue_push_tail(session->queue, p);
- if (session->queue_complete_id == 0)
- session->queue_complete_id = g_idle_add(
- session_queue_complete, session);
+ if (session->process_id == 0)
+ session->process_id = g_idle_add(session_process, session);
return p->id;
}
data->user_data = user_data;
data->remaining = g_strsplit(strlen(path) ? path : "/", "/", 0);
- p = pending_request_new(session, NULL, setpath_complete, data);
+ p = pending_request_new(session, NULL, NULL, setpath_complete, data,
+ NULL);
/* Relative path */
if (path[0] != '/')
}
- p = pending_request_new(session, NULL, func, user_data);
+ p = pending_request_new(session, NULL, NULL, func, user_data, NULL);
p->req_id = g_obex_mkdir(session->obex, folder, async_cb, p, err);
if (*err != NULL) {
return 0;
}
- p = pending_request_new(session, NULL, func, user_data);
+ p = pending_request_new(session, NULL, NULL, func, user_data, NULL);
p->req_id = g_obex_copy(session->obex, srcname, destname, async_cb, p,
err);
return 0;
}
- p = pending_request_new(session, NULL, func, user_data);
+ p = pending_request_new(session, NULL, NULL, func, user_data, NULL);
p->req_id = g_obex_move(session->obex, srcname, destname, async_cb, p,
err);
return 0;
}
- p = pending_request_new(session, NULL, func, user_data);
+ p = pending_request_new(session, NULL, NULL, func, user_data, NULL);
p->req_id = g_obex_delete(session->obex, file, async_cb, p, err);
if (*err != NULL) {