file-roller r2191 - in trunk: . src
- From: paobac svn gnome org
- To: svn-commits-list gnome org
- Subject: file-roller r2191 - in trunk: . src
- Date: Mon, 24 Mar 2008 13:47:26 +0000 (GMT)
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]