/usr/include/dovecot/mail-search.h is in dovecot-dev 1:2.2.22-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | #ifndef MAIL_SEARCH_H
#define MAIL_SEARCH_H
#include "seq-range-array.h"
#include "mail-types.h"
#include "mail-thread.h"
enum mail_search_arg_type {
SEARCH_OR,
SEARCH_SUB,
/* sequence sets */
SEARCH_ALL,
SEARCH_SEQSET,
SEARCH_UIDSET,
/* flags */
SEARCH_FLAGS,
SEARCH_KEYWORDS,
/* dates (date_type required) */
SEARCH_BEFORE,
SEARCH_ON, /* time must point to beginning of the day */
SEARCH_SINCE,
/* sizes */
SEARCH_SMALLER,
SEARCH_LARGER,
/* headers */
SEARCH_HEADER,
SEARCH_HEADER_ADDRESS,
SEARCH_HEADER_COMPRESS_LWSP,
/* body */
SEARCH_BODY,
SEARCH_TEXT,
/* extensions */
SEARCH_MODSEQ,
SEARCH_INTHREAD,
SEARCH_GUID,
SEARCH_MAILBOX,
SEARCH_MAILBOX_GUID,
SEARCH_MAILBOX_GLOB,
SEARCH_REAL_UID
};
enum mail_search_date_type {
MAIL_SEARCH_DATE_TYPE_SENT = 1,
MAIL_SEARCH_DATE_TYPE_RECEIVED,
MAIL_SEARCH_DATE_TYPE_SAVED
};
enum mail_search_arg_flag {
/* For BEFORE/SINCE/ON searches: Don't drop timezone from
comparisons */
MAIL_SEARCH_ARG_FLAG_USE_TZ = 0x01,
};
enum mail_search_modseq_type {
MAIL_SEARCH_MODSEQ_TYPE_ANY = 0,
MAIL_SEARCH_MODSEQ_TYPE_PRIVATE,
MAIL_SEARCH_MODSEQ_TYPE_SHARED
};
struct mail_search_modseq {
uint64_t modseq;
enum mail_search_modseq_type type;
};
struct mail_search_arg {
/* NOTE: when adding new fields, make sure mail_search_arg_dup_one()
and mail_search_arg_one_equals() are updated. */
struct mail_search_arg *next;
enum mail_search_arg_type type;
struct {
struct mail_search_arg *subargs;
ARRAY_TYPE(seq_range) seqset;
const char *str;
time_t time;
uoff_t size;
enum mail_flags flags;
enum mail_search_arg_flag search_flags;
enum mail_search_date_type date_type;
enum mail_thread_type thread_type;
struct mail_search_modseq *modseq;
struct mail_search_result *search_result;
} value;
/* set by mail_search_args_init(): */
struct {
struct mail_search_args *search_args;
struct mail_keywords *keywords;
struct imap_match_glob *mailbox_glob;
} initialized;
void *context;
const char *hdr_field_name; /* for SEARCH_HEADER* */
unsigned int match_not:1; /* result = !result */
unsigned int match_always:1; /* result = 1 always */
unsigned int nonmatch_always:1; /* result = 0 always */
unsigned int fuzzy:1; /* use fuzzy matching for this arg */
int result; /* -1 = unknown, 0 = unmatched, 1 = matched */
};
struct mail_search_args {
int refcount, init_refcount;
pool_t pool;
struct mailbox *box;
struct mail_search_arg *args;
unsigned int simplified:1;
unsigned int have_inthreads:1;
/* Stop mail_search_next() when finding a non-matching mail.
(Could be useful when wanting to find only the oldest mails.) */
unsigned int stop_on_nonmatch:1;
/* fts plugin has already expanded the search args - no need to do
it again. */
unsigned int fts_expanded:1;
};
#define ARG_SET_RESULT(arg, res) \
STMT_START { \
(arg)->result = !(arg)->match_not ? (res) : \
(res) == -1 ? -1 : !(res); \
} STMT_END
typedef void mail_search_foreach_callback_t(struct mail_search_arg *arg,
void *context);
/* Allocate keywords for search arguments. If change_uidsets is TRUE,
change uidsets to seqsets. */
void mail_search_args_init(struct mail_search_args *args,
struct mailbox *box, bool change_uidsets,
const ARRAY_TYPE(seq_range) *search_saved_uidset)
ATTR_NULL(4);
/* Initialize arg and its children. args is used for getting mailbox and
pool. */
void mail_search_arg_init(struct mail_search_args *args,
struct mail_search_arg *arg,
bool change_uidsets,
const ARRAY_TYPE(seq_range) *search_saved_uidset);
/* Free memory allocated by mail_search_args_init(). The args can initialized
afterwards again if needed. The args can be reused for other queries after
calling this. */
void mail_search_args_deinit(struct mail_search_args *args);
/* Free arg and its children. */
void mail_search_arg_deinit(struct mail_search_arg *arg);
/* Convert sequence sets in args to UIDs. */
void mail_search_args_seq2uid(struct mail_search_args *args);
/* Returns TRUE if the two search arguments are fully compatible.
Always returns FALSE if there are seqsets, since they may point to different
messages depending on when the search is run. */
bool mail_search_args_equal(const struct mail_search_args *args1,
const struct mail_search_args *args2);
/* Same as mail_search_args_equal(), but for individual mail_search_arg
structs. All the siblings of arg1 and arg2 are also compared. */
bool mail_search_arg_equals(const struct mail_search_arg *arg1,
const struct mail_search_arg *arg2);
/* Same as mail_search_arg_equals(), but don't compare siblings. */
bool mail_search_arg_one_equals(const struct mail_search_arg *arg1,
const struct mail_search_arg *arg2);
void mail_search_args_ref(struct mail_search_args *args);
void mail_search_args_unref(struct mail_search_args **args);
struct mail_search_args *
mail_search_args_dup(const struct mail_search_args *args);
struct mail_search_arg *
mail_search_arg_dup(pool_t pool, const struct mail_search_arg *arg);
/* Reset the results in search arguments. match_always is reset only if
full_reset is TRUE. */
void mail_search_args_reset(struct mail_search_arg *args, bool full_reset);
/* goes through arguments in list that don't have a result yet.
Returns 1 = search matched, 0 = search unmatched, -1 = don't know yet */
int mail_search_args_foreach(struct mail_search_arg *args,
mail_search_foreach_callback_t *callback,
void *context) ATTR_NULL(3);
#define mail_search_args_foreach(args, callback, context) \
mail_search_args_foreach(args + \
CALLBACK_TYPECHECK(callback, void (*)( \
struct mail_search_arg *, typeof(context))), \
(mail_search_foreach_callback_t *)callback, context)
/* Fills have_headers and have_body based on if such search argument exists
that needs to be checked. Returns the headers that we're searching for, or
NULL if we're searching for TEXT. */
const char *const *
mail_search_args_analyze(struct mail_search_arg *args,
bool *have_headers, bool *have_body);
/* Returns FALSE if search query contains MAILBOX[_GLOB] args such that the
query can never match any messages in the given mailbox. */
bool mail_search_args_match_mailbox(struct mail_search_args *args,
const char *vname, char sep);
/* Simplify/optimize search arguments. Afterwards all OR/SUB args are
guaranteed to have match_not=FALSE. */
void mail_search_args_simplify(struct mail_search_args *args);
/* Append all args as IMAP SEARCH AND-query to the dest string and returns TRUE.
If some search arg can't be written as IMAP SEARCH parameter, error_r is set
and FALSE is returned. */
bool mail_search_args_to_imap(string_t *dest, const struct mail_search_arg *args,
const char **error_r);
/* Like mail_search_args_to_imap(), but append only a single arg. */
bool mail_search_arg_to_imap(string_t *dest, const struct mail_search_arg *arg,
const char **error_r);
/* Write all args to dest string as cmdline/human compatible input. */
void mail_search_args_to_cmdline(string_t *dest,
const struct mail_search_arg *args);
/* Serialization for search args' results. */
void mail_search_args_result_serialize(const struct mail_search_args *args,
buffer_t *dest);
void mail_search_args_result_deserialize(struct mail_search_args *args,
const unsigned char *data,
size_t size);
#endif
|