[Spice-devel] [spice-gtk][PATCH v2] Added INFO messages about a file transfer
Fabiano FidĂȘncio
fidencio at redhat.com
Thu Sep 18 01:37:41 PDT 2014
On Thu, 2014-09-18 at 04:14 -0400, Pavel Grunt wrote:
> Hi,
>
> Thanks for the review. I made changes according to your suggestions. Also all the logging is now placed just in 'gtk/spice-widget.c'.
>
> Pavel
>
> ---
> 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);
> + }
I didn't get exactly why you're logging only when the user transfers
just one file.
> +
> + 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]);
> }
More information about the Spice-devel
mailing list