mbox-sync-private.h revision 319944c0f35b311c998854e96d6463a084fd90ae
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifndef __MBOX_SYNC_PRIVATE_H
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __MBOX_SYNC_PRIVATE_H
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "md5.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "mail-index.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisenum mbox_sync_flags {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_SYNC_LAST_COMMIT = 0x01,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_SYNC_HEADER = 0x02,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_SYNC_LOCK_READING = 0x04,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_SYNC_UNDIRTY = 0x08
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstruct mbox_flag_type {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char chr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis enum mail_flags flag;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisenum header_position {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_STATUS,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_X_IMAPBASE,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_X_KEYWORDS,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_X_STATUS,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_X_UID,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis MBOX_HDR_COUNT
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define MBOX_NONRECENT MAIL_RECENT /* kludgy */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define MBOX_EXPUNGED 0x40
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define MBOX_DIRTY_SPACE 0x80
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern struct mbox_flag_type mbox_status_flags[];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern struct mbox_flag_type mbox_xstatus_flags[];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstruct mbox_sync_mail {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t uid;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t idx_seq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint8_t flags;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis keywords_mask_t keywords;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t from_offset;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t body_size;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* following variables have a bit overloaded functionality:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis a) space <= 0 : offset points to beginning of headers. space is the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis amount of space missing that is required to be able to rewrite
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis the headers
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis b) space > 0 : offset points to beginning of whitespace that can
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis be removed. space is the amount of data that can be removed from
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis there. note that the message may contain more whitespace
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis elsewhere. */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t offset;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis off_t space;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstruct mbox_sync_mail_context {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mbox_sync_context *sync_ctx;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mbox_sync_mail mail;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t seq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t hdr_offset, body_offset;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis size_t header_first_change, header_last_change;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis string_t *header, *uidl;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct md5_context hdr_md5_ctx;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned char hdr_md5_sum[16];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t content_length;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis size_t hdr_pos[MBOX_HDR_COUNT];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t parsed_uid;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int have_eoh:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int need_rewrite:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int seen_imapbase:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int pseudo:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int updated:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int recent:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int seen_received_hdr:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int uid_broken:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstruct mbox_sync_context {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct index_mailbox *ibox;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct istream *input, *file_input;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int fd;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mail_index_sync_ctx *index_sync_ctx;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mail_index_view *sync_view;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mail_index_transaction *t;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis const struct mail_index_header *hdr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis string_t *header, *uidl, *from_line;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* header state: */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t base_uid_validity, base_uid_last;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t update_base_uid_last;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* mail state: */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buffer_t *mails, *syncs;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mail_index_sync_rec sync_rec;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t prev_msg_uid, next_uid;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t seq, idx_seq, need_space_seq, need_space_idx_seq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis off_t expunged_space, space_diff;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int dest_first_mail:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int seen_first_mail:1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync(struct index_mailbox *ibox, enum mbox_sync_flags flags);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync_has_changed(struct index_mailbox *ibox, int leave_dirty);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid mbox_sync_parse_next_mail(struct istream *input,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mbox_sync_mail_context *ctx);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync_parse_match_mail(struct index_mailbox *ibox,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct mail_index_view *view, uint32_t seq);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buffer_t *syncs_buf);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis const struct mbox_sync_mail *mail);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync_try_rewrite(struct mbox_sync_mail_context *ctx, off_t move_diff,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int leave_space_hole);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync_rewrite(struct mbox_sync_context *sync_ctx, uoff_t extra_space,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uint32_t first_seq, uint32_t last_seq);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint mbox_move(struct mbox_sync_context *sync_ctx,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis uoff_t dest, uoff_t source, uoff_t size);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis size_t pos, size_t need, size_t have);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis