mail-storage-private.h revision 15b9759df8e4f6fb00c115353827a2aebbebfebc
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/* Called after mailbox has been opened */
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainenextern void (*hook_mailbox_opened)(struct mailbox *box);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*class_init)(void);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*destroy)(struct mail_storage *storage);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen bool (*autodetect)(const char *data, enum mail_storage_flags flags);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen void (*set_callbacks)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *(*get_mailbox_path)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *(*get_mailbox_control_dir)(struct mail_storage *storage,
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen const char *name);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen struct mailbox *(*mailbox_open)(struct mail_storage *storage,
d6684856fb99e51bc22a6346e08b2d81c996f963Josef 'Jeff' Sipek int (*mailbox_create)(struct mail_storage *storage, const char *name,
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);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (*mailbox_list_init)(struct mail_storage *storage,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen (*mailbox_list_next)(struct mailbox_list_context *ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen int (*mailbox_list_deinit)(struct mailbox_list_context *ctx);
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek int (*set_subscribed)(struct mail_storage *storage,
b3fc5293379feb3640b23622bcc8f5f8d7f1e81dJosef 'Jeff' Sipek int (*get_mailbox_name_status)(struct mail_storage *storage,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *(*get_last_error)(struct mail_storage *storage,
1a0ece3e873e3864269ed7eaed957dc10c56d25fTimo Sirainen/* private: */
5ac0b0bf32898c63da086ae169674ecac151a31eTimo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
c28f6aa0b70af4811c9ace9114fe827c2f503455Timo Sirainen /* IMAP: Give a BAD reply instead of NO */
eb98a038ca8b0ef33d1d11794803ce09547496faTimo Sirainen /* Internal temporary error, as opposed to visible user errors like
c28f6aa0b70af4811c9ace9114fe827c2f503455Timo Sirainen "permission denied" or "out of disk space" */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool (*allow_new_keywords)(struct mailbox *box);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*get_status)(struct mailbox *box, enum mailbox_status_items items,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*sync_next)(struct mailbox_sync_context *ctx,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen int (*sync_deinit)(struct mailbox_sync_context *ctx,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen void (*notify_changes)(struct mailbox *box, unsigned int min_interval,
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen int (*transaction_commit)(struct mailbox_transaction_context *t,
5af5137f6dc0c9f358b7813e941e26f7bd735b3aTimo Sirainen void (*transaction_rollback)(struct mailbox_transaction_context *t);
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,
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen int (*get_uids)(struct mailbox *box, uint32_t uid1, uint32_t uid2,
7662010b03ffe5f2a6ecf4b4eb220d1c65efea76Timo Sirainen (*mail_alloc)(struct mailbox_transaction_context *t,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers);
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen const char *const headers[]);
0a49b316fc729e5d57268ffa63c7122ac73f994cTimo Sirainen void (*header_lookup_deinit)(struct mailbox_header_lookup_ctx *ctx);
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen (*search_init)(struct mailbox_transaction_context *t,
71aed7ba87b5fd5e96e97a22d89ac025b883d60aTimo Sirainen const char *charset, struct mail_search_arg *args,
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);
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen int (*save_init)(struct mailbox_transaction_context *t,
51e1a1c280ccb461a15827f7987d09cb9708b6e3Timo Sirainen const char *from_envelope, struct istream *input,
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);
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen int (*copy)(struct mailbox_transaction_context *t, struct mail *mail,
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen enum mail_flags flags, struct mail_keywords *keywords,
0b6924ad1943fe5c6917fc49f675d8f316b0d939Timo Sirainen/* private: */
463f6ea04af934a68facaca0ff089bc306de3f98Timo Sirainen /* Module-specific contexts. See mail_storage_module_id. */
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen int (*set_seq)(struct mail *mail, uint32_t seq);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainen int (*set_uid)(struct mail *mail, uint32_t uid);
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);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen time_t (*get_date)(struct mail *mail, int *timezone);
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen time_t (*get_received_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 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 *(*get_stream)(struct mail *mail,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen int (*update_flags)(struct mail *mail, enum modify_type modify_type,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen int (*update_keywords)(struct mail *mail, enum modify_type modify_type,
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox_transaction_context *transaction;
82ea464c113f43aaa2b2e23de334cf3081c332beTimo Sirainen struct mailbox_transaction_context *transaction;
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/* Storage's module_id for mail_index. */
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainenextern unsigned int mail_storage_mail_index_module_id;
c09f9f95db314e7482c95e502e1c56ed6c555797Timo Sirainen &(trans)->mail_index_transaction_module_contexts, \
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,
e4c81823af1fc43ca3f2ce9eb4af7fc8f57b13a5Timo Sirainenvoid mail_storage_set_syntax_error(struct mail_storage *storage,
2524ef7b34965a1b1895d6140fd8296bf57c78d2Timo Sirainenvoid mail_storage_set_critical(struct mail_storage *storage,
e4c81823af1fc43ca3f2ce9eb4af7fc8f57b13a5Timo Sirainenvoid mail_storage_set_internal_error(struct mail_storage *storage);
4334b9b032298defd4d3906f5357698ff016ead0Timo Sirainenconst char *mail_storage_class_get_last_error(struct mail_storage *storage,
fb502495e9306fe51e9d2c0019e622a98e9803abTimo Sirainenbool mailbox_name_is_too_large(const char *name, char sep);