diff options
Diffstat (limited to 'src/nautilus-directory-async.c')
-rw-r--r-- | src/nautilus-directory-async.c | 7543 |
1 files changed, 4018 insertions, 3525 deletions
diff --git a/src/nautilus-directory-async.c b/src/nautilus-directory-async.c index ea97da61f..e8a10cd3b 100644 --- a/src/nautilus-directory-async.c +++ b/src/nautilus-directory-async.c @@ -1,23 +1,23 @@ /* - nautilus-directory-async.c: Nautilus directory model state machine. - - 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-async.c: Nautilus directory model state machine. + * + * 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> @@ -56,118 +56,133 @@ /* Keep async. jobs down to this number for all directories. */ #define MAX_ASYNC_JOBS 10 -struct TopLeftTextReadState { - NautilusDirectory *directory; - NautilusFile *file; - gboolean large; - GCancellable *cancellable; +struct TopLeftTextReadState +{ + NautilusDirectory *directory; + NautilusFile *file; + gboolean large; + GCancellable *cancellable; }; -struct LinkInfoReadState { - NautilusDirectory *directory; - GCancellable *cancellable; - NautilusFile *file; +struct LinkInfoReadState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + NautilusFile *file; }; -struct ThumbnailState { - NautilusDirectory *directory; - GCancellable *cancellable; - NautilusFile *file; - gboolean trying_original; - gboolean tried_original; +struct ThumbnailState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + NautilusFile *file; + gboolean trying_original; + gboolean tried_original; }; -struct MountState { - NautilusDirectory *directory; - GCancellable *cancellable; - NautilusFile *file; +struct MountState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + NautilusFile *file; }; -struct FilesystemInfoState { - NautilusDirectory *directory; - GCancellable *cancellable; - NautilusFile *file; +struct FilesystemInfoState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + NautilusFile *file; }; -struct DirectoryLoadState { - NautilusDirectory *directory; - GCancellable *cancellable; - GFileEnumerator *enumerator; - GHashTable *load_mime_list_hash; - NautilusFile *load_directory_file; - int load_file_count; +struct DirectoryLoadState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + GFileEnumerator *enumerator; + GHashTable *load_mime_list_hash; + NautilusFile *load_directory_file; + int load_file_count; }; -struct MimeListState { - NautilusDirectory *directory; - NautilusFile *mime_list_file; - GCancellable *cancellable; - GFileEnumerator *enumerator; - GHashTable *mime_list_hash; +struct MimeListState +{ + NautilusDirectory *directory; + NautilusFile *mime_list_file; + GCancellable *cancellable; + GFileEnumerator *enumerator; + GHashTable *mime_list_hash; }; -struct GetInfoState { - NautilusDirectory *directory; - GCancellable *cancellable; +struct GetInfoState +{ + NautilusDirectory *directory; + GCancellable *cancellable; }; -struct NewFilesState { - NautilusDirectory *directory; - GCancellable *cancellable; - int count; +struct NewFilesState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + int count; }; -struct DirectoryCountState { - NautilusDirectory *directory; - NautilusFile *count_file; - GCancellable *cancellable; - GFileEnumerator *enumerator; - int file_count; +struct DirectoryCountState +{ + NautilusDirectory *directory; + NautilusFile *count_file; + GCancellable *cancellable; + GFileEnumerator *enumerator; + int file_count; }; -struct DeepCountState { - NautilusDirectory *directory; - GCancellable *cancellable; - GFileEnumerator *enumerator; - GFile *deep_count_location; - GList *deep_count_subdirectories; - GArray *seen_deep_count_inodes; - char *fs_id; +struct DeepCountState +{ + NautilusDirectory *directory; + GCancellable *cancellable; + GFileEnumerator *enumerator; + GFile *deep_count_location; + GList *deep_count_subdirectories; + GArray *seen_deep_count_inodes; + char *fs_id; }; -typedef struct { - NautilusFile *file; /* Which file, NULL means all. */ - union { - NautilusDirectoryCallback directory; - NautilusFileCallback file; - } callback; - gpointer callback_data; - Request request; - gboolean active; /* Set to FALSE when the callback is triggered and - * scheduled to be called at idle, its still kept - * in the list so we can kill it when the file - * goes away. - */ +typedef struct +{ + NautilusFile *file; /* Which file, NULL means all. */ + union + { + NautilusDirectoryCallback directory; + NautilusFileCallback file; + } callback; + gpointer callback_data; + Request request; + gboolean active; /* Set to FALSE when the callback is triggered and + * scheduled to be called at idle, its still kept + * in the list so we can kill it when the file + * goes away. + */ } ReadyCallback; -typedef struct { - NautilusFile *file; /* Which file, NULL means all. */ - gboolean monitor_hidden_files; /* defines whether "all" includes hidden files */ - gconstpointer client; - Request request; +typedef struct +{ + NautilusFile *file; /* Which file, NULL means all. */ + gboolean monitor_hidden_files; /* defines whether "all" includes hidden files */ + gconstpointer client; + Request request; } Monitor; -typedef struct { - NautilusDirectory *directory; - NautilusInfoProvider *provider; - NautilusOperationHandle *handle; - NautilusOperationResult result; +typedef struct +{ + NautilusDirectory *directory; + NautilusInfoProvider *provider; + NautilusOperationHandle *handle; + NautilusOperationResult result; } InfoProviderResponse; -typedef gboolean (* RequestCheck) (Request); -typedef gboolean (* FileCheck) (NautilusFile *); +typedef gboolean (*RequestCheck) (Request); +typedef gboolean (*FileCheck) (NautilusFile *); /* Current number of async. jobs. */ static int async_job_count; @@ -177,157 +192,174 @@ static GHashTable *async_jobs; #endif /* Forward declarations for functions that need them. */ -static void deep_count_load (DeepCountState *state, - GFile *location); -static gboolean request_is_satisfied (NautilusDirectory *directory, - NautilusFile *file, - Request request); -static void cancel_loading_attributes (NautilusDirectory *directory, - NautilusFileAttributes file_attributes); -static void add_all_files_to_work_queue (NautilusDirectory *directory); -static void link_info_done (NautilusDirectory *directory, - NautilusFile *file, - const char *uri, - const char *name, - GIcon *icon, - gboolean is_launcher, - gboolean is_foreign); -static void move_file_to_low_priority_queue (NautilusDirectory *directory, - NautilusFile *file); -static void move_file_to_extension_queue (NautilusDirectory *directory, - NautilusFile *file); -static void nautilus_directory_invalidate_file_attributes (NautilusDirectory *directory, - NautilusFileAttributes file_attributes); +static void deep_count_load (DeepCountState *state, + GFile *location); +static gboolean request_is_satisfied (NautilusDirectory *directory, + NautilusFile *file, + Request request); +static void cancel_loading_attributes (NautilusDirectory *directory, + NautilusFileAttributes file_attributes); +static void add_all_files_to_work_queue (NautilusDirectory *directory); +static void link_info_done (NautilusDirectory *directory, + NautilusFile *file, + const char *uri, + const char *name, + GIcon *icon, + gboolean is_launcher, + gboolean is_foreign); +static void move_file_to_low_priority_queue (NautilusDirectory *directory, + NautilusFile *file); +static void move_file_to_extension_queue (NautilusDirectory *directory, + NautilusFile *file); +static void nautilus_directory_invalidate_file_attributes (NautilusDirectory *directory, + NautilusFileAttributes file_attributes); /* Some helpers for case-insensitive strings. * Move to nautilus-glib-extensions? */ static gboolean -istr_equal (gconstpointer v, gconstpointer v2) +istr_equal (gconstpointer v, + gconstpointer v2) { - return g_ascii_strcasecmp (v, v2) == 0; + return g_ascii_strcasecmp (v, v2) == 0; } static guint istr_hash (gconstpointer key) { - const char *p; - guint h; + const char *p; + guint h; - h = 0; - for (p = key; *p != '\0'; p++) { - h = (h << 5) - h + g_ascii_tolower (*p); - } - - return h; + h = 0; + for (p = key; *p != '\0'; p++) + { + h = (h << 5) - h + g_ascii_tolower (*p); + } + + return h; } static GHashTable * istr_set_new (void) { - return g_hash_table_new_full (istr_hash, istr_equal, g_free, NULL); + return g_hash_table_new_full (istr_hash, istr_equal, g_free, NULL); } static void -istr_set_insert (GHashTable *table, const char *istr) +istr_set_insert (GHashTable *table, + const char *istr) { - char *key; + char *key; - key = g_strdup (istr); - g_hash_table_replace (table, key, key); + key = g_strdup (istr); + g_hash_table_replace (table, key, key); } static void -add_istr_to_list (gpointer key, gpointer value, gpointer callback_data) +add_istr_to_list (gpointer key, + gpointer value, + gpointer callback_data) { - GList **list; + GList **list; - list = callback_data; - *list = g_list_prepend (*list, g_strdup (key)); + list = callback_data; + *list = g_list_prepend (*list, g_strdup (key)); } static GList * istr_set_get_as_list (GHashTable *table) { - GList *list; + GList *list; - list = NULL; - g_hash_table_foreach (table, add_istr_to_list, &list); - return list; + list = NULL; + g_hash_table_foreach (table, add_istr_to_list, &list); + return list; } static void istr_set_destroy (GHashTable *table) { - g_hash_table_destroy (table); + g_hash_table_destroy (table); } static void request_counter_add_request (RequestCounter counter, - Request request) + Request request) { - guint i; + guint i; - for (i = 0; i < REQUEST_TYPE_LAST; i++) { - if (REQUEST_WANTS_TYPE (request, i)) { - counter[i]++; - } - } + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + if (REQUEST_WANTS_TYPE (request, i)) + { + counter[i]++; + } + } } static void request_counter_remove_request (RequestCounter counter, - Request request) + Request request) { - guint i; + guint i; - for (i = 0; i < REQUEST_TYPE_LAST; i++) { - if (REQUEST_WANTS_TYPE (request, i)) { - counter[i]--; - } - } + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + if (REQUEST_WANTS_TYPE (request, i)) + { + counter[i]--; + } + } } #if 0 static void nautilus_directory_verify_request_counts (NautilusDirectory *directory) { - GList *l; - RequestCounter counters; - int i; - gboolean fail; - - fail = FALSE; - for (i = 0; i < REQUEST_TYPE_LAST; i ++) { - counters[i] = 0; - } - for (l = directory->details->monitor_list; l != NULL; l = l->next) { - Monitor *monitor = l->data; - request_counter_add_request (counters, monitor->request); - } - for (i = 0; i < REQUEST_TYPE_LAST; i ++) { - if (counters[i] != directory->details->monitor_counters[i]) { - g_warning ("monitor counter for %i is wrong, expecting %d but found %d", - i, counters[i], directory->details->monitor_counters[i]); - fail = TRUE; - } - } - for (i = 0; i < REQUEST_TYPE_LAST; i ++) { - counters[i] = 0; - } - for (l = directory->details->call_when_ready_list; l != NULL; l = l->next) { - ReadyCallback *callback = l->data; - request_counter_add_request (counters, callback->request); - } - for (i = 0; i < REQUEST_TYPE_LAST; i ++) { - if (counters[i] != directory->details->call_when_ready_counters[i]) { - g_warning ("call when ready counter for %i is wrong, expecting %d but found %d", - i, counters[i], directory->details->call_when_ready_counters[i]); - fail = TRUE; - } - } - g_assert (!fail); + GList *l; + RequestCounter counters; + int i; + gboolean fail; + + fail = FALSE; + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + counters[i] = 0; + } + for (l = directory->details->monitor_list; l != NULL; l = l->next) + { + Monitor *monitor = l->data; + request_counter_add_request (counters, monitor->request); + } + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + if (counters[i] != directory->details->monitor_counters[i]) + { + g_warning ("monitor counter for %i is wrong, expecting %d but found %d", + i, counters[i], directory->details->monitor_counters[i]); + fail = TRUE; + } + } + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + counters[i] = 0; + } + for (l = directory->details->call_when_ready_list; l != NULL; l = l->next) + { + ReadyCallback *callback = l->data; + request_counter_add_request (counters, callback->request); + } + for (i = 0; i < REQUEST_TYPE_LAST; i++) + { + if (counters[i] != directory->details->call_when_ready_counters[i]) + { + g_warning ("call when ready counter for %i is wrong, expecting %d but found %d", + i, counters[i], directory->details->call_when_ready_counters[i]); + fail = TRUE; + } + } + g_assert (!fail); } #endif @@ -337,110 +369,120 @@ nautilus_directory_verify_request_counts (NautilusDirectory *directory) */ static gboolean async_job_start (NautilusDirectory *directory, - const char *job) + const char *job) { #ifdef DEBUG_ASYNC_JOBS - char *key; + char *key; #endif #ifdef DEBUG_START_STOP - g_message ("starting %s in %p", job, directory->details->location); + g_message ("starting %s in %p", job, directory->details->location); #endif - g_assert (async_job_count >= 0); - g_assert (async_job_count <= MAX_ASYNC_JOBS); + g_assert (async_job_count >= 0); + g_assert (async_job_count <= MAX_ASYNC_JOBS); + + if (async_job_count >= MAX_ASYNC_JOBS) + { + if (waiting_directories == NULL) + { + waiting_directories = g_hash_table_new (NULL, NULL); + } - if (async_job_count >= MAX_ASYNC_JOBS) { - if (waiting_directories == NULL) { - waiting_directories = g_hash_table_new (NULL, NULL); - } + g_hash_table_insert (waiting_directories, + directory, + directory); - g_hash_table_insert (waiting_directories, - directory, - directory); - - return FALSE; - } + return FALSE; + } #ifdef DEBUG_ASYNC_JOBS - { - char *uri; - if (async_jobs == NULL) { - async_jobs = g_hash_table_new (g_str_hash, g_str_equal); - } - uri = nautilus_directory_get_uri (directory); - key = g_strconcat (uri, ": ", job, NULL); - if (g_hash_table_lookup (async_jobs, key) != NULL) { - g_warning ("same job twice: %s in %s", - job, uri); - } - g_free (uri); - g_hash_table_insert (async_jobs, key, directory); - } -#endif - - async_job_count += 1; - return TRUE; + { + char *uri; + if (async_jobs == NULL) + { + async_jobs = g_hash_table_new (g_str_hash, g_str_equal); + } + uri = nautilus_directory_get_uri (directory); + key = g_strconcat (uri, ": ", job, NULL); + if (g_hash_table_lookup (async_jobs, key) != NULL) + { + g_warning ("same job twice: %s in %s", + job, uri); + } + g_free (uri); + g_hash_table_insert (async_jobs, key, directory); + } +#endif + + async_job_count += 1; + return TRUE; } /* End a job. */ static void async_job_end (NautilusDirectory *directory, - const char *job) + const char *job) { #ifdef DEBUG_ASYNC_JOBS - char *key; - gpointer table_key, value; + char *key; + gpointer table_key, value; #endif #ifdef DEBUG_START_STOP - g_message ("stopping %s in %p", job, directory->details->location); + g_message ("stopping %s in %p", job, directory->details->location); #endif - g_assert (async_job_count > 0); + g_assert (async_job_count > 0); #ifdef DEBUG_ASYNC_JOBS - { - char *uri; - uri = nautilus_directory_get_uri (directory); - g_assert (async_jobs != NULL); - key = g_strconcat (uri, ": ", job, NULL); - if (!g_hash_table_lookup_extended (async_jobs, key, &table_key, &value)) { - g_warning ("ending job we didn't start: %s in %s", - job, uri); - } else { - g_hash_table_remove (async_jobs, key); - g_free (table_key); - } - g_free (uri); - g_free (key); - } + { + char *uri; + uri = nautilus_directory_get_uri (directory); + g_assert (async_jobs != NULL); + key = g_strconcat (uri, ": ", job, NULL); + if (!g_hash_table_lookup_extended (async_jobs, key, &table_key, &value)) + { + g_warning ("ending job we didn't start: %s in %s", + job, uri); + } + else + { + g_hash_table_remove (async_jobs, key); + g_free (table_key); + } + g_free (uri); + g_free (key); + } #endif - async_job_count -= 1; + async_job_count -= 1; } /* Helper to get one value from a hash table. */ static void -get_one_value_callback (gpointer key, gpointer value, gpointer callback_data) +get_one_value_callback (gpointer key, + gpointer value, + gpointer callback_data) { - gpointer *returned_value; + gpointer *returned_value; - returned_value = callback_data; - *returned_value = value; + returned_value = callback_data; + *returned_value = value; } /* return a single value from a hash table. */ static gpointer get_one_value (GHashTable *table) { - gpointer value; + gpointer value; - value = NULL; - if (table != NULL) { - g_hash_table_foreach (table, get_one_value_callback, &value); - } - return value; + value = NULL; + if (table != NULL) + { + g_hash_table_foreach (table, get_one_value_callback, &value); + } + return value; } /* Wake up directories that are "blocked" as long as there are job @@ -449,354 +491,397 @@ get_one_value (GHashTable *table) static void async_job_wake_up (void) { - static gboolean already_waking_up = FALSE; - gpointer value; - - g_assert (async_job_count >= 0); - g_assert (async_job_count <= MAX_ASYNC_JOBS); - - if (already_waking_up) { - return; - } - - already_waking_up = TRUE; - while (async_job_count < MAX_ASYNC_JOBS) { - value = get_one_value (waiting_directories); - if (value == NULL) { - break; - } - g_hash_table_remove (waiting_directories, value); - nautilus_directory_async_state_changed - (NAUTILUS_DIRECTORY (value)); - } - already_waking_up = FALSE; + static gboolean already_waking_up = FALSE; + gpointer value; + + g_assert (async_job_count >= 0); + g_assert (async_job_count <= MAX_ASYNC_JOBS); + + if (already_waking_up) + { + return; + } + + already_waking_up = TRUE; + while (async_job_count < MAX_ASYNC_JOBS) + { + value = get_one_value (waiting_directories); + if (value == NULL) + { + break; + } + g_hash_table_remove (waiting_directories, value); + nautilus_directory_async_state_changed + (NAUTILUS_DIRECTORY (value)); + } + already_waking_up = FALSE; } static void directory_count_cancel (NautilusDirectory *directory) { - if (directory->details->count_in_progress != NULL) { - g_cancellable_cancel (directory->details->count_in_progress->cancellable); - directory->details->count_in_progress = NULL; - } + if (directory->details->count_in_progress != NULL) + { + g_cancellable_cancel (directory->details->count_in_progress->cancellable); + directory->details->count_in_progress = NULL; + } } static void deep_count_cancel (NautilusDirectory *directory) { - if (directory->details->deep_count_in_progress != NULL) { - g_assert (NAUTILUS_IS_FILE (directory->details->deep_count_file)); - - g_cancellable_cancel (directory->details->deep_count_in_progress->cancellable); + if (directory->details->deep_count_in_progress != NULL) + { + g_assert (NAUTILUS_IS_FILE (directory->details->deep_count_file)); + + g_cancellable_cancel (directory->details->deep_count_in_progress->cancellable); - directory->details->deep_count_file->details->deep_counts_status = NAUTILUS_REQUEST_NOT_STARTED; + directory->details->deep_count_file->details->deep_counts_status = NAUTILUS_REQUEST_NOT_STARTED; - directory->details->deep_count_in_progress->directory = NULL; - directory->details->deep_count_in_progress = NULL; - directory->details->deep_count_file = NULL; + directory->details->deep_count_in_progress->directory = NULL; + directory->details->deep_count_in_progress = NULL; + directory->details->deep_count_file = NULL; - async_job_end (directory, "deep count"); - } + async_job_end (directory, "deep count"); + } } static void mime_list_cancel (NautilusDirectory *directory) { - if (directory->details->mime_list_in_progress != NULL) { - g_cancellable_cancel (directory->details->mime_list_in_progress->cancellable); - } + if (directory->details->mime_list_in_progress != NULL) + { + g_cancellable_cancel (directory->details->mime_list_in_progress->cancellable); + } } static void link_info_cancel (NautilusDirectory *directory) { - if (directory->details->link_info_read_state != NULL) { - g_cancellable_cancel (directory->details->link_info_read_state->cancellable); - directory->details->link_info_read_state->directory = NULL; - directory->details->link_info_read_state = NULL; - async_job_end (directory, "link info"); - } + if (directory->details->link_info_read_state != NULL) + { + g_cancellable_cancel (directory->details->link_info_read_state->cancellable); + directory->details->link_info_read_state->directory = NULL; + directory->details->link_info_read_state = NULL; + async_job_end (directory, "link info"); + } } static void thumbnail_cancel (NautilusDirectory *directory) { - if (directory->details->thumbnail_state != NULL) { - g_cancellable_cancel (directory->details->thumbnail_state->cancellable); - directory->details->thumbnail_state->directory = NULL; - directory->details->thumbnail_state = NULL; - async_job_end (directory, "thumbnail"); - } + if (directory->details->thumbnail_state != NULL) + { + g_cancellable_cancel (directory->details->thumbnail_state->cancellable); + directory->details->thumbnail_state->directory = NULL; + directory->details->thumbnail_state = NULL; + async_job_end (directory, "thumbnail"); + } } static void mount_cancel (NautilusDirectory *directory) { - if (directory->details->mount_state != NULL) { - g_cancellable_cancel (directory->details->mount_state->cancellable); - directory->details->mount_state->directory = NULL; - directory->details->mount_state = NULL; - async_job_end (directory, "mount"); - } + if (directory->details->mount_state != NULL) + { + g_cancellable_cancel (directory->details->mount_state->cancellable); + directory->details->mount_state->directory = NULL; + directory->details->mount_state = NULL; + async_job_end (directory, "mount"); + } } static void file_info_cancel (NautilusDirectory *directory) { - if (directory->details->get_info_in_progress != NULL) { - g_cancellable_cancel (directory->details->get_info_in_progress->cancellable); - directory->details->get_info_in_progress->directory = NULL; - directory->details->get_info_in_progress = NULL; - directory->details->get_info_file = NULL; + if (directory->details->get_info_in_progress != NULL) + { + g_cancellable_cancel (directory->details->get_info_in_progress->cancellable); + directory->details->get_info_in_progress->directory = NULL; + directory->details->get_info_in_progress = NULL; + directory->details->get_info_file = NULL; - async_job_end (directory, "file info"); - } + async_job_end (directory, "file info"); + } } static void new_files_cancel (NautilusDirectory *directory) { - GList *l; - NewFilesState *state; - - if (directory->details->new_files_in_progress != NULL) { - for (l = directory->details->new_files_in_progress; l != NULL; l = l->next) { - state = l->data; - g_cancellable_cancel (state->cancellable); - state->directory = NULL; - } - g_list_free (directory->details->new_files_in_progress); - directory->details->new_files_in_progress = NULL; - } + GList *l; + NewFilesState *state; + + if (directory->details->new_files_in_progress != NULL) + { + for (l = directory->details->new_files_in_progress; l != NULL; l = l->next) + { + state = l->data; + g_cancellable_cancel (state->cancellable); + state->directory = NULL; + } + g_list_free (directory->details->new_files_in_progress); + directory->details->new_files_in_progress = NULL; + } } static int monitor_key_compare (gconstpointer a, - gconstpointer data) -{ - const Monitor *monitor; - const Monitor *compare_monitor; - - monitor = a; - compare_monitor = data; - - if (monitor->client < compare_monitor->client) { - return -1; - } - if (monitor->client > compare_monitor->client) { - return +1; - } - - if (monitor->file < compare_monitor->file) { - return -1; - } - if (monitor->file > compare_monitor->file) { - return +1; - } - - return 0; + gconstpointer data) +{ + const Monitor *monitor; + const Monitor *compare_monitor; + + monitor = a; + compare_monitor = data; + + if (monitor->client < compare_monitor->client) + { + return -1; + } + if (monitor->client > compare_monitor->client) + { + return +1; + } + + if (monitor->file < compare_monitor->file) + { + return -1; + } + if (monitor->file > compare_monitor->file) + { + return +1; + } + + return 0; } static GList * find_monitor (NautilusDirectory *directory, - NautilusFile *file, - gconstpointer client) + NautilusFile *file, + gconstpointer client) { - Monitor monitor; + Monitor monitor; - monitor.client = client; - monitor.file = file; + monitor.client = client; + monitor.file = file; - return g_list_find_custom (directory->details->monitor_list, - &monitor, - monitor_key_compare); + return g_list_find_custom (directory->details->monitor_list, + &monitor, + monitor_key_compare); } static void remove_monitor_link (NautilusDirectory *directory, - GList *link) + GList *link) { - Monitor *monitor; + Monitor *monitor; - if (link != NULL) { - monitor = link->data; - request_counter_remove_request (directory->details->monitor_counters, - monitor->request); - directory->details->monitor_list = - g_list_remove_link (directory->details->monitor_list, link); - g_free (monitor); - g_list_free_1 (link); - } + if (link != NULL) + { + monitor = link->data; + request_counter_remove_request (directory->details->monitor_counters, + monitor->request); + directory->details->monitor_list = + g_list_remove_link (directory->details->monitor_list, link); + g_free (monitor); + g_list_free_1 (link); + } } static void remove_monitor (NautilusDirectory *directory, - NautilusFile *file, - gconstpointer client) + NautilusFile *file, + gconstpointer client) { - remove_monitor_link (directory, find_monitor (directory, file, client)); + remove_monitor_link (directory, find_monitor (directory, file, client)); } Request nautilus_directory_set_up_request (NautilusFileAttributes file_attributes) { - Request request; - - request = 0; - - if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT) != 0) { - REQUEST_SET_TYPE (request, REQUEST_DIRECTORY_COUNT); - } - - if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS) != 0) { - REQUEST_SET_TYPE (request, REQUEST_DEEP_COUNT); - } - - if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES) != 0) { - REQUEST_SET_TYPE (request, REQUEST_MIME_LIST); - } - if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_INFO) != 0) { - REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); - } - - if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_LINK_INFO) { - REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); - REQUEST_SET_TYPE (request, REQUEST_LINK_INFO); - } - - if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO) != 0) { - REQUEST_SET_TYPE (request, REQUEST_EXTENSION_INFO); - } - - if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL) { - REQUEST_SET_TYPE (request, REQUEST_THUMBNAIL); - REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); - } - - if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_MOUNT) { - REQUEST_SET_TYPE (request, REQUEST_MOUNT); - REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); - } - - if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO) { - REQUEST_SET_TYPE (request, REQUEST_FILESYSTEM_INFO); - } - - return request; + Request request; + + request = 0; + + if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT) != 0) + { + REQUEST_SET_TYPE (request, REQUEST_DIRECTORY_COUNT); + } + + if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DEEP_COUNTS) != 0) + { + REQUEST_SET_TYPE (request, REQUEST_DEEP_COUNT); + } + + if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES) != 0) + { + REQUEST_SET_TYPE (request, REQUEST_MIME_LIST); + } + if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_INFO) != 0) + { + REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); + } + + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_LINK_INFO) + { + REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); + REQUEST_SET_TYPE (request, REQUEST_LINK_INFO); + } + + if ((file_attributes & NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO) != 0) + { + REQUEST_SET_TYPE (request, REQUEST_EXTENSION_INFO); + } + + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL) + { + REQUEST_SET_TYPE (request, REQUEST_THUMBNAIL); + REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); + } + + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_MOUNT) + { + REQUEST_SET_TYPE (request, REQUEST_MOUNT); + REQUEST_SET_TYPE (request, REQUEST_FILE_INFO); + } + + if (file_attributes & NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO) + { + REQUEST_SET_TYPE (request, REQUEST_FILESYSTEM_INFO); + } + + return request; } static void -mime_db_changed_callback (GObject *ignore, NautilusDirectory *dir) +mime_db_changed_callback (GObject *ignore, + NautilusDirectory *dir) { - NautilusFileAttributes attrs; + NautilusFileAttributes attrs; - g_assert (dir != NULL); - g_assert (dir->details != NULL); + g_assert (dir != NULL); + g_assert (dir->details != NULL); - attrs = NAUTILUS_FILE_ATTRIBUTE_INFO | - NAUTILUS_FILE_ATTRIBUTE_LINK_INFO | - NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES; + attrs = NAUTILUS_FILE_ATTRIBUTE_INFO | + NAUTILUS_FILE_ATTRIBUTE_LINK_INFO | + NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES; - nautilus_directory_force_reload_internal (dir, attrs); + nautilus_directory_force_reload_internal (dir, attrs); } void -nautilus_directory_monitor_add_internal (NautilusDirectory *directory, - NautilusFile *file, - gconstpointer client, - gboolean monitor_hidden_files, - NautilusFileAttributes file_attributes, - NautilusDirectoryCallback callback, - gpointer callback_data) -{ - Monitor *monitor; - GList *file_list; - char *file_uri = NULL; - char *dir_uri = NULL; - - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - - if (file != NULL) - file_uri = nautilus_file_get_uri (file); - if (directory != NULL) - dir_uri = nautilus_directory_get_uri (directory); - nautilus_profile_start ("uri %s file-uri %s client %p", dir_uri, file_uri, client); - g_free (dir_uri); - g_free (file_uri); - - /* Replace any current monitor for this client/file pair. */ - remove_monitor (directory, file, client); - - /* Add the new monitor. */ - monitor = g_new (Monitor, 1); - monitor->file = file; - monitor->monitor_hidden_files = monitor_hidden_files; - monitor->client = client; - monitor->request = nautilus_directory_set_up_request (file_attributes); - - if (file == NULL) { - REQUEST_SET_TYPE (monitor->request, REQUEST_FILE_LIST); - } - directory->details->monitor_list = - g_list_prepend (directory->details->monitor_list, monitor); - request_counter_add_request (directory->details->monitor_counters, - monitor->request); - - if (callback != NULL) { - file_list = nautilus_directory_get_file_list (directory); - (* callback) (directory, file_list, callback_data); - nautilus_file_list_free (file_list); - } - - /* Start the "real" monitoring (FAM or whatever). */ - /* We always monitor the whole directory since in practice - * nautilus almost always shows the whole directory anyway, and - * it allows us to avoid one file monitor per file in a directory. - */ - if (directory->details->monitor == NULL) { - directory->details->monitor = nautilus_monitor_directory (directory->details->location); - } - - - if (REQUEST_WANTS_TYPE (monitor->request, REQUEST_FILE_INFO) && - directory->details->mime_db_monitor == 0) { - directory->details->mime_db_monitor = - g_signal_connect_object (nautilus_signaller_get_current (), - "mime-data-changed", - G_CALLBACK (mime_db_changed_callback), directory, 0); - } - - /* Put the monitor file or all the files on the work queue. */ - if (file != NULL) { - nautilus_directory_add_file_to_work_queue (directory, file); - } else { - add_all_files_to_work_queue (directory); - } - - /* Kick off I/O. */ - nautilus_directory_async_state_changed (directory); - nautilus_profile_end (NULL); +nautilus_directory_monitor_add_internal (NautilusDirectory *directory, + NautilusFile *file, + gconstpointer client, + gboolean monitor_hidden_files, + NautilusFileAttributes file_attributes, + NautilusDirectoryCallback callback, + gpointer callback_data) +{ + Monitor *monitor; + GList *file_list; + char *file_uri = NULL; + char *dir_uri = NULL; + + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + + if (file != NULL) + { + file_uri = nautilus_file_get_uri (file); + } + if (directory != NULL) + { + dir_uri = nautilus_directory_get_uri (directory); + } + nautilus_profile_start ("uri %s file-uri %s client %p", dir_uri, file_uri, client); + g_free (dir_uri); + g_free (file_uri); + + /* Replace any current monitor for this client/file pair. */ + remove_monitor (directory, file, client); + + /* Add the new monitor. */ + monitor = g_new (Monitor, 1); + monitor->file = file; + monitor->monitor_hidden_files = monitor_hidden_files; + monitor->client = client; + monitor->request = nautilus_directory_set_up_request (file_attributes); + + if (file == NULL) + { + REQUEST_SET_TYPE (monitor->request, REQUEST_FILE_LIST); + } + directory->details->monitor_list = + g_list_prepend (directory->details->monitor_list, monitor); + request_counter_add_request (directory->details->monitor_counters, + monitor->request); + + if (callback != NULL) + { + file_list = nautilus_directory_get_file_list (directory); + (*callback)(directory, file_list, callback_data); + nautilus_file_list_free (file_list); + } + + /* Start the "real" monitoring (FAM or whatever). */ + /* We always monitor the whole directory since in practice + * nautilus almost always shows the whole directory anyway, and + * it allows us to avoid one file monitor per file in a directory. + */ + if (directory->details->monitor == NULL) + { + directory->details->monitor = nautilus_monitor_directory (directory->details->location); + } + + + if (REQUEST_WANTS_TYPE (monitor->request, REQUEST_FILE_INFO) && + directory->details->mime_db_monitor == 0) + { + directory->details->mime_db_monitor = + g_signal_connect_object (nautilus_signaller_get_current (), + "mime-data-changed", + G_CALLBACK (mime_db_changed_callback), directory, 0); + } + + /* Put the monitor file or all the files on the work queue. */ + if (file != NULL) + { + nautilus_directory_add_file_to_work_queue (directory, file); + } + else + { + add_all_files_to_work_queue (directory); + } + + /* Kick off I/O. */ + nautilus_directory_async_state_changed (directory); + nautilus_profile_end (NULL); } static void -set_file_unconfirmed (NautilusFile *file, gboolean unconfirmed) +set_file_unconfirmed (NautilusFile *file, + gboolean unconfirmed) { - NautilusDirectory *directory; + NautilusDirectory *directory; - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (unconfirmed == FALSE || unconfirmed == TRUE); + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (unconfirmed == FALSE || unconfirmed == TRUE); - if (file->details->unconfirmed == unconfirmed) { - return; - } - file->details->unconfirmed = unconfirmed; + if (file->details->unconfirmed == unconfirmed) + { + return; + } + file->details->unconfirmed = unconfirmed; - directory = file->details->directory; - if (unconfirmed) { - directory->details->confirmed_file_count--; - } else { - directory->details->confirmed_file_count++; - } + directory = file->details->directory; + if (unconfirmed) + { + directory->details->confirmed_file_count--; + } + else + { + directory->details->confirmed_file_count++; + } } static gboolean show_hidden_files = TRUE; @@ -804,1017 +889,1142 @@ static gboolean show_hidden_files = TRUE; static void show_hidden_files_changed_callback (gpointer callback_data) { - show_hidden_files = g_settings_get_boolean (gtk_filechooser_preferences, NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES); + show_hidden_files = g_settings_get_boolean (gtk_filechooser_preferences, NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES); } static gboolean -should_skip_file (NautilusDirectory *directory, GFileInfo *info) +should_skip_file (NautilusDirectory *directory, + GFileInfo *info) { - static gboolean show_hidden_files_changed_callback_installed = FALSE; + static gboolean show_hidden_files_changed_callback_installed = FALSE; - /* Add the callback once for the life of our process */ - if (!show_hidden_files_changed_callback_installed) { - g_signal_connect_swapped (gtk_filechooser_preferences, - "changed::" NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, - G_CALLBACK(show_hidden_files_changed_callback), - NULL); + /* Add the callback once for the life of our process */ + if (!show_hidden_files_changed_callback_installed) + { + g_signal_connect_swapped (gtk_filechooser_preferences, + "changed::" NAUTILUS_PREFERENCES_SHOW_HIDDEN_FILES, + G_CALLBACK (show_hidden_files_changed_callback), + NULL); - show_hidden_files_changed_callback_installed = TRUE; + show_hidden_files_changed_callback_installed = TRUE; - /* Peek for the first time */ - show_hidden_files_changed_callback (NULL); - } + /* Peek for the first time */ + show_hidden_files_changed_callback (NULL); + } - if (!show_hidden_files && - (g_file_info_get_is_hidden (info) || - g_file_info_get_is_backup (info))) { - return TRUE; - } + if (!show_hidden_files && + (g_file_info_get_is_hidden (info) || + g_file_info_get_is_backup (info))) + { + return TRUE; + } - return FALSE; + return FALSE; } static gboolean dequeue_pending_idle_callback (gpointer callback_data) { - NautilusDirectory *directory; - GList *pending_file_info; - GList *node, *next; - NautilusFile *file; - GList *changed_files, *added_files; - GFileInfo *file_info; - const char *mimetype, *name; - DirectoryLoadState *dir_load_state; - - directory = NAUTILUS_DIRECTORY (callback_data); - - nautilus_directory_ref (directory); - - nautilus_profile_start ("nitems %d", g_list_length (directory->details->pending_file_info)); - - directory->details->dequeue_pending_idle_id = 0; - - /* Handle the files in the order we saw them. */ - pending_file_info = g_list_reverse (directory->details->pending_file_info); - directory->details->pending_file_info = NULL; - - /* If we are no longer monitoring, then throw away these. */ - if (!nautilus_directory_is_file_list_monitored (directory)) { - nautilus_directory_async_state_changed (directory); - goto drain; - } - - added_files = NULL; - changed_files = NULL; - - dir_load_state = directory->details->directory_load_in_progress; - - /* Build a list of NautilusFile objects. */ - for (node = pending_file_info; node != NULL; node = node->next) { - file_info = node->data; - - name = g_file_info_get_name (file_info); - - /* Update the file count. */ - /* FIXME bugzilla.gnome.org 45063: This could count a - * file twice if we get it from both load_directory - * and from new_files_callback. Not too hard to fix by - * moving this into the actual callback instead of - * waiting for the idle function. - */ - if (dir_load_state && - !should_skip_file (directory, file_info)) { - dir_load_state->load_file_count += 1; - - /* Add the MIME type to the set. */ - mimetype = g_file_info_get_content_type (file_info); - if (mimetype != NULL) { - istr_set_insert (dir_load_state->load_mime_list_hash, - mimetype); - } - } - - /* check if the file already exists */ - file = nautilus_directory_find_file_by_name (directory, name); - if (file != NULL) { - /* file already exists in dir, check if we still need to - * emit file_added or if it changed */ - set_file_unconfirmed (file, FALSE); - if (!file->details->is_added) { - /* We consider this newly added even if its in the list. - * This can happen if someone called nautilus_file_get_by_uri() - * on a file in the folder before the add signal was - * emitted */ - nautilus_file_ref (file); - file->details->is_added = TRUE; - added_files = g_list_prepend (added_files, file); - } else if (nautilus_file_update_info (file, file_info)) { - /* File changed, notify about the change. */ - nautilus_file_ref (file); - changed_files = g_list_prepend (changed_files, file); - } - } else { - /* new file, create a nautilus file object and add it to the list */ - file = nautilus_file_new_from_info (directory, file_info); - nautilus_directory_add_file (directory, file); - file->details->is_added = TRUE; - added_files = g_list_prepend (added_files, file); - } - } - - /* If we are done loading, then we assume that any unconfirmed - * files are gone. - */ - if (directory->details->directory_loaded) { - for (node = directory->details->file_list; - node != NULL; node = next) { - file = NAUTILUS_FILE (node->data); - next = node->next; - - if (file->details->unconfirmed) { - nautilus_file_ref (file); - changed_files = g_list_prepend (changed_files, file); - - nautilus_file_mark_gone (file); - } - } - } - - /* Send the changed and added signals. */ - nautilus_directory_emit_change_signals (directory, changed_files); - nautilus_file_list_free (changed_files); - nautilus_directory_emit_files_added (directory, added_files); - nautilus_file_list_free (added_files); - - if (directory->details->directory_loaded && - !directory->details->directory_loaded_sent_notification) { - /* Send the done_loading signal. */ - nautilus_directory_emit_done_loading (directory); - - if (dir_load_state) { - file = dir_load_state->load_directory_file; - - file->details->directory_count = dir_load_state->load_file_count; - file->details->directory_count_is_up_to_date = TRUE; - file->details->got_directory_count = TRUE; - - file->details->got_mime_list = TRUE; - file->details->mime_list_is_up_to_date = TRUE; - g_list_free_full (file->details->mime_list, g_free); - file->details->mime_list = istr_set_get_as_list - (dir_load_state->load_mime_list_hash); - - nautilus_file_changed (file); - } - - nautilus_directory_async_state_changed (directory); - - directory->details->directory_loaded_sent_notification = TRUE; - } - - drain: - g_list_free_full (pending_file_info, g_object_unref); - - /* Get the state machine running again. */ - nautilus_directory_async_state_changed (directory); - - nautilus_profile_end (NULL); - - nautilus_directory_unref (directory); - return FALSE; + NautilusDirectory *directory; + GList *pending_file_info; + GList *node, *next; + NautilusFile *file; + GList *changed_files, *added_files; + GFileInfo *file_info; + const char *mimetype, *name; + DirectoryLoadState *dir_load_state; + + directory = NAUTILUS_DIRECTORY (callback_data); + + nautilus_directory_ref (directory); + + nautilus_profile_start ("nitems %d", g_list_length (directory->details->pending_file_info)); + + directory->details->dequeue_pending_idle_id = 0; + + /* Handle the files in the order we saw them. */ + pending_file_info = g_list_reverse (directory->details->pending_file_info); + directory->details->pending_file_info = NULL; + + /* If we are no longer monitoring, then throw away these. */ + if (!nautilus_directory_is_file_list_monitored (directory)) + { + nautilus_directory_async_state_changed (directory); + goto drain; + } + + added_files = NULL; + changed_files = NULL; + + dir_load_state = directory->details->directory_load_in_progress; + + /* Build a list of NautilusFile objects. */ + for (node = pending_file_info; node != NULL; node = node->next) + { + file_info = node->data; + + name = g_file_info_get_name (file_info); + + /* Update the file count. */ + /* FIXME bugzilla.gnome.org 45063: This could count a + * file twice if we get it from both load_directory + * and from new_files_callback. Not too hard to fix by + * moving this into the actual callback instead of + * waiting for the idle function. + */ + if (dir_load_state && + !should_skip_file (directory, file_info)) + { + dir_load_state->load_file_count += 1; + + /* Add the MIME type to the set. */ + mimetype = g_file_info_get_content_type (file_info); + if (mimetype != NULL) + { + istr_set_insert (dir_load_state->load_mime_list_hash, + mimetype); + } + } + + /* check if the file already exists */ + file = nautilus_directory_find_file_by_name (directory, name); + if (file != NULL) + { + /* file already exists in dir, check if we still need to + * emit file_added or if it changed */ + set_file_unconfirmed (file, FALSE); + if (!file->details->is_added) + { + /* We consider this newly added even if its in the list. + * This can happen if someone called nautilus_file_get_by_uri() + * on a file in the folder before the add signal was + * emitted */ + nautilus_file_ref (file); + file->details->is_added = TRUE; + added_files = g_list_prepend (added_files, file); + } + else if (nautilus_file_update_info (file, file_info)) + { + /* File changed, notify about the change. */ + nautilus_file_ref (file); + changed_files = g_list_prepend (changed_files, file); + } + } + else + { + /* new file, create a nautilus file object and add it to the list */ + file = nautilus_file_new_from_info (directory, file_info); + nautilus_directory_add_file (directory, file); + file->details->is_added = TRUE; + added_files = g_list_prepend (added_files, file); + } + } + + /* If we are done loading, then we assume that any unconfirmed + * files are gone. + */ + if (directory->details->directory_loaded) + { + for (node = directory->details->file_list; + node != NULL; node = next) + { + file = NAUTILUS_FILE (node->data); + next = node->next; + + if (file->details->unconfirmed) + { + nautilus_file_ref (file); + changed_files = g_list_prepend (changed_files, file); + + nautilus_file_mark_gone (file); + } + } + } + + /* Send the changed and added signals. */ + nautilus_directory_emit_change_signals (directory, changed_files); + nautilus_file_list_free (changed_files); + nautilus_directory_emit_files_added (directory, added_files); + nautilus_file_list_free (added_files); + + if (directory->details->directory_loaded && + !directory->details->directory_loaded_sent_notification) + { + /* Send the done_loading signal. */ + nautilus_directory_emit_done_loading (directory); + + if (dir_load_state) + { + file = dir_load_state->load_directory_file; + + file->details->directory_count = dir_load_state->load_file_count; + file->details->directory_count_is_up_to_date = TRUE; + file->details->got_directory_count = TRUE; + + file->details->got_mime_list = TRUE; + file->details->mime_list_is_up_to_date = TRUE; + g_list_free_full (file->details->mime_list, g_free); + file->details->mime_list = istr_set_get_as_list + (dir_load_state->load_mime_list_hash); + + nautilus_file_changed (file); + } + + nautilus_directory_async_state_changed (directory); + + directory->details->directory_loaded_sent_notification = TRUE; + } + +drain: + g_list_free_full (pending_file_info, g_object_unref); + + /* Get the state machine running again. */ + nautilus_directory_async_state_changed (directory); + + nautilus_profile_end (NULL); + + nautilus_directory_unref (directory); + return FALSE; } void nautilus_directory_schedule_dequeue_pending (NautilusDirectory *directory) { - if (directory->details->dequeue_pending_idle_id == 0) { - directory->details->dequeue_pending_idle_id - = g_idle_add (dequeue_pending_idle_callback, directory); - } + if (directory->details->dequeue_pending_idle_id == 0) + { + directory->details->dequeue_pending_idle_id + = g_idle_add (dequeue_pending_idle_callback, directory); + } } static void directory_load_one (NautilusDirectory *directory, - GFileInfo *info) + GFileInfo *info) { - if (info == NULL) { - return; - } + if (info == NULL) + { + return; + } - if (g_file_info_get_name (info) == NULL) { - char *uri; + if (g_file_info_get_name (info) == NULL) + { + char *uri; - uri = nautilus_directory_get_uri (directory); - g_warning ("Got GFileInfo with NULL name in %s, ignoring. This shouldn't happen unless the gvfs backend is broken.\n", uri); - g_free (uri); - - return; - } - - /* Arrange for the "loading" part of the work. */ - g_object_ref (info); - directory->details->pending_file_info - = g_list_prepend (directory->details->pending_file_info, info); - nautilus_directory_schedule_dequeue_pending (directory); + uri = nautilus_directory_get_uri (directory); + g_warning ("Got GFileInfo with NULL name in %s, ignoring. This shouldn't happen unless the gvfs backend is broken.\n", uri); + g_free (uri); + + return; + } + + /* Arrange for the "loading" part of the work. */ + g_object_ref (info); + directory->details->pending_file_info + = g_list_prepend (directory->details->pending_file_info, info); + nautilus_directory_schedule_dequeue_pending (directory); } static void directory_load_cancel (NautilusDirectory *directory) { - NautilusFile *file; - DirectoryLoadState *state; + NautilusFile *file; + DirectoryLoadState *state; + + state = directory->details->directory_load_in_progress; + if (state != NULL) + { + file = state->load_directory_file; + file->details->loading_directory = FALSE; + if (file->details->directory != directory) + { + nautilus_directory_async_state_changed (file->details->directory); + } - state = directory->details->directory_load_in_progress; - if (state != NULL) { - file = state->load_directory_file; - file->details->loading_directory = FALSE; - if (file->details->directory != directory) { - nautilus_directory_async_state_changed (file->details->directory); - } - - g_cancellable_cancel (state->cancellable); - state->directory = NULL; - directory->details->directory_load_in_progress = NULL; - async_job_end (directory, "file list"); - } + g_cancellable_cancel (state->cancellable); + state->directory = NULL; + directory->details->directory_load_in_progress = NULL; + async_job_end (directory, "file list"); + } } static void file_list_cancel (NautilusDirectory *directory) { - directory_load_cancel (directory); - - if (directory->details->dequeue_pending_idle_id != 0) { - g_source_remove (directory->details->dequeue_pending_idle_id); - directory->details->dequeue_pending_idle_id = 0; - } + directory_load_cancel (directory); - if (directory->details->pending_file_info != NULL) { - g_list_free_full (directory->details->pending_file_info, g_object_unref); - directory->details->pending_file_info = NULL; - } + if (directory->details->dequeue_pending_idle_id != 0) + { + g_source_remove (directory->details->dequeue_pending_idle_id); + directory->details->dequeue_pending_idle_id = 0; + } + + if (directory->details->pending_file_info != NULL) + { + g_list_free_full (directory->details->pending_file_info, g_object_unref); + directory->details->pending_file_info = NULL; + } } static void directory_load_done (NautilusDirectory *directory, - GError *error) + GError *error) { - GList *node; + GList *node; - nautilus_profile_start (NULL); - g_object_ref (directory); + nautilus_profile_start (NULL); + g_object_ref (directory); - directory->details->directory_loaded = TRUE; - directory->details->directory_loaded_sent_notification = FALSE; + directory->details->directory_loaded = TRUE; + directory->details->directory_loaded_sent_notification = FALSE; - if (error != NULL) { - /* The load did not complete successfully. This means - * we don't know the status of the files in this directory. - * We clear the unconfirmed bit on each file here so that - * they won't be marked "gone" later -- we don't know enough - * about them to know whether they are really gone. - */ - for (node = directory->details->file_list; - node != NULL; node = node->next) { - set_file_unconfirmed (NAUTILUS_FILE (node->data), FALSE); - } + if (error != NULL) + { + /* The load did not complete successfully. This means + * we don't know the status of the files in this directory. + * We clear the unconfirmed bit on each file here so that + * they won't be marked "gone" later -- we don't know enough + * about them to know whether they are really gone. + */ + for (node = directory->details->file_list; + node != NULL; node = node->next) + { + set_file_unconfirmed (NAUTILUS_FILE (node->data), FALSE); + } - nautilus_directory_emit_load_error (directory, error); - } + nautilus_directory_emit_load_error (directory, error); + } - /* Call the idle function right away. */ - if (directory->details->dequeue_pending_idle_id != 0) { - g_source_remove (directory->details->dequeue_pending_idle_id); - } - dequeue_pending_idle_callback (directory); + /* Call the idle function right away. */ + if (directory->details->dequeue_pending_idle_id != 0) + { + g_source_remove (directory->details->dequeue_pending_idle_id); + } + dequeue_pending_idle_callback (directory); - directory_load_cancel (directory); + directory_load_cancel (directory); - g_object_unref (directory); - nautilus_profile_end (NULL); + g_object_unref (directory); + nautilus_profile_end (NULL); } void nautilus_directory_monitor_remove_internal (NautilusDirectory *directory, - NautilusFile *file, - gconstpointer client) + NautilusFile *file, + gconstpointer client) { - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (file == NULL || NAUTILUS_IS_FILE (file)); - g_assert (client != NULL); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (file == NULL || NAUTILUS_IS_FILE (file)); + g_assert (client != NULL); - remove_monitor (directory, file, client); + remove_monitor (directory, file, client); - if (directory->details->monitor != NULL - && directory->details->monitor_list == NULL) { - nautilus_monitor_cancel (directory->details->monitor); - directory->details->monitor = NULL; - } + if (directory->details->monitor != NULL + && directory->details->monitor_list == NULL) + { + nautilus_monitor_cancel (directory->details->monitor); + directory->details->monitor = NULL; + } - /* XXX - do we need to remove anything from the work queue? */ + /* XXX - do we need to remove anything from the work queue? */ - nautilus_directory_async_state_changed (directory); + nautilus_directory_async_state_changed (directory); } FileMonitors * nautilus_directory_remove_file_monitors (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - GList *result, **list, *node, *next; - Monitor *monitor; + GList *result, **list, *node, *next; + Monitor *monitor; - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); - result = NULL; + result = NULL; - list = &directory->details->monitor_list; - for (node = directory->details->monitor_list; node != NULL; node = next) { - next = node->next; - monitor = node->data; + list = &directory->details->monitor_list; + for (node = directory->details->monitor_list; node != NULL; node = next) + { + next = node->next; + monitor = node->data; - if (monitor->file == file) { - *list = g_list_remove_link (*list, node); - result = g_list_concat (node, result); - request_counter_remove_request (directory->details->monitor_counters, - monitor->request); - } - } + if (monitor->file == file) + { + *list = g_list_remove_link (*list, node); + result = g_list_concat (node, result); + request_counter_remove_request (directory->details->monitor_counters, + monitor->request); + } + } - /* XXX - do we need to remove anything from the work queue? */ + /* XXX - do we need to remove anything from the work queue? */ - nautilus_directory_async_state_changed (directory); + nautilus_directory_async_state_changed (directory); - return (FileMonitors *) result; + return (FileMonitors *) result; } void nautilus_directory_add_file_monitors (NautilusDirectory *directory, - NautilusFile *file, - FileMonitors *monitors) + NautilusFile *file, + FileMonitors *monitors) { - GList **list; - GList *l; - Monitor *monitor; + GList **list; + GList *l; + Monitor *monitor; - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); - if (monitors == NULL) { - return; - } + if (monitors == NULL) + { + return; + } - for (l = (GList *)monitors; l != NULL; l = l->next) { - monitor = l->data; - request_counter_add_request (directory->details->monitor_counters, - monitor->request); - } + for (l = (GList *) monitors; l != NULL; l = l->next) + { + monitor = l->data; + request_counter_add_request (directory->details->monitor_counters, + monitor->request); + } - list = &directory->details->monitor_list; - *list = g_list_concat (*list, (GList *) monitors); + list = &directory->details->monitor_list; + *list = g_list_concat (*list, (GList *) monitors); - nautilus_directory_add_file_to_work_queue (directory, file); + nautilus_directory_add_file_to_work_queue (directory, file); - nautilus_directory_async_state_changed (directory); + nautilus_directory_async_state_changed (directory); } static int -ready_callback_key_compare (gconstpointer a, gconstpointer b) -{ - const ReadyCallback *callback_a, *callback_b; - - callback_a = a; - callback_b = b; - - if (callback_a->file < callback_b->file) { - return -1; - } - if (callback_a->file > callback_b->file) { - return 1; - } - if (callback_a->file == NULL) { - /* ANSI C doesn't allow ordered compares of function pointers, so we cast them to - * normal pointers to make some overly pedantic compilers (*cough* HP-UX *cough*) - * compile this. Of course, on any compiler where ordered function pointers actually - * break this probably won't work, but at least it will compile on platforms where it - * works, but stupid compilers won't let you use it. - */ - if ((void *)callback_a->callback.directory < (void *)callback_b->callback.directory) { - return -1; - } - if ((void *)callback_a->callback.directory > (void *)callback_b->callback.directory) { - return 1; - } - } else { - if ((void *)callback_a->callback.file < (void *)callback_b->callback.file) { - return -1; - } - if ((void *)callback_a->callback.file > (void *)callback_b->callback.file) { - return 1; - } - } - if (callback_a->callback_data < callback_b->callback_data) { - return -1; - } - if (callback_a->callback_data > callback_b->callback_data) { - return 1; - } - return 0; +ready_callback_key_compare (gconstpointer a, + gconstpointer b) +{ + const ReadyCallback *callback_a, *callback_b; + + callback_a = a; + callback_b = b; + + if (callback_a->file < callback_b->file) + { + return -1; + } + if (callback_a->file > callback_b->file) + { + return 1; + } + if (callback_a->file == NULL) + { + /* ANSI C doesn't allow ordered compares of function pointers, so we cast them to + * normal pointers to make some overly pedantic compilers (*cough* HP-UX *cough*) + * compile this. Of course, on any compiler where ordered function pointers actually + * break this probably won't work, but at least it will compile on platforms where it + * works, but stupid compilers won't let you use it. + */ + if ((void *) callback_a->callback.directory < (void *) callback_b->callback.directory) + { + return -1; + } + if ((void *) callback_a->callback.directory > (void *) callback_b->callback.directory) + { + return 1; + } + } + else + { + if ((void *) callback_a->callback.file < (void *) callback_b->callback.file) + { + return -1; + } + if ((void *) callback_a->callback.file > (void *) callback_b->callback.file) + { + return 1; + } + } + if (callback_a->callback_data < callback_b->callback_data) + { + return -1; + } + if (callback_a->callback_data > callback_b->callback_data) + { + return 1; + } + return 0; } static int -ready_callback_key_compare_only_active (gconstpointer a, gconstpointer b) +ready_callback_key_compare_only_active (gconstpointer a, + gconstpointer b) { - const ReadyCallback *callback_a; + const ReadyCallback *callback_a; - callback_a = a; + callback_a = a; - /* Non active callbacks never match */ - if (!callback_a->active) { - return -1; - } + /* Non active callbacks never match */ + if (!callback_a->active) + { + return -1; + } - return ready_callback_key_compare (a, b); + return ready_callback_key_compare (a, b); } static void -ready_callback_call (NautilusDirectory *directory, - const ReadyCallback *callback) -{ - GList *file_list; - - /* Call the callback. */ - if (callback->file != NULL) { - if (callback->callback.file) { - (* callback->callback.file) (callback->file, - callback->callback_data); - } - } else if (callback->callback.directory != NULL) { - if (directory == NULL || - !REQUEST_WANTS_TYPE (callback->request, REQUEST_FILE_LIST)) { - file_list = NULL; - } else { - file_list = nautilus_directory_get_file_list (directory); - } - - /* Pass back the file list if the user was waiting for it. */ - (* callback->callback.directory) (directory, - file_list, - callback->callback_data); - - nautilus_file_list_free (file_list); - } +ready_callback_call (NautilusDirectory *directory, + const ReadyCallback *callback) +{ + GList *file_list; + + /* Call the callback. */ + if (callback->file != NULL) + { + if (callback->callback.file) + { + (*callback->callback.file)(callback->file, + callback->callback_data); + } + } + else if (callback->callback.directory != NULL) + { + if (directory == NULL || + !REQUEST_WANTS_TYPE (callback->request, REQUEST_FILE_LIST)) + { + file_list = NULL; + } + else + { + file_list = nautilus_directory_get_file_list (directory); + } + + /* Pass back the file list if the user was waiting for it. */ + (*callback->callback.directory)(directory, + file_list, + callback->callback_data); + + nautilus_file_list_free (file_list); + } } void -nautilus_directory_call_when_ready_internal (NautilusDirectory *directory, - NautilusFile *file, - NautilusFileAttributes file_attributes, - gboolean wait_for_file_list, - NautilusDirectoryCallback directory_callback, - NautilusFileCallback file_callback, - gpointer callback_data) -{ - ReadyCallback callback; - - g_assert (directory == NULL || NAUTILUS_IS_DIRECTORY (directory)); - g_assert (file == NULL || NAUTILUS_IS_FILE (file)); - g_assert (file != NULL || directory_callback != NULL); - - /* Construct a callback object. */ - callback.active = TRUE; - callback.file = file; - if (file == NULL) { - callback.callback.directory = directory_callback; - } else { - callback.callback.file = file_callback; - } - callback.callback_data = callback_data; - callback.request = nautilus_directory_set_up_request (file_attributes); - if (wait_for_file_list) { - REQUEST_SET_TYPE (callback.request, REQUEST_FILE_LIST); - } - - /* Handle the NULL case. */ - if (directory == NULL) { - ready_callback_call (NULL, &callback); - return; - } - - /* Check if the callback is already there. */ - if (g_list_find_custom (directory->details->call_when_ready_list, - &callback, - ready_callback_key_compare_only_active) != NULL) { - if (file_callback != NULL && directory_callback != NULL) { - g_warning ("tried to add a new callback while an old one was pending"); - } - /* NULL callback means, just read it. Conflicts are ok. */ - return; - } - - /* Add the new callback to the list. */ - directory->details->call_when_ready_list = g_list_prepend - (directory->details->call_when_ready_list, - g_memdup (&callback, sizeof (callback))); - request_counter_add_request (directory->details->call_when_ready_counters, - callback.request); - - /* Put the callback file or all the files on the work queue. */ - if (file != NULL) { - nautilus_directory_add_file_to_work_queue (directory, file); - } else { - add_all_files_to_work_queue (directory); - } - - nautilus_directory_async_state_changed (directory); -} - -gboolean -nautilus_directory_check_if_ready_internal (NautilusDirectory *directory, - NautilusFile *file, - NautilusFileAttributes file_attributes) -{ - Request request; - - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - - request = nautilus_directory_set_up_request (file_attributes); - return request_is_satisfied (directory, file, request); +nautilus_directory_call_when_ready_internal (NautilusDirectory *directory, + NautilusFile *file, + NautilusFileAttributes file_attributes, + gboolean wait_for_file_list, + NautilusDirectoryCallback directory_callback, + NautilusFileCallback file_callback, + gpointer callback_data) +{ + ReadyCallback callback; + + g_assert (directory == NULL || NAUTILUS_IS_DIRECTORY (directory)); + g_assert (file == NULL || NAUTILUS_IS_FILE (file)); + g_assert (file != NULL || directory_callback != NULL); + + /* Construct a callback object. */ + callback.active = TRUE; + callback.file = file; + if (file == NULL) + { + callback.callback.directory = directory_callback; + } + else + { + callback.callback.file = file_callback; + } + callback.callback_data = callback_data; + callback.request = nautilus_directory_set_up_request (file_attributes); + if (wait_for_file_list) + { + REQUEST_SET_TYPE (callback.request, REQUEST_FILE_LIST); + } + + /* Handle the NULL case. */ + if (directory == NULL) + { + ready_callback_call (NULL, &callback); + return; + } + + /* Check if the callback is already there. */ + if (g_list_find_custom (directory->details->call_when_ready_list, + &callback, + ready_callback_key_compare_only_active) != NULL) + { + if (file_callback != NULL && directory_callback != NULL) + { + g_warning ("tried to add a new callback while an old one was pending"); + } + /* NULL callback means, just read it. Conflicts are ok. */ + return; + } + + /* Add the new callback to the list. */ + directory->details->call_when_ready_list = g_list_prepend + (directory->details->call_when_ready_list, + g_memdup (&callback, sizeof (callback))); + request_counter_add_request (directory->details->call_when_ready_counters, + callback.request); + + /* Put the callback file or all the files on the work queue. */ + if (file != NULL) + { + nautilus_directory_add_file_to_work_queue (directory, file); + } + else + { + add_all_files_to_work_queue (directory); + } + + nautilus_directory_async_state_changed (directory); +} + +gboolean +nautilus_directory_check_if_ready_internal (NautilusDirectory *directory, + NautilusFile *file, + NautilusFileAttributes file_attributes) +{ + Request request; + + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + + request = nautilus_directory_set_up_request (file_attributes); + return request_is_satisfied (directory, file, request); } static void remove_callback_link_keep_data (NautilusDirectory *directory, - GList *link) + GList *link) { - ReadyCallback *callback; + ReadyCallback *callback; + + callback = link->data; + + directory->details->call_when_ready_list = g_list_remove_link + (directory->details->call_when_ready_list, link); - callback = link->data; - - directory->details->call_when_ready_list = g_list_remove_link - (directory->details->call_when_ready_list, link); - - request_counter_remove_request (directory->details->call_when_ready_counters, - callback->request); - g_list_free_1 (link); + request_counter_remove_request (directory->details->call_when_ready_counters, + callback->request); + g_list_free_1 (link); } static void remove_callback_link (NautilusDirectory *directory, - GList *link) + GList *link) { - ReadyCallback *callback; - - callback = link->data; - remove_callback_link_keep_data (directory, link); - g_free (callback); + ReadyCallback *callback; + + callback = link->data; + remove_callback_link_keep_data (directory, link); + g_free (callback); } void -nautilus_directory_cancel_callback_internal (NautilusDirectory *directory, - NautilusFile *file, - NautilusDirectoryCallback directory_callback, - NautilusFileCallback file_callback, - gpointer callback_data) -{ - ReadyCallback callback; - GList *node; - - if (directory == NULL) { - return; - } - - g_assert (NAUTILUS_IS_DIRECTORY (directory)); - g_assert (file == NULL || NAUTILUS_IS_FILE (file)); - g_assert (file != NULL || directory_callback != NULL); - g_assert (file == NULL || file_callback != NULL); - - /* Construct a callback object. */ - callback.file = file; - if (file == NULL) { - callback.callback.directory = directory_callback; - } else { - callback.callback.file = file_callback; - } - callback.callback_data = callback_data; - - /* Remove all queued callback from the list (including non-active). */ - do { - node = g_list_find_custom (directory->details->call_when_ready_list, - &callback, - ready_callback_key_compare); - if (node != NULL) { - remove_callback_link (directory, node); - - nautilus_directory_async_state_changed (directory); - } - } while (node != NULL); +nautilus_directory_cancel_callback_internal (NautilusDirectory *directory, + NautilusFile *file, + NautilusDirectoryCallback directory_callback, + NautilusFileCallback file_callback, + gpointer callback_data) +{ + ReadyCallback callback; + GList *node; + + if (directory == NULL) + { + return; + } + + g_assert (NAUTILUS_IS_DIRECTORY (directory)); + g_assert (file == NULL || NAUTILUS_IS_FILE (file)); + g_assert (file != NULL || directory_callback != NULL); + g_assert (file == NULL || file_callback != NULL); + + /* Construct a callback object. */ + callback.file = file; + if (file == NULL) + { + callback.callback.directory = directory_callback; + } + else + { + callback.callback.file = file_callback; + } + callback.callback_data = callback_data; + + /* Remove all queued callback from the list (including non-active). */ + do + { + node = g_list_find_custom (directory->details->call_when_ready_list, + &callback, + ready_callback_key_compare); + if (node != NULL) + { + remove_callback_link (directory, node); + + nautilus_directory_async_state_changed (directory); + } + } + while (node != NULL); } static void new_files_state_unref (NewFilesState *state) { - state->count--; + state->count--; + + if (state->count == 0) + { + if (state->directory) + { + state->directory->details->new_files_in_progress = + g_list_remove (state->directory->details->new_files_in_progress, + state); + } - if (state->count == 0) { - if (state->directory) { - state->directory->details->new_files_in_progress = - g_list_remove (state->directory->details->new_files_in_progress, - state); - } - - g_object_unref (state->cancellable); - g_free (state); - } + g_object_unref (state->cancellable); + g_free (state); + } } static void -new_files_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) +new_files_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) { - NautilusDirectory *directory; - GFileInfo *info; - NewFilesState *state; + NautilusDirectory *directory; + GFileInfo *info; + NewFilesState *state; + + state = user_data; - state = user_data; + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + new_files_state_unref (state); + return; + } - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - new_files_state_unref (state); - return; - } - - directory = nautilus_directory_ref (state->directory); - - /* Queue up the new file. */ - info = g_file_query_info_finish (G_FILE (source_object), res, NULL); - if (info != NULL) { - directory_load_one (directory, info); - g_object_unref (info); - } + directory = nautilus_directory_ref (state->directory); - new_files_state_unref (state); + /* Queue up the new file. */ + info = g_file_query_info_finish (G_FILE (source_object), res, NULL); + if (info != NULL) + { + directory_load_one (directory, info); + g_object_unref (info); + } - nautilus_directory_unref (directory); + new_files_state_unref (state); + + nautilus_directory_unref (directory); } void nautilus_directory_get_info_for_new_files (NautilusDirectory *directory, - GList *location_list) -{ - NewFilesState *state; - GFile *location; - GList *l; - - if (location_list == NULL) { - return; - } - - state = g_new (NewFilesState, 1); - state->directory = directory; - state->cancellable = g_cancellable_new (); - state->count = 0; - - for (l = location_list; l != NULL; l = l->next) { - location = l->data; - - state->count++; - - g_file_query_info_async (location, - NAUTILUS_FILE_DEFAULT_ATTRIBUTES, - 0, - G_PRIORITY_DEFAULT, - state->cancellable, - new_files_callback, state); - } - - directory->details->new_files_in_progress - = g_list_prepend (directory->details->new_files_in_progress, - state); + GList *location_list) +{ + NewFilesState *state; + GFile *location; + GList *l; + + if (location_list == NULL) + { + return; + } + + state = g_new (NewFilesState, 1); + state->directory = directory; + state->cancellable = g_cancellable_new (); + state->count = 0; + + for (l = location_list; l != NULL; l = l->next) + { + location = l->data; + + state->count++; + + g_file_query_info_async (location, + NAUTILUS_FILE_DEFAULT_ATTRIBUTES, + 0, + G_PRIORITY_DEFAULT, + state->cancellable, + new_files_callback, state); + } + + directory->details->new_files_in_progress + = g_list_prepend (directory->details->new_files_in_progress, + state); } void nautilus_async_destroying_file (NautilusFile *file) { - NautilusDirectory *directory; - gboolean changed; - GList *node, *next; - ReadyCallback *callback; - Monitor *monitor; - - directory = file->details->directory; - changed = FALSE; - - /* Check for callbacks. */ - for (node = directory->details->call_when_ready_list; node != NULL; node = next) { - next = node->next; - callback = node->data; - - if (callback->file == file) { - /* Client should have cancelled callback. */ - if (callback->active) { - g_warning ("destroyed file has call_when_ready pending"); - } - remove_callback_link (directory, node); - changed = TRUE; - } - } - - /* Check for monitors. */ - for (node = directory->details->monitor_list; node != NULL; node = next) { - next = node->next; - monitor = node->data; - - if (monitor->file == file) { - /* Client should have removed monitor earlier. */ - g_warning ("destroyed file still being monitored"); - remove_monitor_link (directory, node); - changed = TRUE; - } - } - - /* Check if it's a file that's currently being worked on. - * If so, make that NULL so it gets canceled right away. - */ - if (directory->details->count_in_progress != NULL && - directory->details->count_in_progress->count_file == file) { - directory->details->count_in_progress->count_file = NULL; - changed = TRUE; - } - if (directory->details->deep_count_file == file) { - directory->details->deep_count_file = NULL; - changed = TRUE; - } - if (directory->details->mime_list_in_progress != NULL && - directory->details->mime_list_in_progress->mime_list_file == file) { - directory->details->mime_list_in_progress->mime_list_file = NULL; - changed = TRUE; - } - if (directory->details->get_info_file == file) { - directory->details->get_info_file = NULL; - changed = TRUE; - } - if (directory->details->link_info_read_state != NULL && - directory->details->link_info_read_state->file == file) { - directory->details->link_info_read_state->file = NULL; - changed = TRUE; - } - if (directory->details->extension_info_file == file) { - directory->details->extension_info_file = NULL; - changed = TRUE; - } - - if (directory->details->thumbnail_state != NULL && - directory->details->thumbnail_state->file == file) { - directory->details->thumbnail_state->file = NULL; - changed = TRUE; - } - - if (directory->details->mount_state != NULL && - directory->details->mount_state->file == file) { - directory->details->mount_state->file = NULL; - changed = TRUE; - } - - if (directory->details->filesystem_info_state != NULL && - directory->details->filesystem_info_state->file == file) { - directory->details->filesystem_info_state->file = NULL; - changed = TRUE; - } - - /* Let the directory take care of the rest. */ - if (changed) { - nautilus_directory_async_state_changed (directory); - } + NautilusDirectory *directory; + gboolean changed; + GList *node, *next; + ReadyCallback *callback; + Monitor *monitor; + + directory = file->details->directory; + changed = FALSE; + + /* Check for callbacks. */ + for (node = directory->details->call_when_ready_list; node != NULL; node = next) + { + next = node->next; + callback = node->data; + + if (callback->file == file) + { + /* Client should have cancelled callback. */ + if (callback->active) + { + g_warning ("destroyed file has call_when_ready pending"); + } + remove_callback_link (directory, node); + changed = TRUE; + } + } + + /* Check for monitors. */ + for (node = directory->details->monitor_list; node != NULL; node = next) + { + next = node->next; + monitor = node->data; + + if (monitor->file == file) + { + /* Client should have removed monitor earlier. */ + g_warning ("destroyed file still being monitored"); + remove_monitor_link (directory, node); + changed = TRUE; + } + } + + /* Check if it's a file that's currently being worked on. + * If so, make that NULL so it gets canceled right away. + */ + if (directory->details->count_in_progress != NULL && + directory->details->count_in_progress->count_file == file) + { + directory->details->count_in_progress->count_file = NULL; + changed = TRUE; + } + if (directory->details->deep_count_file == file) + { + directory->details->deep_count_file = NULL; + changed = TRUE; + } + if (directory->details->mime_list_in_progress != NULL && + directory->details->mime_list_in_progress->mime_list_file == file) + { + directory->details->mime_list_in_progress->mime_list_file = NULL; + changed = TRUE; + } + if (directory->details->get_info_file == file) + { + directory->details->get_info_file = NULL; + changed = TRUE; + } + if (directory->details->link_info_read_state != NULL && + directory->details->link_info_read_state->file == file) + { + directory->details->link_info_read_state->file = NULL; + changed = TRUE; + } + if (directory->details->extension_info_file == file) + { + directory->details->extension_info_file = NULL; + changed = TRUE; + } + + if (directory->details->thumbnail_state != NULL && + directory->details->thumbnail_state->file == file) + { + directory->details->thumbnail_state->file = NULL; + changed = TRUE; + } + + if (directory->details->mount_state != NULL && + directory->details->mount_state->file == file) + { + directory->details->mount_state->file = NULL; + changed = TRUE; + } + + if (directory->details->filesystem_info_state != NULL && + directory->details->filesystem_info_state->file == file) + { + directory->details->filesystem_info_state->file = NULL; + changed = TRUE; + } + + /* Let the directory take care of the rest. */ + if (changed) + { + nautilus_directory_async_state_changed (directory); + } } static gboolean lacks_directory_count (NautilusFile *file) { - return !file->details->directory_count_is_up_to_date - && nautilus_file_should_show_directory_item_count (file); + return !file->details->directory_count_is_up_to_date + && nautilus_file_should_show_directory_item_count (file); } static gboolean should_get_directory_count_now (NautilusFile *file) { - return lacks_directory_count (file) - && !file->details->loading_directory; + return lacks_directory_count (file) + && !file->details->loading_directory; } static gboolean lacks_info (NautilusFile *file) { - return !file->details->file_info_is_up_to_date - && !file->details->is_gone; + return !file->details->file_info_is_up_to_date + && !file->details->is_gone; } static gboolean lacks_filesystem_info (NautilusFile *file) { - return !file->details->filesystem_info_is_up_to_date; + return !file->details->filesystem_info_is_up_to_date; } static gboolean lacks_deep_count (NautilusFile *file) { - return file->details->deep_counts_status != NAUTILUS_REQUEST_DONE; + return file->details->deep_counts_status != NAUTILUS_REQUEST_DONE; } static gboolean lacks_mime_list (NautilusFile *file) { - return !file->details->mime_list_is_up_to_date; + return !file->details->mime_list_is_up_to_date; } static gboolean should_get_mime_list (NautilusFile *file) { - return lacks_mime_list (file) - && !file->details->loading_directory; + return lacks_mime_list (file) + && !file->details->loading_directory; } static gboolean lacks_link_info (NautilusFile *file) { - if (file->details->file_info_is_up_to_date && - !file->details->link_info_is_up_to_date) { - if (nautilus_file_is_nautilus_link (file)) { - return TRUE; - } else { - link_info_done (file->details->directory, file, NULL, NULL, NULL, FALSE, FALSE); - return FALSE; - } - } else { - return FALSE; - } + if (file->details->file_info_is_up_to_date && + !file->details->link_info_is_up_to_date) + { + if (nautilus_file_is_nautilus_link (file)) + { + return TRUE; + } + else + { + link_info_done (file->details->directory, file, NULL, NULL, NULL, FALSE, FALSE); + return FALSE; + } + } + else + { + return FALSE; + } } static gboolean lacks_extension_info (NautilusFile *file) { - return file->details->pending_info_providers != NULL; + return file->details->pending_info_providers != NULL; } static gboolean lacks_thumbnail (NautilusFile *file) { - return nautilus_file_should_show_thumbnail (file) && - file->details->thumbnail_path != NULL && - !file->details->thumbnail_is_up_to_date; + return nautilus_file_should_show_thumbnail (file) && + file->details->thumbnail_path != NULL && + !file->details->thumbnail_is_up_to_date; } static gboolean lacks_mount (NautilusFile *file) { - return (!file->details->mount_is_up_to_date && - ( - /* Unix mountpoint, could be a GMount */ - file->details->is_mountpoint || - - /* The toplevel directory of something */ - (file->details->type == G_FILE_TYPE_DIRECTORY && - nautilus_file_is_self_owned (file)) || - - /* Mountable, could be a mountpoint */ - (file->details->type == G_FILE_TYPE_MOUNTABLE) + return (!file->details->mount_is_up_to_date && + ( + /* Unix mountpoint, could be a GMount */ + file->details->is_mountpoint || + + /* The toplevel directory of something */ + (file->details->type == G_FILE_TYPE_DIRECTORY && + nautilus_file_is_self_owned (file)) || - ) - ); + /* Mountable, could be a mountpoint */ + (file->details->type == G_FILE_TYPE_MOUNTABLE) + + ) + ); } static gboolean -has_problem (NautilusDirectory *directory, NautilusFile *file, FileCheck problem) +has_problem (NautilusDirectory *directory, + NautilusFile *file, + FileCheck problem) { - GList *node; + GList *node; - if (file != NULL) { - return (* problem) (file); - } + if (file != NULL) + { + return (*problem)(file); + } - for (node = directory->details->file_list; node != NULL; node = node->next) { - if ((* problem) (node->data)) { - return TRUE; - } - } + for (node = directory->details->file_list; node != NULL; node = node->next) + { + if ((*problem)(node->data)) + { + return TRUE; + } + } - return FALSE; + return FALSE; } static gboolean request_is_satisfied (NautilusDirectory *directory, - NautilusFile *file, - Request request) -{ - if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_LIST) && - !(directory->details->directory_loaded && - directory->details->directory_loaded_sent_notification)) { - return FALSE; - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) { - if (has_problem (directory, file, lacks_directory_count)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) { - if (has_problem (directory, file, lacks_info)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) { - if (has_problem (directory, file, lacks_filesystem_info)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) { - if (has_problem (directory, file, lacks_deep_count)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) { - if (has_problem (directory, file, lacks_thumbnail)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) { - if (has_problem (directory, file, lacks_mount)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) { - if (has_problem (directory, file, lacks_mime_list)) { - return FALSE; - } - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) { - if (has_problem (directory, file, lacks_link_info)) { - return FALSE; - } - } - - return TRUE; + NautilusFile *file, + Request request) +{ + if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_LIST) && + !(directory->details->directory_loaded && + directory->details->directory_loaded_sent_notification)) + { + return FALSE; + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) + { + if (has_problem (directory, file, lacks_directory_count)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) + { + if (has_problem (directory, file, lacks_info)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) + { + if (has_problem (directory, file, lacks_filesystem_info)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) + { + if (has_problem (directory, file, lacks_deep_count)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) + { + if (has_problem (directory, file, lacks_thumbnail)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) + { + if (has_problem (directory, file, lacks_mount)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) + { + if (has_problem (directory, file, lacks_mime_list)) + { + return FALSE; + } + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) + { + if (has_problem (directory, file, lacks_link_info)) + { + return FALSE; + } + } + + return TRUE; } static gboolean call_ready_callbacks_at_idle (gpointer callback_data) { - NautilusDirectory *directory; - GList *node, *next; - ReadyCallback *callback; - - directory = NAUTILUS_DIRECTORY (callback_data); - directory->details->call_ready_idle_id = 0; - - nautilus_directory_ref (directory); - - callback = NULL; - while (1) { - /* Check if any callbacks are non-active and call them if they are. */ - for (node = directory->details->call_when_ready_list; - node != NULL; node = next) { - next = node->next; - callback = node->data; - if (!callback->active) { - /* Non-active, remove and call */ - break; - } - } - if (node == NULL) { - break; - } - - /* Callbacks are one-shots, so remove it now. */ - remove_callback_link_keep_data (directory, node); - - /* Call the callback. */ - ready_callback_call (directory, callback); - g_free (callback); - } - - nautilus_directory_async_state_changed (directory); - - nautilus_directory_unref (directory); - - return FALSE; + NautilusDirectory *directory; + GList *node, *next; + ReadyCallback *callback; + + directory = NAUTILUS_DIRECTORY (callback_data); + directory->details->call_ready_idle_id = 0; + + nautilus_directory_ref (directory); + + callback = NULL; + while (1) + { + /* Check if any callbacks are non-active and call them if they are. */ + for (node = directory->details->call_when_ready_list; + node != NULL; node = next) + { + next = node->next; + callback = node->data; + if (!callback->active) + { + /* Non-active, remove and call */ + break; + } + } + if (node == NULL) + { + break; + } + + /* Callbacks are one-shots, so remove it now. */ + remove_callback_link_keep_data (directory, node); + + /* Call the callback. */ + ready_callback_call (directory, callback); + g_free (callback); + } + + nautilus_directory_async_state_changed (directory); + + nautilus_directory_unref (directory); + + return FALSE; } static void schedule_call_ready_callbacks (NautilusDirectory *directory) { - if (directory->details->call_ready_idle_id == 0) { - directory->details->call_ready_idle_id - = g_idle_add (call_ready_callbacks_at_idle, directory); - } + if (directory->details->call_ready_idle_id == 0) + { + directory->details->call_ready_idle_id + = g_idle_add (call_ready_callbacks_at_idle, directory); + } } /* Marks all callbacks that are ready as non-active and @@ -1823,58 +2033,65 @@ schedule_call_ready_callbacks (NautilusDirectory *directory) static gboolean call_ready_callbacks (NautilusDirectory *directory) { - gboolean found_any; - GList *node, *next; - ReadyCallback *callback; - - found_any = FALSE; - - /* Check if any callbacks are satisifed and mark them for call them if they are. */ - for (node = directory->details->call_when_ready_list; - node != NULL; node = next) { - next = node->next; - callback = node->data; - if (callback->active && - request_is_satisfied (directory, callback->file, callback->request)) { - callback->active = FALSE; - found_any = TRUE; - } - } - - if (found_any) { - schedule_call_ready_callbacks (directory); - } - - return found_any; -} + gboolean found_any; + GList *node, *next; + ReadyCallback *callback; -gboolean -nautilus_directory_has_active_request_for_file (NautilusDirectory *directory, - NautilusFile *file) -{ - GList *node; - ReadyCallback *callback; - Monitor *monitor; + found_any = FALSE; + + /* Check if any callbacks are satisifed and mark them for call them if they are. */ + for (node = directory->details->call_when_ready_list; + node != NULL; node = next) + { + next = node->next; + callback = node->data; + if (callback->active && + request_is_satisfied (directory, callback->file, callback->request)) + { + callback->active = FALSE; + found_any = TRUE; + } + } - for (node = directory->details->call_when_ready_list; - node != NULL; node = node->next) { - callback = node->data; - if (callback->file == file || - callback->file == NULL) { - return TRUE; - } - } + if (found_any) + { + schedule_call_ready_callbacks (directory); + } - for (node = directory->details->monitor_list; - node != NULL; node = node->next) { - monitor = node->data; - if (monitor->file == file || - monitor->file == NULL) { - return TRUE; - } - } + return found_any; +} - return FALSE; +gboolean +nautilus_directory_has_active_request_for_file (NautilusDirectory *directory, + NautilusFile *file) +{ + GList *node; + ReadyCallback *callback; + Monitor *monitor; + + for (node = directory->details->call_when_ready_list; + node != NULL; node = node->next) + { + callback = node->data; + if (callback->file == file || + callback->file == NULL) + { + return TRUE; + } + } + + for (node = directory->details->monitor_list; + node != NULL; node = node->next) + { + monitor = node->data; + if (monitor->file == file || + monitor->file == NULL) + { + return TRUE; + } + } + + return FALSE; } @@ -1882,145 +2099,161 @@ nautilus_directory_has_active_request_for_file (NautilusDirectory *directory, gboolean nautilus_directory_is_anyone_monitoring_file_list (NautilusDirectory *directory) { - if (directory->details->call_when_ready_counters[REQUEST_FILE_LIST] > 0) { - return TRUE; - } + if (directory->details->call_when_ready_counters[REQUEST_FILE_LIST] > 0) + { + return TRUE; + } - if (directory->details->monitor_counters[REQUEST_FILE_LIST] > 0) { - return TRUE; - } + if (directory->details->monitor_counters[REQUEST_FILE_LIST] > 0) + { + return TRUE; + } - return FALSE; + return FALSE; } /* This checks if the file list being monitored. */ gboolean -nautilus_directory_is_file_list_monitored (NautilusDirectory *directory) +nautilus_directory_is_file_list_monitored (NautilusDirectory *directory) { - return directory->details->file_list_monitored; + return directory->details->file_list_monitored; } static void mark_all_files_unconfirmed (NautilusDirectory *directory) { - GList *node; - NautilusFile *file; + GList *node; + NautilusFile *file; - for (node = directory->details->file_list; node != NULL; node = node->next) { - file = node->data; - set_file_unconfirmed (file, TRUE); - } + for (node = directory->details->file_list; node != NULL; node = node->next) + { + file = node->data; + set_file_unconfirmed (file, TRUE); + } } static void directory_load_state_free (DirectoryLoadState *state) { - if (state->enumerator) { - if (!g_file_enumerator_is_closed (state->enumerator)) { - g_file_enumerator_close_async (state->enumerator, - 0, NULL, NULL, NULL); - } - g_object_unref (state->enumerator); - } - - if (state->load_mime_list_hash != NULL) { - istr_set_destroy (state->load_mime_list_hash); - } - nautilus_file_unref (state->load_directory_file); - g_object_unref (state->cancellable); - g_free (state); + if (state->enumerator) + { + if (!g_file_enumerator_is_closed (state->enumerator)) + { + g_file_enumerator_close_async (state->enumerator, + 0, NULL, NULL, NULL); + } + g_object_unref (state->enumerator); + } + + if (state->load_mime_list_hash != NULL) + { + istr_set_destroy (state->load_mime_list_hash); + } + nautilus_file_unref (state->load_directory_file); + g_object_unref (state->cancellable); + g_free (state); } static void -more_files_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DirectoryLoadState *state; - NautilusDirectory *directory; - GError *error; - GList *files, *l; - GFileInfo *info; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - directory_load_state_free (state); - return; - } - - directory = nautilus_directory_ref (state->directory); - - g_assert (directory->details->directory_load_in_progress != NULL); - g_assert (directory->details->directory_load_in_progress == state); - - error = NULL; - files = g_file_enumerator_next_files_finish (state->enumerator, - res, &error); - - for (l = files; l != NULL; l = l->next) { - info = l->data; - directory_load_one (directory, info); - g_object_unref (info); - } - - if (files == NULL) { - directory_load_done (directory, error); - directory_load_state_free (state); - } else { - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - more_files_callback, - state); - } - - nautilus_directory_unref (directory); - - if (error) { - g_error_free (error); - } - - g_list_free (files); +more_files_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DirectoryLoadState *state; + NautilusDirectory *directory; + GError *error; + GList *files, *l; + GFileInfo *info; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + directory_load_state_free (state); + return; + } + + directory = nautilus_directory_ref (state->directory); + + g_assert (directory->details->directory_load_in_progress != NULL); + g_assert (directory->details->directory_load_in_progress == state); + + error = NULL; + files = g_file_enumerator_next_files_finish (state->enumerator, + res, &error); + + for (l = files; l != NULL; l = l->next) + { + info = l->data; + directory_load_one (directory, info); + g_object_unref (info); + } + + if (files == NULL) + { + directory_load_done (directory, error); + directory_load_state_free (state); + } + else + { + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + more_files_callback, + state); + } + + nautilus_directory_unref (directory); + + if (error) + { + g_error_free (error); + } + + g_list_free (files); } static void -enumerate_children_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DirectoryLoadState *state; - GFileEnumerator *enumerator; - GError *error; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - directory_load_state_free (state); - return; - } - - error = NULL; - enumerator = g_file_enumerate_children_finish (G_FILE (source_object), - res, &error); - - if (enumerator == NULL) { - directory_load_done (state->directory, error); - g_error_free (error); - directory_load_state_free (state); - return; - } else { - state->enumerator = enumerator; - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - more_files_callback, - state); - } +enumerate_children_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DirectoryLoadState *state; + GFileEnumerator *enumerator; + GError *error; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + directory_load_state_free (state); + return; + } + + error = NULL; + enumerator = g_file_enumerate_children_finish (G_FILE (source_object), + res, &error); + + if (enumerator == NULL) + { + directory_load_done (state->directory, error); + g_error_free (error); + directory_load_state_free (state); + return; + } + else + { + state->enumerator = enumerator; + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + more_files_callback, + state); + } } @@ -2028,86 +2261,93 @@ enumerate_children_callback (GObject *source_object, static void start_monitoring_file_list (NautilusDirectory *directory) { - DirectoryLoadState *state; - - if (!directory->details->file_list_monitored) { - g_assert (!directory->details->directory_load_in_progress); - directory->details->file_list_monitored = TRUE; - nautilus_file_list_ref (directory->details->file_list); - } - - if (directory->details->directory_loaded || - directory->details->directory_load_in_progress != NULL) { - return; - } - - if (!async_job_start (directory, "file list")) { - return; - } - - mark_all_files_unconfirmed (directory); - - state = g_new0 (DirectoryLoadState, 1); - state->directory = directory; - state->cancellable = g_cancellable_new (); - state->load_mime_list_hash = istr_set_new (); - state->load_file_count = 0; - - g_assert (directory->details->location != NULL); - state->load_directory_file = - nautilus_directory_get_corresponding_file (directory); - state->load_directory_file->details->loading_directory = TRUE; + DirectoryLoadState *state; + + if (!directory->details->file_list_monitored) + { + g_assert (!directory->details->directory_load_in_progress); + directory->details->file_list_monitored = TRUE; + nautilus_file_list_ref (directory->details->file_list); + } + + if (directory->details->directory_loaded || + directory->details->directory_load_in_progress != NULL) + { + return; + } + + if (!async_job_start (directory, "file list")) + { + return; + } + + mark_all_files_unconfirmed (directory); + + state = g_new0 (DirectoryLoadState, 1); + state->directory = directory; + state->cancellable = g_cancellable_new (); + state->load_mime_list_hash = istr_set_new (); + state->load_file_count = 0; + + g_assert (directory->details->location != NULL); + state->load_directory_file = + nautilus_directory_get_corresponding_file (directory); + state->load_directory_file->details->loading_directory = TRUE; #ifdef DEBUG_LOAD_DIRECTORY - g_message ("load_directory called to monitor file list of %p", directory->details->location); + g_message ("load_directory called to monitor file list of %p", directory->details->location); #endif - - directory->details->directory_load_in_progress = state; - - g_file_enumerate_children_async (directory->details->location, - NAUTILUS_FILE_DEFAULT_ATTRIBUTES, - 0, /* flags */ - G_PRIORITY_DEFAULT, /* prio */ - state->cancellable, - enumerate_children_callback, - state); + + directory->details->directory_load_in_progress = state; + + g_file_enumerate_children_async (directory->details->location, + NAUTILUS_FILE_DEFAULT_ATTRIBUTES, + 0, /* flags */ + G_PRIORITY_DEFAULT, /* prio */ + state->cancellable, + enumerate_children_callback, + state); } /* Stop monitoring the file list if it is being monitored. */ void nautilus_directory_stop_monitoring_file_list (NautilusDirectory *directory) { - if (!directory->details->file_list_monitored) { - g_assert (directory->details->directory_load_in_progress == NULL); - return; - } + if (!directory->details->file_list_monitored) + { + g_assert (directory->details->directory_load_in_progress == NULL); + return; + } - directory->details->file_list_monitored = FALSE; - file_list_cancel (directory); - nautilus_file_list_unref (directory->details->file_list); - directory->details->directory_loaded = FALSE; + directory->details->file_list_monitored = FALSE; + file_list_cancel (directory); + nautilus_file_list_unref (directory->details->file_list); + directory->details->directory_loaded = FALSE; } static void file_list_start_or_stop (NautilusDirectory *directory) { - if (nautilus_directory_is_anyone_monitoring_file_list (directory)) { - start_monitoring_file_list (directory); - } else { - nautilus_directory_stop_monitoring_file_list (directory); - } + if (nautilus_directory_is_anyone_monitoring_file_list (directory)) + { + start_monitoring_file_list (directory); + } + else + { + nautilus_directory_stop_monitoring_file_list (directory); + } } void nautilus_file_invalidate_count_and_mime_list (NautilusFile *file) { - NautilusFileAttributes attributes; - - attributes = NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT | - NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES; - - nautilus_file_invalidate_attributes (file, attributes); + NautilusFileAttributes attributes; + + attributes = NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_COUNT | + NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES; + + nautilus_file_invalidate_attributes (file, attributes); } @@ -2120,1429 +2360,1578 @@ nautilus_file_invalidate_count_and_mime_list (NautilusFile *file) void nautilus_directory_invalidate_count_and_mime_list (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - file = nautilus_directory_get_existing_corresponding_file (directory); - if (file != NULL) { - nautilus_file_invalidate_count_and_mime_list (file); - } - - nautilus_file_unref (file); + file = nautilus_directory_get_existing_corresponding_file (directory); + if (file != NULL) + { + nautilus_file_invalidate_count_and_mime_list (file); + } + + nautilus_file_unref (file); } static void nautilus_directory_invalidate_file_attributes (NautilusDirectory *directory, - NautilusFileAttributes file_attributes) + NautilusFileAttributes file_attributes) { - GList *node; + GList *node; - cancel_loading_attributes (directory, file_attributes); + cancel_loading_attributes (directory, file_attributes); - for (node = directory->details->file_list; node != NULL; node = node->next) { - nautilus_file_invalidate_attributes_internal (NAUTILUS_FILE (node->data), - file_attributes); - } + for (node = directory->details->file_list; node != NULL; node = node->next) + { + nautilus_file_invalidate_attributes_internal (NAUTILUS_FILE (node->data), + file_attributes); + } - if (directory->details->as_file != NULL) { - nautilus_file_invalidate_attributes_internal (directory->details->as_file, - file_attributes); - } + if (directory->details->as_file != NULL) + { + nautilus_file_invalidate_attributes_internal (directory->details->as_file, + file_attributes); + } } void -nautilus_directory_force_reload_internal (NautilusDirectory *directory, - NautilusFileAttributes file_attributes) +nautilus_directory_force_reload_internal (NautilusDirectory *directory, + NautilusFileAttributes file_attributes) { - nautilus_profile_start (NULL); + nautilus_profile_start (NULL); - /* invalidate attributes that are getting reloaded for all files */ - nautilus_directory_invalidate_file_attributes (directory, file_attributes); + /* invalidate attributes that are getting reloaded for all files */ + nautilus_directory_invalidate_file_attributes (directory, file_attributes); - /* Start a new directory load. */ - file_list_cancel (directory); - directory->details->directory_loaded = FALSE; + /* Start a new directory load. */ + file_list_cancel (directory); + directory->details->directory_loaded = FALSE; - /* Start a new directory count. */ - nautilus_directory_invalidate_count_and_mime_list (directory); + /* Start a new directory count. */ + nautilus_directory_invalidate_count_and_mime_list (directory); - add_all_files_to_work_queue (directory); - nautilus_directory_async_state_changed (directory); + add_all_files_to_work_queue (directory); + nautilus_directory_async_state_changed (directory); - nautilus_profile_end (NULL); + nautilus_profile_end (NULL); } static gboolean monitor_includes_file (const Monitor *monitor, - NautilusFile *file) -{ - if (monitor->file == file) { - return TRUE; - } - if (monitor->file != NULL) { - return FALSE; - } - if (file == file->details->directory->details->as_file) { - return FALSE; - } - return nautilus_file_should_show (file, - monitor->monitor_hidden_files, - TRUE); + NautilusFile *file) +{ + if (monitor->file == file) + { + return TRUE; + } + if (monitor->file != NULL) + { + return FALSE; + } + if (file == file->details->directory->details->as_file) + { + return FALSE; + } + return nautilus_file_should_show (file, + monitor->monitor_hidden_files, + TRUE); } static gboolean is_needy (NautilusFile *file, - FileCheck check_missing, - RequestType request_type_wanted) -{ - NautilusDirectory *directory; - GList *node; - ReadyCallback *callback; - Monitor *monitor; - - if (!(* check_missing) (file)) { - return FALSE; - } - - directory = file->details->directory; - if (directory->details->call_when_ready_counters[request_type_wanted] > 0) { - for (node = directory->details->call_when_ready_list; - node != NULL; node = node->next) { - callback = node->data; - if (callback->active && - REQUEST_WANTS_TYPE (callback->request, request_type_wanted)) { - if (callback->file == file) { - return TRUE; - } - if (callback->file == NULL - && file != directory->details->as_file) { - return TRUE; - } - } - } - } - - if (directory->details->monitor_counters[request_type_wanted] > 0) { - for (node = directory->details->monitor_list; - node != NULL; node = node->next) { - monitor = node->data; - if (REQUEST_WANTS_TYPE (monitor->request, request_type_wanted)) { - if (monitor_includes_file (monitor, file)) { - return TRUE; - } - } - } - } - return FALSE; + FileCheck check_missing, + RequestType request_type_wanted) +{ + NautilusDirectory *directory; + GList *node; + ReadyCallback *callback; + Monitor *monitor; + + if (!(*check_missing)(file)) + { + return FALSE; + } + + directory = file->details->directory; + if (directory->details->call_when_ready_counters[request_type_wanted] > 0) + { + for (node = directory->details->call_when_ready_list; + node != NULL; node = node->next) + { + callback = node->data; + if (callback->active && + REQUEST_WANTS_TYPE (callback->request, request_type_wanted)) + { + if (callback->file == file) + { + return TRUE; + } + if (callback->file == NULL + && file != directory->details->as_file) + { + return TRUE; + } + } + } + } + + if (directory->details->monitor_counters[request_type_wanted] > 0) + { + for (node = directory->details->monitor_list; + node != NULL; node = node->next) + { + monitor = node->data; + if (REQUEST_WANTS_TYPE (monitor->request, request_type_wanted)) + { + if (monitor_includes_file (monitor, file)) + { + return TRUE; + } + } + } + } + return FALSE; } static void directory_count_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->count_in_progress != NULL) { - file = directory->details->count_in_progress->count_file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - should_get_directory_count_now, - REQUEST_DIRECTORY_COUNT)) { - return; - } - } + if (directory->details->count_in_progress != NULL) + { + file = directory->details->count_in_progress->count_file; + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + should_get_directory_count_now, + REQUEST_DIRECTORY_COUNT)) + { + return; + } + } - /* The count is not wanted, so stop it. */ - directory_count_cancel (directory); - } + /* The count is not wanted, so stop it. */ + directory_count_cancel (directory); + } } static guint count_non_skipped_files (GList *list) { - guint count; - GList *node; - GFileInfo *info; + guint count; + GList *node; + GFileInfo *info; - count = 0; - for (node = list; node != NULL; node = node->next) { - info = node->data; - if (!should_skip_file (NULL, info)) { - count += 1; - } - } - return count; + count = 0; + for (node = list; node != NULL; node = node->next) + { + info = node->data; + if (!should_skip_file (NULL, info)) + { + count += 1; + } + } + return count; } static void count_children_done (NautilusDirectory *directory, - NautilusFile *count_file, - gboolean succeeded, - int count) -{ - g_assert (NAUTILUS_IS_FILE (count_file)); - - count_file->details->directory_count_is_up_to_date = TRUE; - - /* Record either a failure or success. */ - if (!succeeded) { - count_file->details->directory_count_failed = TRUE; - count_file->details->got_directory_count = FALSE; - count_file->details->directory_count = 0; - } else { - count_file->details->directory_count_failed = FALSE; - count_file->details->got_directory_count = TRUE; - count_file->details->directory_count = count; - } - directory->details->count_in_progress = NULL; - - /* Send file-changed even if count failed, so interested parties can - * distinguish between unknowable and not-yet-known cases. - */ - nautilus_file_changed (count_file); - - /* Start up the next one. */ - async_job_end (directory, "directory count"); - nautilus_directory_async_state_changed (directory); + NautilusFile *count_file, + gboolean succeeded, + int count) +{ + g_assert (NAUTILUS_IS_FILE (count_file)); + + count_file->details->directory_count_is_up_to_date = TRUE; + + /* Record either a failure or success. */ + if (!succeeded) + { + count_file->details->directory_count_failed = TRUE; + count_file->details->got_directory_count = FALSE; + count_file->details->directory_count = 0; + } + else + { + count_file->details->directory_count_failed = FALSE; + count_file->details->got_directory_count = TRUE; + count_file->details->directory_count = count; + } + directory->details->count_in_progress = NULL; + + /* Send file-changed even if count failed, so interested parties can + * distinguish between unknowable and not-yet-known cases. + */ + nautilus_file_changed (count_file); + + /* Start up the next one. */ + async_job_end (directory, "directory count"); + nautilus_directory_async_state_changed (directory); } static void directory_count_state_free (DirectoryCountState *state) { - if (state->enumerator) { - if (!g_file_enumerator_is_closed (state->enumerator)) { - g_file_enumerator_close_async (state->enumerator, - 0, NULL, NULL, NULL); - } - g_object_unref (state->enumerator); - } - g_object_unref (state->cancellable); - nautilus_directory_unref (state->directory); - g_free (state); + if (state->enumerator) + { + if (!g_file_enumerator_is_closed (state->enumerator)) + { + g_file_enumerator_close_async (state->enumerator, + 0, NULL, NULL, NULL); + } + g_object_unref (state->enumerator); + } + g_object_unref (state->cancellable); + nautilus_directory_unref (state->directory); + g_free (state); } static void -count_more_files_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DirectoryCountState *state; - NautilusDirectory *directory; - GError *error; - GList *files; - - state = user_data; - directory = state->directory; - - if (g_cancellable_is_cancelled (state->cancellable)) { - /* Operation was cancelled. Bail out */ - - async_job_end (directory, "directory count"); - nautilus_directory_async_state_changed (directory); - - directory_count_state_free (state); - - return; - } - - g_assert (directory->details->count_in_progress != NULL); - g_assert (directory->details->count_in_progress == state); - - error = NULL; - files = g_file_enumerator_next_files_finish (state->enumerator, - res, &error); - - state->file_count += count_non_skipped_files (files); - - if (files == NULL) { - count_children_done (directory, state->count_file, - TRUE, state->file_count); - directory_count_state_free (state); - } else { - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - count_more_files_callback, - state); - } - - g_list_free_full (files, g_object_unref); - - if (error) { - g_error_free (error); - } +count_more_files_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DirectoryCountState *state; + NautilusDirectory *directory; + GError *error; + GList *files; + + state = user_data; + directory = state->directory; + + if (g_cancellable_is_cancelled (state->cancellable)) + { + /* Operation was cancelled. Bail out */ + + async_job_end (directory, "directory count"); + nautilus_directory_async_state_changed (directory); + + directory_count_state_free (state); + + return; + } + + g_assert (directory->details->count_in_progress != NULL); + g_assert (directory->details->count_in_progress == state); + + error = NULL; + files = g_file_enumerator_next_files_finish (state->enumerator, + res, &error); + + state->file_count += count_non_skipped_files (files); + + if (files == NULL) + { + count_children_done (directory, state->count_file, + TRUE, state->file_count); + directory_count_state_free (state); + } + else + { + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + count_more_files_callback, + state); + } + + g_list_free_full (files, g_object_unref); + + if (error) + { + g_error_free (error); + } } static void -count_children_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DirectoryCountState *state; - GFileEnumerator *enumerator; - NautilusDirectory *directory; - GError *error; - - state = user_data; - - if (g_cancellable_is_cancelled (state->cancellable)) { - /* Operation was cancelled. Bail out */ - directory = state->directory; - - async_job_end (directory, "directory count"); - nautilus_directory_async_state_changed (directory); - - directory_count_state_free (state); - - return; - } - - error = NULL; - enumerator = g_file_enumerate_children_finish (G_FILE (source_object), - res, &error); - - if (enumerator == NULL) { - count_children_done (state->directory, - state->count_file, - FALSE, 0); - g_error_free (error); - directory_count_state_free (state); - return; - } else { - state->enumerator = enumerator; - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - count_more_files_callback, - state); - } +count_children_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DirectoryCountState *state; + GFileEnumerator *enumerator; + NautilusDirectory *directory; + GError *error; + + state = user_data; + + if (g_cancellable_is_cancelled (state->cancellable)) + { + /* Operation was cancelled. Bail out */ + directory = state->directory; + + async_job_end (directory, "directory count"); + nautilus_directory_async_state_changed (directory); + + directory_count_state_free (state); + + return; + } + + error = NULL; + enumerator = g_file_enumerate_children_finish (G_FILE (source_object), + res, &error); + + if (enumerator == NULL) + { + count_children_done (state->directory, + state->count_file, + FALSE, 0); + g_error_free (error); + directory_count_state_free (state); + return; + } + else + { + state->enumerator = enumerator; + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + count_more_files_callback, + state); + } } static void directory_count_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - DirectoryCountState *state; - GFile *location; - - if (directory->details->count_in_progress != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - should_get_directory_count_now, - REQUEST_DIRECTORY_COUNT)) { - return; - } - *doing_io = TRUE; - - if (!nautilus_file_is_directory (file)) { - file->details->directory_count_is_up_to_date = TRUE; - file->details->directory_count_failed = FALSE; - file->details->got_directory_count = FALSE; - - nautilus_directory_async_state_changed (directory); - return; - } - - if (!async_job_start (directory, "directory count")) { - return; - } - - /* Start counting. */ - state = g_new0 (DirectoryCountState, 1); - state->count_file = file; - state->directory = nautilus_directory_ref (directory); - state->cancellable = g_cancellable_new (); - - directory->details->count_in_progress = state; - - location = nautilus_file_get_location (file); -#ifdef DEBUG_LOAD_DIRECTORY - { - char *uri; - uri = g_file_get_uri (location); - g_message ("load_directory called to get shallow file count for %s", uri); - g_free (uri); - } + NautilusFile *file, + gboolean *doing_io) +{ + DirectoryCountState *state; + GFile *location; + + if (directory->details->count_in_progress != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + should_get_directory_count_now, + REQUEST_DIRECTORY_COUNT)) + { + return; + } + *doing_io = TRUE; + + if (!nautilus_file_is_directory (file)) + { + file->details->directory_count_is_up_to_date = TRUE; + file->details->directory_count_failed = FALSE; + file->details->got_directory_count = FALSE; + + nautilus_directory_async_state_changed (directory); + return; + } + + if (!async_job_start (directory, "directory count")) + { + return; + } + + /* Start counting. */ + state = g_new0 (DirectoryCountState, 1); + state->count_file = file; + state->directory = nautilus_directory_ref (directory); + state->cancellable = g_cancellable_new (); + + directory->details->count_in_progress = state; + + location = nautilus_file_get_location (file); +#ifdef DEBUG_LOAD_DIRECTORY + { + char *uri; + uri = g_file_get_uri (location); + g_message ("load_directory called to get shallow file count for %s", uri); + g_free (uri); + } #endif - g_file_enumerate_children_async (location, - G_FILE_ATTRIBUTE_STANDARD_NAME "," - G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," - G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, /* flags */ - G_PRIORITY_DEFAULT, /* prio */ - state->cancellable, - count_children_callback, - state); - g_object_unref (location); + g_file_enumerate_children_async (location, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," + G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, /* flags */ + G_PRIORITY_DEFAULT, /* prio */ + state->cancellable, + count_children_callback, + state); + g_object_unref (location); } static inline gboolean seen_inode (DeepCountState *state, - GFileInfo *info) + GFileInfo *info) { - guint64 inode, inode2; - guint i; + guint64 inode, inode2; + guint i; - inode = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_UNIX_INODE); + inode = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_UNIX_INODE); - if (inode != 0) { - for (i = 0; i < state->seen_deep_count_inodes->len; i++) { - inode2 = g_array_index (state->seen_deep_count_inodes, guint64, i); - if (inode == inode2) { - return TRUE; - } - } - } + if (inode != 0) + { + for (i = 0; i < state->seen_deep_count_inodes->len; i++) + { + inode2 = g_array_index (state->seen_deep_count_inodes, guint64, i); + if (inode == inode2) + { + return TRUE; + } + } + } - return FALSE; + return FALSE; } static inline void mark_inode_as_seen (DeepCountState *state, - GFileInfo *info) + GFileInfo *info) { - guint64 inode; + guint64 inode; - inode = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_UNIX_INODE); - if (inode != 0) { - g_array_append_val (state->seen_deep_count_inodes, inode); - } + inode = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_UNIX_INODE); + if (inode != 0) + { + g_array_append_val (state->seen_deep_count_inodes, inode); + } } static void deep_count_one (DeepCountState *state, - GFileInfo *info) -{ - NautilusFile *file; - GFile *subdir; - gboolean is_seen_inode; - const char *fs_id; - - if (should_skip_file (NULL, info)) { - return; - } - - is_seen_inode = seen_inode (state, info); - if (!is_seen_inode) { - mark_inode_as_seen (state, info); - } - - file = state->directory->details->deep_count_file; - - if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { - /* Count the directory. */ - file->details->deep_directory_count += 1; - - /* Record the fact that we have to descend into this directory. */ - fs_id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM); - if (g_strcmp0 (fs_id, state->fs_id) == 0) { - /* only if it is on the same filesystem */ - subdir = g_file_get_child (state->deep_count_location, g_file_info_get_name (info)); - state->deep_count_subdirectories = g_list_prepend - (state->deep_count_subdirectories, subdir); - } - } else { - /* Even non-regular files count as files. */ - file->details->deep_file_count += 1; - } - - /* Count the size. */ - if (!is_seen_inode && g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) { - file->details->deep_size += g_file_info_get_size (info); - } + GFileInfo *info) +{ + NautilusFile *file; + GFile *subdir; + gboolean is_seen_inode; + const char *fs_id; + + if (should_skip_file (NULL, info)) + { + return; + } + + is_seen_inode = seen_inode (state, info); + if (!is_seen_inode) + { + mark_inode_as_seen (state, info); + } + + file = state->directory->details->deep_count_file; + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + { + /* Count the directory. */ + file->details->deep_directory_count += 1; + + /* Record the fact that we have to descend into this directory. */ + fs_id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM); + if (g_strcmp0 (fs_id, state->fs_id) == 0) + { + /* only if it is on the same filesystem */ + subdir = g_file_get_child (state->deep_count_location, g_file_info_get_name (info)); + state->deep_count_subdirectories = g_list_prepend + (state->deep_count_subdirectories, subdir); + } + } + else + { + /* Even non-regular files count as files. */ + file->details->deep_file_count += 1; + } + + /* Count the size. */ + if (!is_seen_inode && g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) + { + file->details->deep_size += g_file_info_get_size (info); + } } static void deep_count_state_free (DeepCountState *state) { - if (state->enumerator) { - if (!g_file_enumerator_is_closed (state->enumerator)) { - g_file_enumerator_close_async (state->enumerator, - 0, NULL, NULL, NULL); - } - g_object_unref (state->enumerator); - } - g_object_unref (state->cancellable); - if (state->deep_count_location) { - g_object_unref (state->deep_count_location); - } - g_list_free_full (state->deep_count_subdirectories, g_object_unref); - g_array_free (state->seen_deep_count_inodes, TRUE); - g_free (state->fs_id); - g_free (state); + if (state->enumerator) + { + if (!g_file_enumerator_is_closed (state->enumerator)) + { + g_file_enumerator_close_async (state->enumerator, + 0, NULL, NULL, NULL); + } + g_object_unref (state->enumerator); + } + g_object_unref (state->cancellable); + if (state->deep_count_location) + { + g_object_unref (state->deep_count_location); + } + g_list_free_full (state->deep_count_subdirectories, g_object_unref); + g_array_free (state->seen_deep_count_inodes, TRUE); + g_free (state->fs_id); + g_free (state); } static void deep_count_next_dir (DeepCountState *state) { - GFile *location; - NautilusFile *file; - NautilusDirectory *directory; - gboolean done; - - directory = state->directory; - - g_object_unref (state->deep_count_location); - state->deep_count_location = NULL; - - done = FALSE; - file = directory->details->deep_count_file; - - if (state->deep_count_subdirectories != NULL) { - /* Work on a new directory. */ - location = state->deep_count_subdirectories->data; - state->deep_count_subdirectories = g_list_remove - (state->deep_count_subdirectories, location); - deep_count_load (state, location); - g_object_unref (location); - } else { - file->details->deep_counts_status = NAUTILUS_REQUEST_DONE; - directory->details->deep_count_file = NULL; - directory->details->deep_count_in_progress = NULL; - deep_count_state_free (state); - done = TRUE; - } - - nautilus_file_updated_deep_count_in_progress (file); - - if (done) { - nautilus_file_changed (file); - async_job_end (directory, "deep count"); - nautilus_directory_async_state_changed (directory); - } + GFile *location; + NautilusFile *file; + NautilusDirectory *directory; + gboolean done; + + directory = state->directory; + + g_object_unref (state->deep_count_location); + state->deep_count_location = NULL; + + done = FALSE; + file = directory->details->deep_count_file; + + if (state->deep_count_subdirectories != NULL) + { + /* Work on a new directory. */ + location = state->deep_count_subdirectories->data; + state->deep_count_subdirectories = g_list_remove + (state->deep_count_subdirectories, location); + deep_count_load (state, location); + g_object_unref (location); + } + else + { + file->details->deep_counts_status = NAUTILUS_REQUEST_DONE; + directory->details->deep_count_file = NULL; + directory->details->deep_count_in_progress = NULL; + deep_count_state_free (state); + done = TRUE; + } + + nautilus_file_updated_deep_count_in_progress (file); + + if (done) + { + nautilus_file_changed (file); + async_job_end (directory, "deep count"); + nautilus_directory_async_state_changed (directory); + } } static void -deep_count_more_files_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DeepCountState *state; - NautilusDirectory *directory; - GList *files, *l; - GFileInfo *info; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - deep_count_state_free (state); - return; - } - - directory = nautilus_directory_ref (state->directory); - - g_assert (directory->details->deep_count_in_progress != NULL); - g_assert (directory->details->deep_count_in_progress == state); - - files = g_file_enumerator_next_files_finish (state->enumerator, - res, NULL); - - for (l = files; l != NULL; l = l->next) { - info = l->data; - deep_count_one (state, info); - g_object_unref (info); - } - - if (files == NULL) { - g_file_enumerator_close_async (state->enumerator, 0, NULL, NULL, NULL); - g_object_unref (state->enumerator); - state->enumerator = NULL; - - deep_count_next_dir (state); - } else { - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_LOW, - state->cancellable, - deep_count_more_files_callback, - state); - } - - g_list_free (files); - - nautilus_directory_unref (directory); +deep_count_more_files_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DeepCountState *state; + NautilusDirectory *directory; + GList *files, *l; + GFileInfo *info; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + deep_count_state_free (state); + return; + } + + directory = nautilus_directory_ref (state->directory); + + g_assert (directory->details->deep_count_in_progress != NULL); + g_assert (directory->details->deep_count_in_progress == state); + + files = g_file_enumerator_next_files_finish (state->enumerator, + res, NULL); + + for (l = files; l != NULL; l = l->next) + { + info = l->data; + deep_count_one (state, info); + g_object_unref (info); + } + + if (files == NULL) + { + g_file_enumerator_close_async (state->enumerator, 0, NULL, NULL, NULL); + g_object_unref (state->enumerator); + state->enumerator = NULL; + + deep_count_next_dir (state); + } + else + { + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_LOW, + state->cancellable, + deep_count_more_files_callback, + state); + } + + g_list_free (files); + + nautilus_directory_unref (directory); } static void -deep_count_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - DeepCountState *state; - GFileEnumerator *enumerator; - NautilusFile *file; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - deep_count_state_free (state); - return; - } - - file = state->directory->details->deep_count_file; - - enumerator = g_file_enumerate_children_finish (G_FILE (source_object), res, NULL); - - if (enumerator == NULL) { - file->details->deep_unreadable_count += 1; - - deep_count_next_dir (state); - } else { - state->enumerator = enumerator; - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_LOW, - state->cancellable, - deep_count_more_files_callback, - state); - } +deep_count_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + DeepCountState *state; + GFileEnumerator *enumerator; + NautilusFile *file; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + deep_count_state_free (state); + return; + } + + file = state->directory->details->deep_count_file; + + enumerator = g_file_enumerate_children_finish (G_FILE (source_object), res, NULL); + + if (enumerator == NULL) + { + file->details->deep_unreadable_count += 1; + + deep_count_next_dir (state); + } + else + { + state->enumerator = enumerator; + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_LOW, + state->cancellable, + deep_count_more_files_callback, + state); + } } static void -deep_count_load (DeepCountState *state, GFile *location) -{ - state->deep_count_location = g_object_ref (location); - -#ifdef DEBUG_LOAD_DIRECTORY - g_message ("load_directory called to get deep file count for %p", location); -#endif - g_file_enumerate_children_async (state->deep_count_location, - G_FILE_ATTRIBUTE_STANDARD_NAME "," - G_FILE_ATTRIBUTE_STANDARD_TYPE "," - G_FILE_ATTRIBUTE_STANDARD_SIZE "," - G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," - G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP "," - G_FILE_ATTRIBUTE_ID_FILESYSTEM "," - G_FILE_ATTRIBUTE_UNIX_INODE, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, /* flags */ - G_PRIORITY_LOW, /* prio */ - state->cancellable, - deep_count_callback, - state); +deep_count_load (DeepCountState *state, + GFile *location) +{ + state->deep_count_location = g_object_ref (location); + +#ifdef DEBUG_LOAD_DIRECTORY + g_message ("load_directory called to get deep file count for %p", location); +#endif + g_file_enumerate_children_async (state->deep_count_location, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_STANDARD_TYPE "," + G_FILE_ATTRIBUTE_STANDARD_SIZE "," + G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," + G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP "," + G_FILE_ATTRIBUTE_ID_FILESYSTEM "," + G_FILE_ATTRIBUTE_UNIX_INODE, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, /* flags */ + G_PRIORITY_LOW, /* prio */ + state->cancellable, + deep_count_callback, + state); } static void deep_count_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->deep_count_in_progress != NULL) { - file = directory->details->deep_count_file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - lacks_deep_count, - REQUEST_DEEP_COUNT)) { - return; - } - } + if (directory->details->deep_count_in_progress != NULL) + { + file = directory->details->deep_count_file; + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_deep_count, + REQUEST_DEEP_COUNT)) + { + return; + } + } - /* The count is not wanted, so stop it. */ - deep_count_cancel (directory); - } + /* The count is not wanted, so stop it. */ + deep_count_cancel (directory); + } } static void -deep_count_got_info (GObject *source_object, - GAsyncResult *res, - gpointer user_data) +deep_count_got_info (GObject *source_object, + GAsyncResult *res, + gpointer user_data) { - GFileInfo *info; - const char *id; - GFile *file = (GFile *)source_object; - DeepCountState *state = (DeepCountState *)user_data; + GFileInfo *info; + const char *id; + GFile *file = (GFile *) source_object; + DeepCountState *state = (DeepCountState *) user_data; - info = g_file_query_info_finish (file, res, NULL); - if (info != NULL) { - id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM); - state->fs_id = g_strdup (id); - g_object_unref (info); - } - deep_count_load (state, file); + info = g_file_query_info_finish (file, res, NULL); + if (info != NULL) + { + id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM); + state->fs_id = g_strdup (id); + g_object_unref (info); + } + deep_count_load (state, file); } static void deep_count_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - DeepCountState *state; - - if (directory->details->deep_count_in_progress != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - lacks_deep_count, - REQUEST_DEEP_COUNT)) { - return; - } - *doing_io = TRUE; - - if (!nautilus_file_is_directory (file)) { - file->details->deep_counts_status = NAUTILUS_REQUEST_DONE; - - nautilus_directory_async_state_changed (directory); - return; - } - - if (!async_job_start (directory, "deep count")) { - return; - } - - /* Start counting. */ - file->details->deep_counts_status = NAUTILUS_REQUEST_IN_PROGRESS; - file->details->deep_directory_count = 0; - file->details->deep_file_count = 0; - file->details->deep_unreadable_count = 0; - file->details->deep_size = 0; - directory->details->deep_count_file = file; - - state = g_new0 (DeepCountState, 1); - state->directory = directory; - state->cancellable = g_cancellable_new (); - state->seen_deep_count_inodes = g_array_new (FALSE, TRUE, sizeof (guint64)); - state->fs_id = NULL; - - directory->details->deep_count_in_progress = state; - - location = nautilus_file_get_location (file); - g_file_query_info_async (location, - G_FILE_ATTRIBUTE_ID_FILESYSTEM, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, - G_PRIORITY_DEFAULT, - NULL, - deep_count_got_info, - state); - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + DeepCountState *state; + + if (directory->details->deep_count_in_progress != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + lacks_deep_count, + REQUEST_DEEP_COUNT)) + { + return; + } + *doing_io = TRUE; + + if (!nautilus_file_is_directory (file)) + { + file->details->deep_counts_status = NAUTILUS_REQUEST_DONE; + + nautilus_directory_async_state_changed (directory); + return; + } + + if (!async_job_start (directory, "deep count")) + { + return; + } + + /* Start counting. */ + file->details->deep_counts_status = NAUTILUS_REQUEST_IN_PROGRESS; + file->details->deep_directory_count = 0; + file->details->deep_file_count = 0; + file->details->deep_unreadable_count = 0; + file->details->deep_size = 0; + directory->details->deep_count_file = file; + + state = g_new0 (DeepCountState, 1); + state->directory = directory; + state->cancellable = g_cancellable_new (); + state->seen_deep_count_inodes = g_array_new (FALSE, TRUE, sizeof (guint64)); + state->fs_id = NULL; + + directory->details->deep_count_in_progress = state; + + location = nautilus_file_get_location (file); + g_file_query_info_async (location, + G_FILE_ATTRIBUTE_ID_FILESYSTEM, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + G_PRIORITY_DEFAULT, + NULL, + deep_count_got_info, + state); + g_object_unref (location); } static void mime_list_stop (NautilusDirectory *directory) { - NautilusFile *file; - - if (directory->details->mime_list_in_progress != NULL) { - file = directory->details->mime_list_in_progress->mime_list_file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - should_get_mime_list, - REQUEST_MIME_LIST)) { - return; - } - } - - /* The count is not wanted, so stop it. */ - mime_list_cancel (directory); - } + NautilusFile *file; + + if (directory->details->mime_list_in_progress != NULL) + { + file = directory->details->mime_list_in_progress->mime_list_file; + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + should_get_mime_list, + REQUEST_MIME_LIST)) + { + return; + } + } + + /* The count is not wanted, so stop it. */ + mime_list_cancel (directory); + } } static void mime_list_state_free (MimeListState *state) { - if (state->enumerator) { - if (!g_file_enumerator_is_closed (state->enumerator)) { - g_file_enumerator_close_async (state->enumerator, - 0, NULL, NULL, NULL); - } - g_object_unref (state->enumerator); - } - g_object_unref (state->cancellable); - istr_set_destroy (state->mime_list_hash); - nautilus_directory_unref (state->directory); - g_free (state); + if (state->enumerator) + { + if (!g_file_enumerator_is_closed (state->enumerator)) + { + g_file_enumerator_close_async (state->enumerator, + 0, NULL, NULL, NULL); + } + g_object_unref (state->enumerator); + } + g_object_unref (state->cancellable); + istr_set_destroy (state->mime_list_hash); + nautilus_directory_unref (state->directory); + g_free (state); } static void -mime_list_done (MimeListState *state, gboolean success) -{ - NautilusFile *file; - NautilusDirectory *directory; - - directory = state->directory; - g_assert (directory != NULL); - - file = state->mime_list_file; - - file->details->mime_list_is_up_to_date = TRUE; - g_list_free_full (file->details->mime_list, g_free); - if (success) { - file->details->mime_list_failed = TRUE; - file->details->mime_list = NULL; - } else { - file->details->got_mime_list = TRUE; - file->details->mime_list = istr_set_get_as_list (state->mime_list_hash); - } - directory->details->mime_list_in_progress = NULL; - - /* Send file-changed even if getting the item type list - * failed, so interested parties can distinguish between - * unknowable and not-yet-known cases. - */ - nautilus_file_changed (file); - - /* Start up the next one. */ - async_job_end (directory, "MIME list"); - nautilus_directory_async_state_changed (directory); +mime_list_done (MimeListState *state, + gboolean success) +{ + NautilusFile *file; + NautilusDirectory *directory; + + directory = state->directory; + g_assert (directory != NULL); + + file = state->mime_list_file; + + file->details->mime_list_is_up_to_date = TRUE; + g_list_free_full (file->details->mime_list, g_free); + if (success) + { + file->details->mime_list_failed = TRUE; + file->details->mime_list = NULL; + } + else + { + file->details->got_mime_list = TRUE; + file->details->mime_list = istr_set_get_as_list (state->mime_list_hash); + } + directory->details->mime_list_in_progress = NULL; + + /* Send file-changed even if getting the item type list + * failed, so interested parties can distinguish between + * unknowable and not-yet-known cases. + */ + nautilus_file_changed (file); + + /* Start up the next one. */ + async_job_end (directory, "MIME list"); + nautilus_directory_async_state_changed (directory); } static void mime_list_one (MimeListState *state, - GFileInfo *info) + GFileInfo *info) { - const char *mime_type; - - if (should_skip_file (NULL, info)) { - g_object_unref (info); - return; - } + const char *mime_type; + + if (should_skip_file (NULL, info)) + { + g_object_unref (info); + return; + } - mime_type = g_file_info_get_content_type (info); - if (mime_type != NULL) { - istr_set_insert (state->mime_list_hash, mime_type); - } + mime_type = g_file_info_get_content_type (info); + if (mime_type != NULL) + { + istr_set_insert (state->mime_list_hash, mime_type); + } } static void -mime_list_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - MimeListState *state; - NautilusDirectory *directory; - GError *error; - GList *files, *l; - GFileInfo *info; - - state = user_data; - directory = state->directory; - - if (g_cancellable_is_cancelled (state->cancellable)) { - /* Operation was cancelled. Bail out */ - directory->details->mime_list_in_progress = NULL; - - async_job_end (directory, "MIME list"); - nautilus_directory_async_state_changed (directory); - - mime_list_state_free (state); - - return; - } - - g_assert (directory->details->mime_list_in_progress != NULL); - g_assert (directory->details->mime_list_in_progress == state); - - error = NULL; - files = g_file_enumerator_next_files_finish (state->enumerator, - res, &error); - - for (l = files; l != NULL; l = l->next) { - info = l->data; - mime_list_one (state, info); - g_object_unref (info); - } - - if (files == NULL) { - mime_list_done (state, error != NULL); - mime_list_state_free (state); - } else { - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - mime_list_callback, - state); - } - - g_list_free (files); - - if (error) { - g_error_free (error); - } +mime_list_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + MimeListState *state; + NautilusDirectory *directory; + GError *error; + GList *files, *l; + GFileInfo *info; + + state = user_data; + directory = state->directory; + + if (g_cancellable_is_cancelled (state->cancellable)) + { + /* Operation was cancelled. Bail out */ + directory->details->mime_list_in_progress = NULL; + + async_job_end (directory, "MIME list"); + nautilus_directory_async_state_changed (directory); + + mime_list_state_free (state); + + return; + } + + g_assert (directory->details->mime_list_in_progress != NULL); + g_assert (directory->details->mime_list_in_progress == state); + + error = NULL; + files = g_file_enumerator_next_files_finish (state->enumerator, + res, &error); + + for (l = files; l != NULL; l = l->next) + { + info = l->data; + mime_list_one (state, info); + g_object_unref (info); + } + + if (files == NULL) + { + mime_list_done (state, error != NULL); + mime_list_state_free (state); + } + else + { + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + mime_list_callback, + state); + } + + g_list_free (files); + + if (error) + { + g_error_free (error); + } } static void -list_mime_enum_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - MimeListState *state; - GFileEnumerator *enumerator; - NautilusDirectory *directory; - GError *error; - - state = user_data; - - if (g_cancellable_is_cancelled (state->cancellable)) { - /* Operation was cancelled. Bail out */ - directory = state->directory; - directory->details->mime_list_in_progress = NULL; - - async_job_end (directory, "MIME list"); - nautilus_directory_async_state_changed (directory); - - mime_list_state_free (state); - - return; - } - - error = NULL; - enumerator = g_file_enumerate_children_finish (G_FILE (source_object), - res, &error); - - if (enumerator == NULL) { - mime_list_done (state, FALSE); - g_error_free (error); - mime_list_state_free (state); - return; - } else { - state->enumerator = enumerator; - g_file_enumerator_next_files_async (state->enumerator, - DIRECTORY_LOAD_ITEMS_PER_CALLBACK, - G_PRIORITY_DEFAULT, - state->cancellable, - mime_list_callback, - state); - } +list_mime_enum_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + MimeListState *state; + GFileEnumerator *enumerator; + NautilusDirectory *directory; + GError *error; + + state = user_data; + + if (g_cancellable_is_cancelled (state->cancellable)) + { + /* Operation was cancelled. Bail out */ + directory = state->directory; + directory->details->mime_list_in_progress = NULL; + + async_job_end (directory, "MIME list"); + nautilus_directory_async_state_changed (directory); + + mime_list_state_free (state); + + return; + } + + error = NULL; + enumerator = g_file_enumerate_children_finish (G_FILE (source_object), + res, &error); + + if (enumerator == NULL) + { + mime_list_done (state, FALSE); + g_error_free (error); + mime_list_state_free (state); + return; + } + else + { + state->enumerator = enumerator; + g_file_enumerator_next_files_async (state->enumerator, + DIRECTORY_LOAD_ITEMS_PER_CALLBACK, + G_PRIORITY_DEFAULT, + state->cancellable, + mime_list_callback, + state); + } } static void mime_list_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - MimeListState *state; - GFile *location; - - mime_list_stop (directory); - - if (directory->details->mime_list_in_progress != NULL) { - *doing_io = TRUE; - return; - } - - /* Figure out which file to get a mime list for. */ - if (!is_needy (file, - should_get_mime_list, - REQUEST_MIME_LIST)) { - return; - } - *doing_io = TRUE; - - if (!nautilus_file_is_directory (file)) { - g_list_free (file->details->mime_list); - file->details->mime_list_failed = FALSE; - file->details->got_mime_list = FALSE; - file->details->mime_list_is_up_to_date = TRUE; - - nautilus_directory_async_state_changed (directory); - return; - } - - if (!async_job_start (directory, "MIME list")) { - return; - } - - - state = g_new0 (MimeListState, 1); - state->mime_list_file = file; - state->directory = nautilus_directory_ref (directory); - state->cancellable = g_cancellable_new (); - state->mime_list_hash = istr_set_new (); - - directory->details->mime_list_in_progress = state; - - location = nautilus_file_get_location (file); -#ifdef DEBUG_LOAD_DIRECTORY - { - char *uri; - uri = g_file_get_uri (location); - g_message ("load_directory called to get MIME list of %s", uri); - g_free (uri); - } -#endif - - g_file_enumerate_children_async (location, - G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, - 0, /* flags */ - G_PRIORITY_LOW, /* prio */ - state->cancellable, - list_mime_enum_callback, - state); - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + MimeListState *state; + GFile *location; + + mime_list_stop (directory); + + if (directory->details->mime_list_in_progress != NULL) + { + *doing_io = TRUE; + return; + } + + /* Figure out which file to get a mime list for. */ + if (!is_needy (file, + should_get_mime_list, + REQUEST_MIME_LIST)) + { + return; + } + *doing_io = TRUE; + + if (!nautilus_file_is_directory (file)) + { + g_list_free (file->details->mime_list); + file->details->mime_list_failed = FALSE; + file->details->got_mime_list = FALSE; + file->details->mime_list_is_up_to_date = TRUE; + + nautilus_directory_async_state_changed (directory); + return; + } + + if (!async_job_start (directory, "MIME list")) + { + return; + } + + + state = g_new0 (MimeListState, 1); + state->mime_list_file = file; + state->directory = nautilus_directory_ref (directory); + state->cancellable = g_cancellable_new (); + state->mime_list_hash = istr_set_new (); + + directory->details->mime_list_in_progress = state; + + location = nautilus_file_get_location (file); +#ifdef DEBUG_LOAD_DIRECTORY + { + char *uri; + uri = g_file_get_uri (location); + g_message ("load_directory called to get MIME list of %s", uri); + g_free (uri); + } +#endif + + g_file_enumerate_children_async (location, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + 0, /* flags */ + G_PRIORITY_LOW, /* prio */ + state->cancellable, + list_mime_enum_callback, + state); + g_object_unref (location); } static void get_info_state_free (GetInfoState *state) { - g_object_unref (state->cancellable); - g_free (state); + g_object_unref (state->cancellable); + g_free (state); } static void -query_info_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - NautilusDirectory *directory; - NautilusFile *get_info_file; - GFileInfo *info; - GetInfoState *state; - GError *error; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - get_info_state_free (state); - return; - } - - directory = nautilus_directory_ref (state->directory); - - get_info_file = directory->details->get_info_file; - g_assert (NAUTILUS_IS_FILE (get_info_file)); - - directory->details->get_info_file = NULL; - directory->details->get_info_in_progress = NULL; - - /* ref here because we might be removing the last ref when we - * mark the file gone below, but we need to keep a ref at - * least long enough to send the change notification. - */ - nautilus_file_ref (get_info_file); - - error = NULL; - info = g_file_query_info_finish (G_FILE (source_object), res, &error); - - if (info == NULL) { - if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_FOUND) { - /* mark file as gone */ - nautilus_file_mark_gone (get_info_file); - } - get_info_file->details->file_info_is_up_to_date = TRUE; - nautilus_file_clear_info (get_info_file); - get_info_file->details->get_info_failed = TRUE; - get_info_file->details->get_info_error = error; - } else { - nautilus_file_update_info (get_info_file, info); - g_object_unref (info); - } - - nautilus_file_changed (get_info_file); - nautilus_file_unref (get_info_file); - - async_job_end (directory, "file info"); - nautilus_directory_async_state_changed (directory); - - nautilus_directory_unref (directory); - - get_info_state_free (state); +query_info_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + NautilusDirectory *directory; + NautilusFile *get_info_file; + GFileInfo *info; + GetInfoState *state; + GError *error; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + get_info_state_free (state); + return; + } + + directory = nautilus_directory_ref (state->directory); + + get_info_file = directory->details->get_info_file; + g_assert (NAUTILUS_IS_FILE (get_info_file)); + + directory->details->get_info_file = NULL; + directory->details->get_info_in_progress = NULL; + + /* ref here because we might be removing the last ref when we + * mark the file gone below, but we need to keep a ref at + * least long enough to send the change notification. + */ + nautilus_file_ref (get_info_file); + + error = NULL; + info = g_file_query_info_finish (G_FILE (source_object), res, &error); + + if (info == NULL) + { + if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_NOT_FOUND) + { + /* mark file as gone */ + nautilus_file_mark_gone (get_info_file); + } + get_info_file->details->file_info_is_up_to_date = TRUE; + nautilus_file_clear_info (get_info_file); + get_info_file->details->get_info_failed = TRUE; + get_info_file->details->get_info_error = error; + } + else + { + nautilus_file_update_info (get_info_file, info); + g_object_unref (info); + } + + nautilus_file_changed (get_info_file); + nautilus_file_unref (get_info_file); + + async_job_end (directory, "file info"); + nautilus_directory_async_state_changed (directory); + + nautilus_directory_unref (directory); + + get_info_state_free (state); } static void file_info_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->get_info_in_progress != NULL) { - file = directory->details->get_info_file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, lacks_info, REQUEST_FILE_INFO)) { - return; - } - } + if (directory->details->get_info_in_progress != NULL) + { + file = directory->details->get_info_file; + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, lacks_info, REQUEST_FILE_INFO)) + { + return; + } + } - /* The info is not wanted, so stop it. */ - file_info_cancel (directory); - } + /* The info is not wanted, so stop it. */ + file_info_cancel (directory); + } } static void file_info_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - GetInfoState *state; - - file_info_stop (directory); - - if (directory->details->get_info_in_progress != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, lacks_info, REQUEST_FILE_INFO)) { - return; - } - *doing_io = TRUE; - - if (!async_job_start (directory, "file info")) { - return; - } - - directory->details->get_info_file = file; - file->details->get_info_failed = FALSE; - if (file->details->get_info_error) { - g_error_free (file->details->get_info_error); - file->details->get_info_error = NULL; - } - - state = g_new (GetInfoState, 1); - state->directory = directory; - state->cancellable = g_cancellable_new (); - - directory->details->get_info_in_progress = state; - - location = nautilus_file_get_location (file); - g_file_query_info_async (location, - NAUTILUS_FILE_DEFAULT_ATTRIBUTES, - 0, - G_PRIORITY_DEFAULT, - state->cancellable, query_info_callback, state); - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + GetInfoState *state; + + file_info_stop (directory); + + if (directory->details->get_info_in_progress != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, lacks_info, REQUEST_FILE_INFO)) + { + return; + } + *doing_io = TRUE; + + if (!async_job_start (directory, "file info")) + { + return; + } + + directory->details->get_info_file = file; + file->details->get_info_failed = FALSE; + if (file->details->get_info_error) + { + g_error_free (file->details->get_info_error); + file->details->get_info_error = NULL; + } + + state = g_new (GetInfoState, 1); + state->directory = directory; + state->cancellable = g_cancellable_new (); + + directory->details->get_info_in_progress = state; + + location = nautilus_file_get_location (file); + g_file_query_info_async (location, + NAUTILUS_FILE_DEFAULT_ATTRIBUTES, + 0, + G_PRIORITY_DEFAULT, + state->cancellable, query_info_callback, state); + g_object_unref (location); } static gboolean is_link_trusted (NautilusFile *file, - gboolean is_launcher) -{ - GFile *location; - gboolean res; - - if (!is_launcher) { - return TRUE; - } - - if (nautilus_file_can_execute (file)) { - return TRUE; - } - - res = FALSE; - - if (nautilus_file_is_local (file)) { - location = nautilus_file_get_location (file); - res = nautilus_is_in_system_dir (location); - g_object_unref (location); - } - - return res; + gboolean is_launcher) +{ + GFile *location; + gboolean res; + + if (!is_launcher) + { + return TRUE; + } + + if (nautilus_file_can_execute (file)) + { + return TRUE; + } + + res = FALSE; + + if (nautilus_file_is_local (file)) + { + location = nautilus_file_get_location (file); + res = nautilus_is_in_system_dir (location); + g_object_unref (location); + } + + return res; } static void link_info_done (NautilusDirectory *directory, - NautilusFile *file, - const char *uri, - const char *name, - GIcon *icon, - gboolean is_launcher, - gboolean is_foreign) -{ - gboolean is_trusted; - - file->details->link_info_is_up_to_date = TRUE; - - is_trusted = is_link_trusted (file, is_launcher); - - if (is_trusted) { - nautilus_file_set_display_name (file, name, name, TRUE); - } else { - nautilus_file_set_display_name (file, NULL, NULL, TRUE); - } - - file->details->got_link_info = TRUE; - g_clear_object (&file->details->custom_icon); - - if (uri) { - g_free (file->details->activation_uri); - file->details->activation_uri = NULL; - file->details->got_custom_activation_uri = TRUE; - file->details->activation_uri = g_strdup (uri); - } - if (is_trusted && (icon != NULL)) { - file->details->custom_icon = g_object_ref (icon); - } - file->details->is_launcher = is_launcher; - file->details->is_foreign_link = is_foreign; - file->details->is_trusted_link = is_trusted; - - nautilus_directory_async_state_changed (directory); + NautilusFile *file, + const char *uri, + const char *name, + GIcon *icon, + gboolean is_launcher, + gboolean is_foreign) +{ + gboolean is_trusted; + + file->details->link_info_is_up_to_date = TRUE; + + is_trusted = is_link_trusted (file, is_launcher); + + if (is_trusted) + { + nautilus_file_set_display_name (file, name, name, TRUE); + } + else + { + nautilus_file_set_display_name (file, NULL, NULL, TRUE); + } + + file->details->got_link_info = TRUE; + g_clear_object (&file->details->custom_icon); + + if (uri) + { + g_free (file->details->activation_uri); + file->details->activation_uri = NULL; + file->details->got_custom_activation_uri = TRUE; + file->details->activation_uri = g_strdup (uri); + } + if (is_trusted && (icon != NULL)) + { + file->details->custom_icon = g_object_ref (icon); + } + file->details->is_launcher = is_launcher; + file->details->is_foreign_link = is_foreign; + file->details->is_trusted_link = is_trusted; + + nautilus_directory_async_state_changed (directory); } static void link_info_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->link_info_read_state != NULL) { - file = directory->details->link_info_read_state->file; + if (directory->details->link_info_read_state != NULL) + { + file = directory->details->link_info_read_state->file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - lacks_link_info, - REQUEST_LINK_INFO)) { - return; - } - } + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_link_info, + REQUEST_LINK_INFO)) + { + return; + } + } - /* The link info is not wanted, so stop it. */ - link_info_cancel (directory); - } + /* The link info is not wanted, so stop it. */ + link_info_cancel (directory); + } } static void link_info_got_data (NautilusDirectory *directory, - NautilusFile *file, - gboolean result, - goffset bytes_read, - char *file_contents) -{ - char *link_uri, *uri, *name; - GIcon *icon; - gboolean is_launcher; - gboolean is_foreign; - - nautilus_directory_ref (directory); - - uri = NULL; - name = NULL; - icon = NULL; - is_launcher = FALSE; - is_foreign = FALSE; - - /* Handle the case where we read the Nautilus link. */ - if (result) { - link_uri = nautilus_file_get_uri (file); - nautilus_link_get_link_info_given_file_contents (file_contents, bytes_read, link_uri, - &uri, &name, &icon, &is_launcher, &is_foreign); - g_free (link_uri); - } else { - /* FIXME bugzilla.gnome.org 42433: We should report this error to the user. */ - } - - nautilus_file_ref (file); - link_info_done (directory, file, uri, name, icon, is_launcher, is_foreign); - nautilus_file_changed (file); - nautilus_file_unref (file); - - g_free (uri); - g_free (name); - - if (icon != NULL) { - g_object_unref (icon); - } - - nautilus_directory_unref (directory); + NautilusFile *file, + gboolean result, + goffset bytes_read, + char *file_contents) +{ + char *link_uri, *uri, *name; + GIcon *icon; + gboolean is_launcher; + gboolean is_foreign; + + nautilus_directory_ref (directory); + + uri = NULL; + name = NULL; + icon = NULL; + is_launcher = FALSE; + is_foreign = FALSE; + + /* Handle the case where we read the Nautilus link. */ + if (result) + { + link_uri = nautilus_file_get_uri (file); + nautilus_link_get_link_info_given_file_contents (file_contents, bytes_read, link_uri, + &uri, &name, &icon, &is_launcher, &is_foreign); + g_free (link_uri); + } + else + { + /* FIXME bugzilla.gnome.org 42433: We should report this error to the user. */ + } + + nautilus_file_ref (file); + link_info_done (directory, file, uri, name, icon, is_launcher, is_foreign); + nautilus_file_changed (file); + nautilus_file_unref (file); + + g_free (uri); + g_free (name); + + if (icon != NULL) + { + g_object_unref (icon); + } + + nautilus_directory_unref (directory); } static void link_info_read_state_free (LinkInfoReadState *state) { - g_object_unref (state->cancellable); - g_free (state); + g_object_unref (state->cancellable); + g_free (state); } static void -link_info_nautilus_link_read_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) +link_info_nautilus_link_read_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) { - LinkInfoReadState *state; - gsize file_size; - char *file_contents; - gboolean result; - NautilusDirectory *directory; + LinkInfoReadState *state; + gsize file_size; + char *file_contents; + gboolean result; + NautilusDirectory *directory; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + link_info_read_state_free (state); + return; + } + + directory = nautilus_directory_ref (state->directory); - state = user_data; + result = g_file_load_contents_finish (G_FILE (source_object), + res, + &file_contents, &file_size, + NULL, NULL); - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - link_info_read_state_free (state); - return; - } + state->directory->details->link_info_read_state = NULL; + async_job_end (state->directory, "link info"); - directory = nautilus_directory_ref (state->directory); + link_info_got_data (state->directory, state->file, result, file_size, file_contents); - result = g_file_load_contents_finish (G_FILE (source_object), - res, - &file_contents, &file_size, - NULL, NULL); + if (result) + { + g_free (file_contents); + } - state->directory->details->link_info_read_state = NULL; - async_job_end (state->directory, "link info"); - - link_info_got_data (state->directory, state->file, result, file_size, file_contents); + link_info_read_state_free (state); - if (result) { - g_free (file_contents); - } - - link_info_read_state_free (state); - - nautilus_directory_unref (directory); + nautilus_directory_unref (directory); } static void link_info_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - gboolean nautilus_style_link; - LinkInfoReadState *state; - - if (directory->details->link_info_read_state != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - lacks_link_info, - REQUEST_LINK_INFO)) { - return; - } - *doing_io = TRUE; - - /* Figure out if it is a link. */ - nautilus_style_link = nautilus_file_is_nautilus_link (file); - location = nautilus_file_get_location (file); - - /* If it's not a link we are done. If it is, we need to read it. */ - if (!nautilus_style_link) { - link_info_done (directory, file, NULL, NULL, NULL, FALSE, FALSE); - } else { - if (!async_job_start (directory, "link info")) { - g_object_unref (location); - return; - } - - state = g_new0 (LinkInfoReadState, 1); - state->directory = directory; - state->file = file; - state->cancellable = g_cancellable_new (); - - directory->details->link_info_read_state = state; - - g_file_load_contents_async (location, - state->cancellable, - link_info_nautilus_link_read_callback, - state); - } - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + gboolean nautilus_style_link; + LinkInfoReadState *state; + + if (directory->details->link_info_read_state != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + lacks_link_info, + REQUEST_LINK_INFO)) + { + return; + } + *doing_io = TRUE; + + /* Figure out if it is a link. */ + nautilus_style_link = nautilus_file_is_nautilus_link (file); + location = nautilus_file_get_location (file); + + /* If it's not a link we are done. If it is, we need to read it. */ + if (!nautilus_style_link) + { + link_info_done (directory, file, NULL, NULL, NULL, FALSE, FALSE); + } + else + { + if (!async_job_start (directory, "link info")) + { + g_object_unref (location); + return; + } + + state = g_new0 (LinkInfoReadState, 1); + state->directory = directory; + state->file = file; + state->cancellable = g_cancellable_new (); + + directory->details->link_info_read_state = state; + + g_file_load_contents_async (location, + state->cancellable, + link_info_nautilus_link_read_callback, + state); + } + g_object_unref (location); } static void thumbnail_done (NautilusDirectory *directory, - NautilusFile *file, - GdkPixbuf *pixbuf, - gboolean tried_original) -{ - const char *thumb_mtime_str; - time_t thumb_mtime = 0; - - file->details->thumbnail_is_up_to_date = TRUE; - file->details->thumbnail_tried_original = tried_original; - if (file->details->thumbnail) { - g_object_unref (file->details->thumbnail); - file->details->thumbnail = NULL; - } - if (file->details->scaled_thumbnail) { - g_object_unref (file->details->scaled_thumbnail); - file->details->scaled_thumbnail = NULL; - } - - if (pixbuf) { - if (tried_original) { - thumb_mtime = file->details->mtime; - } else { - thumb_mtime_str = gdk_pixbuf_get_option (pixbuf, "tEXt::Thumb::MTime"); - if (thumb_mtime_str) { - thumb_mtime = atol (thumb_mtime_str); - } - } - - if (thumb_mtime == 0 || - thumb_mtime == file->details->mtime) { - file->details->thumbnail = g_object_ref (pixbuf); - file->details->thumbnail_mtime = thumb_mtime; - } else { - g_free (file->details->thumbnail_path); - file->details->thumbnail_path = NULL; - } - } - - nautilus_directory_async_state_changed (directory); + NautilusFile *file, + GdkPixbuf *pixbuf, + gboolean tried_original) +{ + const char *thumb_mtime_str; + time_t thumb_mtime = 0; + + file->details->thumbnail_is_up_to_date = TRUE; + file->details->thumbnail_tried_original = tried_original; + if (file->details->thumbnail) + { + g_object_unref (file->details->thumbnail); + file->details->thumbnail = NULL; + } + if (file->details->scaled_thumbnail) + { + g_object_unref (file->details->scaled_thumbnail); + file->details->scaled_thumbnail = NULL; + } + + if (pixbuf) + { + if (tried_original) + { + thumb_mtime = file->details->mtime; + } + else + { + thumb_mtime_str = gdk_pixbuf_get_option (pixbuf, "tEXt::Thumb::MTime"); + if (thumb_mtime_str) + { + thumb_mtime = atol (thumb_mtime_str); + } + } + + if (thumb_mtime == 0 || + thumb_mtime == file->details->mtime) + { + file->details->thumbnail = g_object_ref (pixbuf); + file->details->thumbnail_mtime = thumb_mtime; + } + else + { + g_free (file->details->thumbnail_path); + file->details->thumbnail_path = NULL; + } + } + + nautilus_directory_async_state_changed (directory); } static void thumbnail_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->thumbnail_state != NULL) { - file = directory->details->thumbnail_state->file; + if (directory->details->thumbnail_state != NULL) + { + file = directory->details->thumbnail_state->file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - lacks_thumbnail, - REQUEST_THUMBNAIL)) { - return; - } - } + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_thumbnail, + REQUEST_THUMBNAIL)) + { + return; + } + } - /* The link info is not wanted, so stop it. */ - thumbnail_cancel (directory); - } + /* The link info is not wanted, so stop it. */ + thumbnail_cancel (directory); + } } static void thumbnail_got_pixbuf (NautilusDirectory *directory, - NautilusFile *file, - GdkPixbuf *pixbuf, - gboolean tried_original) + NautilusFile *file, + GdkPixbuf *pixbuf, + gboolean tried_original) { - nautilus_directory_ref (directory); + nautilus_directory_ref (directory); - nautilus_file_ref (file); - thumbnail_done (directory, file, pixbuf, tried_original); - nautilus_file_changed (file); - nautilus_file_unref (file); - - if (pixbuf) { - g_object_unref (pixbuf); - } + nautilus_file_ref (file); + thumbnail_done (directory, file, pixbuf, tried_original); + nautilus_file_changed (file); + nautilus_file_unref (file); - nautilus_directory_unref (directory); + if (pixbuf) + { + g_object_unref (pixbuf); + } + + nautilus_directory_unref (directory); } static void thumbnail_state_free (ThumbnailState *state) { - g_object_unref (state->cancellable); - g_free (state); + g_object_unref (state->cancellable); + g_free (state); } extern int cached_thumbnail_size; @@ -3550,733 +3939,806 @@ extern int cached_thumbnail_size; /* scale very large images down to the max. size we need */ static void thumbnail_loader_size_prepared (GdkPixbufLoader *loader, - int width, - int height, - gpointer user_data) -{ - int max_thumbnail_size; - double aspect_ratio; - - aspect_ratio = ((double) width) / height; - - /* cf. nautilus_file_get_icon() */ - max_thumbnail_size = NAUTILUS_CANVAS_ICON_SIZE_LARGER * cached_thumbnail_size / NAUTILUS_CANVAS_ICON_SIZE_SMALL; - if (MAX (width, height) > max_thumbnail_size) { - if (width > height) { - width = max_thumbnail_size; - height = width / aspect_ratio; - } else { - height = max_thumbnail_size; - width = height * aspect_ratio; - } - - gdk_pixbuf_loader_set_size (loader, width, height); - } + int width, + int height, + gpointer user_data) +{ + int max_thumbnail_size; + double aspect_ratio; + + aspect_ratio = ((double) width) / height; + + /* cf. nautilus_file_get_icon() */ + max_thumbnail_size = NAUTILUS_CANVAS_ICON_SIZE_LARGER * cached_thumbnail_size / NAUTILUS_CANVAS_ICON_SIZE_SMALL; + if (MAX (width, height) > max_thumbnail_size) + { + if (width > height) + { + width = max_thumbnail_size; + height = width / aspect_ratio; + } + else + { + height = max_thumbnail_size; + width = height * aspect_ratio; + } + + gdk_pixbuf_loader_set_size (loader, width, height); + } } static GdkPixbuf * -get_pixbuf_for_content (goffset file_len, - char *file_contents) -{ - gboolean res; - GdkPixbuf *pixbuf, *pixbuf2; - GdkPixbufLoader *loader; - gsize chunk_len; - pixbuf = NULL; - - loader = gdk_pixbuf_loader_new (); - g_signal_connect (loader, "size-prepared", - G_CALLBACK (thumbnail_loader_size_prepared), - NULL); - - /* For some reason we have to write in chunks, or gdk-pixbuf fails */ - res = TRUE; - while (res && file_len > 0) { - chunk_len = file_len; - res = gdk_pixbuf_loader_write (loader, (guchar *) file_contents, chunk_len, NULL); - file_contents += chunk_len; - file_len -= chunk_len; - } - if (res) { - res = gdk_pixbuf_loader_close (loader, NULL); - } - if (res) { - pixbuf = g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)); - } - g_object_unref (G_OBJECT (loader)); - - if (pixbuf) { - pixbuf2 = gdk_pixbuf_apply_embedded_orientation (pixbuf); - g_object_unref (pixbuf); - pixbuf = pixbuf2; - } - return pixbuf; +get_pixbuf_for_content (goffset file_len, + char *file_contents) +{ + gboolean res; + GdkPixbuf *pixbuf, *pixbuf2; + GdkPixbufLoader *loader; + gsize chunk_len; + pixbuf = NULL; + + loader = gdk_pixbuf_loader_new (); + g_signal_connect (loader, "size-prepared", + G_CALLBACK (thumbnail_loader_size_prepared), + NULL); + + /* For some reason we have to write in chunks, or gdk-pixbuf fails */ + res = TRUE; + while (res && file_len > 0) + { + chunk_len = file_len; + res = gdk_pixbuf_loader_write (loader, (guchar *) file_contents, chunk_len, NULL); + file_contents += chunk_len; + file_len -= chunk_len; + } + if (res) + { + res = gdk_pixbuf_loader_close (loader, NULL); + } + if (res) + { + pixbuf = g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)); + } + g_object_unref (G_OBJECT (loader)); + + if (pixbuf) + { + pixbuf2 = gdk_pixbuf_apply_embedded_orientation (pixbuf); + g_object_unref (pixbuf); + pixbuf = pixbuf2; + } + return pixbuf; } static void -thumbnail_read_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - ThumbnailState *state; - gsize file_size; - char *file_contents; - gboolean result; - NautilusDirectory *directory; - GdkPixbuf *pixbuf; - GFile *location; - - state = user_data; - - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - thumbnail_state_free (state); - return; - } - - directory = nautilus_directory_ref (state->directory); - - result = g_file_load_contents_finish (G_FILE (source_object), - res, - &file_contents, &file_size, - NULL, NULL); - - pixbuf = NULL; - if (result) { - pixbuf = get_pixbuf_for_content (file_size, file_contents); - g_free (file_contents); - } - - if (pixbuf == NULL && state->trying_original) { - state->trying_original = FALSE; - - location = g_file_new_for_path (state->file->details->thumbnail_path); - g_file_load_contents_async (location, - state->cancellable, - thumbnail_read_callback, - state); - g_object_unref (location); - } else { - state->directory->details->thumbnail_state = NULL; - async_job_end (state->directory, "thumbnail"); - - thumbnail_got_pixbuf (state->directory, state->file, pixbuf, state->tried_original); - - thumbnail_state_free (state); - } - - nautilus_directory_unref (directory); +thumbnail_read_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + ThumbnailState *state; + gsize file_size; + char *file_contents; + gboolean result; + NautilusDirectory *directory; + GdkPixbuf *pixbuf; + GFile *location; + + state = user_data; + + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + thumbnail_state_free (state); + return; + } + + directory = nautilus_directory_ref (state->directory); + + result = g_file_load_contents_finish (G_FILE (source_object), + res, + &file_contents, &file_size, + NULL, NULL); + + pixbuf = NULL; + if (result) + { + pixbuf = get_pixbuf_for_content (file_size, file_contents); + g_free (file_contents); + } + + if (pixbuf == NULL && state->trying_original) + { + state->trying_original = FALSE; + + location = g_file_new_for_path (state->file->details->thumbnail_path); + g_file_load_contents_async (location, + state->cancellable, + thumbnail_read_callback, + state); + g_object_unref (location); + } + else + { + state->directory->details->thumbnail_state = NULL; + async_job_end (state->directory, "thumbnail"); + + thumbnail_got_pixbuf (state->directory, state->file, pixbuf, state->tried_original); + + thumbnail_state_free (state); + } + + nautilus_directory_unref (directory); } static void thumbnail_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - ThumbnailState *state; - - if (directory->details->thumbnail_state != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - lacks_thumbnail, - REQUEST_THUMBNAIL)) { - return; - } - *doing_io = TRUE; - - if (!async_job_start (directory, "thumbnail")) { - return; - } - - state = g_new0 (ThumbnailState, 1); - state->directory = directory; - state->file = file; - state->cancellable = g_cancellable_new (); - - if (file->details->thumbnail_wants_original) { - state->tried_original = TRUE; - state->trying_original = TRUE; - location = nautilus_file_get_location (file); - } else { - location = g_file_new_for_path (file->details->thumbnail_path); - } - - directory->details->thumbnail_state = state; - - g_file_load_contents_async (location, - state->cancellable, - thumbnail_read_callback, - state); - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + ThumbnailState *state; + + if (directory->details->thumbnail_state != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + lacks_thumbnail, + REQUEST_THUMBNAIL)) + { + return; + } + *doing_io = TRUE; + + if (!async_job_start (directory, "thumbnail")) + { + return; + } + + state = g_new0 (ThumbnailState, 1); + state->directory = directory; + state->file = file; + state->cancellable = g_cancellable_new (); + + if (file->details->thumbnail_wants_original) + { + state->tried_original = TRUE; + state->trying_original = TRUE; + location = nautilus_file_get_location (file); + } + else + { + location = g_file_new_for_path (file->details->thumbnail_path); + } + + directory->details->thumbnail_state = state; + + g_file_load_contents_async (location, + state->cancellable, + thumbnail_read_callback, + state); + g_object_unref (location); } static void mount_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->mount_state != NULL) { - file = directory->details->mount_state->file; + if (directory->details->mount_state != NULL) + { + file = directory->details->mount_state->file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - lacks_mount, - REQUEST_MOUNT)) { - return; - } - } + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_mount, + REQUEST_MOUNT)) + { + return; + } + } - /* The link info is not wanted, so stop it. */ - mount_cancel (directory); - } + /* The link info is not wanted, so stop it. */ + mount_cancel (directory); + } } static void mount_state_free (MountState *state) { - g_object_unref (state->cancellable); - g_free (state); + g_object_unref (state->cancellable); + g_free (state); } static void -got_mount (MountState *state, GMount *mount) +got_mount (MountState *state, + GMount *mount) { - NautilusDirectory *directory; - NautilusFile *file; - - directory = nautilus_directory_ref (state->directory); + NautilusDirectory *directory; + NautilusFile *file; + + directory = nautilus_directory_ref (state->directory); - state->directory->details->mount_state = NULL; - async_job_end (state->directory, "mount"); - - file = nautilus_file_ref (state->file); + state->directory->details->mount_state = NULL; + async_job_end (state->directory, "mount"); - file->details->mount_is_up_to_date = TRUE; - nautilus_file_set_mount (file, mount); + file = nautilus_file_ref (state->file); - nautilus_directory_async_state_changed (directory); - nautilus_file_changed (file); - - nautilus_file_unref (file); - - nautilus_directory_unref (directory); - - mount_state_free (state); + file->details->mount_is_up_to_date = TRUE; + nautilus_file_set_mount (file, mount); + nautilus_directory_async_state_changed (directory); + nautilus_file_changed (file); + + nautilus_file_unref (file); + + nautilus_directory_unref (directory); + + mount_state_free (state); } static void -find_enclosing_mount_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GMount *mount; - MountState *state; - GFile *location, *root; - - state = user_data; - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - mount_state_free (state); - return; - } - - mount = g_file_find_enclosing_mount_finish (G_FILE (source_object), - res, NULL); - - if (mount) { - root = g_mount_get_root (mount); - location = nautilus_file_get_location (state->file); - if (!g_file_equal (location, root)) { - g_object_unref (mount); - mount = NULL; - } - g_object_unref (root); - g_object_unref (location); - } - - got_mount (state, mount); - - if (mount) { - g_object_unref (mount); - } +find_enclosing_mount_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GMount *mount; + MountState *state; + GFile *location, *root; + + state = user_data; + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + mount_state_free (state); + return; + } + + mount = g_file_find_enclosing_mount_finish (G_FILE (source_object), + res, NULL); + + if (mount) + { + root = g_mount_get_root (mount); + location = nautilus_file_get_location (state->file); + if (!g_file_equal (location, root)) + { + g_object_unref (mount); + mount = NULL; + } + g_object_unref (root); + g_object_unref (location); + } + + got_mount (state, mount); + + if (mount) + { + g_object_unref (mount); + } } static GMount * get_mount_at (GFile *target) { - GVolumeMonitor *monitor; - GFile *root; - GList *mounts, *l; - GMount *found; - - monitor = g_volume_monitor_get (); - mounts = g_volume_monitor_get_mounts (monitor); + GVolumeMonitor *monitor; + GFile *root; + GList *mounts, *l; + GMount *found; + + monitor = g_volume_monitor_get (); + mounts = g_volume_monitor_get_mounts (monitor); + + found = NULL; + for (l = mounts; l != NULL; l = l->next) + { + GMount *mount = G_MOUNT (l->data); + + if (g_mount_is_shadowed (mount)) + { + continue; + } - found = NULL; - for (l = mounts; l != NULL; l = l->next) { - GMount *mount = G_MOUNT (l->data); + root = g_mount_get_root (mount); - if (g_mount_is_shadowed (mount)) - continue; + if (g_file_equal (target, root)) + { + found = g_object_ref (mount); + break; + } - root = g_mount_get_root (mount); + g_object_unref (root); + } - if (g_file_equal (target, root)) { - found = g_object_ref (mount); - break; - } - - g_object_unref (root); - } + g_list_free_full (mounts, g_object_unref); - g_list_free_full (mounts, g_object_unref); - - g_object_unref (monitor); + g_object_unref (monitor); - return found; + return found; } static void mount_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - MountState *state; - - if (directory->details->mount_state != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - lacks_mount, - REQUEST_MOUNT)) { - return; - } - *doing_io = TRUE; - - if (!async_job_start (directory, "mount")) { - return; - } - - state = g_new0 (MountState, 1); - state->directory = directory; - state->file = file; - state->cancellable = g_cancellable_new (); - - location = nautilus_file_get_location (file); - - directory->details->mount_state = state; - - if (file->details->type == G_FILE_TYPE_MOUNTABLE) { - GFile *target; - GMount *mount; - - mount = NULL; - target = nautilus_file_get_activation_location (file); - if (target != NULL) { - mount = get_mount_at (target); - g_object_unref (target); - } - - got_mount (state, mount); - - if (mount) { - g_object_unref (mount); - } - } else { - g_file_find_enclosing_mount_async (location, - G_PRIORITY_DEFAULT, - state->cancellable, - find_enclosing_mount_callback, - state); - } - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + MountState *state; + + if (directory->details->mount_state != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + lacks_mount, + REQUEST_MOUNT)) + { + return; + } + *doing_io = TRUE; + + if (!async_job_start (directory, "mount")) + { + return; + } + + state = g_new0 (MountState, 1); + state->directory = directory; + state->file = file; + state->cancellable = g_cancellable_new (); + + location = nautilus_file_get_location (file); + + directory->details->mount_state = state; + + if (file->details->type == G_FILE_TYPE_MOUNTABLE) + { + GFile *target; + GMount *mount; + + mount = NULL; + target = nautilus_file_get_activation_location (file); + if (target != NULL) + { + mount = get_mount_at (target); + g_object_unref (target); + } + + got_mount (state, mount); + + if (mount) + { + g_object_unref (mount); + } + } + else + { + g_file_find_enclosing_mount_async (location, + G_PRIORITY_DEFAULT, + state->cancellable, + find_enclosing_mount_callback, + state); + } + g_object_unref (location); } static void filesystem_info_cancel (NautilusDirectory *directory) { - if (directory->details->filesystem_info_state != NULL) { - g_cancellable_cancel (directory->details->filesystem_info_state->cancellable); - directory->details->filesystem_info_state->directory = NULL; - directory->details->filesystem_info_state = NULL; - async_job_end (directory, "filesystem info"); - } + if (directory->details->filesystem_info_state != NULL) + { + g_cancellable_cancel (directory->details->filesystem_info_state->cancellable); + directory->details->filesystem_info_state->directory = NULL; + directory->details->filesystem_info_state = NULL; + async_job_end (directory, "filesystem info"); + } } static void filesystem_info_stop (NautilusDirectory *directory) { - NautilusFile *file; + NautilusFile *file; - if (directory->details->filesystem_info_state != NULL) { - file = directory->details->filesystem_info_state->file; + if (directory->details->filesystem_info_state != NULL) + { + file = directory->details->filesystem_info_state->file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, - lacks_filesystem_info, - REQUEST_FILESYSTEM_INFO)) { - return; - } - } + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, + lacks_filesystem_info, + REQUEST_FILESYSTEM_INFO)) + { + return; + } + } - /* The filesystem info is not wanted, so stop it. */ - filesystem_info_cancel (directory); - } + /* The filesystem info is not wanted, so stop it. */ + filesystem_info_cancel (directory); + } } static void filesystem_info_state_free (FilesystemInfoState *state) { - g_object_unref (state->cancellable); - g_free (state); + g_object_unref (state->cancellable); + g_free (state); } static void -got_filesystem_info (FilesystemInfoState *state, GFileInfo *info) -{ - NautilusDirectory *directory; - NautilusFile *file; - const char *filesystem_type; - - /* careful here, info may be NULL */ - - directory = nautilus_directory_ref (state->directory); - - state->directory->details->filesystem_info_state = NULL; - async_job_end (state->directory, "filesystem info"); - - file = nautilus_file_ref (state->file); - - file->details->filesystem_info_is_up_to_date = TRUE; - if (info != NULL) { - file->details->filesystem_use_preview = - g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW); - file->details->filesystem_readonly = - g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY); - filesystem_type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE); - if (g_strcmp0 (eel_ref_str_peek (file->details->filesystem_type), filesystem_type) != 0) { - eel_ref_str_unref (file->details->filesystem_type); - file->details->filesystem_type = eel_ref_str_get_unique (filesystem_type); - } - } - - nautilus_directory_async_state_changed (directory); - nautilus_file_changed (file); - - nautilus_file_unref (file); - - nautilus_directory_unref (directory); - - filesystem_info_state_free (state); +got_filesystem_info (FilesystemInfoState *state, + GFileInfo *info) +{ + NautilusDirectory *directory; + NautilusFile *file; + const char *filesystem_type; + + /* careful here, info may be NULL */ + + directory = nautilus_directory_ref (state->directory); + + state->directory->details->filesystem_info_state = NULL; + async_job_end (state->directory, "filesystem info"); + + file = nautilus_file_ref (state->file); + + file->details->filesystem_info_is_up_to_date = TRUE; + if (info != NULL) + { + file->details->filesystem_use_preview = + g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW); + file->details->filesystem_readonly = + g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY); + filesystem_type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE); + if (g_strcmp0 (eel_ref_str_peek (file->details->filesystem_type), filesystem_type) != 0) + { + eel_ref_str_unref (file->details->filesystem_type); + file->details->filesystem_type = eel_ref_str_get_unique (filesystem_type); + } + } + + nautilus_directory_async_state_changed (directory); + nautilus_file_changed (file); + + nautilus_file_unref (file); + + nautilus_directory_unref (directory); + + filesystem_info_state_free (state); } static void -query_filesystem_info_callback (GObject *source_object, - GAsyncResult *res, - gpointer user_data) +query_filesystem_info_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) { - GFileInfo *info; - FilesystemInfoState *state; + GFileInfo *info; + FilesystemInfoState *state; - state = user_data; - if (state->directory == NULL) { - /* Operation was cancelled. Bail out */ - filesystem_info_state_free (state); - return; - } + state = user_data; + if (state->directory == NULL) + { + /* Operation was cancelled. Bail out */ + filesystem_info_state_free (state); + return; + } - info = g_file_query_filesystem_info_finish (G_FILE (source_object), res, NULL); + info = g_file_query_filesystem_info_finish (G_FILE (source_object), res, NULL); - got_filesystem_info (state, info); + got_filesystem_info (state, info); - if (info != NULL) { - g_object_unref (info); - } + if (info != NULL) + { + g_object_unref (info); + } } static void filesystem_info_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - GFile *location; - FilesystemInfoState *state; - - if (directory->details->filesystem_info_state != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, - lacks_filesystem_info, - REQUEST_FILESYSTEM_INFO)) { - return; - } - *doing_io = TRUE; - - if (!async_job_start (directory, "filesystem info")) { - return; - } - - state = g_new0 (FilesystemInfoState, 1); - state->directory = directory; - state->file = file; - state->cancellable = g_cancellable_new (); - - location = nautilus_file_get_location (file); - - directory->details->filesystem_info_state = state; - - g_file_query_filesystem_info_async (location, - G_FILE_ATTRIBUTE_FILESYSTEM_READONLY "," - G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW "," - G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, - G_PRIORITY_DEFAULT, - state->cancellable, - query_filesystem_info_callback, - state); - g_object_unref (location); + NautilusFile *file, + gboolean *doing_io) +{ + GFile *location; + FilesystemInfoState *state; + + if (directory->details->filesystem_info_state != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, + lacks_filesystem_info, + REQUEST_FILESYSTEM_INFO)) + { + return; + } + *doing_io = TRUE; + + if (!async_job_start (directory, "filesystem info")) + { + return; + } + + state = g_new0 (FilesystemInfoState, 1); + state->directory = directory; + state->file = file; + state->cancellable = g_cancellable_new (); + + location = nautilus_file_get_location (file); + + directory->details->filesystem_info_state = state; + + g_file_query_filesystem_info_async (location, + G_FILE_ATTRIBUTE_FILESYSTEM_READONLY "," + G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW "," + G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, + G_PRIORITY_DEFAULT, + state->cancellable, + query_filesystem_info_callback, + state); + g_object_unref (location); } static void extension_info_cancel (NautilusDirectory *directory) { - if (directory->details->extension_info_in_progress != NULL) { - if (directory->details->extension_info_idle) { - g_source_remove (directory->details->extension_info_idle); - } else { - nautilus_info_provider_cancel_update - (directory->details->extension_info_provider, - directory->details->extension_info_in_progress); - } + if (directory->details->extension_info_in_progress != NULL) + { + if (directory->details->extension_info_idle) + { + g_source_remove (directory->details->extension_info_idle); + } + else + { + nautilus_info_provider_cancel_update + (directory->details->extension_info_provider, + directory->details->extension_info_in_progress); + } - directory->details->extension_info_in_progress = NULL; - directory->details->extension_info_file = NULL; - directory->details->extension_info_provider = NULL; - directory->details->extension_info_idle = 0; + directory->details->extension_info_in_progress = NULL; + directory->details->extension_info_file = NULL; + directory->details->extension_info_provider = NULL; + directory->details->extension_info_idle = 0; - async_job_end (directory, "extension info"); - } + async_job_end (directory, "extension info"); + } } - + static void extension_info_stop (NautilusDirectory *directory) { - if (directory->details->extension_info_in_progress != NULL) { - NautilusFile *file; + if (directory->details->extension_info_in_progress != NULL) + { + NautilusFile *file; - file = directory->details->extension_info_file; - if (file != NULL) { - g_assert (NAUTILUS_IS_FILE (file)); - g_assert (file->details->directory == directory); - if (is_needy (file, lacks_extension_info, REQUEST_EXTENSION_INFO)) { - return; - } - } + file = directory->details->extension_info_file; + if (file != NULL) + { + g_assert (NAUTILUS_IS_FILE (file)); + g_assert (file->details->directory == directory); + if (is_needy (file, lacks_extension_info, REQUEST_EXTENSION_INFO)) + { + return; + } + } - /* The info is not wanted, so stop it. */ - extension_info_cancel (directory); - } + /* The info is not wanted, so stop it. */ + extension_info_cancel (directory); + } } static void -finish_info_provider (NautilusDirectory *directory, - NautilusFile *file, - NautilusInfoProvider *provider) +finish_info_provider (NautilusDirectory *directory, + NautilusFile *file, + NautilusInfoProvider *provider) { - file->details->pending_info_providers = - g_list_remove (file->details->pending_info_providers, - provider); - g_object_unref (provider); + file->details->pending_info_providers = + g_list_remove (file->details->pending_info_providers, + provider); + g_object_unref (provider); - nautilus_directory_async_state_changed (directory); + nautilus_directory_async_state_changed (directory); - if (file->details->pending_info_providers == NULL) { - nautilus_file_info_providers_done (file); - } + if (file->details->pending_info_providers == NULL) + { + nautilus_file_info_providers_done (file); + } } static gboolean info_provider_idle_callback (gpointer user_data) { - InfoProviderResponse *response; - NautilusDirectory *directory; + InfoProviderResponse *response; + NautilusDirectory *directory; - response = user_data; - directory = response->directory; + response = user_data; + directory = response->directory; - if (response->handle != directory->details->extension_info_in_progress - || response->provider != directory->details->extension_info_provider) { - g_warning ("Unexpected plugin response. This probably indicates a bug in a Nautilus extension: handle=%p", response->handle); - } else { - NautilusFile *file; - async_job_end (directory, "extension info"); + if (response->handle != directory->details->extension_info_in_progress + || response->provider != directory->details->extension_info_provider) + { + g_warning ("Unexpected plugin response. This probably indicates a bug in a Nautilus extension: handle=%p", response->handle); + } + else + { + NautilusFile *file; + async_job_end (directory, "extension info"); - file = directory->details->extension_info_file; + file = directory->details->extension_info_file; - directory->details->extension_info_file = NULL; - directory->details->extension_info_provider = NULL; - directory->details->extension_info_in_progress = NULL; - directory->details->extension_info_idle = 0; - - finish_info_provider (directory, file, response->provider); - } + directory->details->extension_info_file = NULL; + directory->details->extension_info_provider = NULL; + directory->details->extension_info_in_progress = NULL; + directory->details->extension_info_idle = 0; - return FALSE; + finish_info_provider (directory, file, response->provider); + } + + return FALSE; } static void -info_provider_callback (NautilusInfoProvider *provider, - NautilusOperationHandle *handle, - NautilusOperationResult result, - gpointer user_data) +info_provider_callback (NautilusInfoProvider *provider, + NautilusOperationHandle *handle, + NautilusOperationResult result, + gpointer user_data) { - InfoProviderResponse *response; - - response = g_new0 (InfoProviderResponse, 1); - response->provider = provider; - response->handle = handle; - response->result = result; - response->directory = NAUTILUS_DIRECTORY (user_data); + InfoProviderResponse *response; + + response = g_new0 (InfoProviderResponse, 1); + response->provider = provider; + response->handle = handle; + response->result = result; + response->directory = NAUTILUS_DIRECTORY (user_data); - response->directory->details->extension_info_idle = - g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, - info_provider_idle_callback, response, - g_free); + response->directory->details->extension_info_idle = + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + info_provider_idle_callback, response, + g_free); } static void extension_info_start (NautilusDirectory *directory, - NautilusFile *file, - gboolean *doing_io) -{ - NautilusInfoProvider *provider; - NautilusOperationResult result; - NautilusOperationHandle *handle; - GClosure *update_complete; - - if (directory->details->extension_info_in_progress != NULL) { - *doing_io = TRUE; - return; - } - - if (!is_needy (file, lacks_extension_info, REQUEST_EXTENSION_INFO)) { - return; - } - *doing_io = TRUE; - - if (!async_job_start (directory, "extension info")) { - return; - } - - provider = file->details->pending_info_providers->data; - - update_complete = g_cclosure_new (G_CALLBACK (info_provider_callback), - directory, - NULL); - g_closure_set_marshal (update_complete, - g_cclosure_marshal_generic); - - result = nautilus_info_provider_update_file_info - (provider, - NAUTILUS_FILE_INFO (file), - update_complete, - &handle); - - g_closure_unref (update_complete); - - if (result == NAUTILUS_OPERATION_COMPLETE || - result == NAUTILUS_OPERATION_FAILED) { - finish_info_provider (directory, file, provider); - async_job_end (directory, "extension info"); - } else { - directory->details->extension_info_in_progress = handle; - directory->details->extension_info_provider = provider; - directory->details->extension_info_file = file; - } + NautilusFile *file, + gboolean *doing_io) +{ + NautilusInfoProvider *provider; + NautilusOperationResult result; + NautilusOperationHandle *handle; + GClosure *update_complete; + + if (directory->details->extension_info_in_progress != NULL) + { + *doing_io = TRUE; + return; + } + + if (!is_needy (file, lacks_extension_info, REQUEST_EXTENSION_INFO)) + { + return; + } + *doing_io = TRUE; + + if (!async_job_start (directory, "extension info")) + { + return; + } + + provider = file->details->pending_info_providers->data; + + update_complete = g_cclosure_new (G_CALLBACK (info_provider_callback), + directory, + NULL); + g_closure_set_marshal (update_complete, + g_cclosure_marshal_generic); + + result = nautilus_info_provider_update_file_info + (provider, + NAUTILUS_FILE_INFO (file), + update_complete, + &handle); + + g_closure_unref (update_complete); + + if (result == NAUTILUS_OPERATION_COMPLETE || + result == NAUTILUS_OPERATION_FAILED) + { + finish_info_provider (directory, file, provider); + async_job_end (directory, "extension info"); + } + else + { + directory->details->extension_info_in_progress = handle; + directory->details->extension_info_provider = provider; + directory->details->extension_info_file = file; + } } static void start_or_stop_io (NautilusDirectory *directory) { - NautilusFile *file; - gboolean doing_io; - - /* Start or stop reading files. */ - file_list_start_or_stop (directory); - - /* Stop any no longer wanted attribute fetches. */ - file_info_stop (directory); - directory_count_stop (directory); - deep_count_stop (directory); - mime_list_stop (directory); - link_info_stop (directory); - extension_info_stop (directory); - mount_stop (directory); - thumbnail_stop (directory); - filesystem_info_stop (directory); - - doing_io = FALSE; - /* Take files that are all done off the queue. */ - while (!nautilus_file_queue_is_empty (directory->details->high_priority_queue)) { - file = nautilus_file_queue_head (directory->details->high_priority_queue); - - /* Start getting attributes if possible */ - file_info_start (directory, file, &doing_io); - link_info_start (directory, file, &doing_io); - - if (doing_io) { - return; - } - - move_file_to_low_priority_queue (directory, file); - } - - /* High priority queue must be empty */ - while (!nautilus_file_queue_is_empty (directory->details->low_priority_queue)) { - file = nautilus_file_queue_head (directory->details->low_priority_queue); - - /* Start getting attributes if possible */ - mount_start (directory, file, &doing_io); - directory_count_start (directory, file, &doing_io); - deep_count_start (directory, file, &doing_io); - mime_list_start (directory, file, &doing_io); - thumbnail_start (directory, file, &doing_io); - filesystem_info_start (directory, file, &doing_io); - - if (doing_io) { - return; - } - - move_file_to_extension_queue (directory, file); - } - - /* Low priority queue must be empty */ - while (!nautilus_file_queue_is_empty (directory->details->extension_queue)) { - file = nautilus_file_queue_head (directory->details->extension_queue); - - /* Start getting attributes if possible */ - extension_info_start (directory, file, &doing_io); - if (doing_io) { - return; - } - - nautilus_directory_remove_file_from_work_queue (directory, file); - } + NautilusFile *file; + gboolean doing_io; + + /* Start or stop reading files. */ + file_list_start_or_stop (directory); + + /* Stop any no longer wanted attribute fetches. */ + file_info_stop (directory); + directory_count_stop (directory); + deep_count_stop (directory); + mime_list_stop (directory); + link_info_stop (directory); + extension_info_stop (directory); + mount_stop (directory); + thumbnail_stop (directory); + filesystem_info_stop (directory); + + doing_io = FALSE; + /* Take files that are all done off the queue. */ + while (!nautilus_file_queue_is_empty (directory->details->high_priority_queue)) + { + file = nautilus_file_queue_head (directory->details->high_priority_queue); + + /* Start getting attributes if possible */ + file_info_start (directory, file, &doing_io); + link_info_start (directory, file, &doing_io); + + if (doing_io) + { + return; + } + + move_file_to_low_priority_queue (directory, file); + } + + /* High priority queue must be empty */ + while (!nautilus_file_queue_is_empty (directory->details->low_priority_queue)) + { + file = nautilus_file_queue_head (directory->details->low_priority_queue); + + /* Start getting attributes if possible */ + mount_start (directory, file, &doing_io); + directory_count_start (directory, file, &doing_io); + deep_count_start (directory, file, &doing_io); + mime_list_start (directory, file, &doing_io); + thumbnail_start (directory, file, &doing_io); + filesystem_info_start (directory, file, &doing_io); + + if (doing_io) + { + return; + } + + move_file_to_extension_queue (directory, file); + } + + /* Low priority queue must be empty */ + while (!nautilus_file_queue_is_empty (directory->details->extension_queue)) + { + file = nautilus_file_queue_head (directory->details->extension_queue); + + /* Start getting attributes if possible */ + extension_info_start (directory, file, &doing_io); + if (doing_io) + { + return; + } + + nautilus_directory_remove_file_from_work_queue (directory, file); + } } /* Call this when the monitor or call when ready list changes, @@ -4285,274 +4747,305 @@ start_or_stop_io (NautilusDirectory *directory) void nautilus_directory_async_state_changed (NautilusDirectory *directory) { - /* Check if any callbacks are satisfied and call them if they - * are. Do this last so that any changes done in start or stop - * I/O functions immediately (not in callbacks) are taken into - * consideration. If any callbacks are called, consider the - * I/O state again so that we can release or cancel I/O that - * is not longer needed once the callbacks are satisfied. - */ - - if (directory->details->in_async_service_loop) { - directory->details->state_changed = TRUE; - return; - } - directory->details->in_async_service_loop = TRUE; - nautilus_directory_ref (directory); - do { - directory->details->state_changed = FALSE; - start_or_stop_io (directory); - if (call_ready_callbacks (directory)) { - directory->details->state_changed = TRUE; - } - } while (directory->details->state_changed); - directory->details->in_async_service_loop = FALSE; - nautilus_directory_unref (directory); - - /* Check if any directories should wake up. */ - async_job_wake_up (); + /* Check if any callbacks are satisfied and call them if they + * are. Do this last so that any changes done in start or stop + * I/O functions immediately (not in callbacks) are taken into + * consideration. If any callbacks are called, consider the + * I/O state again so that we can release or cancel I/O that + * is not longer needed once the callbacks are satisfied. + */ + + if (directory->details->in_async_service_loop) + { + directory->details->state_changed = TRUE; + return; + } + directory->details->in_async_service_loop = TRUE; + nautilus_directory_ref (directory); + do + { + directory->details->state_changed = FALSE; + start_or_stop_io (directory); + if (call_ready_callbacks (directory)) + { + directory->details->state_changed = TRUE; + } + } + while (directory->details->state_changed); + directory->details->in_async_service_loop = FALSE; + nautilus_directory_unref (directory); + + /* Check if any directories should wake up. */ + async_job_wake_up (); } void nautilus_directory_cancel (NautilusDirectory *directory) { - /* Arbitrary order (kept alphabetical). */ - deep_count_cancel (directory); - directory_count_cancel (directory); - file_info_cancel (directory); - file_list_cancel (directory); - link_info_cancel (directory); - mime_list_cancel (directory); - new_files_cancel (directory); - extension_info_cancel (directory); - thumbnail_cancel (directory); - mount_cancel (directory); - filesystem_info_cancel (directory); - - /* We aren't waiting for anything any more. */ - if (waiting_directories != NULL) { - g_hash_table_remove (waiting_directories, directory); - } - - /* Check if any directories should wake up. */ - async_job_wake_up (); + /* Arbitrary order (kept alphabetical). */ + deep_count_cancel (directory); + directory_count_cancel (directory); + file_info_cancel (directory); + file_list_cancel (directory); + link_info_cancel (directory); + mime_list_cancel (directory); + new_files_cancel (directory); + extension_info_cancel (directory); + thumbnail_cancel (directory); + mount_cancel (directory); + filesystem_info_cancel (directory); + + /* We aren't waiting for anything any more. */ + if (waiting_directories != NULL) + { + g_hash_table_remove (waiting_directories, directory); + } + + /* Check if any directories should wake up. */ + async_job_wake_up (); } static void cancel_directory_count_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->count_in_progress != NULL && - directory->details->count_in_progress->count_file == file) { - directory_count_cancel (directory); - } + if (directory->details->count_in_progress != NULL && + directory->details->count_in_progress->count_file == file) + { + directory_count_cancel (directory); + } } static void cancel_deep_counts_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->deep_count_file == file) { - deep_count_cancel (directory); - } + if (directory->details->deep_count_file == file) + { + deep_count_cancel (directory); + } } static void cancel_mime_list_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->mime_list_in_progress != NULL && - directory->details->mime_list_in_progress->mime_list_file == file) { - mime_list_cancel (directory); - } + if (directory->details->mime_list_in_progress != NULL && + directory->details->mime_list_in_progress->mime_list_file == file) + { + mime_list_cancel (directory); + } } static void cancel_file_info_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->get_info_file == file) { - file_info_cancel (directory); - } + if (directory->details->get_info_file == file) + { + file_info_cancel (directory); + } } static void cancel_thumbnail_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->thumbnail_state != NULL && - directory->details->thumbnail_state->file == file) { - thumbnail_cancel (directory); - } + if (directory->details->thumbnail_state != NULL && + directory->details->thumbnail_state->file == file) + { + thumbnail_cancel (directory); + } } static void cancel_mount_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->mount_state != NULL && - directory->details->mount_state->file == file) { - mount_cancel (directory); - } + if (directory->details->mount_state != NULL && + directory->details->mount_state->file == file) + { + mount_cancel (directory); + } } static void cancel_filesystem_info_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->filesystem_info_state != NULL && - directory->details->filesystem_info_state->file == file) { - filesystem_info_cancel (directory); - } + if (directory->details->filesystem_info_state != NULL && + directory->details->filesystem_info_state->file == file) + { + filesystem_info_cancel (directory); + } } static void cancel_link_info_for_file (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - if (directory->details->link_info_read_state != NULL && - directory->details->link_info_read_state->file == file) { - link_info_cancel (directory); - } + if (directory->details->link_info_read_state != NULL && + directory->details->link_info_read_state->file == file) + { + link_info_cancel (directory); + } } static void -cancel_loading_attributes (NautilusDirectory *directory, - NautilusFileAttributes file_attributes) -{ - Request request; - - request = nautilus_directory_set_up_request (file_attributes); - - if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) { - directory_count_cancel (directory); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) { - deep_count_cancel (directory); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) { - mime_list_cancel (directory); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) { - file_info_cancel (directory); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) { - filesystem_info_cancel (directory); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) { - link_info_cancel (directory); - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_EXTENSION_INFO)) { - extension_info_cancel (directory); - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) { - thumbnail_cancel (directory); - } - - if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) { - mount_cancel (directory); - } - - nautilus_directory_async_state_changed (directory); +cancel_loading_attributes (NautilusDirectory *directory, + NautilusFileAttributes file_attributes) +{ + Request request; + + request = nautilus_directory_set_up_request (file_attributes); + + if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) + { + directory_count_cancel (directory); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) + { + deep_count_cancel (directory); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) + { + mime_list_cancel (directory); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) + { + file_info_cancel (directory); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) + { + filesystem_info_cancel (directory); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) + { + link_info_cancel (directory); + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_EXTENSION_INFO)) + { + extension_info_cancel (directory); + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) + { + thumbnail_cancel (directory); + } + + if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) + { + mount_cancel (directory); + } + + nautilus_directory_async_state_changed (directory); } void nautilus_directory_cancel_loading_file_attributes (NautilusDirectory *directory, - NautilusFile *file, - NautilusFileAttributes file_attributes) -{ - Request request; - - nautilus_directory_remove_file_from_work_queue (directory, file); - - request = nautilus_directory_set_up_request (file_attributes); - - if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) { - cancel_directory_count_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) { - cancel_deep_counts_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) { - cancel_mime_list_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) { - cancel_file_info_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) { - cancel_filesystem_info_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) { - cancel_link_info_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) { - cancel_thumbnail_for_file (directory, file); - } - if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) { - cancel_mount_for_file (directory, file); - } - - nautilus_directory_async_state_changed (directory); + NautilusFile *file, + NautilusFileAttributes file_attributes) +{ + Request request; + + nautilus_directory_remove_file_from_work_queue (directory, file); + + request = nautilus_directory_set_up_request (file_attributes); + + if (REQUEST_WANTS_TYPE (request, REQUEST_DIRECTORY_COUNT)) + { + cancel_directory_count_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_DEEP_COUNT)) + { + cancel_deep_counts_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_MIME_LIST)) + { + cancel_mime_list_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_FILE_INFO)) + { + cancel_file_info_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_FILESYSTEM_INFO)) + { + cancel_filesystem_info_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_LINK_INFO)) + { + cancel_link_info_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_THUMBNAIL)) + { + cancel_thumbnail_for_file (directory, file); + } + if (REQUEST_WANTS_TYPE (request, REQUEST_MOUNT)) + { + cancel_mount_for_file (directory, file); + } + + nautilus_directory_async_state_changed (directory); } void nautilus_directory_add_file_to_work_queue (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - g_return_if_fail (file->details->directory == directory); + g_return_if_fail (file->details->directory == directory); - nautilus_file_queue_enqueue (directory->details->high_priority_queue, - file); + nautilus_file_queue_enqueue (directory->details->high_priority_queue, + file); } static void add_all_files_to_work_queue (NautilusDirectory *directory) { - GList *node; - NautilusFile *file; - - for (node = directory->details->file_list; node != NULL; node = node->next) { - file = NAUTILUS_FILE (node->data); + GList *node; + NautilusFile *file; + + for (node = directory->details->file_list; node != NULL; node = node->next) + { + file = NAUTILUS_FILE (node->data); - nautilus_directory_add_file_to_work_queue (directory, file); - } + nautilus_directory_add_file_to_work_queue (directory, file); + } } void nautilus_directory_remove_file_from_work_queue (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - nautilus_file_queue_remove (directory->details->high_priority_queue, - file); - nautilus_file_queue_remove (directory->details->low_priority_queue, - file); - nautilus_file_queue_remove (directory->details->extension_queue, - file); + nautilus_file_queue_remove (directory->details->high_priority_queue, + file); + nautilus_file_queue_remove (directory->details->low_priority_queue, + file); + nautilus_file_queue_remove (directory->details->extension_queue, + file); } static void move_file_to_low_priority_queue (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - /* Must add before removing to avoid ref underflow */ - nautilus_file_queue_enqueue (directory->details->low_priority_queue, - file); - nautilus_file_queue_remove (directory->details->high_priority_queue, - file); + /* Must add before removing to avoid ref underflow */ + nautilus_file_queue_enqueue (directory->details->low_priority_queue, + file); + nautilus_file_queue_remove (directory->details->high_priority_queue, + file); } static void move_file_to_extension_queue (NautilusDirectory *directory, - NautilusFile *file) + NautilusFile *file) { - /* Must add before removing to avoid ref underflow */ - nautilus_file_queue_enqueue (directory->details->extension_queue, - file); - nautilus_file_queue_remove (directory->details->low_priority_queue, - file); + /* Must add before removing to avoid ref underflow */ + nautilus_file_queue_enqueue (directory->details->extension_queue, + file); + nautilus_file_queue_remove (directory->details->low_priority_queue, + file); } |