dovecot-2.1: lib-storage: Added struct mailbox.set_subscribed() ...

dovecot at dovecot.org dovecot at dovecot.org
Fri Dec 30 11:55:19 EET 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/bc9217cb0193
changeset: 13876:bc9217cb0193
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Dec 30 11:54:48 2011 +0200
description:
lib-storage: Added struct mailbox.set_subscribed() virtual method.

diffstat:

 src/lib-storage/index/cydir/cydir-storage.c       |   1 +
 src/lib-storage/index/dbox-multi/mdbox-storage.c  |   1 +
 src/lib-storage/index/dbox-single/sdbox-storage.c |   1 +
 src/lib-storage/index/imapc/imapc-storage.c       |   1 +
 src/lib-storage/index/index-storage.c             |  35 +++++++++++++++++++++++
 src/lib-storage/index/index-storage.h             |   1 +
 src/lib-storage/index/maildir/maildir-storage.c   |   1 +
 src/lib-storage/index/mbox/mbox-storage.c         |   1 +
 src/lib-storage/index/raw/raw-storage.c           |   1 +
 src/lib-storage/mail-storage-private.h            |   1 +
 src/lib-storage/mail-storage.c                    |  33 +--------------------
 src/lib-storage/test-mailbox.c                    |   9 +++++
 src/plugins/virtual/virtual-storage.c             |   1 +
 13 files changed, 56 insertions(+), 31 deletions(-)

diffs (226 lines):

diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -139,6 +139,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		NULL,
+		index_storage_set_subscribed,
 		index_storage_list_index_has_changed,
 		index_storage_list_index_update_sync,
 		cydir_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/dbox-multi/mdbox-storage.c
--- a/src/lib-storage/index/dbox-multi/mdbox-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -437,6 +437,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		mdbox_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		index_storage_list_index_has_changed,
 		index_storage_list_index_update_sync,
 		mdbox_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/dbox-single/sdbox-storage.c
--- a/src/lib-storage/index/dbox-single/sdbox-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -397,6 +397,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		sdbox_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		index_storage_list_index_has_changed,
 		index_storage_list_index_update_sync,
 		sdbox_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/imapc/imapc-storage.c
--- a/src/lib-storage/index/imapc/imapc-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -772,6 +772,7 @@
 		index_storage_mailbox_rename,
 		imapc_mailbox_get_status,
 		imapc_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		NULL,
 		NULL,
 		imapc_mailbox_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/index-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -664,3 +664,38 @@
 		}
 	} T_END;
 }
+
+int index_storage_set_subscribed(struct mailbox *box, bool set)
+{
+	struct mail_namespace *ns;
+	struct mailbox_list *list = box->list;
+	const char *subs_name;
+
+	if ((list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0)
+		subs_name = box->name;
+	else {
+		/* subscriptions=no namespace, find another one where we can
+		   add the subscription to */
+		ns = mail_namespace_find_subscribable(list->ns->user->namespaces,
+						      box->vname);
+		if (ns == NULL) {
+			mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
+				"This namespace has no subscriptions");
+			return -1;
+		}
+		/* use <orig ns prefix><orig storage name> as the
+		   subscription name */
+		subs_name = t_strconcat(list->ns->prefix, box->name, NULL);
+		/* drop the common prefix (typically there isn't one) */
+		i_assert(strncmp(ns->prefix, subs_name, strlen(ns->prefix)) == 0);
+		subs_name += strlen(ns->prefix);
+
+		list = ns->list;
+	}
+	if (mailbox_list_set_subscribed(list, subs_name, set) < 0) {
+		mail_storage_copy_list_error(box->storage, list);
+		return -1;
+	}
+	return 0;
+}
+
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/index-storage.h	Fri Dec 30 11:54:48 2011 +0200
@@ -134,6 +134,7 @@
 void index_save_context_free(struct mail_save_context *ctx);
 void index_copy_cache_fields(struct mail_save_context *ctx,
 			     struct mail *src_mail, uint32_t dest_seq);
