glib r6763 - trunk/gio



Author: alexl
Date: Fri Mar 28 12:43:11 2008
New Revision: 6763
URL: http://svn.gnome.org/viewvc/glib?rev=6763&view=rev

Log:
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)



Modified:
   trunk/gio/ChangeLog
   trunk/gio/gfile.c

Modified: trunk/gio/gfile.c
==============================================================================
--- trunk/gio/gfile.c	(original)
+++ trunk/gio/gfile.c	Fri Mar 28 12:43:11 2008
@@ -2117,6 +2117,8 @@
 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 @@
   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 @@
 
       if (!res)
         break;
-      
+
       if (progress_callback)
 	progress_callback (current_size, total_size, progress_callback_data);
     }
@@ -2182,7 +2202,6 @@
   /* 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 @@
       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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]