From: Timo Sirainen Date: Tue, 23 Jun 2009 21:32:01 +0000 (-0400) Subject: Mailbox list iteration: Added MAILBOX_LIST_ITER_SKIP_ALIASES flag. X-Git-Tag: 2.0.alpha1~534 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=547847191d4a95cd267fc846a1ca3c2111214719;p=thirdparty%2Fdovecot%2Fcore.git Mailbox list iteration: Added MAILBOX_LIST_ITER_SKIP_ALIASES flag. --HG-- branch : HEAD --- diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 594623e0d6..67561e380a 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -516,6 +516,16 @@ mailbox_list_iter_init_multiple(struct mailbox_list *list, return list->v.iter_init(list, patterns, flags); } +static struct mail_namespace * +ns_next(struct ns_list_iterate_context *ctx, struct mail_namespace *ns) +{ + if ((ctx->ctx.flags & MAILBOX_LIST_ITER_SKIP_ALIASES) != 0) { + while (ns != NULL && ns->alias_for != NULL) + ns = ns->next; + } + return ns; +} + static const struct mailbox_info * mailbox_list_ns_iter_next(struct mailbox_list_iterate_context *_ctx) { @@ -533,7 +543,7 @@ mailbox_list_ns_iter_next(struct mailbox_list_iterate_context *_ctx) mailbox_list_iter_init_multiple(ctx->namespaces->list, ctx->patterns, _ctx->flags); - ctx->namespaces = ctx->namespaces->next; + ctx->namespaces = ns_next(ctx, ctx->namespaces->next); return mailbox_list_ns_iter_next(_ctx); } return info; @@ -577,10 +587,11 @@ mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces, for (i = 0; i < count; i++) ctx->patterns[i] = p_strdup(pool, patterns[i]); + namespaces = ns_next(ctx, namespaces); ctx->ctx.list->ns = namespaces; ctx->backend_ctx = mailbox_list_iter_init_multiple(namespaces->list, patterns, flags); - ctx->namespaces = namespaces->next; + ctx->namespaces = ns_next(ctx, namespaces->next); return &ctx->ctx; } diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 2cdfc76f6e..5b2d5e85e9 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -46,6 +46,9 @@ enum mailbox_list_iter_flags { /* Use virtual mailbox names (virtual separators and namespace prefixes) for patterns and for returned mailbox names. */ MAILBOX_LIST_ITER_VIRTUAL_NAMES = 0x000002, + /* For mailbox_list_iter_init_namespaces(): Skip namespaces that + have alias_for set. */ + MAILBOX_LIST_ITER_SKIP_ALIASES = 0x000004, /* List only subscribed mailboxes */ MAILBOX_LIST_ITER_SELECT_SUBSCRIBED = 0x000010,