mail.c revision 539977f9257bd8985be5a8093658da266ae9cd19
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen mail = t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mail_private *p = (struct mail_private *)*mail;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_set_seq(struct mail *mail, uint32_t seq)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenbool mail_set_uid(struct mail *mail, uint32_t uid)
a12399903f415a7e14c2816cffa2f7a09dcbb097Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainenconst ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainenint mail_get_parts(struct mail *mail, struct message_part **parts_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_date(mail, date_r, timezone_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_received_date(struct mail *mail, time_t *date_r)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_save_date(struct mail *mail, time_t *date_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_virtual_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_physical_size(struct mail *mail, uoff_t *size_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, FALSE, value_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_first_header_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_first_header(mail, field, TRUE, value_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, FALSE, value_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_headers_utf8(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *const **value_r)
dce5a2719df4fc64a8762d2aa94ba98dcf9cd6feTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_headers(mail, field, TRUE, value_r);
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_header_stream(mail, headers, stream_r);
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen "Mail field not cached");
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 struct mail_private *p = (struct mail_private *)mail;
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_stream(mail, hdr_size, body_size, stream_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenint mail_get_special(struct mail *mail, enum mail_fetch_field field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return p->v.get_special(mail, field, value_r);
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainenstruct mail *mail_get_real_mail(struct mail *mail)
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_flags(struct mail *mail, enum modify_type modify_type,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainenvoid mail_update_keywords(struct mail *mail, enum modify_type modify_type,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen p->v.update_keywords(mail, modify_type, keywords);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenvoid mail_update_modseq(struct mail *mail, uint64_t min_modseq)
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainenvoid mail_update_uid(struct mail *mail, uint32_t new_uid)
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainenvoid mail_update_pop3_uidl(struct mail *mail, const char *uidl)
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_EXPUNGED,
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainen "Message was expunged");
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainenvoid mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen static unsigned int pid = 0;
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenvoid mail_generate_guid_128(uint8_t guid[MAIL_GUID_128_SIZE])
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[5] = (host_crc & 0x0000ff00) >> 8;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[6] = (host_crc & 0x00ff0000) >> 16;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen guid_static[7] = (host_crc & 0xff000000) >> 24;
3c52b294054995d62bd1851c5c42b975fd8c22c9Timo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainenvoid mail_generate_guid_128_hash(const char *guid,
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen buffer_create_data(&buf, guid_128, MAIL_GUID_128_SIZE);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* not 128bit hex. use a hash of it instead. */
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen sha1_get_digest(guid, strlen(guid), sha1_sum);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen sha1_sum + SHA1_RESULTLEN - MAIL_GUID_128_SIZE,
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainenbool mail_guid_128_is_empty(const uint8_t guid_128[MAIL_GUID_128_SIZE])
0f83592ccc280a29bdf01c4475805f6a4bad9abdTimo Sirainen unsigned int i;
c820b702d1eabfd5b029ac168fe769265e541561Timo Sirainen for (i = 0; i < MAIL_GUID_128_SIZE; i++) {
16aef418492cb8d18c5196fd573a487177a9cab2Timo Sirainenconst char *mail_guid_128_to_string(const uint8_t guid_128[MAIL_GUID_128_SIZE])