1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
3 nautilus-directory-private.h: Nautilus directory model.
5 Copyright (C) 1999, 2000, 2001 Eazel, Inc.
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.
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.
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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Author: Darin Adler <darin@bentspoon.com>
26 #include <eel/eel-vfs-extensions.h>
27 #include <libnautilus-private/nautilus-directory.h>
28 #include <libnautilus-private/nautilus-file-queue.h>
29 #include <libnautilus-private/nautilus-file.h>
30 #include <libnautilus-private/nautilus-metafile.h>
31 #include <libnautilus-private/nautilus-monitor.h>
32 #include <libnautilus-private/nautilus-idle-queue.h>
33 #include <libnautilus-extension/nautilus-info-provider.h>
34 #include <libxml/tree.h>
36 typedef struct LinkInfoReadState LinkInfoReadState
;
37 typedef struct TopLeftTextReadState TopLeftTextReadState
;
38 typedef struct FileMonitors FileMonitors
;
39 typedef struct DirectoryLoadState DirectoryLoadState
;
40 typedef struct DirectoryCountState DirectoryCountState
;
41 typedef struct DeepCountState DeepCountState
;
42 typedef struct GetInfoState GetInfoState
;
43 typedef struct NewFilesState NewFilesState
;
44 typedef struct MimeListState MimeListState
;
45 typedef struct ThumbnailState ThumbnailState
;
46 typedef struct MountState MountState
;
47 typedef struct FilesystemInfoState FilesystemInfoState
;
49 struct NautilusDirectoryDetails
54 /* The file objects. */
55 NautilusFile
*as_file
;
57 GHashTable
*file_hash
;
59 /* Queues of files needing some I/O done. */
60 NautilusFileQueue
*high_priority_queue
;
61 NautilusFileQueue
*low_priority_queue
;
62 NautilusFileQueue
*extension_queue
;
64 /* These lists are going to be pretty short. If we think they
65 * are going to get big, we can use hash tables instead.
67 GList
*call_when_ready_list
;
69 guint call_ready_idle_id
;
71 NautilusMonitor
*monitor
;
72 gulong mime_db_monitor
;
74 NautilusIdleQueue
*idle_queue
;
75 gboolean metafile_monitored
;
76 NautilusMetafile
*metafile
;
78 gboolean in_async_service_loop
;
79 gboolean state_changed
;
81 gboolean file_list_monitored
;
82 gboolean directory_loaded
;
83 gboolean directory_loaded_sent_notification
;
84 DirectoryLoadState
*directory_load_in_progress
;
86 GList
*pending_file_info
; /* list of GnomeVFSFileInfo's that are pending */
87 int confirmed_file_count
;
88 guint dequeue_pending_idle_id
;
90 GList
*new_files_in_progress
; /* list of NewFilesState * */
92 DirectoryCountState
*count_in_progress
;
94 NautilusFile
*deep_count_file
;
95 DeepCountState
*deep_count_in_progress
;
97 MimeListState
*mime_list_in_progress
;
99 NautilusFile
*get_info_file
;
100 GetInfoState
*get_info_in_progress
;
102 NautilusFile
*extension_info_file
;
103 NautilusInfoProvider
*extension_info_provider
;
104 NautilusOperationHandle
*extension_info_in_progress
;
105 guint extension_info_idle
;
107 ThumbnailState
*thumbnail_state
;
109 MountState
*mount_state
;
111 FilesystemInfoState
*filesystem_info_state
;
113 TopLeftTextReadState
*top_left_read_state
;
115 LinkInfoReadState
*link_info_read_state
;
117 GList
*file_operations_in_progress
; /* list of FileOperation * */
119 GHashTable
*hidden_file_hash
;
122 /* A request for information about one or more files. */
126 gboolean directory_count
;
128 gboolean file_list
; /* always FALSE if file != NULL */
131 gboolean top_left_text
;
132 gboolean large_top_left_text
;
133 gboolean extension_info
;
136 gboolean filesystem_info
;
139 NautilusDirectory
*nautilus_directory_get_existing (GFile
*location
);
141 /* async. interface */
142 void nautilus_directory_async_state_changed (NautilusDirectory
*directory
);
143 void nautilus_directory_call_when_ready_internal (NautilusDirectory
*directory
,
145 NautilusFileAttributes file_attributes
,
146 gboolean wait_for_file_list
,
147 NautilusDirectoryCallback directory_callback
,
148 NautilusFileCallback file_callback
,
149 gpointer callback_data
);
150 gboolean
nautilus_directory_check_if_ready_internal (NautilusDirectory
*directory
,
152 NautilusFileAttributes file_attributes
);
153 void nautilus_directory_cancel_callback_internal (NautilusDirectory
*directory
,
155 NautilusDirectoryCallback directory_callback
,
156 NautilusFileCallback file_callback
,
157 gpointer callback_data
);
158 void nautilus_directory_monitor_add_internal (NautilusDirectory
*directory
,
160 gconstpointer client
,
161 gboolean monitor_hidden_files
,
162 gboolean monitor_backup_files
,
163 NautilusFileAttributes attributes
,
164 NautilusDirectoryCallback callback
,
165 gpointer callback_data
);
166 void nautilus_directory_monitor_remove_internal (NautilusDirectory
*directory
,
168 gconstpointer client
);
169 void nautilus_directory_get_info_for_new_files (NautilusDirectory
*directory
,
171 NautilusFile
* nautilus_directory_get_existing_corresponding_file (NautilusDirectory
*directory
);
172 void nautilus_directory_invalidate_count_and_mime_list (NautilusDirectory
*directory
);
173 gboolean
nautilus_directory_is_file_list_monitored (NautilusDirectory
*directory
);
174 gboolean
nautilus_directory_is_anyone_monitoring_file_list (NautilusDirectory
*directory
);
175 void nautilus_directory_remove_file_monitor_link (NautilusDirectory
*directory
,
177 void nautilus_directory_schedule_dequeue_pending (NautilusDirectory
*directory
);
178 void nautilus_directory_stop_monitoring_file_list (NautilusDirectory
*directory
);
179 void nautilus_directory_cancel (NautilusDirectory
*directory
);
180 void nautilus_async_destroying_file (NautilusFile
*file
);
181 void nautilus_directory_force_reload_internal (NautilusDirectory
*directory
,
182 NautilusFileAttributes file_attributes
);
183 void nautilus_directory_cancel_loading_file_attributes (NautilusDirectory
*directory
,
185 NautilusFileAttributes file_attributes
);
187 /* Calls shared between directory, file, and async. code. */
188 void nautilus_directory_emit_files_added (NautilusDirectory
*directory
,
190 void nautilus_directory_emit_files_changed (NautilusDirectory
*directory
,
191 GList
*changed_files
);
192 void nautilus_directory_emit_change_signals (NautilusDirectory
*directory
,
193 GList
*changed_files
);
194 void emit_change_signals_for_all_files (NautilusDirectory
*directory
);
195 void emit_change_signals_for_all_files_in_all_directories (void);
196 void nautilus_directory_emit_done_loading (NautilusDirectory
*directory
);
197 void nautilus_directory_emit_load_error (NautilusDirectory
*directory
,
199 NautilusDirectory
*nautilus_directory_get_internal (GFile
*location
,
201 char * nautilus_directory_get_name_for_self_as_new_file (NautilusDirectory
*directory
);
202 void nautilus_directory_set_up_request (Request
*request
,
203 NautilusFileAttributes file_attributes
);
205 /* Interface to the file list. */
206 NautilusFile
* nautilus_directory_find_file_by_name (NautilusDirectory
*directory
,
207 const char *filename
);
208 NautilusFile
* nautilus_directory_find_file_by_internal_filename (NautilusDirectory
*directory
,
209 const char *internal_filename
);
211 void nautilus_directory_add_file (NautilusDirectory
*directory
,
213 void nautilus_directory_remove_file (NautilusDirectory
*directory
,
215 FileMonitors
* nautilus_directory_remove_file_monitors (NautilusDirectory
*directory
,
217 void nautilus_directory_add_file_monitors (NautilusDirectory
*directory
,
219 FileMonitors
*monitors
);
220 void nautilus_directory_add_file (NautilusDirectory
*directory
,
222 GList
* nautilus_directory_begin_file_name_change (NautilusDirectory
*directory
,
224 void nautilus_directory_end_file_name_change (NautilusDirectory
*directory
,
227 void nautilus_directory_moved (const char *from_uri
,
229 /* Interface to the work queue. */
231 void nautilus_directory_add_file_to_work_queue (NautilusDirectory
*directory
,
233 void nautilus_directory_remove_file_from_work_queue (NautilusDirectory
*directory
,
236 /* KDE compatibility hacks */
238 void nautilus_set_kde_trash_name (const char *trash_dir
);
240 /* debugging functions */
241 int nautilus_directory_number_outstanding (void);