1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
3 * vfolder-common.h - Abstract Folder, Entry, Query, and VFolderInfo
6 * Copyright (C) 2002 Ximian, Inc.
8 * The Gnome Library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
13 * The Gnome Library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with the Gnome Library; see the file COPYING.LIB. If not,
20 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
23 * Author: Alex Graveley <alex@ximian.com>
24 * Based on original code by George Lebl <jirka@5z.com>.
27 #ifndef VFOLDER_COMMON_H
28 #define VFOLDER_COMMON_H
31 #include <libgnomevfs/gnome-vfs-uri.h>
32 #include <libgnomevfs/gnome-vfs-method.h>
34 #include "vfolder-util.h"
38 /* Turn this on to test the non-FAM monitoring code
40 #undef VFOLDER_DEBUG_WITHOUT_MONITORING
42 /* Turn this on to spew debugging info
49 #define D(x) do {} while (0)
52 typedef struct _VFolderInfo VFolderInfo;
53 typedef struct _Query Query;
54 typedef struct _Folder Folder;
64 * Weight lets us determine if a monitor's file created (or changed)
65 * event should replace an existing visible entry. Higher weights
67 * 1000 - WriteDir entries
68 * 900 - folder parent entries
69 * 800 - GNOME2_PATH entries in order
70 * 700 - MergeDir/ItemDir entries in order
80 GSList *keywords; /* GQuark */
81 GSList *implicit_keywords; /* GQuark */
84 guint user_private : 1;
87 Entry *entry_new (VFolderInfo *info,
88 const gchar *filename,
89 const gchar *displayname,
90 gboolean user_private,
93 void entry_ref (Entry *entry);
94 void entry_unref (Entry *entry);
96 void entry_alloc (Entry *entry);
97 void entry_dealloc (Entry *entry);
98 gboolean entry_is_allocated (Entry *entry);
100 gboolean entry_make_user_private (Entry *entry, Folder *folder);
101 gboolean entry_is_user_private (Entry *entry);
103 gushort entry_get_weight (Entry *entry);
104 void entry_set_weight (Entry *entry, gushort weight);
106 void entry_set_dirty (Entry *entry);
108 void entry_set_filename (Entry *entry, const gchar *name);
109 const gchar *entry_get_filename (Entry *entry);
111 void entry_set_displayname (Entry *entry, const gchar *name);
112 const gchar *entry_get_displayname (Entry *entry);
114 GnomeVFSURI *entry_get_real_uri (Entry *entry);
116 const GSList *entry_get_keywords (Entry *entry);
117 void entry_add_implicit_keyword (Entry *entry, GQuark keyword);
119 void entry_quick_read_keys (Entry *entry,
125 void entry_dump (Entry *entry, int indent);
139 VFolderMonitor *extend_monitor;
143 char *desktop_file; /* the .directory file */
147 /* The following is for per file access */
148 GHashTable *excludes; /* excluded by dirname/fileuri */
149 GSList *includes; /* included by dirname/fileuri */
152 GHashTable *subfolders_ht;
155 GHashTable *entries_ht;
159 guint dont_show_if_empty : 1;
160 guint only_unallocated : 1; /* include only unallocated */
163 guint has_user_private_subfolders : 1;
164 guint user_private : 1;
166 /* lazily done, will run query only when it needs to */
184 Folder *folder_new (VFolderInfo *info,
186 gboolean user_private);
188 void folder_ref (Folder *folder);
189 void folder_unref (Folder *folder);
191 gboolean folder_make_user_private (Folder *folder);
192 gboolean folder_is_user_private (Folder *folder);
194 void folder_set_dirty (Folder *folder);
196 void folder_set_name (Folder *folder, const gchar *name);
197 const gchar *folder_get_name (Folder *folder);
199 void folder_set_query (Folder *folder, Query *query);
200 Query *folder_get_query (Folder *folder);
202 void folder_set_extend_uri (Folder *folder, const gchar *uri);
203 const gchar *folder_get_extend_uri (Folder *folder);
205 void folder_set_desktop_file (Folder *folder, const gchar *filename);
206 const gchar *folder_get_desktop_file (Folder *folder);
208 gboolean folder_get_child (Folder *folder,
211 GSList *folder_list_children (Folder *folder);
213 Entry *folder_get_entry (Folder *folder, const gchar *filename);
214 const GSList *folder_list_entries (Folder *folder);
215 void folder_remove_entry (Folder *folder, Entry *entry);
216 void folder_add_entry (Folder *folder, Entry *entry);
218 void folder_add_include (Folder *folder, const gchar *file);
219 void folder_remove_include (Folder *folder, const gchar *file);
221 void folder_add_exclude (Folder *folder, const gchar *file);
222 void folder_remove_exclude (Folder *folder, const gchar *file);
224 Folder *folder_get_subfolder (Folder *folder, const gchar *name);
225 const GSList *folder_list_subfolders (Folder *folder);
226 void folder_remove_subfolder (Folder *folder, Folder *sub);
227 void folder_add_subfolder (Folder *folder, Folder *sub);
229 gboolean folder_is_hidden (Folder *folder);
231 void folder_dump_tree (Folder *folder, int indent);
233 void folder_emit_changed (Folder *folder,
235 GnomeVFSMonitorEventType event_type);
257 Query *query_new (int type);
259 void query_free (Query *query);
261 gboolean query_try_match (Query *query,
268 /* NOTE: Exposed only so do_monitor_cancel can lock the VFolderInfo */
271 GnomeVFSMonitorType type;
275 struct _VFolderInfo {
276 GStaticRWLock rw_lock;
281 VFolderMonitor *filename_monitor;
282 guint filename_reload_tag;
284 /* dir where user changes to items are stored */
286 VFolderMonitor *write_dir_monitor;
289 char *desktop_dir; /* directory with .directorys */
290 VFolderMonitor *desktop_dir_monitor;
292 /* Consider item dirs and mergedirs writeable?? */
293 /* Monitoring on mergedirs?? */
294 GSList *item_dirs; /* CONTAINS: ItemDir */
296 GSList *entries; /* CONTAINS: Entry */
297 GHashTable *entries_ht; /* KEY: Entry->name, VALUE: Entry */
299 /* The root folder */
306 guint has_unallocated_folder : 1;
308 GSList *requested_monitors; /* CONTAINS: MonitorHandle */
310 /* ctime for folders */
311 time_t modification_time;
314 #define VFOLDER_INFO_READ_LOCK(vi) \
315 g_static_rw_lock_reader_lock (&(vi->rw_lock))
316 #define VFOLDER_INFO_READ_UNLOCK(vi) \
317 g_static_rw_lock_reader_unlock (&(vi->rw_lock))
319 #define VFOLDER_INFO_WRITE_LOCK(vi) \
320 g_static_rw_lock_writer_lock (&(vi->rw_lock))
321 /* Writes out .vfolder-info file if there are changes */
322 #define VFOLDER_INFO_WRITE_UNLOCK(vi) \
323 vfolder_info_write_user (vi); \
324 g_static_rw_lock_writer_unlock (&(vi->rw_lock))
326 VFolderInfo *vfolder_info_locate (const gchar *scheme);
328 void vfolder_info_set_dirty (VFolderInfo *info);
329 void vfolder_info_write_user (VFolderInfo *info);
331 Folder *vfolder_info_get_folder (VFolderInfo *info,
333 Folder *vfolder_info_get_parent (VFolderInfo *info,
335 Entry *vfolder_info_get_entry (VFolderInfo *info,
338 const GSList *vfolder_info_list_all_entries (VFolderInfo *info);
339 Entry *vfolder_info_lookup_entry (VFolderInfo *info,
341 void vfolder_info_add_entry (VFolderInfo *info, Entry *entry);
342 void vfolder_info_remove_entry (VFolderInfo *info, Entry *entry);
344 void vfolder_info_emit_change (VFolderInfo *info,
346 GnomeVFSMonitorEventType event_type);
348 void vfolder_info_add_monitor (VFolderInfo *info,
349 GnomeVFSMonitorType type,
351 GnomeVFSMethodHandle **handle);
352 void vfolder_info_cancel_monitor (GnomeVFSMethodHandle *handle);
354 void vfolder_info_destroy_all (void);
356 void vfolder_info_dump_entries (VFolderInfo *info, int offset);
360 #endif /* VFOLDER_COMMON_H */