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