]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fixed handling immediate changes when starting IDLE.
authorTimo Sirainen <tss@iki.fi>
Sun, 4 Sep 2011 09:37:51 +0000 (12:37 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 4 Sep 2011 09:37:51 +0000 (12:37 +0300)
src/lib-storage/index/imapc/imapc-client.c
src/lib-storage/index/imapc/imapc-client.h
src/lib-storage/index/imapc/imapc-mail-fetch.c
src/lib-storage/index/imapc/imapc-mail.c
src/lib-storage/index/imapc/imapc-save.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/imapc/imapc-storage.h
src/lib-storage/index/imapc/imapc-sync.c

index 54f84bf5af3e5cf609b14df809afdb030a52702d..254abd1d07f42bfceba65efe4ebd563824a2e8a3 100644 (file)
@@ -99,7 +99,7 @@ void imapc_client_register_untagged(struct imapc_client *client,
        client->untagged_context = context;
 }
 
-void imapc_client_run(struct imapc_client *client)
+void imapc_client_run_pre(struct imapc_client *client)
 {
        struct imapc_client_connection *const *connp;
        struct ioloop *prev_ioloop = current_ioloop;
@@ -121,8 +121,13 @@ void imapc_client_run(struct imapc_client *client)
 
        if (io_loop_is_running(client->ioloop))
                io_loop_run(client->ioloop);
-
        current_ioloop = prev_ioloop;
+}
+
+void imapc_client_run_post(struct imapc_client *client)
+{
+       struct imapc_client_connection *const *connp;
+
        array_foreach(&client->conns, connp)
                imapc_connection_ioloop_changed((*connp)->conn);
 
index 3180adf30bd786f33c4c91decd419a07d50d0fdb..052527e7bd6c39d5e134a91aa2f7b7f21eeabce8 100644 (file)
@@ -112,7 +112,8 @@ void imapc_client_register_untagged(struct imapc_client *client,
                                    imapc_untagged_callback_t *callback,
                                    void *context);
 
-void imapc_client_run(struct imapc_client *client);
+void imapc_client_run_pre(struct imapc_client *client);
+void imapc_client_run_post(struct imapc_client *client);
 void imapc_client_stop(struct imapc_client *client);
 /* Stop immediately, don't finish even any already read pending replies.
    They'll be finished when imapc_client_run() is again called. */
index b9d726d91ae1388dabb114dd064d622818346803..7e896abb7ee6728832a5816c05135f49b5223027 100644 (file)
@@ -156,7 +156,7 @@ int imapc_mail_fetch(struct mail *_mail, enum mail_fetch_field fields)
           or until all FETCH replies have been received (i.e. some FETCHes
           failed) */
        while (!imapc_mail_have_fields(imail, fields) && imail->fetch_count > 0)
-               imapc_client_run(storage->client);
+               imapc_storage_run(storage);
        return 0;
 }
 
index 1cd0dcf72ee4614fb5a85eb75c1f994e01df2d65..c26269bd2706a23d443360239b8b19479969566d 100644 (file)
@@ -210,7 +210,7 @@ static void imapc_mail_close(struct mail *_mail)
                (struct imapc_storage *)_mail->box->storage;
 
        while (imail->fetch_count > 0)
-               imapc_client_run(storage->client);
+               imapc_storage_run(storage);
        index_mail_close(_mail);
 }
 
index f514ed3e257982d8f8310bf5b615c4bb37a09cf9..59bd569f81b04f2594145c78896e61045ea679cb 100644 (file)
@@ -191,7 +191,7 @@ static int imapc_save_append(struct imapc_save_context *ctx)
                          ctx->mbox->box.name, flags, internaldate, input);
        i_stream_unref(&input);
        while (sctx.ret == -2)
-               imapc_client_run(ctx->mbox->storage->client);
+               imapc_storage_run(ctx->mbox->storage);
        return sctx.ret;
 }
 
