if ((ctx->list_flags & MAILBOX_LIST_ITER_RETURN_CHILDREN) == 0)
flags &= ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN);
- if ((ctx->list_flags & MAILBOX_LIST_ITER_RETURN_SUBSCRIBED) == 0)
- flags &= ~MAILBOX_SUBSCRIBED;
-
if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 &&
(flags & MAILBOX_SUBSCRIBED) == 0 && !ctx->used_listext) {
/* LSUB uses \Noselect for this */
flags |= MAILBOX_NOSELECT;
- }
+ } else if ((ctx->list_flags & MAILBOX_LIST_ITER_RETURN_SUBSCRIBED) == 0)
+ flags &= ~MAILBOX_SUBSCRIBED;
imap_mailbox_flags2str(str, flags);
if ((ctx->list_flags & MAILBOX_LIST_ITER_RETURN_SPECIALUSE) != 0 &&
if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 &&
(ctx->list_flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0)
str_append(str, " (CHILDINFO (\"SUBSCRIBED\"))");
+ if ((flags & MAILBOX_CHILD_SPECIALUSE) != 0 &&
+ (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0)
+ str_append(str, " (CHILDINFO (\"SPECIAL-USE\"))");
}
static bool
#include "imap-match.h"
#include "mail-storage.h"
#include "mailbox-tree.h"
+#include "mailbox-list-subscriptions.h"
#include "mailbox-list-private.h"
enum autocreate_match_result {
return mailbox_list_iter_init_multiple(list, patterns, flags);
}
-static int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
+static int mailbox_list_iter_subscriptions_refresh(struct mailbox_list *list)
{
struct mail_namespace *ns = list->ns;
if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0)
- ret = mailbox_list_subscriptions_refresh(list);
+ ret = mailbox_list_iter_subscriptions_refresh(list);
ctx = list->v.iter_init(list, patterns, flags);
if (ret < 0)
return ret;
}
+static bool
+mailbox_ns_prefix_check_selection_criteria(struct ns_list_iterate_context *ctx)
+{
+ if ((ctx->ctx.flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
+ if ((ctx->ns_info.flags & MAILBOX_SUBSCRIBED) != 0)
+ return TRUE;
+ if ((ctx->ctx.flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0 &&
+ (ctx->ns_info.flags & MAILBOX_CHILD_SUBSCRIBED) != 0)
+ return TRUE;
+ return FALSE;
+ }
+ return TRUE;
+}
+
static bool
mailbox_list_ns_prefix_return(struct ns_list_iterate_context *ctx,
struct mail_namespace *ns, bool has_children)
{
+ struct mail_namespace *subs_ns;
struct mailbox *box;
enum mailbox_existence existence;
int ret;
ctx->ns_info.flags |= ctx->inbox_info.flags | MAILBOX_SELECT;
}
+ if ((ctx->ctx.flags & (MAILBOX_LIST_ITER_RETURN_SUBSCRIBED |
+ MAILBOX_LIST_ITER_SELECT_SUBSCRIBED)) != 0) {
+ subs_ns = mail_namespace_find_subscribable(ctx->namespaces,
+ ns->prefix);
+ if (subs_ns != NULL) {
+ mailbox_list_set_subscription_flags(subs_ns->list,
+ ctx->ns_info.vname,
+ &ctx->ns_info.flags);
+ }
+ }
+ if (!mailbox_ns_prefix_check_selection_criteria(ctx))
+ return FALSE;
+
/* see if the namespace has children */
if (has_children)
ctx->ns_info.flags |= MAILBOX_CHILDREN;
p = strrchr(actx->new_info.vname, sep);
i_assert(p != NULL);
actx->new_info.vname =
- t_strdup_until(actx->new_info.vname, p);
+ p_strdup_until(ctx->pool,
+ actx->new_info.vname, p);
match = imap_match(ctx->glob, actx->new_info.vname);
} while (match != IMAP_MATCH_YES);
return TRUE;