[Spice-devel] [spice-gtk][PATCH v4] Added INFO messages about a file transfer

Pavel Grunt pgrunt at redhat.com
Thu Sep 18 07:31:57 PDT 2014


When a file transfer starts / finishes an information message is printed (in INFO log level).
Also INFO messages about the transfer progress are periodically printed.
---
changes since v4:
  - logging is enabled when transferring more files simultaneously

 gtk/channel-main.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/gtk/channel-main.c b/gtk/channel-main.c
index 1ad090f..1e0f940 100644
--- a/gtk/channel-main.c
+++ b/gtk/channel-main.c
@@ -70,6 +70,8 @@ typedef struct SpiceFileXferTask {
     char                           buffer[FILE_XFER_CHUNK_SIZE];
     uint64_t                       read_bytes;
     uint64_t                       file_size;
+    GDateTime                      *start_time;
+    GDateTime                      *last_update;
     GError                         *error;
 } SpiceFileXferTask;
 
@@ -1529,15 +1531,31 @@ static void main_handle_agent_disconnected(SpiceChannel *channel, SpiceMsgIn *in
 static void file_xfer_task_free(SpiceFileXferTask *task)
 {
     SpiceMainChannelPrivate *c;
-
+    gchar *basename;
+    double seconds;
+    GDateTime *now;
     g_return_if_fail(task != NULL);
 
+    if (task->read_bytes == task->file_size) {
+        basename = g_file_get_basename(task->file);
+        now = g_date_time_new_now_local();
+        seconds = (double) g_date_time_difference(now, task->start_time) / G_TIME_SPAN_SECOND;
+        g_date_time_unref(now);
+        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO,
+              "transferred file %s of %.2f kB size in %.2f seconds (%.2f MB/s)",
+              basename, task->file_size / 1000.0, seconds,
+              (double) task->file_size / 1048576 / seconds);
+        g_free(basename);
+    }
+
     c = task->channel->priv;
     g_hash_table_remove(c->file_xfer_tasks, GUINT_TO_POINTER(task->id));
 
     g_clear_object(&task->channel);
     g_clear_object(&task->file);
     g_clear_object(&task->file_stream);
+    g_date_time_unref(task->start_time);
+    g_date_time_unref(task->last_update);
     g_free(task);
 }
 
@@ -1587,6 +1605,9 @@ static void file_xfer_data_flushed_cb(GObject *source_object,
     SpiceFileXferTask *task = user_data;
     SpiceMainChannel *channel = (SpiceMainChannel *)source_object;
     GError *error = NULL;
+    GDateTime *now;
+    gchar *basename;
+    const GTimeSpan interval = 20 * G_TIME_SPAN_SECOND;
 
     task->pending = FALSE;
     file_xfer_flush_finish(channel, res, &error);
@@ -1595,6 +1616,17 @@ static void file_xfer_data_flushed_cb(GObject *source_object,
         return;
     }
 
+    now = g_date_time_new_now_local();
+    if (interval < g_date_time_difference(now, task->last_update)) {
+        g_date_time_unref(task->last_update);
+        task->last_update = g_date_time_ref(now);
+        basename = g_file_get_basename(task->file);
+        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "transferred %.2f%% of the file %s",
+              100.0 * task->read_bytes / task->file_size, basename);
+        g_free(basename);
+    }
+    g_date_time_unref(now);
+
     if (task->progress_callback)
         task->progress_callback(task->read_bytes, task->file_size,
                                 task->progress_callback_data);
@@ -2739,6 +2771,7 @@ static void file_xfer_send_start_msg_async(SpiceMainChannel *channel,
 {
     SpiceMainChannelPrivate *c = channel->priv;
     SpiceFileXferTask *task;
+    gchar *basename;
     static uint32_t xfer_id;    /* Used to identify task id */
     gint i;
 
@@ -2753,7 +2786,14 @@ static void file_xfer_send_start_msg_async(SpiceMainChannel *channel,
         task->progress_callback_data = progress_callback_data;
         task->callback = callback;
         task->user_data = user_data;
+        task->start_time = g_date_time_new_now_local();
+        task->last_update = g_date_time_ref(task->start_time);
 
+        basename = g_file_get_basename(task->file);
+        if (basename != NULL) {
+            g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "transfer of file %s has started", basename);
+            g_free(basename);
+        }
         CHANNEL_DEBUG(task->channel, "Insert a xfer task:%d to task list", task->id);
         g_hash_table_insert(c->file_xfer_tasks, GUINT_TO_POINTER(task->id), task);
 
-- 
1.9.3



More information about the Spice-devel mailing list