Mercurial > dovecot > core-2.2
changeset 13383:e404a1bef6bc
imapc: Fixed handling immediate changes when starting IDLE.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 04 Sep 2011 12:37:51 +0300 |
parents | b9c967c7d66b |
children | 33dc66d4286d |
files | 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 |
diffstat | 8 files changed, 42 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-client.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-client.c Sun Sep 04 12:37:51 2011 +0300 @@ -99,7 +99,7 @@ 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 @@ if (io_loop_is_running(client->ioloop)) io_loop_run(client->ioloop); + current_ioloop = prev_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);
--- a/src/lib-storage/index/imapc/imapc-client.h Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-client.h Sun Sep 04 12:37:51 2011 +0300 @@ -112,7 +112,8 @@ 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. */
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c Sun Sep 04 12:37:51 2011 +0300 @@ -156,7 +156,7 @@ 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; }
--- a/src/lib-storage/index/imapc/imapc-mail.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-mail.c Sun Sep 04 12:37:51 2011 +0300 @@ -210,7 +210,7 @@ (struct imapc_storage *)_mail->box->storage; while (imail->fetch_count > 0) - imapc_client_run(storage->client); + imapc_storage_run(storage); index_mail_close(_mail); }
--- a/src/lib-storage/index/imapc/imapc-save.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-save.c Sun Sep 04 12:37:51 2011 +0300 @@ -191,7 +191,7 @@ 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 @@ "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; }
--- a/src/lib-storage/index/imapc/imapc-storage.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-storage.c Sun Sep 04 12:37:51 2011 +0300 @@ -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_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 @@ 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);
--- a/src/lib-storage/index/imapc/imapc-storage.h Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-storage.h Sun Sep 04 12:37:51 2011 +0300 @@ -79,6 +79,8 @@ 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);
--- a/src/lib-storage/index/imapc/imapc-sync.c Sun Sep 04 12:29:45 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-sync.c Sun Sep 04 12:37:51 2011 +0300 @@ -204,7 +204,7 @@ 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_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)