From 9b883a0264dc7f1219a812afc18f05a2c9a4874c Mon Sep 17 00:00:00 2001 From: Mikel Astiz Date: Fri, 4 May 2012 14:39:38 +0200 Subject: [PATCH] obexd: Create transfers in modules After this patch the modules are responsible for creating the transfers, and these objects must be queued using the session API. This way the transfer initiator has full access to the transfer object, in case for example it wants to access some member variable. --- obexd/client/ftp.c | 77 ++++++++++++++++++++++--------------- obexd/client/manager.c | 30 ++++++++++----- obexd/client/map.c | 54 ++++++++++++++------------ obexd/client/pbap.c | 82 ++++++++++++++++++++++------------------ obexd/client/session.c | 86 ++++++------------------------------------ obexd/client/session.h | 17 ++------- obexd/client/sync.c | 54 +++++++++++++++----------- 7 files changed, 189 insertions(+), 211 deletions(-) diff --git a/obexd/client/ftp.c b/obexd/client/ftp.c index 86c2a3c5d..6fa4e857a 100644 --- a/obexd/client/ftp.c +++ b/obexd/client/ftp.c @@ -258,21 +258,26 @@ static DBusMessage *list_folder(DBusConnection *connection, { struct ftp_data *ftp = user_data; struct obc_session *session = ftp->session; + struct obc_transfer *transfer; GError *err = NULL; + DBusMessage *reply; - obc_session_get(session, "x-obex/folder-listing", NULL, NULL, - NULL, 0, list_folder_callback, message, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_get("x-obex/folder-listing", NULL, NULL, + NULL, 0, &err); + if (transfer == NULL) + goto fail; - dbus_message_ref(message); + if (obc_session_queue(session, transfer, list_folder_callback, + message, &err)) { + dbus_message_ref(message); + return NULL; + } - return NULL; +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + return reply; } static DBusMessage *get_file(DBusConnection *connection, @@ -280,8 +285,10 @@ static DBusMessage *get_file(DBusConnection *connection, { struct ftp_data *ftp = user_data; struct obc_session *session = ftp->session; + struct obc_transfer *transfer; const char *target_file, *source_file; GError *err = NULL; + DBusMessage *reply; if (dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &target_file, @@ -290,19 +297,22 @@ static DBusMessage *get_file(DBusConnection *connection, return g_dbus_create_error(message, "org.openobex.Error.InvalidArguments", NULL); - obc_session_get(session, NULL, source_file, target_file, NULL, 0, - get_file_callback, message, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_get(NULL, source_file, target_file, NULL, 0, + &err); + if (transfer == NULL) + goto fail; - dbus_message_ref(message); + if (obc_session_queue(session, transfer, get_file_callback, message, + &err)) { + dbus_message_ref(message); + return NULL; + } - return NULL; +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + return reply; } static DBusMessage *put_file(DBusConnection *connection, @@ -310,8 +320,10 @@ static DBusMessage *put_file(DBusConnection *connection, { struct ftp_data *ftp = user_data; struct obc_session *session = ftp->session; + struct obc_transfer *transfer; gchar *sourcefile, *targetfile; GError *err = NULL; + DBusMessage *reply; if (dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &sourcefile, @@ -321,16 +333,19 @@ static DBusMessage *put_file(DBusConnection *connection, "org.openobex.Error.InvalidArguments", "Invalid arguments in method call"); - obc_session_send(session, sourcefile, targetfile, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_put(NULL, targetfile, sourcefile, NULL, 0, + NULL, 0, &err); + if (transfer == NULL) + goto fail; + + if (obc_session_queue(session, transfer, NULL, NULL, &err)) + return dbus_message_new_method_return(message); - return dbus_message_new_method_return(message); +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + return reply; } static DBusMessage *copy_file(DBusConnection *connection, diff --git a/obexd/client/manager.c b/obexd/client/manager.c index a46519fd9..1f70f604e 100644 --- a/obexd/client/manager.c +++ b/obexd/client/manager.c @@ -113,13 +113,17 @@ static void create_callback(struct obc_session *session, for (i = 0; i < data->files->len; i++) { const gchar *filename = g_ptr_array_index(data->files, i); gchar *basename = g_path_get_basename(filename); + struct obc_transfer *transfer; - if (obc_session_send(session, filename, basename, NULL) == 0) { - g_free(basename); - break; - } + transfer = obc_transfer_put(NULL, basename, filename, NULL, 0, + NULL, 0, NULL); g_free(basename); + if (transfer == NULL) + break; + + if (!obc_session_queue(session, transfer, NULL, NULL, NULL)) + break; } /* No need to keep a reference for SendFiles */ @@ -278,6 +282,7 @@ static void pull_obc_session_callback(struct obc_session *session, GError *err, void *user_data) { struct send_data *data = user_data; + struct obc_transfer *pull; DBusMessage *reply; GError *gerr = NULL; @@ -288,9 +293,11 @@ static void pull_obc_session_callback(struct obc_session *session, goto fail; } - obc_session_pull(session, "text/x-vcard", data->filename, - pull_complete_callback, data, &gerr); - if (gerr != NULL) { + pull = obc_transfer_get("text/x-vcard", NULL, data->filename, NULL, 0, + &gerr); + + if (!obc_session_queue(session, pull, pull_complete_callback, data, + &gerr)) { reply = g_dbus_create_error(data->message, "org.openobex.Error.Failed", "%s", gerr->message); @@ -497,6 +504,7 @@ static void capability_obc_session_callback(struct obc_session *session, GError *err, void *user_data) { struct send_data *data = user_data; + struct obc_transfer *pull; DBusMessage *reply; GError *gerr = NULL; @@ -507,9 +515,11 @@ static void capability_obc_session_callback(struct obc_session *session, goto fail; } - obc_session_pull(session, "x-obex/capability", NULL, - capabilities_complete_callback, data, &gerr); - if (gerr != NULL) { + pull = obc_transfer_get("x-obex/capability", NULL, data->filename, + NULL, 0, &gerr); + + if (!obc_session_queue(session, pull, capabilities_complete_callback, + data, &gerr)) { reply = g_dbus_create_error(data->message, "org.openobex.Error.Failed", "%s", gerr->message); diff --git a/obexd/client/map.c b/obexd/client/map.c index eb068346c..3e6f23771 100644 --- a/obexd/client/map.c +++ b/obexd/client/map.c @@ -135,31 +135,36 @@ static DBusMessage *map_get_folder_listing(DBusConnection *connection, DBusMessage *message, void *user_data) { struct map_data *map = user_data; + struct obc_transfer *transfer; GError *err = NULL; + DBusMessage *reply; - obc_session_get(map->session, "x-obex/folder-listing", NULL, - NULL, NULL, 0, - buffer_cb, map, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_get("x-obex/folder-listing", NULL, NULL, + NULL, 0, &err); + if (transfer == NULL) + goto fail; - map->msg = dbus_message_ref(message); + if (obc_session_queue(map->session, transfer, buffer_cb, map, &err)) { + map->msg = dbus_message_ref(message); + return NULL; + } - return NULL; +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + return reply; } static DBusMessage *map_get_message_listing(DBusConnection *connection, DBusMessage *message, void *user_data) { struct map_data *map = user_data; + struct obc_transfer *transfer; const char *folder; DBusMessageIter msg_iter; GError *err = NULL; + DBusMessage *reply; dbus_message_iter_init(message, &msg_iter); @@ -169,20 +174,21 @@ static DBusMessage *map_get_message_listing(DBusConnection *connection, dbus_message_iter_get_basic(&msg_iter, &folder); - obc_session_get(map->session, "x-bt/MAP-msg-listing", folder, - NULL, NULL, 0, - buffer_cb, map, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_get("x-bt/MAP-msg-listing", folder, NULL, + NULL, 0, &err); + if (transfer == NULL) + goto fail; - map->msg = dbus_message_ref(message); + if (obc_session_queue(map->session, transfer, buffer_cb, map, &err)) { + map->msg = dbus_message_ref(message); + return NULL; + } - return NULL; +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + return reply; } static GDBusMethodTable map_methods[] = { diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c index b178aff23..92292c907 100644 --- a/obexd/client/pbap.c +++ b/obexd/client/pbap.c @@ -462,8 +462,10 @@ static DBusMessage *pull_phonebook(struct pbap_data *pbap, { struct pending_request *request; struct pullphonebook_apparam apparam; + struct obc_transfer *transfer; session_callback_t func; GError *err = NULL; + DBusMessage *reply; apparam.filter_tag = FILTER_TAG; apparam.filter_len = FILTER_LEN; @@ -492,19 +494,20 @@ static DBusMessage *pull_phonebook(struct pbap_data *pbap, request = pending_request_new(pbap, message); - obc_session_get(pbap->session, "x-bt/phonebook", name, NULL, - (guint8 *) &apparam, sizeof(apparam), - func, request, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - pending_request_free(request); - return reply; - } + transfer = obc_transfer_get("x-bt/phonebook", name, NULL, &apparam, + sizeof(apparam), &err); + if (transfer == NULL) + goto fail; - return NULL; + if (obc_session_queue(pbap->session, transfer, func, request, &err)) + return NULL; + +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + pending_request_free(request); + return reply; } static guint8 *fill_apparam(guint8 *dest, void *buf, guint8 tag, guint8 len) @@ -525,9 +528,11 @@ static DBusMessage *pull_vcard_listing(struct pbap_data *pbap, guint16 count, guint16 offset) { struct pending_request *request; + struct obc_transfer *transfer; guint8 *p, *apparam = NULL; gint apparam_size; GError *err = NULL; + DBusMessage *reply; /* trunc the searchval string if it's length exceed the max value of guint8 */ if (strlen(searchval) > 254) @@ -557,21 +562,22 @@ static DBusMessage *pull_vcard_listing(struct pbap_data *pbap, request = pending_request_new(pbap, message); - obc_session_get(pbap->session, "x-bt/vcard-listing", name, NULL, - apparam, apparam_size, - pull_vcard_listing_callback, request, &err); + transfer = obc_transfer_get("x-bt/vcard-listing", name, NULL, + apparam, apparam_size, &err); g_free(apparam); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - pending_request_free(request); - return reply; + if (transfer == NULL) + goto fail; - } + if (obc_session_queue(pbap->session, transfer, + pull_vcard_listing_callback, request, &err)) + return NULL; - return NULL; +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + pending_request_free(request); + return reply; } static int set_format(struct pbap_data *pbap, const char *formatstr) @@ -760,7 +766,9 @@ static DBusMessage *pbap_pull_vcard(DBusConnection *connection, struct pullvcardentry_apparam apparam; const char *name; struct pending_request *request; + struct obc_transfer *transfer; GError *err = NULL; + DBusMessage *reply; if (!pbap->path) return g_dbus_create_error(message, @@ -782,19 +790,21 @@ static DBusMessage *pbap_pull_vcard(DBusConnection *connection, request = pending_request_new(pbap, message); - obc_session_get(pbap->session, "x-bt/vcard", name, NULL, - (guint8 *)&apparam, sizeof(apparam), - pull_phonebook_callback, request, &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - "org.openobex.Error.Failed", - "%s", err->message); - g_error_free(err); - pending_request_free(request); - return reply; - } + transfer = obc_transfer_get("x-bt/vcard", name, NULL, + &apparam, sizeof(apparam), &err); + if (transfer == NULL) + goto fail; - return NULL; + if (obc_session_queue(pbap->session, transfer, pull_phonebook_callback, + request, &err)) + return NULL; + +fail: + reply = g_dbus_create_error(message, "org.openobex.Error.Failed", "%s", + err->message); + g_error_free(err); + pending_request_free(request); + return reply; } static DBusMessage *pbap_list(DBusConnection *connection, diff --git a/obexd/client/session.c b/obexd/client/session.c index f8f8da4bf..2c1827f07 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -745,15 +745,22 @@ static int pending_request_auth(struct pending_request *p) NULL); } -static guint session_request(struct obc_session *session, - struct obc_transfer *transfer, - session_callback_t func, - void *data, GError **err) +guint obc_session_queue(struct obc_session *session, + struct obc_transfer *transfer, + session_callback_t func, void *user_data, + GError **err) { struct pending_request *p; const char *agent; int perr; + if (session->obex == NULL) { + obc_transfer_unregister(transfer); + g_set_error(err, OBEX_IO_ERROR, -ENOTCONN, + "Session not connected"); + return 0; + } + if (session->agent) agent = obc_agent_get_name(session->agent); else @@ -767,7 +774,7 @@ static guint session_request(struct obc_session *session, obc_transfer_set_callback(transfer, transfer_progress, session); p = pending_request_new(session, transfer, session_start_transfer, - func, data); + func, user_data); if (session->p) { g_queue_push_tail(session->queue, p); return p->id; @@ -956,56 +963,6 @@ static void session_start_transfer(gpointer data, gpointer user_data) DBG("Transfer(%p) started", transfer); } -guint obc_session_get(struct obc_session *session, const char *type, - const char *name, const char *targetfile, - const guint8 *apparam, gint apparam_size, - session_callback_t func, void *user_data, - GError **err) -{ - struct obc_transfer *transfer; - - if (session->obex == NULL) { - g_set_error(err, OBEX_IO_ERROR, -ENOTCONN, - "Session not connected"); - return 0; - } - - transfer = obc_transfer_get(type, name, targetfile, apparam, - apparam_size, err); - if (transfer == NULL) - return 0; - - return session_request(session, transfer, func, user_data, err); -} - -guint obc_session_send(struct obc_session *session, const char *filename, - const char *name, GError **err) -{ - struct obc_transfer *transfer; - - if (session->obex == NULL) { - g_set_error(err, OBEX_IO_ERROR, -ENOTCONN, - "Session not connected"); - return 0; - } - - transfer = obc_transfer_put(NULL, name, filename, NULL, 0, NULL, 0, - err); - if (transfer == NULL) - return 0; - - return session_request(session, transfer, NULL, NULL, err); -} - -guint obc_session_pull(struct obc_session *session, - const char *type, const char *targetfile, - session_callback_t function, void *user_data, - GError **err) -{ - return obc_session_get(session, type, NULL, targetfile, NULL, 0, - function, user_data, err); -} - const char *obc_session_register(struct obc_session *session, GDBusDestroyFunction destroy) { @@ -1036,25 +993,6 @@ fail: return NULL; } -guint obc_session_put(struct obc_session *session, const char *contents, - size_t size, const char *name, GError **err) -{ - struct obc_transfer *transfer; - - if (session->obex == NULL) { - g_set_error(err, OBEX_IO_ERROR, -ENOTCONN, - "Session not connected"); - return 0; - } - - transfer = obc_transfer_put(NULL, name, NULL, contents, size, NULL, 0, - err); - if (transfer == NULL) - return 0; - - return session_request(session, transfer, NULL, NULL, err); -} - static void agent_destroy(gpointer data, gpointer user_data) { struct obc_session *session = user_data; diff --git a/obexd/client/session.h b/obexd/client/session.h index 06aaa1b93..2cac032d4 100644 --- a/obexd/client/session.h +++ b/obexd/client/session.h @@ -54,22 +54,13 @@ const char *obc_session_get_agent(struct obc_session *session); const char *obc_session_get_path(struct obc_session *session); const char *obc_session_get_target(struct obc_session *session); -guint obc_session_send(struct obc_session *session, const char *filename, - const char *name, GError **err); -guint obc_session_get(struct obc_session *session, const char *type, - const char *name, const char *targetfile, - const guint8 *apparam, gint apparam_size, - session_callback_t func, void *user_data, - GError **err); -guint obc_session_pull(struct obc_session *session, - const char *type, const char *targetfile, - session_callback_t function, void *user_data, - GError **err); const char *obc_session_register(struct obc_session *session, GDBusDestroyFunction destroy); -guint obc_session_put(struct obc_session *session, const char *contents, - size_t size, const char *name, GError **err); +guint obc_session_queue(struct obc_session *session, + struct obc_transfer *transfer, + session_callback_t func, void *user_data, + GError **err); guint obc_session_setpath(struct obc_session *session, const char *path, session_callback_t func, void *user_data, GError **err); diff --git a/obexd/client/sync.c b/obexd/client/sync.c index c0b3800ef..3c376cc43 100644 --- a/obexd/client/sync.c +++ b/obexd/client/sync.c @@ -127,7 +127,9 @@ static DBusMessage *sync_getphonebook(DBusConnection *connection, DBusMessage *message, void *user_data) { struct sync_data *sync = user_data; + struct obc_transfer *transfer; GError *err = NULL; + DBusMessage *reply; if (sync->msg) return g_dbus_create_error(message, @@ -137,29 +139,33 @@ static DBusMessage *sync_getphonebook(DBusConnection *connection, if (!sync->phonebook_path) sync->phonebook_path = g_strdup("telecom/pb.vcf"); - obc_session_get(sync->session, "phonebook", sync->phonebook_path, - NULL, NULL, 0, - sync_getphonebook_callback, sync, - &err); - if (err != 0) { - DBusMessage *reply = g_dbus_create_error(message, - ERROR_INF ".Failed", - err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_get("phonebook", sync->phonebook_path, + NULL, NULL, 0, &err); + if (transfer == NULL) + goto fail; - sync->msg = dbus_message_ref(message); + if (obc_session_queue(sync->session, transfer, + sync_getphonebook_callback, + sync, &err)) { + sync->msg = dbus_message_ref(message); + return NULL; + } - return NULL; +fail: + reply = g_dbus_create_error(message, ERROR_INF ".Failed", "%s", + err->message); + g_error_free(err); + return reply; } static DBusMessage *sync_putphonebook(DBusConnection *connection, DBusMessage *message, void *user_data) { struct sync_data *sync = user_data; + struct obc_transfer *transfer; const char *buf; GError *err = NULL; + DBusMessage *reply; if (dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &buf, @@ -171,17 +177,19 @@ static DBusMessage *sync_putphonebook(DBusConnection *connection, if (!sync->phonebook_path) sync->phonebook_path = g_strdup("telecom/pb.vcf"); - obc_session_put(sync->session, buf, strlen(buf), sync->phonebook_path, - &err); - if (err != NULL) { - DBusMessage *reply = g_dbus_create_error(message, - ERROR_INF ".Failed", - err->message); - g_error_free(err); - return reply; - } + transfer = obc_transfer_put(NULL, sync->phonebook_path, NULL, buf, + strlen(buf), NULL, 0, &err); + if (transfer == NULL) + goto fail; - return dbus_message_new_method_return(message); + if (obc_session_queue(sync->session, transfer, NULL, NULL, &err)) + return dbus_message_new_method_return(message); + +fail: + reply = g_dbus_create_error(message, ERROR_INF ".Failed", "%s", + err->message); + g_error_free(err); + return reply; } static GDBusMethodTable sync_methods[] = { -- 2.47.3