dbox-mail.c revision 010affb9f4b9cca9b94e1d8d570cf179daff08d7
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainendbox_mail_alloc(struct mailbox_transaction_context *t,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen index_mail_init(&mail->imail, t, wanted_fields, wanted_headers);
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainen /* close the dbox file only after index is closed, since it may still
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen try to read from it. */
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainenint dbox_mail_metadata_read(struct dbox_mail *mail, struct dbox_file **file_r)
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainen (struct dbox_storage *)mail->imail.mail.mail.box->storage;
e925f007930955f10fa8728509a44f7a53d2b13eTimo Sirainen if (storage->v.mail_open(mail, &offset, file_r) < 0)
90c23747727c85f80e4e8eed7968f0edbeac7ac5Timo Sirainen /* we just messed up mail's input stream by reading metadata */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainendbox_mail_metadata_get(struct dbox_mail *mail, enum dbox_metadata_key key,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen const char **value_r)
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainenint dbox_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
b397665e90fa0fc7c6a9156fdd6cf28b571e8e39Timo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen struct index_mail_data *data = &mail->imail.data;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (index_mail_get_physical_size(_mail, size_r) == 0)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen /* see if we have it in metadata */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen value = dbox_file_metadata_get(file, DBOX_METADATA_PHYSICAL_SIZE);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen data->physical_size = strtoul(value, NULL, 16);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen /* no. that means we can use the size in the header */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen data->physical_size = file->cur_physical_size;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenint dbox_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
da4376093d4e1b26b14ea1e945689fb7056fe0a0Timo Sirainen struct index_mail_data *data = &mail->imail.data;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (index_mail_get_cached_virtual_size(&mail->imail, size_r))
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (dbox_mail_metadata_get(mail, DBOX_METADATA_VIRTUAL_SIZE,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen return index_mail_get_virtual_size(_mail, size_r);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen data->virtual_size = strtoul(value, NULL, 16);
029cfcdce65b284d5230adf1c920a5f526b03b5cTimo Sirainenint dbox_mail_get_received_date(struct mail *_mail, time_t *date_r)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct index_mail_data *data = &mail->imail.data;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (index_mail_get_received_date(_mail, date_r) == 0)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (dbox_mail_metadata_get(mail, DBOX_METADATA_RECEIVED_TIME,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen data->received_date = value == NULL ? 0 : strtoul(value, NULL, 16);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenint dbox_mail_get_save_date(struct mail *_mail, time_t *date_r)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen struct index_mail_data *data = &mail->imail.data;
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen if (index_mail_get_save_date(_mail, date_r) == 0)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen if (storage->v.mail_open(mail, &offset, &file) < 0)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainendbox_get_cached_metadata(struct dbox_mail *mail, enum dbox_metadata_key key,
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen const char **value_r)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen if (mail_cache_lookup_field(imail->trans->cache_view, str,
dffa503fd4ce31334346e539496084c80a2d8d37Timo Sirainen if (dbox_mail_metadata_get(mail, key, &value) < 0)
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen index_mail_cache_add_idx(imail, ibox->cache_fields[cache_field].idx,
f9f30736bc6e4cf535085824e7e124506fe2dbbbTimo Sirainen /* don't return pointer to dbox metadata directly, since it may
85144b5f0bc763de14c7d87291a90ef74ac241a2Timo Sirainen change unexpectedly */
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainenint dbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen const char **value_r)
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen /* keep the UIDL in cache file, otherwise POP3 would open all
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen mail files and read the metadata. same for GUIDs if they're
63e2edd14ae7b1dc4a08e2e659501dbf519462f9Timo Sirainen return dbox_get_cached_metadata(mail, DBOX_METADATA_POP3_UIDL,
63e2edd14ae7b1dc4a08e2e659501dbf519462f9Timo Sirainen return dbox_get_cached_metadata(mail, DBOX_METADATA_GUID,
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen return index_mail_get_special(_mail, field, value_r);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenget_mail_stream(struct dbox_mail *mail, uoff_t offset,
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch struct mail_private *pmail = &mail->imail.mail;
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if ((ret = dbox_file_seek(file, offset)) <= 0)
aef92409cf369afdd2ecd81a4f80083cd4082f46Timo Sirainen *stream_r = i_stream_create_limit(file->input, file->cur_physical_size);
4bc96ba6f1d67a90a75fa131bcd2cd508ea5a05aTimo Sirainen if (pmail->v.istream_opened(&pmail->mail, stream_r) < 0)
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen return dbox_attachment_file_get_stream(file, stream_r);
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainenint dbox_mail_get_stream(struct mail *_mail, struct message_size *hdr_size,
8d131435ba4648c8821160ec38d508c97177c715Timo Sirainen struct dbox_mail *mail = (struct dbox_mail *)_mail;
8d131435ba4648c8821160ec38d508c97177c715Timo Sirainen struct index_mail_data *data = &mail->imail.data;
1ff03d2244dd08effadfecec365bec28793a1aa0Timo Sirainen if (storage->v.mail_open(mail, &offset, &mail->open_file) < 0)
b5b3b4c9159f506cdfdce7399faaeeffdf73faf7Timo Sirainen "uid=%u points to broken data at offset="
b5b3b4c9159f506cdfdce7399faaeeffdf73faf7Timo Sirainen index_mail_set_read_buffer_size(_mail, input);