summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-03-28 12:43:11 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-03-28 12:43:11 +0000
commit941513cdca56bc56b962c38fb63ebfc0a6cc824b (patch)
treebb4d2c23cd58cd4ca3010cf9493e7b3d7657ee3f
parentb4e4bbd594ad84de4221e501bf3048082469dc32 (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
-rw-r--r--gio/ChangeLog8
-rw-r--r--gio/gfile.c29
2 files changed, 32 insertions, 5 deletions
diff --git a/gio/ChangeLog b/gio/ChangeLog
index ceadde999..377e7184e 100644
--- a/gio/ChangeLog
+++ b/gio/ChangeLog
@@ -1,5 +1,13 @@
2008-03-28 Alexander Larsson <alexl@redhat.com>
+ Reviewed by NOBODY (OOPS!).
+
+ * gfile.c:
+ (copy_stream_with_progress):
+ (file_copy_fallback):
+
+2008-03-28 Alexander Larsson <alexl@redhat.com>
+
* glocalfile.c (g_local_file_move):
Reuse old string instead of adding new one.
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;