diff --git a/doc/obexd-api.txt b/doc/obexd-api.txt
index a9d199b..98f5a95 100644
--- a/doc/obexd-api.txt
+++ b/doc/obexd-api.txt
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
===============
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 b138e55..0faf09c 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
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;
};
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)
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) },
{ }
};
-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) },
{ }
{ }
};
+static const GDBusPropertyTable transfer_properties[] = {
+ { "Status", "s", transfer_get_status },
+ { }
+};
+
static const GDBusPropertyTable session_properties[] = {
{ "Target", "s", get_target },
{ "Root", "s", get_root },
return g_dbus_register_interface(connection, OBEX_MANAGER_PATH,
OBEX_MANAGER_INTERFACE,
- manager_methods, manager_signals, NULL,
+ manager_methods, NULL, NULL,
NULL, NULL);
}
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,
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;
}
{
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,