mail.c revision a12399903f415a7e14c2816cffa2f7a09dcbb097
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen#include "lib.h"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen#include "ioloop.h"
e1e5b1f4ada9d9b4d36edeaf1c5229be90b12815Timo Sirainen#include "mail-storage-private.h"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen enum mail_fetch_field wanted_fields,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenvoid mail_free(struct mail **mail)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)*mail;
cd466fe7b84b0223735a6469c7f7bc225f65996dTimo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen p->v.free(*mail);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen *mail = NULL;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen}
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenint mail_set_seq(struct mail *mail, uint32_t seq)
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen{
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.set_seq(mail, seq);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenint mail_set_uid(struct mail *mail, uint32_t uid)
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.set_uid(mail, uid);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen return p->v.get_flags(mail);
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen}
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_keywords(mail);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen}
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainenconst struct message_part *mail_get_parts(struct mail *mail)
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen{
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_parts(mail);
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainentime_t mail_get_received_date(struct mail *mail)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_received_date(mail);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainentime_t mail_get_date(struct mail *mail, int *timezone)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_date(mail, timezone);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenuoff_t mail_get_virtual_size(struct mail *mail)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_virtual_size(mail);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenuoff_t mail_get_physical_size(struct mail *mail)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
a29a5b7520f7b8d6cdaf97e66d184b6a9e4f4ecfTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_physical_size(mail);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenconst char *mail_get_first_header(struct mail *mail, const char *field)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_first_header(mail, field);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenconst char *const *mail_get_headers(struct mail *mail, const char *field)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_headers(mail, field);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenstruct istream *
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenmail_get_header_stream(struct mail *mail,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mailbox_header_lookup_ctx *headers)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.get_header_stream(mail, headers);
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen}
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainenstruct istream *mail_get_stream(struct mail *mail,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct message_size *hdr_size,
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen struct message_size *body_size)
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
fc34e919907845ce01ad04aa8213033596a1ae70Timo Sirainen return p->v.get_stream(mail, hdr_size, body_size);
38499bb33c74acc6d725204e893cfc02a5890ec7Timo Sirainen}
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainenconst char *mail_get_special(struct mail *mail, enum mail_fetch_field field)
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen{
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen return p->v.get_special(mail, field);
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen}
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainenint mail_update_flags(struct mail *mail, enum modify_type modify_type,
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen enum mail_flags flags)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.update_flags(mail, modify_type, flags);
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen}
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainenint mail_update_keywords(struct mail *mail, enum modify_type modify_type,
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen struct mail_keywords *keywords)
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen{
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen return p->v.update_keywords(mail, modify_type, keywords);
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen}
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenint mail_expunge(struct mail *mail)
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
return p->v.expunge(mail);
}