changeset 12785:395af848ec10

lib-storage: Allow creating a secondary mailbox_list for a namespace.
author Timo Sirainen <tss@iki.fi>
date Thu, 10 Mar 2011 18:31:28 +0200
parents 5086e1504e28
children 934c529052eb
files src/lib-storage/mail-storage.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h
diffstat 3 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage.c	Thu Mar 10 18:29:59 2011 +0200
+++ b/src/lib-storage/mail-storage.c	Thu Mar 10 18:31:28 2011 +0200
@@ -280,6 +280,7 @@
 			enum mail_storage_flags flags, const char **error_r)
 {
 	struct mail_storage *storage_class, *storage = NULL;
+	struct mailbox_list *list;
 	struct mailbox_list_settings list_set;
 	enum mailbox_list_flags list_flags = 0;
 	const char *data = ns->set->location;
@@ -326,7 +327,7 @@
 		if (mail_storage_is_mailbox_file(storage_class))
 			list_flags |= MAILBOX_LIST_FLAG_MAILBOX_FILES;
 		if (mailbox_list_create(list_set.layout, ns, &list_set,
-					list_flags, error_r) < 0) {
+					list_flags, &list, error_r) < 0) {
 			*error_r = t_strdup_printf("Mailbox list driver %s: %s",
 						   list_set.layout, *error_r);
 			return -1;
--- a/src/lib-storage/mailbox-list.c	Thu Mar 10 18:29:59 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Thu Mar 10 18:31:28 2011 +0200
@@ -111,13 +111,15 @@
 
 int mailbox_list_create(const char *driver, struct mail_namespace *ns,
 			const struct mailbox_list_settings *set,
-			enum mailbox_list_flags flags, const char **error_r)
+			enum mailbox_list_flags flags,
+			struct mailbox_list **list_r, const char **error_r)
 {
 	const struct mailbox_list *const *class_p;
 	struct mailbox_list *list;
 	unsigned int idx;
 
-	i_assert(ns->list == NULL);
+	i_assert(ns->list == NULL ||
+		 (flags & MAILBOX_LIST_FLAG_SECONDARY) != 0);
 
 	i_assert(set->subscription_fname == NULL ||
 		 *set->subscription_fname != '\0');
@@ -193,7 +195,10 @@
 			list->set.inbox_path == NULL ?
 			"" : list->set.inbox_path);
 	}
-	mail_namespace_finish_list_init(ns, list);
+	if ((flags & MAILBOX_LIST_FLAG_SECONDARY) == 0)
+		mail_namespace_finish_list_init(ns, list);
+
+	*list_r = list;
 
 	hook_mailbox_list_created(list);
 	return 0;
--- a/src/lib-storage/mailbox-list.h	Thu Mar 10 18:29:59 2011 +0200
+++ b/src/lib-storage/mailbox-list.h	Thu Mar 10 18:31:28 2011 +0200
@@ -29,7 +29,10 @@
 
 enum mailbox_list_flags {
 	/* Mailboxes are files, not directories. */
-	MAILBOX_LIST_FLAG_MAILBOX_FILES		= 0x01
+	MAILBOX_LIST_FLAG_MAILBOX_FILES		= 0x01,
+	/* Namespace already has a mailbox list, don't assign this
+	   mailbox list to it. */
+	MAILBOX_LIST_FLAG_SECONDARY		= 0x02
 };
 
 enum mailbox_info_flags {
@@ -151,7 +154,8 @@
 /* Returns 0 if ok, -1 if driver was unknown. */
 int mailbox_list_create(const char *driver, struct mail_namespace *ns,
 			const struct mailbox_list_settings *set,
-			enum mailbox_list_flags flags, const char **error_r);
+			enum mailbox_list_flags flags,
+			struct mailbox_list **list_r, const char **error_r);
 void mailbox_list_destroy(struct mailbox_list **list);
 
 const char *