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;
85 guint not_shown : 1; /* OnlyShowIn=SomeOtherDesktop */
88 Entry *entry_new (VFolderInfo *info,
89 const gchar *filename,
90 const gchar *displayname,
91 gboolean user_private,
94 void entry_ref (Entry *entry);
95 void entry_unref (Entry *entry);
97 void entry_alloc (Entry *entry);
98 void entry_dealloc (Entry *entry);
99 gboolean entry_is_allocated (Entry *entry);
101 gboolean entry_make_user_private (Entry *entry, Folder *folder);
102 gboolean entry_is_user_private (Entry *entry);
104 gushort entry_get_weight (Entry *entry);
105 void entry_set_weight (Entry *entry, gushort weight);
107 void entry_set_dirty (Entry *entry);
109 void entry_set_filename (Entry *entry, const gchar *name);
110 const gchar *entry_get_filename (Entry *entry);
112 void entry_set_displayname (Entry *entry, const gchar *name);
113 const gchar *entry_get_displayname (Entry *entry);
115 GnomeVFSURI *entry_get_real_uri (Entry *entry);
117 const GSList *entry_get_keywords (Entry *entry);
118 void entry_add_implicit_keyword (Entry *entry, GQuark keyword);
120 void entry_quick_read_keys (Entry *entry,
128 void entry_dump (Entry *entry, int indent);
142 VFolderMonitor *extend_monitor;
146 char *desktop_file; /* the .directory file */
150 /* The following is for per file access */
151 GHashTable *excludes; /* excluded by dirname/fileuri */
152 GSList *includes; /* included by dirname/fileuri */
155 GHashTable *subfolders_ht;
158 GHashTable *entries_ht;
162 guint dont_show_if_empty : 1;
163 guint only_unallocated : 1; /* include only unallocated */
166 guint has_user_private_subfolders : 1;
167 guint user_private : 1;
169 /* lazily done, will run query only when it needs to */
187 Folder *folder_new (VFolderInfo *info,
189 gboolean user_private);
191 void folder_ref (Folder *folder);
192 void folder_unref (Folder *folder);
194 gboolean folder_make_user_private (Folder *folder);
195 gboolean folder_is_user_private (Folder *folder);
197 void folder_set_dirty (Folder *folder);
199 void folder_set_name (Folder *folder, const gchar *name);
200 const gchar *folder_get_name (Folder *folder);
202 void folder_set_query (Folder *folder, Query *query);
203 Query *folder_get_query (Folder *folder);
205 void folder_set_extend_uri (Folder *folder, const gchar *uri);
206 const gchar *folder_get_extend_uri (Folder *folder);
208 void folder_set_desktop_file (Folder *folder, const gchar *filename);
209 const gchar *folder_get_desktop_file (Folder *folder);
211 gboolean folder_get_child (Folder *folder,
214 GSList *folder_list_children (Folder *folder);
216 Entry *folder_get_entry (Folder *folder, const gchar *filename);
217 const GSList *folder_list_entries (Folder *folder);
218 void folder_remove_entry (Folder *folder, Entry *entry);
219 void folder_add_entry (Folder *folder, Entry *entry);
221 void folder_add_include (Folder *folder, const gchar *file);
222 void folder_remove_include (Folder *folder, const gchar *file);
224 void folder_add_exclude (Folder *folder, const gchar *file);
225 void folder_remove_exclude (Folder *folder, const gchar *file);
227 Folder *folder_get_subfolder (Folder *folder, const gchar *name);
228 const GSList *folder_list_subfolders (Folder *folder);
229 void folder_remove_subfolder (Folder *folder, Folder *sub);
230 void folder_add_subfolder (Folder *folder, Folder *sub);
232 gboolean folder_is_hidden (Folder *folder);
234 void folder_dump_tree (Folder *folder, int indent);
236 void folder_emit_changed (Folder *folder,
238 GnomeVFSMonitorEventType event_type);
260 Query *query_new (int type);
262 void query_free (Query *query);
264 gboolean query_try_match (Query *query,
271 /* NOTE: Exposed only so do_monitor_cancel can lock the VFolderInfo */
274 GnomeVFSMonitorType type;
278 struct _VFolderInfo {
279 GStaticRWLock rw_lock;
284 VFolderMonitor *filename_monitor;
285 guint filename_reload_tag;
287 /* dir where user changes to items are stored */
289 VFolderMonitor *write_dir_monitor;
292 char *desktop_dir; /* directory with .directorys */
293 VFolderMonitor *desktop_dir_monitor;
295 /* Consider item dirs and mergedirs writeable?? */
296 /* Monitoring on mergedirs?? */
297 GSList *item_dirs; /* CONTAINS: ItemDir */
299 GSList *entries; /* CONTAINS: Entry */
300 GHashTable *entries_ht; /* KEY: Entry->name, VALUE: Entry */
302 /* The root folder */
309 guint has_unallocated_folder : 1;
311 GSList *requested_monitors; /* CONTAINS: MonitorHandle */
313 /* ctime for folders */
314 time_t modification_time;
317 #define VFOLDER_INFO_READ_LOCK(vi) \
318 g_static_rw_lock_reader_lock (&(vi->rw_lock))
319 #define VFOLDER_INFO_READ_UNLOCK(vi) \
320 g_static_rw_lock_reader_unlock (&(vi->rw_lock))
322 #define VFOLDER_INFO_WRITE_LOCK(vi) \
323 g_static_rw_lock_writer_lock (&(vi->rw_lock))
324 /* Writes out .vfolder-info file if there are changes */
325 #define VFOLDER_INFO_WRITE_UNLOCK(vi) \
326 vfolder_info_write_user (vi); \
327 g_static_rw_lock_writer_unlock (&(vi->rw_lock))
329 VFolderInfo *vfolder_info_locate (const gchar *scheme);
331 void vfolder_info_set_dirty (VFolderInfo *info);
332 void vfolder_info_write_user (VFolderInfo *info);
334 Folder *vfolder_info_get_folder (VFolderInfo *info,
336 Folder *vfolder_info_get_parent (VFolderInfo *info,
338 Entry *vfolder_info_get_entry (VFolderInfo *info,
341 const GSList *vfolder_info_list_all_entries (VFolderInfo *info);
342 Entry *vfolder_info_lookup_entry (VFolderInfo *info,
344 void vfolder_info_add_entry (VFolderInfo *info, Entry *entry);
345 void vfolder_info_remove_entry (VFolderInfo *info, Entry *entry);
347 void vfolder_info_emit_change (VFolderInfo *info,
349 GnomeVFSMonitorEventType event_type);
351 void vfolder_info_add_monitor (VFolderInfo *info,
352 GnomeVFSMonitorType type,
354 GnomeVFSMethodHandle **handle);
355 void vfolder_info_cancel_monitor (GnomeVFSMethodHandle *handle);
357 void vfolder_info_destroy_all (void);
359 void vfolder_info_dump_entries (VFolderInfo *info, int offset);
363 #endif /* VFOLDER_COMMON_H */