summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2005-11-25 15:52:14 +0000
committerAlexander Larsson <alexl@src.gnome.org>2005-11-25 15:52:14 +0000
commite11a936656f6f23847dddaad47120b51c3c85fd9 (patch)
tree02ac4184554902e7f498f21872f4f7d62e59452c
parent56be25227cfd6d19a2c40cdf1cfa376a661b5e69 (diff)
downloadnautilus-e11a936656f6f23847dddaad47120b51c3c85fd9.tar.gz
Fix various bugs and leaks, generally make the code more solid and correct.NAUTILUS_SEARCH2_BRANCH_ANCHOR
-rw-r--r--libnautilus-private/nautilus-file.c37
-rw-r--r--libnautilus-private/nautilus-search-directory-file.c110
-rw-r--r--libnautilus-private/nautilus-search-directory.c90
-rw-r--r--libnautilus-private/nautilus-search-engine-beagle.c3
-rw-r--r--src/file-manager/fm-properties-window.c9
5 files changed, 179 insertions, 70 deletions
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 720e8be36..5e23acfaf 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -76,9 +76,13 @@
#undef NAUTILUS_FILE_DEBUG_REF
+#undef NAUTILUS_FILE_DEBUG_REF_VALGRIND
-#ifdef NAUTILUS_FILE_DEBUG_REF
+#ifdef NAUTILUS_FILE_DEBUG_REF_VALGRIND
#include <valgrind/valgrind.h>
+#define DEBUG_REF_PRINTF VALGRIND_PRINTF_BACKTRACE
+#else
+#define DEBUG_REF_PRINTF printf
#endif
/* Files that start with these characters sort after files that don't. */
@@ -213,8 +217,7 @@ nautilus_file_new_from_relative_uri (NautilusDirectory *directory,
file->details->relative_uri = g_strdup (relative_uri);
#ifdef NAUTILUS_FILE_DEBUG_REF
- if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0)
- VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file);
+ DEBUG_REF_PRINTF("%10p ref'd", file);
#endif
return file;
@@ -322,8 +325,7 @@ nautilus_file_new_from_info (NautilusDirectory *directory,
#ifdef NAUTILUS_FILE_DEBUG_REF
- if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0)
- VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file);
+ DEBUG_REF_PRINTF("%10p ref'd", file);
#endif
return file;
@@ -407,21 +409,22 @@ nautilus_file_get_internal (const char *uri, gboolean create)
file_name = nautilus_directory_get_name_for_self_as_new_file (directory);
relative_uri = gnome_vfs_escape_string (file_name);
g_free (file_name);
- } else if (eel_uri_is_desktop (uri)) {
- /* Special case desktop files here. They have no vfs_uri */
- relative_uri_tmp = uri + strlen (EEL_DESKTOP_URI);
- while (*relative_uri_tmp == '/') {
+ } else if (eel_uri_is_desktop (uri) ||
+ eel_uri_is_search (uri)) {
+ /* Special case virtual methods like desktop and search
+ files here. They have no vfs_uri. */
+ relative_uri_tmp = uri;
+ /* Skip "method:" */
+ while (*relative_uri_tmp != 0 && *relative_uri_tmp != ':') {
relative_uri_tmp++;
}
- relative_uri = strdup (relative_uri_tmp);
- } else if (eel_uri_is_search (uri)) {
- /* Special case search files as well. */
- relative_uri_tmp = uri + strlen (EEL_SEARCH_URI);
+ relative_uri_tmp++;
+ /* Skip initial slashes */
while (*relative_uri_tmp == '/') {
relative_uri_tmp++;
}
relative_uri = strdup (relative_uri_tmp);
- }
+ }
}
/* Check to see if it's a file that's already known. */
@@ -541,8 +544,7 @@ nautilus_file_ref (NautilusFile *file)
g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
#ifdef NAUTILUS_FILE_DEBUG_REF
- if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0)
- VALGRIND_PRINTF_BACKTRACE("%10p ref'd", file);
+ DEBUG_REF_PRINTF("%10p ref'd", file);
#endif
g_object_ref (file);
@@ -559,8 +561,7 @@ nautilus_file_unref (NautilusFile *file)
g_return_if_fail (NAUTILUS_IS_FILE (file));
#ifdef NAUTILUS_FILE_DEBUG_REF
- if (strcmp (nautilus_file_get_uri (file), "file:///home/andersca/src/gnome/gtk%2B/gtk/gtkbutton.c") == 0)
- VALGRIND_PRINTF_BACKTRACE("%10p unref'd", file);
+ DEBUG_REF_PRINTF("%10p unref'd", file);
#endif
g_object_unref (file);
diff --git a/libnautilus-private/nautilus-search-directory-file.c b/libnautilus-private/nautilus-search-directory-file.c
index 1aa9bfa7d..86c077a94 100644
--- a/libnautilus-private/nautilus-search-directory-file.c
+++ b/libnautilus-private/nautilus-search-directory-file.c
@@ -55,17 +55,15 @@ search_directory_file_monitor_add (NautilusFile *file,
gconstpointer client,
NautilusFileAttributes attributes)
{
- nautilus_directory_monitor_add_internal (file->details->directory,
- file, client, TRUE, TRUE,
- attributes, NULL, NULL);
+ /* No need for monitoring, we always emit changed when files
+ are added/removed, and no other metadata changes */
}
static void
search_directory_file_monitor_remove (NautilusFile *file,
gconstpointer client)
{
- nautilus_directory_monitor_remove_internal (file->details->directory,
- file, client);
+ /* Do nothing here, we don't have any monitors */
}
static void
@@ -75,10 +73,8 @@ search_directory_file_call_when_ready (NautilusFile *file,
gpointer callback_data)
{
- nautilus_directory_call_when_ready_internal (file->details->directory,
- file, file_attributes,
- FALSE, NULL,
- callback, callback_data);
+ /* All data for directory-as-file is always uptodate */
+ (* callback) (file, callback_data);
}
static void
@@ -94,9 +90,7 @@ static gboolean
search_directory_file_check_if_ready (NautilusFile *file,
NautilusFileAttributes attributes)
{
- return nautilus_directory_check_if_ready_internal
- (file->details->directory,
- file, attributes);
+ return TRUE;
}
static GnomeVFSFileType
@@ -125,13 +119,103 @@ search_directory_file_get_item_count (NautilusFile *file,
return TRUE;
}
+
+static NautilusRequestStatus
+search_directory_file_get_deep_counts (NautilusFile *file,
+ guint *directory_count,
+ guint *file_count,
+ guint *unreadable_directory_count,
+ GnomeVFSFileSize *total_size)
+{
+ NautilusSearchDirectory *search_dir;
+ NautilusFile *dir_file;
+ GList *file_list, *l;
+ guint dirs, files;
+ GnomeVFSFileType type;
+
+ search_dir = NAUTILUS_SEARCH_DIRECTORY (file->details->directory);
+
+ file_list = nautilus_directory_get_file_list (file->details->directory);
+
+ dirs = files = 0;
+ for (l = file_list; l != NULL; l = l->next) {
+ dir_file = NAUTILUS_FILE (l->data);
+ type = nautilus_file_get_file_type (dir_file);
+ if (type == GNOME_VFS_FILE_TYPE_DIRECTORY) {
+ dirs++;
+ } else {
+ files++;
+ }
+ }
+
+ if (directory_count != NULL) {
+ *directory_count = dirs;
+ }
+ if (file_count != NULL) {
+ *file_count = files;
+ }
+ if (unreadable_directory_count != NULL) {
+ *unreadable_directory_count = 0;
+ }
+ if (total_size != NULL) {
+ /* FIXME: Maybe we want to calculate this? */
+ *total_size = 0;
+ }
+
+ nautilus_file_list_free (file_list);
+
+ return NAUTILUS_REQUEST_DONE;
+}
+
+static char *
+search_directory_file_get_where_string (NautilusFile *file)
+{
+ return g_strdup (_("Search"));
+}
static void
nautilus_search_directory_file_init (gpointer object, gpointer klass)
{
NautilusSearchDirectoryFile *search_file;
+ NautilusFile *file;
+ GnomeVFSFileInfo *file_info;
search_file = NAUTILUS_SEARCH_DIRECTORY_FILE (object);
+ file = NAUTILUS_FILE(object);
+
+ file_info = file->details->info = gnome_vfs_file_info_new ();
+
+ file_info->name = g_strdup (_("Search"));
+ file_info->mime_type = g_strdup ("x-directory/normal");
+ file_info->type = GNOME_VFS_FILE_TYPE_DIRECTORY;
+ file_info->flags = GNOME_VFS_FILE_FLAGS_NONE;
+ file_info->link_count = 1;
+ file_info->size = 0;
+ file_info->permissions =
+ GNOME_VFS_PERM_OTHER_WRITE |
+ GNOME_VFS_PERM_GROUP_WRITE |
+ GNOME_VFS_PERM_USER_READ |
+ GNOME_VFS_PERM_OTHER_READ |
+ GNOME_VFS_PERM_GROUP_READ;
+
+ file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE |
+ GNOME_VFS_FILE_INFO_FIELDS_FLAGS |
+ GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
+ GNOME_VFS_FILE_INFO_FIELDS_SIZE |
+ GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS |
+ GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT;
+
+ file->details->file_info_is_up_to_date = TRUE;
+
+ file->details->display_name = g_strdup (_("Search"));
+ file->details->custom_icon = NULL;
+ file->details->activation_uri = NULL;
+ file->details->got_link_info = TRUE;
+ file->details->link_info_is_up_to_date = TRUE;
+
+ file->details->directory_count = 0;
+ file->details->got_directory_count = TRUE;
+ file->details->directory_count_is_up_to_date = TRUE;
}
static void
@@ -150,4 +234,6 @@ nautilus_search_directory_file_class_init (gpointer klass)
file_class->get_file_type = search_directory_file_get_file_type;
file_class->check_if_ready = search_directory_file_check_if_ready;
file_class->get_item_count = search_directory_file_get_item_count;
+ file_class->get_deep_counts = search_directory_file_get_deep_counts;
+ file_class->get_where_string = search_directory_file_get_where_string;
}
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index c17d1009f..953d8affb 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -39,7 +39,8 @@ struct NautilusSearchDirectoryDetails {
NautilusQuery *query;
NautilusSearchEngine *engine;
-
+
+ gboolean search_running;
gboolean search_finished;
GList *files;
@@ -73,13 +74,12 @@ typedef struct {
GNOME_CLASS_BOILERPLATE (NautilusSearchDirectory, nautilus_search_directory,
NautilusDirectory, NAUTILUS_TYPE_DIRECTORY)
-
static void search_engine_hits_added (NautilusSearchEngine *engine, GList *hits, NautilusSearchDirectory *search);
static void search_engine_hits_subtracted (NautilusSearchEngine *engine, GList *hits, NautilusSearchDirectory *search);
static void search_engine_finished (NautilusSearchEngine *engine, NautilusSearchDirectory *search);
static void search_engine_error (NautilusSearchEngine *engine, const char *error, NautilusSearchDirectory *search);
static void search_callback_file_ready_callback (NautilusFile *file, gpointer data);
-
+static void file_changed (NautilusFile *file, NautilusSearchDirectory *search);
static void
ensure_search_engine (NautilusSearchDirectory *search)
@@ -104,6 +104,25 @@ ensure_search_engine (NautilusSearchDirectory *search)
static void
reset_file_list (NautilusSearchDirectory *search)
{
+ GList *list, *monitor_list;
+ NautilusFile *file;
+ SearchMonitor *monitor;
+
+ /* Remove file connections */
+ for (list = search->details->files; list != NULL; list = list->next) {
+ file = list->data;
+
+ /* Disconnect change handler */
+ g_signal_handlers_disconnect_by_func (file, file_changed, search);
+
+ /* Remove monitors */
+ for (monitor_list = search->details->monitor_list; monitor_list;
+ monitor_list = monitor_list->next) {
+ monitor = monitor_list->data;
+ nautilus_file_monitor_remove (file, monitor);
+ }
+ }
+
nautilus_file_list_free (search->details->files);
search->details->files = NULL;
}
@@ -113,8 +132,11 @@ start_or_stop_search_engine (NautilusSearchDirectory *search, gboolean adding)
{
if (adding && (search->details->monitor_list ||
search->details->pending_callback_list) &&
- search->details->query) {
+ search->details->query &&
+ !search->details->search_running) {
/* We need to start the search engine */
+ search->details->search_running = TRUE;
+ search->details->search_finished = FALSE;
ensure_search_engine (search);
nautilus_search_engine_set_query (search->details->engine, search->details->query);
@@ -123,7 +145,9 @@ start_or_stop_search_engine (NautilusSearchDirectory *search, gboolean adding)
nautilus_search_engine_start (search->details->engine);
} else if (!adding && !search->details->monitor_list &&
!search->details->pending_callback_list &&
- search->details->engine) {
+ search->details->engine &&
+ search->details->search_running) {
+ search->details->search_running = FALSE;
nautilus_search_engine_stop (search->details->engine);
reset_file_list (search);
@@ -139,10 +163,7 @@ file_changed (NautilusFile *file, NautilusSearchDirectory *search)
list.data = file;
list.next = NULL;
- if (!g_object_get_data (G_OBJECT (file), "has-tag") || TRUE)
- nautilus_directory_emit_files_changed (NAUTILUS_DIRECTORY (search), &list);
-
- g_object_set_data (G_OBJECT (file), "has-tag", GINT_TO_POINTER (1));
+ nautilus_directory_emit_files_changed (NAUTILUS_DIRECTORY (search), &list);
}
static void
@@ -194,7 +215,6 @@ search_monitor_remove_file_monitors (SearchMonitor *monitor, NautilusSearchDirec
nautilus_file_monitor_remove (file, monitor);
}
-
}
static void
@@ -367,7 +387,10 @@ search_call_when_ready (NautilusDirectory *directory,
search = NAUTILUS_SEARCH_DIRECTORY (directory);
search_callback = search_callback_find (search, callback, callback_data);
-
+ if (search_callback == NULL) {
+ search_callback = search_callback_find_pending (search, callback, callback_data);
+ }
+
if (search_callback) {
g_warning ("tried to add a new callback while an old one was pending");
return;
@@ -380,7 +403,7 @@ search_call_when_ready (NautilusDirectory *directory,
search_callback->wait_for_attributes = file_attributes;
search_callback->wait_for_file_list = wait_for_file_list;
- if (wait_for_file_list) {
+ if (wait_for_file_list && !search->details->search_finished) {
/* Add it to the pending callback list, which will be
* processed when the directory has finished loading
*/
@@ -526,21 +549,6 @@ search_callback_add_pending_file_callbacks (SearchCallback *callback)
}
static void
-search_remove_file_connections (NautilusSearchDirectory *search)
-{
- GList *list;
- NautilusFile *file;
-
- /* Remove file connections */
- for (list = search->details->files; list != NULL; list = list->next) {
- file = list->data;
-
- g_signal_handlers_disconnect_by_func (file, file_changed, search);
- }
-
-}
-
-static void
search_engine_error (NautilusSearchEngine *engine, const char *error_message, NautilusSearchDirectory *search)
{
nautilus_directory_emit_load_error (NAUTILUS_DIRECTORY (search),
@@ -582,17 +590,13 @@ search_force_reload (NautilusDirectory *directory)
}
/* Remove file monitors */
- g_list_foreach (search->details->monitor_list,
- (GFunc)search_monitor_remove_file_monitors, search);
-
- /* Remove file connections */
- search_remove_file_connections (search);
-
reset_file_list (search);
-
- nautilus_search_engine_stop (search->details->engine);
- nautilus_search_engine_set_query (search->details->engine, search->details->query);
- nautilus_search_engine_start (search->details->engine);
+
+ if (search->details->search_running) {
+ nautilus_search_engine_stop (search->details->engine);
+ nautilus_search_engine_set_query (search->details->engine, search->details->query);
+ nautilus_search_engine_start (search->details->engine);
+ }
}
static gboolean
@@ -653,7 +657,6 @@ search_dispose (GObject *object)
search->details->monitor_list = NULL;
}
- search_remove_file_connections (search);
reset_file_list (search);
if (search->details->callback_list) {
@@ -672,10 +675,19 @@ search_dispose (GObject *object)
}
if (search->details->query) {
- g_free (search->details->query);
+ g_object_unref (search->details->query);
search->details->query = NULL;
}
+ if (search->details->engine) {
+ if (search->details->search_running) {
+ nautilus_search_engine_stop (search->details->engine);
+ }
+
+ g_object_unref (search->details->engine);
+ search->details->engine = NULL;
+ }
+
G_OBJECT_CLASS (parent_class)->dispose (object);
}
diff --git a/libnautilus-private/nautilus-search-engine-beagle.c b/libnautilus-private/nautilus-search-engine-beagle.c
index fd6576498..4457f3e64 100644
--- a/libnautilus-private/nautilus-search-engine-beagle.c
+++ b/libnautilus-private/nautilus-search-engine-beagle.c
@@ -54,14 +54,17 @@ finalize (GObject *object)
if (beagle->details->current_query) {
g_object_unref (beagle->details->current_query);
+ beagle->details->current_query = NULL;
}
if (beagle->details->query) {
g_object_unref (beagle->details->query);
+ beagle->details->query = NULL;
}
if (beagle->details->client) {
g_object_unref (beagle->details->client);
+ beagle->details->client = NULL;
}
g_free (beagle->details);
diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c
index b873cf92d..6a921354c 100644
--- a/src/file-manager/fm-properties-window.c
+++ b/src/file-manager/fm-properties-window.c
@@ -2941,9 +2941,11 @@ create_permissions_page (FMPropertiesWindow *window)
file_list = window->details->original_files;
- window->details->initial_permissions = get_initial_permissions (window->details->target_files);
+ window->details->initial_permissions = NULL;
if (all_can_get_permissions (file_list)) {
+ window->details->initial_permissions = get_initial_permissions (window->details->target_files);
+
if (!all_can_set_permissions (file_list)) {
add_prompt_and_separator (
GTK_VBOX (vbox),
@@ -3306,6 +3308,11 @@ create_open_with_page (FMPropertiesWindow *window)
char *mime_type;
uri = nautilus_file_get_uri (get_target_file (window));
+
+ if (uri == NULL) {
+ return;
+ }
+
mime_type = nautilus_file_get_mime_type (get_target_file (window));
vbox = eel_mime_application_chooser_new (uri, mime_type);