index-msgcache.c revision ab170d6cf8aeb515bac7c07b37e525cbad96c299
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2002 Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "lib.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "iobuffer.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "imap-message-cache.h"
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen#include "message-part-serialize.h"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen#include "mail-index.h"
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <unistd.h>
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainentypedef struct {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen MailIndex *index;
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen MailIndexRecord *rec;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen} IndexMsgcacheContext;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainenvoid *index_msgcache_get_context(MailIndex *index, MailIndexRecord *rec)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen IndexMsgcacheContext *ctx;
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen ctx = t_new(IndexMsgcacheContext, 1);
373492be949e159fda651807b3acda2c5c077027Timo Sirainen ctx->index = index;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen ctx->rec = rec;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen return ctx;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen}
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic IOBuffer *index_msgcache_open_mail(void *context)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
373492be949e159fda651807b3acda2c5c077027Timo Sirainen IndexMsgcacheContext *ctx = context;
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen return ctx->index->open_mail(ctx->index, ctx->rec);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen}
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic IOBuffer *index_msgcache_inbuf_rewind(IOBuffer *inbuf,
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen void *context __attr_unused__)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen if (!io_buffer_seek(inbuf, 0)) {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen i_error("index_msgcache_inbuf_rewind: lseek() failed: %m");
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen (void)close(inbuf->fd);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen io_buffer_destroy(inbuf);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen return NULL;
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen return inbuf;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen}
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenstatic const char *index_msgcache_get_cached_field(ImapCacheField field,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen void *context)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen{
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen IndexMsgcacheContext *ctx = context;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen MailField index_field;
99430beb12dfbc6c9c160f08e2102aeab38a589cTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen switch (field) {
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen case IMAP_CACHE_BODY:
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen index_field = FIELD_TYPE_BODY;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen break;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen case IMAP_CACHE_BODYSTRUCTURE:
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen index_field = FIELD_TYPE_BODYSTRUCTURE;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen break;
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen case IMAP_CACHE_ENVELOPE:
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen index_field = FIELD_TYPE_ENVELOPE;
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen break;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen default:
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen index_field = 0;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen return index_field == 0 ? NULL :
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen ctx->index->lookup_field(ctx->index, ctx->rec, index_field);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen}
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenstatic MessagePart *index_msgcache_get_cached_parts(Pool pool, void *context)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen IndexMsgcacheContext *ctx = context;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen const void *part_data;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen unsigned int part_size;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen part_data = ctx->index->lookup_field_raw(ctx->index, ctx->rec,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen FIELD_TYPE_MESSAGEPART,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen &part_size);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen return part_data == NULL ? NULL :
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen message_part_deserialize(pool, part_data, part_size);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen}
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo SirainenImapMessageCacheIface index_msgcache_iface = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen index_msgcache_open_mail,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen index_msgcache_inbuf_rewind,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen index_msgcache_get_cached_field,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen index_msgcache_get_cached_parts
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen};
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen