1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /* camel-store.h : Abstract class for an email store
3  *
4  * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
5  *
6  * This library is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation.
9  *
10  * This library is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
13  * for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this library. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
19  *          Michael Zucchi <NotZed@ximian.com>
20  *          Jeffrey Stedfast <fejj@ximian.com>
21  */
22 
23 #if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
24 #error "Only <camel/camel.h> can be included directly."
25 #endif
26 
27 #ifndef CAMEL_STORE_H
28 #define CAMEL_STORE_H
29 
30 #include <camel/camel-db.h>
31 #include <camel/camel-enums.h>
32 #include <camel/camel-folder.h>
33 #include <camel/camel-service.h>
34 
35 /* Standard GObject macros */
36 #define CAMEL_TYPE_STORE \
37 	(camel_store_get_type ())
38 #define CAMEL_STORE(obj) \
39 	(G_TYPE_CHECK_INSTANCE_CAST \
40 	((obj), CAMEL_TYPE_STORE, CamelStore))
41 #define CAMEL_STORE_CLASS(cls) \
42 	(G_TYPE_CHECK_CLASS_CAST \
43 	((cls), CAMEL_TYPE_STORE, CamelStoreClass))
44 #define CAMEL_IS_STORE(obj) \
45 	(G_TYPE_CHECK_INSTANCE_TYPE \
46 	((obj), CAMEL_TYPE_STORE))
47 #define CAMEL_IS_STORE_CLASS(cls) \
48 	(G_TYPE_CHECK_CLASS_TYPE \
49 	((cls), CAMEL_TYPE_STORE))
50 #define CAMEL_STORE_GET_CLASS(obj) \
51 	(G_TYPE_INSTANCE_GET_CLASS \
52 	((obj), CAMEL_TYPE_STORE, CamelStoreClass))
53 
54 #define CAMEL_TYPE_FOLDER_INFO \
55 	(camel_folder_info_get_type ())
56 #define CAMEL_FOLDER_INFO(obj) \
57 	(G_TYPE_CHECK_INSTANCE_CAST \
58 	((obj), CAMEL_TYPE_FOLDER_INFO, CamelFolderInfo))
59 #define CAMEL_IS_FOLDER_INFO(obj) \
60 	(G_TYPE_CHECK_INSTANCE_TYPE \
61 	((obj), CAMEL_TYPE_FOLDER_INFO))
62 /**
63  * CAMEL_STORE_ERROR:
64  *
65  * Since: 2.32
66  **/
67 #define CAMEL_STORE_ERROR \
68 	(camel_store_error_quark ())
69 
70 /**
71  * CAMEL_STORE_SETUP
72  * @CAMEL_STORE_SETUP_ARCHIVE_FOLDER: Name of an Archive folder key
73  * @CAMEL_STORE_SETUP_DRAFTS_FOLDER: Name of a Drafts folder key
74  * @CAMEL_STORE_SETUP_SENT_FOLDER: Name of a Sent folder key
75  * @CAMEL_STORE_SETUP_TEMPLATES_FOLDER: Name of a Templates folder key
76  *
77  * Key names to a hash table with values to preset for the account used
78  * as in the camel_store_initial_setup_sync() function.
79  *
80  * The key name consists of up to four parts: Source:Extension:Property[:Type]
81  * Source can be 'Collection', 'Account', 'Submission', 'Transport', 'Backend'.
82  * Extension is any extension name; it's up to the key creator to make sure
83  * the extension belongs to that particular Source.
84  * Property is a property name in the Extension.
85  * Type is an optional letter describing the type of the value; if not set, then
86  * string is used. Available values are: 'b' for boolean, 'i' for integer,
87  * 's' for string, 'f' for folder full path.
88  * All the part values are case sensitive.
89  *
90  * Since: 3.20
91  **/
92 #define CAMEL_STORE_SETUP_ARCHIVE_FOLDER	"Account:Mail Account:archive-folder:f"
93 #define CAMEL_STORE_SETUP_DRAFTS_FOLDER		"Submission:Mail Composition:drafts-folder:f"
94 #define CAMEL_STORE_SETUP_SENT_FOLDER		"Submission:Mail Submission:sent-folder:f"
95 #define CAMEL_STORE_SETUP_TEMPLATES_FOLDER	"Submission:Mail Composition:templates-folder:f"
96 
97 G_BEGIN_DECLS
98 
99 /**
100  * CamelStoreError:
101  * @CAMEL_STORE_ERROR_INVALID: an invalid store operation had been requested
102  * @CAMEL_STORE_ERROR_NO_FOLDER: requested operation cannot be performed with the given folder
103  *
104  * Since: 2.32
105  **/
106 typedef enum {
107 	CAMEL_STORE_ERROR_INVALID,
108 	CAMEL_STORE_ERROR_NO_FOLDER
109 } CamelStoreError;
110 
111 typedef struct _CamelFolderInfo {
112 	struct _CamelFolderInfo *next;
113 	struct _CamelFolderInfo *parent;
114 	struct _CamelFolderInfo *child;
115 
116 	gchar *full_name;
117 	gchar *display_name;
118 
119 	CamelFolderInfoFlags flags;
120 	gint32 unread;
121 	gint32 total;
122 } CamelFolderInfo;
123 
124 typedef struct _CamelStore CamelStore;
125 typedef struct _CamelStoreClass CamelStoreClass;
126 typedef struct _CamelStorePrivate CamelStorePrivate;
127 
128 /**
129  * CamelStoreGetFolderFlags:
130  * @CAMEL_STORE_FOLDER_NONE: no flags
131  * @CAMEL_STORE_FOLDER_CREATE: create the folder
132  * @CAMEL_STORE_FOLDER_EXCL: deprecated, not honored
133  * @CAMEL_STORE_FOLDER_BODY_INDEX: save the body index
134  * @CAMEL_STORE_FOLDER_PRIVATE: a private folder that should not show up in
135  *  unmatched, folder info's, etc.
136  *
137  * Open mode for folder.
138  */
139 typedef enum {
140 	CAMEL_STORE_FOLDER_NONE = 0,
141 	CAMEL_STORE_FOLDER_CREATE = 1 << 0,
142 	CAMEL_STORE_FOLDER_EXCL = 1 << 1,
143 	CAMEL_STORE_FOLDER_BODY_INDEX = 1 << 2,
144 	CAMEL_STORE_FOLDER_PRIVATE    = 1 << 3
145 } CamelStoreGetFolderFlags;
146 
147 struct _CamelStore {
148 	CamelService parent;
149 	CamelStorePrivate *priv;
150 };
151 
152 struct _CamelStoreClass {
153 	CamelServiceClass parent_class;
154 
155 	GHashFunc hash_folder_name;
156 	GEqualFunc equal_folder_name;
157 
158 	/* Non-Blocking Methods */
159 	gboolean	(*can_refresh_folder)	(CamelStore *store,
160 						 CamelFolderInfo *info,
161 						 GError **error);
162 
163 	/* Synchronous I/O Methods */
164 	CamelFolder *	(*get_folder_sync)	(CamelStore *store,
165 						 const gchar *folder_name,
166 						 CamelStoreGetFolderFlags flags,
167 						 GCancellable *cancellable,
168 						 GError **error);
169 	CamelFolderInfo *
170 			(*get_folder_info_sync)	(CamelStore *store,
171 						 const gchar *top,
172 						 CamelStoreGetFolderInfoFlags flags,
173 						 GCancellable *cancellable,
174 						 GError **error);
175 	CamelFolder *	(*get_inbox_folder_sync)
176 						(CamelStore *store,
177 						 GCancellable *cancellable,
178 						 GError **error);
179 	CamelFolder *	(*get_junk_folder_sync)	(CamelStore *store,
180 						 GCancellable *cancellable,
181 						 GError **error);
182 	CamelFolder *	(*get_trash_folder_sync)
183 						(CamelStore *store,
184 						 GCancellable *cancellable,
185 						 GError **error);
186 	CamelFolderInfo *
187 			(*create_folder_sync)	(CamelStore *store,
188 						 const gchar *parent_name,
189 						 const gchar *folder_name,
190 						 GCancellable *cancellable,
191 						 GError **error);
192 	gboolean	(*delete_folder_sync)	(CamelStore *store,
193 						 const gchar *folder_name,
194 						 GCancellable *cancellable,
195 						 GError **error);
196 	gboolean	(*rename_folder_sync)	(CamelStore *store,
197 						 const gchar *old_name,
198 						 const gchar *new_name,
199 						 GCancellable *cancellable,
200 						 GError **error);
201 	gboolean	(*synchronize_sync)	(CamelStore *store,
202 						 gboolean expunge,
203 						 GCancellable *cancellable,
204 						 GError **error);
205 	gboolean	(*initial_setup_sync)	(CamelStore *store,
206 						 GHashTable *out_save_setup,
207 						 GCancellable *cancellable,
208 						 GError **error);
209 	gboolean	(*get_can_auto_save_changes)
210 						(CamelStore *store);
211 
212 	/* Padding for future expansion */
213 	gpointer reserved_methods[19];
214 
215 	/* Signals */
216 	void		(*folder_created)	(CamelStore *store,
217 						 CamelFolderInfo *folder_info);
218 	void		(*folder_deleted)	(CamelStore *store,
219 						 CamelFolderInfo *folder_info);
220 	void		(*folder_opened)	(CamelStore *store,
221 						 CamelFolder *folder);
222 	void		(*folder_renamed)	(CamelStore *store,
223 						 const gchar *old_name,
224 						 CamelFolderInfo *folder_info);
225 	void		(*folder_info_stale)	(CamelStore *store);
226 
227 	/* Padding for future expansion */
228 	gpointer reserved_signals[20];
229 };
230 
231 GType		camel_store_get_type		(void);
232 GQuark		camel_store_error_quark		(void) G_GNUC_CONST;
233 CamelDB *	camel_store_get_db		(CamelStore *store);
234 CamelObjectBag *camel_store_get_folders_bag	(CamelStore *store);
235 GPtrArray *	camel_store_dup_opened_folders	(CamelStore *store);
236 guint32		camel_store_get_flags		(CamelStore *store);
237 void		camel_store_set_flags		(CamelStore *store,
238 						 guint32 flags);
239 guint32		camel_store_get_permissions	(CamelStore *store);
240 void		camel_store_set_permissions	(CamelStore *store,
241 						 guint32 permissions);
242 void		camel_store_folder_created	(CamelStore *store,
243 						 CamelFolderInfo *folder_info);
244 void		camel_store_folder_deleted	(CamelStore *store,
245 						 CamelFolderInfo *folder_info);
246 void		camel_store_folder_opened	(CamelStore *store,
247 						 CamelFolder *folder);
248 void		camel_store_folder_renamed	(CamelStore *store,
249 						 const gchar *old_name,
250 						 CamelFolderInfo *folder_info);
251 void		camel_store_folder_info_stale	(CamelStore *store);
252 GType		camel_folder_info_get_type		(void);
253 CamelFolderInfo *
254 		camel_folder_info_new		(void);
255 void		camel_folder_info_free		(CamelFolderInfo *fi);
256 CamelFolderInfo *
257 		camel_folder_info_build		(GPtrArray *folders,
258 						 const gchar *namespace_,
259 						 gchar separator,
260 						 gboolean short_names);
261 CamelFolderInfo *
262 		camel_folder_info_clone		(CamelFolderInfo *fi);
263 gboolean	camel_store_can_refresh_folder	(CamelStore *store,
264 						 CamelFolderInfo *info,
265 						 GError **error);
266 
267 CamelFolder *	camel_store_get_folder_sync	(CamelStore *store,
268 						 const gchar *folder_name,
269 						 CamelStoreGetFolderFlags flags,
270 						 GCancellable *cancellable,
271 						 GError **error);
272 void		camel_store_get_folder		(CamelStore *store,
273 						 const gchar *folder_name,
274 						 CamelStoreGetFolderFlags flags,
275 						 gint io_priority,
276 						 GCancellable *cancellable,
277 						 GAsyncReadyCallback callback,
278 						 gpointer user_data);
279 CamelFolder *	camel_store_get_folder_finish	(CamelStore *store,
280 						 GAsyncResult *result,
281 						 GError **error);
282 CamelFolderInfo *
283 		camel_store_get_folder_info_sync
284 						(CamelStore *store,
285 						 const gchar *top,
286 						 CamelStoreGetFolderInfoFlags flags,
287 						 GCancellable *cancellable,
288 						 GError **error);
289 void		camel_store_get_folder_info	(CamelStore *store,
290 						 const gchar *top,
291 						 CamelStoreGetFolderInfoFlags flags,
292 						 gint io_priority,
293 						 GCancellable *cancellable,
294 						 GAsyncReadyCallback callback,
295 						 gpointer user_data);
296 CamelFolderInfo *
297 		camel_store_get_folder_info_finish
298 						(CamelStore *store,
299 						 GAsyncResult *result,
300 						 GError **error);
301 CamelFolder *	camel_store_get_inbox_folder_sync
302 						(CamelStore *store,
303 						 GCancellable *cancellable,
304 						 GError **error);
305 void		camel_store_get_inbox_folder	(CamelStore *store,
306 						 gint io_priority,
307 						 GCancellable *cancellable,
308 						 GAsyncReadyCallback callback,
309 						 gpointer user_data);
310 CamelFolder *	camel_store_get_inbox_folder_finish
311 						(CamelStore *store,
312 						 GAsyncResult *result,
313 						 GError **error);
314 CamelFolder *	camel_store_get_junk_folder_sync
315 						(CamelStore *store,
316 						 GCancellable *cancellable,
317 						 GError **error);
318 void		camel_store_get_junk_folder	(CamelStore *store,
319 						 gint io_priority,
320 						 GCancellable *cancellable,
321 						 GAsyncReadyCallback callback,
322 						 gpointer user_data);
323 CamelFolder *	camel_store_get_junk_folder_finish
324 						(CamelStore *store,
325 						 GAsyncResult *result,
326 						 GError **error);
327 CamelFolder *	camel_store_get_trash_folder_sync
328 						(CamelStore *store,
329 						 GCancellable *cancellable,
330 						 GError **error);
331 void		camel_store_get_trash_folder	(CamelStore *store,
332 						 gint io_priority,
333 						 GCancellable *cancellable,
334 						 GAsyncReadyCallback callback,
335 						 gpointer user_data);
336 CamelFolder *	camel_store_get_trash_folder_finish
337 						(CamelStore *store,
338 						 GAsyncResult *result,
339 						 GError **error);
340 CamelFolderInfo *
341 		camel_store_create_folder_sync	(CamelStore *store,
342 						 const gchar *parent_name,
343 						 const gchar *folder_name,
344 						 GCancellable *cancellable,
345 						 GError **error);
346 void		camel_store_create_folder	(CamelStore *store,
347 						 const gchar *parent_name,
348 						 const gchar *folder_name,
349 						 gint io_priority,
350 						 GCancellable *cancellable,
351 						 GAsyncReadyCallback callback,
352 						 gpointer user_data);
353 CamelFolderInfo *
354 		camel_store_create_folder_finish
355 						(CamelStore *store,
356 						 GAsyncResult *result,
357 						 GError **error);
358 gboolean	camel_store_delete_folder_sync	(CamelStore *store,
359 						 const gchar *folder_name,
360 						 GCancellable *cancellable,
361 						 GError **error);
362 void		camel_store_delete_folder	(CamelStore *store,
363 						 const gchar *folder_name,
364 						 gint io_priority,
365 						 GCancellable *cancellable,
366 						 GAsyncReadyCallback callback,
367 						 gpointer user_data);
368 gboolean	camel_store_delete_folder_finish
369 						(CamelStore *store,
370 						 GAsyncResult *result,
371 						 GError **error);
372 gboolean	camel_store_rename_folder_sync	(CamelStore *store,
373 						 const gchar *old_name,
374 						 const gchar *new_name,
375 						 GCancellable *cancellable,
376 						 GError **error);
377 void		camel_store_rename_folder	(CamelStore *store,
378 						 const gchar *old_name,
379 						 const gchar *new_name,
380 						 gint io_priority,
381 						 GCancellable *cancellable,
382 						 GAsyncReadyCallback callback,
383 						 gpointer user_data);
384 gboolean	camel_store_rename_folder_finish
385 						(CamelStore *store,
386 						 GAsyncResult *result,
387 						 GError **error);
388 gboolean	camel_store_synchronize_sync	(CamelStore *store,
389 						 gboolean expunge,
390 						 GCancellable *cancellable,
391 						 GError **error);
392 void		camel_store_synchronize		(CamelStore *store,
393 						 gboolean expunge,
394 						 gint io_priority,
395 						 GCancellable *cancellable,
396 						 GAsyncReadyCallback callback,
397 						 gpointer user_data);
398 gboolean	camel_store_synchronize_finish	(CamelStore *store,
399 						 GAsyncResult *result,
400 						 GError **error);
401 gboolean	camel_store_initial_setup_sync	(CamelStore *store,
402 						 GHashTable **out_save_setup,
403 						 GCancellable *cancellable,
404 						 GError **error);
405 void		camel_store_initial_setup	(CamelStore *store,
406 						 gint io_priority,
407 						 GCancellable *cancellable,
408 						 GAsyncReadyCallback callback,
409 						 gpointer user_data);
410 gboolean	camel_store_initial_setup_finish
411 						(CamelStore *store,
412 						 GAsyncResult *result,
413 						 GHashTable **out_save_setup,
414 						 GError **error);
415 gboolean	camel_store_maybe_run_db_maintenance
416 						(CamelStore *store,
417 						 GError **error);
418 void		camel_store_delete_cached_folder
419 						(CamelStore *store,
420 						 const gchar *folder_name);
421 gboolean	camel_store_get_can_auto_save_changes
422 						(CamelStore *store);
423 
424 G_END_DECLS
425 
426 #endif /* CAMEL_STORE_H */
427