changeset 9409:a0fa514d92f0 HEAD

LSUB "" %: List namespace prefix if namespace has separate subscriptions.
author Timo Sirainen <tss@iki.fi>
date Mon, 05 Oct 2009 14:56:51 -0400
parents 0c7bbdd7b81f
children ae29ecea8d06
files src/imap/cmd-list.c
diffstat 1 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-list.c	Mon Oct 05 14:13:17 2009 -0400
+++ b/src/imap/cmd-list.c	Mon Oct 05 14:56:51 2009 -0400
@@ -198,12 +198,16 @@
 
 static bool list_namespace_has_children(struct cmd_list_context *ctx)
 {
+	enum mailbox_list_iter_flags list_flags =
+		MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
 	struct mailbox_list_iterate_context *list_iter;
 	const struct mailbox_info *info;
 	bool ret = FALSE;
 
-	list_iter = mailbox_list_iter_init(ctx->ns->list, "%",
-					   MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
+	if ((ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
+		list_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
+
+	list_iter = mailbox_list_iter_init(ctx->ns->list, "%", list_flags);
 	info = mailbox_list_iter_next(list_iter);
 	if (info != NULL)
 		ret = TRUE;
@@ -286,7 +290,8 @@
 		}
 	}
 
-	if ((ctx->ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0) {
+	if ((ctx->ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0 ||
+	    (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
 		if (have_children) {
 			/* children are going to be listed. */
 			return;
@@ -540,8 +545,16 @@
 list_want_send_prefix(struct cmd_list_context *ctx, const char *pattern)
 {
 	/* don't send the prefix if we're listing subscribed mailboxes */
-	if ((ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
-		return FALSE;
+	if ((ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
+		if ((ctx->ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0) {
+			/* using parent's subscriptions file. it'll handle
+			   this internally */
+			return FALSE;
+		}
+		/* send prefix if namespace has at least some subscriptions,
+		   but pattern doesn't match any children (e.g. "%") */
+		return TRUE;
+	}
 
 	/* send the prefix if namespace is listable. if children are listable
 	   we may or may not need to send it. */