mbox-mail.c revision 01cbf4ac5d44137ab434791be7f838d98d0fcf3b
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (C) 2003 Timo Sirainen */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "lib.h"
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen#include "istream.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "index-mail.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "mbox-storage.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "mbox-file.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "istream-raw-mbox.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include <fcntl.h>
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen#include <unistd.h>
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen#include <sys/stat.h>
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainenstatic int mbox_mail_seek(struct index_mail *mail)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct index_mailbox *ibox = mail->ibox;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const void *data;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (mail_index_lookup_extra(ibox->view, mail->mail.seq,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ibox->mbox_extra_idx, &data) < 0) {
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen mail_storage_set_index_error(ibox);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return -1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen // FIXME: lock the file. sync if needed.
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen if (mbox_file_open_stream(ibox) < 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return -1;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen istream_raw_mbox_seek(ibox->mbox_stream, *((const uint64_t *)data));
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen return 0;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
2c25e1360d4b5cc55eda969a3a7204d950de5a8fTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic const struct mail_full_flags *mbox_mail_get_flags(struct mail *_mail)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen{
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen return index_mail_get_flags(_mail);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /*FIXME:struct index_mail *mail = (struct index_mail *)_mail;
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen struct index_mail_data *data = &mail->data;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_assert(_mail->seq <= mail->ibox->mbox_data_count);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen (void)index_mail_get_flags(_mail);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if ((mail->ibox->mbox_data[_mail->seq-1] & 1) != 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen data->flags.flags |= MAIL_RECENT;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return &data->flags;*/
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic time_t mbox_mail_get_received_date(struct mail *_mail)
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct index_mail_data *data = &mail->data;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (void)index_mail_get_received_date(_mail);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (data->received_date != (time_t)-1)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return data->received_date;
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (mbox_mail_seek(mail) < 0)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen return (time_t)-1;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen data->received_date =
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen istream_raw_mbox_get_received_time(mail->ibox->mbox_stream);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen if (data->received_date != (time_t)-1) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen index_mail_cache_add(mail, MAIL_CACHE_RECEIVED_DATE,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen &data->received_date,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen sizeof(data->received_date));
af81f402ddc897c74c1e85abd02879612ce44882Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return data->received_date;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic const char *
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenmbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen{
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (field == MAIL_FETCH_FROM_ENVELOPE) {
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen if (mbox_mail_seek(mail) < 0)
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen return NULL;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen return istream_raw_mbox_get_sender(mail->ibox->mbox_stream);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen }
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return index_mail_get_special(_mail, field);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen}
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct istream *mbox_mail_get_stream(struct mail *_mail,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct message_size *hdr_size,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct message_size *body_size)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen{
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct index_mail_data *data = &mail->data;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct istream *raw_stream;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (data->stream == NULL) {
b3142c8e513bc78da821fa70f479016148fa95e5Timo Sirainen if (mbox_mail_seek(mail) < 0)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen return NULL;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen // FIXME: need to hide the headers
b3142c8e513bc78da821fa70f479016148fa95e5Timo Sirainen raw_stream = mail->ibox->mbox_stream;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (void)i_stream_read(raw_stream); /* fix v_offset */
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen data->stream = i_stream_create_limit(default_pool,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen raw_stream,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen raw_stream->v_offset,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (uoff_t)-1);
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen }
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen return index_mail_init_stream(mail, hdr_size, body_size);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen}
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainenstruct mail mbox_mail = {
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen 0, 0, 0, 0, 0, 0,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen mbox_mail_get_flags,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen index_mail_get_parts,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen mbox_mail_get_received_date,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen index_mail_get_date,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen index_mail_get_size,
67c24901ac5e1521e38a91efc452faeb3e2135a1Timo Sirainen index_mail_get_header,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen index_mail_get_headers,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mbox_mail_get_stream,
e11a64ffc7f08b4cb05bcc27668d154d33d0c2e0Timo Sirainen mbox_mail_get_special,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen index_mail_update_flags,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen index_mail_expunge
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen