changeset 8079:4e1b54eb7407 HEAD

Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces. struct mailbox_info now always contains the listed namespace.
author Timo Sirainen <tss@iki.fi>
date Fri, 08 Aug 2008 16:48:44 -0400
parents c8d3024015a8
children 3aec087609f0
files src/lib-storage/list/mailbox-list-maildir-iter.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h
diffstat 3 files changed, 82 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-maildir-iter.c	Fri Aug 08 16:45:23 2008 -0400
+++ b/src/lib-storage/list/mailbox-list-maildir-iter.c	Fri Aug 08 16:48:44 2008 -0400
@@ -282,6 +282,7 @@
 	ctx->ctx.flags = flags;
 	ctx->pool = pool;
 	ctx->tree_ctx = mailbox_tree_init(sep);
+	ctx->info.ns = _list->ns;
 
 	glob = imap_match_init_multiple(pool, patterns, TRUE, sep);
 
--- a/src/lib-storage/mailbox-list.c	Fri Aug 08 16:45:23 2008 -0400
+++ b/src/lib-storage/mailbox-list.c	Fri Aug 08 16:48:44 2008 -0400
@@ -27,6 +27,14 @@
 	"Internal error occurred. Refer to server log for more information."
 #define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
 
+struct ns_list_iterate_context {
+	struct mailbox_list_iterate_context ctx;
+	struct mailbox_list_iterate_context *backend_ctx;
+	struct mail_namespace *namespaces;
+	pool_t pool;
+	const char **patterns;
+};
+
 struct mailbox_list_module_register mailbox_list_module_register = { 0 };
 
 void (*hook_mailbox_list_created)(struct mailbox_list *list);
@@ -392,6 +400,71 @@
 	return list->v.iter_init(list, patterns, flags);
 }
 
+static const struct mailbox_info *
+mailbox_list_ns_iter_next(struct mailbox_list_iterate_context *_ctx)
+{
+	struct ns_list_iterate_context *ctx =
+		(struct ns_list_iterate_context *)_ctx;
+	const struct mailbox_info *info;
+
+	info = mailbox_list_iter_next(ctx->backend_ctx);
+	if (info == NULL && ctx->namespaces != NULL) {
+		/* go to the next namespace */
+		if (mailbox_list_iter_deinit(&ctx->backend_ctx) < 0)
+			_ctx->failed = TRUE;
+		ctx->backend_ctx =
+			mailbox_list_iter_init_multiple(ctx->namespaces->list,
+							ctx->patterns,
+							_ctx->flags);
+		ctx->namespaces = ctx->namespaces->next;
+		return mailbox_list_ns_iter_next(_ctx);
+	}
+	return info;
+}
+
+static int
+mailbox_list_ns_iter_deinit(struct mailbox_list_iterate_context *_ctx)
+{
+	struct ns_list_iterate_context *ctx =
+		(struct ns_list_iterate_context *)_ctx;
+	int ret;
+
+	if (mailbox_list_iter_deinit(&ctx->backend_ctx) < 0)
+		_ctx->failed = TRUE;
+	ret = _ctx->failed ? -1 : 0;
+	pool_unref(&ctx->pool);
+	return ret;
+}
+
+struct mailbox_list_iterate_context *
+mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
+				  const char *const *patterns,
+				  enum mailbox_list_iter_flags flags)
+{
+	struct ns_list_iterate_context *ctx;
+	unsigned int i, count;
+	pool_t pool;
+
+	i_assert(namespaces != NULL);
+
+	pool = pool_alloconly_create("mailbox list namespaces", 256);
+	ctx = p_new(pool, struct ns_list_iterate_context, 1);
+	ctx->pool = pool;
+	ctx->ctx.list = p_new(pool, struct mailbox_list, 1);
+	ctx->ctx.list->v.iter_next = mailbox_list_ns_iter_next;
+	ctx->ctx.list->v.iter_deinit = mailbox_list_ns_iter_deinit;
+
+	count = str_array_length(patterns);
+	ctx->patterns = p_new(pool, const char *, count + 1);
+	for (i = 0; i < count; i++)
+		ctx->patterns[i] = p_strdup(pool, patterns[i]);
+
+	ctx->backend_ctx = mailbox_list_iter_init_multiple(namespaces->list,
+							   patterns, flags);
+	ctx->namespaces = namespaces->next;
+	return &ctx->ctx;
+}
+
 const struct mailbox_info *
 mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
 {
--- a/src/lib-storage/mailbox-list.h	Fri Aug 08 16:45:23 2008 -0400
+++ b/src/lib-storage/mailbox-list.h	Fri Aug 08 16:48:44 2008 -0400
@@ -111,7 +111,8 @@
 
 struct mailbox_info {
 	const char *name;
-        enum mailbox_info_flags flags;
+	enum mailbox_info_flags flags;
+	struct mail_namespace *ns;
 };
 
 /* register all drivers */
@@ -187,6 +188,12 @@
 mailbox_list_iter_init_multiple(struct mailbox_list *list,
 				const char *const *patterns,
 				enum mailbox_list_iter_flags flags);
+/* List mailbox_list_iter_init_multiple(), but list mailboxes from all the
+   specified namespaces. */
+struct mailbox_list_iterate_context *
+mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
+				  const char *const *patterns,
+				  enum mailbox_list_iter_flags flags);
 /* Get next mailbox. Returns the mailbox name */
 const struct mailbox_info *
 mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx);