do {
node = mailbox_tree_iterate_next(ctx->iter, &vname);
if (node == NULL)
- return NULL;
+ return mailbox_list_iter_default_next(_ctx);
} while ((node->flags & MAILBOX_MATCHED) == 0);
if (ctx->info.ns->prefix_len > 0 &&
ret = fs_list_next(ctx);
} T_END;
- if (ret <= 0)
+ if (ret == 0)
+ return mailbox_list_iter_default_next(_ctx);
+ else if (ret < 0)
return NULL;
if (_ctx->list->ns->type == MAIL_NAMESPACE_TYPE_SHARED &&
/* no indexing */
ctx->backend_ctx = ilist->module_ctx.super.
iter_init(list, patterns, flags);
+ mailbox_list_iter_init_autocreate(ctx->backend_ctx);
} else {
/* listing mailboxes from index */
ctx->info.ns = list->ns;
}
mailbox_list_index_update_next(ctx, follow_children);
}
- return NULL;
+ return mailbox_list_iter_default_next(_ctx);
}
int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
info = &ctx->specialuse_info;
}
}
+
+ if (info != NULL && ctx->autocreate_ctx != NULL) {
+ ctx->autocreate_ctx->new_info = *info;
+ return autocreate_iter_existing(ctx);
+ }
+
return info;
}
-static const struct mailbox_info *
-autocreate_iter_next(struct mailbox_list_iterate_context *ctx)
+const struct mailbox_info *
+mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx)
{
struct mailbox_list_autocreate_iterate_context *actx =
ctx->autocreate_ctx;
- const struct mailbox_info *info;
const struct autocreate_box *autoboxes, *autobox;
unsigned int count;
- if (actx->idx == 0) {
- info = mailbox_list_iter_next_call(ctx);
- if (info != NULL) {
- actx->new_info = *info;
- return autocreate_iter_existing(ctx);
- }
- }
+ if (actx == NULL)
+ return NULL;
/* list missing mailboxes */
autoboxes = array_get(&actx->boxes, &count);
return NULL;
do {
T_BEGIN {
- if (ctx->autocreate_ctx != NULL)
- info = autocreate_iter_next(ctx);
- else
- info = mailbox_list_iter_next_call(ctx);
+ info = mailbox_list_iter_next_call(ctx);
} T_END;
} while (info != NULL && !special_use_selection(ctx, info));
return info;
node = mailbox_tree_iterate_next(ctx->tree_iter, &ctx->info.vname);
if (node == NULL)
- return NULL;
+ return mailbox_list_iter_default_next(_ctx);
ctx->info.flags = node->flags;
if ((_ctx->flags & MAILBOX_LIST_ITER_RETURN_SUBSCRIBED) != 0 &&
node = mailbox_tree_iterate_next(ctx->iter, &vname);
if (node == NULL)
- return NULL;
+ return mailbox_list_iter_default_next(_ctx);
ctx->info.vname = vname;
subs_flags = node->flags & (MAILBOX_SUBSCRIBED |
int mailbox_list_iter_subscriptions_refresh(struct mailbox_list *list);
void
mailbox_list_iter_init_autocreate(struct mailbox_list_iterate_context *ctx);
+const struct mailbox_info *
+mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx);
enum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d);
int mailbox_list_dirent_is_alias_symlink(struct mailbox_list *list,