mail-search-args-cmdline.c revision 74bc7e646663255703e10e0c0b7242ad7ad52f94
0N/A/* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */
0N/A
0N/A#include "lib.h"
0N/A#include "str.h"
0N/A#include "imap-quote.h"
2362N/A#include "mail-search.h"
0N/A
2362N/Astatic void
0N/Amail_search_arg_to_cmdline(string_t *dest, const struct mail_search_arg *arg);
0N/A
0N/Astatic void
0N/Amail_search_subargs_to_cmdline(string_t *dest, const struct mail_search_arg *args,
0N/A const char *middle)
0N/A{
0N/A const struct mail_search_arg *arg;
0N/A
0N/A str_append(dest, "( ");
0N/A for (arg = args; arg != NULL; arg = arg->next) {
0N/A mail_search_arg_to_cmdline(dest, arg);
2362N/A if (arg->next != NULL)
2362N/A str_append(dest, middle);
2362N/A }
0N/A str_append(dest, " )");
0N/A}
0N/A
0N/Astatic void
0N/Amail_search_arg_to_cmdline(string_t *dest, const struct mail_search_arg *arg)
0N/A{
0N/A struct mail_search_arg new_arg;
0N/A const char *error;
0N/A
0N/A if (arg->match_not)
3984N/A str_append(dest, "NOT ");
0N/A switch (arg->type) {
0N/A case SEARCH_OR:
0N/A mail_search_subargs_to_cmdline(dest, arg->value.subargs, " OR ");
0N/A return;
0N/A case SEARCH_SUB:
0N/A mail_search_subargs_to_cmdline(dest, arg->value.subargs, " ");
0N/A return;
0N/A case SEARCH_FLAGS:
0N/A case SEARCH_KEYWORDS: {
0N/A size_t pos = str_len(dest);
0N/A
0N/A if (!mail_search_arg_to_imap(dest, arg, &error))
0N/A i_unreached();
0N/A str_insert(dest, pos+1, " ");
0N/A str_insert(dest, str_len(dest)-2, " ");
0N/A return;
0N/A }
0N/A case SEARCH_INTHREAD:
0N/A str_append(dest, "INTHREAD ");
0N/A imap_append_astring(dest, mail_thread_type_to_str(arg->value.thread_type));
0N/A str_append_c(dest, ' ');
0N/A mail_search_subargs_to_cmdline(dest, arg->value.subargs, " ");
0N/A break;
0N/A case SEARCH_MAILBOX:
0N/A str_append(dest, "MAILBOX ");
0N/A imap_append_astring(dest, arg->value.str);
0N/A return;
0N/A case SEARCH_MAILBOX_GUID:
0N/A str_append(dest, "MAILBOX-GUID ");
0N/A imap_append_astring(dest, arg->value.str);
0N/A return;
0N/A case SEARCH_ALL:
0N/A case SEARCH_SEQSET:
0N/A case SEARCH_UIDSET:
0N/A case SEARCH_BEFORE:
0N/A case SEARCH_ON:
0N/A case SEARCH_SINCE:
0N/A case SEARCH_SMALLER:
0N/A case SEARCH_LARGER:
0N/A case SEARCH_HEADER:
0N/A case SEARCH_HEADER_ADDRESS:
0N/A case SEARCH_HEADER_COMPRESS_LWSP:
0N/A case SEARCH_BODY:
0N/A case SEARCH_TEXT:
0N/A case SEARCH_MODSEQ:
0N/A case SEARCH_GUID:
0N/A case SEARCH_MAILBOX_GLOB:
0N/A case SEARCH_REAL_UID:
0N/A case SEARCH_MIMEPART:
0N/A break;
0N/A }
0N/A new_arg = *arg;
0N/A new_arg.match_not = FALSE;
0N/A if (!mail_search_arg_to_imap(dest, &new_arg, &error))
0N/A i_panic("mail_search_args_to_cmdline(): Missing handler: %s", error);
0N/A}
0N/A
0N/Avoid mail_search_args_to_cmdline(string_t *dest,
0N/A const struct mail_search_arg *args)
0N/A{
0N/A const struct mail_search_arg *arg;
0N/A
0N/A for (arg = args; arg != NULL; arg = arg->next) {
0N/A mail_search_arg_to_cmdline(dest, arg);
0N/A if (arg->next != NULL)
0N/A str_append_c(dest, ' ');
0N/A }
0N/A}
0N/A