When a file transfer starts / finishes an information message is printed (in INFO log level). Also INFO messages about the transfer progress are printed. --- changes since v3: - all the logging is now placed just in 'gtk/spice-widget.c' gtk/spice-widget.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index 1220030..ee344f8 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -473,6 +473,61 @@ static gboolean grab_broken(SpiceDisplay *self, GdkEventGrabBroken *event, return false; } +typedef struct FileTransferInfo { + gchar *basename; + GDateTime *start_time; + GDateTime *last_update; +} FileTransferInfo; + +static void file_progress_callback(goffset current_num_bytes, + goffset total_num_bytes, + gpointer user_data) +{ + GDateTime *now; + GTimeSpan diff; + const GTimeSpan interval = 20 * G_TIME_SPAN_SECOND; + FileTransferInfo *file_transfer_info = user_data; + + if (file_transfer_info == NULL) + return; + + now = g_date_time_new_now_local(); + + if (current_num_bytes == total_num_bytes) { + const double mega = 1048576; + double seconds, speed_mbps; + + diff = g_date_time_difference(now, file_transfer_info->start_time); + seconds = (double) diff / G_TIME_SPAN_SECOND; + speed_mbps = (double) total_num_bytes / mega / seconds; + + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, + "transferred file %s of %.2f kB size in %.2f seconds (%.2f MB/s)", + file_transfer_info->basename, total_num_bytes / 1000.0, + seconds, speed_mbps); + + g_free(file_transfer_info->basename); + g_date_time_unref(file_transfer_info->start_time); + g_date_time_unref(file_transfer_info->last_update); + g_date_time_unref(now); + g_free(file_transfer_info); + file_transfer_info = NULL; + return; + } + + diff = g_date_time_difference(now, file_transfer_info->last_update); + if (diff < interval) { + g_date_time_unref(now); + return; + } + + g_date_time_unref(file_transfer_info->last_update); + file_transfer_info->last_update = now; + + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "transferred %.2f%% of the file %s", + 100.0 * current_num_bytes / total_num_bytes, file_transfer_info->basename); +} + static void drag_data_received_callback(SpiceDisplay *self, GdkDragContext *drag_context, gint x, @@ -488,6 +543,7 @@ static void drag_data_received_callback(SpiceDisplay *self, SpiceDisplayPrivate *d = self->priv; int i = 0; GFile **files; + FileTransferInfo *file_transfer_info = NULL; /* We get a buf like: * file:///root/a.txt\r\nfile:///root/b.txt\r\n @@ -504,8 +560,18 @@ static void drag_data_received_callback(SpiceDisplay *self, } g_strfreev(file_urls); - spice_main_file_copy_async(d->main, files, 0, NULL, NULL, - NULL, NULL, NULL); + if (n_files == 1) { + file_transfer_info = g_malloc0(sizeof(FileTransferInfo)); + file_transfer_info->basename = g_file_get_basename(files[0]); + file_transfer_info->start_time = g_date_time_new_now_local(); + file_transfer_info->last_update = g_date_time_ref(file_transfer_info->start_time); + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "transfer of file %s has started", + file_transfer_info->basename); + } + + spice_main_file_copy_async(d->main, files, 0, NULL, + file_progress_callback, file_transfer_info, + NULL, NULL); for (i = 0; i < n_files; i++) { g_object_unref(files[i]); } -- 1.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel