mail.c revision 838e367716bbd5e44b4a1691db9cbf72af53e9f0
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "lib.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "ioloop.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "mail-storage-private.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mail_fetch_field wanted_fields,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid mail_free(struct mail **mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mail_private *p = (struct mail_private *)*mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen p->v.free(*mail);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen *mail = NULL;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_set_seq(struct mail *mail, uint32_t seq)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.set_seq(mail, seq);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenbool mail_set_uid(struct mail *mail, uint32_t uid)
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen{
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen return p->v.set_uid(mail, uid);
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen}
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return p->v.get_flags(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen return p->v.get_keywords(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainenconst ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen{
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen return p->v.get_keyword_indexes(mail);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen}
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_parts(struct mail *mail, const struct message_part **parts_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_parts(mail, parts_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int tz;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (timezone_r == NULL)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen timezone_r = &tz;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_date(mail, date_r, timezone_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_received_date(struct mail *mail, time_t *date_r)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen{
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_received_date(mail, date_r);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen}
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_save_date(struct mail *mail, time_t *date_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_save_date(mail, date_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_virtual_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_virtual_size(mail, size_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_physical_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_physical_size(mail, size_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, FALSE, value_r);
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen}
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen{
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, TRUE, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, FALSE, value_r);
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen}
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen{
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, TRUE, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_header_stream(struct mail *mail,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct mailbox_header_lookup_ctx *headers,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct istream **stream_r)
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen{
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_header_stream(mail, headers, stream_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_stream(struct mail *mail, struct message_size *hdr_size,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct message_size *body_size, struct istream **stream_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_stream(mail, hdr_size, body_size, stream_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_special(struct mail *mail, enum mail_fetch_field field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_special(mail, field, value_r);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_flags(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen enum mail_flags flags)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
efb373fd7e30df171452c9f40881a8bd06b81780Timo Sirainen p->v.update_flags(mail, modify_type, flags);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_keywords(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen struct mail_keywords *keywords)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.update_keywords(mail, modify_type, keywords);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_expunge(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen{
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.expunge(mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen}
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainenvoid mail_set_expunged(struct mail *mail)
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen{
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_EXPUNGED,
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen "Message was expunged");
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen mail->expunged = TRUE;
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen}
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainenvoid mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen{
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen p->v.set_cache_corrupted(mail, field);
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen}