/* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "array.h"
#include "imap-match.h"
#include "mailbox-list-private.h"
#define GLOBAL_TEMP_PREFIX ".temp."
struct noop_list_iterate_context {
struct mailbox_list_iterate_context ctx;
struct mailbox_info inbox_info;
bool list_inbox:1;
};
extern struct mailbox_list none_mailbox_list;
static struct mailbox_list *none_list_alloc(void)
{
struct mailbox_list *list;
pool_t pool;
pool = pool_alloconly_create("none list", 2048);
list = p_new(pool, struct mailbox_list, 1);
*list = none_mailbox_list;
list->props = MAILBOX_LIST_PROP_NO_LIST_INDEX;
list->pool = pool;
return list;
}
static void none_list_deinit(struct mailbox_list *list)
{
pool_unref(&list->pool);
}
static char none_list_get_hierarchy_sep(struct mailbox_list *list ATTR_UNUSED)
{
return '/';
}
static int
none_list_get_path(struct mailbox_list *list ATTR_UNUSED,
const char *name ATTR_UNUSED,
enum mailbox_list_path_type type ATTR_UNUSED,
const char **path_r ATTR_UNUSED)
{
return 0;
}
static const char *
none_list_get_temp_prefix(struct mailbox_list *list ATTR_UNUSED,
bool global ATTR_UNUSED)
{
return GLOBAL_TEMP_PREFIX;
}
static int
none_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
struct mailbox_list *dest_list ATTR_UNUSED)
{
return 0;
}
static int none_list_set_subscribed(struct mailbox_list *list,
const char *name ATTR_UNUSED,
bool set ATTR_UNUSED)
{
mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
return -1;
}
static int none_list_delete_mailbox(struct mailbox_list *list,
const char *name ATTR_UNUSED)
{
mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
return -1;
}
static int none_list_delete_dir(struct mailbox_list *list,
const char *name ATTR_UNUSED)
{
mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
return -1;
}
static int
none_list_rename_mailbox(struct mailbox_list *oldlist,
const char *oldname ATTR_UNUSED,
struct mailbox_list *newlist ATTR_UNUSED,
const char *newname ATTR_UNUSED)
{
mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE,
"Not supported");
return -1;
}
static struct mailbox_list_iterate_context *
none_list_iter_init(struct mailbox_list *list,
const char *const *patterns,
enum mailbox_list_iter_flags flags)
{
struct noop_list_iterate_context *ctx;
pool_t pool;
pool = pool_alloconly_create("mailbox list none iter", 1024);
ctx = p_new(pool, struct noop_list_iterate_context, 1);
ctx->ctx.pool = pool;
ctx->ctx.list = list;
ctx->ctx.flags = flags;
ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE,
mail_namespace_get_sep(list->ns));
array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
if ((list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 &&
imap_match(ctx->ctx.glob, "INBOX") == IMAP_MATCH_YES) {
ctx->list_inbox = TRUE;
ctx->inbox_info.ns = list->ns;
ctx->inbox_info.vname = "INBOX";
}
return &ctx->ctx;
}
static int
none_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
{
pool_unref(&ctx->pool);
return 0;
}
static const struct mailbox_info *
none_list_iter_next(struct mailbox_list_iterate_context *_ctx)
{
struct noop_list_iterate_context *ctx =
(struct noop_list_iterate_context *)_ctx;
if (ctx->list_inbox) {
ctx->list_inbox = FALSE;
return &ctx->inbox_info;
}
return NULL;
}
static int
none_list_get_mailbox_flags(struct mailbox_list *list ATTR_UNUSED,
const char *dir ATTR_UNUSED,
const char *fname ATTR_UNUSED,
enum mailbox_list_file_type type ATTR_UNUSED,
enum mailbox_info_flags *flags)
{
*flags = MAILBOX_NONEXISTENT;
return 0;
}
struct mailbox_list none_mailbox_list = {
.name = MAILBOX_LIST_NAME_NONE,
.props = MAILBOX_LIST_PROP_NO_ROOT,
.mailbox_name_max_length = MAILBOX_LIST_NAME_MAX_LENGTH,
.v = {
.alloc = none_list_alloc,
.deinit = none_list_deinit,
.get_hierarchy_sep = none_list_get_hierarchy_sep,
.get_vname = mailbox_list_default_get_vname,
.get_storage_name = mailbox_list_default_get_storage_name,
.get_path = none_list_get_path,
.get_temp_prefix = none_list_get_temp_prefix,
.iter_init = none_list_iter_init,
.iter_next = none_list_iter_next,
.iter_deinit = none_list_iter_deinit,
.get_mailbox_flags = none_list_get_mailbox_flags,
.subscriptions_refresh = none_list_subscriptions_refresh,
.set_subscribed = none_list_set_subscribed,
.delete_mailbox = none_list_delete_mailbox,
.delete_dir = none_list_delete_dir,
.delete_symlink = none_list_delete_dir,
.rename_mailbox = none_list_rename_mailbox,
}
};