From: Benjamin Otte Date: Mon, 8 Jun 2009 13:27:12 +0000 (+0200) Subject: only query file info in g_file_copy() when we need it X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=29a4a0a44dc09dabe071a989da2500b2bc143cbd;p=dana%2Fcg-glib.git only query file info in g_file_copy() when we need it The default implementation of g_file_copy() checked the size of the file to copy to give useful progress updates unconditionally. This can cause long delays on 1-connection FTP servers while it tries to open a second connection before it returns EBUSY. This patch makes this query only happen when we actually send progress updates. --- diff --git a/gio/gfile.c b/gio/gfile.c index 2d38d718..d91bda96 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -2644,28 +2644,32 @@ copy_stream_with_progress (GInputStream *in, GFileInfo *info; total_size = -1; - info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (in), - G_FILE_ATTRIBUTE_STANDARD_SIZE, - cancellable, NULL); - if (info) - { - if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) - total_size = g_file_info_get_size (info); - g_object_unref (info); - } - - if (total_size == -1) + /* avoid performance impact of querying total size when it's not needed */ + if (progress_callback) { - info = g_file_query_info (source, - G_FILE_ATTRIBUTE_STANDARD_SIZE, - G_FILE_QUERY_INFO_NONE, - cancellable, NULL); + info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (in), + G_FILE_ATTRIBUTE_STANDARD_SIZE, + cancellable, NULL); if (info) { if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) total_size = g_file_info_get_size (info); g_object_unref (info); } + + if (total_size == -1) + { + info = g_file_query_info (source, + G_FILE_ATTRIBUTE_STANDARD_SIZE, + G_FILE_QUERY_INFO_NONE, + cancellable, NULL); + if (info) + { + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) + total_size = g_file_info_get_size (info); + g_object_unref (info); + } + } } if (total_size == -1)