diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-03-28 12:43:11 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-03-28 12:43:11 +0000 |
commit | 941513cdca56bc56b962c38fb63ebfc0a6cc824b (patch) | |
tree | bb4d2c23cd58cd4ca3010cf9493e7b3d7657ee3f /gio/gfile.c | |
parent | b4e4bbd594ad84de4221e501bf3048082469dc32 (diff) |
Fallback to g_file_query_info for source size if
2008-03-28 Alexander Larsson <alexl@redhat.com>
* gfile.c:
(copy_stream_with_progress):
(file_copy_fallback):
Fallback to g_file_query_info for source size
if g_file_input_stream_query_info fails. (#524579)
svn path=/trunk/; revision=6763
Diffstat (limited to 'gio/gfile.c')
-rw-r--r-- | gio/gfile.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gio/gfile.c b/gio/gfile.c index 3a6c9a6bd..b592ed8a4 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -2117,6 +2117,8 @@ g_file_copy_attributes (GFile *source, static gboolean copy_stream_with_progress (GInputStream *in, GOutputStream *out, + GFile *source, + GFileQueryInfoFlags info_flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, @@ -2129,15 +2131,33 @@ copy_stream_with_progress (GInputStream *in, goffset total_size; GFileInfo *info; - total_size = 0; + total_size = -1; info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (in), G_FILE_ATTRIBUTE_STANDARD_SIZE, cancellable, NULL); if (info) { - total_size = g_file_info_get_size (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) + total_size = 0; current_size = 0; res = TRUE; @@ -2171,7 +2191,7 @@ copy_stream_with_progress (GInputStream *in, if (!res) break; - + if (progress_callback) progress_callback (current_size, total_size, progress_callback_data); } @@ -2182,7 +2202,6 @@ copy_stream_with_progress (GInputStream *in, /* Make sure we send full copied size */ if (progress_callback) progress_callback (current_size, total_size, progress_callback_data); - /* Don't care about errors in source here */ g_input_stream_close (in, cancellable, NULL); @@ -2260,7 +2279,7 @@ file_copy_fallback (GFile *source, return FALSE; } - if (!copy_stream_with_progress (in, out, cancellable, + if (!copy_stream_with_progress (in, out, source, cancellable, progress_callback, progress_callback_data, error)) return FALSE; |