From d5e131e809cf52342d904857d41c2bb41973dde8 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 20 Sep 2011 11:53:02 +0300 Subject: [PATCH] imapc: Handle disconnection better when fetching a mail. --- src/lib-storage/index/imapc/imapc-mail.c | 32 +++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/lib-storage/index/imapc/imapc-mail.c b/src/lib-storage/index/imapc/imapc-mail.c index 4cc40c4f47..ed57890a5a 100644 --- a/src/lib-storage/index/imapc/imapc-mail.c +++ b/src/lib-storage/index/imapc/imapc-mail.c @@ -51,6 +51,22 @@ static bool imapc_mail_is_expunged(struct mail *_mail) return !imapc_msgmap_uid_to_rseq(msgmap, _mail->uid, &rseq); } +static void imapc_mail_failed(struct mail *mail, const char *field) +{ + struct imapc_mailbox *mbox = (struct imapc_mailbox *)mail->box; + + if (mail->expunged || imapc_mail_is_expunged(mail)) + mail_set_expunged(mail); + else if (!imapc_client_mailbox_is_connected(mbox->client_box)) { + /* we've already logged a disconnection error */ + mail_storage_set_internal_error(mail->box->storage); + } else { + mail_storage_set_critical(mail->box->storage, + "imapc: Remote server didn't send %s for UID %u", + field, mail->uid); + } +} + static int imapc_mail_get_received_date(struct mail *_mail, time_t *date_r) { struct index_mail *mail = (struct index_mail *)_mail; @@ -63,13 +79,7 @@ static int imapc_mail_get_received_date(struct mail *_mail, time_t *date_r) if (imapc_mail_fetch(_mail, MAIL_FETCH_RECEIVED_DATE) < 0) return -1; if (data->received_date == (time_t)-1) { - if (_mail->expunged || imapc_mail_is_expunged(_mail)) - mail_set_expunged(_mail); - else { - mail_storage_set_critical(_mail->box->storage, - "imapc: Remote server didn't send " - "INTERNALDATE for UID %u", _mail->uid); - } + imapc_mail_failed(_mail, "INTERNALDATE"); return -1; } } @@ -140,13 +150,7 @@ imapc_mail_get_stream(struct mail *_mail, struct message_size *hdr_size, return -1; if (data->stream == NULL) { - if (_mail->expunged || imapc_mail_is_expunged(_mail)) - mail_set_expunged(_mail); - else { - mail_storage_set_critical(_mail->box->storage, - "imapc: Remote server didn't send " - "BODY[] for UID %u", _mail->uid); - } + imapc_mail_failed(_mail, "BODY[]"); return -1; } } -- 2.47.3