changeset 12655:28f43332ba12

lib-storage: Changed mailbox_list.subscriptions_refresh() API to be more flexible. The new API makes it easier implement subscriptions=no to a backend that doesn't use the regular subscriptions file.
author Timo Sirainen <tss@iki.fi>
date Sat, 12 Feb 2011 00:48:47 +0200
parents 87a75628c8f5
children b281619735c6
files src/lib-storage/index/imapc/imapc-list.c src/lib-storage/index/shared/shared-list.c src/lib-storage/list/mailbox-list-none.c src/lib-storage/list/mailbox-list-subscriptions.c src/lib-storage/list/mailbox-list-subscriptions.h src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c
diffstat 7 files changed, 51 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-list.c	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-list.c	Sat Feb 12 00:48:47 2011 +0200
@@ -297,7 +297,8 @@
 }
 
 static int
-imapc_list_subscriptions_refresh(struct mailbox_list *_list ATTR_UNUSED)
+imapc_list_subscriptions_refresh(struct mailbox_list *_src_list ATTR_UNUSED,
+				 struct mailbox_list *_dest_list ATTR_UNUSED)
 {
 	return 0;
 }
--- a/src/lib-storage/index/shared/shared-list.c	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/index/shared/shared-list.c	Sat Feb 12 00:48:47 2011 +0200
@@ -211,7 +211,8 @@
 }
 
 static int
-shared_list_subscriptions_refresh(struct mailbox_list *list ATTR_UNUSED)
+shared_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
+				  struct mailbox_list *dest_list ATTR_UNUSED)
 {
 	return 0;
 }
--- a/src/lib-storage/list/mailbox-list-none.c	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-none.c	Sat Feb 12 00:48:47 2011 +0200
@@ -72,7 +72,8 @@
 }
 
 static int
-none_list_subscriptions_refresh(struct mailbox_list *list ATTR_UNUSED)
+none_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
+				struct mailbox_list *dest_list ATTR_UNUSED)
 {
 	return 0;
 }
--- a/src/lib-storage/list/mailbox-list-subscriptions.c	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-subscriptions.c	Sat Feb 12 00:48:47 2011 +0200
@@ -87,55 +87,48 @@
 	return 0;
 }
 
