aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog13
-rw-r--r--camel/camel-store.c35
-rw-r--r--camel/camel-store.h7
-rw-r--r--camel/providers/imap/camel-imap-store.c18
4 files changed, 72 insertions, 1 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index c947b4e04e..76f4d130fb 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,16 @@
+2001-01-10 Dan Winship <danw@helixcode.com>
+
+ * camel-store.c (camel_store_sync): New class function, parallel
+ to camel_folder_sync. (The default implementation just calls
+ camel_folder_sync on each cached folder.)
+
+ * providers/imap/camel-imap-store.c (get_folder_info): Call
+ camel_store_sync before doing anything else so that the IMAP
+ server and Camel are working from the same data. Don't ask the
+ server for the unread message count of the current folder, since
+ UW will return often-incorrect cached data, and we can calculate
+ it without talking to the server anyway.
+
2001-01-09 Dan Winship <danw@helixcode.com>
Mostly IMAP changes. Use the NAMESPACE extension (where
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 7c61809150..05bffcdd97 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -50,6 +50,7 @@ static char *get_folder_name (CamelStore *store, const char *folder_name,
static char *get_root_folder_name (CamelStore *store, CamelException *ex);
static char *get_default_folder_name (CamelStore *store, CamelException *ex);
+static void store_sync (CamelStore *store, CamelException *ex);
static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top,
gboolean fast, gboolean recursive,
gboolean subscribed_only,
@@ -77,6 +78,7 @@ camel_store_class_init (CamelStoreClass *camel_store_class)
camel_store_class->get_folder_name = get_folder_name;
camel_store_class->get_root_folder_name = get_root_folder_name;
camel_store_class->get_default_folder_name = get_default_folder_name;
+ camel_store_class->sync = store_sync;
camel_store_class->get_folder_info = get_folder_info;
camel_store_class->free_folder_info = free_folder_info;
camel_store_class->lookup_folder = lookup_folder;
@@ -434,6 +436,38 @@ camel_store_get_default_folder (CamelStore *store, CamelException *ex)
}
+static void
+sync_folder (gpointer key, gpointer folder, gpointer ex)
+{
+ if (!camel_exception_is_set (ex))
+ camel_folder_sync (folder, FALSE, ex);
+}
+
+static void
+store_sync (CamelStore *store, CamelException *ex)
+{
+ CAMEL_STORE_LOCK(store, cache_lock);
+ g_hash_table_foreach (store->folders, sync_folder, ex);
+ CAMEL_STORE_UNLOCK(store, cache_lock);
+}
+
+/**
+ * camel_store_sync:
+ * @store: a CamelStore
+ * @ex: a CamelException
+ *
+ * Syncs any changes that have been made to the store object and its
+ * folders with the real store.
+ **/
+void
+camel_store_sync (CamelStore *store, CamelException *ex)
+{
+ g_return_if_fail (CAMEL_IS_STORE (store));
+
+ CS_CLASS (store)->sync (store, ex);
+}
+
+
static CamelFolderInfo *
get_folder_info (CamelStore *store, const char *top,
gboolean fast, gboolean recursive,
@@ -737,4 +771,3 @@ camel_store_unsubscribe_folder (CamelStore *store,
CAMEL_STORE_UNLOCK(store, folder_lock);
}
-
diff --git a/camel/camel-store.h b/camel/camel-store.h
index 4df8fa369f..1141f09dcf 100644
--- a/camel/camel-store.h
+++ b/camel/camel-store.h
@@ -85,6 +85,10 @@ typedef struct {
const char *old_name,
const char *new_name,
CamelException *ex);
+
+ void (*sync) (CamelStore *store,
+ CamelException *ex);
+
char * (*get_folder_name) (CamelStore *store,
const char *folder_name,
CamelException *ex);
@@ -143,6 +147,9 @@ void camel_store_rename_folder (CamelStore *store,
const char *new_name,
CamelException *ex);
+void camel_store_sync (CamelStore *store,
+ CamelException *ex);
+
CamelFolderInfo *camel_store_get_folder_info (CamelStore *store,
const char *top,
gboolean fast,
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index d3701ca5b7..ca4ca2e0d7 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -773,6 +773,13 @@ get_folder_info (CamelStore *store, const char *top, gboolean fast,
if (!camel_remote_store_connected (CAMEL_REMOTE_STORE (store), ex))
return NULL;
+ /* Sync flag changes to the server so it has the same ideas about
+ * read/unread as we do.
+ */
+ camel_store_sync (store, ex);
+ if (camel_exception_is_set (ex))
+ return NULL;
+
name = top;
if (!name) {
need_inbox = TRUE;
@@ -838,6 +845,17 @@ get_folder_info (CamelStore *store, const char *top, gboolean fast,
if (!fi->url || fi->unread_message_count != -1)
continue;
+ /* UW will give cached data for the currently
+ * selected folder. Grr. Well, I guess this
+ * also potentially saves us one IMAP command.
+ */
+ if (imap_store->current_folder &&
+ !strcmp (imap_store->current_folder->full_name,
+ fi->full_name)) {
+ fi->unread_message_count = camel_folder_get_unread_message_count (imap_store->current_folder);
+ continue;
+ }
+
CAMEL_IMAP_STORE_LOCK (imap_store, command_lock);
response = camel_imap_command (imap_store, NULL, NULL,
"STATUS %S (UNSEEN)",