mail-search-register.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
6ae232055d4d8a97267517c5e50074c2c819941and/* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and#include "lib.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "array.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "mail-search.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "mail-search-register.h"
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andstruct mail_search_register {
6ae232055d4d8a97267517c5e50074c2c819941and ARRAY(struct mail_search_register_arg) args;
6ae232055d4d8a97267517c5e50074c2c819941and mail_search_register_fallback_t *fallback;
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen bool args_sorted:1;
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen};
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
6ae232055d4d8a97267517c5e50074c2c819941andstruct mail_search_register *mail_search_register_init(void)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and struct mail_search_register *reg;
d229f940abfb2490dee17979e9a5ff31b7012eb5rbowen
3f08db06526d6901aa08c110b5bc7dde6bc39905nd reg = i_new(struct mail_search_register, 1);
6ae232055d4d8a97267517c5e50074c2c819941and i_array_init(&reg->args, 64);
6ae232055d4d8a97267517c5e50074c2c819941and return reg;
6ae232055d4d8a97267517c5e50074c2c819941and}
b43f840409794ed298e8634f6284741f193b6c4ftakashi
6ae232055d4d8a97267517c5e50074c2c819941andvoid mail_search_register_deinit(struct mail_search_register **_reg)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and struct mail_search_register *reg = *_reg;
b43f840409794ed298e8634f6284741f193b6c4ftakashi
11495c9f0bd33e51a25b4d532beadfbcf9b944a3nilgun *_reg = NULL;
6ae232055d4d8a97267517c5e50074c2c819941and
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi array_free(&reg->args);
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung i_free(reg);
6ae232055d4d8a97267517c5e50074c2c819941and}
b43f840409794ed298e8634f6284741f193b6c4ftakashi
b43f840409794ed298e8634f6284741f193b6c4ftakashivoid mail_search_register_add(struct mail_search_register *reg,
b43f840409794ed298e8634f6284741f193b6c4ftakashi const struct mail_search_register_arg *arg,
b43f840409794ed298e8634f6284741f193b6c4ftakashi unsigned int count)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and array_append(&reg->args, arg, count);
6ae232055d4d8a97267517c5e50074c2c819941and reg->args_sorted = FALSE;
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andvoid mail_search_register_fallback(struct mail_search_register *reg,
6ae232055d4d8a97267517c5e50074c2c819941and mail_search_register_fallback_t *fallback)
6ae232055d4d8a97267517c5e50074c2c819941and{
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi reg->fallback = fallback;
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andstatic int
1d980e5489836e977ba59b419e27b0ec875c4bd3takashimail_search_register_arg_cmp(const struct mail_search_register_arg *arg1,
6ae232055d4d8a97267517c5e50074c2c819941and const struct mail_search_register_arg *arg2)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and return strcmp(arg1->key, arg2->key);
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andconst struct mail_search_register_arg *
6ae232055d4d8a97267517c5e50074c2c819941andmail_search_register_get(struct mail_search_register *reg,
6ae232055d4d8a97267517c5e50074c2c819941and unsigned int *count_r)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and if (!reg->args_sorted) {
6ae232055d4d8a97267517c5e50074c2c819941and array_sort(&reg->args, mail_search_register_arg_cmp);
6ae232055d4d8a97267517c5e50074c2c819941and reg->args_sorted = TRUE;
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and return array_get(&reg->args, count_r);
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andconst struct mail_search_register_arg *
6ae232055d4d8a97267517c5e50074c2c819941andmail_search_register_find(struct mail_search_register *reg, const char *key)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and struct mail_search_register_arg arg;
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and if (!reg->args_sorted) {
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi array_sort(&reg->args, mail_search_register_arg_cmp);
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi reg->args_sorted = TRUE;
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and arg.key = key;
b9f522ae1c0ed2bf3fc4444245bf28b2e2449a65nd return array_bsearch(&reg->args, &arg, mail_search_register_arg_cmp);
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andbool mail_search_register_get_fallback(struct mail_search_register *reg,
6ae232055d4d8a97267517c5e50074c2c819941and mail_search_register_fallback_t **fallback_r)
6ae232055d4d8a97267517c5e50074c2c819941and{
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh if (reg->fallback == NULL)
6ae232055d4d8a97267517c5e50074c2c819941and return FALSE;
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and *fallback_r = reg->fallback;
6ae232055d4d8a97267517c5e50074c2c819941and return TRUE;
6ae232055d4d8a97267517c5e50074c2c819941and}
1d980e5489836e977ba59b419e27b0ec875c4bd3takashi