changeset 6454:b5e6543b4385 HEAD

Make sure we do a mailbox sync after flag updates (STORE, FETCH). Also added a new IMAP_SYNC_FLAG_SAFE which is used to figure out if appends and expunges are safe to send to client when delay-newmail workaround is enabled.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Sep 2007 13:55:36 +0300
parents d98617723bc2
children 5ad7a36ca8c3
files src/imap/cmd-append.c src/imap/cmd-check.c src/imap/cmd-copy.c src/imap/cmd-expunge.c src/imap/cmd-fetch.c src/imap/cmd-noop.c src/imap/cmd-store.c src/imap/imap-fetch.c src/imap/imap-fetch.h src/imap/imap-sync.c src/imap/imap-sync.h
diffstat 11 files changed, 32 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-append.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-append.c	Sat Sep 22 13:55:36 2007 +0300
@@ -235,6 +235,7 @@
 	if (args->type == IMAP_ARG_EOL) {
 		/* last message */
 		enum mailbox_sync_flags sync_flags;
+		enum imap_sync_flags imap_flags;
 		uint32_t uid_validity, uid1, uid2;
 		const char *msg;
 
@@ -267,11 +268,16 @@
 					      uid_validity, uid1, uid2);
 		}
 
-		sync_flags = ctx->box == cmd->client->mailbox ?
-			0 : MAILBOX_SYNC_FLAG_FAST;
+		if (ctx->box == cmd->client->mailbox) {
+			sync_flags = 0;
+			imap_flags = IMAP_SYNC_FLAG_SAFE;
+		} else {
+			sync_flags = MAILBOX_SYNC_FLAG_FAST;
+			imap_flags = 0;
+		}
 
 		cmd_append_finish(ctx);
-		return cmd_sync(cmd, sync_flags, 0, msg);
+		return cmd_sync(cmd, sync_flags, imap_flags, msg);
 	}
 
 	if (!validate_args(args, &flags_list, &internal_date_str,
--- a/src/imap/cmd-check.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-check.c	Sat Sep 22 13:55:36 2007 +0300
@@ -9,5 +9,6 @@
 		return TRUE;
 
 	return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FULL_READ |
-			MAILBOX_SYNC_FLAG_FULL_WRITE, 0, "OK Check completed.");
+			MAILBOX_SYNC_FLAG_FULL_WRITE, IMAP_SYNC_FLAG_SAFE,
+			"OK Check completed.");
 }
--- a/src/imap/cmd-copy.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-copy.c	Sat Sep 22 13:55:36 2007 +0300
@@ -92,7 +92,8 @@
 	struct mailbox_transaction_context *t;
         struct mail_search_arg *search_arg;
 	const char *messageset, *mailbox, *src_uidset, *msg = NULL;
-        enum mailbox_sync_flags sync_flags = 0;
+	enum mailbox_sync_flags sync_flags = 0;
+	enum imap_sync_flags imap_flags = 0;
 	unsigned int copy_count;
 	uint32_t uid_validity, uid1, uid2;
 	int ret;
@@ -159,11 +160,12 @@
 
 	if (destbox != client->mailbox) {
 		sync_flags |= MAILBOX_SYNC_FLAG_FAST;
+		imap_flags |= IMAP_SYNC_FLAG_SAFE;
 		mailbox_close(&destbox);
 	}
 
 	if (ret > 0)
-		return cmd_sync(cmd, sync_flags, 0, msg);
+		return cmd_sync(cmd, sync_flags, imap_flags, msg);
 	else if (ret == 0) {
 		/* some messages were expunged, sync them */
 		return cmd_sync(cmd, 0, 0,
--- a/src/imap/cmd-expunge.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-expunge.c	Sat Sep 22 13:55:36 2007 +0300
@@ -28,9 +28,10 @@
 	if (search_arg == NULL)
 		return TRUE;
 
-	if (imap_expunge(client->mailbox, search_arg))
-		return cmd_sync(cmd, 0, 0, "OK Expunge completed.");
-	else {
+	if (imap_expunge(client->mailbox, search_arg)) {
+		return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE,
+				"OK Expunge completed.");
+	} else {
 		client_send_storage_error(cmd,
 					  mailbox_get_storage(client->mailbox));
 		return TRUE;
@@ -44,9 +45,10 @@
 	if (!client_verify_open_mailbox(cmd))
 		return TRUE;
 
-	if (imap_expunge(client->mailbox, NULL))
-		return cmd_sync(cmd, 0, 0, "OK Expunge completed.");
-	else {
+	if (imap_expunge(client->mailbox, NULL)) {
+		return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE,
+				"OK Expunge completed.");
+	} else {
 		client_send_storage_error(cmd,
 					  mailbox_get_storage(client->mailbox));
 		return TRUE;
--- a/src/imap/cmd-fetch.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-fetch.c	Sat Sep 22 13:55:36 2007 +0300
@@ -95,7 +95,8 @@
 		return TRUE;
 	}
 
-	return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FAST |
+	return cmd_sync(cmd,
+			(ctx->seen_flags_changed ? MAILBOX_SYNC_FLAG_FAST : 0) |
 			(cmd->uid ? 0 : MAILBOX_SYNC_FLAG_NO_EXPUNGES), 0,
 			ok_message);
 }
--- a/src/imap/cmd-noop.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-noop.c	Sat Sep 22 13:55:36 2007 +0300
@@ -5,5 +5,5 @@
 
 bool cmd_noop(struct client_command_context *cmd)
 {
-	return cmd_sync(cmd, 0, 0, "OK NOOP completed.");
+	return cmd_sync(cmd, 0, IMAP_SYNC_FLAG_SAFE, "OK NOOP completed.");
 }
--- a/src/imap/cmd-store.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/cmd-store.c	Sat Sep 22 13:55:36 2007 +0300
@@ -123,7 +123,7 @@
 		   flag changes that were caused by UID STORE and those that
 		   came externally, so we'll just send the UID for all flag
 		   changes that we see. */
-		return cmd_sync(cmd, MAILBOX_SYNC_FLAG_FAST |
+		return cmd_sync(cmd,
 				(cmd->uid ? 0 : MAILBOX_SYNC_FLAG_NO_EXPUNGES),
 				cmd->uid && !silent ?
 				IMAP_SYNC_FLAG_SEND_UID : 0,
--- a/src/imap/imap-fetch.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/imap-fetch.c	Sat Sep 22 13:55:36 2007 +0300
@@ -511,6 +511,7 @@
 
 	if (ctx->flags_update_seen && (flags & MAIL_SEEN) == 0) {
 		/* Add \Seen flag */
+		ctx->seen_flags_changed = TRUE;
 		flags |= MAIL_SEEN;
 		mail_update_flags(mail, MODIFY_ADD, MAIL_SEEN);
 	} else if (ctx->flags_show_only_seen_changes) {
--- a/src/imap/imap-fetch.h	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/imap-fetch.h	Sat Sep 22 13:55:36 2007 +0300
@@ -55,6 +55,7 @@
 
 	unsigned int flags_have_handler:1;
 	unsigned int flags_update_seen:1;
+	unsigned int seen_flags_changed:1;
 	unsigned int flags_show_only_seen_changes:1;
 	unsigned int update_partial:1;
 	unsigned int cur_have_eoh:1;
--- a/src/imap/imap-sync.c	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/imap-sync.c	Sat Sep 22 13:55:36 2007 +0300
@@ -244,7 +244,7 @@
 	}
 
 	no_newmail = (client_workarounds & WORKAROUND_DELAY_NEWMAIL) != 0 &&
-		(flags & MAILBOX_SYNC_FLAG_FAST) != 0;
+		(imap_flags & IMAP_SYNC_FLAG_SAFE) == 0;
 	if (no_newmail) {
 		/* expunges might break the client just as badly as new mail
 		   notifications. */
--- a/src/imap/imap-sync.h	Sat Sep 22 13:45:14 2007 +0300
+++ b/src/imap/imap-sync.h	Sat Sep 22 13:55:36 2007 +0300
@@ -2,7 +2,8 @@
 #define IMAP_SYNC_H
 
 enum imap_sync_flags {
-	IMAP_SYNC_FLAG_SEND_UID	= 0x01
+	IMAP_SYNC_FLAG_SEND_UID	= 0x01,
+	IMAP_SYNC_FLAG_SAFE	= 0x02
 };
 
 struct client;