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