From 84d01d66e164dccd076977237b28cbfbb8629d8e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 20 Dec 2012 16:47:49 +0200 Subject: [PATCH] obexd: Fix transfer path to include session path Transfer path should use the session path as prefix --- doc/obexd-api.txt | 2 +- obexd/plugins/opp.c | 14 ++++---- obexd/src/manager.c | 87 ++++++++++++++++++++++++--------------------- obexd/src/manager.h | 16 +++++---- 4 files changed, 62 insertions(+), 57 deletions(-) diff --git a/doc/obexd-api.txt b/doc/obexd-api.txt index cf95b3221..a9d199b46 100644 --- a/doc/obexd-api.txt +++ b/doc/obexd-api.txt @@ -45,7 +45,7 @@ Transfer hierarchy Service org.bluez.obex Interface org.bluez.obex.Transfer1 -Object path /transfer{0, 1, 2, ...} +Object path /org/bluez/obex/session{0, 1, 2, ...}/transfer{0, 1, 2, ...} Methods void Cancel() diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index faa4437ee..97bf943d7 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -46,17 +46,15 @@ static void *opp_connect(struct obex_session *os, int *err) { - manager_register_transfer(os); - if (err) *err = 0; - return NULL; + return manager_register_transfer(os); } static void opp_progress(struct obex_session *os, void *user_data) { - manager_emit_transfer_progress(os); + manager_emit_transfer_progress(user_data); } static int opp_chkput(struct obex_session *os, void *user_data) @@ -80,7 +78,7 @@ static int opp_chkput(struct obex_session *os, void *user_data) } time = 0; - err = manager_request_authorization(os, time, &folder, &name); + err = manager_request_authorization(user_data, time, &folder, &name); if (err < 0) return -EPERM; @@ -108,7 +106,7 @@ skip_auth: if (err < 0) goto failed; - manager_emit_transfer_started(os); + manager_emit_transfer_started(user_data); failed: g_free(folder); @@ -155,12 +153,12 @@ static int opp_get(struct obex_session *os, void *user_data) static void opp_disconnect(struct obex_session *os, void *user_data) { - manager_unregister_transfer(os); + manager_unregister_transfer(user_data); } static void opp_reset(struct obex_session *os, void *user_data) { - manager_emit_transfer_completed(os); + manager_emit_transfer_completed(user_data); } static struct obex_service_driver driver = { diff --git a/obexd/src/manager.c b/obexd/src/manager.c index 07ceceed0..b138e5524 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -62,6 +62,11 @@ struct agent { unsigned int watch_id; }; +struct obex_transfer { + char *path; + struct obex_session *session; +}; + static struct agent *agent = NULL; static DBusConnection *connection = NULL; @@ -373,73 +378,74 @@ void manager_cleanup(void) dbus_connection_unref(connection); } -void manager_emit_transfer_started(struct obex_session *os) +void manager_emit_transfer_started(struct obex_transfer *transfer) { - char *path = g_strdup_printf("/transfer%u", os->id); - g_dbus_emit_signal(connection, OBEX_MANAGER_PATH, OBEX_MANAGER_INTERFACE, "TransferStarted", - DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_OBJECT_PATH, &transfer->path, DBUS_TYPE_INVALID); - - g_free(path); } -static void emit_transfer_completed(struct obex_session *os, gboolean success) +static void emit_transfer_completed(struct obex_transfer *transfer, + gboolean success) { - char *path = g_strdup_printf("/transfer%u", os->id); - g_dbus_emit_signal(connection, OBEX_MANAGER_PATH, OBEX_MANAGER_INTERFACE, "TransferCompleted", - DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_OBJECT_PATH, &transfer->path, DBUS_TYPE_BOOLEAN, &success, DBUS_TYPE_INVALID); - - g_free(path); } -static void emit_transfer_progress(struct obex_session *os, uint32_t total, - uint32_t transferred) +static void emit_transfer_progress(struct obex_transfer *transfer, + uint32_t total, uint32_t transferred) { - char *path = g_strdup_printf("/transfer%u", os->id); - - g_dbus_emit_signal(connection, path, + g_dbus_emit_signal(connection, transfer->path, TRANSFER_INTERFACE, "Progress", DBUS_TYPE_INT32, &total, DBUS_TYPE_INT32, &transferred, DBUS_TYPE_INVALID); +} - g_free(path); +static void transfer_free(struct obex_transfer *transfer) +{ + g_free(transfer->path); + g_free(transfer); } -void manager_register_transfer(struct obex_session *os) +struct obex_transfer *manager_register_transfer(struct obex_session *os) { - char *path = g_strdup_printf("/transfer%u", os->id); + struct obex_transfer *transfer; + static unsigned int id = 0; - if (!g_dbus_register_interface(connection, path, + transfer = g_new0(struct obex_transfer, 1); + transfer->path = g_strdup_printf("/org/bluez/obex/session%u/transfer%u", + os->id, id++); + transfer->session = os; + + if (!g_dbus_register_interface(connection, transfer->path, TRANSFER_INTERFACE, transfer_methods, transfer_signals, NULL, os, NULL)) { error("Cannot register Transfer interface."); - g_free(path); - return; + transfer_free(transfer); + return NULL; } - g_free(path); + return transfer; } -void manager_unregister_transfer(struct obex_session *os) +void manager_unregister_transfer(struct obex_transfer *transfer) { - char *path = g_strdup_printf("/transfer%u", os->id); + struct obex_session *os = transfer->session; /* Got an error during a transfer. */ if (os->object) - emit_transfer_completed(os, os->offset == os->size); + emit_transfer_completed(transfer, os->offset == os->size); - g_dbus_unregister_interface(connection, path, - TRANSFER_INTERFACE); + g_dbus_unregister_interface(connection, transfer->path, + TRANSFER_INTERFACE); - g_free(path); + transfer_free(transfer); } static void agent_cancel(void) @@ -508,14 +514,15 @@ static gboolean auth_error(GIOChannel *io, GIOCondition cond, void *user_data) return FALSE; } -int manager_request_authorization(struct obex_session *os, int32_t time, +int manager_request_authorization(struct obex_transfer *transfer, int32_t time, char **new_folder, char **new_name) { + struct obex_session *os = transfer->session; DBusMessage *msg; DBusPendingCall *call; const char *filename = os->name ? os->name : ""; const char *type = os->type ? os->type : ""; - char *path, *address; + char *address; unsigned int watch; gboolean got_reply; int err; @@ -533,13 +540,11 @@ int manager_request_authorization(struct obex_session *os, int32_t time, if (err < 0) return err; - path = g_strdup_printf("/transfer%u", os->id); - msg = dbus_message_new_method_call(agent->bus_name, agent->path, AGENT_INTERFACE, "Authorize"); dbus_message_append_args(msg, - DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_OBJECT_PATH, &transfer->path, DBUS_TYPE_STRING, &address, DBUS_TYPE_STRING, &filename, DBUS_TYPE_STRING, &type, @@ -547,7 +552,6 @@ int manager_request_authorization(struct obex_session *os, int32_t time, DBUS_TYPE_INT32, &time, DBUS_TYPE_INVALID); - g_free(path); g_free(address); if (!dbus_connection_send_with_reply(connection, @@ -618,15 +622,16 @@ void manager_unregister_session(struct obex_session *os) g_free(path); } -void manager_emit_transfer_progress(struct obex_session *os) +void manager_emit_transfer_progress(struct obex_transfer *transfer) { - emit_transfer_progress(os, os->size, os->offset); + emit_transfer_progress(transfer, transfer->session->size, + transfer->session->offset); } -void manager_emit_transfer_completed(struct obex_session *os) +void manager_emit_transfer_completed(struct obex_transfer *transfer) { - if (os->object) - emit_transfer_completed(os, !os->aborted); + if (transfer->session->object) + emit_transfer_completed(transfer, !transfer->session->aborted); } DBusConnection *manager_dbus_get_connection(void) diff --git a/obexd/src/manager.h b/obexd/src/manager.h index b0400aa0f..669b223f8 100644 --- a/obexd/src/manager.h +++ b/obexd/src/manager.h @@ -26,15 +26,17 @@ #define OBEXD_SERVICE "org.bluez.obex" struct obex_session; +struct obex_transfer; void manager_register_session(struct obex_session *os); void manager_unregister_session(struct obex_session *os); -void manager_register_transfer(struct obex_session *os); -void manager_unregister_transfer(struct obex_session *os); -void manager_emit_transfer_started(struct obex_session *os); -void manager_emit_transfer_progress(struct obex_session *os); -void manager_emit_transfer_completed(struct obex_session *os); -int manager_request_authorization(struct obex_session *os, int32_t time, - char **new_folder, char **new_name); + +struct obex_transfer *manager_register_transfer(struct obex_session *os); +void manager_unregister_transfer(struct obex_transfer *transfer); +void manager_emit_transfer_started(struct obex_transfer *transfer); +void manager_emit_transfer_progress(struct obex_transfer *transfer); +void manager_emit_transfer_completed(struct obex_transfer *transfer); +int manager_request_authorization(struct obex_transfer *transfer, int32_t time, + char **new_folder, char **new_name); DBusConnection *manager_dbus_get_connection(void); -- 2.47.3