mail-search.c revision 91dff5e44902c234524ef19e1d1b72a4d0513f56
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2002 Timo Sirainen */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainentypedef struct {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic MailSearchArg *search_arg_new(Pool pool, MailSearchArgType type)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic int arg_new(SearchBuildData *data, ImapArg **args,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen MailSearchArg **next_sarg, MailSearchArgType type, int value)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen *next_sarg = sarg = search_arg_new(data->pool, type);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen /* first arg */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen data->error = "Missing parameter for argument";
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen sarg->value.str = str_ucase((*args)->data.str);
2b9e49e4e65e3e2dca38f56971029a3051ccdb99Timo Sirainen /* second arg */
d22301419109ed4a38351715e6760011421dadecTimo Sirainen data->error = "Missing parameter for argument";
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen sarg->value.str = str_ucase((*args)->data.str);
d22301419109ed4a38351715e6760011421dadecTimo Sirainenstatic int search_arg_build(SearchBuildData *data, ImapArg **args,
e5fb952c6d49d3b6bff1746551566202e92947daTimo Sirainen /* NIL not allowed */
2b9e49e4e65e3e2dca38f56971029a3051ccdb99Timo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_SUB);
e5fb952c6d49d3b6bff1746551566202e92947daTimo Sirainen if (!search_arg_build(data, &listargs, subargs))
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* string argument - get the name and jump to next */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* <string> */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* <string> */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* <string> */
547e916f4e6f01af682f8b6e032c337f2a699364Timo Sirainen /* <string> */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* <field-name> <string> */
46219292a55094fa49aae33eee681ed075d30e17Timo Sirainen const char *key;
5b62dea2f88165f3f4d87bba9011343f3ff415ffTimo Sirainen /* NEW == (RECENT UNSEEN) */
57bf90f66f393c2807b2fc543655013f61d1d9e4Timo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_SUB);
57bf90f66f393c2807b2fc543655013f61d1d9e4Timo Sirainen *subargs = search_arg_new(data->pool, SEARCH_RECENT);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* <search-key1> <search-key2> */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen *next_sarg = search_arg_new(data->pool, SEARCH_OR);
7baab0b0b60df7ce9093d0881cd322dff1e79491Timo Sirainen /* <key> OR <key> OR ... <key> - put them all
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen under one SEARCH_OR list. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* OLD == NOT RECENT */
e5fb952c6d49d3b6bff1746551566202e92947daTimo Sirainen /* <string> */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* <string> */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* <string> */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* <message set> */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (*str == '*' || (*str >= '0' && *str <= '9')) {
5539418f448cd9bb38fc085e654861479dd1130bTimo Sirainen /* <message-set> */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen data->error = t_strconcat("Unknown argument ", str, NULL);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo SirainenMailSearchArg *mail_search_args_build(Pool pool, ImapArg *args,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char **error)
2b9e49e4e65e3e2dca38f56971029a3051ccdb99Timo Sirainen /* get the first arg */
2b9e49e4e65e3e2dca38f56971029a3051ccdb99Timo Sirainenvoid mail_search_args_reset(MailSearchArg *args)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (args->type == SEARCH_OR || args->type == SEARCH_SUB)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void search_arg_foreach(MailSearchArg *arg, MailSearchForeachFunc func,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* sublist of conditions */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* OR-list of conditions */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* matched */
void *context)
int result;
result = 0;
return result;
case SEARCH_OR:
case SEARCH_SUB:
case SEARCH_SENTBEFORE:
case SEARCH_SENTON:
case SEARCH_SENTSINCE:
case SEARCH_FROM:
case SEARCH_TO:
case SEARCH_CC:
case SEARCH_BCC:
case SEARCH_SUBJECT:
case SEARCH_IN_REPLY_TO:
case SEARCH_MESSAGE_ID:
case SEARCH_HEADER:
case SEARCH_BODY:
case SEARCH_TEXT: