file-roller r2191 - in trunk: . src



Author: paobac
Date: Mon Mar 24 13:47:25 2008
New Revision: 2191
URL: http://svn.gnome.org/viewvc/file-roller?rev=2191&view=rev

Log:
2008-03-24  Paolo Bacchilega  <paobac svn gnome org>

	* src/fr-archive.c: 
	* src/file-utils.h: 
	* src/file-utils.c: 
	* src/file-list.h: 
	* src/file-list.c: 
	
	Started work on async copy functions.

Modified:
   trunk/ChangeLog
   trunk/src/file-list.c
   trunk/src/file-list.h
   trunk/src/file-utils.c
   trunk/src/file-utils.h
   trunk/src/fr-archive.c

Modified: trunk/src/file-list.c
==============================================================================
--- trunk/src/file-list.c	(original)
+++ trunk/src/file-list.c	Mon Mar 24 13:47:25 2008
@@ -260,18 +260,14 @@
 	for (scan = files; scan; scan = scan->next) {
 		GFileInfo *info = scan->data;
 		
-		g_print ("=0=> %s\n", g_file_info_get_name (info));
-		
 		switch (g_file_info_get_file_type (info)) {
 		case G_FILE_TYPE_REGULAR:
 			name = g_uri_escape_string (g_file_info_get_name (info), G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT, FALSE);
 			pld->files = g_list_prepend (pld->files, g_strconcat (directory_uri, "/", name, NULL));
-			g_print ("   [F] \n");
 			break;
 		case G_FILE_TYPE_DIRECTORY:
 			name = g_uri_escape_string (g_file_info_get_name (info), G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT, FALSE);
 			pld->dirs = g_list_prepend (pld->dirs, g_strconcat (directory_uri, "/", name, NULL));
-			g_print ("   [D] \n");
 			break;
 		default:
 			break;
@@ -955,3 +951,281 @@
 
 	return visit_current_dir (gfl_data);
 }
+
+
+/**/
+
+
+typedef struct {
+	GList                 *sources;
+	GList                 *destinations;
+	GFileCopyFlags         flags;
+	int                    io_priority;
+	GCancellable          *cancellable;
+	FilesProgressCallback  progress_callback;
+	gpointer               progress_callback_data;
+	FilesDoneCallback      callback;
+	gpointer               user_data;
+	
+	GList                 *source;
+	GList                 *destination;
+	int                    n_file;
+	int                    tot_files;
+} GIOCopyFilesData;
+
+
+static GIOCopyFilesData*
+gio_copy_files_data_new (GList                 *sources,
+		         GList                 *destinations,
+		         GFileCopyFlags         flags,
+		         int                    io_priority,
+		         GCancellable          *cancellable,
+		         FilesProgressCallback  progress_callback,
+		         gpointer               progress_callback_data,
+		         FilesDoneCallback      callback,
+		         gpointer               user_data)
+{
+	GIOCopyFilesData *cfd;
+	
+	cfd = g_new0 (GIOCopyFilesData, 1);
+	cfd->sources = gio_file_list_dup (sources);
+	cfd->destinations = gio_file_list_dup (destinations);
+	cfd->flags = flags;
+	cfd->io_priority = io_priority;
+	cfd->cancellable = cancellable;
+	cfd->progress_callback = progress_callback;
+	cfd->progress_callback_data = progress_callback_data;
+	cfd->callback = callback;
+	cfd->user_data = user_data;
+	
+	cfd->source = cfd->sources;
+	cfd->destination = cfd->destinations;
+	cfd->n_file = 1;
+	cfd->tot_files = g_list_length (cfd->sources);
+	
+	return cfd;
+}
+
+
+static void
+gio_copy_files_data_free (GIOCopyFilesData *cfd)
+{
+	if (cfd == NULL)
+		return;
+	gio_file_list_free (cfd->sources);
+	gio_file_list_free (cfd->destinations);
+	g_free (cfd);
+}
+
+
+static void gio_copy_current_file (GIOCopyFilesData *cfd);
+
+
+static void
+gio_copy_next_file (GIOCopyFilesData *cfd)
+{
+	cfd->source = g_list_next (cfd->source);
+	cfd->destination = g_list_next (cfd->destination);
+	cfd->n_file++;
+	
+	gio_copy_current_file (cfd);
+}
+
+
+static void
+gio_copy_files_ready_cb (GObject      *source_object,
+                         GAsyncResult *result,
+                         gpointer      user_data)
+{
+	GIOCopyFilesData *cfd = user_data;
+	GFile            *source = cfd->source->data;
+	GError           *error;
+	
+	if (! g_file_copy_finish (source, result, &error)) {
+		if (cfd->callback)
+			cfd->callback (error, cfd->user_data);
+		g_clear_error (&error);
+		gio_copy_files_data_free (cfd);
+		return;
+	}
+	
+	gio_copy_next_file (cfd);
+}
+
+
+static void
+gio_copy_files_progess_cb (goffset  current_num_bytes,
+                           goffset  total_num_bytes,
+                           gpointer user_data)
+{
+	GIOCopyFilesData *cfd = user_data;
+	
+	if (cfd->progress_callback)
+		cfd->progress_callback (cfd->n_file,
+                                        cfd->tot_files,
+                                        (GFile*) cfd->source->data,
+                                        (GFile*) cfd->destination->data,
+                                        current_num_bytes,
+                                        total_num_bytes,
+                                        cfd->progress_callback_data);
+}
+
+
+static void
+gio_copy_current_file (GIOCopyFilesData *cfd)
+{
+	if ((cfd->source == NULL) || (cfd->destination == NULL)) {
+		if (cfd->callback)
+			cfd->callback (NULL, cfd->user_data);
+		gio_copy_files_data_free (cfd);
+		return;
+	}
+	
+	g_file_copy_async ((GFile*) cfd->source->data,
+			   (GFile*) cfd->destination->data,
+			   cfd->flags,
+			   cfd->io_priority,
+			   cfd->cancellable,
+			   gio_copy_files_progess_cb,
+			   cfd,
+			   gio_copy_files_ready_cb,
+			   cfd);
+}
+
+
+void
+gio_copy_files_async (GList                 *sources,
+		      GList                 *destinations,
+		      GFileCopyFlags         flags,
+		      int                    io_priority,
+		      GCancellable          *cancellable,
+		      FilesProgressCallback  progress_callback,
+		      gpointer               progress_callback_data,
+		      FilesDoneCallback      callback,
+		      gpointer               user_data)
+{
+	GIOCopyFilesData *cfd;
+	
+	cfd = gio_copy_files_data_new (sources, 
+				       destinations, 
+				       flags, 
+				       io_priority, 
+				       cancellable, 
+				       progress_callback, 
+				       progress_callback_data, 
+				       callback, 
+				       user_data);
+	gio_copy_current_file (cfd);
+}
+
+
+void
+gio_copy_uris_async (GList                 *sources,
+		     GList                 *destinations,
+		     GFileCopyFlags         flags,
+		     int                    io_priority,
+		     GCancellable          *cancellable,
+		     FilesProgressCallback  progress_callback,
+		     gpointer               progress_callback_data,
+		     FilesDoneCallback      callback,
+		     gpointer               user_data)
+{
+	GList *source_files, *destination_files;
+	
+	source_files = gio_file_list_new_from_uri_list (sources);
+	destination_files = gio_file_list_new_from_uri_list (destinations);
+	
+	gio_copy_files_async (source_files, 
+			      destination_files, 
+			      flags, 
+			      io_priority, 
+			      cancellable, 
+			      progress_callback, 
+			      progress_callback_data, 
+			      callback, 
+			      user_data);
+	
+	gio_file_list_free (source_files);
+	gio_file_list_free (destination_files);
+}
+
+
+typedef struct {
+	GFile                 *source;
+	GFile                 *destination;
+	GFileCopyFlags         flags;
+	int                    io_priority;
+	GCancellable          *cancellable;
+	FilesProgressCallback  progress_callback;
+	gpointer               progress_callback_data;
+	FilesDoneCallback      callback;
+	gpointer               user_data;
+	
+	char                  *directory;		  
+	VisitDirHandle        *vdh;
+} GIOCopyDirectoryData;
+
+
+static void
+gio_copy_directory_done_cb (GList    *files,
+			    gpointer  user_data) 
+{
+	GIOCopyDirectoryData *cdd = user_data;
+	GList                *sources = NULL, *destinations = NULL, *scan;
+	char                 *source, *destination;
+	
+	source = g_file_get_uri (cdd->source);
+	destination = g_file_get_uri (cdd->destination);
+	for (scan = files; scan; scan = scan->next) {
+		sources = g_list_prepend (sources, g_strconcat (source, "/", (char*)scan->data, NULL));
+		destinations = g_list_prepend (destinations, g_strconcat (destination, "/", (char*)scan->data, NULL));
+	}
+	g_object_unref (source);
+	g_object_unref (destination);
+	
+	gio_copy_uris_async (sources, 
+			     destinations, 
+			     cdd->flags, 
+			     cdd->io_priority, 
+			     cdd->cancellable, 
+			     cdd->progress_callback, 
+			     cdd->progress_callback_data, 
+			     cdd->callback, 
+			     cdd->user_data);
+			     
+	path_list_free (sources);
+	path_list_free (destinations);
+}
+
+
+void 
+gio_copy_directory_async (GFile                 *source,
+		   	  GFile                 *destination,
+			  GFileCopyFlags         flags,
+			  int                    io_priority,
+			  GCancellable          *cancellable,
+			  FilesProgressCallback  progress_callback,
+			  gpointer               progress_callback_data,
+			  FilesDoneCallback      callback,
+			  gpointer               user_data)
+{
+	GIOCopyDirectoryData *cdd;
+	
+	cdd = g_new0 (GIOCopyDirectoryData, 1);
+	cdd->source = g_file_dup (source);
+	cdd->destination = g_file_dup (destination);
+	cdd->flags = flags;
+	cdd->io_priority = io_priority;
+	cdd->cancellable = cancellable;
+	cdd->progress_callback = progress_callback;
+	cdd->progress_callback_data = progress_callback_data;
+	cdd->callback = callback;
+	cdd->user_data = user_data;
+	
+	cdd->directory = g_file_get_uri (cdd->source);
+	cdd->vdh = get_directory_file_list_async (cdd->directory,
+						  cdd->directory,
+						  TRUE,
+						  gio_copy_directory_done_cb,
+						  cdd);
+}

Modified: trunk/src/file-list.h
==============================================================================
--- trunk/src/file-list.h	(original)
+++ trunk/src/file-list.h	Mon Mar 24 13:47:25 2008
@@ -24,6 +24,7 @@
 #define _FILE_LIST_H
 
 #include <glib.h>
+#include <gio/gio.h>
 
 typedef void (*DoneFunc) (gpointer data);
 
@@ -70,4 +71,44 @@
 						     VisitDirDoneFunc  done_func,
 						     gpointer          done_data);
 
+/**/
+
+typedef void        (*FilesProgressCallback)     (goffset    current_file,
+                                                  goffset    total_files,
+                                                  GFile     *source,
+                                                  GFile     *destination,
+                                                  goffset    current_num_bytes,
+                                                  goffset    total_num_bytes,
+                                                  gpointer   user_data);
+typedef void        (*FilesDoneCallback)         (GError    *error,
+						  gpointer   user_data);
+						  
+void                gio_copy_files_async         (GList                 *sources,
+						  GList                 *destinations,
+						  GFileCopyFlags         flags,
+						  int                    io_priority,
+						  GCancellable          *cancellable,
+						  FilesProgressCallback  progress_callback,
+						  gpointer               progress_callback_data,
+						  FilesDoneCallback      callback,
+						  gpointer               user_data);
+void                gio_copy_uris_async          (GList                 *sources,
+						  GList                 *destinations,
+						  GFileCopyFlags         flags,
+						  int                    io_priority,
+						  GCancellable          *cancellable,
+						  FilesProgressCallback  progress_callback,
+						  gpointer               progress_callback_data,
+						  FilesDoneCallback      callback,
+						  gpointer               user_data);		  
+void                gio_copy_directory_async     (GFile                 *source,
+						  GFile                 *destination,
+						  GFileCopyFlags         flags,
+						  int                    io_priority,
+						  GCancellable          *cancellable,
+						  FilesProgressCallback  progress_callback,
+						  gpointer               progress_callback_data,
+						  FilesDoneCallback      callback,
+						  gpointer               user_data);
+
 #endif /* _FILE_LIST_H */

Modified: trunk/src/file-utils.c
==============================================================================
--- trunk/src/file-utils.c	(original)
+++ trunk/src/file-utils.c	Mon Mar 24 13:47:25 2008
@@ -1398,3 +1398,33 @@
 	
 	return new_uri;
 }
+
+
+GList *
+gio_file_list_dup (GList *l)
+{
+	GList *r = NULL, *scan;
+	for (scan = l; scan; scan = scan->next)
+		r = g_list_prepend (r, g_file_dup ((GFile*)scan->data));
+	return g_list_reverse (r);
+}
+
+
+void
+gio_file_list_free (GList *l)
+{
+	GList *scan;
+	for (scan = l; scan; scan = scan->next)
+		g_object_unref (scan->data);
+	g_list_free (l);
+}
+
+
+GList *
+gio_file_list_new_from_uri_list (GList *uris) 
+{
+	GList *r = NULL, *scan;
+	for (scan = uris; scan; scan = scan->next)
+		r = g_list_prepend (r, g_file_new_for_uri ((char*)scan->data));
+	return g_list_reverse (r);
+}

Modified: trunk/src/file-utils.h
==============================================================================
--- trunk/src/file-utils.h	(original)
+++ trunk/src/file-utils.h	Mon Mar 24 13:47:25 2008
@@ -25,6 +25,7 @@
 
 #include <sys/types.h>
 #include <time.h>
+#include <gio/gio.h>
 #include <libgnomevfs/gnome-vfs-file-size.h>
 #include <libgnomevfs/gnome-vfs-mime-handlers.h>
 
@@ -115,4 +116,8 @@
 	     					  const char *name);
 char *              get_new_uri_from_uri         (const char *uri);
 
+GList *             gio_file_list_dup               (GList *l);
+void                gio_file_list_free              (GList *l);
+GList *             gio_file_list_new_from_uri_list (GList *uris);
+
 #endif /* FILE_UTILS_H */

Modified: trunk/src/fr-archive.c
==============================================================================
--- trunk/src/fr-archive.c	(original)
+++ trunk/src/fr-archive.c	Mon Mar 24 13:47:25 2008
@@ -3,7 +3,7 @@
 /*
  *  File-Roller
  *
- *  Copyright (C) 2001, 2003, 2007 Free Software Foundation, Inc.
+ *  Copyright (C) 2001, 2003, 2007, 2008 Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -3053,7 +3053,8 @@
 	if (! use_base_dir
 	    && ! (! overwrite && ! archive->command->propExtractCanAvoidOverwrite)
 	    && ! (skip_older && ! archive->command->propExtractCanSkipOlder)
-	    && ! (junk_paths && ! archive->command->propExtractCanJunkPaths)) {
+	    && ! (junk_paths && ! archive->command->propExtractCanJunkPaths)) 
+	{
 		gboolean created_filtered_list = FALSE;
 
 		if (! extract_all && archive_type_has_issues_extracting_non_empty_folders (archive)) {
@@ -3442,12 +3443,10 @@
 	const char *mime_type;
 
 	mime_type = get_mime_type_from_content (filename);
-
 	if (mime_type == NULL)
 		return FALSE;
 
 	mime_type = get_mime_type_from_sniffer (filename);
-
 	if (mime_type != NULL)
 		return TRUE;
 



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