mail-search-register-human.c revision d81bbb6948b4d758e87206acb8da4cc4366fd478
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2010-2015 Dovecot authors, see the included COPYING file */
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagherstruct mail_search_register *mail_search_register_human;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_or(struct mail_search_build_context *ctx)
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher /* this changes the parent arg to be an OR block instead of AND block */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherarg_new_human_date(struct mail_search_build_context *ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_search_parse_string(ctx->parser, &value) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_parse_human_timestamp(value, &sarg->value.time) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Invalid search date parameter: ", value, NULL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_##_func(struct mail_search_build_context *ctx) \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return arg_new_human_date(ctx, _type, _date_type); \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen GallagherCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
d921c1eba437662437847279f251a0a5d8f70127MaximCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
d921c1eba437662437847279f251a0a5d8f70127MaximCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
d921c1eba437662437847279f251a0a5d8f70127MaximCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
d921c1eba437662437847279f251a0a5d8f70127Maximstatic struct mail_search_arg *
d921c1eba437662437847279f251a0a5d8f70127Maximarg_new_human_size(struct mail_search_build_context *ctx,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_search_parse_string(ctx->parser, &value) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (settings_get_size(value, &sarg->value.size, &error) < 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_larger(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return arg_new_human_size(ctx, SEARCH_LARGER);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_smaller(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return arg_new_human_size(ctx, SEARCH_SMALLER);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_guid(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return mail_search_build_str(ctx, SEARCH_GUID);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_mailbox(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (strchr(sarg->value.str, '*') != NULL ||
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!uni_utf8_str_is_valid(sarg->value.str)) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek "Mailbox name not valid UTF-8: ",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherhuman_search_oldestonly(struct mail_search_build_context *ctx)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher return mail_search_build_new(ctx, SEARCH_ALL);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const struct mail_search_register_arg human_register_args[] = {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "SAVEDBEFORE", human_search_savedbefore },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "SAVEDSINCE", human_search_savedsince },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "X-SAVEDBEFORE", human_search_savedbefore },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "X-SAVEDSINCE", human_search_savedsince },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Other Dovecot extensions: */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "MAILBOX-GUID", human_search_mailbox_guid },
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozekmail_search_register_init_human(struct mail_search_register *imap_register)
172c07013d1ea99447a780fd36f49d5c3a76981bJakub Hrozek ARRAY(struct mail_search_register_arg) copy_args;
172c07013d1ea99447a780fd36f49d5c3a76981bJakub Hrozek const struct mail_search_register_arg *human_args, *imap_args;
172c07013d1ea99447a780fd36f49d5c3a76981bJakub Hrozek mail_search_register_add(reg, human_register_args,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* find and register args in imap that don't exist in human */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher imap_args = mail_search_register_get(imap_register, &imap_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher human_args = mail_search_register_get(reg, &human_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = j = 0; i < imap_count && j < human_count; ) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = strcmp(imap_args[i].key, human_args[j].key);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_append(©_args, &imap_args[i], 1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (ret > 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (; i < imap_count; i++)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_append(©_args, &imap_args[i], 1);
96c73559adfbdac96720008fc022cb1d540b53c3Jakub Hrozek imap_args = array_get(©_args, &imap_count);
6f51c802311fd81a409a26763ed45b28a3234d0dJakub Hrozek mail_search_register_add(reg, imap_args, imap_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (mail_search_register_get_fallback(imap_register, &fallback))
return reg;
return mail_search_register_human;