changeset 7816:ea6727a1220e HEAD

Changed the way mailbox changing ambiguity is checked.
author Timo Sirainen <tss@iki.fi>
date Wed, 11 Jun 2008 15:43:12 +0300
parents 2d62129a709b
children ffaf1ea49704
files src/imap/client.c src/imap/client.h src/imap/cmd-close.c src/imap/cmd-select.c src/imap/cmd-unselect.c
diffstat 5 files changed, 11 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/client.c	Wed Jun 11 14:39:52 2008 +0300
+++ b/src/imap/client.c	Wed Jun 11 15:43:12 2008 +0300
@@ -401,7 +401,8 @@
 			/* don't do anything until syncing is finished */
 			return TRUE;
 		}
-		if (cmd->client->changing_mailbox) {
+		if (cmd->client->mailbox_change_lock != NULL &&
+		    cmd->client->mailbox_change_lock != cmd) {
 			/* don't do anything until mailbox is fully
 			   opened/closed */
 			return TRUE;
@@ -464,6 +465,8 @@
 		client->input_lock = NULL;
 	if (client->output_lock == cmd)
 		client->output_lock = NULL;
+	if (client->mailbox_change_lock == cmd)
+		client->mailbox_change_lock = NULL;
 
 	if (client->free_parser != NULL)
 		imap_parser_destroy(&cmd->parser);
--- a/src/imap/client.h	Wed Jun 11 14:39:52 2008 +0300
+++ b/src/imap/client.h	Wed Jun 11 15:43:12 2008 +0300
@@ -103,6 +103,8 @@
 	/* client input/output is locked by this command */
 	struct client_command_context *input_lock;
 	struct client_command_context *output_lock;
+	/* command changing the mailbox */
+	struct client_command_context *mailbox_change_lock;
 
 	/* syncing marks this TRUE when it sees \Deleted flags. this is by
 	   EXPUNGE for Outlook-workaround. */
@@ -112,7 +114,6 @@
 	unsigned int destroyed:1;
 	unsigned int handling_input:1;
 	unsigned int syncing:1;
-	unsigned int changing_mailbox:1;
 	unsigned int input_skip_line:1; /* skip all the data until we've
 					   found a new line */
 	unsigned int modseqs_sent_since_sync:1;
--- a/src/imap/cmd-close.c	Wed Jun 11 14:39:52 2008 +0300
+++ b/src/imap/cmd-close.c	Wed Jun 11 15:43:12 2008 +0300
@@ -12,7 +12,6 @@
 			mailbox_get_storage(client->mailbox));
 	}
 	client_update_mailbox_flags(client, NULL);
-	client->changing_mailbox = FALSE;
 }
 
 static bool cmd_close_callback(struct client_command_context *cmd)
@@ -38,8 +37,8 @@
 	if (!client_verify_open_mailbox(cmd))
 		return TRUE;
 
-	i_assert(!client->changing_mailbox);
-	client->changing_mailbox = TRUE;
+	i_assert(client->mailbox_change_lock == NULL);
+	client->mailbox_change_lock = cmd;
 
 	storage = mailbox_get_storage(mailbox);
 	if ((ret = imap_expunge(mailbox, NULL)) < 0)
--- a/src/imap/cmd-select.c	Wed Jun 11 14:39:52 2008 +0300
+++ b/src/imap/cmd-select.c	Wed Jun 11 15:43:12 2008 +0300
@@ -195,7 +195,6 @@
 				    "OK [READ-ONLY] Select completed." :
 				    "OK [READ-WRITE] Select completed.");
 	}
-	ctx->cmd->client->changing_mailbox = FALSE;
 	select_context_free(ctx);
 }
 
@@ -355,8 +354,8 @@
 		}
 	}
 
-	i_assert(!client->changing_mailbox);
-	client->changing_mailbox = TRUE;
+	i_assert(client->mailbox_change_lock == NULL);
+	client->mailbox_change_lock = cmd;
 
 	if (client->mailbox != NULL) {
 		client_search_updates_free(client);
--- a/src/imap/cmd-unselect.c	Wed Jun 11 14:39:52 2008 +0300
+++ b/src/imap/cmd-unselect.c	Wed Jun 11 15:43:12 2008 +0300
@@ -14,7 +14,7 @@
 
 	client_search_updates_free(client);
 
-	i_assert(!client->changing_mailbox);
+	i_assert(client->mailbox_change_lock == NULL);
 	client->mailbox = NULL;
 
 	storage = mailbox_get_storage(mailbox);