From 6765affa2c0e005c9f430dbe5c8abcdeb7872474 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 20 Dec 2012 17:35:57 +0200 Subject: [PATCH] obexd: Remove TransferStarted and TransferCompleted signals This now handled by ObjectManager together with a new property called Status. --- doc/obexd-api.txt | 18 +++------ obexd/src/manager.c | 98 +++++++++++++++++++++++++++++++-------------- 2 files changed, 75 insertions(+), 41 deletions(-) diff --git a/doc/obexd-api.txt b/doc/obexd-api.txt index a9d199b46..98f5a95ee 100644 --- a/doc/obexd-api.txt +++ b/doc/obexd-api.txt @@ -28,18 +28,6 @@ Methods void RegisterAgent(object agent) Possible errors: org.bluez.obex.Error.DoesNotExist -Signals TransferStarted(object transfer) - - Signal sent when an object push operation starts. - (OPP only) - - TransferCompleted(object transfer, boolean success) - - Signal sent when the object has been received - or an error happens. - (OPP only) - - Transfer hierarchy =============== @@ -53,6 +41,12 @@ Methods void Cancel() Signals Progress(int32 total, int32 transfered) +Properties string Status [readonly] + + Inform the current status of the transfer. + + Possible values: "queued", "in-progress", "complete" or + "error" Session hierarchy =============== diff --git a/obexd/src/manager.c b/obexd/src/manager.c index b138e5524..0faf09ce1 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -62,7 +62,15 @@ struct agent { unsigned int watch_id; }; +enum { + TRANSFER_STATUS_QUEUED = 0, + TRANSFER_STATUS_IN_PROGRESS, + TRANSFER_STATUS_COMPLETE, + TRANSFER_STATUS_ERROR +}; + struct obex_transfer { + uint8_t status; char *path; struct obex_session *session; }; @@ -288,7 +296,8 @@ static gboolean get_root(const GDBusPropertyTable *property, static DBusMessage *transfer_cancel(DBusConnection *connection, DBusMessage *msg, void *user_data) { - struct obex_session *os = user_data; + struct obex_transfer *transfer = user_data; + struct obex_session *os = transfer->session; const char *sender; if (!os) @@ -303,6 +312,31 @@ static DBusMessage *transfer_cancel(DBusConnection *connection, return dbus_message_new_method_return(msg); } +static const char *status2str(uint8_t status) +{ + switch (status) { + case TRANSFER_STATUS_QUEUED: + return "queued"; + case TRANSFER_STATUS_IN_PROGRESS: + return "in-progress"; + case TRANSFER_STATUS_COMPLETE: + return "complete"; + case TRANSFER_STATUS_ERROR: + return "error"; + } +} + +static gboolean transfer_get_status(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct obex_transfer *transfer = data; + const char *status = status2str(transfer->status); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &status); + + return TRUE; +} + static const GDBusMethodTable manager_methods[] = { { GDBUS_METHOD("RegisterAgent", GDBUS_ARGS({ "agent", "o" }), NULL, register_agent) }, @@ -311,13 +345,6 @@ static const GDBusMethodTable manager_methods[] = { { } }; -static const GDBusSignalTable manager_signals[] = { - { GDBUS_SIGNAL("TransferStarted", GDBUS_ARGS({ "transfer", "o"})) }, - { GDBUS_SIGNAL("TransferCompleted", GDBUS_ARGS({ "transfer", "o" }, - { "success", "b" })) }, - { } -}; - static const GDBusMethodTable transfer_methods[] = { { GDBUS_METHOD("Cancel", NULL, NULL, transfer_cancel) }, { } @@ -329,6 +356,11 @@ static const GDBusSignalTable transfer_signals[] = { { } }; +static const GDBusPropertyTable transfer_properties[] = { + { "Status", "s", transfer_get_status }, + { } +}; + static const GDBusPropertyTable session_properties[] = { { "Target", "s", get_target }, { "Root", "s", get_root }, @@ -357,7 +389,7 @@ gboolean manager_init(void) return g_dbus_register_interface(connection, OBEX_MANAGER_PATH, OBEX_MANAGER_INTERFACE, - manager_methods, manager_signals, NULL, + manager_methods, NULL, NULL, NULL, NULL); } @@ -380,25 +412,43 @@ void manager_cleanup(void) void manager_emit_transfer_started(struct obex_transfer *transfer) { - g_dbus_emit_signal(connection, OBEX_MANAGER_PATH, - OBEX_MANAGER_INTERFACE, "TransferStarted", - DBUS_TYPE_OBJECT_PATH, &transfer->path, - DBUS_TYPE_INVALID); + static unsigned int id = 0; + + transfer->path = g_strdup_printf( + "/org/bluez/obex/session%u/transfer%u", + transfer->session->id, id++); + + transfer->status = TRANSFER_STATUS_IN_PROGRESS; + + if (!g_dbus_register_interface(connection, transfer->path, + TRANSFER_INTERFACE, + transfer_methods, transfer_signals, + transfer_properties, transfer, NULL)) { + error("Cannot register Transfer interface."); + g_free(transfer->path); + transfer->path = NULL; + } } static void emit_transfer_completed(struct obex_transfer *transfer, gboolean success) { - g_dbus_emit_signal(connection, OBEX_MANAGER_PATH, - OBEX_MANAGER_INTERFACE, "TransferCompleted", - DBUS_TYPE_OBJECT_PATH, &transfer->path, - DBUS_TYPE_BOOLEAN, &success, - DBUS_TYPE_INVALID); + if (transfer->path == NULL) + return; + + transfer->status = success ? TRANSFER_STATUS_COMPLETE : + TRANSFER_STATUS_ERROR; + + g_dbus_emit_property_changed(connection, transfer->path, + TRANSFER_INTERFACE, "Status"); } static void emit_transfer_progress(struct obex_transfer *transfer, uint32_t total, uint32_t transferred) { + if (transfer->path == NULL) + return; + g_dbus_emit_signal(connection, transfer->path, TRANSFER_INTERFACE, "Progress", DBUS_TYPE_INT32, &total, @@ -422,15 +472,6 @@ struct obex_transfer *manager_register_transfer(struct obex_session *os) 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."); - transfer_free(transfer); - return NULL; - } - return transfer; } @@ -438,8 +479,7 @@ void manager_unregister_transfer(struct obex_transfer *transfer) { struct obex_session *os = transfer->session; - /* Got an error during a transfer. */ - if (os->object) + if (transfer->status == TRANSFER_STATUS_IN_PROGRESS) emit_transfer_completed(transfer, os->offset == os->size); g_dbus_unregister_interface(connection, transfer->path, -- 2.47.3