From 6abd6e01b3f220a127c780ffdf2ea9a80f028238 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Mon, 22 Sep 2003 18:48:34 +0000 Subject: Added "offline_sync" option, which lets you synchronise all mail to local 2003-09-22 Not Zed * providers/imap/camel-imap-provider.c: Added "offline_sync" option, which lets you synchronise all mail to local storage automagically. * camel-disco-folder.c (cdf_folder_changed): hook onto the folder changed single, for all new messages, check that they are online using another thread, if the offline_sync option has been enabled for this store. 2003-09-21 Not Zed * camel-session.c (session_thread_destroy): call proper entry point for freeing the message. 2003-09-18 Not Zed * camel-folder.c (filter_filter): register the filtering process for progress, and do progress of the filtering process. 2003-09-17 Not Zed * camel.c (camel_init): init camel operation. * camel-operation.c (camel_operation_reset): removed, not used, not worth it. (camel_operation_mute): new method to stop all status updates permanently. (*): Changed to use thread specific data and a list rather than a hashtable. (cancel_thread): removed. (camel_operation_register): return the previously registered op. svn path=/trunk/; revision=22648 --- camel/camel-disco-folder.c | 77 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) (limited to 'camel/camel-disco-folder.c') diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c index 3d3d9212bd..61e825020c 100644 --- a/camel/camel-disco-folder.c +++ b/camel/camel-disco-folder.c @@ -29,6 +29,8 @@ #include "camel-disco-store.h" #include "camel-exception.h" +#include "camel-session.h" + #define CF_CLASS(o) (CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS (o))) #define CDF_CLASS(o) (CAMEL_DISCO_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS (o))) @@ -72,6 +74,77 @@ camel_disco_folder_class_init (CamelDiscoFolderClass *camel_disco_folder_class) camel_folder_class->transfer_messages_to = disco_transfer_messages_to; } +struct _cdf_sync_msg { + CamelSessionThreadMsg msg; + + CamelFolder *folder; + CamelFolderChangeInfo *changes; +}; + +static void +cdf_sync_offline(CamelSession *session, CamelSessionThreadMsg *mm) +{ + struct _cdf_sync_msg *m = (struct _cdf_sync_msg *)mm; + int i; + + camel_operation_start(NULL, _("Downloading new messages for offline mode")); + + if (m->changes) { + for (i=0;ichanges->uid_added->len;i++) { + int pc = i * 100 / m->changes->uid_added->len; + + camel_operation_progress(NULL, pc); + camel_disco_folder_cache_message((CamelDiscoFolder *)m->folder, + m->changes->uid_added->pdata[i], + &mm->ex); + } + } else { + camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)m->folder, + "(match-all)", + &mm->ex); + } + + camel_operation_end(NULL); +} + +static void +cdf_sync_free(CamelSession *session, CamelSessionThreadMsg *mm) +{ + struct _cdf_sync_msg *m = (struct _cdf_sync_msg *)mm; + + if (m->changes) + camel_folder_change_info_free(m->changes); + camel_object_unref(m->folder); +} + +static CamelSessionThreadOps cdf_sync_ops = { + cdf_sync_offline, + cdf_sync_free, +}; + +static void +cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, void *dummy) +{ + if (changes->uid_added->len > 0 + && camel_url_get_param(((CamelService *)folder->parent_store)->url, "offline_sync")) { + CamelSession *session = ((CamelService *)folder->parent_store)->session; + struct _cdf_sync_msg *m; + + m = camel_session_thread_msg_new(session, &cdf_sync_ops, sizeof(*m)); + m->changes = camel_folder_change_info_new(); + camel_folder_change_info_cat(m->changes, changes); + m->folder = folder; + camel_object_ref(folder); + camel_session_thread_queue(session, &m->msg, 0); + } +} + +static void +camel_disco_folder_init(CamelDiscoFolder *folder) +{ + camel_object_hook_event(folder, "folder_changed", (CamelObjectEventHookFunc)cdf_folder_changed, NULL); +} + CamelType camel_disco_folder_get_type (void) { @@ -82,8 +155,8 @@ camel_disco_folder_get_type (void) CAMEL_FOLDER_TYPE, "CamelDiscoFolder", sizeof (CamelDiscoFolder), sizeof (CamelDiscoFolderClass), - (CamelObjectClassInitFunc) camel_disco_folder_class_init, - NULL, NULL, NULL); + (CamelObjectClassInitFunc)camel_disco_folder_class_init, NULL, + (CamelObjectInitFunc)camel_disco_folder_init, NULL); } return camel_disco_folder_type; -- cgit v1.2.3