# HG changeset patch # User Timo Sirainen # Date 1301913743 -10800 # Node ID 194855240d319f690d16b69b25d50f15fb7199b9 # Parent 51ef5ffea07fe44bb31de05041dd12ba5f01f443 imapc: Stop FETCH wait after untagged reply is received, don't wait for tagged reply. diff -r 51ef5ffea07f -r 194855240d31 src/lib-storage/index/imapc/imapc-mail-fetch.c --- a/src/lib-storage/index/imapc/imapc-mail-fetch.c Mon Apr 04 13:07:19 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c Mon Apr 04 13:42:23 2011 +0300 @@ -112,6 +112,24 @@ return !mail->imail.data.prefetch_sent; } +static bool +imapc_mail_have_fields(struct imapc_mail *imail, enum mail_fetch_field fields) +{ + if ((fields & MAIL_FETCH_RECEIVED_DATE) != 0) { + if (imail->imail.data.received_date == (time_t)-1) + return FALSE; + fields &= ~MAIL_FETCH_RECEIVED_DATE; + } + if ((fields & (MAIL_FETCH_STREAM_HEADER | + MAIL_FETCH_STREAM_BODY)) != 0) { + if (imail->imail.data.stream == NULL) + return FALSE; + fields &= ~(MAIL_FETCH_STREAM_HEADER | MAIL_FETCH_STREAM_BODY); + } + i_assert(fields == 0); + return TRUE; +} + int imapc_mail_fetch(struct mail *_mail, enum mail_fetch_field fields) { struct imapc_mail *imail = (struct imapc_mail *)_mail; @@ -125,7 +143,10 @@ if (ret < 0) return -1; - while (imail->fetch_count > 0) + /* we'll continue waiting until we've got all the fields we wanted, + 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); return 0; } diff -r 51ef5ffea07f -r 194855240d31 src/lib-storage/index/imapc/imapc-mail.c --- a/src/lib-storage/index/imapc/imapc-mail.c Mon Apr 04 13:07:19 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-mail.c Mon Apr 04 13:42:23 2011 +0300 @@ -179,8 +179,19 @@ (void)imapc_mail_prefetch(_mail); } +static void imapc_mail_close(struct mail *_mail) +{ + struct imapc_mail *imail = (struct imapc_mail *)_mail; + struct imapc_storage *storage = + (struct imapc_storage *)_mail->box->storage; + + while (imail->fetch_count > 0) + imapc_client_run(storage->client); + index_mail_close(_mail); +} + struct mail_vfuncs imapc_mail_vfuncs = { - index_mail_close, + imapc_mail_close, imapc_mail_free, imapc_mail_set_seq, index_mail_set_uid,