mail-storage-private.h revision 70ead6466f9baa8294e71fc2fba0a4f54f488b5e
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef MAIL_STORAGE_PRIVATE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define MAIL_STORAGE_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
80c1d98d3638b71e57a39cafa88b9122bf8169c6Timo Sirainen#include "module-context.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "file-lock.h"
94a8cb0ee1d85569ad1a2acacd92d3ce22f8a1cbTimo Sirainen#include "mail-storage.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-index-private.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen/* Called after mail storage has been created */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern void (*hook_mail_storage_created)(struct mail_storage *storage);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen/* Called after mailbox has been opened */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern void (*hook_mailbox_opened)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Called after mailbox index has been opened */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern void (*hook_mailbox_index_opened)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_storage_module_register {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen unsigned int id;
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainen};
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainen
369a1084c500a9df7448ffa9409ce32e42060bc2Timo Sirainenstruct mail_module_register {
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen unsigned int id;
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen};
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainenstruct mail_storage_vfuncs {
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen void (*class_init)(void);
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen void (*class_deinit)(void);
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage *(*alloc)(void);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*create)(struct mail_storage *storage, const char *data,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **error_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*destroy)(struct mail_storage *storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen bool (*autodetect)(const char *data, enum mail_storage_flags flags);
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
6ec7cf71ccd0eed1f9cc1b0bda8960796b04160bTimo Sirainen struct mailbox *(*mailbox_open)(struct mail_storage *storage,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct istream *input,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen enum mailbox_open_flags flags);
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen int (*mailbox_create)(struct mail_storage *storage, const char *name,
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen bool directory);
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenunion mail_storage_module_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_vfuncs super;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_module_register *reg;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_storage {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *name;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool mailbox_is_file;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_vfuncs v;
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen/* private: */
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen pool_t pool;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *error_string;
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen enum mail_error error;
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const struct mail_storage *storage_class;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_namespace *ns;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox_list *list;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *temp_path_prefix;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_storage_flags flags;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum file_lock_method lock_method;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int keyword_max_len;
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_callbacks *callbacks;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void *callback_context;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
1d3f7c1278168d5b1cbfa9a2cc9929a0909056b4Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_storage_module_context *);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mailbox_vfuncs {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool (*is_readonly)(struct mailbox *box);
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen int (*enable)(struct mailbox *box, enum mailbox_feature features);
51795bfe9d05d92fe942cb451aec2b9d16d32a11Timo Sirainen int (*close)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen void (*get_status)(struct mailbox *box, enum mailbox_status_items items,
2a734f36105e33ab452d057df6bc7a2b7d9f96f0Timo Sirainen struct mailbox_status *status_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen /* Lookup sync extension record and figure out if it mailbox has
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen changed since. Returns 1 = yes, 0 = no, -1 = error. */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen int (*list_index_has_changed)(struct mailbox *box,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_index_view *list_view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t seq);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Update the sync extension record. Returns 0 = ok, -1 = error. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*list_index_update_sync)(struct mailbox *box,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen struct mail_index_transaction *trans,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t seq);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mailbox_sync_context *
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen (*sync_init)(struct mailbox *box,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen enum mailbox_sync_flags flags);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen bool (*sync_next)(struct mailbox_sync_context *ctx,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mailbox_sync_rec *sync_rec_r);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen enum mailbox_status_items status_items,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mailbox_status *status_r);
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* Called once for each expunge. Called one or more times for
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen flag/keyword changes. Once the sync is finished, called with
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen uid=0 and sync_type=0. */
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen void (*sync_notify)(struct mailbox *box, uint32_t uid,
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen enum mailbox_sync_type sync_type);
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen void (*notify_changes)(struct mailbox *box);
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen struct mailbox_transaction_context *
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen (*transaction_begin)(struct mailbox *box,
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen enum mailbox_transaction_flags flags);
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t *uid_validity_r,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen uint32_t *first_saved_uid_r,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen uint32_t *last_saved_uid_r);
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen void (*transaction_set_max_modseq)(struct mailbox_transaction_context *t,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen uint64_t max_modseq,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen ARRAY_TYPE(seq_range) *seqs);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen int (*keywords_create)(struct mailbox *box,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen const char *const keywords[],
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen struct mail_keywords **keywords_r,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen bool skip_invalid);
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen void (*keywords_free)(struct mail_keywords *keywords);
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen bool (*keyword_is_valid)(struct mailbox *box, const char *keyword,
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen const char **error_r);
c8adec8db635f5efb13b9879a5f3fb523abdc969Timo Sirainen
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen void (*get_seq_range)(struct mailbox *box, uint32_t uid1, uint32_t uid2,
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen uint32_t *seq1_r, uint32_t *seq2_r);
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen void (*get_uid_range)(struct mailbox *box,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen const ARRAY_TYPE(seq_range) *seqs,
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen ARRAY_TYPE(seq_range) *uids);
7761758f43d6150be4b07f4c54457ce662f78c4cTimo Sirainen bool (*get_expunged_uids)(struct mailbox *box, uint64_t modseq,
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen const ARRAY_TYPE(seq_range) *uids,
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen ARRAY_TYPE(seq_range) *expunged_uids);
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen bool (*get_virtual_uid)(struct mailbox *box,
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen const char *backend_mailbox,
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen uint32_t backend_uidvalidity,
62f4a199b5c9a0862f486cbf18e195cc621bbe25Timo Sirainen uint32_t backend_uid, uint32_t *uid_r);
6bc98d3898c475ba7615ba2b016e5142c8b2c09fTimo Sirainen void (*get_virtual_backend_boxes)(struct mailbox *box,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY_TYPE(mailboxes) *mailboxes,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool only_with_msgs);
659fe5d24825b160cae512538088020d97a60239Timo Sirainen void (*get_virtual_box_patterns)(struct mailbox *box,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY_TYPE(mailbox_virtual_patterns) *includes,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen enum mail_fetch_field wanted_fields,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
26ff8f8a4867bf8e9551a27a2de8c12cd138b065Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox_header_lookup_ctx *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (*header_lookup_init)(struct mailbox *box,
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen const char *const headers[]);
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen void (*header_lookup_ref)(struct mailbox_header_lookup_ctx *ctx);
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen void (*header_lookup_unref)(struct mailbox_header_lookup_ctx *ctx);
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen struct mail_search_context *
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen (*search_init)(struct mailbox_transaction_context *t,
020a39a395d2adb768e0179631b37bc78ecd9471Timo Sirainen struct mail_search_args *args,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const enum mail_sort_type *sort_program);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen int (*search_deinit)(struct mail_search_context *ctx);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*search_next_nonblock)(struct mail_search_context *ctx,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail *mail, bool *tryagain_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Internal search function which updates ctx->seq */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool (*search_next_update_seq)(struct mail_search_context *ctx);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_save_context *
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen (*save_alloc)(struct mailbox_transaction_context *t);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*save_begin)(struct mail_save_context *ctx, struct istream *input);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen int (*save_continue)(struct mail_save_context *ctx);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen int (*save_finish)(struct mail_save_context *ctx);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen void (*save_cancel)(struct mail_save_context *ctx);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen int (*copy)(struct mail_save_context *ctx, struct mail *mail);
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen bool (*is_inconsistent)(struct mailbox *box);
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen};
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenunion mailbox_module_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox_vfuncs super;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_module_register *reg;
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainen};
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainen
a045c3aba2610c6ed0bf1c346df1c6d8f7b9fbfdTimo Sirainenstruct mailbox {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen char *name;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage *storage;
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen struct mailbox_vfuncs v;
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen/* private: */
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen pool_t pool;
d30da25fb6be1f1c667d93767c9194000194b618Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mailbox_open_flags open_flags;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int transaction_count;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen enum mailbox_feature enabled_features;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen /* User's private flags if this is a shared mailbox */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_flags private_flags_mask;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* mode and GID to use for newly created files/dirs */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mode_t file_create_mode, dir_create_mode;
df4018ae2f0a95be602f724ca70df7e0e3bd6a7dTimo Sirainen gid_t file_create_gid;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* Mailbox notification settings: */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int notify_min_interval;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mailbox_notify_callback_t *notify_callback;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen void *notify_context;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* Saved search results */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY_DEFINE(search_results, struct mail_search_result *);
7c95b03620a03a43dd72d39608cea5fc77393ad6Timo Sirainen
db87d16551d1081ada01f787ea21aa3ed1402c31Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen ARRAY_DEFINE(module_contexts, union mailbox_module_context *);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* When FAST open flag is used, the mailbox isn't actually opened until
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen it's synced for the first time. */
eac3948d67eff8623d51aeaea9eca582f3aec677Timo Sirainen unsigned int opened:1;
2674b4f0cf8f3c203d8e56b29735f5e267038dafTimo Sirainen /* Mailbox was deleted while we had it open. */
e376693bfa3985232c41df99c7010fca22612c89Timo Sirainen unsigned int mailbox_deleted:1;
48136ae5a0eb49daa44e343553f3688a500307e2Timo Sirainen};
48136ae5a0eb49daa44e343553f3688a500307e2Timo Sirainen
2674b4f0cf8f3c203d8e56b29735f5e267038dafTimo Sirainenstruct mail_vfuncs {
e376693bfa3985232c41df99c7010fca22612c89Timo Sirainen void (*close)(struct mail *mail);
e376693bfa3985232c41df99c7010fca22612c89Timo Sirainen void (*free)(struct mail *mail);
e376693bfa3985232c41df99c7010fca22612c89Timo Sirainen void (*set_seq)(struct mail *mail, uint32_t seq);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool (*set_uid)(struct mail *mail, uint32_t uid);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen enum mail_flags (*get_flags)(struct mail *mail);
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen const char *const *(*get_keywords)(struct mail *mail);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen const ARRAY_TYPE(keyword_indexes) *
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen (*get_keyword_indexes)(struct mail *mail);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen uint64_t (*get_modseq)(struct mail *mail);
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen int (*get_parts)(struct mail *mail,
d6a1fa1d65c6d1996937802c2482c0f14dd821a7Timo Sirainen const struct message_part **parts_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_date)(struct mail *mail, time_t *date_r, int *timezone_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_received_date)(struct mail *mail, time_t *date_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_save_date)(struct mail *mail, time_t *date_r);
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen int (*get_virtual_size)(struct mail *mail, uoff_t *size_r);
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen int (*get_physical_size)(struct mail *mail, uoff_t *size_r);
b92813e2f96d4b28f989528ed5dd6115da7d9bdbTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_first_header)(struct mail *mail, const char *field,
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen bool decode_to_utf8, const char **value_r);
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen int (*get_headers)(struct mail *mail, const char *field,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool decode_to_utf8, const char *const **value_r);
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen int (*get_header_stream)(struct mail *mail,
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen struct mailbox_header_lookup_ctx *headers,
db5164c9a1129af0cfb11fc18d88da361a8011fbTimo Sirainen struct istream **stream_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_stream)(struct mail *mail, struct message_size *hdr_size,
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen struct message_size *body_size,
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen struct istream **stream_r);
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen int (*get_special)(struct mail *mail, enum mail_fetch_field field,
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen const char **value_r);
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen
d152ccd0d29fae1bc6092bf198ee7eb843202f96Timo Sirainen void (*update_flags)(struct mail *mail, enum modify_type modify_type,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_flags flags);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*update_keywords)(struct mail *mail, enum modify_type modify_type,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_keywords *keywords);
aa0647f2debf0d48d504a321186f66c85596aaf4Timo Sirainen void (*expunge)(struct mail *mail);
2d39dc1a453546892109b35c0d9770369011a13dTimo Sirainen void (*set_cache_corrupted)(struct mail *mail,
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen enum mail_fetch_field field);
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen struct index_mail *(*get_index_mail)(struct mail *mail);
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen};
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainenunion mail_module_context {
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen struct mail_vfuncs super;
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen struct mail_module_register *reg;
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen};
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainen
8f8315e4b4e27ead12dd1c3da65bf4dee3762f18Timo Sirainenstruct mail_private {
768b7f5783c8de119d7386321e5d0c72d5c2d9f6Timo Sirainen struct mail mail;
768b7f5783c8de119d7386321e5d0c72d5c2d9f6Timo Sirainen struct mail_vfuncs v;
768b7f5783c8de119d7386321e5d0c72d5c2d9f6Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_fetch_field wanted_fields;
b08b33d1f5ce3721dc2d83586c9cb0ca141331fdTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers;
b08b33d1f5ce3721dc2d83586c9cb0ca141331fdTimo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen pool_t pool;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen ARRAY_DEFINE(module_contexts, union mail_module_context *);
89caf81340a4da959ef18c5f9b9c99824a53066bTimo Sirainen};
89caf81340a4da959ef18c5f9b9c99824a53066bTimo Sirainen
89caf81340a4da959ef18c5f9b9c99824a53066bTimo Sirainenstruct mailbox_list_context {
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen struct mail_storage *storage;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen enum mailbox_list_flags flags;
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen bool failed;
d9de52132072d80b8c268094b879c0ef5a108db3Timo Sirainen};
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenunion mailbox_transaction_module_context {
685393de106e55b61f754d420e378d05bd462ebbTimo Sirainen struct mail_storage_module_register *reg;
87712707722ef7d73acb065546e61afa4455cd9eTimo Sirainen};
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainen
3b80595fcf2001cf7b2fcc6290823e38f4a142fcTimo Sirainenstruct mailbox_transaction_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox *box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mailbox_transaction_flags flags;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY_DEFINE(module_contexts,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen union mailbox_transaction_module_context *);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
7761758f43d6150be4b07f4c54457ce662f78c4cTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenunion mail_search_module_context {
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen struct mail_storage_module_register *reg;
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen};
94a8cb0ee1d85569ad1a2acacd92d3ce22f8a1cbTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_search_context {
94a8cb0ee1d85569ad1a2acacd92d3ce22f8a1cbTimo Sirainen struct mailbox_transaction_context *transaction;
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_search_args *args;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_search_sort_program *sort_program;
b20fb5b1df9d604a7541f5118fc5b4b466d211efTimo Sirainen
b20fb5b1df9d604a7541f5118fc5b4b466d211efTimo Sirainen /* if non-NULL, specifies that a search resulting is being updated.
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen this can be used as a search optimization: if searched message
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen already exists in search result, it's not necessary to check if
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen static data matches. */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen struct mail_search_result *update_result;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen /* add matches to these search results */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen ARRAY_DEFINE(results, struct mail_search_result *);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen uint32_t seq;
bb26f09873c18f342cd1ab2d0ee0b9018e6546d9Timo Sirainen uint32_t progress_cur, progress_max;
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen ARRAY_DEFINE(module_contexts, union mail_search_module_context *);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b5ea11802f2bafbec06282a7b3b6704dc5fae584Timo Sirainen unsigned int seen_lost_data:1;
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen unsigned int progress_hidden:1;
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen};
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainen
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainenstruct mail_save_context {
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainen struct mailbox_transaction_context *transaction;
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainen struct mail *dest_mail;
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen enum mail_flags flags;
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainen struct mail_keywords *keywords;
3da614c39dd29f536c485089e67839b4cf89fed3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen time_t received_date;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int received_tz_offset;
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen char *guid, *from_envelope;
88187ee880b4829443e0d55ea7d145d9d5880217Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mailbox_sync_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox *box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainenstruct mailbox_header_lookup_ctx {
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen struct mailbox *box;
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen const char *const *headers;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Modules should use do "my_id = mail_storage_module_id++" and
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen use objects' module_contexts[id] for their own purposes. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern struct mail_storage_module_register mail_storage_module_register;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen/* Storage's module_id for mail_index. */
c251a38df327599a62d341bf5c2282f31352faa5Timo Sirainenextern struct mail_module_register mail_module_register;
c251a38df327599a62d341bf5c2282f31352faa5Timo Sirainen
c251a38df327599a62d341bf5c2282f31352faa5Timo Sirainen#define MAIL_STORAGE_CONTEXT(obj) \
c251a38df327599a62d341bf5c2282f31352faa5Timo Sirainen MODULE_CONTEXT(obj, mail_storage_mail_index_module)
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainenextern MODULE_CONTEXT_DEFINE(mail_storage_mail_index_module,
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen &mail_index_module_register);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen/* Set error message in storage. Critical errors are logged with i_error(),
6825360d446542046757b06064282301c4c6b27cTimo Sirainen but user sees only "internal error" message. */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenvoid mail_storage_clear_error(struct mail_storage *storage);
6825360d446542046757b06064282301c4c6b27cTimo Sirainenvoid mail_storage_set_error(struct mail_storage *storage,
6825360d446542046757b06064282301c4c6b27cTimo Sirainen enum mail_error error, const char *string);
6825360d446542046757b06064282301c4c6b27cTimo Sirainenvoid mail_storage_set_critical(struct mail_storage *storage,
6825360d446542046757b06064282301c4c6b27cTimo Sirainen const char *fmt, ...) ATTR_FORMAT(2, 3);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_storage_set_internal_error(struct mail_storage *storage);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenbool mail_storage_set_error_from_errno(struct mail_storage *storage);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainenconst char *mail_generate_guid_string(void);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenvoid mail_set_expunged(struct mail *mail);
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainenvoid mailbox_set_deleted(struct mailbox *box);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainenenum mailbox_list_flags
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenmail_storage_get_list_flags(enum mail_storage_flags storage_flags);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
61f5256ef248d35459b53534ae428bf6d016e1c5Timo Sirainen#endif
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen