enum mailbox_list_iter_flags flags)
{
struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
- struct mailbox_list_iterate_context *_ctx;
struct imapc_mailbox_list_iterate_context *ctx;
pool_t pool;
const char *ns_root_name;
list->iter_count++;
- if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
- /* we're listing only subscriptions. just use the cached
- subscriptions list. */
- _ctx = mailbox_list_subscriptions_iter_init(_list, patterns,
- flags);
- if (ret < 0)
- _ctx->failed = TRUE;
- return _ctx;
- }
-
/* if we've already failed, make sure we don't call
mailbox_list_get_hierarchy_sep(), since it clears the error */
ns_sep = ret < 0 ? '/' : mail_namespace_get_sep(_list->ns);
if (_ctx->failed)
return NULL;
- if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_next(_ctx);
-
do {
node = mailbox_tree_iterate_next(ctx->iter, &vname);
if (node == NULL)
list->refreshed_subscriptions = FALSE;
}
- if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_deinit(_ctx);
-
mailbox_tree_iterate_deinit(&ctx->iter);
mailbox_tree_deinit(&ctx->tree);
pool_unref(&_ctx->pool);
struct fs_list_iterate_context *ctx;
pool_t pool;
- if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
- /* we're listing only subscribed mailboxes. we can't optimize
- it, so just use the generic code. */
- return mailbox_list_subscriptions_iter_init(_list, patterns,
- flags);
- }
-
pool = pool_alloconly_create("mailbox list fs iter", 2048);
ctx = p_new(pool, struct fs_list_iterate_context, 1);
ctx->ctx.pool = pool;
(struct fs_list_iterate_context *)_ctx;
int ret = _ctx->failed ? -1 : 0;
- if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_deinit(_ctx);
-
while (ctx->dir != NULL) {
struct list_dir_context *dir = ctx->dir;
(struct fs_list_iterate_context *)_ctx;
int ret;
- if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_next(_ctx);
-
T_BEGIN {
ret = fs_list_next(ctx);
} T_END;
static struct mailbox_list_iterate_context *
index_list_iter_init(struct mailbox_list *list,
- const char *const *patterns,
+ const char *const *patterns ATTR_UNUSED,
enum mailbox_list_iter_flags flags)
{
struct mailbox_list_iterate_context *ctx;
- pool_t pool;
-
- if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
- return mailbox_list_subscriptions_iter_init(list, patterns,
- flags);
- }
-
- pool = pool_alloconly_create("mailbox list index backend iter", 1024);
+ pool_t pool =
+ pool_alloconly_create("mailbox list index backend iter", 1024);
ctx = p_new(pool, struct mailbox_list_iterate_context, 1);
ctx->pool = pool;
ctx->list = list;
}
static const struct mailbox_info *
-index_list_iter_next(struct mailbox_list_iterate_context *ctx)
+index_list_iter_next(struct mailbox_list_iterate_context *ctx ATTR_UNUSED)
{
- if ((ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_next(ctx);
return NULL;
}
static int index_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
{
- if ((ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
- return mailbox_list_subscriptions_iter_deinit(ctx);
pool_unref(&ctx->pool);
return 0;
}
mailbox_list_iter_update(&update_ctx, name);
mailbox_tree_iterate_deinit(&iter);
}
-
-struct mailbox_list_iterate_context *
-mailbox_list_subscriptions_iter_init(struct mailbox_list *list,
- const char *const *patterns,
- enum mailbox_list_iter_flags flags)
-{
- struct subscriptions_mailbox_list_iterate_context *ctx;
- pool_t pool;
- char sep = mail_namespace_get_sep(list->ns);
-
- pool = pool_alloconly_create("mailbox list subscriptions iter", 1024);
- ctx = p_new(pool, struct subscriptions_mailbox_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, sep);
- array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
-
- ctx->tree = mailbox_tree_init(sep);
- mailbox_list_subscriptions_fill(&ctx->ctx, ctx->tree, FALSE);
-
- ctx->info.ns = list->ns;
- /* the tree usually has only those entries we want to iterate through,
- but there are also non-matching root entries (e.g. "LSUB foo/%" will
- include the "foo"), which we'll drop with MAILBOX_MATCHED. */
- ctx->iter = mailbox_tree_iterate_init(ctx->tree, NULL, MAILBOX_MATCHED);
- return &ctx->ctx;
-}
-
-const struct mailbox_info *
-mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *_ctx)
-{
- struct subscriptions_mailbox_list_iterate_context *ctx =
- (struct subscriptions_mailbox_list_iterate_context *)_ctx;
- struct mailbox_list *list = _ctx->list;
- struct mailbox_node *node;
- enum mailbox_info_flags subs_flags;
- const char *vname, *storage_name, *error;
- int ret;
-
- node = mailbox_tree_iterate_next(ctx->iter, &vname);
- if (node == NULL)
- return mailbox_list_iter_default_next(_ctx);
-
- ctx->info.vname = vname;
- subs_flags = node->flags & (MAILBOX_SUBSCRIBED |
- MAILBOX_CHILD_SUBSCRIBED);
-
- if ((_ctx->flags & MAILBOX_LIST_ITER_RETURN_NO_FLAGS) != 0 &&
- (_ctx->flags & MAILBOX_LIST_ITER_RETURN_CHILDREN) == 0) {
- /* don't care about flags, just return it */
- ctx->info.flags = subs_flags;
- return &ctx->info;
- }
-
- storage_name = mailbox_list_get_storage_name(list, vname);
- if (!mailbox_list_is_valid_name(list, storage_name, &error)) {
- /* broken entry in subscriptions file */
- ctx->info.flags = MAILBOX_NONEXISTENT;
- } else if (mailbox_list_mailbox(list, storage_name,
- &ctx->info.flags) < 0) {
- ctx->info.flags = 0;
- _ctx->failed = TRUE;
- } else if ((_ctx->flags & MAILBOX_LIST_ITER_RETURN_CHILDREN) != 0 &&
- (ctx->info.flags & (MAILBOX_CHILDREN |
- MAILBOX_NOCHILDREN)) == 0) {
- ret = mailbox_has_children(list, storage_name);
- if (ret < 0)
- _ctx->failed = TRUE;
- else if (ret == 0)
- ctx->info.flags |= MAILBOX_NOCHILDREN;
- else
- ctx->info.flags |= MAILBOX_CHILDREN;
-
- }
-
- ctx->info.flags &= ENUM_NEGATE(MAILBOX_SUBSCRIBED | MAILBOX_CHILD_SUBSCRIBED);
- ctx->info.flags |=
- node->flags & (MAILBOX_SUBSCRIBED | MAILBOX_CHILD_SUBSCRIBED);
- return &ctx->info;
-}
-
-int mailbox_list_subscriptions_iter_deinit(struct mailbox_list_iterate_context *_ctx)
-{
- struct subscriptions_mailbox_list_iterate_context *ctx =
- (struct subscriptions_mailbox_list_iterate_context *)_ctx;
- int ret = _ctx->failed ? -1 : 0;
-
- mailbox_tree_iterate_deinit(&ctx->iter);
- mailbox_tree_deinit(&ctx->tree);
- pool_unref(&_ctx->pool);
- return ret;
-}
struct mailbox_tree_context *tree,
bool default_nonexistent);
-/* Iterate through subscriptions, call mailbox_list.get_mailbox_flags()
- if necessary for mailboxes to get their flags. */
-struct mailbox_list_iterate_context *
-mailbox_list_subscriptions_iter_init(struct mailbox_list *list,
- const char *const *patterns,
- enum mailbox_list_iter_flags flags);
-const struct mailbox_info *
-mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *ctx);
-int mailbox_list_subscriptions_iter_deinit(struct mailbox_list_iterate_context *ctx);
-
#endif