]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mail_search_args_to_cmdline()
authorTimo Sirainen <tss@iki.fi>
Wed, 3 Jun 2015 21:44:42 +0000 (00:44 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 3 Jun 2015 21:44:42 +0000 (00:44 +0300)
This isn't entirely correct yet, but it's only going to be used for
debugging for now.

src/lib-storage/Makefile.am
src/lib-storage/mail-search-args-cmdline.c [new file with mode: 0644]
src/lib-storage/mail-search.h

index 0bcc2638634c6b64e324caaf3636940cf3bab2a5..c8fac1750dd6ed000b7d3fdfdde70a82541414d1 100644 (file)
@@ -28,6 +28,7 @@ libstorage_la_SOURCES = \
        mail-error.c \
        mail-namespace.c \
        mail-search.c \
+       mail-search-args-cmdline.c \
        mail-search-args-imap.c \
        mail-search-args-simplify.c \
        mail-search-build.c \
diff --git a/src/lib-storage/mail-search-args-cmdline.c b/src/lib-storage/mail-search-args-cmdline.c
new file mode 100644 (file)
index 0000000..24da1ea
--- /dev/null
@@ -0,0 +1,100 @@
+/* Copyright (c) 2015 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "str.h"
+#include "imap-quote.h"
+#include "mail-search.h"
+
+static void
+mail_search_arg_to_cmdline(string_t *dest, const struct mail_search_arg *arg);
+
+static void
+mail_search_subargs_to_cmdline(string_t *dest, const struct mail_search_arg *args,
+                              const char *middle)
+{
+       const struct mail_search_arg *arg;
+
+       str_append(dest, "( ");
+       for (arg = args; arg != NULL; arg = arg->next) {
+               mail_search_arg_to_cmdline(dest, arg);
+               if (arg->next != NULL)
+                       str_append(dest, middle);
+       }
+       str_append(dest, " )");
+}
+
+static void
+mail_search_arg_to_cmdline(string_t *dest, const struct mail_search_arg *arg)
+{
+       struct mail_search_arg new_arg;
+       const char *error;
+
+       if (arg->match_not)
+               str_append(dest, "NOT ");
+       switch (arg->type) {
+       case SEARCH_OR:
+               mail_search_subargs_to_cmdline(dest, arg->value.subargs, " OR ");
+               return;
+       case SEARCH_SUB:
+               mail_search_subargs_to_cmdline(dest, arg->value.subargs, " ");
+               return;
+       case SEARCH_FLAGS:
+       case SEARCH_KEYWORDS: {
+               size_t pos = str_len(dest);
+
+               if (!mail_search_arg_to_imap(dest, arg, &error))
+                       i_unreached();
+               str_insert(dest, pos+1, " ");
+               str_insert(dest, str_len(dest)-2, " ");
+               return;
+       }
+       case SEARCH_INTHREAD:
+               str_append(dest, "INTHREAD ");
+               imap_append_astring(dest, mail_thread_type_to_str(arg->value.thread_type));
+               str_append_c(dest, ' ');
+               mail_search_subargs_to_cmdline(dest, arg->value.subargs, " ");
+               break;
+       case SEARCH_MAILBOX:
+               str_append(dest, "MAILBOX ");
+               imap_append_astring(dest, arg->value.str);
+               return;
+       case SEARCH_MAILBOX_GUID:
+               str_append(dest, "MAILBOX-GUID ");
+               imap_append_astring(dest, arg->value.str);
+               return;
+       case SEARCH_ALL:
+       case SEARCH_SEQSET:
+       case SEARCH_UIDSET:
+       case SEARCH_BEFORE:
+       case SEARCH_ON:
+       case SEARCH_SINCE:
+       case SEARCH_SMALLER:
+       case SEARCH_LARGER:
+       case SEARCH_HEADER:
+       case SEARCH_HEADER_ADDRESS:
+       case SEARCH_HEADER_COMPRESS_LWSP:
+       case SEARCH_BODY:
+       case SEARCH_TEXT:
+       case SEARCH_MODSEQ:
+       case SEARCH_GUID:
+       case SEARCH_MAILBOX_GLOB:
+       case SEARCH_REAL_UID:
+               break;
+       }
+       new_arg = *arg;
+       new_arg.match_not = FALSE;
+       if (!mail_search_arg_to_imap(dest, &new_arg, &error))
+               i_panic("mail_search_args_to_cmdline(): Missing handler: %s", error);
+}
+
+void mail_search_args_to_cmdline(string_t *dest,
+                                const struct mail_search_arg *args)
+{
+       const struct mail_search_arg *arg;
+
+       for (arg = args; arg != NULL; arg = arg->next) {
+               mail_search_arg_to_cmdline(dest, arg);
+               if (arg->next != NULL)
+                       str_append_c(dest, ' ');
+       }
+}
index e95d65ce2f07f108e362f6072da66af8654fb264..4f4d023c45763d23440c696c4f02173b298b0308 100644 (file)
@@ -199,6 +199,9 @@ bool mail_search_args_to_imap(string_t *dest, const struct mail_search_arg *args
 /* Like mail_search_args_to_imap(), but append only a single arg. */
 bool mail_search_arg_to_imap(string_t *dest, const struct mail_search_arg *arg,
                             const char **error_r);
+/* Write all args to dest string as cmdline/human compatible input. */
+void mail_search_args_to_cmdline(string_t *dest,
+                                const struct mail_search_arg *args);
 
 /* Serialization for search args' results. */
 void mail_search_args_result_serialize(const struct mail_search_args *args,