1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- 2 3 nemo-directory-private.h: Nemo directory model. 4 5 Copyright (C) 1999, 2000, 2001 Eazel, Inc. 6 7 This program is free software; you can redistribute it and/or 8 modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the 10 License, or (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 General Public License for more details. 16 17 You should have received a copy of the GNU General Public 18 License along with this program; if not, write to the 19 Free Software Foundation, Inc., 51 Franklin Street - Suite 500, 20 Boston, MA 02110-1335, USA. 21 22 Author: Darin Adler <darin@bentspoon.com> 23 */ 24 25 #include <gio/gio.h> 26 #include <eel/eel-vfs-extensions.h> 27 #include <libnemo-private/nemo-directory.h> 28 #include <libnemo-private/nemo-file-queue.h> 29 #include <libnemo-private/nemo-file.h> 30 #include <libnemo-private/nemo-monitor.h> 31 #include <libnemo-extension/nemo-info-provider.h> 32 #include <libxml/tree.h> 33 34 typedef struct LinkInfoReadState LinkInfoReadState; 35 typedef struct FileMonitors FileMonitors; 36 typedef struct DirectoryLoadState DirectoryLoadState; 37 typedef struct DirectoryCountState DirectoryCountState; 38 typedef struct DeepCountState DeepCountState; 39 typedef struct GetInfoState GetInfoState; 40 typedef struct GetBTimeState GetBTimeState; 41 typedef struct NewFilesState NewFilesState; 42 typedef struct MimeListState MimeListState; 43 typedef struct ThumbnailState ThumbnailState; 44 typedef struct MountState MountState; 45 typedef struct FilesystemInfoState FilesystemInfoState; 46 typedef struct FavoriteCheckState FavoriteCheckState; 47 48 typedef enum { 49 REQUEST_LINK_INFO, 50 REQUEST_DEEP_COUNT, 51 REQUEST_DIRECTORY_COUNT, 52 REQUEST_FILE_INFO, 53 REQUEST_FILE_LIST, /* always FALSE if file != NULL */ 54 REQUEST_MIME_LIST, 55 REQUEST_EXTENSION_INFO, 56 REQUEST_THUMBNAIL, 57 REQUEST_MOUNT, 58 REQUEST_FILESYSTEM_INFO, 59 REQUEST_BTIME, 60 REQUEST_FAVORITE_CHECK, 61 REQUEST_TYPE_LAST 62 } RequestType; 63 64 /* A request for information about one or more files. */ 65 typedef guint32 Request; 66 typedef gint32 RequestCounter[REQUEST_TYPE_LAST]; 67 68 #define REQUEST_WANTS_TYPE(request, type) ((request) & (1<<(type))) 69 #define REQUEST_SET_TYPE(request, type) (request) |= (1<<(type)) 70 71 struct NemoDirectoryDetails 72 { 73 /* The location. */ 74 GFile *location; 75 76 /* The file objects. */ 77 NemoFile *as_file; 78 GList *file_list; 79 GHashTable *file_hash; 80 81 /* Queues of files needing some I/O done. */ 82 NemoFileQueue *high_priority_queue; 83 NemoFileQueue *low_priority_queue; 84 NemoFileQueue *extension_queue; 85 86 /* These lists are going to be pretty short. If we think they 87 * are going to get big, we can use hash tables instead. 88 */ 89 GList *call_when_ready_list; 90 RequestCounter call_when_ready_counters; 91 GList *monitor_list; 92 RequestCounter monitor_counters; 93 guint call_ready_idle_id; 94 95 NemoMonitor *monitor; 96 gulong mime_db_monitor; 97 98 gboolean in_async_service_loop; 99 gboolean state_changed; 100 101 gboolean file_list_monitored; 102 gboolean directory_loaded; 103 gboolean directory_loaded_sent_notification; 104 DirectoryLoadState *directory_load_in_progress; 105 106 GList *pending_file_info; /* list of GnomeVFSFileInfo's that are pending */ 107 int confirmed_file_count; 108 guint dequeue_pending_idle_id; 109 110 GList *new_files_in_progress; /* list of NewFilesState * */ 111 112 /* List of GFile's that received CHANGE events while new files were being added in 113 * that same folder. We will process this CHANGE events after new_files_in_progress 114 * list is finished. See Bug 703179 for a case when this happens. */ 115 GList *new_files_in_progress_changes; 116 117 DirectoryCountState *count_in_progress; 118 119 NemoFile *deep_count_file; 120 DeepCountState *deep_count_in_progress; 121 122 MimeListState *mime_list_in_progress; 123 124 NemoFile *get_info_file; 125 GetInfoState *get_info_in_progress; 126 127 NemoFile *get_btime_file; 128 GetBTimeState *get_btime_in_progress; 129 130 NemoFile *favorite_check_file; 131 FavoriteCheckState *favorite_check_in_progress; 132 guint favorite_check_idle_id; 133 134 NemoFile *extension_info_file; 135 NemoInfoProvider *extension_info_provider; 136 NemoOperationHandle *extension_info_in_progress; 137 guint extension_info_idle; 138 GClosure * extension_info_closure; 139 140 ThumbnailState *thumbnail_state; 141 142 MountState *mount_state; 143 144 FilesystemInfoState *filesystem_info_state; 145 146 LinkInfoReadState *link_info_read_state; 147 148 GList *file_operations_in_progress; /* list of FileOperation * */ 149 150 gint max_deferred_file_count; 151 gint early_load_file_count; 152 }; 153 154 NemoDirectory *nemo_directory_get_existing (GFile *location); 155 156 /* async. interface */ 157 void nemo_directory_async_state_changed (NemoDirectory *directory); 158 void nemo_directory_call_when_ready_internal (NemoDirectory *directory, 159 NemoFile *file, 160 NemoFileAttributes file_attributes, 161 gboolean wait_for_file_list, 162 NemoDirectoryCallback directory_callback, 163 NemoFileCallback file_callback, 164 gpointer callback_data); 165 gboolean nemo_directory_check_if_ready_internal (NemoDirectory *directory, 166 NemoFile *file, 167 NemoFileAttributes file_attributes); 168 void nemo_directory_cancel_callback_internal (NemoDirectory *directory, 169 NemoFile *file, 170 NemoDirectoryCallback directory_callback, 171 NemoFileCallback file_callback, 172 gpointer callback_data); 173 void nemo_directory_monitor_add_internal (NemoDirectory *directory, 174 NemoFile *file, 175 gconstpointer client, 176 gboolean monitor_hidden_files, 177 NemoFileAttributes attributes, 178 NemoDirectoryCallback callback, 179 gpointer callback_data); 180 void nemo_directory_monitor_remove_internal (NemoDirectory *directory, 181 NemoFile *file, 182 gconstpointer client); 183 void nemo_directory_get_info_for_new_files (NemoDirectory *directory, 184 GList *vfs_uris); 185 NemoFile * nemo_directory_get_existing_corresponding_file (NemoDirectory *directory); 186 void nemo_directory_invalidate_count_and_mime_list (NemoDirectory *directory); 187 gboolean nemo_directory_is_file_list_monitored (NemoDirectory *directory); 188 gboolean nemo_directory_is_anyone_monitoring_file_list (NemoDirectory *directory); 189 gboolean nemo_directory_has_active_request_for_file (NemoDirectory *directory, 190 NemoFile *file); 191 void nemo_directory_remove_file_monitor_link (NemoDirectory *directory, 192 GList *link); 193 void nemo_directory_schedule_dequeue_pending (NemoDirectory *directory); 194 void nemo_directory_stop_monitoring_file_list (NemoDirectory *directory); 195 void nemo_directory_cancel (NemoDirectory *directory); 196 void nemo_async_destroying_file (NemoFile *file); 197 void nemo_directory_force_reload_internal (NemoDirectory *directory, 198 NemoFileAttributes file_attributes); 199 void nemo_directory_cancel_loading_file_attributes (NemoDirectory *directory, 200 NemoFile *file, 201 NemoFileAttributes file_attributes); 202 203 /* Calls shared between directory, file, and async. code. */ 204 void nemo_directory_emit_files_added (NemoDirectory *directory, 205 GList *added_files); 206 void nemo_directory_emit_files_changed (NemoDirectory *directory, 207 GList *changed_files); 208 void nemo_directory_emit_change_signals (NemoDirectory *directory, 209 GList *changed_files); 210 void emit_change_signals_for_all_files (NemoDirectory *directory); 211 void emit_change_signals_for_all_files_in_all_directories (void); 212 void nemo_directory_emit_done_loading (NemoDirectory *directory); 213 void nemo_directory_emit_load_error (NemoDirectory *directory, 214 GError *error); 215 NemoDirectory *nemo_directory_get_internal (GFile *location, 216 gboolean create); 217 char * nemo_directory_get_name_for_self_as_new_file (NemoDirectory *directory); 218 Request nemo_directory_set_up_request (NemoFileAttributes file_attributes); 219 220 /* Interface to the file list. */ 221 NemoFile * nemo_directory_find_file_by_name (NemoDirectory *directory, 222 const char *filename); 223 NemoFile * nemo_directory_find_file_by_internal_filename (NemoDirectory *directory, 224 const char *internal_filename); 225 226 void nemo_directory_remove_file (NemoDirectory *directory, 227 NemoFile *file); 228 FileMonitors * nemo_directory_remove_file_monitors (NemoDirectory *directory, 229 NemoFile *file); 230 void nemo_directory_add_file_monitors (NemoDirectory *directory, 231 NemoFile *file, 232 FileMonitors *monitors); 233 void nemo_directory_add_file (NemoDirectory *directory, 234 NemoFile *file); 235 GList * nemo_directory_begin_file_name_change (NemoDirectory *directory, 236 NemoFile *file); 237 void nemo_directory_end_file_name_change (NemoDirectory *directory, 238 NemoFile *file, 239 GList *node); 240 void nemo_directory_moved (const char *from_uri, 241 const char *to_uri); 242 /* Interface to the work queue. */ 243 244 void nemo_directory_add_file_to_work_queue (NemoDirectory *directory, 245 NemoFile *file); 246 void nemo_directory_remove_file_from_work_queue (NemoDirectory *directory, 247 NemoFile *file); 248 249 250 /* debugging functions */ 251 int nemo_directory_number_outstanding (void); 252