Fallback to g_file_query_info for source size if
authorAlexander Larsson <alexl@redhat.com>
Fri, 28 Mar 2008 12:43:11 +0000 (12:43 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Fri, 28 Mar 2008 12:43:11 +0000 (12:43 +0000)
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

gio/ChangeLog
gio/gfile.c

index ceadde9..377e718 100644 (file)
@@ -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.
 
index 3a6c9a6..b592ed8 100644 (file)
@@ -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;