mbox-sync-private.h revision 5137d2d80255938a0f5fb8f3c1a21b34cf11ada3
2N/A#ifndef __MBOX_SYNC_PRIVATE_H
2N/A#define __MBOX_SYNC_PRIVATE_H
2N/A
2N/A#include "md5.h"
2N/A#include "mail-index.h"
2N/A
2N/AARRAY_DEFINE_TYPE(sync_recs, struct mail_index_sync_rec);
2N/A
2N/A#include <sys/stat.h>
2N/A
2N/Aenum mbox_sync_flags {
2N/A MBOX_SYNC_LAST_COMMIT = 0x01,
2N/A MBOX_SYNC_HEADER = 0x02,
2N/A MBOX_SYNC_LOCK_READING = 0x04,
2N/A MBOX_SYNC_UNDIRTY = 0x08,
2N/A MBOX_SYNC_REWRITE = 0x10,
2N/A MBOX_SYNC_FORCE_SYNC = 0x20
2N/A};
2N/A
2N/Astruct mbox_flag_type {
2N/A char chr;
2N/A enum mail_flags flag;
2N/A};
2N/A
2N/Aenum header_position {
2N/A MBOX_HDR_STATUS,
2N/A MBOX_HDR_X_IMAPBASE,
2N/A MBOX_HDR_X_KEYWORDS,
2N/A MBOX_HDR_X_STATUS,
2N/A MBOX_HDR_X_UID,
2N/A
2N/A MBOX_HDR_COUNT
2N/A};
2N/A
2N/A/* kludgy. swap MAIL_RECENT with MBOX_NONRECENT_KLUDGE when writing Status
2N/A header, because 'O' flag means non-recent but internally we want to use
2N/A recent flag. */
2N/A#define MBOX_NONRECENT_KLUDGE MAIL_RECENT
2N/A
2N/A#define STATUS_FLAGS_MASK (MAIL_SEEN|MBOX_NONRECENT_KLUDGE)
2N/A#define XSTATUS_FLAGS_MASK (MAIL_ANSWERED|MAIL_FLAGGED|MAIL_DRAFT|MAIL_DELETED)
2N/Aextern struct mbox_flag_type mbox_status_flags[];
2N/Aextern struct mbox_flag_type mbox_xstatus_flags[];
2N/A
2N/Astruct mbox_sync_mail {
2N/A /* uid=0 can mean that this mail describes an expunged area or that
2N/A this is a pseudo message */
2N/A uint32_t uid;
2N/A uint32_t idx_seq;
2N/A
2N/A ARRAY_TYPE(keyword_indexes) keywords;
2N/A uint8_t flags;
2N/A
2N/A unsigned int uid_broken:1;
2N/A unsigned int expunged:1;
2N/A unsigned int pseudo:1;
2N/A
2N/A uoff_t from_offset;
2N/A uoff_t body_size;
2N/A
2N/A /* following variables have a bit overloaded functionality:
2N/A
2N/A a) space <= 0 : offset points to beginning of headers. space is the
2N/A amount of space missing that is required to be able to rewrite
2N/A the headers
2N/A b) space > 0 : offset points to beginning of whitespace that can
2N/A be removed. space is the amount of data that can be removed from
2N/A there. note that the message may contain more whitespace
2N/A elsewhere. */
2N/A uoff_t offset;
2N/A off_t space;
2N/A};
2N/A
2N/Astruct mbox_sync_mail_context {
2N/A struct mbox_sync_context *sync_ctx;
2N/A struct mbox_sync_mail mail;
2N/A
2N/A uint32_t seq;
2N/A uoff_t hdr_offset, body_offset;
2N/A
2N/A size_t header_first_change, header_last_change;
2N/A string_t *header;
2N/A
2N/A unsigned char hdr_md5_sum[16];
2N/A
2N/A uoff_t content_length;
2N/A
2N/A size_t hdr_pos[MBOX_HDR_COUNT];
2N/A uint32_t parsed_uid, last_uid_updated_value;
2N/A unsigned int last_uid_value_start_pos;
2N/A
2N/A unsigned int have_eoh:1;
2N/A unsigned int need_rewrite:1;
2N/A unsigned int seen_imapbase:1;
2N/A unsigned int updated:1;
2N/A unsigned int recent:1;
2N/A unsigned int dirty:1;
2N/A unsigned int imapbase_rewrite:1;
2N/A unsigned int imapbase_updated:1;
2N/A};
2N/A
2N/Astruct mbox_sync_context {
2N/A struct mbox_mailbox *mbox;
2N/A enum mbox_sync_flags flags;
2N/A struct istream *input, *file_input;
2N/A int write_fd;
2N/A
2N/A time_t orig_mtime;
2N/A uoff_t orig_size;
2N/A struct stat last_stat;
2N/A
2N/A struct mail_index_sync_ctx *index_sync_ctx;
2N/A struct mail_index_view *sync_view;
2N/A struct mail_index_transaction *t;
2N/A const struct mail_index_header *hdr;
2N/A
2N/A string_t *header, *from_line;
2N/A
2N/A /* header state: */
2N/A uint32_t base_uid_validity, base_uid_last;
2N/A uoff_t base_uid_last_offset;
2N/A
2N/A /* mail state: */
2N/A ARRAY_DEFINE(mails, struct mbox_sync_mail);
2N/A ARRAY_TYPE(sync_recs) syncs;
2N/A struct mail_index_sync_rec sync_rec;
2N/A
2N/A /* per-mail pool */
2N/A pool_t mail_keyword_pool;
2N/A /* used for mails[].keywords */
2N/A pool_t saved_keywords_pool;
2N/A
2N/A uint32_t prev_msg_uid, next_uid, idx_next_uid;
2N/A uint32_t seq, idx_seq, need_space_seq;
2N/A off_t expunged_space, space_diff;
2N/A
2N/A unsigned int dest_first_mail:1;
2N/A unsigned int first_mail_crlf_expunged:1;
2N/A
2N/A /* global flags: */
2N/A unsigned int delay_writes:1;
2N/A unsigned int renumber_uids:1;
2N/A unsigned int moved_offsets:1;
2N/A unsigned int ext_modified:1;
2N/A};
2N/A
2N/Aint mbox_sync(struct mbox_mailbox *mbox, enum mbox_sync_flags flags);
2N/Aint mbox_sync_has_changed(struct mbox_mailbox *mbox, bool leave_dirty);
2N/Avoid mbox_sync_set_critical(struct mbox_sync_context *sync_ctx,
2N/A const char *fmt, ...) __attr_format__(2, 3);
2N/A
2N/Avoid mbox_sync_parse_next_mail(struct istream *input,
2N/A struct mbox_sync_mail_context *ctx);
2N/Aint mbox_sync_parse_match_mail(struct mbox_mailbox *mbox,
2N/A struct mail_index_view *view, uint32_t seq);
2N/A
2N/Avoid mbox_sync_update_header(struct mbox_sync_mail_context *ctx);
2N/Avoid mbox_sync_update_header_from(struct mbox_sync_mail_context *ctx,
2N/A const struct mbox_sync_mail *mail);
2N/Aint mbox_sync_try_rewrite(struct mbox_sync_mail_context *ctx, off_t move_diff);
2N/Aint mbox_sync_rewrite(struct mbox_sync_context *sync_ctx,
2N/A struct mbox_sync_mail_context *mail_ctx,
2N/A uoff_t end_offset, off_t move_diff, uoff_t extra_space,
2N/A uint32_t first_seq, uint32_t last_seq);
2N/A
2N/Avoid mbox_sync_apply_index_syncs(struct mbox_sync_context *sync_ctx,
2N/A struct mbox_sync_mail *mail,
2N/A enum mailbox_sync_type *sync_type_r);
2N/Aint mbox_sync_seek(struct mbox_sync_context *sync_ctx, uoff_t from_offset);
2N/Avoid mbox_sync_file_update_ext_modified(struct mbox_sync_context *sync_ctx);
2N/Avoid mbox_sync_file_updated(struct mbox_sync_context *sync_ctx, bool dirty);
2N/Aint mbox_move(struct mbox_sync_context *sync_ctx,
2N/A uoff_t dest, uoff_t source, uoff_t size);
2N/Avoid mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx,
2N/A size_t pos, size_t need, size_t have);
2N/Avoid mbox_sync_headers_add_space(struct mbox_sync_mail_context *ctx,
2N/A size_t size);
2N/A
2N/A#endif
2N/A