mbox-sync-private.h revision 7fd72a47d7ddfbd38c8697e228b6951f495dfb61
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#ifndef __MBOX_SYNC_PRIVATE_H
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#define __MBOX_SYNC_PRIVATE_H
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose#include "md5.h"
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher#include "mail-index.h"
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardtenum mbox_sync_flags {
703dc1eb5b050b24235a6640f271d34ea008cf98Jan Engelhardt MBOX_SYNC_LAST_COMMIT = 0x01,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher MBOX_SYNC_HEADER = 0x02,
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose MBOX_SYNC_LOCK_READING = 0x04,
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose MBOX_SYNC_UNDIRTY = 0x08,
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose MBOX_SYNC_REWRITE = 0x10
324fb26ba803a999bedc29e93c46c84f27abf5b7Sumit Bose};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstruct mbox_flag_type {
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher char chr;
d71cd46ede9c57e3947c86c61306a9caddce242cLukas Slebodnik enum mail_flags flag;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherenum header_position {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher MBOX_HDR_STATUS,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher MBOX_HDR_X_IMAPBASE,
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek MBOX_HDR_X_KEYWORDS,
87d3b47abba6a40fcf809c85a2b138bc1013d9c5Jakub Hrozek MBOX_HDR_X_STATUS,
deeadf40db3a1eec64cf030e54afc4cb8612a8d5Lukas Slebodnik MBOX_HDR_X_UID,
ccf340e56364851f2e5b75e52d3d63701b662954Lukas Slebodnik
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher MBOX_HDR_COUNT
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
f0ea3ed816182fadf77f3e7f7ddb298b287007adLukas Slebodnik
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher#define MBOX_NONRECENT MAIL_RECENT /* kludgy */
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher#define MBOX_EXPUNGED 0x40
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher#define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT)
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březina#define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březinaextern struct mbox_flag_type mbox_status_flags[];
d3da1c165cdb4c1ec126a8f4b6b544ca415b9d20Pavel Březinaextern struct mbox_flag_type mbox_xstatus_flags[];
c481179da5d5b53ce16d8784c0bd2857ffc2f061Lukas Slebodnik
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagherstruct mbox_sync_mail {
002f84aea86371aa079b867c0ec39396b97109d3Lukas Slebodnik uint32_t uid;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t idx_seq;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint8_t flags;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher keywords_mask_t keywords;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uoff_t from_offset;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uoff_t body_size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* following variables have a bit overloaded functionality:
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher a) space <= 0 : offset points to beginning of headers. space is the
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher amount of space missing that is required to be able to rewrite
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce the headers
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce b) space > 0 : offset points to beginning of whitespace that can
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik be removed. space is the amount of data that can be removed from
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik there. note that the message may contain more whitespace
f775337a7d4ca1c0be8eab683d0d753cbaee49e2Lukas Slebodnik elsewhere. */
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek uoff_t offset;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek off_t space;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek};
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorcestruct mbox_sync_mail_context {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek struct mbox_sync_context *sync_ctx;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek struct mbox_sync_mail mail;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek uint32_t seq;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek uoff_t hdr_offset, body_offset;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek size_t header_first_change, header_last_change;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek string_t *header, *uidl;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek struct md5_context hdr_md5_ctx;
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek unsigned char hdr_md5_sum[16];
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek uoff_t content_length;
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek size_t hdr_pos[MBOX_HDR_COUNT];
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik uint32_t parsed_uid;
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik
1658c567191c35beaddffafdb079abe33248037bLukas Slebodnik unsigned int have_eoh:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int need_rewrite:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int seen_imapbase:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int pseudo:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int updated:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int recent:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int dirty:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int seen_received_hdr:1;
d921c1eba437662437847279f251a0a5d8f70127Maxim unsigned int uid_broken:1;
d921c1eba437662437847279f251a0a5d8f70127Maxim};
d921c1eba437662437847279f251a0a5d8f70127Maxim
d921c1eba437662437847279f251a0a5d8f70127Maximstruct mbox_sync_context {
d921c1eba437662437847279f251a0a5d8f70127Maxim struct index_mailbox *ibox;
d921c1eba437662437847279f251a0a5d8f70127Maxim enum mbox_sync_flags flags;
d921c1eba437662437847279f251a0a5d8f70127Maxim struct istream *input, *file_input;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer int fd;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer struct mail_index_sync_ctx *index_sync_ctx;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer struct mail_index_view *sync_view;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer struct mail_index_transaction *t;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer const struct mail_index_header *hdr;
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
327127bb7fcc07f882209f029e14026de1b23c94Maxim string_t *header, *uidl, *from_line;
327127bb7fcc07f882209f029e14026de1b23c94Maxim
327127bb7fcc07f882209f029e14026de1b23c94Maxim /* header state: */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t base_uid_validity, base_uid_last;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uint32_t update_base_uid_last;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* mail state: */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher buffer_t *mails, *syncs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_sync_rec sync_rec;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
eb2e21b764d03544d8161e9956d7f70b07b75f77Simo Sorce uint32_t prev_msg_uid, next_uid;
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek uint32_t seq, idx_seq, need_space_seq, need_space_idx_seq;
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozek off_t expunged_space, space_diff;
07d82f79d2970a08628ebf71343441ec55faa6faPavel Březina
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int dest_first_mail:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int seen_first_mail:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int delay_writes:1;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
4b6a0d0b3d42e5fdb457f47d9adfa5e66b160256Stephen Gallagherint mbox_sync(struct index_mailbox *ibox, enum mbox_sync_flags flags);
90fd1bbd6035cdab46faa3a695a2fb2be6508b17Sumit Boseint mbox_sync_has_changed(struct index_mailbox *ibox, int leave_dirty);
03713859dffacc7142393e53c73d8d4cf7dee8d5Pavel Březina
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnikvoid mbox_sync_parse_next_mail(struct istream *input,
4a5a18f489f4d19aa0571528a7f0c7a8d35ac83fLukas Slebodnik struct mbox_sync_mail_context *ctx);
af4ffe1001adcc0a96897e426d26444f07af9aa1Benjamin Franzkeint mbox_sync_parse_match_mail(struct index_mailbox *ibox,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_view *view, uint32_t seq);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
64ea4127f463798410a2c20e0261c6b15f60257fJakub Hrozekvoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher buffer_t *syncs_buf);
772464c842968d6e544118ae1aa7c49a7cda2ad6Stephen Gallaghervoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
32381402a4a9afc003782c9e2301fc59c9bda2a9Yassir Elley const struct mbox_sync_mail *mail);
068dbee9ca7bf5b37330eff91c94ae10f288d09fJakub Hrozekint mbox_sync_try_rewrite(struct mbox_sync_mail_context *ctx, off_t move_diff);
98ce3c3e85a4bb2e1822bf8ab2a1c2ab9e3dd61dJakub Hrozekint mbox_sync_rewrite(struct mbox_sync_context *sync_ctx,
be65f065fef1d387281096ef095a2acef39ecc12Jakub Hrozek uoff_t end_offset, off_t move_diff, uoff_t extra_space,
e124844907ed6973915e4d56f5442ecd07535a12Jakub Hrozek uint32_t first_seq, uint32_t last_seq);
f36078af138f052cd9a30360867b0ebd0805af5eJakub Hrozek
34c78b745eb349eef2b0f13ef2b722632aebe619Jan Cholastaint mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
cb4d5b588e704114b7090678752d33512baa718eJakub Hrozekint mbox_move(struct mbox_sync_context *sync_ctx,
e07a94a66985b674c5df11ca466792902164c4e2George McCollister uoff_t dest, uoff_t source, uoff_t size);
77c0d1f6074059dafd2293f9c42ea0f9d60f8aadJakub Hrozekvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
a2e417f38c57ed87c956ddcecf4dafca93842b65Lukas Slebodnik size_t pos, size_t need, size_t have);
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer
b9c8ce2bdd4045782c243605a1b999098bedcffcNoam Meltzer#endif
a9c287bda3fc2a1e12cef2135ade96945f11ad01Sumit Bose