1
#ifndef IMAPC_STORAGE_H
2
#define IMAPC_STORAGE_H
4
#include "index-storage.h"
5
#include "imapc-settings.h"
7
#define IMAPC_STORAGE_NAME "imapc"
8
#define IMAPC_INDEX_PREFIX "dovecot.index"
9
#define IMAPC_LIST_ESCAPE_CHAR '%'
12
struct imapc_untagged_reply;
13
struct imapc_command_reply;
17
typedef void imapc_storage_callback_t(const struct imapc_untagged_reply *reply,
18
struct imapc_storage *storage);
19
typedef void imapc_mailbox_callback_t(const struct imapc_untagged_reply *reply,
20
struct imapc_mailbox *mbox);
22
struct imapc_storage_event_callback {
24
imapc_storage_callback_t *callback;
27
struct imapc_mailbox_event_callback {
29
imapc_mailbox_callback_t *callback;
32
#define IMAPC_HAS_FEATURE(mstorage, feature) \
33
(((mstorage)->set->parsed_features & feature) != 0)
34
#define IMAPC_BOX_HAS_FEATURE(mbox, feature) \
35
(((mbox)->storage->set->parsed_features & feature) != 0)
37
struct imapc_storage {
38
struct mail_storage storage;
39
const struct imapc_settings *set;
41
struct ioloop *root_ioloop;
42
struct imapc_mailbox_list *list;
43
struct imapc_client *client;
45
struct imapc_mailbox *cur_status_box;
46
struct mailbox_status *cur_status;
47
unsigned int reopen_count;
49
ARRAY_DEFINE(untagged_callbacks, struct imapc_storage_event_callback);
52
struct imapc_mail_cache {
55
/* either fd != -1 or buf != NULL */
60
struct imapc_mailbox {
62
struct imapc_storage *storage;
63
struct imapc_client_mailbox *client_box;
65
struct mail_index_transaction *delayed_sync_trans;
66
struct mail_index_view *sync_view, *delayed_sync_view;
67
struct timeout *to_idle_check, *to_idle_delay;
69
ARRAY_DEFINE(fetch_mails, struct imapc_mail *);
71
ARRAY_DEFINE(untagged_callbacks, struct imapc_mailbox_event_callback);
72
ARRAY_DEFINE(resp_text_callbacks, struct imapc_mailbox_event_callback);
74
enum mail_flags permanent_flags;
76
ARRAY_TYPE(uint32_t) delayed_expunged_uids;
77
uint32_t sync_uid_validity;
78
uint32_t sync_uid_next;
79
uint32_t sync_fetch_first_uid;
80
uint32_t sync_next_lseq;
81
uint32_t sync_next_rseq;
82
uint32_t exists_count;
83
uint32_t min_append_uid;
85
/* keep the previous fetched message body cached,
86
mainly for partial IMAP fetches */
87
struct imapc_mail_cache prev_mail_cache;
89
uint32_t prev_skipped_rseq, prev_skipped_uid;
90
struct imapc_sync_context *sync_ctx;
92
const char *guid_fetch_field_name;
94
unsigned int selecting:1;
95
unsigned int syncing:1;
96
unsigned int initial_sync_done:1;
99
struct imapc_simple_context {
100
struct imapc_storage *storage;
104
struct mail_save_context *
105
imapc_save_alloc(struct mailbox_transaction_context *_t);
106
int imapc_save_begin(struct mail_save_context *ctx, struct istream *input);
107
int imapc_save_continue(struct mail_save_context *ctx);
108
int imapc_save_finish(struct mail_save_context *ctx);
109
void imapc_save_cancel(struct mail_save_context *ctx);
110
int imapc_copy(struct mail_save_context *ctx, struct mail *mail);
112
int imapc_transaction_save_commit_pre(struct mail_save_context *ctx);
113
void imapc_transaction_save_commit_post(struct mail_save_context *ctx,
114
struct mail_index_transaction_commit_result *result);
115
void imapc_transaction_save_rollback(struct mail_save_context *ctx);
117
void imapc_storage_run(struct imapc_storage *storage);
118
void imapc_mail_cache_free(struct imapc_mail_cache *cache);
119
int imapc_mailbox_select(struct imapc_mailbox *mbox);
121
void imapc_copy_error_from_reply(struct imapc_storage *storage,
122
enum mail_error default_error,
123
const struct imapc_command_reply *reply);
124
void imapc_simple_context_init(struct imapc_simple_context *sctx,
125
struct imapc_storage *storage);
126
void imapc_simple_run(struct imapc_simple_context *sctx);
127
void imapc_simple_callback(const struct imapc_command_reply *reply,
129
int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
131
void imapc_mailbox_noop(struct imapc_mailbox *mbox);
132
void imapc_mailbox_set_corrupted(struct imapc_mailbox *mbox,
133
const char *reason, ...) ATTR_FORMAT(2, 3);
135
void imapc_storage_register_untagged(struct imapc_storage *storage,
137
imapc_storage_callback_t *callback);
138
void imapc_mailbox_register_untagged(struct imapc_mailbox *mbox,
140
imapc_mailbox_callback_t *callback);
141
void imapc_mailbox_register_resp_text(struct imapc_mailbox *mbox,
143
imapc_mailbox_callback_t *callback);
145
void imapc_mailbox_register_callbacks(struct imapc_mailbox *mbox);