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