diff options
Diffstat (limited to 'src/nautilus-directory.c')
-rw-r--r-- | src/nautilus-directory.c | 2642 |
1 files changed, 1394 insertions, 1248 deletions
diff --git a/src/nautilus-directory.c b/src/nautilus-directory.c index 5be514450..8e66ff099 100644 --- a/src/nautilus-directory.c +++ b/src/nautilus-directory.c @@ -1,23 +1,23 @@ /* - nautilus-directory.c: Nautilus directory model. - - Copyright (C) 1999, 2000, 2001 Eazel, 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program; if not, see <http://www.gnu.org/licenses/>. - - Author: Darin Adler <darin@bentspoon.com> -*/ + * nautilus-directory.c: Nautilus directory model. + * + * Copyright (C) 1999, 2000, 2001 Eazel, 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 the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Darin Adler <darin@bentspoon.com> + */ #include <config.h> #include "nautilus-directory-private.h" @@ -39,17 +39,19 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> -enum { - FILES_ADDED, - FILES_CHANGED, - DONE_LOADING, - LOAD_ERROR, - LAST_SIGNAL +enum +{ + FILES_ADDED, + FILES_CHANGED, + DONE_LOADING, + LOAD_ERROR, + LAST_SIGNAL }; -enum { - PROP_LOCATION = 1, - NUM_PROPERTIES +enum +{ + PROP_LOCATION = 1, + NUM_PROPERTIES }; static guint signals[LAST_SIGNAL]; @@ -57,308 +59,334 @@ static GParamSpec *properties[NUM_PROPERTIES] = { NULL, }; static GHashTable *directories; -static void nautilus_directory_finalize (GObject *object); -static NautilusDirectory *nautilus_directory_new (GFile *location); -static GList * real_get_file_list (NautilusDirectory *directory); -static gboolean real_is_editable (NautilusDirectory *directory); -static void set_directory_location (NautilusDirectory *directory, - GFile *location); -static NautilusFile * real_new_file_from_filename (NautilusDirectory *directory, - const char *filename, - gboolean self_owned); -static gboolean real_handles_location (GFile *location); +static void nautilus_directory_finalize (GObject *object); +static NautilusDirectory *nautilus_directory_new (GFile *location); +static GList *real_get_file_list (NautilusDirectory *directory); +static gboolean real_is_editable (NautilusDirectory *directory); +static void set_directory_location (NautilusDirectory *directory, + GFile *location); +static NautilusFile *real_new_file_from_filename (NautilusDirectory *directory, + const char *filename, + gboolean self_owned); +static gboolean real_handles_location (GFile *location); G_DEFINE_TYPE (NautilusDirectory, nautilus_directory, G_TYPE_OBJECT); static void -nautilus_directory_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - NautilusDirectory *directory = NAUTILUS_DIRECTORY (object); +nautilus_directory_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + NautilusDirectory *directory = NAUTILUS_DIRECTORY (object); + + switch (property_id) + { + case PROP_LOCATION: + { + set_directory_location (directory, g_value_get_object (value)); + } + break; - switch (property_id) { - case PROP_LOCATION: - set_directory_location (directory, g_value_get_object (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } + default: + { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } + break; + } } static void -nautilus_directory_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - NautilusDirectory *directory = NAUTILUS_DIRECTORY (object); +nautilus_directory_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + NautilusDirectory *directory = NAUTILUS_DIRECTORY (object); + + switch (property_id) + { + case PROP_LOCATION: + { + g_value_set_object (value, directory->details->location); + } + break; - switch (property_id) { - case PROP_LOCATION: - g_value_set_object (value, directory->details->location); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } + default: + { + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } + break; + } } static void nautilus_directory_class_init (NautilusDirectoryClass *klass) { - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - klass->new_file_from_filename = real_new_file_from_filename; - - object_class->finalize = nautilus_directory_finalize; - object_class->set_property = nautilus_directory_set_property; - object_class->get_property = nautilus_directory_get_property; - - signals[FILES_ADDED] = - g_signal_new ("files-added", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusDirectoryClass, files_added), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[FILES_CHANGED] = - g_signal_new ("files-changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusDirectoryClass, files_changed), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[DONE_LOADING] = - g_signal_new ("done-loading", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusDirectoryClass, done_loading), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[LOAD_ERROR] = - g_signal_new ("load-error", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusDirectoryClass, load_error), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - properties[PROP_LOCATION] = - g_param_spec_object ("location", - "The location", - "The location of this directory", - G_TYPE_FILE, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); - - klass->get_file_list = real_get_file_list; - klass->is_editable = real_is_editable; - klass->handles_location = real_handles_location; - - g_type_class_add_private (klass, sizeof (NautilusDirectoryDetails)); - g_object_class_install_properties (object_class, NUM_PROPERTIES, properties); + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (klass); + + klass->new_file_from_filename = real_new_file_from_filename; + + object_class->finalize = nautilus_directory_finalize; + object_class->set_property = nautilus_directory_set_property; + object_class->get_property = nautilus_directory_get_property; + + signals[FILES_ADDED] = + g_signal_new ("files-added", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusDirectoryClass, files_added), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[FILES_CHANGED] = + g_signal_new ("files-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusDirectoryClass, files_changed), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[DONE_LOADING] = + g_signal_new ("done-loading", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusDirectoryClass, done_loading), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[LOAD_ERROR] = + g_signal_new ("load-error", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusDirectoryClass, load_error), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + + properties[PROP_LOCATION] = + g_param_spec_object ("location", + "The location", + "The location of this directory", + G_TYPE_FILE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + klass->get_file_list = real_get_file_list; + klass->is_editable = real_is_editable; + klass->handles_location = real_handles_location; + + g_type_class_add_private (klass, sizeof (NautilusDirectoryDetails)); + g_object_class_install_properties (object_class, NUM_PROPERTIES, properties); } static void nautilus_directory_init (NautilusDirectory *directory) { - directory->details = G_TYPE_INSTANCE_GET_PRIVATE ((directory), NAUTILUS_TYPE_DIRECTORY, NautilusDirectoryDetails); - directory->details->file_hash = g_hash_table_new (g_str_hash, g_str_equal); - directory->details->high_priority_queue = nautilus_file_queue_new (); - directory->details->low_priority_queue = nautilus_file_queue_new (); - directory->details->extension_queue = nautilus_file_queue_new (); + directory->details = G_TYPE_INSTANCE_GET_PRIVATE ((directory), NAUTILUS_TYPE_DIRECTORY, NautilusDirectoryDetails); + directory->details->file_hash = g_hash_table_new (g_str_hash, g_str_equal); + directory->details->high_priority_queue = nautilus_file_queue_new (); + directory->details->low_priority_queue = nautilus_file_queue_new (); + directory->details->extension_queue = nautilus_file_queue_new (); } NautilusDirectory * nautilus_directory_ref (NautilusDirectory *directory) { - if (directory == NULL) { - return directory; - } + if (directory == NULL) + { + return directory; + } - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); - g_object_ref (directory); - return directory; + g_object_ref (directory); + return directory; } void nautilus_directory_unref (NautilusDirectory *directory) { - if (directory == NULL) { - return; - } + if (directory == NULL) + { + return; + } - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - g_object_unref (directory); + g_object_unref (directory); } static void nautilus_directory_finalize (GObject *object) { - NautilusDirectory *directory; + NautilusDirectory *directory; - directory = NAUTILUS_DIRECTORY (object); + directory = NAUTILUS_DIRECTORY (object); - g_hash_table_remove (directories, directory->details->location); + g_hash_table_remove (directories, directory->details->location); - nautilus_directory_cancel (directory); - g_assert (directory->details->count_in_progress == NULL); + nautilus_directory_cancel (directory); + g_assert (directory->details->count_in_progress == NULL); - if (directory->details->monitor_list != NULL) { - g_warning ("destroying a NautilusDirectory while it's being monitored"); - g_list_free_full (directory->details->monitor_list, g_free); - } + if (directory->details->monitor_list != NULL) + { + g_warning ("destroying a NautilusDirectory while it's being monitored"); + g_list_free_full (directory->details->monitor_list, g_free); + } - if (directory->details->monitor != NULL) { - nautilus_monitor_cancel (directory->details->monitor); - } + if (directory->details->monitor != NULL) + { + nautilus_monitor_cancel (directory->details->monitor); + } - if (directory->details->dequeue_pending_idle_id != 0) { - g_source_remove (directory->details->dequeue_pending_idle_id); - } + if (directory->details->dequeue_pending_idle_id != 0) + { + g_source_remove (directory->details->dequeue_pending_idle_id); + } - if (directory->details->call_ready_idle_id != 0) { - g_source_remove (directory->details->call_ready_idle_id); - } + if (directory->details->call_ready_idle_id != 0) + { + g_source_remove (directory->details->call_ready_idle_id); + } - if (directory->details->location) { - g_object_unref (directory->details->location); - } + if (directory->details->location) + { + g_object_unref (directory->details->location); + } - g_assert (directory->details->file_list == NULL); - g_hash_table_destroy (directory->details->file_hash); + g_assert (directory->details->file_list == NULL); + g_hash_table_destroy (directory->details->file_hash); - nautilus_file_queue_destroy (directory->details->high_priority_queue); - nautilus_file_queue_destroy (directory->details->low_priority_queue); - nautilus_file_queue_destroy (directory->details->extension_queue); - g_assert (directory->details->directory_load_in_progress == NULL); - g_assert (directory->details->count_in_progress == NULL); - g_assert (directory->details->dequeue_pending_idle_id == 0); - g_list_free_full (directory->details->pending_file_info, g_object_unref); + nautilus_file_queue_destroy (directory->details->high_priority_queue); + nautilus_file_queue_destroy (directory->details->low_priority_queue); + nautilus_file_queue_destroy (directory->details->extension_queue); + g_assert (directory->details->directory_load_in_progress == NULL); + g_assert (directory->details->count_in_progress == NULL); + g_assert (directory->details->dequeue_pending_idle_id == 0); + g_list_free_full (directory->details->pending_file_info, g_object_unref); - G_OBJECT_CLASS (nautilus_directory_parent_class)->finalize (object); + G_OBJECT_CLASS (nautilus_directory_parent_class)->finalize (object); } static void -collect_all_directories (gpointer key, gpointer value, gpointer callback_data) +collect_all_directories (gpointer key, + gpointer value, + gpointer callback_data) { - NautilusDirectory *directory; - GList **dirs; + NautilusDirectory *directory; + GList **dirs; - directory = NAUTILUS_DIRECTORY (value); - dirs = callback_data; + directory = NAUTILUS_DIRECTORY (value); + dirs = callback_data; - *dirs = g_list_prepend (*dirs, nautilus_directory_ref (directory)); + *dirs = g_list_prepend (*dirs, nautilus_directory_ref (directory)); } static void filtering_changed_callback (gpointer callback_data) { - GList *dirs, *l; - NautilusDirectory *directory; + GList *dirs, *l; + NautilusDirectory *directory; - g_assert (callback_data == NULL); + g_assert (callback_data == NULL); - dirs = NULL; - g_hash_table_foreach (directories, collect_all_directories, &dirs); + dirs = NULL; + g_hash_table_foreach (directories, collect_all_directories, &dirs); - /* Preference about which items to show has changed, so we - * can't trust any of our precomputed directory counts. - */ - for (l = dirs; l != NULL; l = l->next) { - directory = NAUTILUS_DIRECTORY (l->data); - nautilus_directory_invalidate_count_and_mime_list (directory); - } + /* Preference about which items to show has changed, so we + * can't trust any of our precomputed directory counts. + */ + for (l = dirs; l != NULL; l = l->next) + { + directory = NAUTILUS_DIRECTORY (l->data); + nautilus_directory_invalidate_count_and_mime_list (directory); + } - nautilus_directory_list_unref (dirs); + nautilus_directory_list_unref (dirs); } void emit_change_signals_for_all_files (NautilusDirectory *directory) { - GList *files; + GList *files; - files = g_list_copy (directory->details->file_list); - if (directory->details->as_file != NULL) { - files = g_list_prepend (files, directory->details->as_file); - } + files = g_list_copy (directory->details->file_list); + if (directory->details->as_file != NULL) + { + files = g_list_prepend (files, directory->details->as_file); + } - nautilus_file_list_ref (files); - nautilus_directory_emit_change_signals (directory, files); + nautilus_file_list_ref (files); + nautilus_directory_emit_change_signals (directory, files); - nautilus_file_list_free (files); + nautilus_file_list_free (files); } void emit_change_signals_for_all_files_in_all_directories (void) { - GList *dirs, *l; - NautilusDirectory *directory; + GList *dirs, *l; + NautilusDirectory *directory; - dirs = NULL; - g_hash_table_foreach (directories, - collect_all_directories, - &dirs); + dirs = NULL; + g_hash_table_foreach (directories, + collect_all_directories, + &dirs); - for (l = dirs; l != NULL; l = l->next) { - directory = NAUTILUS_DIRECTORY (l->data); - emit_change_signals_for_all_files (directory); - nautilus_directory_unref (directory); - } + for (l = dirs; l != NULL; l = l->next) + { + directory = NAUTILUS_DIRECTORY (l->data); + emit_change_signals_for_all_files (directory); + nautilus_directory_unref (directory); + } - g_list_free (dirs); + g_list_free (dirs); } static void -async_state_changed_one (gpointer key, gpointer value, gpointer user_data) +async_state_changed_one (gpointer key, + gpointer value, + gpointer user_data) { - NautilusDirectory *directory; + NautilusDirectory *directory; - g_assert (key != NULL); - g_assert (NAUTILUS_IS_DIRECTORY (value)); - g_assert (user_data == NULL); + g_assert (key != NULL); + g_assert (NAUTILUS_IS_DIRECTORY (value)); + g_assert (user_data == NULL); - directory = NAUTILUS_DIRECTORY (value); - - nautilus_directory_async_state_changed (directory); - emit_change_signals_for_all_files (directory); + directory = NAUTILUS_DIRECTORY (value); + + nautilus_directory_async_state_changed (directory); + emit_change_signals_for_all_files (directory); } static void async_data_preference_changed_callback (gpointer callback_data) { - g_assert (callback_data == NULL); + g_assert (callback_data == NULL); - /* Preference involving fetched async data has changed, so - * we have to kick off refetching all async data, and tell - * each file that it (might have) changed. - */ - g_hash_table_foreach (directories, async_state_changed_one, NULL); + /* Preference involving fetched async data has changed, so + * we have to kick off refetching all async data, and tell + * each file that it (might have) changed. + */ + g_hash_table_foreach (directories, async_state_changed_one, NULL); } static void add_preferences_callbacks (void) { - nautilus_global_preferences_init (); + nautilus_global_preferences_init (); - g_signal_connect_swapped (gtk_filechooser_preferences, - "changed::" NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, - G_CALLBACK(filtering_changed_callback), - NULL); - g_signal_connect_swapped (nautilus_preferences, - "changed::" NAUTILUS_PREFERENCES_SHOW_DIRECTORY_ITEM_COUNTS, - G_CALLBACK (async_data_preference_changed_callback), - NULL); + g_signal_connect_swapped (gtk_filechooser_preferences, + "changed::" NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, + G_CALLBACK (filtering_changed_callback), + NULL); + g_signal_connect_swapped (nautilus_preferences, + "changed::" NAUTILUS_PREFERENCES_SHOW_DIRECTORY_ITEM_COUNTS, + G_CALLBACK (async_data_preference_changed_callback), + NULL); } /** @@ -371,88 +399,97 @@ add_preferences_callbacks (void) * If two windows are viewing the same uri, the directory object is shared. */ NautilusDirectory * -nautilus_directory_get_internal (GFile *location, gboolean create) -{ - NautilusDirectory *directory; - - /* Create the hash table first time through. */ - if (directories == NULL) { - directories = g_hash_table_new (g_file_hash, (GCompareFunc) g_file_equal); - add_preferences_callbacks (); - } - - /* If the object is already in the hash table, look it up. */ - - directory = g_hash_table_lookup (directories, - location); - if (directory != NULL) { - nautilus_directory_ref (directory); - } else if (create) { - /* Create a new directory object instead. */ - directory = nautilus_directory_new (location); - if (directory == NULL) { - return NULL; - } - - /* Put it in the hash table. */ - g_hash_table_insert (directories, - directory->details->location, - directory); - } - - return directory; +nautilus_directory_get_internal (GFile *location, + gboolean create) +{ + NautilusDirectory *directory; + + /* Create the hash table first time through. */ + if (directories == NULL) + { + directories = g_hash_table_new (g_file_hash, (GCompareFunc) g_file_equal); + add_preferences_callbacks (); + } + + /* If the object is already in the hash table, look it up. */ + + directory = g_hash_table_lookup (directories, + location); + if (directory != NULL) + { + nautilus_directory_ref (directory); + } + else if (create) + { + /* Create a new directory object instead. */ + directory = nautilus_directory_new (location); + if (directory == NULL) + { + return NULL; + } + + /* Put it in the hash table. */ + g_hash_table_insert (directories, + directory->details->location, + directory); + } + + return directory; } NautilusDirectory * nautilus_directory_get (GFile *location) { - if (location == NULL) { - return NULL; - } + if (location == NULL) + { + return NULL; + } - return nautilus_directory_get_internal (location, TRUE); + return nautilus_directory_get_internal (location, TRUE); } NautilusDirectory * nautilus_directory_get_existing (GFile *location) { - if (location == NULL) { - return NULL; - } + if (location == NULL) + { + return NULL; + } - return nautilus_directory_get_internal (location, FALSE); + return nautilus_directory_get_internal (location, FALSE); } NautilusDirectory * nautilus_directory_get_by_uri (const char *uri) { - NautilusDirectory *directory; - GFile *location; + NautilusDirectory *directory; + GFile *location; - if (uri == NULL) { - return NULL; - } + if (uri == NULL) + { + return NULL; + } - location = g_file_new_for_uri (uri); + location = g_file_new_for_uri (uri); - directory = nautilus_directory_get_internal (location, TRUE); - g_object_unref (location); - return directory; + directory = nautilus_directory_get_internal (location, TRUE); + g_object_unref (location); + return directory; } NautilusDirectory * nautilus_directory_get_for_file (NautilusFile *file) { - char *uri; - NautilusDirectory *directory; + char *uri; + NautilusDirectory *directory; - g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); + g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL); - uri = nautilus_file_get_uri (file); - directory = nautilus_directory_get_by_uri (uri); - g_free (uri); - return directory; + uri = nautilus_file_get_uri (file); + directory = nautilus_directory_get_by_uri (uri); + g_free (uri); + return directory; } /* Returns a reffed NautilusFile object for this directory. @@ -460,17 +497,18 @@ nautilus_directory_get_for_file (NautilusFile *file) NautilusFile * nautilus_directory_get_corresponding_file (NautilusDirectory *directory) { - NautilusFile *file; - char *uri; + NautilusFile *file; + char *uri; - file = nautilus_directory_get_existing_corresponding_file (directory); - if (file == NULL) { - uri = nautilus_directory_get_uri (directory); - file = nautilus_file_get_by_uri (uri); - g_free (uri); - } + file = nautilus_directory_get_existing_corresponding_file (directory); + if (file == NULL) + { + uri = nautilus_directory_get_uri (directory); + file = nautilus_file_get_by_uri (uri); + g_free (uri); + } - return file; + return file; } /* Returns a reffed NautilusFile object for this directory, but only if the @@ -479,23 +517,24 @@ nautilus_directory_get_corresponding_file (NautilusDirectory *directory) NautilusFile * nautilus_directory_get_existing_corresponding_file (NautilusDirectory *directory) { - NautilusFile *file; - char *uri; - - file = directory->details->as_file; - if (file != NULL) { - nautilus_file_ref (file); - return file; - } + NautilusFile *file; + char *uri; - uri = nautilus_directory_get_uri (directory); - file = nautilus_file_get_existing_by_uri (uri); - g_free (uri); - return file; + file = directory->details->as_file; + if (file != NULL) + { + nautilus_file_ref (file); + return file; + } + + uri = nautilus_directory_get_uri (directory); + file = nautilus_file_get_existing_by_uri (uri); + g_free (uri); + return file; } /* nautilus_directory_get_name_for_self_as_new_file: - * + * * Get a name to display for the file representing this * directory. This is called only when there's no VFS * directory for this NautilusDirectory. @@ -503,55 +542,60 @@ nautilus_directory_get_existing_corresponding_file (NautilusDirectory *directory char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory *directory) { - GFile *file; - char *directory_uri; - char *scheme; - char *name; - char *hostname = NULL; - - directory_uri = nautilus_directory_get_uri (directory); - file = g_file_new_for_uri (directory_uri); - scheme = g_file_get_uri_scheme (file); - g_object_unref (file); - - nautilus_uri_parse (directory_uri, &hostname, NULL, NULL); - if (hostname == NULL || (strlen (hostname) == 0)) { - name = g_strdup (directory_uri); - } else if (scheme == NULL) { - name = g_strdup (hostname); - } else { - /* Translators: this is of the format "hostname (uri-scheme)" */ - name = g_strdup_printf (_("%s (%s)"), hostname, scheme); - } - - g_free (directory_uri); - g_free (scheme); - g_free (hostname); - - return name; + GFile *file; + char *directory_uri; + char *scheme; + char *name; + char *hostname = NULL; + + directory_uri = nautilus_directory_get_uri (directory); + file = g_file_new_for_uri (directory_uri); + scheme = g_file_get_uri_scheme (file); + g_object_unref (file); + + nautilus_uri_parse (directory_uri, &hostname, NULL, NULL); + if (hostname == NULL || (strlen (hostname) == 0)) + { + name = g_strdup (directory_uri); + } + else if (scheme == NULL) + { + name = g_strdup (hostname); + } + else + { + /* Translators: this is of the format "hostname (uri-scheme)" */ + name = g_strdup_printf (_("%s (%s)"), hostname, scheme); + } + + g_free (directory_uri); + g_free (scheme); + g_free (hostname); + + return name; } char * nautilus_directory_get_uri (NautilusDirectory *directory) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); - return g_file_get_uri (directory->details->location); + return g_file_get_uri (directory->details->location); } GFile * -nautilus_directory_get_location (NautilusDirectory *directory) +nautilus_directory_get_location (NautilusDirectory *directory) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); - return g_object_ref (directory->details->location); + return g_object_ref (directory->details->location); } static gboolean real_handles_location (GFile *location) { - /* This class is the fallback on handling any location */ - return TRUE; + /* This class is the fallback on handling any location */ + return TRUE; } NautilusFile * @@ -559,9 +603,9 @@ nautilus_directory_new_file_from_filename (NautilusDirectory *directory, const char *filename, gboolean self_owned) { - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->new_file_from_filename (directory, - filename, - self_owned); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->new_file_from_filename (directory, + filename, + self_owned); } static NautilusFile * @@ -569,360 +613,390 @@ real_new_file_from_filename (NautilusDirectory *directory, const char *filename, gboolean self_owned) { - NautilusFile *file; + NautilusFile *file; - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (filename != NULL); - g_assert (filename[0] != '\0'); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (filename != NULL); + g_assert (filename[0] != '\0'); - if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) { - if (self_owned) { - file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_SEARCH_DIRECTORY_FILE, NULL)); - } else { - /* This doesn't normally happen, unless the user somehow types in a uri - * that references a file like this. (See #349840) */ - file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_VFS_FILE, NULL)); - } - } else { - file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_VFS_FILE, NULL)); - } - nautilus_file_set_directory (file, directory); + if (NAUTILUS_IS_SEARCH_DIRECTORY (directory)) + { + if (self_owned) + { + file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_SEARCH_DIRECTORY_FILE, NULL)); + } + else + { + /* This doesn't normally happen, unless the user somehow types in a uri + * that references a file like this. (See #349840) */ + file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_VFS_FILE, NULL)); + } + } + else + { + file = NAUTILUS_FILE (g_object_new (NAUTILUS_TYPE_VFS_FILE, NULL)); + } + nautilus_file_set_directory (file, directory); - return file; + return file; } -static GList* +static GList * nautilus_directory_provider_get_all (void) { - GIOExtensionPoint *extension_point; - GList *extensions; + GIOExtensionPoint *extension_point; + GList *extensions; - extension_point = g_io_extension_point_lookup (NAUTILUS_DIRECTORY_PROVIDER_EXTENSION_POINT_NAME); - extensions = g_io_extension_point_get_extensions (extension_point); + extension_point = g_io_extension_point_lookup (NAUTILUS_DIRECTORY_PROVIDER_EXTENSION_POINT_NAME); + extensions = g_io_extension_point_get_extensions (extension_point); - return extensions; + return extensions; } static NautilusDirectory * nautilus_directory_new (GFile *location) { - GList *extensions; - GList *l; - GIOExtension *gio_extension; - GType handling_provider_type; - gboolean handled = FALSE; - NautilusDirectoryClass *current_provider_class; - NautilusDirectory *handling_instance; - - extensions = nautilus_directory_provider_get_all (); - - for (l = extensions; l != NULL; l = l->next) { - gio_extension = l->data; - current_provider_class = NAUTILUS_DIRECTORY_CLASS (g_io_extension_ref_class (gio_extension)); - if (current_provider_class->handles_location (location)) { - handling_provider_type = g_io_extension_get_type (gio_extension); - handled = TRUE; - break; - } + GList *extensions; + GList *l; + GIOExtension *gio_extension; + GType handling_provider_type; + gboolean handled = FALSE; + NautilusDirectoryClass *current_provider_class; + NautilusDirectory *handling_instance; + + extensions = nautilus_directory_provider_get_all (); + + for (l = extensions; l != NULL; l = l->next) + { + gio_extension = l->data; + current_provider_class = NAUTILUS_DIRECTORY_CLASS (g_io_extension_ref_class (gio_extension)); + if (current_provider_class->handles_location (location)) + { + handling_provider_type = g_io_extension_get_type (gio_extension); + handled = TRUE; + break; } + } - if (!handled) { - /* This class is the fallback for any location */ - handling_provider_type = NAUTILUS_TYPE_VFS_DIRECTORY; - } + if (!handled) + { + /* This class is the fallback for any location */ + handling_provider_type = NAUTILUS_TYPE_VFS_DIRECTORY; + } - handling_instance = g_object_new (handling_provider_type, - "location", location, - NULL); + handling_instance = g_object_new (handling_provider_type, + "location", location, + NULL); - return handling_instance; + return handling_instance; } gboolean nautilus_directory_is_local (NautilusDirectory *directory) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - if (directory->details->location == NULL) { - return TRUE; - } + if (directory->details->location == NULL) + { + return TRUE; + } - return nautilus_directory_is_in_trash (directory) || - nautilus_directory_is_in_recent (directory) || - g_file_is_native (directory->details->location); + return nautilus_directory_is_in_trash (directory) || + nautilus_directory_is_in_recent (directory) || + g_file_is_native (directory->details->location); } gboolean nautilus_directory_is_local_or_fuse (NautilusDirectory *directory) { - g_autofree char* path = NULL; + g_autofree char *path = NULL; - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - - if (directory->details->location == NULL) { - return TRUE; - } + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - /* If the glib reports a path, then it can use FUSE to convert the uri - * to a local path - */ - path = g_file_get_path (directory->details->location); + if (directory->details->location == NULL) + { + return TRUE; + } + + /* If the glib reports a path, then it can use FUSE to convert the uri + * to a local path + */ + path = g_file_get_path (directory->details->location); - return nautilus_directory_is_in_trash (directory) || - nautilus_directory_is_in_recent (directory) || - g_file_is_native (directory->details->location) || - path != NULL; + return nautilus_directory_is_in_trash (directory) || + nautilus_directory_is_in_recent (directory) || + g_file_is_native (directory->details->location) || + path != NULL; } gboolean nautilus_directory_is_in_trash (NautilusDirectory *directory) { - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - - if (directory->details->location == NULL) { - return FALSE; - } + g_assert (NAUTILUS_IS_DIRECTORY (directory)); - return g_file_has_uri_scheme (directory->details->location, "trash"); + if (directory->details->location == NULL) + { + return FALSE; + } + + return g_file_has_uri_scheme (directory->details->location, "trash"); } gboolean nautilus_directory_is_in_recent (NautilusDirectory *directory) { - g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); - if (directory->details->location == NULL) { - return FALSE; - } + if (directory->details->location == NULL) + { + return FALSE; + } - return g_file_has_uri_scheme (directory->details->location, "recent"); + return g_file_has_uri_scheme (directory->details->location, "recent"); } gboolean nautilus_directory_is_remote (NautilusDirectory *directory) { - NautilusFile *file; - gboolean is_remote; + NautilusFile *file; + gboolean is_remote; - g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); - file = nautilus_directory_get_corresponding_file (directory); - is_remote = nautilus_file_is_remote (file); - nautilus_file_unref (file); + file = nautilus_directory_get_corresponding_file (directory); + is_remote = nautilus_file_is_remote (file); + nautilus_file_unref (file); - return is_remote; + return is_remote; } gboolean nautilus_directory_are_all_files_seen (NautilusDirectory *directory) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->are_all_files_seen (directory); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->are_all_files_seen (directory); } static void -add_to_hash_table (NautilusDirectory *directory, NautilusFile *file, GList *node) +add_to_hash_table (NautilusDirectory *directory, + NautilusFile *file, + GList *node) { - const char *name; + const char *name; - name = eel_ref_str_peek (file->details->name); + name = eel_ref_str_peek (file->details->name); - g_assert (node != NULL); - g_assert (g_hash_table_lookup (directory->details->file_hash, - name) == NULL); - g_hash_table_insert (directory->details->file_hash, (char *) name, node); + g_assert (node != NULL); + g_assert (g_hash_table_lookup (directory->details->file_hash, + name) == NULL); + g_hash_table_insert (directory->details->file_hash, (char *) name, node); } static GList * -extract_from_hash_table (NautilusDirectory *directory, NautilusFile *file) +extract_from_hash_table (NautilusDirectory *directory, + NautilusFile *file) { - const char *name; - GList *node; + const char *name; + GList *node; - name = eel_ref_str_peek (file->details->name); - if (name == NULL) { - return NULL; - } + name = eel_ref_str_peek (file->details->name); + if (name == NULL) + { + return NULL; + } - /* Find the list node in the hash table. */ - node = g_hash_table_lookup (directory->details->file_hash, name); - g_hash_table_remove (directory->details->file_hash, name); + /* Find the list node in the hash table. */ + node = g_hash_table_lookup (directory->details->file_hash, name); + g_hash_table_remove (directory->details->file_hash, name); - return node; + return node; } void -nautilus_directory_add_file (NautilusDirectory *directory, NautilusFile *file) -{ - GList *node; - gboolean add_to_work_queue; - - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->name != NULL); - - /* Add to list. */ - node = g_list_prepend (directory->details->file_list, file); - directory->details->file_list = node; - - /* Add to hash table. */ - add_to_hash_table (directory, file, node); - - directory->details->confirmed_file_count++; - - add_to_work_queue = FALSE; - if (nautilus_directory_is_file_list_monitored (directory)) { - /* Ref if we are monitoring, since monitoring owns the file list. */ - nautilus_file_ref (file); - add_to_work_queue = TRUE; - } else if (nautilus_directory_has_active_request_for_file (directory, file)) { - /* We're waiting for the file in a call_when_ready. Make sure - we add the file to the work queue so that said waiter won't - wait forever for e.g. all files in the directory to be done */ - add_to_work_queue = TRUE; - } - - if (add_to_work_queue) { - nautilus_directory_add_file_to_work_queue (directory, file); - } +nautilus_directory_add_file (NautilusDirectory *directory, + NautilusFile *file) +{ + GList *node; + gboolean add_to_work_queue; + + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->name != NULL); + + /* Add to list. */ + node = g_list_prepend (directory->details->file_list, file); + directory->details->file_list = node; + + /* Add to hash table. */ + add_to_hash_table (directory, file, node); + + directory->details->confirmed_file_count++; + + add_to_work_queue = FALSE; + if (nautilus_directory_is_file_list_monitored (directory)) + { + /* Ref if we are monitoring, since monitoring owns the file list. */ + nautilus_file_ref (file); + add_to_work_queue = TRUE; + } + else if (nautilus_directory_has_active_request_for_file (directory, file)) + { + /* We're waiting for the file in a call_when_ready. Make sure + * we add the file to the work queue so that said waiter won't + * wait forever for e.g. all files in the directory to be done */ + add_to_work_queue = TRUE; + } + + if (add_to_work_queue) + { + nautilus_directory_add_file_to_work_queue (directory, file); + } } void -nautilus_directory_remove_file (NautilusDirectory *directory, NautilusFile *file) +nautilus_directory_remove_file (NautilusDirectory *directory, + NautilusFile *file) { - GList *node; + GList *node; - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->name != NULL); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->name != NULL); - /* Find the list node in the hash table. */ - node = extract_from_hash_table (directory, file); - g_assert (node != NULL); - g_assert (node->data == file); + /* Find the list node in the hash table. */ + node = extract_from_hash_table (directory, file); + g_assert (node != NULL); + g_assert (node->data == file); - /* Remove the item from the list. */ - directory->details->file_list = g_list_remove_link - (directory->details->file_list, node); - g_list_free_1 (node); + /* Remove the item from the list. */ + directory->details->file_list = g_list_remove_link + (directory->details->file_list, node); + g_list_free_1 (node); - nautilus_directory_remove_file_from_work_queue (directory, file); + nautilus_directory_remove_file_from_work_queue (directory, file); - if (!file->details->unconfirmed) { - directory->details->confirmed_file_count--; - } + if (!file->details->unconfirmed) + { + directory->details->confirmed_file_count--; + } - /* Unref if we are monitoring. */ - if (nautilus_directory_is_file_list_monitored (directory)) { - nautilus_file_unref (file); - } + /* Unref if we are monitoring. */ + if (nautilus_directory_is_file_list_monitored (directory)) + { + nautilus_file_unref (file); + } } GList * nautilus_directory_begin_file_name_change (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - /* Find the list node in the hash table. */ - return extract_from_hash_table (directory, file); + /* Find the list node in the hash table. */ + return extract_from_hash_table (directory, file); } void nautilus_directory_end_file_name_change (NautilusDirectory *directory, - NautilusFile *file, - GList *node) + NautilusFile *file, + GList *node) { - /* Add the list node to the hash table. */ - if (node != NULL) { - add_to_hash_table (directory, file, node); - } + /* Add the list node to the hash table. */ + if (node != NULL) + { + add_to_hash_table (directory, file, node); + } } NautilusFile * nautilus_directory_find_file_by_name (NautilusDirectory *directory, - const char *name) + const char *name) { - GList *node; + GList *node; - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); - g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), NULL); + g_return_val_if_fail (name != NULL, NULL); - node = g_hash_table_lookup (directory->details->file_hash, - name); - return node == NULL ? NULL : NAUTILUS_FILE (node->data); + node = g_hash_table_lookup (directory->details->file_hash, + name); + return node == NULL ? NULL : NAUTILUS_FILE (node->data); } void nautilus_directory_emit_files_added (NautilusDirectory *directory, - GList *added_files) + GList *added_files) { - nautilus_profile_start (NULL); - if (added_files != NULL) { - g_signal_emit (directory, - signals[FILES_ADDED], 0, - added_files); - } - nautilus_profile_end (NULL); + nautilus_profile_start (NULL); + if (added_files != NULL) + { + g_signal_emit (directory, + signals[FILES_ADDED], 0, + added_files); + } + nautilus_profile_end (NULL); } void nautilus_directory_emit_files_changed (NautilusDirectory *directory, - GList *changed_files) + GList *changed_files) { - nautilus_profile_start (NULL); - if (changed_files != NULL) { - g_signal_emit (directory, - signals[FILES_CHANGED], 0, - changed_files); - } - nautilus_profile_end (NULL); + nautilus_profile_start (NULL); + if (changed_files != NULL) + { + g_signal_emit (directory, + signals[FILES_CHANGED], 0, + changed_files); + } + nautilus_profile_end (NULL); } void nautilus_directory_emit_change_signals (NautilusDirectory *directory, - GList *changed_files) + GList *changed_files) { - GList *p; + GList *p; - nautilus_profile_start (NULL); - for (p = changed_files; p != NULL; p = p->next) { - nautilus_file_emit_changed (p->data); - } - nautilus_directory_emit_files_changed (directory, changed_files); - nautilus_profile_end (NULL); + nautilus_profile_start (NULL); + for (p = changed_files; p != NULL; p = p->next) + { + nautilus_file_emit_changed (p->data); + } + nautilus_directory_emit_files_changed (directory, changed_files); + nautilus_profile_end (NULL); } void nautilus_directory_emit_done_loading (NautilusDirectory *directory) { - g_signal_emit (directory, - signals[DONE_LOADING], 0); + g_signal_emit (directory, + signals[DONE_LOADING], 0); } void nautilus_directory_emit_load_error (NautilusDirectory *directory, - GError *error) + GError *error) { - g_signal_emit (directory, - signals[LOAD_ERROR], 0, - error); + g_signal_emit (directory, + signals[LOAD_ERROR], 0, + error); } /* Return a directory object for this one's parent. */ static NautilusDirectory * get_parent_directory (GFile *location) { - NautilusDirectory *directory; - GFile *parent; + NautilusDirectory *directory; + GFile *parent; - parent = g_file_get_parent (location); - if (parent) { - directory = nautilus_directory_get_internal (parent, TRUE); - g_object_unref (parent); - return directory; - } - return NULL; + parent = g_file_get_parent (location); + if (parent) + { + directory = nautilus_directory_get_internal (parent, TRUE); + g_object_unref (parent); + return directory; + } + return NULL; } /* If a directory object exists for this one's parent, then @@ -931,788 +1005,854 @@ get_parent_directory (GFile *location) static NautilusDirectory * get_parent_directory_if_exists (GFile *location) { - NautilusDirectory *directory; - GFile *parent; + NautilusDirectory *directory; + GFile *parent; - parent = g_file_get_parent (location); - if (parent) { - directory = nautilus_directory_get_internal (parent, FALSE); - g_object_unref (parent); - return directory; - } - return NULL; + parent = g_file_get_parent (location); + if (parent) + { + directory = nautilus_directory_get_internal (parent, FALSE); + g_object_unref (parent); + return directory; + } + return NULL; } static void -hash_table_list_prepend (GHashTable *table, gconstpointer key, gpointer data) +hash_table_list_prepend (GHashTable *table, + gconstpointer key, + gpointer data) { - GList *list; + GList *list; - list = g_hash_table_lookup (table, key); - list = g_list_prepend (list, data); - g_hash_table_insert (table, (gpointer) key, list); + list = g_hash_table_lookup (table, key); + list = g_list_prepend (list, data); + g_hash_table_insert (table, (gpointer) key, list); } static void -call_files_added_free_list (gpointer key, gpointer value, gpointer user_data) +call_files_added_free_list (gpointer key, + gpointer value, + gpointer user_data) { - g_assert (NAUTILUS_IS_DIRECTORY (key)); - g_assert (value != NULL); - g_assert (user_data == NULL); + g_assert (NAUTILUS_IS_DIRECTORY (key)); + g_assert (value != NULL); + g_assert (user_data == NULL); - g_signal_emit (key, - signals[FILES_ADDED], 0, - value); - g_list_free (value); + g_signal_emit (key, + signals[FILES_ADDED], 0, + value); + g_list_free (value); } static void -call_files_changed_common (NautilusDirectory *directory, GList *file_list) -{ - GList *node; - NautilusFile *file; - - for (node = file_list; node != NULL; node = node->next) { - file = node->data; - if (file->details->directory == directory) { - nautilus_directory_add_file_to_work_queue (directory, - file); - } - } - nautilus_directory_async_state_changed (directory); - nautilus_directory_emit_change_signals (directory, file_list); +call_files_changed_common (NautilusDirectory *directory, + GList *file_list) +{ + GList *node; + NautilusFile *file; + + for (node = file_list; node != NULL; node = node->next) + { + file = node->data; + if (file->details->directory == directory) + { + nautilus_directory_add_file_to_work_queue (directory, + file); + } + } + nautilus_directory_async_state_changed (directory); + nautilus_directory_emit_change_signals (directory, file_list); } static void -call_files_changed_free_list (gpointer key, gpointer value, gpointer user_data) +call_files_changed_free_list (gpointer key, + gpointer value, + gpointer user_data) { - g_assert (value != NULL); - g_assert (user_data == NULL); + g_assert (value != NULL); + g_assert (user_data == NULL); - call_files_changed_common (NAUTILUS_DIRECTORY (key), value); - g_list_free (value); + call_files_changed_common (NAUTILUS_DIRECTORY (key), value); + g_list_free (value); } static void -call_files_changed_unref_free_list (gpointer key, gpointer value, gpointer user_data) +call_files_changed_unref_free_list (gpointer key, + gpointer value, + gpointer user_data) { - g_assert (value != NULL); - g_assert (user_data == NULL); + g_assert (value != NULL); + g_assert (user_data == NULL); - call_files_changed_common (NAUTILUS_DIRECTORY (key), value); - nautilus_file_list_free (value); + call_files_changed_common (NAUTILUS_DIRECTORY (key), value); + nautilus_file_list_free (value); } static void -call_get_file_info_free_list (gpointer key, gpointer value, gpointer user_data) +call_get_file_info_free_list (gpointer key, + gpointer value, + gpointer user_data) { - NautilusDirectory *directory; - GList *files; - - g_assert (NAUTILUS_IS_DIRECTORY (key)); - g_assert (value != NULL); - g_assert (user_data == NULL); + NautilusDirectory *directory; + GList *files; - directory = key; - files = value; - - nautilus_directory_get_info_for_new_files (directory, files); - g_list_foreach (files, (GFunc) g_object_unref, NULL); - g_list_free (files); + g_assert (NAUTILUS_IS_DIRECTORY (key)); + g_assert (value != NULL); + g_assert (user_data == NULL); + + directory = key; + files = value; + + nautilus_directory_get_info_for_new_files (directory, files); + g_list_foreach (files, (GFunc) g_object_unref, NULL); + g_list_free (files); } static void -invalidate_count_and_unref (gpointer key, gpointer value, gpointer user_data) +invalidate_count_and_unref (gpointer key, + gpointer value, + gpointer user_data) { - g_assert (NAUTILUS_IS_DIRECTORY (key)); - g_assert (value == key); - g_assert (user_data == NULL); + g_assert (NAUTILUS_IS_DIRECTORY (key)); + g_assert (value == key); + g_assert (user_data == NULL); - nautilus_directory_invalidate_count_and_mime_list (key); - nautilus_directory_unref (key); + nautilus_directory_invalidate_count_and_mime_list (key); + nautilus_directory_unref (key); } static void -collect_parent_directories (GHashTable *hash_table, NautilusDirectory *directory) +collect_parent_directories (GHashTable *hash_table, + NautilusDirectory *directory) { - g_assert (hash_table != NULL); - g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (hash_table != NULL); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); - if (g_hash_table_lookup (hash_table, directory) == NULL) { - nautilus_directory_ref (directory); - g_hash_table_insert (hash_table, directory, directory); - } + if (g_hash_table_lookup (hash_table, directory) == NULL) + { + nautilus_directory_ref (directory); + g_hash_table_insert (hash_table, directory, directory); + } } void nautilus_directory_notify_files_added (GList *files) { - GHashTable *added_lists; - GList *p; - NautilusDirectory *directory; - GHashTable *parent_directories; - NautilusFile *file; - GFile *location, *parent; - - nautilus_profile_start (NULL); - - /* Make a list of added files in each directory. */ - added_lists = g_hash_table_new (NULL, NULL); - - /* Make a list of parent directories that will need their counts updated. */ - parent_directories = g_hash_table_new (NULL, NULL); - - for (p = files; p != NULL; p = p->next) { - location = p->data; - - /* See if the directory is already known. */ - directory = get_parent_directory_if_exists (location); - if (directory == NULL) { - /* In case the directory is not being - * monitored, but the corresponding file is, - * we must invalidate it's item count. - */ - - - file = NULL; - parent = g_file_get_parent (location); - if (parent) { - file = nautilus_file_get_existing (parent); - g_object_unref (parent); - } - - if (file != NULL) { - nautilus_file_invalidate_count_and_mime_list (file); - nautilus_file_unref (file); - } - - continue; - } - - collect_parent_directories (parent_directories, directory); - - /* If no one is monitoring files in the directory, nothing to do. */ - if (!nautilus_directory_is_file_list_monitored (directory)) { - nautilus_directory_unref (directory); - continue; - } - - file = nautilus_file_get_existing (location); - /* We check is_added here, because the file could have been added - * to the directory by a nautilus_file_get() but not gotten - * files_added emitted - */ - if (file && file->details->is_added) { - /* A file already exists, it was probably renamed. - * If it was renamed this could be ignored, but - * queue a change just in case */ - nautilus_file_changed (file); - nautilus_file_unref (file); - } else { - hash_table_list_prepend (added_lists, - directory, - g_object_ref (location)); - } - nautilus_directory_unref (directory); - } - - /* Now get file info for the new files. This creates NautilusFile - * objects for the new files, and sends out a files_added signal. - */ - g_hash_table_foreach (added_lists, call_get_file_info_free_list, NULL); - g_hash_table_destroy (added_lists); - - /* Invalidate count for each parent directory. */ - g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); - g_hash_table_destroy (parent_directories); - - nautilus_profile_end (NULL); -} + GHashTable *added_lists; + GList *p; + NautilusDirectory *directory; + GHashTable *parent_directories; + NautilusFile *file; + GFile *location, *parent; + + nautilus_profile_start (NULL); + + /* Make a list of added files in each directory. */ + added_lists = g_hash_table_new (NULL, NULL); + + /* Make a list of parent directories that will need their counts updated. */ + parent_directories = g_hash_table_new (NULL, NULL); + + for (p = files; p != NULL; p = p->next) + { + location = p->data; + + /* See if the directory is already known. */ + directory = get_parent_directory_if_exists (location); + if (directory == NULL) + { + /* In case the directory is not being + * monitored, but the corresponding file is, + * we must invalidate it's item count. + */ + + + file = NULL; + parent = g_file_get_parent (location); + if (parent) + { + file = nautilus_file_get_existing (parent); + g_object_unref (parent); + } + + if (file != NULL) + { + nautilus_file_invalidate_count_and_mime_list (file); + nautilus_file_unref (file); + } + + continue; + } -void -nautilus_directory_notify_files_changed (GList *files) -{ - GHashTable *changed_lists; - GList *node; - GFile *location; - NautilusFile *file; + collect_parent_directories (parent_directories, directory); - /* Make a list of changed files in each directory. */ - changed_lists = g_hash_table_new (NULL, NULL); + /* If no one is monitoring files in the directory, nothing to do. */ + if (!nautilus_directory_is_file_list_monitored (directory)) + { + nautilus_directory_unref (directory); + continue; + } - /* Go through all the notifications. */ - for (node = files; node != NULL; node = node->next) { - location = node->data; + file = nautilus_file_get_existing (location); + /* We check is_added here, because the file could have been added + * to the directory by a nautilus_file_get() but not gotten + * files_added emitted + */ + if (file && file->details->is_added) + { + /* A file already exists, it was probably renamed. + * If it was renamed this could be ignored, but + * queue a change just in case */ + nautilus_file_changed (file); + nautilus_file_unref (file); + } + else + { + hash_table_list_prepend (added_lists, + directory, + g_object_ref (location)); + } + nautilus_directory_unref (directory); + } - /* Find the file. */ - file = nautilus_file_get_existing (location); - if (file != NULL) { - /* Tell it to re-get info now, and later emit - * a changed signal. - */ - file->details->file_info_is_up_to_date = FALSE; - file->details->link_info_is_up_to_date = FALSE; - nautilus_file_invalidate_extension_info_internal (file); + /* Now get file info for the new files. This creates NautilusFile + * objects for the new files, and sends out a files_added signal. + */ + g_hash_table_foreach (added_lists, call_get_file_info_free_list, NULL); + g_hash_table_destroy (added_lists); - hash_table_list_prepend (changed_lists, - file->details->directory, - file); - } - } + /* Invalidate count for each parent directory. */ + g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); + g_hash_table_destroy (parent_directories); - /* Now send out the changed signals. */ - g_hash_table_foreach (changed_lists, call_files_changed_unref_free_list, NULL); - g_hash_table_destroy (changed_lists); + nautilus_profile_end (NULL); +} + +void +nautilus_directory_notify_files_changed (GList *files) +{ + GHashTable *changed_lists; + GList *node; + GFile *location; + NautilusFile *file; + + /* Make a list of changed files in each directory. */ + changed_lists = g_hash_table_new (NULL, NULL); + + /* Go through all the notifications. */ + for (node = files; node != NULL; node = node->next) + { + location = node->data; + + /* Find the file. */ + file = nautilus_file_get_existing (location); + if (file != NULL) + { + /* Tell it to re-get info now, and later emit + * a changed signal. + */ + file->details->file_info_is_up_to_date = FALSE; + file->details->link_info_is_up_to_date = FALSE; + nautilus_file_invalidate_extension_info_internal (file); + + hash_table_list_prepend (changed_lists, + file->details->directory, + file); + } + } + + /* Now send out the changed signals. */ + g_hash_table_foreach (changed_lists, call_files_changed_unref_free_list, NULL); + g_hash_table_destroy (changed_lists); } void nautilus_directory_notify_files_removed (GList *files) { - GHashTable *changed_lists; - GList *p; - NautilusDirectory *directory; - GHashTable *parent_directories; - NautilusFile *file; - GFile *location; - - /* Make a list of changed files in each directory. */ - changed_lists = g_hash_table_new (NULL, NULL); - - /* Make a list of parent directories that will need their counts updated. */ - parent_directories = g_hash_table_new (NULL, NULL); - - /* Go through all the notifications. */ - for (p = files; p != NULL; p = p->next) { - location = p->data; - - /* Update file count for parent directory if anyone might care. */ - directory = get_parent_directory_if_exists (location); - if (directory != NULL) { - collect_parent_directories (parent_directories, directory); - nautilus_directory_unref (directory); - } - - /* Find the file. */ - file = nautilus_file_get_existing (location); - if (file != NULL && !nautilus_file_rename_in_progress (file)) { - /* Mark it gone and prepare to send the changed signal. */ - nautilus_file_mark_gone (file); - hash_table_list_prepend (changed_lists, - file->details->directory, - nautilus_file_ref (file)); - } - nautilus_file_unref (file); - } - - /* Now send out the changed signals. */ - g_hash_table_foreach (changed_lists, call_files_changed_unref_free_list, NULL); - g_hash_table_destroy (changed_lists); - - /* Invalidate count for each parent directory. */ - g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); - g_hash_table_destroy (parent_directories); + GHashTable *changed_lists; + GList *p; + NautilusDirectory *directory; + GHashTable *parent_directories; + NautilusFile *file; + GFile *location; + + /* Make a list of changed files in each directory. */ + changed_lists = g_hash_table_new (NULL, NULL); + + /* Make a list of parent directories that will need their counts updated. */ + parent_directories = g_hash_table_new (NULL, NULL); + + /* Go through all the notifications. */ + for (p = files; p != NULL; p = p->next) + { + location = p->data; + + /* Update file count for parent directory if anyone might care. */ + directory = get_parent_directory_if_exists (location); + if (directory != NULL) + { + collect_parent_directories (parent_directories, directory); + nautilus_directory_unref (directory); + } + + /* Find the file. */ + file = nautilus_file_get_existing (location); + if (file != NULL && !nautilus_file_rename_in_progress (file)) + { + /* Mark it gone and prepare to send the changed signal. */ + nautilus_file_mark_gone (file); + hash_table_list_prepend (changed_lists, + file->details->directory, + nautilus_file_ref (file)); + } + nautilus_file_unref (file); + } + + /* Now send out the changed signals. */ + g_hash_table_foreach (changed_lists, call_files_changed_unref_free_list, NULL); + g_hash_table_destroy (changed_lists); + + /* Invalidate count for each parent directory. */ + g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); + g_hash_table_destroy (parent_directories); } static void set_directory_location (NautilusDirectory *directory, - GFile *location) + GFile *location) { - if (directory->details->location) { - g_object_unref (directory->details->location); - } - directory->details->location = g_object_ref (location); + if (directory->details->location) + { + g_object_unref (directory->details->location); + } + directory->details->location = g_object_ref (location); - g_object_notify_by_pspec (G_OBJECT (directory), properties[PROP_LOCATION]); + g_object_notify_by_pspec (G_OBJECT (directory), properties[PROP_LOCATION]); } static void change_directory_location (NautilusDirectory *directory, - GFile *new_location) + GFile *new_location) { - /* I believe it's impossible for a self-owned file/directory - * to be moved. But if that did somehow happen, this function - * wouldn't do enough to handle it. - */ - g_assert (directory->details->as_file == NULL); + /* I believe it's impossible for a self-owned file/directory + * to be moved. But if that did somehow happen, this function + * wouldn't do enough to handle it. + */ + g_assert (directory->details->as_file == NULL); - g_hash_table_remove (directories, - directory->details->location); + g_hash_table_remove (directories, + directory->details->location); - set_directory_location (directory, new_location); + set_directory_location (directory, new_location); - g_hash_table_insert (directories, - directory->details->location, - directory); + g_hash_table_insert (directories, + directory->details->location, + directory); } -typedef struct { - GFile *container; - GList *directories; +typedef struct +{ + GFile *container; + GList *directories; } CollectData; static void -collect_directories_by_container (gpointer key, gpointer value, gpointer callback_data) +collect_directories_by_container (gpointer key, + gpointer value, + gpointer callback_data) { - NautilusDirectory *directory; - CollectData *collect_data; - GFile *location; + NautilusDirectory *directory; + CollectData *collect_data; + GFile *location; - location = (GFile *) key; - directory = NAUTILUS_DIRECTORY (value); - collect_data = (CollectData *) callback_data; + location = (GFile *) key; + directory = NAUTILUS_DIRECTORY (value); + collect_data = (CollectData *) callback_data; - if (g_file_has_prefix (location, collect_data->container) || - g_file_equal (collect_data->container, location)) { - nautilus_directory_ref (directory); - collect_data->directories = - g_list_prepend (collect_data->directories, - directory); - } + if (g_file_has_prefix (location, collect_data->container) || + g_file_equal (collect_data->container, location)) + { + nautilus_directory_ref (directory); + collect_data->directories = + g_list_prepend (collect_data->directories, + directory); + } } static GList * nautilus_directory_moved_internal (GFile *old_location, - GFile *new_location) -{ - CollectData collection; - NautilusDirectory *directory; - GList *node, *affected_files; - GFile *new_directory_location; - char *relative_path; - - collection.container = old_location; - collection.directories = NULL; - - g_hash_table_foreach (directories, - collect_directories_by_container, - &collection); - - affected_files = NULL; - - for (node = collection.directories; node != NULL; node = node->next) { - directory = NAUTILUS_DIRECTORY (node->data); - new_directory_location = NULL; - - if (g_file_equal (directory->details->location, old_location)) { - new_directory_location = g_object_ref (new_location); - } else { - relative_path = g_file_get_relative_path (old_location, - directory->details->location); - if (relative_path != NULL) { - new_directory_location = g_file_resolve_relative_path (new_location, relative_path); - g_free (relative_path); - - } - } - - if (new_directory_location) { - change_directory_location (directory, new_directory_location); - g_object_unref (new_directory_location); - - /* Collect affected files. */ - if (directory->details->as_file != NULL) { - affected_files = g_list_prepend - (affected_files, - nautilus_file_ref (directory->details->as_file)); - } - affected_files = g_list_concat - (affected_files, - nautilus_file_list_copy (directory->details->file_list)); - } - - nautilus_directory_unref (directory); - } - - g_list_free (collection.directories); - - return affected_files; + GFile *new_location) +{ + CollectData collection; + NautilusDirectory *directory; + GList *node, *affected_files; + GFile *new_directory_location; + char *relative_path; + + collection.container = old_location; + collection.directories = NULL; + + g_hash_table_foreach (directories, + collect_directories_by_container, + &collection); + + affected_files = NULL; + + for (node = collection.directories; node != NULL; node = node->next) + { + directory = NAUTILUS_DIRECTORY (node->data); + new_directory_location = NULL; + + if (g_file_equal (directory->details->location, old_location)) + { + new_directory_location = g_object_ref (new_location); + } + else + { + relative_path = g_file_get_relative_path (old_location, + directory->details->location); + if (relative_path != NULL) + { + new_directory_location = g_file_resolve_relative_path (new_location, relative_path); + g_free (relative_path); + } + } + + if (new_directory_location) + { + change_directory_location (directory, new_directory_location); + g_object_unref (new_directory_location); + + /* Collect affected files. */ + if (directory->details->as_file != NULL) + { + affected_files = g_list_prepend + (affected_files, + nautilus_file_ref (directory->details->as_file)); + } + affected_files = g_list_concat + (affected_files, + nautilus_file_list_copy (directory->details->file_list)); + } + + nautilus_directory_unref (directory); + } + + g_list_free (collection.directories); + + return affected_files; } void nautilus_directory_moved (const char *old_uri, - const char *new_uri) -{ - GList *list, *node; - GHashTable *hash; - NautilusFile *file; - GFile *old_location; - GFile *new_location; - - hash = g_hash_table_new (NULL, NULL); - - old_location = g_file_new_for_uri (old_uri); - new_location = g_file_new_for_uri (new_uri); - - list = nautilus_directory_moved_internal (old_location, new_location); - for (node = list; node != NULL; node = node->next) { - file = NAUTILUS_FILE (node->data); - hash_table_list_prepend (hash, - file->details->directory, - nautilus_file_ref (file)); - } - nautilus_file_list_free (list); - - g_object_unref (old_location); - g_object_unref (new_location); - - g_hash_table_foreach (hash, call_files_changed_unref_free_list, NULL); - g_hash_table_destroy (hash); + const char *new_uri) +{ + GList *list, *node; + GHashTable *hash; + NautilusFile *file; + GFile *old_location; + GFile *new_location; + + hash = g_hash_table_new (NULL, NULL); + + old_location = g_file_new_for_uri (old_uri); + new_location = g_file_new_for_uri (new_uri); + + list = nautilus_directory_moved_internal (old_location, new_location); + for (node = list; node != NULL; node = node->next) + { + file = NAUTILUS_FILE (node->data); + hash_table_list_prepend (hash, + file->details->directory, + nautilus_file_ref (file)); + } + nautilus_file_list_free (list); + + g_object_unref (old_location); + g_object_unref (new_location); + + g_hash_table_foreach (hash, call_files_changed_unref_free_list, NULL); + g_hash_table_destroy (hash); } void nautilus_directory_notify_files_moved (GList *file_pairs) { - GList *p, *affected_files, *node; - GFilePair *pair; - NautilusFile *file; - NautilusDirectory *old_directory, *new_directory; - GHashTable *parent_directories; - GList *new_files_list, *unref_list; - GHashTable *added_lists, *changed_lists; - char *name; - NautilusFileAttributes cancel_attributes; - GFile *to_location, *from_location; - - /* Make a list of added and changed files in each directory. */ - new_files_list = NULL; - added_lists = g_hash_table_new (NULL, NULL); - changed_lists = g_hash_table_new (NULL, NULL); - unref_list = NULL; - - /* Make a list of parent directories that will need their counts updated. */ - parent_directories = g_hash_table_new (NULL, NULL); - - cancel_attributes = nautilus_file_get_all_attributes (); - - for (p = file_pairs; p != NULL; p = p->next) { - pair = p->data; - from_location = pair->from; - to_location = pair->to; - - /* Handle overwriting a file. */ - file = nautilus_file_get_existing (to_location); - if (file != NULL) { - /* Mark it gone and prepare to send the changed signal. */ - nautilus_file_mark_gone (file); - new_directory = file->details->directory; - hash_table_list_prepend (changed_lists, - new_directory, - file); - collect_parent_directories (parent_directories, - new_directory); - } - - /* Update any directory objects that are affected. */ - affected_files = nautilus_directory_moved_internal (from_location, - to_location); - for (node = affected_files; node != NULL; node = node->next) { - file = NAUTILUS_FILE (node->data); - hash_table_list_prepend (changed_lists, - file->details->directory, - file); - } - unref_list = g_list_concat (unref_list, affected_files); - - /* Move an existing file. */ - file = nautilus_file_get_existing (from_location); - if (file == NULL) { - /* Handle this as if it was a new file. */ - new_files_list = g_list_prepend (new_files_list, - to_location); - } else { - /* Handle notification in the old directory. */ - old_directory = file->details->directory; - collect_parent_directories (parent_directories, old_directory); - - /* Cancel loading of attributes in the old directory */ - nautilus_directory_cancel_loading_file_attributes - (old_directory, file, cancel_attributes); - - /* Locate the new directory. */ - new_directory = get_parent_directory (to_location); - collect_parent_directories (parent_directories, new_directory); - /* We can unref now -- new_directory is in the - * parent directories list so it will be - * around until the end of this function - * anyway. - */ - nautilus_directory_unref (new_directory); - - /* Update the file's name and directory. */ - name = g_file_get_basename (to_location); - nautilus_file_update_name_and_directory - (file, name, new_directory); - g_free (name); - - /* Update file attributes */ - nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_INFO); - - hash_table_list_prepend (changed_lists, - old_directory, - file); - if (old_directory != new_directory) { - hash_table_list_prepend (added_lists, - new_directory, - file); - } - - /* Unref each file once to balance out nautilus_file_get_by_uri. */ - unref_list = g_list_prepend (unref_list, file); - } - } - - /* Now send out the changed and added signals for existing file objects. */ - g_hash_table_foreach (changed_lists, call_files_changed_free_list, NULL); - g_hash_table_destroy (changed_lists); - g_hash_table_foreach (added_lists, call_files_added_free_list, NULL); - g_hash_table_destroy (added_lists); - - /* Let the file objects go. */ - nautilus_file_list_free (unref_list); - - /* Invalidate count for each parent directory. */ - g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); - g_hash_table_destroy (parent_directories); - - /* Separate handling for brand new file objects. */ - nautilus_directory_notify_files_added (new_files_list); - g_list_free (new_files_list); + GList *p, *affected_files, *node; + GFilePair *pair; + NautilusFile *file; + NautilusDirectory *old_directory, *new_directory; + GHashTable *parent_directories; + GList *new_files_list, *unref_list; + GHashTable *added_lists, *changed_lists; + char *name; + NautilusFileAttributes cancel_attributes; + GFile *to_location, *from_location; + + /* Make a list of added and changed files in each directory. */ + new_files_list = NULL; + added_lists = g_hash_table_new (NULL, NULL); + changed_lists = g_hash_table_new (NULL, NULL); + unref_list = NULL; + + /* Make a list of parent directories that will need their counts updated. */ + parent_directories = g_hash_table_new (NULL, NULL); + + cancel_attributes = nautilus_file_get_all_attributes (); + + for (p = file_pairs; p != NULL; p = p->next) + { + pair = p->data; + from_location = pair->from; + to_location = pair->to; + + /* Handle overwriting a file. */ + file = nautilus_file_get_existing (to_location); + if (file != NULL) + { + /* Mark it gone and prepare to send the changed signal. */ + nautilus_file_mark_gone (file); + new_directory = file->details->directory; + hash_table_list_prepend (changed_lists, + new_directory, + file); + collect_parent_directories (parent_directories, + new_directory); + } + + /* Update any directory objects that are affected. */ + affected_files = nautilus_directory_moved_internal (from_location, + to_location); + for (node = affected_files; node != NULL; node = node->next) + { + file = NAUTILUS_FILE (node->data); + hash_table_list_prepend (changed_lists, + file->details->directory, + file); + } + unref_list = g_list_concat (unref_list, affected_files); + + /* Move an existing file. */ + file = nautilus_file_get_existing (from_location); + if (file == NULL) + { + /* Handle this as if it was a new file. */ + new_files_list = g_list_prepend (new_files_list, + to_location); + } + else + { + /* Handle notification in the old directory. */ + old_directory = file->details->directory; + collect_parent_directories (parent_directories, old_directory); + + /* Cancel loading of attributes in the old directory */ + nautilus_directory_cancel_loading_file_attributes + (old_directory, file, cancel_attributes); + + /* Locate the new directory. */ + new_directory = get_parent_directory (to_location); + collect_parent_directories (parent_directories, new_directory); + /* We can unref now -- new_directory is in the + * parent directories list so it will be + * around until the end of this function + * anyway. + */ + nautilus_directory_unref (new_directory); + + /* Update the file's name and directory. */ + name = g_file_get_basename (to_location); + nautilus_file_update_name_and_directory + (file, name, new_directory); + g_free (name); + + /* Update file attributes */ + nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_INFO); + + hash_table_list_prepend (changed_lists, + old_directory, + file); + if (old_directory != new_directory) + { + hash_table_list_prepend (added_lists, + new_directory, + file); + } + + /* Unref each file once to balance out nautilus_file_get_by_uri. */ + unref_list = g_list_prepend (unref_list, file); + } + } + + /* Now send out the changed and added signals for existing file objects. */ + g_hash_table_foreach (changed_lists, call_files_changed_free_list, NULL); + g_hash_table_destroy (changed_lists); + g_hash_table_foreach (added_lists, call_files_added_free_list, NULL); + g_hash_table_destroy (added_lists); + + /* Let the file objects go. */ + nautilus_file_list_free (unref_list); + + /* Invalidate count for each parent directory. */ + g_hash_table_foreach (parent_directories, invalidate_count_and_unref, NULL); + g_hash_table_destroy (parent_directories); + + /* Separate handling for brand new file objects. */ + nautilus_directory_notify_files_added (new_files_list); + g_list_free (new_files_list); } void nautilus_directory_schedule_position_set (GList *position_setting_list) { - GList *p; - const NautilusFileChangesQueuePosition *item; - NautilusFile *file; - char str[64]; - time_t now; - - time (&now); - - for (p = position_setting_list; p != NULL; p = p->next) { - item = (NautilusFileChangesQueuePosition *) p->data; - - file = nautilus_file_get (item->location); - - if (item->set) { - g_snprintf (str, sizeof (str), "%d,%d", item->point.x, item->point.y); - } else { - str[0] = 0; - } - nautilus_file_set_metadata - (file, - NAUTILUS_METADATA_KEY_ICON_POSITION, - NULL, - str); - - if (item->set) { - nautilus_file_set_time_metadata - (file, - NAUTILUS_METADATA_KEY_ICON_POSITION_TIMESTAMP, - now); - } else { - nautilus_file_set_time_metadata - (file, - NAUTILUS_METADATA_KEY_ICON_POSITION_TIMESTAMP, - UNDEFINED_TIME); - } - - if (item->set) { - g_snprintf (str, sizeof (str), "%d", item->screen); - } else { - str[0] = 0; - } - nautilus_file_set_metadata - (file, - NAUTILUS_METADATA_KEY_SCREEN, - NULL, - str); - - nautilus_file_unref (file); - } + GList *p; + const NautilusFileChangesQueuePosition *item; + NautilusFile *file; + char str[64]; + time_t now; + + time (&now); + + for (p = position_setting_list; p != NULL; p = p->next) + { + item = (NautilusFileChangesQueuePosition *) p->data; + + file = nautilus_file_get (item->location); + + if (item->set) + { + g_snprintf (str, sizeof (str), "%d,%d", item->point.x, item->point.y); + } + else + { + str[0] = 0; + } + nautilus_file_set_metadata + (file, + NAUTILUS_METADATA_KEY_ICON_POSITION, + NULL, + str); + + if (item->set) + { + nautilus_file_set_time_metadata + (file, + NAUTILUS_METADATA_KEY_ICON_POSITION_TIMESTAMP, + now); + } + else + { + nautilus_file_set_time_metadata + (file, + NAUTILUS_METADATA_KEY_ICON_POSITION_TIMESTAMP, + UNDEFINED_TIME); + } + + if (item->set) + { + g_snprintf (str, sizeof (str), "%d", item->screen); + } + else + { + str[0] = 0; + } + nautilus_file_set_metadata + (file, + NAUTILUS_METADATA_KEY_SCREEN, + NULL, + str); + + nautilus_file_unref (file); + } } gboolean nautilus_directory_contains_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); + g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE); - if (nautilus_file_is_gone (file)) { - return FALSE; - } + if (nautilus_file_is_gone (file)) + { + return FALSE; + } - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->contains_file (directory, file); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->contains_file (directory, file); } -NautilusFile* +NautilusFile * nautilus_directory_get_file_by_name (NautilusDirectory *directory, const gchar *name) { - GList *files; - GList *l; - NautilusFile *result = NULL; + GList *files; + GList *l; + NautilusFile *result = NULL; - files = nautilus_directory_get_file_list (directory); + files = nautilus_directory_get_file_list (directory); - for (l = files; l != NULL; l = l->next) { - if (nautilus_file_compare_display_name (l->data, name) == 0) { - result = nautilus_file_ref (l->data); - break; - } + for (l = files; l != NULL; l = l->next) + { + if (nautilus_file_compare_display_name (l->data, name) == 0) + { + result = nautilus_file_ref (l->data); + break; } + } - nautilus_file_list_free (files); + nautilus_file_list_free (files); - return result; + return result; } void -nautilus_directory_call_when_ready (NautilusDirectory *directory, - NautilusFileAttributes file_attributes, - gboolean wait_for_all_files, - NautilusDirectoryCallback callback, - gpointer callback_data) +nautilus_directory_call_when_ready (NautilusDirectory *directory, + NautilusFileAttributes file_attributes, + gboolean wait_for_all_files, + NautilusDirectoryCallback callback, + gpointer callback_data) { - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - g_return_if_fail (callback != NULL); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (callback != NULL); - NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->call_when_ready - (directory, file_attributes, wait_for_all_files, - callback, callback_data); + NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->call_when_ready + (directory, file_attributes, wait_for_all_files, + callback, callback_data); } void -nautilus_directory_cancel_callback (NautilusDirectory *directory, - NautilusDirectoryCallback callback, - gpointer callback_data) +nautilus_directory_cancel_callback (NautilusDirectory *directory, + NautilusDirectoryCallback callback, + gpointer callback_data) { - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - g_return_if_fail (callback != NULL); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (callback != NULL); - NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->cancel_callback - (directory, callback, callback_data); + NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->cancel_callback + (directory, callback, callback_data); } void -nautilus_directory_file_monitor_add (NautilusDirectory *directory, - gconstpointer client, - gboolean monitor_hidden_files, - NautilusFileAttributes file_attributes, - NautilusDirectoryCallback callback, - gpointer callback_data) +nautilus_directory_file_monitor_add (NautilusDirectory *directory, + gconstpointer client, + gboolean monitor_hidden_files, + NautilusFileAttributes file_attributes, + NautilusDirectoryCallback callback, + gpointer callback_data) { - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - g_return_if_fail (client != NULL); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (client != NULL); - NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->file_monitor_add - (directory, client, - monitor_hidden_files, - file_attributes, - callback, callback_data); + NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->file_monitor_add + (directory, client, + monitor_hidden_files, + file_attributes, + callback, callback_data); } void nautilus_directory_file_monitor_remove (NautilusDirectory *directory, - gconstpointer client) + gconstpointer client) { - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - g_return_if_fail (client != NULL); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (client != NULL); - NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->file_monitor_remove - (directory, client); + NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->file_monitor_remove + (directory, client); } void nautilus_directory_force_reload (NautilusDirectory *directory) { - g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); + g_return_if_fail (NAUTILUS_IS_DIRECTORY (directory)); - NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->force_reload (directory); + NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->force_reload (directory); } gboolean nautilus_directory_is_not_empty (NautilusDirectory *directory) { - g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); + g_return_val_if_fail (NAUTILUS_IS_DIRECTORY (directory), FALSE); - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->is_not_empty (directory); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->is_not_empty (directory); } static gboolean is_tentative (NautilusFile *file, gpointer callback_data) { - g_assert (callback_data == NULL); + g_assert (callback_data == NULL); - /* Avoid returning files with !is_added, because these - * will later be sent with the files_added signal, and a - * user doing get_file_list + files_added monitoring will - * then see the file twice */ - return !file->details->got_file_info || !file->details->is_added; + /* Avoid returning files with !is_added, because these + * will later be sent with the files_added signal, and a + * user doing get_file_list + files_added monitoring will + * then see the file twice */ + return !file->details->got_file_info || !file->details->is_added; } GList * nautilus_directory_get_file_list (NautilusDirectory *directory) { - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->get_file_list (directory); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->get_file_list (directory); } static GList * real_get_file_list (NautilusDirectory *directory) { - GList *tentative_files, *non_tentative_files; + GList *tentative_files, *non_tentative_files; - tentative_files = nautilus_file_list_filter (directory->details->file_list, - &non_tentative_files, is_tentative, NULL); - nautilus_file_list_free (tentative_files); + tentative_files = nautilus_file_list_filter (directory->details->file_list, + &non_tentative_files, is_tentative, NULL); + nautilus_file_list_free (tentative_files); - return non_tentative_files; + return non_tentative_files; } static gboolean real_is_editable (NautilusDirectory *directory) { - return TRUE; + return TRUE; } gboolean nautilus_directory_is_editable (NautilusDirectory *directory) { - return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->is_editable (directory); + return NAUTILUS_DIRECTORY_CLASS (G_OBJECT_GET_CLASS (directory))->is_editable (directory); } GList * -nautilus_directory_match_pattern (NautilusDirectory *directory, const char *pattern) +nautilus_directory_match_pattern (NautilusDirectory *directory, + const char *pattern) { - GList *files, *l, *ret; - GPatternSpec *spec; + GList *files, *l, *ret; + GPatternSpec *spec; - ret = NULL; - spec = g_pattern_spec_new (pattern); - - files = nautilus_directory_get_file_list (directory); - for (l = files; l; l = l->next) { - NautilusFile *file; - char *name; - - file = NAUTILUS_FILE (l->data); - name = nautilus_file_get_display_name (file); + ret = NULL; + spec = g_pattern_spec_new (pattern); - if (g_pattern_match_string (spec, name)) { - ret = g_list_prepend(ret, nautilus_file_ref (file)); - } + files = nautilus_directory_get_file_list (directory); + for (l = files; l; l = l->next) + { + NautilusFile *file; + char *name; - g_free (name); - } + file = NAUTILUS_FILE (l->data); + name = nautilus_file_get_display_name (file); - g_pattern_spec_free (spec); - nautilus_file_list_free (files); + if (g_pattern_match_string (spec, name)) + { + ret = g_list_prepend (ret, nautilus_file_ref (file)); + } + + g_free (name); + } - return ret; + g_pattern_spec_free (spec); + nautilus_file_list_free (files); + + return ret; } /** @@ -1724,8 +1864,8 @@ nautilus_directory_match_pattern (NautilusDirectory *directory, const char *patt GList * nautilus_directory_list_ref (GList *list) { - g_list_foreach (list, (GFunc) nautilus_directory_ref, NULL); - return list; + g_list_foreach (list, (GFunc) nautilus_directory_ref, NULL); + return list; } /** @@ -1737,7 +1877,7 @@ nautilus_directory_list_ref (GList *list) void nautilus_directory_list_unref (GList *list) { - g_list_foreach (list, (GFunc) nautilus_directory_unref, NULL); + g_list_foreach (list, (GFunc) nautilus_directory_unref, NULL); } /** @@ -1749,8 +1889,8 @@ nautilus_directory_list_unref (GList *list) void nautilus_directory_list_free (GList *list) { - nautilus_directory_list_unref (list); - g_list_free (list); + nautilus_directory_list_unref (list); + g_list_free (list); } /** @@ -1762,42 +1902,44 @@ nautilus_directory_list_free (GList *list) GList * nautilus_directory_list_copy (GList *list) { - return g_list_copy (nautilus_directory_list_ref (list)); + return g_list_copy (nautilus_directory_list_ref (list)); } static int -compare_by_uri (NautilusDirectory *a, NautilusDirectory *b) +compare_by_uri (NautilusDirectory *a, + NautilusDirectory *b) { - char *uri_a, *uri_b; - int res; + char *uri_a, *uri_b; + int res; + + uri_a = g_file_get_uri (a->details->location); + uri_b = g_file_get_uri (b->details->location); - uri_a = g_file_get_uri (a->details->location); - uri_b = g_file_get_uri (b->details->location); - - res = strcmp (uri_a, uri_b); + res = strcmp (uri_a, uri_b); - g_free (uri_a); - g_free (uri_b); - - return res; + g_free (uri_a); + g_free (uri_b); + + return res; } static int -compare_by_uri_cover (gconstpointer a, gconstpointer b) +compare_by_uri_cover (gconstpointer a, + gconstpointer b) { - return compare_by_uri (NAUTILUS_DIRECTORY (a), NAUTILUS_DIRECTORY (b)); + return compare_by_uri (NAUTILUS_DIRECTORY (a), NAUTILUS_DIRECTORY (b)); } /** * nautilus_directory_list_sort_by_uri - * + * * Sort the list of directories by directory uri. * @list: GList of directories. **/ GList * nautilus_directory_list_sort_by_uri (GList *list) { - return g_list_sort (list, compare_by_uri_cover); + return g_list_sort (list, compare_by_uri_cover); } #if !defined (NAUTILUS_OMIT_SELF_CHECK) @@ -1809,116 +1951,120 @@ static int data_dummy; static gboolean got_files_flag; static void -got_files_callback (NautilusDirectory *directory, GList *files, gpointer callback_data) +got_files_callback (NautilusDirectory *directory, + GList *files, + gpointer callback_data) { - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (g_list_length (files) > 10); - g_assert (callback_data == &data_dummy); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (g_list_length (files) > 10); + g_assert (callback_data == &data_dummy); - got_files_flag = TRUE; + got_files_flag = TRUE; } /* Return the number of extant NautilusDirectories */ int nautilus_directory_number_outstanding (void) { - return directories ? g_hash_table_size (directories) : 0; + return directories ? g_hash_table_size (directories) : 0; } void nautilus_directory_dump (NautilusDirectory *directory) { - g_autofree gchar *uri; + g_autofree gchar *uri; - uri = g_file_get_uri (directory->details->location); - g_print ("uri: %s\n", uri); - g_print ("ref count: %d\n", G_OBJECT (directory)->ref_count); + uri = g_file_get_uri (directory->details->location); + g_print ("uri: %s\n", uri); + g_print ("ref count: %d\n", G_OBJECT (directory)->ref_count); } void nautilus_self_check_directory (void) { - NautilusDirectory *directory; - NautilusFile *file; - - directory = nautilus_directory_get_by_uri ("file:///etc"); - file = nautilus_file_get_by_uri ("file:///etc/passwd"); + NautilusDirectory *directory; + NautilusFile *file; - EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1); + directory = nautilus_directory_get_by_uri ("file:///etc"); + file = nautilus_file_get_by_uri ("file:///etc/passwd"); - nautilus_directory_file_monitor_add - (directory, &data_dummy, - TRUE, 0, NULL, NULL); + EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1); - /* FIXME: these need to be updated to the new metadata infrastructure - * as make check doesn't pass. - nautilus_file_set_metadata (file, "test", "default", "value"); - EEL_CHECK_STRING_RESULT (nautilus_file_get_metadata (file, "test", "default"), "value"); + nautilus_directory_file_monitor_add + (directory, &data_dummy, + TRUE, 0, NULL, NULL); - nautilus_file_set_boolean_metadata (file, "test_boolean", TRUE, TRUE); - EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (file, "test_boolean", TRUE), TRUE); - nautilus_file_set_boolean_metadata (file, "test_boolean", TRUE, FALSE); - EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (file, "test_boolean", TRUE), FALSE); - EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (NULL, "test_boolean", TRUE), TRUE); + /* FIXME: these need to be updated to the new metadata infrastructure + * as make check doesn't pass. + * nautilus_file_set_metadata (file, "test", "default", "value"); + * EEL_CHECK_STRING_RESULT (nautilus_file_get_metadata (file, "test", "default"), "value"); + * + * nautilus_file_set_boolean_metadata (file, "test_boolean", TRUE, TRUE); + * EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (file, "test_boolean", TRUE), TRUE); + * nautilus_file_set_boolean_metadata (file, "test_boolean", TRUE, FALSE); + * EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (file, "test_boolean", TRUE), FALSE); + * EEL_CHECK_BOOLEAN_RESULT (nautilus_file_get_boolean_metadata (NULL, "test_boolean", TRUE), TRUE); + * + * nautilus_file_set_integer_metadata (file, "test_integer", 0, 17); + * EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 0), 17); + * nautilus_file_set_integer_metadata (file, "test_integer", 0, -1); + * EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 0), -1); + * nautilus_file_set_integer_metadata (file, "test_integer", 42, 42); + * EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 42), 42); + * EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (NULL, "test_integer", 42), 42); + * EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "nonexistent_key", 42), 42); + */ - nautilus_file_set_integer_metadata (file, "test_integer", 0, 17); - EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 0), 17); - nautilus_file_set_integer_metadata (file, "test_integer", 0, -1); - EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 0), -1); - nautilus_file_set_integer_metadata (file, "test_integer", 42, 42); - EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "test_integer", 42), 42); - EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (NULL, "test_integer", 42), 42); - EEL_CHECK_INTEGER_RESULT (nautilus_file_get_integer_metadata (file, "nonexistent_key", 42), 42); - */ + EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc") == directory, TRUE); + nautilus_directory_unref (directory); - EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc") == directory, TRUE); - nautilus_directory_unref (directory); + EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc/") == directory, TRUE); + nautilus_directory_unref (directory); - EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc/") == directory, TRUE); - nautilus_directory_unref (directory); + EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc////") == directory, TRUE); + nautilus_directory_unref (directory); - EEL_CHECK_BOOLEAN_RESULT (nautilus_directory_get_by_uri ("file:///etc////") == directory, TRUE); - nautilus_directory_unref (directory); + nautilus_file_unref (file); - nautilus_file_unref (file); + nautilus_directory_file_monitor_remove (directory, &data_dummy); - nautilus_directory_file_monitor_remove (directory, &data_dummy); + nautilus_directory_unref (directory); - nautilus_directory_unref (directory); + while (g_hash_table_size (directories) != 0) + { + gtk_main_iteration (); + } - while (g_hash_table_size (directories) != 0) { - gtk_main_iteration (); - } + EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 0); - EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 0); + directory = nautilus_directory_get_by_uri ("file:///etc"); - directory = nautilus_directory_get_by_uri ("file:///etc"); + got_files_flag = FALSE; - got_files_flag = FALSE; + nautilus_directory_call_when_ready (directory, + NAUTILUS_FILE_ATTRIBUTE_INFO | + NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS, + TRUE, + got_files_callback, &data_dummy); - nautilus_directory_call_when_ready (directory, - NAUTILUS_FILE_ATTRIBUTE_INFO | - NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS, - TRUE, - got_files_callback, &data_dummy); + while (!got_files_flag) + { + gtk_main_iteration (); + } - while (!got_files_flag) { - gtk_main_iteration (); - } + EEL_CHECK_BOOLEAN_RESULT (directory->details->file_list == NULL, TRUE); - EEL_CHECK_BOOLEAN_RESULT (directory->details->file_list == NULL, TRUE); + EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1); - EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 1); + file = nautilus_file_get_by_uri ("file:///etc/passwd"); - file = nautilus_file_get_by_uri ("file:///etc/passwd"); + /* EEL_CHECK_STRING_RESULT (nautilus_file_get_metadata (file, "test", "default"), "value"); */ - /* EEL_CHECK_STRING_RESULT (nautilus_file_get_metadata (file, "test", "default"), "value"); */ - - nautilus_file_unref (file); + nautilus_file_unref (file); - nautilus_directory_unref (directory); + nautilus_directory_unref (directory); - EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 0); + EEL_CHECK_INTEGER_RESULT (g_hash_table_size (directories), 0); } #endif /* !NAUTILUS_OMIT_SELF_CHECK */ |