+int index_storage_set_subscribed(struct mailbox *box, bool set);
 
 bool index_keyword_array_cmp(const ARRAY_TYPE(keyword_indexes) *k1,
 			     const ARRAY_TYPE(keyword_indexes) *k2);
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -625,6 +625,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		maildir_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		maildir_list_index_has_changed,
 		maildir_list_index_update_sync,
 		maildir_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -776,6 +776,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		mbox_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		index_storage_list_index_has_changed,
 		index_storage_list_index_update_sync,
 		mbox_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/index/raw/raw-storage.c
--- a/src/lib-storage/index/raw/raw-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/index/raw/raw-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -218,6 +218,7 @@
 		index_storage_mailbox_rename,
 		index_storage_get_status,
 		index_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		index_storage_list_index_has_changed,
 		index_storage_list_index_update_sync,
 		raw_storage_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/mail-storage-private.h	Fri Dec 30 11:54:48 2011 +0200
@@ -126,6 +126,7 @@
 	int (*get_metadata)(struct mailbox *box,
 			    enum mailbox_metadata_items items,
 			    struct mailbox_metadata *metadata_r);
+	int (*set_subscribed)(struct mailbox *box, bool set);
 
 	/* Lookup sync extension record and figure out if it mailbox has
 	   changed since. Returns 1 = yes, 0 = no, -1 = error. */
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/mail-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -1199,42 +1199,13 @@
 
 int mailbox_set_subscribed(struct mailbox *box, bool set)
 {
-	struct mail_namespace *ns;
-	struct mailbox_list *list = box->list;
-	const char *subs_name;
-
-	if (!mailbox_list_is_valid_existing_name(list, box->name)) {
+	if (!mailbox_list_is_valid_existing_name(box->list, box->name)) {
 		mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
 				       "Invalid mailbox name");
 		return -1;
 	}
 
-	if ((list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0)
-		subs_name = box->name;
-	else {
-		/* subscriptions=no namespace, find another one where we can
-		   add the subscription to */
-		ns = mail_namespace_find_subscribable(list->ns->user->namespaces,
-						      box->vname);
-		if (ns == NULL) {
-			mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
-				"This namespace has no subscriptions");
-			return -1;
-		}
-		/* use <orig ns prefix><orig storage name> as the
-		   subscription name */
-		subs_name = t_strconcat(list->ns->prefix, box->name, NULL);
-		/* drop the common prefix (typically there isn't one) */
-		i_assert(strncmp(ns->prefix, subs_name, strlen(ns->prefix)) == 0);
-		subs_name += strlen(ns->prefix);
-
-		list = ns->list;
-	}
-	if (mailbox_list_set_subscribed(list, subs_name, set) < 0) {
-		mail_storage_copy_list_error(box->storage, list);
-		return -1;
-	}
-	return 0;
+	return box->v.set_subscribed(box, set);
 }
 
 struct mail_storage *mailbox_get_storage(const struct mailbox *box)
diff -r 4c827134997f -r bc9217cb0193 src/lib-storage/test-mailbox.c
--- a/src/lib-storage/test-mailbox.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/lib-storage/test-mailbox.c	Fri Dec 30 11:54:48 2011 +0200
@@ -82,6 +82,14 @@
 	return 0;
 }
 
+static int test_mailbox_set_subscribed(struct mailbox *box,
+				       bool set ATTR_UNUSED)
+{
+	mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE,
+			       "Test mailbox subscribing isn't supported");
+	return -1;
+}
+
 static struct mailbox_sync_context *
 test_mailbox_sync_init(struct mailbox *box,
 		       enum mailbox_sync_flags flags ATTR_UNUSED)
@@ -244,6 +252,7 @@
 		test_mailbox_rename,
 		test_mailbox_get_status,
 		NULL,
+		test_mailbox_set_subscribed,
 		NULL,
 		NULL,
 		test_mailbox_sync_init,
diff -r 4c827134997f -r bc9217cb0193 src/plugins/virtual/virtual-storage.c
--- a/src/plugins/virtual/virtual-storage.c	Thu Dec 29 14:43:45 2011 +0200
+++ b/src/plugins/virtual/virtual-storage.c	Fri Dec 30 11:54:48 2011 +0200
@@ -528,6 +528,7 @@
 		index_storage_mailbox_rename,
 		virtual_storage_get_status,
 		virtual_mailbox_get_metadata,
+		index_storage_set_subscribed,
 		NULL,
 		NULL,
 		virtual_storage_sync_init,


More information about the dovecot-cvs mailing list