mail.c revision c0225f7f6b43d34dc58c17d3304f0fd60ab89894
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstruct mail *mail_alloc(struct mailbox_transaction_context *t,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)*mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenvoid mail_set_seq(struct mail *mail, uint32_t seq)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenbool mail_set_uid(struct mail *mail, uint32_t uid)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenenum mail_flags mail_get_flags(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenconst char *const *mail_get_keywords(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenconst ARRAY_TYPE(keyword_indexes) *mail_get_keyword_indexes(struct mail *mail)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_parts(struct mail *mail, struct message_part **parts_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_date(mail, date_r, timezone_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_received_date(struct mail *mail, time_t *date_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_save_date(struct mail *mail, time_t *date_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_virtual_size(struct mail *mail, uoff_t *size_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_physical_size(struct mail *mail, uoff_t *size_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_first_header(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_first_header(mail, field, FALSE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_first_header_utf8(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_first_header(mail, field, TRUE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_headers(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *const **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_headers(mail, field, FALSE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_headers_utf8(struct mail *mail, const char *field,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *const **value_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_headers(mail, field, TRUE, value_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return p->v.get_header_stream(mail, headers, stream_r);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen "Mail field not cached");
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenint mail_get_stream(struct mail *mail, struct message_size *hdr_size,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct message_size *body_size, struct istream **stream_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return p->v.get_stream(mail, hdr_size, body_size, stream_r);
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainenint mail_get_special(struct mail *mail, enum mail_fetch_field field,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **value_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
8e5fedd9ada47735be8ac0f8af2a66e8528bd776Timo Sirainen return p->v.get_special(mail, field, value_r);
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainenvoid mail_update_flags(struct mail *mail, enum modify_type modify_type,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_update_keywords(struct mail *mail, enum modify_type modify_type,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen p->v.update_keywords(mail, modify_type, keywords);
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainenvoid mail_update_modseq(struct mail *mail, uint64_t min_modseq)
b66a7b7ab0db2c9ad425912d3f21a36fcf76d876Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
b9b48aaaebf6f72dfab567cda073cde8a7b26598Timo Sirainenvoid mail_update_uid(struct mail *mail, uint32_t new_uid)
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainenvoid mail_update_pop3_uidl(struct mail *mail, const char *uidl)
ae9365d3de0cefae6f2a5d3e9ab79bc11c37b3d5Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_private *p = (struct mail_private *)mail;
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen mail_storage_set_error(mail->box->storage, MAIL_ERROR_EXPUNGED,
1582b4d531679849bba299c17b6ec9402b7df67dTimo Sirainen "Message was expunged");
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainenvoid mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
9a107dedb8f35727c21b3d1d54475d33f6e2eb1fTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen static unsigned int pid = 0;
6bf1543bb7af03324c04e8f9ac8e430f395989aeTimo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
44dc970b18c4e2d06f34cb908924152156e4a45bTimo Sirainenvoid mail_generate_guid_128(uint8_t guid[MAIL_GUID_128_SIZE])
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* we'll use the current time in nanoseconds as the initial 64bit
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[5] = (host_crc & 0x0000ff00) >> 8;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_static[6] = (host_crc & 0x00ff0000) >> 16;
aa62d8779ce53900c2f09bf2ff6fa790bc9f6a89Timo Sirainen guid_static[7] = (host_crc & 0xff000000) >> 24;
ea9fd7f876643e985946a2563140359064819b8eTimo Sirainen } else if ((uint32_t)ts.tv_nsec < (uint32_t)-1) {
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenvoid mail_generate_guid_128_hash(const char *guid,
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen buffer_create_data(&buf, guid_128, MAIL_GUID_128_SIZE);
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen /* not 128bit hex. use a hash of it instead. */
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen sha1_get_digest(guid, strlen(guid), sha1_sum);
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen sha1_sum + SHA1_RESULTLEN - MAIL_GUID_128_SIZE,
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainenbool mail_guid_128_is_empty(const uint8_t guid_128[MAIL_GUID_128_SIZE])
6925fd9cd70c30884406d50f1d85efb6561e776cTimo Sirainen unsigned int i;
992a9e2d6c6ee45d87089ac54267e0198a7802c3Timo Sirainen for (i = 0; i < MAIL_GUID_128_SIZE; i++) {
4b43f50117630aa12b3cfd0cbd05ae22ba27fec1Timo Sirainenconst char *mail_guid_128_to_string(const uint8_t guid_128[MAIL_GUID_128_SIZE])