mail-storage-private.h revision b83deefd2cf1e293373673eefb4d5cf60907978c
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Block size when read()ing message header. */
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen/* Block size when read()ing message (header and) body. */
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen#define MAIL_READ_FULL_BLOCK_SIZE IO_BLOCK_SIZE
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int id;
7bd72e4deca3cbf757dd1ea298486d9f3bc24226Timo Sirainen unsigned int id;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen const struct setting_parser_info *(*get_setting_parser_info)(void);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*create)(struct mail_storage *storage, struct mail_namespace *ns,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen const char **error_r);
5c99eaa4e3e07ee065580d163240b4ce95b66befTimo Sirainen void (*destroy)(struct mail_storage *storage);
5c99eaa4e3e07ee065580d163240b4ce95b66befTimo Sirainen void (*add_list)(struct mail_storage *storage,
5c99eaa4e3e07ee065580d163240b4ce95b66befTimo Sirainen void (*get_list_settings)(const struct mail_namespace *ns,
5c99eaa4e3e07ee065580d163240b4ce95b66befTimo Sirainen bool (*autodetect)(const struct mail_namespace *ns,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mailbox *(*mailbox_alloc)(struct mail_storage *storage,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* mailboxes are files, not directories */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE = 0x01,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* root_dir points to a unique directory */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* mailbox_open_stream() is supported */
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen/* private: */
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen /* counting number of times mail_storage_create() has returned this
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen same storage. */
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen /* counting number of objects (e.g. mailbox) that have a pointer
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen to this storage. */
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
ccfc6441cadb577084daeb1f0aa3dd7bdfa2a220Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_storage_module_context *);
2521482f3f897c83f7d5a2f9e17fe99fa4ba2cbeTimo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen int (*enable)(struct mailbox *box, enum mailbox_feature features);
73e19ec2d5069ea125dcd1ede5d8a70f701fd9a8Timo Sirainen int (*create)(struct mailbox *box, const struct mailbox_update *update,
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen int (*update)(struct mailbox *box, const struct mailbox_update *update);
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen int (*rename)(struct mailbox *src, struct mailbox *dest,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*get_status)(struct mailbox *box, enum mailbox_status_items items,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen int (*get_guid)(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen /* Lookup sync extension record and figure out if it mailbox has
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen changed since. Returns 1 = yes, 0 = no, -1 = error. */
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen int (*list_index_has_changed)(struct mailbox *box,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen /* Update the sync extension record. Returns 0 = ok, -1 = error. */
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen int (*list_index_update_sync)(struct mailbox *box,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen bool (*sync_next)(struct mailbox_sync_context *ctx,
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen /* Called once for each expunge. Called one or more times for
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen flag/keyword changes. Once the sync is finished, called with
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen uid=0 and sync_type=0. */
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen void (*sync_notify)(struct mailbox *box, uint32_t uid,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
dd93aba1901a457346990f49c54a738947dc7128Timo Sirainen struct mail_transaction_commit_changes *changes_r);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*transaction_set_max_modseq)(struct mailbox_transaction_context *t,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen const char *const keywords[],
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainen (*keywords_create_from_indexes)(struct mailbox *box,
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen void (*keywords_ref)(struct mail_keywords *keywords);
08aea01ef9a9d20703e0fcf8618e6195c0037a44Timo Sirainen void (*keywords_unref)(struct mail_keywords *keywords);
08aea01ef9a9d20703e0fcf8618e6195c0037a44Timo Sirainen bool (*keyword_is_valid)(struct mailbox *box, const char *keyword,
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainen const char **error_r);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*get_seq_range)(struct mailbox *box, uint32_t uid1, uint32_t uid2,
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen bool (*get_expunges)(struct mailbox *box, uint64_t prev_modseq,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*get_virtual_backend_boxes)(struct mailbox *box,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen void (*get_virtual_box_patterns)(struct mailbox *box,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen ARRAY_TYPE(mailbox_virtual_patterns) *includes,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen const char *const headers[]);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen void (*header_lookup_deinit)(struct mailbox_header_lookup_ctx *ctx);
51ead2f4c04ee85615d23c453924633b9ed8a4c2Timo Sirainen (*search_init)(struct mailbox_transaction_context *t,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*search_deinit)(struct mail_search_context *ctx);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen bool (*search_next_nonblock)(struct mail_search_context *ctx,
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen /* Internal search function which updates ctx->seq */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen bool (*search_next_update_seq)(struct mail_search_context *ctx);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen (*save_alloc)(struct mailbox_transaction_context *t);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*save_begin)(struct mail_save_context *ctx, struct istream *input);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*save_continue)(struct mail_save_context *ctx);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*save_finish)(struct mail_save_context *ctx);
51ead2f4c04ee85615d23c453924633b9ed8a4c2Timo Sirainen void (*save_cancel)(struct mail_save_context *ctx);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int (*copy)(struct mail_save_context *ctx, struct mail *mail);
struct mailbox {
const char *name;
struct mailbox_vfuncs v;
const char *path;
const char *vname;
unsigned int transaction_count;
const char *file_create_gid_origin;
unsigned int notify_min_interval;
void *notify_context;
struct mail_vfuncs {
const char **value_r);
union mail_module_context {
struct mail_private {
struct mail_vfuncs v;
unsigned long stats_open_lookup_count;
unsigned long stats_stat_lookup_count;
unsigned long stats_fstat_lookup_count;
unsigned long stats_files_read_count;
unsigned long long stats_files_read_bytes;
unsigned long stats_cache_hit_count;
struct mailbox_list_context {
bool failed;
struct mailbox_transaction_context {
union mailbox_transaction_module_context *);
union mail_search_module_context {
struct mail_search_context {
struct mail_save_context {
int received_tz_offset;
struct mailbox_sync_context {
struct mailbox_header_lookup_ctx {
const char *const *headers;
int refcount;
int *fd_r);