imapc-mail-fetch.c revision 0f641fb49bf0a934556717a2c209566ac387d7bb
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen/* Copyright (c) 2011-2013 Dovecot authors, see the included COPYING file */
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenimapc_mail_prefetch_callback(const struct imapc_command_reply *reply,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen (struct imapc_mailbox *)mail->imail.mail.mail.box;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen unsigned int i, count;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen fetch_mails = array_get(&mbox->fetch_mails, &count);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen for (i = 0; i < count; i++) {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen else if (reply->state == IMAPC_COMMAND_STATE_NO) {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen imapc_copy_error_from_reply(mbox->storage, MAIL_ERROR_PARAMS,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen } else if (reply->state == IMAPC_COMMAND_STATE_DISCONNECTED) {
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* The disconnection message was already logged */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen mail_storage_set_internal_error(&mbox->storage->storage);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen mail_storage_set_critical(&mbox->storage->storage,
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen "imapc: Mail prefetch failed: %s", reply->text_full);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen imapc_client_stop(mbox->storage->client->client);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenheaders_have_subset(const char *const *superset, const char *const *subset)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen unsigned int i;
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen if (!str_array_icase_find(superset, subset[i]))
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenstatic const char *const *
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenheaders_merge(pool_t pool, const char *const *h1, const char *const *h2)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen unsigned int i;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (h1 == NULL || !str_array_icase_find(h1, h2[i])) {
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenimapc_mail_send_fetch(struct mail *_mail, enum mail_fetch_field fields,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen const char *const *headers)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct imapc_mail *mail = (struct imapc_mail *)_mail;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen unsigned int i;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* drop any fields that we may already be fetching currently */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (headers_have_subset(mail->fetching_headers, headers))
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* if we already know that the mail is expunged,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen don't try to FETCH it */
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen if (!mail_index_lookup_seq(view, _mail->uid, &seq) ||
2766f1de8141c09767a959d2d2c3065c5a300bf0Timo Sirainen /* opened as save-only. we'll need to fetch the mail,
2766f1de8141c09767a959d2d2c3065c5a300bf0Timo Sirainen so actually SELECT/EXAMINE the mailbox */
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen str_printfa(str, "UID FETCH %u (", _mail->uid);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen else if ((fields & MAIL_FETCH_STREAM_HEADER) != 0)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen for (i = 0; mail->fetching_headers[i] != NULL; i++) {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen imap_append_astring(str, mail->fetching_headers[i]);
} T_END;
return FALSE;
return FALSE;
return FALSE;
MAIL_FETCH_STREAM_BODY)) != 0) {
return FALSE;
return TRUE;
const char *const *headers)
int ret;
T_BEGIN {
} T_END;
if (ret < 0)
unsigned int i, count;
return TRUE;
return FALSE;
static const char *imapc_hide_headers[] = {
int ret;
} else if (have_body) {
if (ret < 0) {
const char *value;
int fd;
if (!body)
const char *value;
hdr_list++;
time_t t;
int tz;
if (!match) {