mail-search-register-human.c revision 5e114f59ad9b9632bf7f3403d56bea17bd494e8e
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_search_register *mail_search_register_human;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenhuman_search_or(struct mail_search_build_context *ctx)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen /* this changes the parent arg to be an OR block instead of AND block */
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenarg_new_human_date(struct mail_search_build_context *ctx,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int secs;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned long unixtime;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* a) yyyy-mm-dd
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 tm.tm_year = (value[0]-'0') * 1000 + (value[1]-'0') * 100 +
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');
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 } else if (settings_get_time(value, &secs, &error) == 0) {
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "Invalid search date parameter: ", value, NULL);
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 return arg_new_human_date(ctx, _type, _date_type); \
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 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 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)
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainenarg_new_human_size(struct mail_search_build_context *ctx,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (settings_get_size(value, &sarg->value.size, &error) < 0) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenhuman_search_larger(struct mail_search_build_context *ctx)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen return arg_new_human_size(ctx, SEARCH_LARGER);
1330f999b8076b2f8eed2572c667f7482a555c1bTimo Sirainenhuman_search_smaller(struct mail_search_build_context *ctx)
1330f999b8076b2f8eed2572c667f7482a555c1bTimo Sirainen return arg_new_human_size(ctx, SEARCH_SMALLER);
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainenhuman_search_guid(struct mail_search_build_context *ctx)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen return mail_search_build_str(ctx, SEARCH_GUID);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenhuman_search_mailbox(struct mail_search_build_context *ctx)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (!uni_utf8_str_is_valid(sarg->value.str)) {
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen "Mailbox name not valid UTF-8: ",
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenstatic const struct mail_search_register_arg human_register_args[] = {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen { "X-SAVEDBEFORE", human_search_savedbefore },
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen /* Other Dovecot extensions: */
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainenmail_search_register_init_human(struct mail_search_register *imap_register)
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen ARRAY_DEFINE(copy_args, const struct mail_search_register_arg);
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen const struct mail_search_register_arg *human_args, *imap_args;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen mail_search_register_add(reg, human_register_args,
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 for (i = j = 0; i < imap_count && j < human_count; ) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen ret = strcmp(imap_args[i].key, human_args[j].key);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen } else if (ret > 0) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen for (; i < imap_count; i++)
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen imap_args = array_get(©_args, &imap_count);
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen mail_search_register_add(reg, imap_args, imap_count);
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen if (mail_search_register_get_fallback(imap_register, &fallback))