#include "utc-offset.h"
#include "str.h"
#include "time-util.h"
+#include "imap-match.h"
#include "message-address.h"
#include "message-date.h"
#include "message-search.h"
if (strcasecmp(str, "INBOX") == 0)
return strcasecmp(arg->value.str, "INBOX") == 0;
return strcmp(str, arg->value.str) == 0;
+ case SEARCH_MAILBOX_GLOB:
+ if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME,
+ &str) < 0)
+ return -1;
+ return imap_match(arg->value.mailbox_glob, str) == IMAP_MATCH_YES;
default:
return -1;
}
case SEARCH_TEXT_FAST:
case SEARCH_GUID:
case SEARCH_MAILBOX:
+ case SEARCH_MAILBOX_GLOB:
return TRUE;
}
return FALSE;
static struct mail_search_arg *
human_search_mailbox(struct mail_search_build_context *ctx)
{
- return mail_search_build_str(ctx, SEARCH_MAILBOX);
+ return mail_search_build_str(ctx, SEARCH_MAILBOX_GLOB);
}
static const struct mail_search_register_arg human_register_args[] = {
}
CALLBACK_STR(x_guid, SEARCH_GUID);
-CALLBACK_STR(x_mailbox, SEARCH_MAILBOX);
+CALLBACK_STR(x_mailbox, SEARCH_MAILBOX_GLOB);
const struct mail_search_register_arg imap_register_args[] = {
/* argument set operations */
#include "lib.h"
#include "array.h"
-#include "buffer.h"
+#include "imap-match.h"
#include "mail-index.h"
#include "mail-storage.h"
+#include "mail-namespace.h"
#include "mail-search-build.h"
#include "mail-search.h"
keywords);
break;
+ case SEARCH_MAILBOX_GLOB: {
+ struct mail_namespace *ns =
+ mailbox_get_namespace(args->box);
+
+ arg->value.mailbox_glob =
+ imap_match_init(default_pool, arg->value.str,
+ TRUE, ns->sep);
+ break;
+ }
case SEARCH_INTHREAD:
thread_args = arg->value.search_args;
if (thread_args == NULL) {
break;
mailbox_keywords_unref(args->box, &arg->value.keywords);
break;
+ case SEARCH_MAILBOX_GLOB:
+ if (arg->value.mailbox_glob == NULL)
+ break;
+
+ imap_match_deinit(&arg->value.mailbox_glob);
+ break;
case SEARCH_INTHREAD:
i_assert(arg->value.search_args->refcount > 0);
if (args->refcount == 0 &&
case SEARCH_TEXT_FAST:
case SEARCH_GUID:
case SEARCH_MAILBOX:
+ case SEARCH_MAILBOX_GLOB:
new_arg->value.str = p_strdup(pool, arg->value.str);
break;
-
case SEARCH_MODSEQ:
new_arg->value.modseq =
p_new(pool, struct mail_search_modseq, 1);
case SEARCH_TEXT_FAST:
case SEARCH_GUID:
case SEARCH_MAILBOX:
+ case SEARCH_MAILBOX_GLOB:
/* don't bother doing case-insensitive comparison. it must not
be done for guid/mailbox, and for others we should support
full i18n case-insensitivity (or the active comparator
SEARCH_MODSEQ,
SEARCH_INTHREAD,
SEARCH_GUID,
- SEARCH_MAILBOX
+ SEARCH_MAILBOX,
+ SEARCH_MAILBOX_GLOB
};
enum mail_search_date_type {
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;
mail_search_args_analyze(struct mail_search_arg *args,
bool *have_headers, bool *have_body);
-/* Simplify/optimize search arguments */
+/* Simplify/optimize search arguments. Afterwards all OR/SUB args are
+ guaranteed to have not=FALSE. */
void mail_search_args_simplify(struct mail_search_args *args);
#endif