virtual-mail.c revision 8eba883232f80178b60fa416f73292bf5f990fec
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch/* Copyright (c) 2008-2017 Dovecot authors, see the included COPYING file */
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch#include "lib.h"
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch#include "array.h"
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch#include "index-mail.h"
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch#include "virtual-storage.h"
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch#include "virtual-transaction.h"
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstruct virtual_mail {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct index_mail imail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch enum mail_fetch_field wanted_fields;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *wanted_headers;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch /* currently active mail */
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *cur_backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail_index_record cur_vrec;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch /* all allocated mails */
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch ARRAY(struct mail *) backend_mails;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch /* mail is lost if backend_mail doesn't point to correct mail */
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch bool cur_lost:1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch};
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstruct mail *
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_alloc(struct mailbox_transaction_context *t,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch enum mail_fetch_field wanted_fields,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *wanted_headers)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mailbox *mbox = (struct virtual_mailbox *)t->box;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch pool_t pool;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch pool = pool_alloconly_create("vmail", 1024);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail = p_new(pool, struct virtual_mail, 1);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.mail.pool = pool;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.mail.data_pool =
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch pool_alloconly_create("virtual index_mail", 512);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.mail.v = virtual_mail_vfuncs;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.mail.mail.box = t->box;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.mail.mail.transaction = t;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch array_create(&vmail->imail.mail.module_contexts, pool,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch sizeof(void *), 5);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.ibox = INDEX_STORAGE_CONTEXT(t->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->wanted_fields = wanted_fields;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (wanted_headers != NULL) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->wanted_headers = wanted_headers;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mailbox_header_lookup_ref(wanted_headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_array_init(&vmail->backend_mails, array_count(&mbox->backend_boxes));
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return &vmail->imail.mail.mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void virtual_mail_close(struct mail *mail)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail **mails;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch unsigned int i, count;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mails = array_get_modifiable(&vmail->backend_mails, &count);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch for (i = 0; i < count; i++) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p = (struct mail_private *)mails[i];
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p->v.close(mails[i]);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch index_mail_close(mail);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void virtual_mail_free(struct mail *mail)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail **mails;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch unsigned int i, count;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mails = array_get_modifiable(&vmail->backend_mails, &count);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch for (i = 0; i < count; i++)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_free(&mails[i]);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch array_free(&vmail->backend_mails);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (vmail->wanted_headers != NULL)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mailbox_header_lookup_unref(&vmail->wanted_headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch pool_unref(&vmail->imail.mail.data_pool);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch pool_unref(&vmail->imail.mail.pool);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic struct mail *
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschbackend_mail_find(struct virtual_mail *vmail, struct mailbox *box)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *const *mails;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch unsigned int i, count;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mails = array_get(&vmail->backend_mails, &count);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch for (i = 0; i < count; i++) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mails[i]->box == box)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return mails[i];
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return NULL;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int backend_mail_get(struct virtual_mail *vmail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail **backend_mail_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *mail = &vmail->imail.mail.mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_backend_box *bbox;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch *backend_mail_r = NULL;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (vmail->cur_backend_mail != NULL) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (vmail->cur_lost) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_set_expunged(&vmail->imail.mail.mail);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch *backend_mail_r = vmail->cur_backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch bbox = virtual_backend_box_lookup(mbox, vmail->cur_vrec.mailbox_id);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_assert(bbox != NULL);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_backend_mail = backend_mail_find(vmail, bbox->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (vmail->cur_backend_mail == NULL) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (!bbox->box->opened &&
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_backend_box_open(mbox, bbox) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, bbox->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch (void)virtual_mail_set_backend_mail(mail, bbox);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_assert(vmail->cur_backend_mail != NULL);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_backend_box_accessed(mbox, bbox);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_lost = !mail_set_uid(vmail->cur_backend_mail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_vrec.real_uid);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail->expunged = vmail->cur_lost || vmail->cur_backend_mail->expunged;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (vmail->cur_lost) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_set_expunged(&vmail->imail.mail.mail);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch *backend_mail_r = vmail->cur_backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstruct mail *
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_set_backend_mail(struct mail *mail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_backend_box *bbox)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *backend_pmail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_transaction_context *backend_trans;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *backend_headers;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_assert(bbox->box->opened);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_trans = virtual_transaction_get(mail->transaction, bbox->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_headers = vmail->wanted_headers == NULL ? NULL :
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mailbox_header_lookup_init(bbox->box,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->wanted_headers->name);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_backend_mail =
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_alloc(backend_trans, vmail->wanted_fields, backend_headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_headers != NULL)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mailbox_header_lookup_unref(&backend_headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_pmail = (struct mail_private *)vmail->cur_backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_pmail->vmail = mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch array_append(&vmail->backend_mails, &vmail->cur_backend_mail, 1);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return vmail->cur_backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvoid virtual_mail_set_unattached_backend_mail(struct mail *mail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *backend_pmail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_backend_mail = backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_pmail = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_pmail->vmail = mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void virtual_mail_set_seq(struct mail *mail, uint32_t seq, bool saving)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch const void *data;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_assert(!saving);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_index_lookup_ext(mail->transaction->view, seq,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mbox->virtual_ext_id, &data, NULL);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch memcpy(&vmail->cur_vrec, data, sizeof(vmail->cur_vrec));
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch i_zero(&vmail->imail.data);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p_clear(vmail->imail.mail.data_pool);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->imail.data.seq = seq;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail->seq = seq;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mail_index_lookup_uid(mail->transaction->view, seq, &mail->uid);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch vmail->cur_backend_mail = NULL;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic bool virtual_mail_set_uid(struct mail *mail, uint32_t uid)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch uint32_t seq;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (!mail_index_lookup_seq(mail->transaction->view, uid, &seq))
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return FALSE;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_mail_set_seq(mail, seq, FALSE);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return TRUE;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void virtual_mail_set_uid_cache_updates(struct mail *mail, bool set)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p->v.set_uid_cache_updates(backend_mail, set);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic bool virtual_mail_prefetch(struct mail *mail)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return TRUE;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return p->v.prefetch(backend_mail);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void virtual_mail_precache(struct mail *mail)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p->v.precache(backend_mail);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic void
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_add_temp_wanted_fields(struct mail *mail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch enum mail_fetch_field fields,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *headers)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p->v.add_temp_wanted_fields(backend_mail, fields, headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_parts(struct mail *mail, struct message_part **parts_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_parts(backend_mail, parts_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch int tz;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (timezone_r == NULL)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch timezone_r = &tz;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_date(backend_mail, date_r, timezone_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_received_date(backend_mail, date_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_save_date(backend_mail, date_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_virtual_size(backend_mail, size_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_physical_size(backend_mail, size_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_first_header(struct mail *mail, const char *field,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch bool decode_to_utf8, const char **value_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch int ret;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch ret = p->v.get_first_header(backend_mail, field,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch decode_to_utf8, value_r);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (ret < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return ret;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_headers(struct mail *mail, const char *field,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch bool decode_to_utf8, const char *const **value_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail_private *p;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch p = (struct mail_private *)backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (p->v.get_headers(backend_mail, field, decode_to_utf8, value_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_header_stream(struct mail *mail,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *headers,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct istream **stream_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mailbox_header_lookup_ctx *backend_headers;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch int ret;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch backend_headers = mailbox_header_lookup_init(backend_mail->box,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch headers->name);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch ret = mail_get_header_stream(backend_mail, backend_headers, stream_r);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch mailbox_header_lookup_unref(&backend_headers);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (ret < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_stream(struct mail *mail, bool get_body,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct message_size *hdr_size,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct message_size *body_size,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct istream **stream_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch int ret;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (get_body) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch ret = mail_get_stream(backend_mail, hdr_size, body_size,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch stream_r);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch } else {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch ret = mail_get_hdr_stream(backend_mail, hdr_size, stream_r);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (ret < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch}
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschstatic int
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Boschvirtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch const char **value_r)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch{
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct virtual_mail *vmail = (struct virtual_mail *)mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch struct mail *backend_mail;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (backend_mail_get(vmail, &backend_mail) < 0)
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch if (mail_get_special(backend_mail, field, value_r) < 0) {
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch virtual_box_copy_error(mail->box, backend_mail->box);
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return -1;
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch }
5394bed8aaef2a6c1c870a34a23a7824e1f370bbStephan Bosch return 0;
}
static int virtual_mail_get_backend_mail(struct mail *mail,
struct mail **real_mail_r)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
return -1;
if (mail_get_backend_mail(backend_mail, real_mail_r) < 0)
return -1;
return 0;
}
static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
return;
mail_update_pop3_uidl(backend_mail, uidl);
}
static void virtual_mail_expunge(struct mail *mail)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
return;
mail_expunge(backend_mail);
}
static void
virtual_mail_set_cache_corrupted(struct mail *mail,
enum mail_fetch_field field,
const char *reason)
{
struct virtual_mail *vmail = (struct virtual_mail *)mail;
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
return;
mail_set_cache_corrupted(backend_mail, field, reason);
}
struct mail_vfuncs virtual_mail_vfuncs = {
virtual_mail_close,
virtual_mail_free,
virtual_mail_set_seq,
virtual_mail_set_uid,
virtual_mail_set_uid_cache_updates,
virtual_mail_prefetch,
virtual_mail_precache,
virtual_mail_add_temp_wanted_fields,
index_mail_get_flags,
index_mail_get_keywords,
index_mail_get_keyword_indexes,
index_mail_get_modseq,
index_mail_get_pvt_modseq,
virtual_mail_get_parts,
virtual_mail_get_date,
virtual_mail_get_received_date,
virtual_mail_get_save_date,
virtual_mail_get_virtual_mail_size,
virtual_mail_get_physical_size,
virtual_mail_get_first_header,
virtual_mail_get_headers,
virtual_mail_get_header_stream,
virtual_mail_get_stream,
index_mail_get_binary_stream,
virtual_mail_get_special,
virtual_mail_get_backend_mail,
index_mail_update_flags,
index_mail_update_keywords,
index_mail_update_modseq,
index_mail_update_pvt_modseq,
virtual_mail_update_pop3_uidl,
virtual_mail_expunge,
virtual_mail_set_cache_corrupted,
NULL,
};