diff options
-rw-r--r-- | camel/ChangeLog | 17 | ||||
-rw-r--r-- | camel/camel-folder.c | 22 | ||||
-rw-r--r-- | camel/camel-folder.h | 6 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 44 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.h | 2 |
5 files changed, 84 insertions, 7 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index dfafd7d909..eab69a3617 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,20 @@ +2001-06-28 Dan Winship <danw@ximian.com> + + * providers/imap/camel-imap-folder.c (imap_refresh_info): If the + folder is frozen, don't refresh, just record that we need to do it + later. + (imap_append_online): If the APPEND doesn't trigger an immediate + EXISTS response (because the folder isn't the selected folder, or + because the server doesn't do that until the next command), call + imap_refresh_info on the folder. + (imap_copy_online): Likewise. (Replacing the unconditional NOOP + that was there before, which absolutely killed filter performance + by forcing the IMAP provider to switch back and forth between + folders after every copy or move.) + (imap_thaw): If the folder needs a refresh, do it. + + * camel-folder.c (camel_folder_is_frozen): New method + 2001-06-27 Jeffrey Stedfast <fejj@ximian.com> * camel-transport.c (camel_transport_init): Initialize the private diff --git a/camel/camel-folder.c b/camel/camel-folder.c index ecf9190a36..4e679f36ae 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -109,6 +109,7 @@ static void move_messages_to (CamelFolder *source, static void freeze (CamelFolder *folder); static void thaw (CamelFolder *folder); +static gboolean is_frozen (CamelFolder *folder); static gboolean folder_changed (CamelObject *object, gpointer event_data); @@ -154,6 +155,7 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class) camel_folder_class->move_messages_to = move_messages_to; camel_folder_class->freeze = freeze; camel_folder_class->thaw = thaw; + camel_folder_class->is_frozen = is_frozen; /* virtual method overload */ camel_object_class_declare_event (camel_object_class, @@ -1310,6 +1312,26 @@ camel_folder_thaw (CamelFolder *folder) CF_CLASS (folder)->thaw (folder); } +static gboolean +is_frozen (CamelFolder *folder) +{ + return folder->priv->frozen != 0; +} + +/** + * camel_folder_is_frozen: + * @folder: a folder + * + * Return value: whether or not the folder is frozen. + **/ +gboolean +camel_folder_is_frozen (CamelFolder *folder) +{ + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE); + + return CF_CLASS (folder)->is_frozen (folder); +} + /* Event hooks that block emission when frozen */ static gboolean diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 751f730188..cc4bf78a0f 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -151,8 +151,9 @@ typedef struct { CamelFolder *destination, CamelException *ex); - void (*freeze) (CamelFolder *folder); - void (*thaw) (CamelFolder *folder); + void (*freeze) (CamelFolder *folder); + void (*thaw) (CamelFolder *folder); + gboolean (*is_frozen) (CamelFolder *folder); } CamelFolderClass; /* Standard Camel function */ @@ -269,6 +270,7 @@ void camel_folder_move_messages_to (CamelFolder *source, /* stop/restart getting events */ void camel_folder_freeze (CamelFolder *folder); void camel_folder_thaw (CamelFolder *folder); +gboolean camel_folder_is_frozen (CamelFolder *folder); #if 0 /* lock/unlock at the thread level, NOTE: only used internally */ diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index bf839a47eb..beb9ec2740 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -100,6 +100,8 @@ static void imap_move_messages_to (CamelFolder *source, GPtrArray *uids, static GPtrArray *imap_search_by_expression (CamelFolder *folder, const char *expression, CamelException *ex); static void imap_search_free (CamelFolder *folder, GPtrArray *uids); +static void imap_thaw (CamelFolder *folder); + GData *parse_fetch_response (CamelImapFolder *imap_folder, char *msg_att); static void @@ -116,6 +118,7 @@ camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) camel_folder_class->move_messages_to = imap_move_messages_to; camel_folder_class->search_by_expression = imap_search_by_expression; camel_folder_class->search_free = imap_search_free; + camel_folder_class->thaw = imap_thaw; camel_disco_folder_class->refresh_info_online = imap_refresh_info; camel_disco_folder_class->sync_online = imap_sync_online; @@ -371,6 +374,11 @@ imap_refresh_info (CamelFolder *folder, CamelException *ex) if (camel_disco_store_status (CAMEL_DISCO_STORE (imap_store)) == CAMEL_DISCO_STORE_OFFLINE) return; + if (camel_folder_is_frozen (folder)) { + imap_folder->need_refresh = TRUE; + return; + } + /* If the folder isn't selected, select it (which will force * a rescan if one is needed. */ @@ -935,6 +943,8 @@ do_append (CamelFolder *folder, CamelMimeMessage *message, g_byte_array_append (ba, "\0", 3); response = camel_imap_command_continuation (store, ex, ba->data); g_byte_array_free (ba, TRUE); + if (!response) + return response; if (store->capabilities & IMAP_CAPABILITY_UIDPLUS) { *uid = strstrcase (response->status, "[APPENDUID "); @@ -961,7 +971,9 @@ imap_append_online (CamelFolder *folder, CamelMimeMessage *message, CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); CamelImapResponse *response; char *uid; + int count; + count = camel_folder_summary_count (folder->summary); response = do_append (folder, message, info, &uid, ex); if (!response) return; @@ -979,6 +991,11 @@ imap_append_online (CamelFolder *folder, CamelMimeMessage *message, } camel_imap_response_free (store, response); + + /* Make sure a "folder_changed" is emitted. */ + if (store->current_folder != folder || + camel_folder_summary_count (folder->summary) == count) + imap_refresh_info (folder, ex); } static void @@ -1142,21 +1159,24 @@ imap_copy_online (CamelFolder *source, GPtrArray *uids, CamelFolder *destination, CamelException *ex) { CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); - CamelImapResponse *response; + int count; /* Sync message flags if needed. */ imap_sync_online (source, ex); if (camel_exception_is_set (ex)) return; + count = camel_folder_summary_count (destination->summary); + /* Now copy the messages */ do_copy (source, uids, destination, ex); if (camel_exception_is_set (ex)) return; - /* Force the destination folder to notice its new messages. */ - response = camel_imap_command (store, destination, NULL, "NOOP"); - camel_imap_response_free (store, response); + /* Make the destination notice its new messages */ + if (store->current_folder != destination || + camel_folder_summary_count (destination->summary) == count) + camel_folder_refresh_info (destination, ex); } static void @@ -1652,6 +1672,22 @@ camel_imap_folder_changed (CamelFolder *folder, int exists, camel_folder_summary_save (folder->summary); } +static void +imap_thaw (CamelFolder *folder) +{ + CamelImapFolder *imap_folder; + + CAMEL_FOLDER_CLASS (disco_folder_class)->thaw (folder); + if (camel_folder_is_frozen (folder)) + return; + + imap_folder = CAMEL_IMAP_FOLDER (folder); + if (imap_folder->need_refresh) { + imap_folder->need_refresh = FALSE; + imap_refresh_info (folder, NULL); + } +} + CamelStream * camel_imap_folder_fetch_data (CamelImapFolder *imap_folder, const char *uid, diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h index 8f358e656c..295cfd041e 100644 --- a/camel/providers/imap/camel-imap-folder.h +++ b/camel/providers/imap/camel-imap-folder.h @@ -48,7 +48,7 @@ struct _CamelImapFolder { struct _CamelImapFolderPrivate *priv; - gboolean need_rescan; + gboolean need_rescan, need_refresh; CamelFolderSearch *search; CamelImapMessageCache *cache; }; |