#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,
SEARCH_ALL,
SEARCH_SEQSET,
SEARCH_UIDSET,
SEARCH_FLAGS,
SEARCH_KEYWORDS,
SEARCH_BEFORE,
SEARCH_ON,
SEARCH_SINCE,
SEARCH_SMALLER,
SEARCH_LARGER,
SEARCH_HEADER,
SEARCH_HEADER_ADDRESS,
SEARCH_HEADER_COMPRESS_LWSP,
SEARCH_BODY,
SEARCH_TEXT,
SEARCH_BODY_FAST,
SEARCH_TEXT_FAST,
SEARCH_MODSEQ,
SEARCH_INTHREAD,
SEARCH_GUID,
SEARCH_MAILBOX,
SEARCH_MAILBOX_GUID,
SEARCH_MAILBOX_GLOB
};
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 {
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 {
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_keywords *keywords;
struct mail_search_modseq *modseq;
struct mail_search_args *search_args;
struct mail_search_result *search_result;
struct imap_match_glob *mailbox_glob;
} value;
void *context;
const char *hdr_field_name;
unsigned int not:1;
unsigned int match_always:1;
unsigned int nonmatch_always:1;
int result;
};
struct mail_search_args {
int refcount, init_refcount;
pool_t pool;
struct mailbox *box;
struct mail_search_arg *args;
const char *charset;
unsigned int simplified:1;
unsigned int have_inthreads:1;
};
#define ARG_SET_RESULT(arg, res) \
STMT_START { \
(arg)->result = !(arg)->not ? (res) : \
(res) == -1 ? -1 : !(res); \
} STMT_END
typedef void mail_search_foreach_callback_t(struct mail_search_arg *arg,
void *context);
void mail_search_args_init(struct mail_search_args *args,
struct mailbox *box, bool change_uidsets,
const ARRAY_TYPE(seq_range) *search_saved_uidset);
void mail_search_args_deinit(struct mail_search_args *args);
void mail_search_args_seq2uid(struct mail_search_args *args);
bool mail_search_args_equal(const struct mail_search_args *args1,
const struct mail_search_args *args2);
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);
void mail_search_args_reset(struct mail_search_arg *args, bool full_reset);
int mail_search_args_foreach(struct mail_search_arg *args,
mail_search_foreach_callback_t *callback,
void *context);
#ifdef CONTEXT_TYPE_SAFETY
# define mail_search_args_foreach(args, callback, context) \
({(void)(1 ? 0 : callback((struct mail_search_arg *)NULL, context)); \
mail_search_args_foreach(args, \
(mail_search_foreach_callback_t *)callback, context); })
#else
# define mail_search_args_foreach(args, callback, context) \
mail_search_args_foreach(args, \
(mail_search_foreach_callback_t *)callback, context)
#endif
const char *const *
mail_search_args_analyze(struct mail_search_arg *args,
bool *have_headers, bool *have_body);
bool mail_search_args_match_mailbox(struct mail_search_args *args,
const char *vname, char sep);
void mail_search_args_simplify(struct mail_search_args *args);
#endif