mail-storage-private.h revision 15b9759df8e4f6fb00c115353827a2aebbebfebc
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch#ifndef __MAIL_STORAGE_PRIVATE_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define __MAIL_STORAGE_PRIVATE_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen#include "mail-storage.h"
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen/* Some error strings that should be used everywhere to avoid
5ca745ae8e9903ef5265360e4c882e9314595020Timo Sirainen permissions checks from revealing mailbox's existence */
0536ccb51d41e3078c3a9fa33e509fb4b2420f95Timo Sirainen#define MAIL_STORAGE_ERR_MAILBOX_NOT_FOUND "Mailbox doesn't exist: %s"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define MAIL_STORAGE_ERR_NO_PERMISSION "Permission denied"
c2cda8cd0043443566efc5da30f79865508a1947Timo Sirainen
c2cda8cd0043443566efc5da30f79865508a1947Timo Sirainen/* Called after mailbox has been opened */
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainenextern void (*hook_mailbox_opened)(struct mailbox *box);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainenstruct mail_storage_vfuncs {
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*class_init)(void);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*class_deinit)(void);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen struct mail_storage *
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen (*create)(const char *data, const char *user,
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen enum mail_storage_flags flags,
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen enum mail_storage_lock_method lock_method);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*destroy)(struct mail_storage *storage);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen bool (*autodetect)(const char *data, enum mail_storage_flags flags);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*set_callbacks)(struct mail_storage *storage,
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen struct mail_storage_callbacks *callbacks,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen void *context);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *(*get_mailbox_path)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *name, bool *is_file_r);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *(*get_mailbox_control_dir)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *name);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen struct mailbox *(*mailbox_open)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *name,
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen struct istream *input,
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen enum mailbox_open_flags flags);
d6684856fb99e51bc22a6346e08b2d81c996f963Josef 'Jeff' Sipek
d6684856fb99e51bc22a6346e08b2d81c996f963Josef 'Jeff' Sipek int (*mailbox_create)(struct mail_storage *storage, const char *name,
d6684856fb99e51bc22a6346e08b2d81c996f963Josef 'Jeff' Sipek bool directory);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen int (*mailbox_delete)(struct mail_storage *storage, const char *name);
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen int (*mailbox_rename)(struct mail_storage *storage, const char *oldname,
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen const char *newname);
cd56a23e21f1df3f79648cf07e2f4385e2fadebbTimo Sirainen
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mailbox_list_context *
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (*mailbox_list_init)(struct mail_storage *storage,
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen const char *ref, const char *mask,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mailbox_list_flags flags);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_list *
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen (*mailbox_list_next)(struct mailbox_list_context *ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*mailbox_list_deinit)(struct mailbox_list_context *ctx);
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek int (*set_subscribed)(struct mail_storage *storage,
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek const char *name, bool set);
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek int (*get_mailbox_name_status)(struct mail_storage *storage,
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek const char *name,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen enum mailbox_name_status *status);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *(*get_last_error)(struct mail_storage *storage,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen bool *syntax_error_r,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen bool *temporary_error_r);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen};
5a1b498b646b5c5dbd1b3f3861df766f560578c5Timo Sirainen
204ee6ed414f5e4eeb6f6c10763b55daf56f11acJosef 'Jeff' Sipekstruct mail_storage {
5a1b498b646b5c5dbd1b3f3861df766f560578c5Timo Sirainen char *name;
5a1b498b646b5c5dbd1b3f3861df766f560578c5Timo Sirainen char hierarchy_sep;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_vfuncs v;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen/* private: */
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen pool_t pool;
5ac0b0bf32898c63da086ae169674ecac151a31eTimo Sirainen
5ac0b0bf32898c63da086ae169674ecac151a31eTimo Sirainen char *error;
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen enum mail_storage_flags flags;
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen enum mail_storage_lock_method lock_method;
5ac0b0bf32898c63da086ae169674ecac151a31eTimo Sirainen
5ac0b0bf32898c63da086ae169674ecac151a31eTimo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen ARRAY_DEFINE(module_contexts, void);
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen
c28f6aa0b70af4811c9ace9114fe827c2f503455Timo Sirainen /* IMAP: Give a BAD reply instead of NO */
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen unsigned int syntax_error:1;
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen /* Internal temporary error, as opposed to visible user errors like
c28f6aa0b70af4811c9ace9114fe827c2f503455Timo Sirainen "permission denied" or "out of disk space" */
c28f6aa0b70af4811c9ace9114fe827c2f503455Timo Sirainen unsigned int temporary_error:1;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainenstruct mailbox_vfuncs {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool (*is_readonly)(struct mailbox *box);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*close)(struct mailbox *box);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*get_status)(struct mailbox *box, enum mailbox_status_items items,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen struct mailbox_status *status);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
46ce4d9273e6df12ef1912bbdb1c8b84b104f394Timo Sirainen struct mailbox_sync_context *
46ce4d9273e6df12ef1912bbdb1c8b84b104f394Timo Sirainen (*sync_init)(struct mailbox *box,
46ce4d9273e6df12ef1912bbdb1c8b84b104f394Timo Sirainen enum mailbox_sync_flags flags);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*sync_next)(struct mailbox_sync_context *ctx,
46ce4d9273e6df12ef1912bbdb1c8b84b104f394Timo Sirainen struct mailbox_sync_rec *sync_rec_r);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen struct mailbox_status *status_r);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen void (*notify_changes)(struct mailbox *box, unsigned int min_interval,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen mailbox_notify_callback_t *callback,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen void *context);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen struct mailbox_transaction_context *
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen (*transaction_begin)(struct mailbox *box,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen enum mailbox_transaction_flags flags);
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen enum mailbox_sync_flags flags);
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen struct mail_keywords *
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen (*keywords_create)(struct mailbox_transaction_context *t,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *const keywords[]);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen void (*keywords_free)(struct mailbox_transaction_context *t,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_keywords *keywords);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen int (*get_uids)(struct mailbox *box, uint32_t uid1, uint32_t uid2,
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen uint32_t *seq1_r, uint32_t *seq2_r);
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen struct mail *
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen enum mail_fetch_field wanted_fields,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_header_lookup_ctx *
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (*header_lookup_init)(struct mailbox *box,
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen const char *const headers[]);
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen void (*header_lookup_deinit)(struct mailbox_header_lookup_ctx *ctx);
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen struct mail_search_context *
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen (*search_init)(struct mailbox_transaction_context *t,
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen const char *charset, struct mail_search_arg *args,
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen const enum mail_sort_type *sort_program);
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen int (*search_deinit)(struct mail_search_context *ctx);
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen int (*search_next)(struct mail_search_context *ctx, struct mail *mail);
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen /* Internal search function which updates ctx->seq */
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen int (*search_next_update_seq)(struct mail_search_context *ctx);
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen int (*save_init)(struct mailbox_transaction_context *t,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen enum mail_flags flags,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen struct mail_keywords *keywords,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen time_t received_date, int timezone_offset,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen const char *from_envelope, struct istream *input,
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen struct mail *dest_mail,
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen struct mail_save_context **ctx_r);
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen int (*save_continue)(struct mail_save_context *ctx);
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen int (*save_finish)(struct mail_save_context *ctx);
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen void (*save_cancel)(struct mail_save_context *ctx);
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen int (*copy)(struct mailbox_transaction_context *t, struct mail *mail,
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen enum mail_flags flags, struct mail_keywords *keywords,
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen struct mail *dest_mail);
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen bool (*is_inconsistent)(struct mailbox *box);
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen};
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainenstruct mailbox {
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen char *name;
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen struct mail_storage *storage;
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen struct mailbox_vfuncs v;
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen/* private: */
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen pool_t pool;
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen ARRAY_DEFINE(module_contexts, void);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen};
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainenstruct mail_vfuncs {
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen void (*free)(struct mail *mail);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen int (*set_seq)(struct mail *mail, uint32_t seq);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen int (*set_uid)(struct mail *mail, uint32_t uid);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen enum mail_flags (*get_flags)(struct mail *mail);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen const char *const *(*get_keywords)(struct mail *mail);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen const struct message_part *(*get_parts)(struct mail *mail);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen time_t (*get_date)(struct mail *mail, int *timezone);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen time_t (*get_received_date)(struct mail *mail);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen time_t (*get_save_date)(struct mail *mail);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen uoff_t (*get_virtual_size)(struct mail *mail);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen uoff_t (*get_physical_size)(struct mail *mail);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen const char *(*get_first_header)(struct mail *mail, const char *field);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen const char *const *(*get_headers)(struct mail *mail, const char *field);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct istream *
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen (*get_header_stream)(struct mail *mail,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox_header_lookup_ctx *headers);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct istream *(*get_stream)(struct mail *mail,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct message_size *hdr_size,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct message_size *body_size);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen const char *(*get_special)(struct mail *mail,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen enum mail_fetch_field field);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen int (*update_flags)(struct mail *mail, enum modify_type modify_type,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen enum mail_flags flags);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen int (*update_keywords)(struct mail *mail, enum modify_type modify_type,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mail_keywords *keywords);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen int (*expunge)(struct mail *mail);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen};
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainenstruct mail_private {
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mail mail;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mail_vfuncs v;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen pool_t pool;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen ARRAY_DEFINE(module_contexts, void);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen};
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainenstruct mailbox_list_context {
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mail_storage *storage;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen enum mailbox_list_flags flags;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen bool failed;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen};
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainenstruct mailbox_transaction_context {
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox *box;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen ARRAY_DEFINE(module_contexts, void);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen};
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainenstruct mail_search_context {
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox_transaction_context *transaction;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen uint32_t seq;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen};
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainenstruct mail_save_context {
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox_transaction_context *transaction;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct mail *dest_mail;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen
0892446b45c195461bb7be6599f02d97e1e2c9b2Timo Sirainenstruct mailbox_sync_context {
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen struct mailbox *box;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
a2738cdb6d2733fb3e186331d68009421a19ea00Timo Sirainen
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainenstruct mailbox_header_lookup_ctx {
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen struct mailbox *box;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen/* Modules should use do "my_id = mail_storage_module_id++" and
9e095dd6a77097356aca8216356d4d71ef1bea45Timo Sirainen use objects' module_contexts[id] for their own purposes. */
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainenextern unsigned int mail_storage_module_id;
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen/* Storage's module_id for mail_index. */
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainenextern unsigned int mail_storage_mail_index_module_id;
0892446b45c195461bb7be6599f02d97e1e2c9b2Timo Sirainen
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen#define MAIL_STORAGE_INDEX(index) \
7af4788b402346c94496095dd819f95ce03fe431Timo Sirainen *((void **)array_idx_modifiable( \
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen &(index)->mail_index_module_contexts, \
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen mail_storage_mail_index_module_id))
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen#define MAIL_STORAGE_VIEW(view) \
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen *((void **)array_idx_modifiable( \
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen &(view)->mail_index_view_module_contexts, \
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen mail_storage_mail_index_module_id))
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen#define MAIL_STORAGE_TRANSACTION(trans) \
d66ef20c30fee728899ee168c75fcc5ff8fbdac1Timo Sirainen *((void **)array_idx_modifiable( \
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen &(trans)->mail_index_transaction_module_contexts, \
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen mail_storage_mail_index_module_id))
c24ef531ca58abad996482f5c2e8992be9ae8981Timo Sirainen
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen/* Set error message in storage. Critical errors are logged with i_error(),
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen but user sees only "internal error" message. */
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainenvoid mail_storage_clear_error(struct mail_storage *storage);
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainenvoid mail_storage_set_error(struct mail_storage *storage,
0a0cd45a633112a2ae6aad801c1e6afe53ab95deTimo Sirainen const char *fmt, ...) __attr_format__(2, 3);
e4c81823af1fc43ca3f2ce9eb4af7fc8f57b13a5Timo Sirainenvoid mail_storage_set_syntax_error(struct mail_storage *storage,
e4c81823af1fc43ca3f2ce9eb4af7fc8f57b13a5Timo Sirainen const char *fmt, ...) __attr_format__(2, 3);
2524ef7b34965a1b1895d6140fd8296bf57c78d2Timo Sirainenvoid mail_storage_set_critical(struct mail_storage *storage,
0892446b45c195461bb7be6599f02d97e1e2c9b2Timo Sirainen const char *fmt, ...) __attr_format__(2, 3);
e4c81823af1fc43ca3f2ce9eb4af7fc8f57b13a5Timo Sirainenvoid mail_storage_set_internal_error(struct mail_storage *storage);
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainenconst char *mail_storage_class_get_last_error(struct mail_storage *storage,
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainen bool *syntax_error_r);
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainenbool mailbox_name_is_too_large(const char *name, char sep);
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainen
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainen#endif
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainen