static void imapc_mail_set_failure(struct imapc_mail *mail,
const struct imapc_command_reply *reply)
{
- struct imapc_mailbox *mbox =
- (struct imapc_mailbox *)mail->imail.mail.mail.box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(mail->imail.mail.mail.box);
mail->last_fetch_reply = p_strdup(mail->imail.mail.pool, reply->text_full);
imapc_mail_set_failure(mail, reply);
if (--mail->fetch_count == 0)
mail->fetching_fields = 0;
- mbox = (struct imapc_mailbox *)mail->imail.mail.mail.box;
+ mbox = IMAPC_MAILBOX(mail->imail.mail.mail.box);
}
i_assert(mbox != NULL);
static void
imapc_mail_delayed_send_or_merge(struct imapc_mail *mail, string_t *str)
{
- struct imapc_mailbox *mbox =
- (struct imapc_mailbox *)mail->imail.mail.mail.box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(mail->imail.mail.mail.box);
if (mbox->pending_fetch_request != NULL &&
!imapc_mail_try_merge_fetch(mbox, str)) {
const char *const *headers)
{
struct imapc_mail *mail = (struct imapc_mail *)_mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct mail_index_view *view;
string_t *str;
uint32_t seq;
static enum mail_fetch_field
imapc_mail_get_wanted_fetch_fields(struct imapc_mail *mail)
{
- struct imapc_mailbox *mbox =
- (struct imapc_mailbox *)mail->imail.mail.mail.box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(mail->imail.mail.mail.box);
struct index_mail_data *data = &mail->imail.data;
enum mail_fetch_field fields = 0;
void imapc_mail_try_init_stream_from_cache(struct imapc_mail *mail)
{
struct mail *_mail = &mail->imail.mail.mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
if (mbox->prev_mail_cache.uid == _mail->uid)
imapc_mail_cache_get(mail, &mbox->prev_mail_cache);
{
struct index_mail *imail = &mail->imail;
struct mail *_mail = &imail->mail.mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct istream *input;
uoff_t size;
int ret;
const struct imapc_untagged_reply *reply,
const struct imap_arg *args)
{
- struct imapc_mailbox *mbox =
- (struct imapc_mailbox *)mail->imail.mail.mail.box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(mail->imail.mail.mail.box);
const char *key, *value;
unsigned int i;
uoff_t size;
static bool imapc_mail_is_expunged(struct mail *_mail)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct imapc_msgmap *msgmap;
uint32_t lseq, rseq;
static int imapc_mail_failed(struct mail *mail, const char *field)
{
struct imapc_mail *imail = (struct imapc_mail *)mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(mail->box);
bool fix_broken_mail = FALSE;
if (mail->expunged || imapc_mail_is_expunged(mail)) {
static uint64_t imapc_mail_get_modseq(struct mail *_mail)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct imapc_msgmap *msgmap;
const uint64_t *modseqs;
unsigned int count;
static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct index_mail *mail = (struct index_mail *)_mail;
struct index_mail_data *data = &mail->data;
struct istream *input;
struct istream **stream_r)
{
struct imapc_mail *mail = (struct imapc_mail *)_mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
enum mail_lookup_abort old_abort = _mail->lookup_abort;
int ret;
void imapc_mail_update_access_parts(struct index_mail *mail)
{
struct mail *_mail = &mail->mail.mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct index_mail_data *data = &mail->data;
struct mailbox_header_lookup_ctx *header_ctx;
const char *str;
static void imapc_mail_close(struct mail *_mail)
{
struct imapc_mail *mail = (struct imapc_mail *)_mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct imapc_mail_cache *cache = &mbox->prev_mail_cache;
if (mail->fetch_count > 0) {
static int imapc_mail_get_guid(struct mail *_mail, const char **value_r)
{
struct index_mail *imail = (struct index_mail *)_mail;
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
const enum index_cache_field cache_idx =
imail->ibox->cache_fields[MAIL_CACHE_GUID].idx;
imapc_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
const char **value_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)_mail->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(_mail->box);
struct index_mail *imail = (struct index_mail *)_mail;
uint64_t num;
int ret;
};
+#define IMAPC_SAVECTX(s) container_of(s, struct imapc_save_context, ctx)
+
void imapc_transaction_save_rollback(struct mail_save_context *_ctx);
struct mail_save_context *
imapc_save_alloc(struct mailbox_transaction_context *t)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)t->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(t->box);
struct imapc_save_context *ctx;
i_assert((t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
int imapc_save_begin(struct mail_save_context *_ctx, struct istream *input)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
struct mail_storage *storage = _ctx->transaction->box->storage;
const char *path;
int imapc_save_continue(struct mail_save_context *_ctx)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
if (ctx->failed)
return -1;
int imapc_save_finish(struct mail_save_context *_ctx)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
struct mail_storage *storage = _ctx->transaction->box->storage;
ctx->finished = TRUE;
void imapc_save_cancel(struct mail_save_context *_ctx)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
ctx->failed = TRUE;
(void)imapc_save_finish(_ctx);
int imapc_transaction_save_commit_pre(struct mail_save_context *_ctx)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
struct mail_transaction_commit_changes *changes =
_ctx->transaction->changes;
uint32_t i, last_seq;
void imapc_transaction_save_rollback(struct mail_save_context *_ctx)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
/* FIXME: if we really want to rollback, we should expunge messages
we already saved */
int imapc_copy(struct mail_save_context *_ctx, struct mail *mail)
{
- struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx;
+ struct imapc_save_context *ctx = IMAPC_SAVECTX(_ctx);
struct mailbox_transaction_context *_t = _ctx->transaction;
- struct imapc_mailbox *src_mbox = (struct imapc_mailbox *)mail->box;
+ struct imapc_mailbox *src_mbox = IMAPC_MAILBOX(mail->box);
struct imapc_command *cmd;
struct imapc_save_cmd_context sctx;
void *context)
{
struct mail_search_context *ctx = context;
- struct imapc_mailbox *mbox =
- (struct imapc_mailbox *)ctx->transaction->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(ctx->transaction->box);
struct imapc_search_context *ictx = IMAPC_SEARCHCTX(ctx);
ictx->finished = TRUE;
enum mail_fetch_field wanted_fields,
struct mailbox_header_lookup_ctx *wanted_headers)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)t->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(t->box);
struct mail_search_context *ctx;
struct imapc_search_context *ictx;
struct imapc_command *cmd;
struct mail_namespace *ns,
const char **error_r)
{
- struct imapc_storage *storage = (struct imapc_storage *)_storage;
+ struct imapc_storage *storage = IMAPC_STORAGE(_storage);
struct imapc_mailbox_list *imapc_list = NULL;
storage->set = mail_namespace_get_driver_settings(ns, _storage);
static void imapc_storage_destroy(struct mail_storage *_storage)
{
- struct imapc_storage *storage = (struct imapc_storage *)_storage;
+ struct imapc_storage *storage = IMAPC_STORAGE(_storage);
storage->client->destroying = TRUE;
index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
- mbox->storage = (struct imapc_storage *)storage;
+ mbox->storage = IMAPC_STORAGE(storage);
p_array_init(&mbox->untagged_callbacks, pool, 16);
p_array_init(&mbox->resp_text_callbacks, pool, 16);
static int imapc_mailbox_open(struct mailbox *box)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
if (index_storage_mailbox_open(box, FALSE) < 0)
return -1;
static void imapc_mailbox_close(struct mailbox *box)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
bool changes;
(void)imapc_mailbox_commit_delayed_trans(mbox, &changes);
const struct mailbox_update *update ATTR_UNUSED,
bool directory)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
struct imapc_command *cmd;
struct imapc_simple_context sctx;
const char *name = imapc_mailbox_get_remote_name(mbox);
enum mailbox_status_items items,
struct mailbox_status *status_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
struct imapc_command *cmd;
struct imapc_simple_context sctx;
string_t *str;
enum mailbox_status_items items,
struct mailbox_status *status_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
if (mbox->guid_fetch_field_name != NULL ||
IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_GUID_FORCED))
enum mailbox_metadata_items items,
struct mailbox_metadata *metadata_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
const struct imapc_namespace *ns;
if ((items & MAILBOX_METADATA_GUID) != 0) {
static void imapc_notify_changes(struct mailbox *box)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
const struct mail_storage_settings *set = box->storage->set;
struct imapc_command *cmd;
static bool imapc_is_inconsistent(struct mailbox *box)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
if (box->view != NULL &&
mail_index_view_is_inconsistent(box->view))
int ret;
};
+#define IMAPC_STORAGE(s) container_of(s, struct imapc_storage, storage)
+#define IMAPC_MAILBOX(s) container_of(s, struct imapc_mailbox, box)
+
int imapc_storage_client_create(struct mail_namespace *ns,
const struct imapc_settings *imapc_set,
const struct mail_storage_settings *mail_set,
struct mailbox_sync_context *
imapc_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(box);
struct imapc_mailbox_list *list = mbox->storage->client->_list;
bool changes;
int ret = 0;
int imapc_mailbox_sync_deinit(struct mailbox_sync_context *ctx,
struct mailbox_sync_status *status_r)
{
- struct imapc_mailbox *mbox = (struct imapc_mailbox *)ctx->box;
+ struct imapc_mailbox *mbox = IMAPC_MAILBOX(ctx->box);
int ret;
ret = index_mailbox_sync_deinit(ctx, status_r);