changeset 12661:59748a023cc4

lib-storage: When listing subscriptions, make sure children flags are returned if requested.
author Timo Sirainen <tss@iki.fi>
date Sat, 12 Feb 2011 05:32:25 +0200
parents 43edb481978f
children 0393b95d3289
files src/lib-storage/list/mailbox-list-subscriptions.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h
diffstat 3 files changed, 34 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-subscriptions.c	Sat Feb 12 05:31:32 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-subscriptions.c	Sat Feb 12 05:32:25 2011 +0200
@@ -208,21 +208,6 @@
 	return &ctx->ctx;
 }
 
-static void
-path_split(const char *path, const char **dir_r, const char **fname_r)
-{
-	const char *p;
-
-	p = strrchr(path, '/');
-	if (p == NULL) {
-		*dir_r = "";
-		*fname_r = path;
-	} else {
-		*dir_r = t_strdup_until(path, p);
-		*fname_r = p + 1;
-	}
-}
-
 const struct mailbox_info *
 mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *_ctx)
 {
@@ -231,8 +216,8 @@
 	struct mailbox_list *list = _ctx->list;
 	struct mailbox_node *node;
 	enum mailbox_info_flags subs_flags;
-	const char *path, *vname, *dir, *fname, *storage_name;
-	struct stat st;
+	const char *vname, *storage_name;
+	int ret;
 
 	node = mailbox_tree_iterate_next(ctx->iter, &vname);
 	if (node == NULL)
@@ -253,14 +238,21 @@
 	if (!mailbox_list_is_valid_pattern(list, storage_name)) {
 		/* broken entry in subscriptions file */
 		ctx->info.flags = MAILBOX_NONEXISTENT;
-	} else {
-		path = mailbox_list_get_path(list, storage_name,
-					     MAILBOX_LIST_PATH_TYPE_DIR);
-		path_split(path, &dir, &fname);
-		if (list->v.get_mailbox_flags(list, dir, fname,
-					      MAILBOX_LIST_FILE_TYPE_UNKNOWN,
-					      &st, &ctx->info.flags) < 0)
+	} else if (mailbox_list_mailbox(list, storage_name,
+					&ctx->info.flags) < 0) {
+		ctx->info.flags = 0;
+		_ctx->failed = TRUE;
+	} else if ((_ctx->flags & MAILBOX_LIST_ITER_RETURN_CHILDREN) != 0 &&
+		   (ctx->info.flags & (MAILBOX_CHILDREN |
+				       MAILBOX_NOCHILDREN)) == 0) {
+		ret = mailbox_has_children(list, storage_name);
+		if (ret < 0)
 			_ctx->failed = TRUE;
+		else if (ret == 0)
+			ctx->info.flags |= MAILBOX_NOCHILDREN;
+		else
+			ctx->info.flags |= MAILBOX_CHILDREN;
+
 	}
 
 	ctx->info.flags &= ~(MAILBOX_SUBSCRIBED | MAILBOX_CHILD_SUBSCRIBED);
--- a/src/lib-storage/mailbox-list.c	Sat Feb 12 05:31:32 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Sat Feb 12 05:32:25 2011 +0200
@@ -1159,6 +1159,22 @@
 	return ctx->list->v.iter_deinit(ctx);
 }
 
+int mailbox_has_children(struct mailbox_list *list, const char *name)
+{
+	struct mailbox_list_iterate_context *iter;
+	const char *pattern;
+	int ret;
+
+	pattern = t_strdup_printf("%s%c%%", name,
+				  mail_namespace_get_sep(list->ns));
+	iter = mailbox_list_iter_init(list, pattern,
+				      MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
+	ret = mailbox_list_iter_next(iter) != NULL ? 1 : 0;
+	if (mailbox_list_iter_deinit(&iter) < 0)
+		ret = -1;
+	return ret;
+}
+
 int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
 			 enum mailbox_info_flags *flags_r)
 {
--- a/src/lib-storage/mailbox-list.h	Sat Feb 12 05:31:32 2011 +0200
+++ b/src/lib-storage/mailbox-list.h	Sat Feb 12 05:32:25 2011 +0200
@@ -243,6 +243,8 @@
    -1 if error. */
 int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
 			 enum mailbox_info_flags *flags_r);
+/* Returns 1 if mailbox has children, 0 if not, -1 if error. */
+int mailbox_has_children(struct mailbox_list *list, const char *name);
 
 /* Subscribe/unsubscribe mailbox. There should be no error when
    subscribing to already subscribed mailbox. Subscribing to