]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: cmd-list - Collect parameters for list_send_status() in a struct
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 16 Sep 2018 10:48:11 +0000 (12:48 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 25 Feb 2025 11:24:51 +0000 (11:24 +0000)
This is preparation for adding infrastructure for dynamically adding support for new RETURN flags.

src/imap/cmd-list.c
src/imap/imap-list.h

index 4b8da85c6659129c52da87cf9a5327a93009e359..7e03bc3a958d6af4d750e3d815dc7a23d126668d 100644 (file)
@@ -180,34 +180,35 @@ static void list_reply_append_ns_sep_param(string_t *str, char sep)
 }
 
 static void
-list_send_status(struct cmd_list_context *ctx, const char *name,
-                const char *mutf7_name, enum mailbox_info_flags flags)
+list_send_status(struct cmd_list_context *ctx,
+                const struct imap_list_return_flag_params *params)
 {
+       enum mailbox_info_flags mbox_flags = params->mbox_flags;
        struct imap_status_result result;
        struct mail_namespace *ns;
 
-       if ((flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) != 0) {
+       if ((mbox_flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) != 0) {
                /* doesn't exist, don't even try to get STATUS */
                return;
        }
-       if ((flags & MAILBOX_SUBSCRIBED) == 0 &&
+       if ((mbox_flags & MAILBOX_SUBSCRIBED) == 0 &&
            (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
                /* listing subscriptions, but only child is subscribed */
-               i_assert((flags & MAILBOX_CHILD_SUBSCRIBED) != 0);
+               i_assert((mbox_flags & MAILBOX_CHILD_SUBSCRIBED) != 0);
                return;
        }
 
        /* if we're listing subscriptions and there are subscriptions=no
           namespaces, ctx->ns may not point to correct one */
-       ns = mail_namespace_find(ctx->user->namespaces, name);
-       if (imap_status_get(ctx->cmd, ns, name,
+       ns = mail_namespace_find(ctx->user->namespaces, params->name);
+       if (imap_status_get(ctx->cmd, ns, params->name,
                            &ctx->status_items, &result) < 0) {
                client_send_line(ctx->cmd->client,
                                 t_strconcat("* ", result.errstr, NULL));
                return;
        }
 
-       imap_status_send(ctx->cmd->client, mutf7_name,
+       imap_status_send(ctx->cmd->client, params->mutf7_name,
                         &ctx->status_items, &result);
 }
 
@@ -253,10 +254,21 @@ static bool cmd_list_continue(struct client_command_context *cmd)
                imap_append_astring(str, str_c(mutf7_name));
                mailbox_childinfo2str(ctx, str, flags);
 
+               /* send LIST/LSUB response */
                ret = client_send_line_next(ctx->cmd->client, str_c(str));
-               if (ctx->used_status) T_BEGIN {
-                       list_send_status(ctx, name, str_c(mutf7_name), flags);
-               } T_END;
+
+               /* send STATUS response */
+               if (ctx->used_status) {
+                       struct imap_list_return_flag_params params = {
+                               .name = name,
+                               .mutf7_name = str_c(mutf7_name),
+                               .mbox_flags = flags,
+                       };
+
+                       T_BEGIN {
+                               list_send_status(ctx, &params);
+                       } T_END;
+               }
                if (ret == 0) {
                        /* buffer is full, continue later */
                        return FALSE;
index 6a0e0761847ca4dbd02f7c486aa3bae9d25ee819..66b378e93587a45b8f1d73b25c9486da9409f5dc 100644 (file)
@@ -1,6 +1,13 @@
 #ifndef IMAP_LIST_H
 #define IMAP_LIST_H
 
+struct imap_list_return_flag_params {
+       const char *name;
+       const char *mutf7_name;
+
+       enum mailbox_info_flags mbox_flags;
+};
+
 /* Returns TRUE if anything was added to the string. */
 bool imap_mailbox_flags2str(string_t *str, enum mailbox_info_flags flags);