@@ -337,7 +337,7 @@ int imapc_copy(struct mail_save_context *_ctx, struct mail *mail)
                                          "UID COPY %u %s",
                                          mail->uid, _t->box->name);
                while (sctx.ret == -2)
-                       imapc_client_run(src_mbox->storage->client);
+                       imapc_storage_run(src_mbox->storage);
                ctx->finished = TRUE;
                return sctx.ret;
        }
index 9290ca7f9dfca4c68dacd41114144b45f0067323..76c25bea08f1604d8cdf118057be255a7d366338 100644 (file)
@@ -6,7 +6,8 @@
 #include "imap-arg.h"
 #include "imap-resp-code.h"
 #include "imapc-mail.h"
-#include "imapc-client.h"
+#include "imapc-client-private.h"
+#include "imapc-connection.h"
 #include "imapc-list.h"
 #include "imapc-sync.h"
 #include "imapc-settings.h"
@@ -105,7 +106,28 @@ void imapc_simple_context_init(struct imapc_simple_context *sctx,
 void imapc_simple_run(struct imapc_simple_context *sctx)
 {
        while (sctx->ret == -2)
-               imapc_client_run(sctx->storage->client);
+               imapc_storage_run(sctx->storage);
+}
+
+void imapc_storage_run(struct imapc_storage *storage)
+{
+       struct imapc_client_mailbox *client_box;
+       struct imapc_client_connection *const *connp;
+       struct imapc_mailbox *mbox;
+
+       imapc_client_run_pre(storage->client);
+
+       array_foreach(&storage->client->conns, connp) {
+               client_box = imapc_connection_get_mailbox((*connp)->conn);
+               if (client_box == NULL)
+                       continue;
+
+               mbox = client_box->untagged_box_context;
+               if (mbox->to_idle_delay != NULL)
+                       mbox->to_idle_delay = io_loop_move_timeout(&mbox->to_idle_delay);
+       }
+
+       imapc_client_run_post(storage->client);
 }
 
 void imapc_simple_callback(const struct imapc_command_reply *reply,
@@ -333,7 +355,7 @@ static int imapc_mailbox_open(struct mailbox *box)
                                          imapc_mailbox_open_callback,
                                          &ctx, mbox);
        while (ctx.ret == -2)
-               imapc_client_run(mbox->storage->client);
+               imapc_storage_run(mbox->storage);
        mbox->opening = FALSE;
        if (!mbox->open_success) {
                mailbox_close(box);
index 63057936bde18e610f66adf45c33dcd967ec6d70..1d248edae1fa1c12fc3afb9bb949272ea326ce86 100644 (file)
@@ -79,6 +79,8 @@ void imapc_transaction_save_commit_post(struct mail_save_context *ctx,
                                        struct mail_index_transaction_commit_result *result);
 void imapc_transaction_save_rollback(struct mail_save_context *ctx);
 
+void imapc_storage_run(struct imapc_storage *storage);
+
 void imapc_copy_error_from_reply(struct imapc_storage *storage,
                                 enum mail_error default_error,
                                 const struct imapc_command_reply *reply);
index 180c4a8a01916e4af6dc42e8cd085ef8a53ddb59..0402830c33140bfa8143f9587760937b01d7c86f 100644 (file)
@@ -204,7 +204,7 @@ static void imapc_sync_index(struct imapc_sync_context *ctx)
 
        imapc_sync_expunge_finish(ctx);
        while (ctx->sync_command_count > 0)
-               imapc_client_run(ctx->mbox->storage->client);
+               imapc_storage_run(ctx->mbox->storage);
        array_free(&ctx->expunged_uids);
 
        if (box->v.sync_notify != NULL)
@@ -316,7 +316,7 @@ imapc_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
                imapc_client_mailbox_cmdf(mbox->client_box,
                                          imapc_noop_stop_callback,
                                          mbox->storage, "NOOP");
-               imapc_client_run(mbox->storage->client);
+               imapc_storage_run(mbox->storage);
        }
 
        if (imapc_mailbox_commit_delayed_trans(mbox, &changes) < 0)