diff options
-rw-r--r-- | camel/ChangeLog | 13 | ||||
-rw-r--r-- | camel/camel-store.c | 35 | ||||
-rw-r--r-- | camel/camel-store.h | 7 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.c | 18 |
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)", |