]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fixed reopening a mailbox.
authorTimo Sirainen <tss@iki.fi>
Thu, 20 Oct 2011 13:54:36 +0000 (16:54 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 20 Oct 2011 13:54:36 +0000 (16:54 +0300)
src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-connection.c
src/lib-imap-client/imapc-connection.h

index c9585f763a5a19910e277dd14a89b670cdb8a20f..c6f3dd93425a73c051f9908fc3f701c6b69280ae 100644 (file)
@@ -266,7 +266,7 @@ imapc_client_reconnect_cb(const struct imapc_command_reply *reply,
                /* reopen the mailbox */
                box->reopen_callback(box->reopen_context);
        } else {
-               imapc_connection_abort_commands(box->conn);
+               imapc_connection_abort_commands(box->conn, TRUE, FALSE);
        }
 }
 
index 655d5da159bb4040d4265810d06e63249da903e3..8d390bef55beb745af8bf375655ef17afeb2cf95 100644 (file)
@@ -233,21 +233,23 @@ imapc_connection_abort_commands_array(ARRAY_TYPE(imapc_command) *cmd_array,
        }
 }
 
-static void
-imapc_connection_abort_commands_full(struct imapc_connection *conn,
-                                    bool keep_retriable)
+void imapc_connection_abort_commands(struct imapc_connection *conn,
+                                    bool disconnected, bool keep_retriable)
 {
        struct imapc_command *const *cmdp, *cmd;
        ARRAY_TYPE(imapc_command) tmp_array;
        struct imapc_command_reply reply;
 
        t_array_init(&tmp_array, 8);
-       imapc_connection_abort_commands_array(&conn->cmd_wait_list,
-                                             &tmp_array, keep_retriable);
+       if (disconnected) {
+               imapc_connection_abort_commands_array(&conn->cmd_wait_list,
+                                                     &tmp_array,
+                                                     keep_retriable);
+       }
        imapc_connection_abort_commands_array(&conn->cmd_send_queue,
                                              &tmp_array, keep_retriable);
 
-       if (array_count(&conn->cmd_wait_list) > 0) {
+       if (array_count(&conn->cmd_wait_list) > 0 && disconnected) {
                /* need to move all the waiting commands to send queue */
                array_append_array(&conn->cmd_wait_list,
                                   &conn->cmd_send_queue);
@@ -271,11 +273,6 @@ imapc_connection_abort_commands_full(struct imapc_connection *conn,
        }
 }
 
-void imapc_connection_abort_commands(struct imapc_connection *conn)
-{
-       imapc_connection_abort_commands_full(conn, FALSE);
-}
-
 static void
 imapc_login_callback(struct imapc_connection *conn,
                     const struct imapc_command_reply *reply)
@@ -368,13 +365,13 @@ void imapc_connection_disconnect(struct imapc_connection *conn)
        net_disconnect(conn->fd);
        conn->fd = -1;
 
-       imapc_connection_abort_commands_full(conn, reconnecting);
+       imapc_connection_abort_commands(conn, TRUE, reconnecting);
        imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
 }
 
 static void imapc_connection_set_disconnected(struct imapc_connection *conn)
 {
-       imapc_connection_abort_commands(conn);
+       imapc_connection_abort_commands(conn, TRUE, FALSE);
        imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_DISCONNECTED);
 }
 
@@ -1808,7 +1805,7 @@ void imapc_connection_unselect(struct imapc_client_mailbox *box)
        struct imapc_connection *conn = box->conn;
 
        imapc_connection_send_idle_done(conn);
-       imapc_connection_abort_commands(conn);
+       imapc_connection_abort_commands(conn, FALSE, FALSE);
 
        if (conn->selected_box != NULL || conn->selecting_box != NULL) {
                i_assert(conn->selected_box == box ||
index b7cec0798e2c7e933a26d5db3e46c6220386a5da..8610c27ed8ac067b839508ba40273892fe4b7a31 100644 (file)
@@ -25,7 +25,8 @@ void imapc_connection_connect(struct imapc_connection *conn,
                              imapc_command_callback_t *login_callback,
                              void *login_context);
 void imapc_connection_disconnect(struct imapc_connection *conn);
-void imapc_connection_abort_commands(struct imapc_connection *conn);
+void imapc_connection_abort_commands(struct imapc_connection *conn,
+                                    bool disconnected, bool keep_retriable);
 void imapc_connection_ioloop_changed(struct imapc_connection *conn);
 void imapc_connection_input_pending(struct imapc_connection *conn);