aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap4/camel-imap4-folder.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@novell.com>2004-10-27 05:22:17 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2004-10-27 05:22:17 +0800
commitaad2d708c31bc7b238fc4f7027e5c48fcee5f062 (patch)
tree5b68028a7a5dc5a7f6c5106ea51f7287b9980644 /camel/providers/imap4/camel-imap4-folder.c
parent99cbfb261554f038d9b709d2b3dab26a7f0e7bef (diff)
downloadgsoc2013-evolution-aad2d708c31bc7b238fc4f7027e5c48fcee5f062.tar.gz
gsoc2013-evolution-aad2d708c31bc7b238fc4f7027e5c48fcee5f062.tar.zst
gsoc2013-evolution-aad2d708c31bc7b238fc4f7027e5c48fcee5f062.zip
New files implementing a folder-info cache for offline mode (and faster
2004-10-26 Jeffrey Stedfast <fejj@novell.com> * providers/imap4/camel-imap4-store-summary.[c,h]: New files implementing a folder-info cache for offline mode (and faster startup I guess). * providers/imap4/camel-imap4-store.c (imap4_build_folder_info): Cache the folder-info for later use in offline mode. * providers/imap4/camel-imap4-utils.c (camel_imap4_get_path_delim): Instead of assigning top = "INBOX", do strcpy (top, "INBOX") so that we can later modify the string. Fixes bug #68814. 2004-10-25 Jeffrey Stedfast <fejj@novell.com> * providers/imap4/camel-imap4-engine.c (engine_parse_namespace): Updated to use the public function in camel-imap4-utils.c (camel_imap4_engine_finalize): Same. * providers/imap4/camel-imap4-store.c (imap4_construct): Setup and load the store summary. (camel_imap4_store_finalize): Unref the store summary. (imap4_get_folder): Implemented offline support. (imap4_folder_utf7_name): Pass the summary to get_delim rather than the engine. (imap4_create_folder): Same. (imap4_reconnect): Update the namespaces on the store summary. (connect_to_server): Update the store summary capabilities. * providers/imap4/camel-imap4-utils.c (camel_imap4_get_path_delim): Now takes a store-summary rather than an engine so that it will work in offline mode. (camel_imap4_namespace_clear): Moved here from camel-imap4-engine.c (camel_imap4_namespace_list_copy): New convenience function. (camel_imap4_namespace_list_free): New. * providers/imap4/camel-imap4-folder.c (camel_imap4_folder_new): Check the return value of summary loading in offline mode (if it fails, we can't get the folder). svn path=/trunk/; revision=27730
Diffstat (limited to 'camel/providers/imap4/camel-imap4-folder.c')
-rw-r--r--camel/providers/imap4/camel-imap4-folder.c55
1 files changed, 42 insertions, 13 deletions
diff --git a/camel/providers/imap4/camel-imap4-folder.c b/camel/providers/imap4/camel-imap4-folder.c
index 58aebfd092..1eadc98904 100644
--- a/camel/providers/imap4/camel-imap4-folder.c
+++ b/camel/providers/imap4/camel-imap4-folder.c
@@ -217,7 +217,7 @@ camel_imap4_folder_new (CamelStore *store, const char *full_name, CamelException
utf7_name = g_alloca (strlen (full_name) + 1);
strcpy (utf7_name, full_name);
- sep = camel_imap4_get_path_delim (((CamelIMAP4Store *) store)->engine, full_name);
+ sep = camel_imap4_get_path_delim (((CamelIMAP4Store *) store)->summary, full_name);
if (sep != '/') {
p = utf7_name;
while (*p != '\0') {
@@ -229,7 +229,7 @@ camel_imap4_folder_new (CamelStore *store, const char *full_name, CamelException
utf7_name = camel_utf8_utf7 (utf7_name);
- folder = (CamelFolder *) (imap_folder = (CamelIMAP4Folder *)camel_object_new (CAMEL_TYPE_IMAP4_FOLDER));
+ folder = (CamelFolder *) (imap_folder = (CamelIMAP4Folder *) camel_object_new (CAMEL_TYPE_IMAP4_FOLDER));
camel_folder_construct (folder, store, full_name, name);
imap_folder->utf7_name = utf7_name;
@@ -241,24 +241,36 @@ camel_imap4_folder_new (CamelStore *store, const char *full_name, CamelException
camel_folder_summary_set_filename (folder->summary, path);
g_free (path);
- camel_folder_summary_load (folder->summary);
-
imap_folder->search = camel_imap4_search_new (((CamelIMAP4Store *) store)->engine, imap_folder->cachedir);
- if (camel_imap4_engine_select_folder (((CamelIMAP4Store *) store)->engine, folder, ex) == -1) {
- camel_object_unref (folder);
- folder = NULL;
- }
-
- if (folder && camel_imap4_summary_flush_updates (folder->summary, ex) == -1) {
- camel_object_unref (folder);
- folder = NULL;
+ if (camel_session_is_online (((CamelService *) store)->session)) {
+ /* we don't care if the summary loading fails here */
+ camel_folder_summary_load (folder->summary);
+
+ if (camel_imap4_engine_select_folder (((CamelIMAP4Store *) store)->engine, folder, ex) == -1) {
+ camel_object_unref (folder);
+ folder = NULL;
+ }
+
+ if (folder && camel_imap4_summary_flush_updates (folder->summary, ex) == -1) {
+ camel_object_unref (folder);
+ folder = NULL;
+ }
+ } else {
+ /* we *do* care if summary loading fails here though */
+ if (camel_folder_summary_load (folder->summary) == -1) {
+ camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID_PATH,
+ _("Cannot access folder `%s': %s"),
+ full_name, g_strerror (ENOENT));
+
+ camel_object_unref (folder);
+ folder = NULL;
+ }
}
return folder;
}
-
const char *
camel_imap4_folder_utf7_name (CamelIMAP4Folder *folder)
{
@@ -634,6 +646,23 @@ imap4_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
* that fails and we are offline, we're done. else do the
* following code */
+ /* Note: While some hard-core IMAP extremists are probably
+ * going to flame me for fetching entire messages here, it's
+ * the *only* sure-fire way of working with all IMAP
+ * servers. There are numerous problems with fetching
+ * individual MIME parts from a good handful of IMAP servers
+ * which makes this a pain to do the Right Way (tm). For
+ * example: Courier-IMAP has "issues" parsing some multipart
+ * messages apparently, because BODY responses are often
+ * inaccurate. I'm also not very trusting of the free German
+ * IMAP hosting either (such as mail.gmx.net and imap.web.de)
+ * as they have proven themselves to be quite flakey wrt FETCH
+ * requests (they seem to be written exclusively for
+ * Outlook). Also, some IMAP servers such as GroupWise don't
+ * store mail in MIME format and so must re-construct the
+ * entire message in order to extract the requested part, so
+ * it is *mush* more efficient (generally) to just request the
+ * entire message anyway. */
ic = camel_imap4_engine_queue (engine, folder, "UID FETCH %s BODY.PEEK[]\r\n", uid);
camel_imap4_command_register_untagged (ic, "FETCH", untagged_fetch);
ic->user_data = stream = camel_stream_mem_new ();