diff --git a/obexd/client/transfer.c b/obexd/client/transfer.c
index 8292265..3cc96a7 100644
--- a/obexd/client/transfer.c
+++ b/obexd/client/transfer.c
guint xfer;
gint64 size;
gint64 transferred;
+ gint64 progress;
+ guint progress_id;
};
static GQuark obc_transfer_error_quark(void)
obex_dbus_dict_append(&dict, "Filename", DBUS_TYPE_STRING,
&transfer->filename);
+ if (transfer->obex != NULL)
+ obex_dbus_dict_append(&dict, "Progress", DBUS_TYPE_UINT64,
+ &transfer->progress);
+
dbus_message_iter_close_container(&iter, &dict);
return reply;
if (transfer->xfer == 0)
return FALSE;
+ if (transfer->progress_id != 0) {
+ g_source_remove(transfer->progress_id);
+ transfer->progress_id = 0;
+ }
+
return g_obex_cancel_transfer(transfer->xfer, abort_complete,
transfer);
}
{ }
};
+static const GDBusSignalTable obc_transfer_signals[] = {
+ { GDBUS_SIGNAL("PropertyChanged",
+ GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
+ { }
+};
+
static void obc_transfer_free(struct obc_transfer *transfer)
{
DBG("%p", transfer);
if (transfer->xfer)
g_obex_cancel_transfer(transfer->xfer, NULL, NULL);
+ if (transfer->progress_id != 0) {
+ g_source_remove(transfer->progress_id);
+ transfer->progress_id = 0;
+ }
+
if (transfer->op == G_OBEX_OP_GET &&
transfer->transferred != transfer->size)
remove(transfer->filename);
if (g_dbus_register_interface(transfer->conn, transfer->path,
TRANSFER_INTERFACE,
- obc_transfer_methods, NULL, NULL,
- transfer, NULL) == FALSE) {
+ obc_transfer_methods, obc_transfer_signals,
+ NULL, transfer, NULL) == FALSE) {
g_set_error(err, OBC_TRANSFER_ERROR, -EFAULT,
"Unable to register to D-Bus");
return FALSE;
transfer->xfer = 0;
+ if (transfer->progress_id != 0) {
+ g_source_remove(transfer->progress_id);
+ transfer->progress_id = 0;
+ }
+
if (err)
goto done;
return TRUE;
}
+static gboolean report_progress(gpointer data)
+{
+ struct obc_transfer *transfer = data;
+
+ if (transfer->transferred == transfer->progress)
+ return TRUE;
+
+ transfer->progress = transfer->transferred;
+
+ if (transfer->transferred == transfer->size) {
+ transfer->progress_id = 0;
+ return FALSE;
+ }
+
+ obex_dbus_signal_property_changed(transfer->conn,
+ transfer->path,
+ TRANSFER_INTERFACE, "Progress",
+ DBUS_TYPE_INT64,
+ &transfer->progress);
+
+ return TRUE;
+}
+
static gboolean transfer_start_get(struct obc_transfer *transfer, GError **err)
{
GObexPacket *req;
if (transfer->xfer == 0)
return FALSE;
+ if (transfer->path == NULL)
+ return TRUE;
+
+ transfer->progress_id = g_timeout_add_seconds(1, report_progress,
+ transfer);
+
return TRUE;
}
if (transfer->xfer == 0)
return FALSE;
+ if (transfer->path == NULL)
+ return TRUE;
+
+ transfer->progress_id = g_timeout_add_seconds(1, report_progress,
+ transfer);
+
return TRUE;
}