mail-storage-private.h revision d3280fe317a4598c0868cc440e7a1191c06d0db3
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen#ifndef MAIL_STORAGE_PRIVATE_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define MAIL_STORAGE_PRIVATE_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen#include "module-context.h"
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen#include "file-lock.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "mail-storage.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "mail-storage-hooks.h"
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen#include "mail-storage-settings.h"
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen#include "mail-index-private.h"
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen/* Block size when read()ing message header. */
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#define MAIL_READ_HDR_BLOCK_SIZE (1024*4)
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen/* Block size when read()ing message (header and) body. */
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen#define MAIL_READ_FULL_BLOCK_SIZE IO_BLOCK_SIZE
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstruct mail_storage_module_register {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int id;
daf029d2a627daa39d05507140f385162828172eTimo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_module_register {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen unsigned int id;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstruct mail_storage_vfuncs {
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const struct setting_parser_info *(*get_setting_parser_info)(void);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mail_storage *(*alloc)(void);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen int (*create)(struct mail_storage *storage, struct mail_namespace *ns,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen const char **error_r);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen void (*destroy)(struct mail_storage *storage);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*add_list)(struct mail_storage *storage,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_list *list);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*get_list_settings)(const struct mail_namespace *ns,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mailbox_list_settings *set);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool (*autodetect)(const struct mail_namespace *ns,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_list_settings *set);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox *(*mailbox_alloc)(struct mail_storage *storage,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mailbox_list *list,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *name,
daf029d2a627daa39d05507140f385162828172eTimo Sirainen enum mailbox_flags flags);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*purge)(struct mail_storage *storage);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenunion mail_storage_module_context {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_vfuncs super;
daf029d2a627daa39d05507140f385162828172eTimo Sirainen struct mail_storage_module_register *reg;
daf029d2a627daa39d05507140f385162828172eTimo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mail_storage_class_flags {
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen /* mailboxes are files, not directories */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAIL_STORAGE_CLASS_FLAG_MAILBOX_IS_FILE = 0x01,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen /* root_dir points to a unique directory */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT = 0x02,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* mailbox_open_stream() is supported */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAIL_STORAGE_CLASS_FLAG_OPEN_STREAMS = 0x04,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* never use quota for this storage (e.g. virtual mailboxes) */
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen MAIL_STORAGE_CLASS_FLAG_NOQUOTA = 0x08
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_storage {
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen const char *name;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mail_storage_class_flags class_flags;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_vfuncs v, *vlast;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen/* private: */
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen pool_t pool;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_storage *prev, *next;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* counting number of times mail_storage_create() has returned this
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen same storage. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int refcount;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* counting number of objects (e.g. mailbox) that have a pointer
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen to this storage. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen int obj_refcount;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *unique_root_dir;
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen char *error_string;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mail_error error;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct mail_storage *storage_class;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_user *user;
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen const char *temp_path_prefix;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const struct mail_storage_settings *set;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen enum mail_storage_flags flags;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_storage_callbacks callbacks;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void *callback_context;
35df1dd606c5ef21068ab4fe4be305859d4fad4bTimo Sirainen
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen ARRAY_DEFINE(module_contexts, union mail_storage_module_context *);
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen};
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_attachment_part {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct message_part *part;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *content_type, *content_disposition;
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen};
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainenstruct mailbox_vfuncs {
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen bool (*is_readonly)(struct mailbox *box);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen int (*enable)(struct mailbox *box, enum mailbox_feature features);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen int (*open)(struct mailbox *box);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen void (*close)(struct mailbox *box);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen void (*free)(struct mailbox *box);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen int (*create)(struct mailbox *box, const struct mailbox_update *update,
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen bool directory);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*update)(struct mailbox *box, const struct mailbox_update *update);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*delete)(struct mailbox *box);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen int (*rename)(struct mailbox *src, struct mailbox *dest,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen bool rename_children);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen int (*get_status)(struct mailbox *box, enum mailbox_status_items items,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct mailbox_status *status_r);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen int (*get_guid)(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* Lookup sync extension record and figure out if it mailbox has
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen changed since. Returns 1 = yes, 0 = no, -1 = error. */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen int (*list_index_has_changed)(struct mailbox *box,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct mail_index_view *list_view,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen uint32_t seq);
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen /* Update the sync extension record. Returns 0 = ok, -1 = error. */
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen int (*list_index_update_sync)(struct mailbox *box,
548e394330621952db0f03dd667b70184c4a37b6Timo Sirainen struct mail_index_transaction *trans,
7d207b1e77a7b5e3fda640e353acfc86d261fedfTimo Sirainen uint32_t seq);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox_sync_context *
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen (*sync_init)(struct mailbox *box,
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen enum mailbox_sync_flags flags);
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen bool (*sync_next)(struct mailbox_sync_context *ctx,
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen struct mailbox_sync_rec *sync_rec_r);
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen struct mailbox_sync_status *status_r);
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen /* Called once for each expunge. Called one or more times for
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen flag/keyword changes. Once the sync is finished, called with
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen uid=0 and sync_type=0. */
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen void (*sync_notify)(struct mailbox *box, uint32_t uid,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen enum mailbox_sync_type sync_type);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen void (*notify_changes)(struct mailbox *box);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mailbox_transaction_context *
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen (*transaction_begin)(struct mailbox *box,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen enum mailbox_transaction_flags flags);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail_transaction_commit_changes *changes_r);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen enum mail_flags (*get_private_flags_mask)(struct mailbox *box);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail *
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen enum mail_fetch_field wanted_fields,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail_search_context *
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen (*search_init)(struct mailbox_transaction_context *t,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail_search_args *args,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const enum mail_sort_type *sort_program);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen int (*search_deinit)(struct mail_search_context *ctx);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen bool (*search_next_nonblock)(struct mail_search_context *ctx,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail *mail, bool *tryagain_r);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen /* Internal search function which updates ctx->seq */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen bool (*search_next_update_seq)(struct mail_search_context *ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail_save_context *
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (*save_alloc)(struct mailbox_transaction_context *t);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*save_begin)(struct mail_save_context *ctx, struct istream *input);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*save_continue)(struct mail_save_context *ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*save_finish)(struct mail_save_context *ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen void (*save_cancel)(struct mail_save_context *ctx);
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen int (*copy)(struct mail_save_context *ctx, struct mail *mail);
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool (*is_inconsistent)(struct mailbox *box);
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenunion mailbox_module_context {
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen struct mailbox_vfuncs super;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_module_register *reg;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
5254d77805cd35b9356d072ba325c356c43b0d51Timo Sirainenstruct mailbox_permissions {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* mode and GID to use for newly created files/dirs */
3e25b17126e9536736d5da03697613e4c3af5f76Timo Sirainen mode_t file_create_mode, dir_create_mode;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen gid_t file_create_gid;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* origin (e.g. path) where the file_create_gid was got from */
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *file_create_gid_origin;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool mail_index_permissions_set;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *name;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* mailbox's virtual name (from mail_namespace_get_vname()) */
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen const char *vname;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_storage *storage;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mailbox_list *list;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mailbox_vfuncs v, *vlast;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen/* private: */
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen pool_t pool;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen /* these won't be set until mailbox is opened: */
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_index *index;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_index_view *view;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_cache *cache;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen /* Filled lazily by mailbox_get_permissions() */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen struct mailbox_permissions _perm;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Filled lazily by mailbox_get_path() */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen const char *_path;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* default vfuncs for new struct mails. */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen const struct mail_vfuncs *mail_vfuncs;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct istream *input;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *index_prefix;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen enum mailbox_flags flags;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int transaction_count;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mailbox_feature enabled_features;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen /* Mailbox notification settings: */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen unsigned int notify_min_interval;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mailbox_notify_callback_t *notify_callback;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen void *notify_context;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Saved search results */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen ARRAY_DEFINE(search_results, struct mail_search_result *);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ARRAY_DEFINE(module_contexts, union mailbox_module_context *);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* When FAST open flag is used, the mailbox isn't actually opened until
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen it's synced for the first time. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int opened:1;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen /* Mailbox was deleted while we had it open. */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen unsigned int mailbox_deleted:1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Mailbox is being deleted */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int deleting:1;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* Mailbox was already marked as deleted within this allocation. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int marked_deleted:1;
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen /* TRUE if this is an INBOX for this user */
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen unsigned int inbox_user:1;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen /* TRUE if this is an INBOX for this namespace (user or shared) */
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen unsigned int inbox_any:1;
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen /* When copying to this mailbox, require that mailbox_copy() uses
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mailbox_save_*() to actually save a new physical copy rather than
f4bbeadda12fbd7c219063db68f3e78646d83c2cTimo Sirainen simply incrementing a reference count (e.g. via hard link) */
0b47e9f5e0181053b4d9ca7b426b0e5c185e820eTimo Sirainen unsigned int disable_reflink_copy_to:1;
0b47e9f5e0181053b4d9ca7b426b0e5c185e820eTimo Sirainen};
abe8754852e70763e92f74caabbcc13d0917714cTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_vfuncs {
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen void (*close)(struct mail *mail);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen void (*free)(struct mail *mail);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen void (*set_seq)(struct mail *mail, uint32_t seq);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen bool (*set_uid)(struct mail *mail, uint32_t uid);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen void (*set_uid_cache_updates)(struct mail *mail, bool set);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen enum mail_flags (*get_flags)(struct mail *mail);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen const char *const *(*get_keywords)(struct mail *mail);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen const ARRAY_TYPE(keyword_indexes) *
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (*get_keyword_indexes)(struct mail *mail);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen uint64_t (*get_modseq)(struct mail *mail);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_parts)(struct mail *mail,
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen struct message_part **parts_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_date)(struct mail *mail, time_t *date_r, int *timezone_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_received_date)(struct mail *mail, time_t *date_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_save_date)(struct mail *mail, time_t *date_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_virtual_size)(struct mail *mail, uoff_t *size_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen int (*get_physical_size)(struct mail *mail, uoff_t *size_r);
904f9d5654b9c39edcdf32883e5e88771faf4d69Timo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*get_first_header)(struct mail *mail, const char *field,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen bool decode_to_utf8, const char **value_r);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*get_headers)(struct mail *mail, const char *field,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen bool decode_to_utf8, const char *const **value_r);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*get_header_stream)(struct mail *mail,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mailbox_header_lookup_ctx *headers,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct istream **stream_r);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*get_stream)(struct mail *mail, struct message_size *hdr_size,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct message_size *body_size,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct istream **stream_r);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*get_special)(struct mail *mail, enum mail_fetch_field field,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen const char **value_r);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail *(*get_real_mail)(struct mail *mail);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*update_flags)(struct mail *mail, enum modify_type modify_type,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen enum mail_flags flags);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*update_keywords)(struct mail *mail, enum modify_type modify_type,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail_keywords *keywords);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*update_modseq)(struct mail *mail, uint64_t min_modseq);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*update_pop3_uidl)(struct mail *mail, const char *uidl);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*expunge)(struct mail *mail);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen void (*set_cache_corrupted)(struct mail *mail,
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen enum mail_fetch_field field);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen int (*istream_opened)(struct mail *mail, struct istream **input);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen};
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainenunion mail_module_context {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail_vfuncs super;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail_module_register *reg;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen};
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainenstruct mail_private {
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail mail;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen struct mail_vfuncs v, *vlast;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen enum mail_fetch_field wanted_fields;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen pool_t pool;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_module_context *);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* these statistics are never reset by mail-storage API: */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen unsigned long stats_open_lookup_count;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen unsigned long stats_stat_lookup_count;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen unsigned long stats_fstat_lookup_count;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen /* number of files we've opened and read */
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen unsigned long stats_files_read_count;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* number of bytes we've had to read from files */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen unsigned long long stats_files_read_bytes;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* number of cache lookup hits */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen unsigned long stats_cache_hit_count;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* Set to TRUE to update stats_* fields */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int stats_track:1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mailbox_list_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_storage *storage;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen enum mailbox_list_flags flags;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen bool failed;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenunion mailbox_transaction_module_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_storage_module_register *reg;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mailbox_transaction_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox *box;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen enum mailbox_transaction_flags flags;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen union mail_index_transaction_module_context module_ctx;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_index_transaction_vfuncs super;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen int mail_ref_count;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_index_transaction *itrans;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* view contains all changes done within this transaction */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_index_view *view;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_cache_view *cache_view;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_cache_transaction_ctx *cache_trans;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_transaction_commit_changes *changes;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen ARRAY_DEFINE(module_contexts,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen union mailbox_transaction_module_context *);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_save_context *save_ctx;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenunion mail_search_module_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_storage_module_register *reg;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mail_search_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox_transaction_context *transaction;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_search_args *args;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_search_sort_program *sort_program;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* if non-NULL, specifies that a search resulting is being updated.
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen this can be used as a search optimization: if searched message
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen already exists in search result, it's not necessary to check if
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen static data matches. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_search_result *update_result;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* add matches to these search results */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen ARRAY_DEFINE(results, struct mail_search_result *);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen uint32_t seq;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen uint32_t progress_cur, progress_max;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen ARRAY_DEFINE(module_contexts, union mail_search_module_context *);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int seen_lost_data:1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int progress_hidden:1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mail_save_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox_transaction_context *transaction;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail *dest_mail;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen enum mail_flags flags;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_keywords *keywords;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen uint64_t min_modseq;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen time_t received_date, save_date;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen int received_tz_offset;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen uint32_t uid;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen char *guid, *pop3_uidl, *from_envelope;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct ostream *output;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mail_save_attachment *attach;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* returns TRUE if message part is an attachment. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen bool (*part_is_attachment)(struct mail_save_context *ctx,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct mail_attachment_part *part);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* we came here from mailbox_copy() */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int copying:1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mailbox_sync_context {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox *box;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstruct mailbox_header_lookup_ctx {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct mailbox *box;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen pool_t pool;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen int refcount;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int count;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const char *const *name;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int *idx;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen};
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen/* Modules should use do "my_id = mail_storage_module_id++" and
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen use objects' module_contexts[id] for their own purposes. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenextern struct mail_storage_module_register mail_storage_module_register;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen/* Storage's module_id for mail_index. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenextern struct mail_module_register mail_module_register;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen#define MAIL_STORAGE_CONTEXT(obj) \
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen MODULE_CONTEXT(obj, mail_storage_mail_index_module)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenextern MODULE_CONTEXT_DEFINE(mail_storage_mail_index_module,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen &mail_index_module_register);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid mail_storage_obj_ref(struct mail_storage *storage);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid mail_storage_obj_unref(struct mail_storage *storage);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen/* Set error message in storage. Critical errors are logged with i_error(),
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen but user sees only "internal error" message. */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid mail_storage_clear_error(struct mail_storage *storage);
void mail_storage_set_error(struct mail_storage *storage,
enum mail_error error, const char *string);
void mail_storage_set_critical(struct mail_storage *storage,
const char *fmt, ...) ATTR_FORMAT(2, 3);
void mail_storage_set_internal_error(struct mail_storage *storage);
void mail_storage_set_index_error(struct mailbox *box);
bool mail_storage_set_error_from_errno(struct mail_storage *storage);
void mail_storage_copy_list_error(struct mail_storage *storage,
struct mailbox_list *list);
int mail_set_aborted(struct mail *mail);
void mail_set_expunged(struct mail *mail);
void mailbox_set_deleted(struct mailbox *box);
int mailbox_mark_index_deleted(struct mailbox *box, bool del);
/* Easy wrapper for getting mailbox's MAILBOX_LIST_PATH_TYPE_MAILBOX */
const char *mailbox_get_path(struct mailbox *box) ATTR_PURE;
/* Get mailbox permissions. */
const struct mailbox_permissions *mailbox_get_permissions(struct mailbox *box);
/* Force permissions to be refreshed on next lookup */
void mailbox_refresh_permissions(struct mailbox *box);
/* Returns -1 if error, 0 if failed with EEXIST, 1 if ok */
int mailbox_create_fd(struct mailbox *box, const char *path, int flags,
int *fd_r);
unsigned int mail_storage_get_lock_timeout(struct mail_storage *storage,
unsigned int secs);
#endif