mail-storage-private.h revision 51327f2489a4e0e615eb9f7d921473cf8512bb79
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef MAIL_STORAGE_PRIVATE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define MAIL_STORAGE_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "module-context.h"
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen#include "file-lock.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-storage.h"
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen#include "mail-storage-hooks.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "mail-storage-settings.h"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#include "mail-index-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen/* Block size when read()ing message header. */
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen#define MAIL_READ_HDR_BLOCK_SIZE (1024*4)
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen/* Block size when read()ing message (header and) body. */
3ed2d0f6b5e67e2663d44489d9da3176823789a8Timo Sirainen#define MAIL_READ_FULL_BLOCK_SIZE IO_BLOCK_SIZE
65f8fb656051f1059f7b5a2da9c5555adcc30439Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstruct mail_storage_module_register {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int id;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstruct mail_module_register {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int id;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail_storage_vfuncs {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const struct setting_parser_info *(*get_setting_parser_info)(void);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen struct mail_storage *(*alloc)(void);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen int (*create)(struct mail_storage *storage, struct mail_namespace *ns,
2dd39e478269d6fb0bb26d12b394aa30ee965e38Timo Sirainen const char **error_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*destroy)(struct mail_storage *storage);
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen void (*add_list)(struct mail_storage *storage,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct mailbox_list *list);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen void (*get_list_settings)(const struct mail_namespace *ns,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_list_settings *set);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen bool (*autodetect)(const struct mail_namespace *ns,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_list_settings *set);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct mailbox *(*mailbox_alloc)(struct mail_storage *storage,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct mailbox_list *list,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const char *name,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen enum mailbox_flags flags);
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen int (*purge)(struct mail_storage *storage);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenunion mail_storage_module_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_storage_vfuncs super;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_storage_module_register *reg;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenenum mail_storage_class_flags {
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen /* mailboxes are files, not directories */
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE = 0x01,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen /* root_dir points to a unique directory */
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT = 0x02,
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen /* mailbox_open_stream() is supported */
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen MAIL_STORAGE_CLASS_FLAG_OPEN_STREAMS = 0x04,
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen /* never use quota for this storage (e.g. virtual mailboxes) */
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen MAIL_STORAGE_CLASS_FLAG_NOQUOTA = 0x08
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen};
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail_storage {
57a8c6a95e4bce3eeaba36985adb81c07dd683ffTimo Sirainen const char *name;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen enum mail_storage_class_flags class_flags;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen struct mail_storage_vfuncs v, *vlast;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* private: */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen pool_t pool;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct mail_storage *prev, *next;
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen /* counting number of times mail_storage_create() has returned this
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen same storage. */
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen int refcount;
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen /* counting number of objects (e.g. mailbox) that have a pointer
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen to this storage. */
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen int obj_refcount;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen const char *unique_root_dir;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen char *error_string;
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen enum mail_error error;
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen const struct mail_storage *storage_class;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mail_user *user;
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen const char *temp_path_prefix;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const struct mail_storage_settings *set;
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen
8d630c15a8ed6f85553467c3a231a273defca5f6Timo Sirainen enum mail_storage_flags flags;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainen struct mail_storage_callbacks callbacks;
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen void *callback_context;
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_storage_module_context *);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct mail_attachment_part {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct message_part *part;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen const char *content_type, *content_disposition;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen};
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mailbox_vfuncs {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen bool (*is_readonly)(struct mailbox *box);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen int (*enable)(struct mailbox *box, enum mailbox_feature features);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen int (*open)(struct mailbox *box);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen void (*close)(struct mailbox *box);
e03d986a74128f5ba30fcfda9f6e36578f5d8decTimo Sirainen void (*free)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen int (*create)(struct mailbox *box, const struct mailbox_update *update,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen bool directory);
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen int (*update)(struct mailbox *box, const struct mailbox_update *update);
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen int (*delete)(struct mailbox *box);
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen int (*rename)(struct mailbox *src, struct mailbox *dest,
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen bool rename_children);
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen
d3280fe317a4598c0868cc440e7a1191c06d0db3Timo Sirainen int (*get_status)(struct mailbox *box, enum mailbox_status_items items,
d3280fe317a4598c0868cc440e7a1191c06d0db3Timo Sirainen struct mailbox_status *status_r);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen int (*get_metadata)(struct mailbox *box,
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen enum mailbox_metadata_items items,
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen struct mailbox_metadata *metadata_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen /* Lookup sync extension record and figure out if it mailbox has
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen changed since. Returns 1 = yes, 0 = no, -1 = error. */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen int (*list_index_has_changed)(struct mailbox *box,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen struct mail_index_view *list_view,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen uint32_t seq);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen /* Update the sync extension record. Returns 0 = ok, -1 = error. */
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen int (*list_index_update_sync)(struct mailbox *box,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen struct mail_index_transaction *trans,
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen uint32_t seq);
d3442384ca53d4b18a493db7dd0b000f470419cfTimo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen struct mailbox_sync_context *
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen (*sync_init)(struct mailbox *box,
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen enum mailbox_sync_flags flags);
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen bool (*sync_next)(struct mailbox_sync_context *ctx,
c979eeda1f46483d9c963e265786b701d7683d77Timo Sirainen struct mailbox_sync_rec *sync_rec_r);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
2584e86cc2d8c31ba30a4109cf4ba09d1e37e28aTimo Sirainen struct mailbox_sync_status *status_r);
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
4b41116563110d00330896a568eff1078c382827Timo Sirainen /* Called once for each expunge. Called one or more times for
4b41116563110d00330896a568eff1078c382827Timo Sirainen flag/keyword changes. Once the sync is finished, called with
4b41116563110d00330896a568eff1078c382827Timo Sirainen uid=0 and sync_type=0. */
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen void (*sync_notify)(struct mailbox *box, uint32_t uid,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen enum mailbox_sync_type sync_type);
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen void (*notify_changes)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox_transaction_context *
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (*transaction_begin)(struct mailbox *box,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mailbox_transaction_flags flags);
b2c1349cf07410aefab0f5b17153af9e5cfcf48fTimo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainen struct mail_transaction_commit_changes *changes_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
dbe64f3893616a4005c8946be75d2dc8f6823d72Timo Sirainen
8a13b020f90e080570658b18c042e7e352c8b14fTimo Sirainen enum mail_flags (*get_private_flags_mask)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail *
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mail_fetch_field wanted_fields,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_search_context *
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen (*search_init)(struct mailbox_transaction_context *t,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen struct mail_search_args *args,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen const enum mail_sort_type *sort_program);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*search_deinit)(struct mail_search_context *ctx);
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen bool (*search_next_nonblock)(struct mail_search_context *ctx,
f3bb2fbe87425dc89a839908985af496f7f65702Timo Sirainen struct mail *mail, bool *tryagain_r);
a3ee5ce6ecc8e228ee69300fdd562d7ac8be89a7Timo Sirainen /* Internal search function which updates ctx->seq */
bd1b2615928a1e8be190cb0405754f0aec8cac2fTimo Sirainen bool (*search_next_update_seq)(struct mail_search_context *ctx);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen struct mail_save_context *
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen (*save_alloc)(struct mailbox_transaction_context *t);
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen int (*save_begin)(struct mail_save_context *ctx, struct istream *input);
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen int (*save_continue)(struct mail_save_context *ctx);
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen int (*save_finish)(struct mail_save_context *ctx);
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen void (*save_cancel)(struct mail_save_context *ctx);
bd4d0a1a7c0626452b8d82f37e3ec07267ac9896Timo Sirainen int (*copy)(struct mail_save_context *ctx, struct mail *mail);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen bool (*is_inconsistent)(struct mailbox *box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenunion mailbox_module_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mailbox_vfuncs super;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_storage_module_register *reg;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenstruct mailbox_permissions {
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* mode and GID to use for newly created files/dirs */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen mode_t file_create_mode, dir_create_mode;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen gid_t file_create_gid;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* origin (e.g. path) where the file_create_gid was got from */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen const char *file_create_gid_origin;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen bool mail_index_permissions_set;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen};
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mailbox {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const char *name;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen /* mailbox's virtual name (from mail_namespace_get_vname()) */
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen const char *vname;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_storage *storage;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_list *list;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen struct mailbox_vfuncs v, *vlast;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen/* private: */
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen pool_t pool;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* these won't be set until mailbox is opened: */
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen struct mail_index *index;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen struct mail_index_view *view;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen struct mail_cache *cache;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* Filled lazily by mailbox_get_permissions() */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen struct mailbox_permissions _perm;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* Filled lazily by mailbox_get_path() */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen const char *_path;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen /* default vfuncs for new struct mails. */
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen const struct mail_vfuncs *mail_vfuncs;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen struct istream *input;
df00412606a00714a6e85383fa87fbdc7cc1fb5bTimo Sirainen const char *index_prefix;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen enum mailbox_flags flags;
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen unsigned int transaction_count;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen enum mailbox_feature enabled_features;
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen /* Mailbox notification settings: */
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen unsigned int notify_min_interval;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen mailbox_notify_callback_t *notify_callback;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen void *notify_context;
f81f4bc282cd1944cec187bae89c0701a416ed2aTimo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen /* Saved search results */
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen ARRAY_DEFINE(search_results, struct mail_search_result *);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ARRAY_DEFINE(module_contexts, union mailbox_module_context *);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen /* When FAST open flag is used, the mailbox isn't actually opened until
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen it's synced for the first time. */
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen unsigned int opened:1;
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen /* Mailbox was deleted while we had it open. */
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainen unsigned int mailbox_deleted:1;
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen /* Mailbox is being deleted */
3f91e60401495a4046c73992fabaa5e77200a451Timo Sirainen unsigned int deleting:1;
6b0d8106ae51ffc6ce45636b34d2e21cbefca7fdTimo Sirainen /* Mailbox was already marked as deleted within this allocation. */
6b0d8106ae51ffc6ce45636b34d2e21cbefca7fdTimo Sirainen unsigned int marked_deleted:1;
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen /* TRUE if this is an INBOX for this user */
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen unsigned int inbox_user:1;
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen /* TRUE if this is an INBOX for this namespace (user or shared) */
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainen unsigned int inbox_any:1;
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen /* When copying to this mailbox, require that mailbox_copy() uses
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen mailbox_save_*() to actually save a new physical copy rather than
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen simply incrementing a reference count (e.g. via hard link) */
7f735cb86b2d8abd8f230089065eacfc24e9e5d6Timo Sirainen unsigned int disable_reflink_copy_to:1;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail_vfuncs {
0d86aa0d47f7393c669c084b34c0537b193688adTimo Sirainen void (*close)(struct mail *mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen void (*free)(struct mail *mail);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen void (*set_seq)(struct mail *mail, uint32_t seq);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen bool (*set_uid)(struct mail *mail, uint32_t uid);
aa247243412a49f9bdebf7255e131dc6ece4ed46Timo Sirainen void (*set_uid_cache_updates)(struct mail *mail, bool set);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mail_flags (*get_flags)(struct mail *mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen const char *const *(*get_keywords)(struct mail *mail);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen const ARRAY_TYPE(keyword_indexes) *
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen (*get_keyword_indexes)(struct mail *mail);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen uint64_t (*get_modseq)(struct mail *mail);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_parts)(struct mail *mail,
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainen struct message_part **parts_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_date)(struct mail *mail, time_t *date_r, int *timezone_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_received_date)(struct mail *mail, time_t *date_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_save_date)(struct mail *mail, time_t *date_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_virtual_size)(struct mail *mail, uoff_t *size_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_physical_size)(struct mail *mail, uoff_t *size_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_first_header)(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen bool decode_to_utf8, const char **value_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_headers)(struct mail *mail, const char *field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen bool decode_to_utf8, const char *const **value_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_header_stream)(struct mail *mail,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct mailbox_header_lookup_ctx *headers,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct istream **stream_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_stream)(struct mail *mail, struct message_size *hdr_size,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct message_size *body_size,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct istream **stream_r);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int (*get_special)(struct mail *mail, enum mail_fetch_field field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r);
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen struct mail *(*get_real_mail)(struct mail *mail);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen void (*update_flags)(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen enum mail_flags flags);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen void (*update_keywords)(struct mail *mail, enum modify_type modify_type,
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen struct mail_keywords *keywords);
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen void (*update_modseq)(struct mail *mail, uint64_t min_modseq);
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen void (*update_pop3_uidl)(struct mail *mail, const char *uidl);
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen void (*expunge)(struct mail *mail);
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen void (*set_cache_corrupted)(struct mail *mail,
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen enum mail_fetch_field field);
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen int (*istream_opened)(struct mail *mail, struct istream **input);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenunion mail_module_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_vfuncs super;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_module_register *reg;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstruct mail_private {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail mail;
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen struct mail_vfuncs v, *vlast;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen enum mail_fetch_field wanted_fields;
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers;
310767ca33e7636d40ec45dee68a2c319a5fa3c0Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen pool_t pool;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_module_context *);
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* these statistics are never reset by mail-storage API: */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen
1eb17e61d3d38372674aa0c55caedb0185a985f5Timo Sirainen unsigned long stats_open_lookup_count;
1eb17e61d3d38372674aa0c55caedb0185a985f5Timo Sirainen unsigned long stats_stat_lookup_count;
1eb17e61d3d38372674aa0c55caedb0185a985f5Timo Sirainen unsigned long stats_fstat_lookup_count;
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* number of files we've opened and read */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen unsigned long stats_files_read_count;
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* number of bytes we've had to read from files */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen unsigned long long stats_files_read_bytes;
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* number of cache lookup hits */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen unsigned long stats_cache_hit_count;
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen /* Set to TRUE to update stats_* fields */
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen unsigned int stats_track:1;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mailbox_list_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage *storage;
e4c90f0b88e40a8f92b8f5e1f1a3ea701e5c965cTimo Sirainen enum mailbox_list_flags flags;
defb12ecd360df672ffb2f4dbf4d1218a0a9549cTimo Sirainen bool failed;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenunion mailbox_transaction_module_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_storage_module_register *reg;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mailbox_transaction_context {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox *box;
194603b35061fea1ee8d171a7104b6985c610966Timo Sirainen enum mailbox_transaction_flags flags;
194603b35061fea1ee8d171a7104b6985c610966Timo Sirainen
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen union mail_index_transaction_module_context module_ctx;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen struct mail_index_transaction_vfuncs super;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen int mail_ref_count;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen struct mail_index_transaction *itrans;
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen /* view contains all changes done within this transaction */
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen struct mail_index_view *view;
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen struct mail_cache_view *cache_view;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen struct mail_cache_transaction_ctx *cache_trans;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen
96308127e006bb3b1108093bcf4cc1fd9481cb7aTimo Sirainen struct mail_transaction_commit_changes *changes;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ARRAY_DEFINE(module_contexts,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen union mailbox_transaction_module_context *);
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainen struct mail_save_context *save_ctx;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenunion mail_search_module_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_storage_module_register *reg;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_search_context {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_transaction_context *transaction;
e63bdfedcf61e1a9ee21990140cbd0d0638da7e1Timo Sirainen
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen struct mail_search_args *args;
e63bdfedcf61e1a9ee21990140cbd0d0638da7e1Timo Sirainen struct mail_search_sort_program *sort_program;
e63bdfedcf61e1a9ee21990140cbd0d0638da7e1Timo Sirainen
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen /* if non-NULL, specifies that a search resulting is being updated.
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen this can be used as a search optimization: if searched message
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen already exists in search result, it's not necessary to check if
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen static data matches. */
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen struct mail_search_result *update_result;
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen /* add matches to these search results */
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen ARRAY_DEFINE(results, struct mail_search_result *);
3dd0679b6f24be0287cc42d7a60bbf59cdf8b637Timo Sirainen
a3ee5ce6ecc8e228ee69300fdd562d7ac8be89a7Timo Sirainen uint32_t seq;
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen uint32_t progress_cur, progress_max;
f4616f1875297fb2f583d913c0f01b075bdecd5bTimo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_search_module_context *);
4321f6c969e7b8f6b243ff5bb6b8d297921676f6Timo Sirainen
4321f6c969e7b8f6b243ff5bb6b8d297921676f6Timo Sirainen unsigned int seen_lost_data:1;
d54ab8987e482a8df250615b44f41fa040c38741Timo Sirainen unsigned int progress_hidden:1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainenstruct mail_save_context {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mailbox_transaction_context *transaction;
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen struct mail *dest_mail;
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen enum mail_flags flags;
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen struct mail_keywords *keywords;
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen uint64_t min_modseq;
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen
0cce885512b836ce021260a58e7b4f099b36d0f1Timo Sirainen time_t received_date, save_date;
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen int received_tz_offset;
e3aeeb634245e80d4f643f8d2eea11d6b72336d8Timo Sirainen
0cce885512b836ce021260a58e7b4f099b36d0f1Timo Sirainen uint32_t uid;
0cce885512b836ce021260a58e7b4f099b36d0f1Timo Sirainen char *guid, *pop3_uidl, *from_envelope;
e050e5c9b1688765f1fdfce9b7141f7b614383fdTimo Sirainen struct ostream *output;
4d527c363482be2b65dd0573d878ecda86cbb0bbTimo Sirainen
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct mail_save_attachment *attach;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen
b62140c5849297a800fee942026d9c3cb8c60206Timo Sirainen /* returns TRUE if message part is an attachment. */
b62140c5849297a800fee942026d9c3cb8c60206Timo Sirainen bool (*part_is_attachment)(struct mail_save_context *ctx,
b62140c5849297a800fee942026d9c3cb8c60206Timo Sirainen const struct mail_attachment_part *part);
b62140c5849297a800fee942026d9c3cb8c60206Timo Sirainen
4d527c363482be2b65dd0573d878ecda86cbb0bbTimo Sirainen /* we came here from mailbox_copy() */
4d527c363482be2b65dd0573d878ecda86cbb0bbTimo Sirainen unsigned int copying:1;
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen};
a423d985ba7261661475811c22b21b80ec765a71Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainenstruct mailbox_sync_context {
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen struct mailbox *box;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen};
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstruct mailbox_header_lookup_ctx {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct mailbox *box;
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen pool_t pool;
de58be41126e5d68008d2ea706d62ccdc1f29337Timo Sirainen int refcount;
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen unsigned int count;
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen const char *const *name;
a4f09749814b93e8ad3ec8a0dc18885b874d6f8cTimo Sirainen unsigned int *idx;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen};
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen/* Modules should use do "my_id = mail_storage_module_id++" and
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen use objects' module_contexts[id] for their own purposes. */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenextern struct mail_storage_module_register mail_storage_module_register;
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen/* Storage's module_id for mail_index. */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenextern struct mail_module_register mail_module_register;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#define MAIL_STORAGE_CONTEXT(obj) \
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen MODULE_CONTEXT(obj, mail_storage_mail_index_module)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenextern MODULE_CONTEXT_DEFINE(mail_storage_mail_index_module,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen &mail_index_module_register);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenvoid mail_storage_obj_ref(struct mail_storage *storage);
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenvoid mail_storage_obj_unref(struct mail_storage *storage);
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Set error message in storage. Critical errors are logged with i_error(),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen but user sees only "internal error" message. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_clear_error(struct mail_storage *storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_set_error(struct mail_storage *storage,
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen enum mail_error error, const char *string);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_set_critical(struct mail_storage *storage,
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen const char *fmt, ...) ATTR_FORMAT(2, 3);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_storage_set_internal_error(struct mail_storage *storage);
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainenvoid mail_storage_set_index_error(struct mailbox *box);
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainenbool mail_storage_set_error_from_errno(struct mail_storage *storage);
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainenvoid mail_storage_copy_list_error(struct mail_storage *storage,
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen struct mailbox_list *list);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainenint mail_set_aborted(struct mail *mail);
910fa4e4204a73d3d24c03f3059dd24e727ca057Timo Sirainenvoid mail_set_expunged(struct mail *mail);
4bbd396aa6198c84f3f7763b6e8a63a26e97e141Timo Sirainenvoid mailbox_set_deleted(struct mailbox *box);
b83deefd2cf1e293373673eefb4d5cf60907978cTimo Sirainenint mailbox_mark_index_deleted(struct mailbox *box, bool del);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen/* Easy wrapper for getting mailbox's MAILBOX_LIST_PATH_TYPE_MAILBOX */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenconst char *mailbox_get_path(struct mailbox *box) ATTR_PURE;
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen/* Get mailbox permissions. */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenconst struct mailbox_permissions *mailbox_get_permissions(struct mailbox *box);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen/* Force permissions to be refreshed on next lookup */
3c493c276f599d9b9cd10764876d648003046954Timo Sirainenvoid mailbox_refresh_permissions(struct mailbox *box);
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen/* Returns -1 if error, 0 if failed with EEXIST, 1 if ok */
3c493c276f599d9b9cd10764876d648003046954Timo Sirainenint mailbox_create_fd(struct mailbox *box, const char *path, int flags,
3c493c276f599d9b9cd10764876d648003046954Timo Sirainen int *fd_r);
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainenunsigned int mail_storage_get_lock_timeout(struct mail_storage *storage,
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen unsigned int secs);
b3b4f3875850099c9292ad74d08bb385c3988f8fTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#endif