mbox-sync-private.h revision e05ea8311ae16687295048e88ca205dfe29fbcbf
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen#ifndef __MBOX_SYNC_PRIVATE_H
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#define __MBOX_SYNC_PRIVATE_H
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#include "md5.h"
ff487c974815bdaa2d05a3b834f4c2c841f4cc34Timo Sirainen#include "mail-index.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo SirainenARRAY_DEFINE_TYPE(sync_recs, struct mail_index_sync_rec);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenenum mbox_sync_flags {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen MBOX_SYNC_LAST_COMMIT = 0x01,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_SYNC_HEADER = 0x02,
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen MBOX_SYNC_LOCK_READING = 0x04,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_SYNC_UNDIRTY = 0x08,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_SYNC_REWRITE = 0x10,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_SYNC_FORCE_SYNC = 0x20
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstruct mbox_flag_type {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen char chr;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen enum mail_flags flag;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenenum header_position {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_STATUS,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_X_IMAPBASE,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_X_KEYWORDS,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_X_STATUS,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_X_UID,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MBOX_HDR_COUNT
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen};
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen/* kludgy. swap MAIL_RECENT with MBOX_NONRECENT_KLUDGE when writing Status
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen header, because 'O' flag means non-recent but internally we want to use
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen recent flag. */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#define MBOX_NONRECENT_KLUDGE MAIL_RECENT
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#define MBOX_EXPUNGED 0x40
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT_KLUDGE)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen#define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct mbox_flag_type mbox_status_flags[];
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct mbox_flag_type mbox_xstatus_flags[];
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstruct mbox_sync_mail {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t uid;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen uint32_t idx_seq;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ARRAY_TYPE(keyword_indexes) keywords;
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen uint8_t flags;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen unsigned int uid_broken:1;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen uoff_t from_offset;
a8e132559a7ebe54c8269d79ce29fa3338c76199Timo Sirainen uoff_t body_size;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen /* following variables have a bit overloaded functionality:
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen a) space <= 0 : offset points to beginning of headers. space is the
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen amount of space missing that is required to be able to rewrite
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen the headers
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen b) space > 0 : offset points to beginning of whitespace that can
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen be removed. space is the amount of data that can be removed from
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen there. note that the message may contain more whitespace
430c0b0c370bebeeceba2e206be76bc134742f41Timo Sirainen elsewhere. */
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen uoff_t offset;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen off_t space;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen};
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainenstruct mbox_sync_mail_context {
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen struct mbox_sync_context *sync_ctx;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen struct mbox_sync_mail mail;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen uint32_t seq;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen uoff_t hdr_offset, body_offset;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen size_t header_first_change, header_last_change;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen string_t *header;
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen unsigned char hdr_md5_sum[16];
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen uoff_t content_length;
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen size_t hdr_pos[MBOX_HDR_COUNT];
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen uint32_t parsed_uid, last_uid_updated_value;
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen unsigned int last_uid_value_start_pos;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen unsigned int have_eoh:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int need_rewrite:1;
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen unsigned int seen_imapbase:1;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen unsigned int pseudo:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int updated:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int recent:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int dirty:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int imapbase_rewrite:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen unsigned int imapbase_updated:1;
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen};
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainenstruct mbox_sync_context {
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen struct mbox_mailbox *mbox;
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen enum mbox_sync_flags flags;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen struct istream *input, *file_input;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen int write_fd;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen time_t orig_mtime;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen uoff_t orig_size;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen struct mail_index_sync_ctx *index_sync_ctx;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen struct mail_index_view *sync_view;
d368bfd671ae6d04a69eb7f418521d49b8bbf77aTimo Sirainen struct mail_index_transaction *t;
d368bfd671ae6d04a69eb7f418521d49b8bbf77aTimo Sirainen const struct mail_index_header *hdr;
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen string_t *header, *from_line;
d368bfd671ae6d04a69eb7f418521d49b8bbf77aTimo Sirainen
446e518e4fe86ff40e33543445f4e99edf840a21Timo Sirainen /* header state: */
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen uint32_t base_uid_validity, base_uid_last;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen uoff_t base_uid_last_offset;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen /* mail state: */
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen ARRAY_DEFINE(mails, struct mbox_sync_mail);
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen ARRAY_TYPE(sync_recs) syncs;
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainen struct mail_index_sync_rec sync_rec;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen /* per-mail pool */
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen pool_t mail_keyword_pool;
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen /* used for mails[].keywords */
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen pool_t saved_keywords_pool;
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen uint32_t prev_msg_uid, next_uid, idx_next_uid;
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen uint32_t seq, idx_seq, need_space_seq;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen off_t expunged_space, space_diff;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen unsigned int dest_first_mail:1;
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen unsigned int first_mail_crlf_expunged:1;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen /* global flags: */
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainen unsigned int delay_writes:1;
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainen unsigned int renumber_uids:1;
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen unsigned int moved_offsets:1;
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen};
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainenint mbox_sync(struct mbox_mailbox *mbox, enum mbox_sync_flags flags);
a3dd97fb6d92a89c3de0597fed2d4b044c7aeb84Timo Sirainenint mbox_sync_has_changed(struct mbox_mailbox *mbox, bool leave_dirty);
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainenvoid mbox_sync_parse_next_mail(struct istream *input,
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainen struct mbox_sync_mail_context *ctx);
4ed1b49d815ec41a5e4b6a23d23e94b958da1923Timo Sirainenint mbox_sync_parse_match_mail(struct mbox_mailbox *mbox,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen struct mail_index_view *view, uint32_t seq);
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainenvoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx);
473080c7c0d25ddfdf77e7dfa0ba8f73c6c669d5Timo Sirainenvoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
157bce86d0a01477bb8ebd0d380e6b2297f326f7Timo Sirainen const struct mbox_sync_mail *mail);
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainenint mbox_sync_try_rewrite(struct mbox_sync_mail_context *ctx, off_t move_diff);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenint mbox_sync_rewrite(struct mbox_sync_context *sync_ctx,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mbox_sync_mail_context *mail_ctx,
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainen uoff_t end_offset, off_t move_diff, uoff_t extra_space,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen uint32_t first_seq, uint32_t last_seq);
91e4199476cb2add8143c18583fa57e1decfea88Timo Sirainen
0727e38ac12efb8963a339daf56255e2be1f29fcTimo Sirainenvoid mbox_sync_apply_index_syncs(struct mbox_sync_context *sync_ctx,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen struct mbox_sync_mail *mail,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen bool *keywords_changed_r);
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainenint mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainenint mbox_move(struct mbox_sync_context *sync_ctx,
08aea01ef9a9d20703e0fcf8618e6195c0037a44Timo Sirainen uoff_t dest, uoff_t source, uoff_t size);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen size_t pos, size_t need, size_t have);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainenvoid mbox_sync_headers_add_space(struct mbox_sync_mail_context *ctx,
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen size_t size);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen
747e77e3ab073a8e9e69c7a3e71b4593c5655d03Timo Sirainen#endif
747e77e3ab073a8e9e69c7a3e71b4593c5655d03Timo Sirainen