mail-search-register-human.c revision 025e4dfc239a749ebd80b882fd39962b9c24fed7
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstruct mail_search_register *mail_search_register_human;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_or(struct mail_search_build_context *ctx)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* this changes the parent arg to be an OR block instead of AND block */
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenarg_new_human_date(struct mail_search_build_context *ctx,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen unsigned int secs;
39224d71e56c50ccfbc0405eb1914281590064d6Timo Sirainen unsigned long unixtime;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* a) yyyy-mm-dd
39224d71e56c50ccfbc0405eb1914281590064d6Timo Sirainen c) unix timestamp
39224d71e56c50ccfbc0405eb1914281590064d6Timo Sirainen d) interval (e.g. n days) */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (i_isdigit(value[0]) && i_isdigit(value[1]) &&
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen i_isdigit(value[2]) && i_isdigit(value[3]) && value[4] == '-' &&
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen i_isdigit(value[5]) && i_isdigit(value[6]) && value[7] == '-' &&
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen i_isdigit(value[8]) && i_isdigit(value[9]) && value[10] == '\0') {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen tm.tm_year = (value[0]-'0') * 1000 + (value[1]-'0') * 100 +
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen tm.tm_mon = (value[5]-'0') * 10 + (value[6]-'0') - 1;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen tm.tm_mday = (value[8]-'0') * 10 + (value[9]-'0');
592270d9a3d666a1b687c146f6e1edf2aacd46e8Timo Sirainen } else if (imap_parse_date(value, &sarg->value.time)) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* imap date */
39224d71e56c50ccfbc0405eb1914281590064d6Timo Sirainen } else if (str_to_ulong(value, &unixtime) == 0) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen } else if (settings_get_time(value, &secs, &error) == 0) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen "Invalid search date parameter: ", value, NULL);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#define CALLBACK_DATE(_func, _type, _date_type) \
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic struct mail_search_arg *\
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_##_func(struct mail_search_build_context *ctx) \
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_date(ctx, _type, _date_type); \
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
5e114f59ad9b9632bf7f3403d56bea17bd494e8eTimo SirainenCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenarg_new_human_size(struct mail_search_build_context *ctx,
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (mail_search_parse_string(ctx->parser, &value) < 0)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (settings_get_size(value, &sarg->value.size, &error) < 0) {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_larger(struct mail_search_build_context *ctx)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_size(ctx, SEARCH_LARGER);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_smaller(struct mail_search_build_context *ctx)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return arg_new_human_size(ctx, SEARCH_SMALLER);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_guid(struct mail_search_build_context *ctx)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen return mail_search_build_str(ctx, SEARCH_GUID);
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenhuman_search_mailbox(struct mail_search_build_context *ctx)
e85148f6f86714bc3999e7cf42df47a9665a2628Timo Sirainen sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen if (!uni_utf8_str_is_valid(sarg->value.str)) {
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen "Mailbox name not valid UTF-8: ",
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainenhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
00120655cf38b7981ea65abb73330e338bc78f5bTimo Sirainen return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenstatic const struct mail_search_register_arg human_register_args[] = {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen { "X-SAVEDBEFORE", human_search_savedbefore },
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* Other Dovecot extensions: */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenmail_search_register_init_human(struct mail_search_register *imap_register)
025e4dfc239a749ebd80b882fd39962b9c24fed7Timo Sirainen ARRAY(struct mail_search_register_arg) copy_args;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen const struct mail_search_register_arg *human_args, *imap_args;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_add(reg, human_register_args,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen /* find and register args in imap that don't exist in human */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen imap_args = mail_search_register_get(imap_register, &imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen human_args = mail_search_register_get(reg, &human_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen for (i = j = 0; i < imap_count && j < human_count; ) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen ret = strcmp(imap_args[i].key, human_args[j].key);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen } else if (ret > 0) {
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen for (; i < imap_count; i++)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen imap_args = array_get(©_args, &imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen mail_search_register_add(reg, imap_args, imap_count);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen if (mail_search_register_get_fallback(imap_register, &fallback))