-int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
+int mailbox_list_subscriptions_refresh(struct mailbox_list *src_list,
+				       struct mailbox_list *dest_list)
 {
-	struct mail_namespace *ns = list->ns;
 	struct subsfile_list_context *subsfile_ctx;
 	struct stat st;
 	const char *path, *name;
 	char sep;
 
-	if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
-		/* no subscriptions in this namespace. find where they are. */
-		ns = mail_namespace_find_subscribable(ns->user->namespaces,
-						      ns->prefix);
-		if (ns == NULL) {
-			/* no subscriptions */
-			return 0;
-		}
+	i_assert((src_list->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0);
+
+	if (dest_list->subscriptions == NULL) {
+		sep = mail_namespace_get_sep(src_list->ns);
+		dest_list->subscriptions = mailbox_tree_init(sep);
 	}
-
-	if (list->subscriptions == NULL) {
-		sep = mail_namespace_get_sep(ns);
-		list->subscriptions = mailbox_tree_init(sep);
-	}
-	path = t_strconcat(ns->list->set.control_dir != NULL ?
-			   ns->list->set.control_dir : ns->list->set.root_dir,
-			   "/", ns->list->set.subscription_fname, NULL);
+	path = t_strconcat(src_list->set.control_dir != NULL ?
+			   src_list->set.control_dir : src_list->set.root_dir,
+			   "/", src_list->set.subscription_fname, NULL);
 	if (stat(path, &st) < 0) {
 		if (errno == ENOENT) {
 			/* no subscriptions */
-			mailbox_tree_clear(list->subscriptions);
-			list->subscriptions_mtime = 0;
+			mailbox_tree_clear(dest_list->subscriptions);
+			dest_list->subscriptions_mtime = 0;
 			return 0;
 		}
-		mailbox_list_set_critical(list, "stat(%s) failed: %m", path);
+		mailbox_list_set_critical(dest_list, "stat(%s) failed: %m",
+					  path);
 		return -1;
 	}
-	if (st.st_mtime == list->subscriptions_mtime &&
-	    st.st_mtime < list->subscriptions_read_time-1) {
+	if (st.st_mtime == dest_list->subscriptions_mtime &&
+	    st.st_mtime < dest_list->subscriptions_read_time-1) {
 		/* we're up to date */
 		return 0;
 	}
 
-	mailbox_tree_clear(list->subscriptions);
-	list->subscriptions_read_time = ioloop_time;
+	mailbox_tree_clear(dest_list->subscriptions);
+	dest_list->subscriptions_read_time = ioloop_time;
 
-	subsfile_ctx = subsfile_list_init(list, path);
+	subsfile_ctx = subsfile_list_init(dest_list, path);
 	if (subsfile_list_fstat(subsfile_ctx, &st) == 0)
-		list->subscriptions_mtime = st.st_mtime;
+		dest_list->subscriptions_mtime = st.st_mtime;
 	while ((name = subsfile_list_next(subsfile_ctx)) != NULL) T_BEGIN {
-		if (mailbox_list_subscription_fill_one(list, name) < 0) {
+		if (mailbox_list_subscription_fill_one(dest_list, name) < 0) {
 			i_warning("Subscriptions file %s: "
 				  "Ignoring invalid entry: %s",
 				  path, name);
@@ -143,7 +136,7 @@
 	} T_END;
 
 	if (subsfile_list_deinit(&subsfile_ctx) < 0) {
-		list->subscriptions_mtime = (time_t)-1;
+		dest_list->subscriptions_mtime = (time_t)-1;
 		return -1;
 	}
 	return 0;
--- a/src/lib-storage/list/mailbox-list-subscriptions.h	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-subscriptions.h	Sat Feb 12 00:48:47 2011 +0200
@@ -6,7 +6,8 @@
 struct mailbox_tree_context;
 struct mailbox_list_iterate_context;
 
-int mailbox_list_subscriptions_refresh(struct mailbox_list *list);
+int mailbox_list_subscriptions_refresh(struct mailbox_list *src_list,
+				       struct mailbox_list *dest_list);
 
 /* Set MAILBOX_SUBSCRIBED and MAILBOX_CHILD_SUBSCRIBED flags,
    clearing them if they already are there when they shouldn't. */
--- a/src/lib-storage/mailbox-list-private.h	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/mailbox-list-private.h	Sat Feb 12 00:48:47 2011 +0200
@@ -72,7 +72,10 @@
 	   If it does, mailbox deletion assumes it can safely delete it. */
 	bool (*is_internal_name)(struct mailbox_list *list, const char *name);
 
-	int (*subscriptions_refresh)(struct mailbox_list *list);
+	/* Read subscriptions from src_list, but place them into
+	   dest_list->subscriptions. Set errors to dest_list. */
+	int (*subscriptions_refresh)(struct mailbox_list *src_list,
+				     struct mailbox_list *dest_list);
 	int (*set_subscribed)(struct mailbox_list *list,
 			      const char *name, bool set);
 	int (*create_mailbox_dir)(struct mailbox_list *list, const char *name,
--- a/src/lib-storage/mailbox-list.c	Sat Feb 12 00:38:09 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Sat Feb 12 00:48:47 2011 +0200
@@ -867,6 +867,22 @@
 	return mailbox_list_iter_init_multiple(list, patterns, flags);
 }
 
+static int mailbox_list_subscriptions_refresh(struct mailbox_list *list)
+{
+	struct mail_namespace *ns = list->ns;
+
+	if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
+		/* no subscriptions in this namespace. find where they are. */
+		ns = mail_namespace_find_subscribable(ns->user->namespaces,
+						      ns->prefix);
+		if (ns == NULL) {
+			/* no subscriptions */
+			return 0;
+		}
+	}
+	return ns->list->v.subscriptions_refresh(ns->list, list);
+}
+
 struct mailbox_list_iterate_context *
 mailbox_list_iter_init_multiple(struct mailbox_list *list,
 				const char *const *patterns,
@@ -879,7 +895,7 @@
 
 	if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
 		      MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0)
-		ret = list->v.subscriptions_refresh(list);
+		ret = mailbox_list_subscriptions_refresh(list);
 
 	ctx = list->v.iter_init(list, patterns, flags);
 	if (ret < 0)