index-mail.c revision 6e8f0036cad59d1d6bcd9ef69bfe712d01656ca3
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstruct mail_cache_field global_cache_fields[MAIL_INDEX_CACHE_FIELD_COUNT] = {
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen .field_size = sizeof(struct mail_sent_date) },
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic int index_mail_parse_body(struct index_mail *mail,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_cache_lookup_field(struct index_mail *mail, buffer_t *buf,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen ret = mail_cache_lookup_field(mail->mail.mail.transaction->cache_view,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail->mail.mail.transaction->stats.cache_hit_count++;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic struct message_part *get_unserialized_parts(struct index_mail *mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const unsigned int field_idx =
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail->ibox->cache_fields[MAIL_CACHE_MESSAGE_PARTS].idx;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen part_buf = buffer_create_dynamic(pool_datastack_create(), 128);
d06e111700769927a64b46dc157ac1c122dff1a0Timo Sirainen ret = index_mail_cache_lookup_field(mail, part_buf, field_idx);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen parts = message_part_deserialize(mail->data_pool, part_buf->data,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail_cache_set_corrupted(mail->mail.mail.box->cache,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen "Corrupted cached mime.parts data (%s)", error);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic bool get_cached_parts(struct index_mail *mail)
4307c886579381dbb1897ea1388ae6978c96f560Timo Sirainen /* we know the NULs now, update them */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if ((part->flags & MESSAGE_PART_FLAG_HAS_NULS) != 0) {
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic bool index_mail_get_fixed_field(struct index_mail *mail,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const unsigned int field_idx = mail->ibox->cache_fields[field].idx;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (index_mail_cache_lookup_field(mail, &buf, field_idx) <= 0)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenbool index_mail_get_cached_uoff_t(struct index_mail *mail,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen return index_mail_get_fixed_field(mail, field,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic bool index_mail_get_pvt(struct mail *_mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct mail_private *mail = (struct mail_private *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* no private view (set by view syncing) -> no private flags */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen index_transaction_init_pvt(_mail->transaction);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (!mail_index_lookup_seq(_mail->transaction->view_pvt, _mail->uid,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenenum mail_flags index_mail_get_flags(struct mail *_mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct mail_private *mail = (struct mail_private *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen rec = mail_index_lookup(_mail->transaction->view, _mail->seq);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (index_mailbox_is_recent(_mail->box, _mail->uid))
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* mailbox has private flags */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen pvt_flags_mask = mailbox_get_private_flags_mask(_mail->box);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen rec = mail_index_lookup(_mail->transaction->view_pvt,
2442c230b6c95b20d26ead752f9de1cb40544a53Phil Carmodyuint64_t index_mail_get_modseq(struct mail *_mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen mail_index_modseq_lookup(_mail->transaction->view, _mail->seq);
6b2f82c7ed4e646217a1ee29e99c83d95762a8d6Phil Carmodyconst char *const *index_mail_get_keywords(struct mail *_mail)
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen const char *const *names;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const unsigned int *keyword_indexes;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen keyword_indexes = array_get(&data->keyword_indexes, &count);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen names = array_get(mail->ibox->keyword_names, &names_count);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen p_array_init(&data->keywords, mail->data_pool, count + 1);
6b2f82c7ed4e646217a1ee29e99c83d95762a8d6Phil Carmody for (i = 0; i < count; i++) {
2282944443f78bd186809df235da1b7e801f0430Phil Carmody /* end with NULL */
2282944443f78bd186809df235da1b7e801f0430Phil Carmodyindex_mail_get_keyword_indexes(struct mail *_mail)
2282944443f78bd186809df235da1b7e801f0430Phil Carmody struct index_mail *mail = (struct index_mail *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (!array_is_created(&data->keyword_indexes)) {
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody p_array_init(&data->keyword_indexes, mail->data_pool, 32);
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody mail_index_lookup_keywords(_mail->transaction->view,
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmodyint index_mail_get_parts(struct mail *_mail, struct message_part **parts_r)
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody struct index_mail *mail = (struct index_mail *)_mail;
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody data->cache_fetch_fields |= MAIL_FETCH_MESSAGE_PARTS;
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody if (data->parts != NULL || get_cached_parts(mail)) {
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_get_received_date(struct mail *_mail, time_t *date_r)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen data->cache_fetch_fields |= MAIL_FETCH_RECEIVED_DATE;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (index_mail_get_fixed_field(mail, MAIL_CACHE_RECEIVED_DATE,
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen &t, sizeof(t)))
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_get_save_date(struct mail *_mail, time_t *date_r)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen data->cache_fetch_fields |= MAIL_FETCH_SAVE_DATE;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (index_mail_get_fixed_field(mail, MAIL_CACHE_SAVE_DATE,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen &t, sizeof(t)))
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic int index_mail_cache_sent_date(struct index_mail *mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const char *str;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if ((ret = mail_get_first_header(&mail->mail.mail, "Date", &str)) < 0)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen !message_date_parse((const unsigned char *)str,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* 0 = not found / invalid */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen index_mail_cache_add(mail, MAIL_CACHE_SENT_DATE,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_get_date(struct mail *_mail, time_t *date_r, int *timezone_r)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen (void)index_mail_get_fixed_field(mail, MAIL_CACHE_SENT_DATE,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic bool get_cached_msgpart_sizes(struct index_mail *mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen data->virtual_size = data->parts->header_size.virtual_size +
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen data->physical_size = data->parts->header_size.physical_size +
1d3ee23f5f573d5e5ab79422c0a23dab85f3d034Timo Sirainenbool index_mail_get_cached_virtual_size(struct index_mail *mail, uoff_t *size_r)
1d3ee23f5f573d5e5ab79422c0a23dab85f3d034Timo Sirainen data->cache_fetch_fields |= MAIL_FETCH_VIRTUAL_SIZE;
2442c230b6c95b20d26ead752f9de1cb40544a53Phil Carmody if (data->hdr_size_set && data->physical_size != (uoff_t)-1) {
1d3ee23f5f573d5e5ab79422c0a23dab85f3d034Timo Sirainen data->body_size.physical_size = data->physical_size -
2442c230b6c95b20d26ead752f9de1cb40544a53Phil Carmody data->body_size.virtual_size = data->virtual_size -
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic void index_mail_get_cached_body_size(struct index_mail *mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* we've already called get_cached_msgpart_sizes() and it didn't work.
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen try to do this by using cached virtual size and a quick physical
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen size lookup. */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (!index_mail_get_cached_virtual_size(mail, &tmp))
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (mail_get_physical_size(&mail->mail.mail, &tmp) < 0)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* we should have everything now. try again. */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen (void)index_mail_get_cached_virtual_size(mail, &tmp);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (index_mail_get_cached_virtual_size(mail, size_r))
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen old_offset = data->stream == NULL ? 0 : data->stream->v_offset;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (mail_get_stream(_mail, &hdr_size, &body_size, &input) < 0)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenint index_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen data->cache_fetch_fields |= MAIL_FETCH_PHYSICAL_SIZE;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenvoid index_mail_cache_add(struct index_mail *mail, enum index_cache_field field,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen index_mail_cache_add_idx(mail, mail->ibox->cache_fields[field].idx,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenvoid index_mail_cache_add_idx(struct index_mail *mail, unsigned int field_idx,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const struct mail_storage_settings *set = _mail->box->storage->set;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen /* First check if we've configured caching not to be used with
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen low enough message count. */
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen hdr = mail_index_get_header(_mail->transaction->view);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (hdr->messages_count < set->mail_cache_min_mail_count)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail->data.dont_cache_field_idx != field_idx) {
573424407a2d3c1453638a643583a7cf10c129e1Phil Carmody mail_cache_add(_mail->transaction->cache_trans, _mail->seq,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic void parse_bodystructure_part_header(struct message_part *part,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen imap_bodystructure_parse_header(pool, part, hdr);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic bool want_plain_bodystructure_cached(struct index_mail *mail)
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const unsigned int cache_field_body =
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail->ibox->cache_fields[MAIL_CACHE_IMAP_BODY].idx;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen const unsigned int cache_field_bodystructure =
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen mail->ibox->cache_fields[MAIL_CACHE_IMAP_BODYSTRUCTURE].idx;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if ((mail->data.wanted_fields & (MAIL_FETCH_IMAP_BODY |
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (mail_cache_field_want_add(_mail->transaction->cache_trans,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen if (mail_cache_field_want_add(_mail->transaction->cache_trans,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainenstatic void index_mail_body_parsed_cache_flags(struct index_mail *mail)
9afa8aff5bda7c24cce6cc19b8232d2a228b4109Timo Sirainen cache_flags_idx = mail->ibox->cache_fields[MAIL_CACHE_FLAGS].idx;
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen want_cached = mail_cache_field_want_add(_mail->transaction->cache_trans,
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen imap_bodystructure_is_plain_7bit(data->parts) &&
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody (want_cached || want_plain_bodystructure_cached(mail))) {
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody cache_flags |= MAIL_CACHE_FLAG_TEXT_PLAIN_7BIT_ASCII;
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody /* we need message_parts cached to be able to
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody actually use it in BODY/BODYSTRUCTURE reply */
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody /* cache flags should never get unset as long as the message doesn't
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody change, but try to handle it anyway */
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody cache_flags &= ~(MAIL_CACHE_FLAG_BINARY_HEADER |
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody if ((data->parts->flags & MESSAGE_PART_FLAG_HAS_NULS) != 0) {
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody if (data->hdr_size.virtual_size == data->hdr_size.physical_size)
8d4428cee277a9a84450a8c6771f7a4dc68638cfPhil Carmody if (data->body_size.virtual_size == data->body_size.physical_size)
5433d56d338db3948bf7bc22ef1daaba147dbb5dPhil Carmody if (cache_flags != data->cache_flags && want_cached) {
5433d56d338db3948bf7bc22ef1daaba147dbb5dPhil Carmody index_mail_cache_add_idx(mail, cache_flags_idx,
5433d56d338db3948bf7bc22ef1daaba147dbb5dPhil Carmodystatic void index_mail_body_parsed_cache_message_parts(struct index_mail *mail)
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody const unsigned int cache_field =
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody mail->ibox->cache_fields[MAIL_CACHE_MESSAGE_PARTS].idx;
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody mail_cache_field_exists(_mail->transaction->cache_view, _mail->seq,
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody /* already cached */
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody decision = mail_cache_field_get_decision(_mail->box->cache,
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody if (decision == (MAIL_CACHE_DECISION_NO | MAIL_CACHE_DECISION_FORCED)) {
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody /* we never want it cached */
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody (data->wanted_fields & MAIL_FETCH_MESSAGE_PARTS) == 0) {
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody /* we didn't really care about the message parts themselves,
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody just wanted to use something that depended on it */
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody buffer = buffer_create_dynamic(pool_datastack_create(), 1024);
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody message_part_serialize(mail->data.parts, buffer);
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmodyindex_mail_body_parsed_cache_bodystructure(struct index_mail *mail,
b22dcc3c0c84919fe500cf877d8dfd9bddbef76fPhil Carmody const unsigned int cache_field_parts =
const unsigned int cache_field_body =
const unsigned int cache_field_bodystructure =
if (plain_bodystructure)
if (cache_bodystructure) {
if (plain_bodystructure ||
if (cache_body) {
unsigned int cache_field;
switch (field) {
case MAIL_CACHE_SENT_DATE:
case MAIL_CACHE_RECEIVED_DATE:
case MAIL_CACHE_SAVE_DATE:
i_unreached();
return FALSE;
uint32_t t;
t = dates[i];
int ret;
return ret;
unsigned int block_size;
bool has_nuls;
int ret;
&has_nuls) < 0) {
&has_nuls) < 0) {
if (ret < 0)
switch (field) {
case MAIL_CACHE_IMAP_BODY:
i_unreached();
bool extended)
if (extended)
switch (field) {
case MAIL_FETCH_IMAP_BODY: {
const unsigned int body_cache_field =
const unsigned int bodystructure_cache_field =
4) parse body structure, and save BODY/BODYSTRUCTURE
body_cache_field) > 0)
bodystructure_cache_field) > 0) {
MAIL_CACHE_IMAP_BODY) < 0)
case MAIL_FETCH_IMAP_BODYSTRUCTURE: {
const unsigned int bodystructure_cache_field =
bodystructure_cache_field) > 0) {
case MAIL_FETCH_IMAP_ENVELOPE:
case MAIL_FETCH_FROM_ENVELOPE:
case MAIL_FETCH_UIDL_BACKEND:
case MAIL_FETCH_GUID:
case MAIL_FETCH_HEADER_MD5:
case MAIL_FETCH_POP3_ORDER:
case MAIL_FETCH_MAILBOX_NAME:
i_unreached();
return mail;
struct mail *
struct mailbox_transaction_context *t,
t->mail_ref_count++;
if (!closing) {
if (closing) {
const unsigned int cache_field_envelope =
unsigned int cache_field_hdr;
MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0 &&
const unsigned int cache_field =
cache_field) <= 0) {
const unsigned int cache_field1 =
const unsigned int cache_field2 =
cache_field1) <= 0 &&
cache_field2) <= 0) {
const unsigned int cache_field =
cache_field) <= 0) {
const unsigned int cache_field =
cache_field) <= 0) {
MAIL_FETCH_STREAM_BODY)) != 0) {
int fd;
return TRUE;
return TRUE;
return TRUE;
len = 0;
return TRUE;
return FALSE;
&block) > 0) {
bool success)
if (!success) {
if (!update_modseq) {
const char *value;
if (parse_body) {
const char *str;
const char *field_name;
switch ((int)field) {
case MAIL_FETCH_PHYSICAL_SIZE:
case MAIL_FETCH_VIRTUAL_SIZE:
case MAIL_FETCH_MESSAGE_PARTS:
case MAIL_FETCH_IMAP_BODY: