[gthumb] GIO dlg-search conversion, bug 525482
- From: Michael J. Chudobiak <mjc src gnome org>
- To: svn-commits-list gnome org
- Subject: [gthumb] GIO dlg-search conversion, bug 525482
- Date: Wed, 24 Jun 2009 13:03:56 +0000 (UTC)
commit 34927038f7e64cd25ecb61870eb793a51c62a2ec
Author: Marlodavampire <brooss teambb gmail com>
Date: Wed Jun 24 09:03:10 2009 -0400
GIO dlg-search conversion, bug 525482
Add start_from_gfile to SearchData
Pass name_only to file_respects_search_criteria
Update search_dir_aysnc to use GFiles
Update directory_load_cb to use GFiles
Add scan_next_dir function
Add search_dir_next_files_cb
Change data->dirs to GFiles
libgthumb/search.c | 10 ++
libgthumb/search.h | 1 +
src/dlg-search.c | 319 ++++++++++++++++++++++++++++++----------------------
3 files changed, 193 insertions(+), 137 deletions(-)
---
diff --git a/libgthumb/search.c b/libgthumb/search.c
index eaa7922..122007c 100644
--- a/libgthumb/search.c
+++ b/libgthumb/search.c
@@ -22,8 +22,10 @@
#include <string.h>
#include <glib.h>
+#include <gio/gio.h>
#include "search.h"
#include "glib-utils.h"
+#include "gfile-utils.h"
SearchData*
@@ -34,6 +36,7 @@ search_data_new ()
data = g_new (SearchData, 1);
data->start_from = NULL;
+ data->start_from_gfile = NULL;
data->recursive = FALSE;
data->file_pattern = NULL;
data->comment_pattern = NULL;
@@ -77,6 +80,10 @@ search_data_free (SearchData *data)
g_free (data->start_from);
data->start_from = NULL;
}
+ if (data->start_from_gfile) {
+ g_object_unref (data->start_from_gfile);
+ data->start_from_gfile = NULL;
+ }
g_free (data);
}
@@ -98,6 +105,9 @@ search_data_set_start_from (SearchData *data,
{
g_return_if_fail (data != NULL);
set_string (& (data->start_from), start_from);
+ if (data->start_from_gfile != NULL)
+ g_object_unref (data->start_from_gfile);
+ data->start_from_gfile = gfile_new (start_from);
}
diff --git a/libgthumb/search.h b/libgthumb/search.h
index 628de95..7997738 100644
--- a/libgthumb/search.h
+++ b/libgthumb/search.h
@@ -35,6 +35,7 @@ typedef enum { /*< skip >*/
typedef struct {
char *start_from;
+ GFile *start_from_gfile;
gboolean recursive;
char *file_pattern;
char *comment_pattern;
diff --git a/src/dlg-search.c b/src/dlg-search.c
index b19bb4b..403127c 100644
--- a/src/dlg-search.c
+++ b/src/dlg-search.c
@@ -30,7 +30,6 @@
#include <libgnome/gnome-help.h>
#include <libgnomeui/gnome-dateedit.h>
#include <glade/glade.h>
-#include <libgnomevfs/gnome-vfs.h>
#include "file-utils.h"
#include "file-data.h"
@@ -44,6 +43,7 @@
#include "gth-utils.h"
#include "gtk-utils.h"
#include "glib-utils.h"
+#include "gfile-utils.h"
enum {
@@ -132,12 +132,12 @@ typedef struct {
char **keywords_patterns;
gboolean all_keywords;
- GnomeVFSAsyncHandle *handle;
- GnomeVFSURI *uri;
- GList *files;
- GList *dirs;
-
- char *catalog_path;
+ GFileEnumerator *gfile_enum;
+ GCancellable *cancelled;
+ GFile *gfile;
+ GList *files;
+ GList *dirs; /* GFile* items. */
+ char *catalog_path;
GHashTable *folders_comment;
GHashTable *hidden_files;
@@ -190,7 +190,7 @@ free_search_results_data (DialogData *data)
}
if (data->dirs) {
- path_list_free (data->dirs);
+ gfile_list_free (data->dirs);
data->dirs = NULL;
}
@@ -216,14 +216,17 @@ destroy_cb (GtkWidget *widget,
free_search_criteria_data (data);
free_search_results_data (data);
search_data_free (data->search_data);
- if (data->uri != NULL)
- gnome_vfs_uri_unref (data->uri);
+ if (data->gfile_enum != NULL)
+ g_object_unref (data->gfile_enum);
+ if (data->gfile != NULL)
+ g_object_unref (data->gfile);
if (data->catalog_path != NULL)
g_free (data->catalog_path);
if (data->folders_comment != NULL)
g_hash_table_destroy (data->folders_comment);
if (data->hidden_files != NULL)
g_hash_table_destroy (data->hidden_files);
+ g_object_unref(data->cancelled);
g_free (data);
}
@@ -358,6 +361,7 @@ view_result_cb (GtkWidget *widget,
char *catalog_name, *catalog_path, *catalog_name_utf8;
GList *scan;
GError *gerror;
+ GFile *catalog_gfile = NULL;
if (data->files == NULL)
return;
@@ -368,10 +372,12 @@ view_result_cb (GtkWidget *widget,
catalog_name_utf8 = g_strconcat (_("Search Result"),
CATALOG_EXT,
NULL);
- catalog_name = gnome_vfs_escape_string (catalog_name_utf8);
+ catalog_gfile = g_file_parse_name (catalog_name_utf8);
+ catalog_name = g_file_get_basename (catalog_gfile);
catalog_path = get_catalog_full_path (catalog_name);
g_free (catalog_name);
g_free (catalog_name_utf8);
+ g_object_unref (catalog_gfile);
catalog_set_path (catalog, catalog_path);
catalog_set_search_data (catalog, data->search_data);
@@ -457,11 +463,7 @@ static void
cancel_progress_dlg_cb (GtkWidget *widget,
DialogData *data)
{
- if (data->handle == NULL)
- return;
- gnome_vfs_async_cancel (data->handle);
- data->handle = NULL;
- search_finished (data);
+ g_cancellable_cancel (data->cancelled);
}
@@ -552,9 +554,10 @@ dlg_search_ui (GthBrowser *browser,
data->dirs = NULL;
data->files = NULL;
data->browser = browser;
- data->handle = NULL;
data->search_data = NULL;
- data->uri = NULL;
+ data->gfile_enum = NULL;
+ data->gfile = NULL;
+ data->cancelled = g_cancellable_new ();
data->catalog_path = catalog_path;
data->folders_comment = g_hash_table_new (g_str_hash, g_str_equal);
data->hidden_files = NULL;
@@ -885,7 +888,8 @@ add_parents_comments (CommentData *comment_data,
static gboolean
file_respects_search_criteria (DialogData *data,
- char *filename)
+ char *filename,
+ char *name_only)
{
CommentData *comment_data;
gboolean result;
@@ -895,7 +899,6 @@ file_respects_search_criteria (DialogData *data,
char *comment;
char *place;
time_t time = 0;
- const char *name_only;
if (! file_is_image_video_or_audio (filename, eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE)))
return FALSE;
@@ -950,7 +953,6 @@ file_respects_search_criteria (DialogData *data,
&& (time > data->search_data->date + ONE_DAY))
match_date = TRUE;
- name_only = filename + strlen (data->search_data->start_from);
result = (match_patterns (data->file_patterns, name_only)
&& match_patterns (data->comment_patterns, comment)
&& match_patterns (data->place_patterns, place)
@@ -978,9 +980,7 @@ add_file_list (DialogData *data,
gth_file_list_add_list (data->file_list, file_list);
}
-
-static void search_dir_async (DialogData *data, gchar *dir);
-
+static void search_dir_async (DialogData *data, GFile *gfile);
static gboolean
cache_dir (const char *folder)
@@ -1000,148 +1000,192 @@ cache_dir (const char *folder)
return FALSE;
}
-
static void
-directory_load_cb (GnomeVFSAsyncHandle *handle,
- GnomeVFSResult result,
- GList *list,
- guint entries_read,
- gpointer callback_data)
+scan_next_dir (DialogData *data)
{
- DialogData *data = callback_data;
- GnomeVFSFileInfo *info;
- GList *node, *files = NULL;
+ gboolean good_dir_to_search_into = TRUE;
+ do {
+ GList *first_dir;
+ GFile *dir;
- for (node = list; node != NULL; node = node->next) {
- GnomeVFSURI *full_uri = NULL;
- char *str_uri;
- char *real_uri;
- char *unesc_uri;
+ if (data->dirs == NULL) {
+ search_finished (data);
+ return;
+ }
- info = node->data;
+ first_dir = data->dirs;
+ data->dirs = g_list_remove_link (data->dirs, first_dir);
+ dir = (GFile*) first_dir->data;
+ g_list_free (first_dir);
- switch (info->type) {
- case GNOME_VFS_FILE_TYPE_REGULAR:
- if (g_hash_table_lookup (data->hidden_files, info->name) != NULL)
- break;
- full_uri = gnome_vfs_uri_append_file_name (data->uri, info->name);
- str_uri = gnome_vfs_uri_to_string (full_uri, GNOME_VFS_URI_HIDE_NONE);
- unesc_uri = gnome_vfs_unescape_string (str_uri, "");
+ good_dir_to_search_into = ! cache_dir (g_file_get_basename (dir));
+ if (good_dir_to_search_into)
+ search_dir_async (data, dir);
+ g_object_unref (dir);
+ } while (! good_dir_to_search_into);
+}
- if (file_respects_search_criteria (data, unesc_uri)) {
- FileData *file;
-
- file = file_data_new_from_path (str_uri);
- file_data_update_mime_type (file, data->fast_file_type);
- files = g_list_prepend (files, file);
+
+static void
+search_dir_next_files_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer callback_data)
+{
+ DialogData *data = callback_data;
+ GFileInfo *info;
+ GError *error = NULL;
+ GList *files = NULL, *node, *list;
+
+ list = g_file_enumerator_next_files_finish (data->gfile_enum, res ,&error);
+ for (node = list; node != NULL; node = node->next) {
+ GFile *child;
+ GFile *path;
+ path = g_file_dup (data->gfile);
+ info = node->data;
+
+ /* Resolve symlinks */
+ if (g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) {
+ GFile *sym_target = NULL;
+ GFileInfo *info2;
+ GError *error = NULL;
+
+ child = g_file_get_child (data->gfile, g_file_info_get_name (info));
+ sym_target = g_file_resolve_relative_path (child, g_file_info_get_symlink_target (info));
+ path = g_file_get_parent (sym_target);
+ info2 = g_file_query_info (sym_target, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error);
+ g_object_unref (info);
+ info = info2;
+
+ if (info == NULL) {
+ gfile_warning ("Cannot resolve symlink", sym_target, error);
+ g_error_free(error);
}
- else
- g_free (str_uri);
- g_free (unesc_uri);
- break;
+ g_object_unref (sym_target);
+ g_object_unref (child);
+ }
+ if (info != NULL) {
+ switch (g_file_info_get_file_type (info)) {
+ case G_FILE_TYPE_REGULAR:
+ child = g_file_get_child (path, g_file_info_get_name (info));
+ if (g_hash_table_lookup (data->hidden_files, g_file_info_get_name (info)) != NULL)
+ break;
+
+ char *name_only;
+ char *uri;
+ uri = g_file_get_parse_name (child);
+ name_only = g_file_get_basename (child);
+
+ if (file_respects_search_criteria (data, uri, name_only)) {
+ FileData *file;
+ file = file_data_new_from_gfile (child);
+ file_data_update_mime_type (file, data->fast_file_type);
+ files = g_list_prepend (files, file);
+ }
+ g_free (name_only);
+ g_free (uri);
+ g_object_unref (child);
+ break;
- case GNOME_VFS_FILE_TYPE_DIRECTORY:
- if (SPECIAL_DIR (info->name))
+ case G_FILE_TYPE_DIRECTORY:
+ child = g_file_get_child (path, g_file_info_get_name (info));
+ if (SPECIAL_DIR (g_file_info_get_name (info)))
+ break;
+ if (g_hash_table_lookup (data->hidden_files, g_file_info_get_name (info)) != NULL)
+ break;
+ if (g_hash_table_lookup (data->visited_dirs, child) == NULL) {
+ data->dirs = g_list_prepend (data->dirs, g_file_dup (child));
+ g_hash_table_insert (data->visited_dirs, g_file_dup (child), GINT_TO_POINTER (1));
+ }
+ g_object_unref (child);
break;
- if (g_hash_table_lookup (data->hidden_files, info->name) != NULL)
+
+ default:
break;
- full_uri = gnome_vfs_uri_append_path (data->uri, info->name);
- str_uri = gnome_vfs_uri_to_string (full_uri, GNOME_VFS_URI_HIDE_NONE);
- real_uri = resolve_all_symlinks (str_uri);
- if (g_hash_table_lookup (data->visited_dirs, real_uri) == NULL) {
- data->dirs = g_list_prepend (data->dirs, g_strdup (real_uri));
- g_hash_table_insert (data->visited_dirs, g_strdup (real_uri), GINT_TO_POINTER (1));
}
- g_free (real_uri);
- g_free (str_uri);
- break;
-
- default:
- break;
+ g_object_unref (info);
}
- if (full_uri)
- gnome_vfs_uri_unref (full_uri);
+ g_object_unref (path);
}
-
+ g_list_free(list);
+
+
if (files != NULL)
add_file_list (data, files);
+
+ if (! data->search_data->recursive) {
+ search_finished (data);
+ return;
+ }
+
+ scan_next_dir (data);
+}
- if (result != GNOME_VFS_OK) {
- gboolean good_dir_to_search_into = TRUE;
- if (result != GNOME_VFS_ERROR_EOF) {
- char *path;
+static void
+directory_load_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer callback_data)
+{
+ DialogData *data = callback_data;
+ GError *error = NULL;
+
+ if (data->gfile_enum != NULL)
+ g_object_unref (data->gfile_enum);
- path = gnome_vfs_uri_to_string (data->uri,
- GNOME_VFS_URI_HIDE_NONE);
- /*g_warning ("Cannot load directory \"%s\": %s\n", path,
- gnome_vfs_result_to_string (result));*/
- g_free (path);
- }
+ data->gfile_enum = g_file_enumerate_children_finish (data->gfile, res, &error);
- if (! data->search_data->recursive) {
- search_finished (data);
- return;
+ if (data->gfile_enum == NULL) {
+ if (!g_cancellable_is_cancelled (data->cancelled) )
+ {
+ scan_next_dir (data);
+ gfile_warning ("Cannot load directory", data->gfile, error);
}
+ else
+ search_finished (data);
+ g_error_free (error);
+ return;
+ }
- do {
- GList *first_dir;
- char *dir;
-
- if (data->dirs == NULL) {
- search_finished (data);
- return;
- }
-
- first_dir = data->dirs;
- data->dirs = g_list_remove_link (data->dirs, first_dir);
- dir = (char*) first_dir->data;
- g_list_free (first_dir);
-
- good_dir_to_search_into = ! cache_dir (file_name_from_path (dir));
- if (good_dir_to_search_into)
- search_dir_async (data, dir);
- g_free (dir);
- } while (! good_dir_to_search_into);
- }
+ g_file_enumerator_next_files_async (data->gfile_enum,
+ G_MAXINT,
+ G_PRIORITY_DEFAULT,
+ data->cancelled,
+ search_dir_next_files_cb,
+ data);
+
}
static void
search_dir_async (DialogData *data,
- char *dir)
+ GFile *gfile)
{
- char *uri, *real_uri;
+ char *path;
- _gtk_entry_set_filename_text (GTK_ENTRY (data->p_current_dir_entry), dir);
-
- /**/
-
- if (data->uri != NULL)
- gnome_vfs_uri_unref (data->uri);
+ if (data->gfile != NULL)
+ g_object_unref (data->gfile);
+
+ data->gfile = g_file_dup (gfile);
+
+ path = g_file_get_parse_name (gfile);
+ _gtk_entry_set_filename_text (GTK_ENTRY (data->p_current_dir_entry), path);
+
+ g_hash_table_insert (data->visited_dirs, g_file_dup (gfile), GINT_TO_POINTER (1));
- uri = add_scheme_if_absent (dir);
- real_uri = resolve_all_symlinks (uri);
- g_free (uri);
-
- g_hash_table_insert (data->visited_dirs, g_strdup (real_uri), GINT_TO_POINTER (1));
- data->uri = new_uri_from_path (real_uri);
- g_free (real_uri);
-
if (data->hidden_files != NULL)
g_hash_table_destroy (data->hidden_files);
- data->hidden_files = read_dot_hidden_file (dir);
-
- gnome_vfs_async_load_directory_uri (
- & (data->handle),
- data->uri,
- GNOME_VFS_FILE_INFO_FOLLOW_LINKS,
- 128 /* items_per_notification FIXME */,
- GNOME_VFS_PRIORITY_DEFAULT,
- directory_load_cb,
- data);
+ data->hidden_files = read_dot_hidden_file (path);
+ g_free (path);
+
+ g_file_enumerate_children_async (data->gfile,
+ "standard::*",
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ G_PRIORITY_DEFAULT,
+ data->cancelled,
+ directory_load_cb,
+ data);
}
@@ -1160,12 +1204,13 @@ search_images_async (DialogData *data)
SearchData *search_data = data->search_data;
free_search_results_data (data);
- data->visited_dirs = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- (GDestroyNotify) g_free,
+ data->visited_dirs = g_hash_table_new_full (g_file_hash,
+ (GEqualFunc)g_file_equal,
+ g_object_unref,
NULL);
gth_file_list_set_list (data->file_list, NULL, pref_get_arrange_type (), pref_get_sort_order ());
- search_dir_async (data, search_data->start_from);
+ g_cancellable_reset (data->cancelled);
+ search_dir_async (data, search_data->start_from_gfile);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]