static void virtual_mail_set_seq(struct mail *mail, uint32_t seq) { struct virtual_mail *vmail = (struct virtual_mail *)mail; struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box; struct virtual_backend_box *bbox; const struct virtual_mail_index_record *vrec; const void *data; bool expunged; mail_index_lookup_ext(mail->box->view, seq, mbox->virtual_ext_id, &data, &expunged); vrec = data; bbox = virtual_backend_box_lookup(mbox, vrec->mailbox_id); vmail->backend_mail = backend_mail_find(vmail, bbox->box); if (vmail->backend_mail == NULL) virtual_mail_set_backend_mail(mail, bbox); vmail->lost = !mail_set_uid(vmail->backend_mail, vrec->real_uid); memset(&vmail->imail.data, 0, sizeof(vmail->imail.data)); p_clear(vmail->imail.data_pool); vmail->imail.data.seq = seq; mail->seq = seq; mail_index_lookup_uid(mail->box->view, seq, &mail->uid); if (!vmail->lost) { mail->expunged = vmail->backend_mail->expunged; mail->has_nuls = vmail->backend_mail->has_nuls; mail->has_no_nuls = vmail->backend_mail->has_no_nuls; } else { mail->expunged = TRUE; mail->has_nuls = FALSE; mail->has_no_nuls = FALSE; } }
int imap_msgpart_url_open_mail(struct imap_msgpart_url *mpurl, struct mail **mail_r, const char **error_r) { struct mailbox_transaction_context *t; struct mailbox *box; enum mail_error error_code; struct mail *mail; int ret; if (mpurl->mail != NULL) { *mail_r = mpurl->mail; return 1; } /* open mailbox if it is not yet open */ if ((ret = imap_msgpart_url_open_mailbox(mpurl, &box, &error_code, error_r)) <= 0) return ret; /* start transaction */ t = mailbox_transaction_begin(box, 0); mail = mail_alloc(t, MAIL_FETCH_MESSAGE_PARTS | MAIL_FETCH_IMAP_BODYSTRUCTURE, NULL); /* find the message */ if (!mail_set_uid(mail, mpurl->uid)) { *error_r = "Message not found"; mail_free(&mail); mailbox_transaction_rollback(&t); return 0; } mpurl->trans = t; mpurl->mail = mail; *mail_r = mail; return 1; }