virtual-mail.c revision 9f755a35f7db42df6d449e30a543d9ab51734585
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Copyright (c) 2008 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"
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 */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail *backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* all allocated mails */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ARRAY_DEFINE(backend_mails, struct mail *);
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;
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
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.data_pool =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_alloconly_create("virtual index_mail", 512);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.ibox = &mbox->ibox;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.trans = (struct index_transaction_context *)t;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->wanted_fields = wanted_fields;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->wanted_headers = wanted_headers;
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
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pool_unref(&vmail->imail.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
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void virtual_mail_set_seq(struct mail *mail, uint32_t seq)
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 struct virtual_backend_box *bbox;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_transaction_context *backend_trans;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct virtual_mail_index_record *vrec;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct mail_index_record *rec;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const void *data;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool expunged;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_index_lookup_ext(mbox->ibox.view, seq, mbox->virtual_ext_id,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen &data, &expunged);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vrec = data;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bbox = virtual_backend_box_lookup(mbox, vrec->mailbox_id);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->backend_mail = backend_mail_find(vmail, bbox->box);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (vmail->backend_mail == NULL) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen backend_trans =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_transaction_get(mail->transaction, bbox->box);
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen backend_headers = vmail->wanted_headers == NULL ? NULL :
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen mailbox_header_lookup_init(bbox->box,
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen vmail->wanted_headers->headers);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->backend_mail = mail_alloc(backend_trans,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->wanted_fields,
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen backend_headers);
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen if (backend_headers != NULL)
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen mailbox_header_lookup_unref(&backend_headers);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_append(&vmail->backend_mails, &vmail->backend_mail, 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
9f755a35f7db42df6d449e30a543d9ab51734585Timo Sirainen if (!mail_set_uid(vmail->backend_mail, vrec->real_uid))
9f755a35f7db42df6d449e30a543d9ab51734585Timo Sirainen i_unreached();
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen memset(&vmail->imail.data, 0, sizeof(vmail->imail.data));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen p_clear(vmail->imail.data_pool);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen rec = mail_index_lookup(mbox->ibox.view, seq);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.data.seq = seq;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen vmail->imail.data.flags = rec->flags & MAIL_FLAGS_NONRECENT;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->seq = seq;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->uid = rec->uid;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->expunged = vmail->backend_mail->expunged;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->has_nuls = vmail->backend_mail->has_nuls;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail->has_no_nuls = vmail->backend_mail->has_no_nuls;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic bool virtual_mail_set_uid(struct mail *mail, uint32_t uid)
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 uint32_t seq;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (!mail_index_lookup_seq(mbox->ibox.view, uid, &seq))
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return FALSE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_set_seq(vmail->backend_mail, seq);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return TRUE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_parts(struct mail *mail, const struct message_part **parts_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_parts(vmail->backend_mail, parts_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen int tz;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (timezone_r == NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen timezone_r = &tz;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_date(vmail->backend_mail, date_r, timezone_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_received_date(vmail->backend_mail, date_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_save_date(vmail->backend_mail, date_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_virtual_size(vmail->backend_mail, size_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_physical_size(vmail->backend_mail, size_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_private *p = (struct mail_private *)vmail->backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (p->v.get_first_header(vmail->backend_mail, field,
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen decode_to_utf8, value_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_private *p = (struct mail_private *)vmail->backend_mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (p->v.get_headers(vmail->backend_mail, field,
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen decode_to_utf8, value_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen struct mailbox_header_lookup_ctx *backend_headers;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen int ret;
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen backend_headers = mailbox_header_lookup_init(vmail->backend_mail->box,
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen headers->headers);
d060c7e58977a44fab0c3be3e7a10772bf73e8b2Timo Sirainen ret = mail_get_header_stream(vmail->backend_mail, backend_headers,
d060c7e58977a44fab0c3be3e7a10772bf73e8b2Timo Sirainen stream_r);
c8d1ccf9dec39e9e145d55b472eee43d95764189Timo Sirainen mailbox_header_lookup_unref(&backend_headers);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (ret < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_get_stream(struct mail *mail, 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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_stream(vmail->backend_mail, hdr_size, body_size,
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen stream_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->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;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
06ff2a72c39cb34cc6425f17fc82c5e93fef2018Timo Sirainen if (field == MAIL_FETCH_MAILBOX_NAME) {
06ff2a72c39cb34cc6425f17fc82c5e93fef2018Timo Sirainen *value_r = vmail->backend_mail->box->name;
06ff2a72c39cb34cc6425f17fc82c5e93fef2018Timo Sirainen return 0;
06ff2a72c39cb34cc6425f17fc82c5e93fef2018Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen if (mail_get_special(vmail->backend_mail, field, value_r) < 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen virtual_box_copy_error(mail->box, vmail->backend_mail->box);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return -1;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void virtual_mail_expunge(struct mail *mail)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_expunge(vmail->backend_mail);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvirtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mail_set_cache_corrupted(vmail->backend_mail, field);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic struct index_mail *virtual_mail_get_index_mail(struct mail *mail)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct virtual_mail *vmail = (struct virtual_mail *)mail;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return (struct index_mail *)vmail->backend_mail;
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,
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,
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,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_special,
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen index_mail_update_flags,
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen index_mail_update_keywords,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_expunge,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_set_cache_corrupted,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen virtual_mail_get_index_mail
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};