aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-disco-folder.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2001-05-10 05:57:32 +0800
committerDan Winship <danw@src.gnome.org>2001-05-10 05:57:32 +0800
commit630241d74b1a6dede97380c8ed70c74641399e0f (patch)
tree2a5642e69cf0bf563cd6c26176ac80633c9c82e0 /camel/camel-disco-folder.c
parentc76080568db894f538f5b4d89293295b29fcc214 (diff)
downloadgsoc2013-evolution-630241d74b1a6dede97380c8ed70c74641399e0f.tar.gz
gsoc2013-evolution-630241d74b1a6dede97380c8ed70c74641399e0f.tar.zst
gsoc2013-evolution-630241d74b1a6dede97380c8ed70c74641399e0f.zip
Set the disconnected status. (camel_disco_store_can_work_offline): Return
* camel-disco-store.c (camel_disco_set_status): Set the disconnected status. (camel_disco_store_can_work_offline): Return whether or not a given CamelDiscoStore can work offline or not. * camel-disco-folder.c (camel_disco_folder_cache_message): Explicitly tell a folder to cache a message. (Better than using get_message, because for IMAP that doesn't guarantee you'll get all the message parts.) (camel_disco_folder_prepare_for_offline): Prepare a folder for offline use by caching all messages meeting given search criteria (and doing anything else the particular folder implementation needs). * camel-session.c (camel_session_set_online, camel_session_is_online): A session-wide online/offline toggle. (camel_session_init): Set online to TRUE. * providers/imap/camel-imap-store.c (can_work_offline): Implementation of CamelDiscoStore::can_work_offline. (Checks that the store has been used online at least once.) (imap_get_folder_online, imap_get_folder_offline): Deal with request for "inbox" properly. ("Don't you mean... 'INBOX'?"). * providers/imap/camel-imap-folder.c (imap_cache_message): Implementation of CamelDiscoFolder::cache_message. * camel.h: Add camel-disco-store.h and camel-disco-folder.h svn path=/trunk/; revision=9738
Diffstat (limited to 'camel/camel-disco-folder.c')
-rw-r--r--camel/camel-disco-folder.c109
1 files changed, 101 insertions, 8 deletions
diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c
index 91a12adece..b090bd6517 100644
--- a/camel/camel-disco-folder.c
+++ b/camel/camel-disco-folder.c
@@ -46,6 +46,11 @@ static void disco_copy_messages_to (CamelFolder *source, GPtrArray *uids,
static void disco_move_messages_to (CamelFolder *source, GPtrArray *uids,
CamelFolder *destination, CamelException *ex);
+static void disco_cache_message (CamelDiscoFolder *disco_folder,
+ const char *uid, CamelException *ex);
+static void disco_prepare_for_offline (CamelDiscoFolder *disco_folder,
+ const char *expression,
+ CamelException *ex);
static void
camel_disco_folder_class_init (CamelDiscoFolderClass *camel_disco_folder_class)
@@ -54,6 +59,10 @@ camel_disco_folder_class_init (CamelDiscoFolderClass *camel_disco_folder_class)
parent_class = CAMEL_FOLDER_CLASS (camel_type_get_global_classfuncs (camel_folder_get_type ()));
+ /* virtual method definition */
+ camel_disco_folder_class->cache_message = disco_cache_message;
+ camel_disco_folder_class->prepare_for_offline = disco_prepare_for_offline;
+
/* virtual method overload */
camel_folder_class->refresh_info = disco_refresh_info;
camel_folder_class->sync = disco_sync;
@@ -126,8 +135,11 @@ disco_expunge_uids (CamelFolder *folder, GPtrArray *uids, CamelException *ex)
case CAMEL_DISCO_STORE_OFFLINE:
CDF_CLASS (folder)->expunge_uids_offline (folder, uids, ex);
#ifdef NOTYET
- if (!camel_exception_is_set (ex))
- camel_disco_diary_log (disco->diary, CAMEL_DISCO_DIARY_FOLDER_EXPUNGE, folder, uids);
+ if (!camel_exception_is_set (ex)) {
+ camel_disco_diary_log (disco->diary,
+ CAMEL_DISCO_DIARY_FOLDER_EXPUNGE,
+ folder, uids);
+ }
#endif
break;
}
@@ -171,8 +183,11 @@ disco_append_message (CamelFolder *folder, CamelMimeMessage *message,
case CAMEL_DISCO_STORE_OFFLINE:
uid = CDF_CLASS (folder)->append_offline (folder, message, info, ex);
#ifdef NOTYET
- if (uid)
- camel_disco_diary_log (disco->diary, CAMEL_DISCO_DIARY_FOLDER_APPEND, folder, uid);
+ if (uid) {
+ camel_disco_diary_log (disco->diary,
+ CAMEL_DISCO_DIARY_FOLDER_APPEND,
+ folder, uid);
+ }
#endif
break;
}
@@ -193,8 +208,11 @@ disco_copy_messages_to (CamelFolder *source, GPtrArray *uids,
case CAMEL_DISCO_STORE_OFFLINE:
CDF_CLASS (source)->copy_offline (source, uids, destination, ex);
#ifdef NOTYET
- if (!camel_exception_is_set (ex))
- camel_disco_diary_log (disco->diary, CAMEL_DISCO_DIARY_FOLDER_COPY, source, destination, uids);
+ if (!camel_exception_is_set (ex)) {
+ camel_disco_diary_log (disco->diary,
+ CAMEL_DISCO_DIARY_FOLDER_COPY,
+ source, destination, uids);
+ }
#endif
break;
}
@@ -214,8 +232,11 @@ disco_move_messages_to (CamelFolder *source, GPtrArray *uids,
case CAMEL_DISCO_STORE_OFFLINE:
CDF_CLASS (source)->move_offline (source, uids, destination, ex);
#ifdef NOTYET
- if (!camel_exception_is_set (ex))
- camel_disco_diary_log (disco->diary, CAMEL_DISCO_DIARY_FOLDER_MOVE, source, destination, uids);
+ if (!camel_exception_is_set (ex)) {
+ camel_disco_diary_log (disco->diary,
+ CAMEL_DISCO_DIARY_FOLDER_MOVE,
+ source, destination, uids);
+ }
#endif
break;
}
@@ -240,3 +261,75 @@ camel_disco_folder_expunge_uids (CamelFolder *folder, GPtrArray *uids,
{
disco_expunge_uids (folder, uids, ex);
}
+
+
+static void
+disco_cache_message (CamelDiscoFolder *disco_folder, const char *uid,
+ CamelException *ex)
+{
+ g_warning ("CamelDiscoFolder::cache_message not implemented for `%s'",
+ camel_type_to_name (CAMEL_OBJECT_GET_TYPE (disco_folder)));
+}
+
+/**
+ * camel_disco_folder_cache_message:
+ * @disco_folder: the folder
+ * @uid: the UID of the message to cache
+ * @ex: a CamelException
+ *
+ * Requests that @disco_folder cache message @uid to disk.
+ **/
+void
+camel_disco_folder_cache_message (CamelDiscoFolder *disco_folder,
+ const char *uid, CamelException *ex)
+{
+ CDF_CLASS (disco_folder)->cache_message (disco_folder, uid, ex);
+}
+
+
+static void
+disco_prepare_for_offline (CamelDiscoFolder *disco_folder,
+ const char *expression,
+ CamelException *ex)
+{
+ CamelFolder *folder = CAMEL_FOLDER (disco_folder);
+ GPtrArray *uids;
+ int i;
+
+ if (expression)
+ uids = camel_folder_search_by_expression (folder, expression, ex);
+ else
+ uids = camel_folder_get_uids (folder);
+ if (!uids)
+ return;
+ for (i = 0; i < uids->len; i++) {
+ camel_disco_folder_cache_message (disco_folder, uids->pdata[i], ex);
+ if (camel_exception_is_set (ex))
+ break;
+ }
+ if (expression)
+ camel_folder_search_free (folder, uids);
+ else
+ camel_folder_free_uids (folder, uids);
+}
+
+/**
+ * camel_disco_folder_prepare_for_offline:
+ * @disco_folder: the folder
+ * @expression: an expression describing messages to synchronize, or %NULL
+ * if all messages should be sync'ed.
+ * @ex: a CamelException
+ *
+ * This prepares @disco_folder for offline operation, by downloading
+ * the bodies of all messages described by @expression (using the
+ * same syntax as camel_folder_search_by_expression() ).
+ **/
+void
+camel_disco_folder_prepare_for_offline (CamelDiscoFolder *disco_folder,
+ const char *expression,
+ CamelException *ex)
+{
+ g_return_if_fail (CAMEL_IS_DISCO_FOLDER (disco_folder));
+
+ CDF_CLASS (disco_folder)->prepare_for_offline (disco_folder, expression, ex);
+}