virtual-mail.c revision 6de6ec228a41275ddda972d4a554699ea75cd06d
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2008-2016 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "lib.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "array.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "index-mail.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "virtual-storage.h"
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen#include "virtual-transaction.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct virtual_mail {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct index_mail imail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen enum mail_fetch_field wanted_fields;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* currently active mail */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *cur_backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct virtual_mail_index_record cur_vrec;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* all allocated mails */
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct mail *) backend_mails;
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen /* mail is lost if backend_mail doesn't point to correct mail */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen unsigned int cur_lost:1;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail *
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_alloc(struct mailbox_transaction_context *t,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen enum mail_fetch_field wanted_fields,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)t->box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_t pool;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool = pool_alloconly_create("vmail", 1024);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail = p_new(pool, struct virtual_mail, 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.mail.pool = pool;
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen vmail->imail.mail.data_pool =
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen pool_alloconly_create("virtual index_mail", 512);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.mail.v = virtual_mail_vfuncs;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.mail.mail.box = t->box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.mail.mail.transaction = t;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_create(&vmail->imail.mail.module_contexts, pool,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen sizeof(void *), 5);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen vmail->imail.ibox = INDEX_STORAGE_CONTEXT(t->box);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->wanted_fields = wanted_fields;
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen if (wanted_headers != NULL) {
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen vmail->wanted_headers = wanted_headers;
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen mailbox_header_lookup_ref(wanted_headers);
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen }
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_array_init(&vmail->backend_mails, array_count(&mbox->backend_boxes));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return &vmail->imail.mail.mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void virtual_mail_free(struct mail *mail)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail **mails;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int i, count;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mails = array_get_modifiable(&vmail->backend_mails, &count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen for (i = 0; i < count; i++)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_free(&mails[i]);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_free(&vmail->backend_mails);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen if (vmail->wanted_headers != NULL)
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen mailbox_header_lookup_unref(&vmail->wanted_headers);
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen pool_unref(&vmail->imail.mail.data_pool);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_unref(&vmail->imail.mail.pool);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic struct mail *
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenbackend_mail_find(struct virtual_mail *vmail, struct mailbox *box)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail *const *mails;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int i, count;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mails = array_get(&vmail->backend_mails, &count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen for (i = 0; i < count; i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mails[i]->box == box)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return mails[i];
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return NULL;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstatic int backend_mail_get(struct virtual_mail *vmail,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail **backend_mail_r)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen{
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *mail = &vmail->imail.mail.mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct virtual_backend_box *bbox;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen *backend_mail_r = NULL;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (vmail->cur_backend_mail != NULL) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (vmail->cur_lost) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_set_expunged(&vmail->imail.mail.mail);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen *backend_mail_r = vmail->cur_backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return 0;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen bbox = virtual_backend_box_lookup(mbox, vmail->cur_vrec.mailbox_id);
d85a1a9d9af4a36ded4d30cb277905c807de2ec5Timo Sirainen i_assert(bbox != NULL);
d85a1a9d9af4a36ded4d30cb277905c807de2ec5Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen vmail->cur_backend_mail = backend_mail_find(vmail, bbox->box);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (vmail->cur_backend_mail == NULL) {
d979c1179d55ad86e40f869e48ef3e4db9c817b5Timo Sirainen if (!bbox->box->opened &&
d979c1179d55ad86e40f869e48ef3e4db9c817b5Timo Sirainen virtual_backend_box_open(mbox, bbox) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, bbox->box);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen (void)virtual_mail_set_backend_mail(mail, bbox);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
d979c1179d55ad86e40f869e48ef3e4db9c817b5Timo Sirainen virtual_backend_box_accessed(mbox, bbox);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen vmail->cur_lost = !mail_set_uid(vmail->cur_backend_mail,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen vmail->cur_vrec.real_uid);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail->expunged = vmail->cur_lost || vmail->cur_backend_mail->expunged;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (vmail->cur_lost) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_set_expunged(&vmail->imail.mail.mail);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen *backend_mail_r = vmail->cur_backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return 0;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen}
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenstruct mail *
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenvirtual_mail_set_backend_mail(struct mail *mail,
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct virtual_backend_box *bbox)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen{
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen struct mail_private *backend_pmail;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct mailbox_transaction_context *backend_trans;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen i_assert(bbox->box->opened);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen backend_trans = virtual_transaction_get(mail->transaction, bbox->box);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen backend_headers = vmail->wanted_headers == NULL ? NULL :
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen mailbox_header_lookup_init(bbox->box,
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen vmail->wanted_headers->name);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen vmail->cur_backend_mail =
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_alloc(backend_trans, vmail->wanted_fields, backend_headers);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if (backend_headers != NULL)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen mailbox_header_lookup_unref(&backend_headers);
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen backend_pmail = (struct mail_private *)vmail->cur_backend_mail;
13e130c3af3032982de6b1d13c6dcddda9164848Timo Sirainen backend_pmail->vmail = mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen array_append(&vmail->backend_mails, &vmail->cur_backend_mail, 1);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return vmail->cur_backend_mail;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen}
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainenstatic void virtual_mail_set_seq(struct mail *mail, uint32_t seq, bool saving)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const void *data;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainen i_assert(!saving);
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainen
a249dd267f05d349f1b4aa27b40a56083c8ba392Timo Sirainen mail_index_lookup_ext(mail->transaction->view, seq,
03010dbaa74ec70f062994dfe3cd39bedc99a28bTimo Sirainen mbox->virtual_ext_id, &data, NULL);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen memcpy(&vmail->cur_vrec, data, sizeof(vmail->cur_vrec));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memset(&vmail->imail.data, 0, sizeof(vmail->imail.data));
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen p_clear(vmail->imail.mail.data_pool);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.data.seq = seq;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->seq = seq;
a249dd267f05d349f1b4aa27b40a56083c8ba392Timo Sirainen mail_index_lookup_uid(mail->transaction->view, seq, &mail->uid);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen vmail->cur_backend_mail = NULL;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic bool virtual_mail_set_uid(struct mail *mail, uint32_t uid)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t seq;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
a249dd267f05d349f1b4aa27b40a56083c8ba392Timo Sirainen if (!mail_index_lookup_seq(mail->transaction->view, uid, &seq))
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return FALSE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainen virtual_mail_set_seq(mail, seq, FALSE);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainenstatic void virtual_mail_set_uid_cache_updates(struct mail *mail, bool set)
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen{
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p->v.set_uid_cache_updates(backend_mail, set);
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen}
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainenstatic bool virtual_mail_prefetch(struct mail *mail)
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen{
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return TRUE;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return p->v.prefetch(backend_mail);
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen}
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstatic void virtual_mail_precache(struct mail *mail)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p->v.precache(backend_mail);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen}
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainenstatic void
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainenvirtual_mail_add_temp_wanted_fields(struct mail *mail,
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen enum mail_fetch_field fields,
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen struct mailbox_header_lookup_ctx *headers)
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen{
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p->v.add_temp_wanted_fields(backend_mail, fields, headers);
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen}
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainenvirtual_mail_get_parts(struct mail *mail, struct message_part **parts_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_parts(backend_mail, parts_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen int tz;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (timezone_r == NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen timezone_r = &tz;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_date(backend_mail, date_r, timezone_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_received_date(backend_mail, date_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_save_date(backend_mail, date_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_virtual_size(backend_mail, size_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_physical_size(backend_mail, size_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_first_header(struct mail *mail, const char *field,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool decode_to_utf8, const char **value_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
45d47bc4660fe4bbb07817c9580deef9cca63646Timo Sirainen int ret;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen ret = p->v.get_first_header(backend_mail, field,
45d47bc4660fe4bbb07817c9580deef9cca63646Timo Sirainen decode_to_utf8, value_r);
45d47bc4660fe4bbb07817c9580deef9cca63646Timo Sirainen if (ret < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
45d47bc4660fe4bbb07817c9580deef9cca63646Timo Sirainen return ret;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_headers(struct mail *mail, const char *field,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool decode_to_utf8, const char *const **value_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_private *p;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen p = (struct mail_private *)backend_mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (p->v.get_headers(backend_mail, field, decode_to_utf8, value_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_header_stream(struct mail *mail,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_header_lookup_ctx *headers,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct istream **stream_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen int ret;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen backend_headers = mailbox_header_lookup_init(backend_mail->box,
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen headers->name);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen ret = mail_get_header_stream(backend_mail, backend_headers, stream_r);
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen mailbox_header_lookup_unref(&backend_headers);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (ret < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainenvirtual_mail_get_stream(struct mail *mail, bool get_body,
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen struct message_size *hdr_size,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct message_size *body_size,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct istream **stream_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen int ret;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen if (get_body) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen ret = mail_get_stream(backend_mail, hdr_size, body_size,
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen stream_r);
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen } else {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen ret = mail_get_hdr_stream(backend_mail, hdr_size, stream_r);
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen }
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainen if (ret < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char **value_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return -1;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mail_get_special(backend_mail, field, value_r) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen virtual_box_copy_error(mail->box, backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainenstatic struct mail *virtual_mail_get_real_mail(struct mail *mail)
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen{
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainen struct mail *backend_mail, *real_mail;
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainen return NULL;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainen if (mail_get_backend_mail(backend_mail, &real_mail) < 0)
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainen return NULL;
ceac44e7560fcbf6fc2f932c7b624a5055dc3bc9Timo Sirainen return real_mail;
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen}
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainenstatic void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen{
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen return;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_update_pop3_uidl(backend_mail, uidl);
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen}
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void virtual_mail_expunge(struct mail *mail)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_expunge(backend_mail);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainenvirtual_mail_set_cache_corrupted_reason(struct mail *mail,
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen enum mail_fetch_field field,
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen const char *reason)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (backend_mail_get(vmail, &backend_mail) < 0)
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen return;
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen mail_set_cache_corrupted_reason(backend_mail, field, reason);
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen}
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainenstatic void
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainenvirtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen{
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen virtual_mail_set_cache_corrupted_reason(mail, field, "");
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_vfuncs virtual_mail_vfuncs = {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen NULL,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_free,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_set_seq,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_set_uid,
fe5cca45e94608d1c471990216941bf893bc8adaTimo Sirainen virtual_mail_set_uid_cache_updates,
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen virtual_mail_prefetch,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen virtual_mail_precache,
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen virtual_mail_add_temp_wanted_fields,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen index_mail_get_flags,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen index_mail_get_keywords,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen index_mail_get_keyword_indexes,
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen index_mail_get_modseq,
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen index_mail_get_pvt_modseq,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_parts,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_date,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_received_date,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_save_date,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_virtual_mail_size,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_physical_size,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_first_header,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_headers,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_header_stream,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_stream,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen index_mail_get_binary_stream,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_special,
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen virtual_mail_get_real_mail,
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen index_mail_update_flags,
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen index_mail_update_keywords,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen index_mail_update_modseq,
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen index_mail_update_pvt_modseq,
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen virtual_mail_update_pop3_uidl,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_expunge,
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen virtual_mail_set_cache_corrupted,
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen NULL,
6de6ec228a41275ddda972d4a554699ea75cd06dTimo Sirainen virtual_mail_set_cache_corrupted_reason
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};