mail-search-register-human.c revision 5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "lib.h"
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "ioloop.h"
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "array.h"
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "str.h"
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "unichar.h"
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#include "settings-parser.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "imap-date.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "mail-search-register.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "mail-search-parser.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include "mail-search-build.h"
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include <time.h>
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen#include <ctype.h>
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenstruct mail_search_register *mail_search_register_human;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenstatic struct mail_search_arg *
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenhuman_search_or(struct mail_search_build_context *ctx)
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen{
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen struct mail_search_arg *sarg;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* this changes the parent arg to be an OR block instead of AND block */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen ctx->parent->type = SEARCH_OR;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen return NULL;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen return sarg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic struct mail_search_arg *
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenarg_new_human_date(struct mail_search_build_context *ctx,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen enum mail_search_arg_type type,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen enum mail_search_date_type date_type)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen{
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_search_arg *sarg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen const char *value, *error;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct tm tm;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int secs;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned long unixtime;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg = mail_search_build_new(ctx, type);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return NULL;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* a) yyyy-mm-dd
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen b) imap date
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen c) unix timestamp
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen d) interval (e.g. n days) */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (i_isdigit(value[0]) && i_isdigit(value[1]) &&
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i_isdigit(value[2]) && i_isdigit(value[3]) && value[4] == '-' &&
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i_isdigit(value[5]) && i_isdigit(value[6]) && value[7] == '-' &&
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i_isdigit(value[8]) && i_isdigit(value[9]) && value[10] == '\0') {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen memset(&tm, 0, sizeof(tm));
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen tm.tm_year = (value[0]-'0') * 1000 + (value[1]-'0') * 100 +
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen (value[2]-'0') * 10 + (value[3]-'0') - 1900;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen tm.tm_mon = (value[5]-'0') * 10 + (value[6]-'0') - 1;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen tm.tm_mday = (value[8]-'0') * 10 + (value[9]-'0');
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.time = mktime(&tm);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else if (imap_parse_date(value, &sarg->value.time)) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* imap date */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else if (str_to_ulong(value, &unixtime) == 0) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.time = unixtime;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else if (settings_get_time(value, &secs, &error) == 0) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.time = ioloop_time - secs;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.time = (time_t)-1;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (sarg->value.time == (time_t)-1) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ctx->_error = p_strconcat(ctx->pool,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen "Invalid search date parameter: ", value, NULL);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return NULL;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.date_type = date_type;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return sarg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen#define CALLBACK_DATE(_func, _type, _date_type) \
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *\
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenhuman_search_##_func(struct mail_search_build_context *ctx) \
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen{ \
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return arg_new_human_date(ctx, _type, _date_type); \
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen}
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo SirainenCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenarg_new_human_size(struct mail_search_build_context *ctx,
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen enum mail_search_arg_type type)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen{
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen struct mail_search_arg *sarg;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen const char *value, *error;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen sarg = mail_search_build_new(ctx, type);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return NULL;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen if (settings_get_size(value, &sarg->value.size, &error) < 0) {
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen ctx->_error = p_strdup(ctx->pool, error);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return NULL;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return sarg;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen}
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenhuman_search_larger(struct mail_search_build_context *ctx)
eab880d75fd73a80c7803289796d13e08e4b52cbTimo Sirainen{
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return arg_new_human_size(ctx, SEARCH_LARGER);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen}
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenhuman_search_smaller(struct mail_search_build_context *ctx)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen{
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return arg_new_human_size(ctx, SEARCH_SMALLER);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen}
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenhuman_search_guid(struct mail_search_build_context *ctx)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen{
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return mail_search_build_str(ctx, SEARCH_GUID);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen}
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic struct mail_search_arg *
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenhuman_search_mailbox(struct mail_search_build_context *ctx)
bed3fcccce6a15dfd7491e82df10acd5f5c0bc9bTimo Sirainen{
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen struct mail_search_arg *sarg;
e06147cec0f68a6a9d08b38785c36d00ef73868aTimo Sirainen
e06147cec0f68a6a9d08b38785c36d00ef73868aTimo Sirainen sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
e06147cec0f68a6a9d08b38785c36d00ef73868aTimo Sirainen if (sarg == NULL)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen return NULL;
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (strchr(sarg->value.str, '*') != NULL ||
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen strchr(sarg->value.str, '%') != NULL)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->type = SEARCH_MAILBOX_GLOB;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen if (!uni_utf8_str_is_valid(sarg->value.str)) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ctx->_error = p_strconcat(ctx->pool,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen "Mailbox name not valid UTF-8: ",
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sarg->value.str, NULL);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return NULL;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return sarg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic struct mail_search_arg *
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen{
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic const struct mail_search_register_arg human_register_args[] = {
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen { "OR", human_search_or },
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen /* dates */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "BEFORE", human_search_before },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "ON", human_search_on },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SINCE", human_search_since },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SENTBEFORE", human_search_sentbefore },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SENTON", human_search_senton },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SENTSINCE", human_search_sentsince },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SAVEDBEFORE", human_search_savedbefore },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SAVEDON", human_search_savedon },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SAVEDSINCE", human_search_savedsince },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "X-SAVEDBEFORE", human_search_savedbefore },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "X-SAVEDON", human_search_savedon },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "X-SAVEDSINCE", human_search_savedsince },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* sizes */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "LARGER", human_search_larger },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "SMALLER", human_search_smaller },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* Other Dovecot extensions: */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "GUID", human_search_guid },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "MAILBOX", human_search_mailbox },
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen { "MAILBOX-GUID", human_search_mailbox_guid }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen};
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic struct mail_search_register *
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_search_register_init_human(struct mail_search_register *imap_register)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen{
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_search_register *reg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_fallback_t *fallback;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ARRAY(const struct mail_search_register_arg) copy_args;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen const struct mail_search_register_arg *human_args, *imap_args;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, j, human_count, imap_count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen int ret;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen reg = mail_search_register_init();
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_add(reg, human_register_args,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen N_ELEMENTS(human_register_args));
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* find and register args in imap that don't exist in human */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen imap_args = mail_search_register_get(imap_register, &imap_count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen human_args = mail_search_register_get(reg, &human_count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen t_array_init(&copy_args, imap_count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = j = 0; i < imap_count && j < human_count; ) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ret = strcmp(imap_args[i].key, human_args[j].key);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (ret < 0) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen array_append(&copy_args, &imap_args[i], 1);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i++;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else if (ret > 0) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen j++;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen } else {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i++; j++;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (; i < imap_count; i++)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen array_append(&copy_args, &imap_args[i], 1);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen imap_args = array_get(&copy_args, &imap_count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_add(reg, imap_args, imap_count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_search_register_get_fallback(imap_register, &fallback))
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_fallback(reg, fallback);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return reg;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstruct mail_search_register *mail_search_register_get_human(void)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen{
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_search_register_human == NULL) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_search_register *imap_reg =
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_get_imap();
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_human =
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_search_register_init_human(imap_reg);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen }
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen return mail_search_register_human;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen}
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen