changeset 9075:d77225a64128 HEAD

IMAP: Make sure pending syncs are done before a mailbox-changing command is run.
author Timo Sirainen <tss@iki.fi>
date Sun, 24 May 2009 18:09:12 -0400
parents 995d501d8f41
children 73b468723964
files src/imap/client.c
diffstat 1 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/client.c	Fri May 22 18:26:24 2009 -0400
+++ b/src/imap/client.c	Sun May 24 18:09:12 2009 -0400
@@ -370,13 +370,14 @@
 
 static struct client_command_context *
 client_command_find_with_flags(struct client_command_context *new_cmd,
-			       enum command_flags flags)
+			       enum command_flags flags,
+			       enum client_command_state max_state)
 {
 	struct client_command_context *cmd;
 
 	cmd = new_cmd->client->command_queue;
 	for (; cmd != NULL; cmd = cmd->next) {
-		if (cmd->state < CLIENT_COMMAND_STATE_WAIT_SYNC &&
+		if (cmd->state <= max_state &&
 		    cmd != new_cmd && (cmd->cmd_flags & flags) != 0)
 			return cmd;
 	}
@@ -386,6 +387,8 @@
 static bool client_command_check_ambiguity(struct client_command_context *cmd)
 {
 	enum command_flags flags;
+	enum client_command_state max_state =
+		CLIENT_COMMAND_STATE_WAIT_UNAMBIGUITY;
 	bool broken_client = FALSE;
 
 	if ((cmd->cmd_flags & COMMAND_FLAG_BREAKS_MAILBOX) ==
@@ -393,6 +396,7 @@
 		/* there must be no other command running that uses the
 		   selected mailbox */
 		flags = COMMAND_FLAG_USES_MAILBOX;
+		max_state = CLIENT_COMMAND_STATE_DONE;
 	} else if ((cmd->cmd_flags & COMMAND_FLAG_USES_SEQS) != 0) {
 		/* no existing command must be breaking sequences */
 		flags = COMMAND_FLAG_BREAKS_SEQS;
@@ -404,7 +408,7 @@
 		return FALSE;
 	}
 
-	if (client_command_find_with_flags(cmd, flags) == NULL) {
+	if (client_command_find_with_flags(cmd, flags, max_state) == NULL) {
 		if (cmd->client->syncing) {
 			/* don't do anything until syncing is finished */
 			return TRUE;