]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: When listing subscriptions, make sure children flags are returned if...
authorTimo Sirainen <tss@iki.fi>
Sat, 12 Feb 2011 03:32:25 +0000 (05:32 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 12 Feb 2011 03:32:25 +0000 (05:32 +0200)
src/lib-storage/list/mailbox-list-subscriptions.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h

index ad399ee86cab6e4d5905372e0ae2d90275ebeb3d..3d44dfe2751b5a6802667173f5831c22ab33e452 100644 (file)
@@ -208,21 +208,6 @@ mailbox_list_subscriptions_iter_init(struct mailbox_list *list,
        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 @@ mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *_ctx)
        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 @@ mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *_ctx)
        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);
index bcbda30cfb07a3d360d58b67bf8cce065313b547..90a9e9f210026c7a8ce221a14010b60cca87cc5f 100644 (file)
@@ -1159,6 +1159,22 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
        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)
 {
index 97a4208fc3349426cb46bc35cbe84f612871dc6b..7493e1cac6dccfb775fae565c9876c9e25505db7 100644 (file)
@@ -243,6 +243,8 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **ctx);
    -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