74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch#ifndef MAIL_SEARCH_MIMEPART_H
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch#define MAIL_SEARCH_MIMEPART_H
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschenum mail_search_mime_arg_type {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_OR,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SUB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* sizes */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SIZE_EQUAL,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SIZE_LARGER,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SIZE_SMALLER,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* part properties */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DESCRIPTION,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DISPOSITION_TYPE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DISPOSITION_PARAM,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_ENCODING,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_ID,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_LANGUAGE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_LOCATION,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_MD5,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* content-type */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_TYPE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SUBTYPE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_PARAM,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* headers */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_HEADER,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* body */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_BODY,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_TEXT,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* message */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_CC,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_BCC,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_FROM,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_IN_REPLY_TO,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_MESSAGE_ID,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_REPLY_TO,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SENDER,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SENTBEFORE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SENTON, /* time must point to beginning of the day */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SENTSINCE,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_SUBJECT,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_TO,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* relations */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_PARENT,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_CHILD,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* position */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DEPTH_EQUAL,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DEPTH_MIN,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_DEPTH_MAX,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_INDEX,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* filename */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_FILENAME_IS,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_FILENAME_CONTAINS,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_FILENAME_BEGINS,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch SEARCH_MIME_FILENAME_ENDS
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch};
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstruct mail_search_mime_arg {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* NOTE: when adding new fields, make sure mail_search_mime_arg_dup_one()
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch and mail_search_mime_arg_one_equals() are updated. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct mail_search_mime_arg *next;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch enum mail_search_mime_arg_type type;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch union {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct mail_search_mime_arg *subargs;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const char *str;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch time_t time;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch uoff_t size;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch unsigned int number;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch } value;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch void *context;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const char *field_name; /* for SEARCH_HEADER* */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch bool match_not:1; /* result = !result */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch bool match_always:1; /* result = 1 always */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch bool nonmatch_always:1; /* result = 0 always */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch int result; /* -1 = unknown, 0 = unmatched, 1 = matched */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch};
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstruct mail_search_mime_part {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct mail_search_mime_arg *args;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch bool simplified:1;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch};
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschtypedef void
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschmail_search_mime_foreach_callback_t(struct mail_search_mime_arg *arg,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch void *context);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Returns TRUE if the two mimepart search keys are fully compatible. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool mail_search_mime_parts_equal(const struct mail_search_mime_part *mpart1,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_part *mpart2);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Same as mail_search_mime_part_equal(), but for individual
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch mail_search_mime_arg structs. All the siblings of arg1 and arg2 are
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch also compared. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool mail_search_mime_arg_equals(const struct mail_search_mime_arg *arg1,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_arg *arg2);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Same as mail_search_mime_arg_equals(), but don't compare siblings. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool mail_search_mime_arg_one_equals(const struct mail_search_mime_arg *arg1,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_arg *arg2);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstruct mail_search_mime_part *
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschmail_search_mime_part_dup(pool_t pool,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_part *mpart);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstruct mail_search_mime_arg *
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschmail_search_mime_arg_dup(pool_t pool,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_arg *arg);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Reset the results in search arguments. match_always is reset only if
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch full_reset is TRUE. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschvoid mail_search_mime_args_reset(struct mail_search_mime_arg *args,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch bool full_reset);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* goes through arguments in list that don't have a result yet.
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch Returns 1 = search matched, 0 = search unmatched, -1 = don't know yet */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschint mail_search_mime_args_foreach(struct mail_search_mime_arg *args,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch mail_search_mime_foreach_callback_t *callback,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch void *context) ATTR_NULL(3);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch#define mail_search_mime_args_foreach(args, callback, context) \
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch mail_search_mime_args_foreach(args + \
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch CALLBACK_TYPECHECK(callback, void (*)( \
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct mail_search_mime_arg *, typeof(context))), \
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch (mail_search_mime_foreach_callback_t *)callback, context)
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Simplify/optimize search arguments. Afterwards all OR/SUB args are
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch guaranteed to have match_not=FALSE. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschvoid mail_search_mime_simplify(struct mail_search_mime_part *args);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Appends MIMEPART search key to the dest string and returns TRUE. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool mail_search_mime_part_to_imap(string_t *dest,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_part *mpart, const char **error_r);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Like mail_search_mime_part_to_imap(), but append only a single MIMEPART
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch key. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool mail_search_mime_arg_to_imap(string_t *dest,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const struct mail_search_mime_arg *arg, const char **error_r);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch#endif