virtual-mail.c revision 942302b0247403645394d848b3c620ead262a2a5
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen /* currently active mail */
a8fe899601735459641edae975c0fa08be8482e2Timo Sirainen /* all allocated mails */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_alloc(struct mailbox_transaction_context *t,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)t->box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_create(&vmail->imail.mail.module_contexts, pool,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen sizeof(void *), 5);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_alloconly_create("virtual index_mail", 512);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen vmail->imail.trans = (struct index_transaction_context *)t;
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen i_array_init(&vmail->backend_mails, array_count(&mbox->backend_boxes));
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainenstatic void virtual_mail_free(struct mail *mail)
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen unsigned int i, count;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mails = array_get_modifiable(&vmail->backend_mails, &count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen for (i = 0; i < count; i++)
84078771687fabf75819918f0f3aecdc3ed08b36Timo Sirainenstatic struct mail *
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainenbackend_mail_find(struct virtual_mail *vmail, struct mailbox *box)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen unsigned int i, count;
428fb4dc39c6e9b2eb36216c396dad6096a65f8fTimo Sirainen mails = array_get(&vmail->backend_mails, &count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen for (i = 0; i < count; i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void virtual_mail_set_seq(struct mail *mail, uint32_t seq)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
c64840e98649f906a7b587c259d5b9e697c37498Timo Sirainen struct mailbox_transaction_context *backend_trans;
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen mail_index_lookup_ext(mbox->ibox.view, seq, mbox->virtual_ext_id,
c64840e98649f906a7b587c259d5b9e697c37498Timo Sirainen bbox = virtual_backend_box_lookup(mbox, vrec->mailbox_id);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->backend_mail = backend_mail_find(vmail, bbox->box);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_transaction_get(mail->transaction, bbox->box);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen backend_headers = vmail->wanted_headers == NULL ? NULL :
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->backend_mail = mail_alloc(backend_trans,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mailbox_header_lookup_unref(&backend_headers);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen array_append(&vmail->backend_mails, &vmail->backend_mail, 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_set_uid(vmail->backend_mail, vrec->real_uid);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memset(&vmail->imail.data, 0, sizeof(vmail->imail.data));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen rec = mail_index_lookup(mbox->ibox.view, seq);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.data.flags = rec->flags & MAIL_FLAGS_NONRECENT;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen mail->expunged = vmail->backend_mail->expunged;
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen mail->has_nuls = vmail->backend_mail->has_nuls;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->has_no_nuls = vmail->backend_mail->has_no_nuls;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic bool virtual_mail_set_uid(struct mail *mail, uint32_t uid)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (!mail_index_lookup_seq(mbox->ibox.view, uid, &seq))
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen virtual_mail_set_seq(vmail->backend_mail, seq);
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainenvirtual_mail_get_parts(struct mail *mail, const struct message_part **parts_r)
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen if (mail_get_parts(vmail->backend_mail, parts_r) < 0) {
fb297df915b623e8d83632abcd42182cbd86174aTimo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen if (mail_get_date(vmail->backend_mail, date_r, timezone_r) < 0) {
77a2367051db01c6fc8cc575242d8a7f5b2c1d42Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenstatic int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen if (mail_get_received_date(vmail->backend_mail, date_r) < 0) {
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainenstatic int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen if (mail_get_save_date(vmail->backend_mail, date_r) < 0) {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
28d6a9ec6b055ad6141f0961fe971543f781d4a6Timo Sirainenstatic int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen if (mail_get_virtual_size(vmail->backend_mail, size_r) < 0) {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainenstatic int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen if (mail_get_physical_size(vmail->backend_mail, size_r) < 0) {
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_first_header(struct mail *mail, const char *field,
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen struct mail_private *p = (struct mail_private *)vmail->backend_mail;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (p->v.get_first_header(vmail->backend_mail, field,
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenvirtual_mail_get_headers(struct mail *mail, const char *field,
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen bool decode_to_utf8, const char *const **value_r)
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen struct mail_private *p = (struct mail_private *)vmail->backend_mail;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen if (p->v.get_headers(vmail->backend_mail, field,
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenvirtual_mail_get_header_stream(struct mail *mail,
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen backend_headers = mailbox_header_lookup_init(vmail->backend_mail->box,
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen ret = mail_get_header_stream(vmail->backend_mail, headers, stream_r);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen mailbox_header_lookup_unref(&backend_headers);
27f174f3b836b18cb81cd1e6534031f1f3355348Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenvirtual_mail_get_stream(struct mail *mail, struct message_size *hdr_size,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen if (mail_get_stream(vmail->backend_mail, hdr_size, body_size,
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenvirtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen const char **value_r)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
7f3b826a89bcb7a72759912e99f574b28309fe1bTimo Sirainen if (mail_get_special(vmail->backend_mail, field, value_r) < 0) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
77d20bf99719739c8a3d1157ccc28f37f6032f94Timo Sirainenstatic void virtual_mail_expunge(struct mail *mail)
77d20bf99719739c8a3d1157ccc28f37f6032f94Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
77d20bf99719739c8a3d1157ccc28f37f6032f94Timo Sirainenvirtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
762d8af0b3fee4aef634f413ec61baccab827b37Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
762d8af0b3fee4aef634f413ec61baccab827b37Timo Sirainen mail_set_cache_corrupted(vmail->backend_mail, field);
762d8af0b3fee4aef634f413ec61baccab827b37Timo Sirainenstatic struct index_mail *virtual_mail_get_index_mail(struct mail *mail)
77d20bf99719739c8a3d1157ccc28f37f6032f94Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
77d20bf99719739c8a3d1157ccc28f37f6032f94Timo Sirainen return (struct index_mail *)vmail->backend_mail;