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