From: Timo Sirainen Date: Thu, 5 May 2011 15:49:45 +0000 (+0200) Subject: lib-storage: Added mail_parse(). X-Git-Tag: 2.0.13~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c7e14824e4e1ca9dc5d48d1eddc4a38d3041218f;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mail_parse(). --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index 244d888a51..5fa0f9c50d 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -152,6 +152,7 @@ struct mail_vfuncs cydir_mail_vfuncs = { index_mail_update_modseq, NULL, index_mail_expunge, + index_mail_parse, index_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index 50b39e4569..296e9566b8 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -214,6 +214,7 @@ struct mail_vfuncs mdbox_mail_vfuncs = { index_mail_update_modseq, NULL, index_mail_expunge, + index_mail_parse, index_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/index/dbox-single/sdbox-mail.c b/src/lib-storage/index/dbox-single/sdbox-mail.c index 76586a7141..175ef4ad50 100644 --- a/src/lib-storage/index/dbox-single/sdbox-mail.c +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c @@ -110,6 +110,7 @@ struct mail_vfuncs sdbox_mail_vfuncs = { index_mail_update_modseq, NULL, index_mail_expunge, + index_mail_parse, index_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 5bb1ef2d9a..a0f0317189 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1509,6 +1509,19 @@ void index_mail_expunge(struct mail *mail) } } +void index_mail_parse(struct mail *mail, bool parse_body) +{ + struct index_mail *imail = (struct index_mail *)mail; + + imail->data.access_part |= PARSE_HDR; + if (index_mail_parse_headers(imail, NULL) == 0) { + if (parse_body) { + imail->data.access_part |= PARSE_BODY; + (void)index_mail_parse_body(imail, 0); + } + } +} + void index_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) { diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index 651d7d4380..4ebf43f58c 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -202,6 +202,7 @@ void index_mail_update_keywords(struct mail *mail, enum modify_type modify_type, struct mail_keywords *keywords); void index_mail_update_modseq(struct mail *mail, uint64_t min_modseq); void index_mail_expunge(struct mail *mail); +void index_mail_parse(struct mail *mail, bool parse_body); void index_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field); int index_mail_opened(struct mail *mail, struct istream **stream); diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 8837cea675..e3f2dae8a4 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -656,6 +656,7 @@ struct mail_vfuncs maildir_mail_vfuncs = { index_mail_update_modseq, maildir_update_pop3_uidl, index_mail_expunge, + index_mail_parse, maildir_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 0bb212063f..47566a0500 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -411,6 +411,7 @@ struct mail_vfuncs mbox_mail_vfuncs = { index_mail_update_modseq, NULL, index_mail_expunge, + index_mail_parse, index_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 6a3aac3add..2e754d54be 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -138,6 +138,7 @@ struct mail_vfuncs raw_mail_vfuncs = { index_mail_update_modseq, NULL, index_mail_expunge, + index_mail_parse, index_mail_set_cache_corrupted, index_mail_opened }; diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index e1c7da52cf..8ca43ed8e3 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -336,6 +336,7 @@ struct mail_vfuncs { void (*update_modseq)(struct mail *mail, uint64_t min_modseq); void (*update_pop3_uidl)(struct mail *mail, const char *uidl); void (*expunge)(struct mail *mail); + void (*parse)(struct mail *mail, bool parse_body); void (*set_cache_corrupted)(struct mail *mail, enum mail_fetch_field field); int (*istream_opened)(struct mail *mail, struct istream **input); diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 0c88dfb256..7feaaffd0f 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -704,6 +704,9 @@ void mail_expunge(struct mail *mail); /* Returns TRUE if anything is cached for the mail, FALSE if not. */ bool mail_is_cached(struct mail *mail); +/* Parse mail's header and optionally body so that fields using them get + cached. */ +void mail_parse(struct mail *mail, bool parse_body); /* Mark a cached field corrupted and have it recalculated. */ void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field); diff --git a/src/lib-storage/mail.c b/src/lib-storage/mail.c index 50faf5a7d3..2ba727083f 100644 --- a/src/lib-storage/mail.c +++ b/src/lib-storage/mail.c @@ -246,6 +246,13 @@ bool mail_is_cached(struct mail *mail) mail->seq); } +void mail_parse(struct mail *mail, bool parse_body) +{ + struct mail_private *p = (struct mail_private *)mail; + + p->v.parse(mail, parse_body); +} + void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) { struct mail_private *p = (struct mail_private *)mail; diff --git a/src/lib-storage/test-mail.c b/src/lib-storage/test-mail.c index a8eb0f2724..e804e11d20 100644 --- a/src/lib-storage/test-mail.c +++ b/src/lib-storage/test-mail.c @@ -195,6 +195,11 @@ static void test_mail_expunge(struct mail *mail ATTR_UNUSED) { } +static void test_mail_parse(struct mail *mail ATTR_UNUSED, + bool parse_body ATTR_UNUSED) +{ +} + static void test_mail_set_cache_corrupted(struct mail *mail ATTR_UNUSED, enum mail_fetch_field field ATTR_UNUSED) @@ -229,6 +234,7 @@ struct mail_vfuncs test_mail_vfuncs = { test_mail_update_modseq, NULL, test_mail_expunge, + test_mail_parse, test_mail_set_cache_corrupted, NULL }; diff --git a/src/plugins/virtual/virtual-mail.c b/src/plugins/virtual/virtual-mail.c index 1c43675cf4..5a33b3f61e 100644 --- a/src/plugins/virtual/virtual-mail.c +++ b/src/plugins/virtual/virtual-mail.c @@ -369,6 +369,15 @@ static void virtual_mail_expunge(struct mail *mail) mail_expunge(vmail->backend_mail); } +static void virtual_mail_parse(struct mail *mail, bool parse_body) +{ + struct virtual_mail *vmail = (struct virtual_mail *)mail; + + if (virtual_mail_handle_lost(vmail) < 0) + return; + mail_parse(vmail->backend_mail, parse_body); +} + static void virtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field) { @@ -407,6 +416,7 @@ struct mail_vfuncs virtual_mail_vfuncs = { index_mail_update_modseq, virtual_mail_update_pop3_uidl, virtual_mail_expunge, + virtual_mail_parse, virtual_mail_set_cache_corrupted, NULL };