2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen new_arg = p_new(pool, struct mail_search_mime_arg, 1);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen new_arg->nonmatch_always = arg->nonmatch_always;
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen mail_search_mime_arg_dup(pool, arg->value.subargs);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen new_arg->field_name = p_strdup(pool, arg->field_name);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* fall through */
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen mail_search_mime_arg_dup(pool, arg->value.subargs);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen struct mail_search_mime_arg *new_arg = NULL, **dest = &new_arg;
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen *dest = mail_search_mime_arg_dup_one(pool, arg);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_mpart = p_new(pool, struct mail_search_mime_part, 1);
8b16d3b00f051401c97568697ccdbba48663759aTimo Sirainen new_mpart->args = mail_search_mime_arg_dup(pool, mpart->args);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainenvoid mail_search_mime_args_reset(struct mail_search_mime_arg *args,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen if (args->type == SEARCH_MIME_OR || args->type == SEARCH_MIME_SUB)
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen mail_search_mime_args_reset(args->value.subargs, full_reset);
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainenstatic void search_mime_arg_foreach(struct mail_search_mime_arg *arg,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen mail_search_mime_foreach_callback_t *callback,
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen /* sublist of conditions */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen search_mime_arg_foreach(subarg, callback, context);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* didn't match */
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen /* OR-list of conditions */
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen search_mime_arg_foreach(subarg, callback, context);
4fda77c9e9fc68feb292c4dacae1fac49dd08165Timo Sirainen /* matched */
ad404d294fedf792619aed432ed8de5174e9ce7cTimo Sirainen /* just a single condition */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint mail_search_mime_args_foreach(struct mail_search_mime_arg *args,
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen mail_search_mime_foreach_callback_t *callback,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen search_mime_arg_foreach(args, callback, context);
009217abb57a24a4076092e8e4e165545747839eStephan Bosch /* didn't match */
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainenbool mail_search_mime_arg_one_equals(const struct mail_search_mime_arg *arg1,
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen return mail_search_mime_arg_equals(arg1->value.subargs,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen if (strcasecmp(arg1->field_name, arg2->field_name) != 0)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* fall through */
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen /* don't bother doing case-insensitive comparison. we should support
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen full i18n case-insensitivity (or the active comparator
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen in future). */
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen return strcmp(arg1->value.str, arg2->value.str) == 0;
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainen return mail_search_mime_arg_equals(arg1->value.subargs,
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen return arg1->value.number == arg2->value.number;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainenbool mail_search_mime_arg_equals(const struct mail_search_mime_arg *arg1,
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen if (!mail_search_mime_arg_one_equals(arg1, arg2))
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainenbool mail_search_mime_parts_equal(const struct mail_search_mime_part *mpart1,
a4502a71879d6018bd2c64f13614bb619911dd9fTimo Sirainen i_assert(mpart1->simplified == mpart2->simplified);
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen return mail_search_mime_arg_equals(mpart1->args, mpart2->args);
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainenvoid mail_search_mime_simplify(struct mail_search_mime_part *mpart)
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen // FIXME: implement and use
28789c7ce1aa66ab21798bfb73ec64308b9a4de8Timo Sirainenmail_search_mime_subargs_to_imap(string_t *dest,
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen for (arg = args; arg != NULL; arg = arg->next) {
a5ddfd7a8b473f73135b93d5e081e470a87f0f7eTimo Sirainen if (!mail_search_mime_arg_to_imap(dest, arg, error_r))
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainenmail_search_mime_arg_to_imap_date(string_t *dest,
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenbool mail_search_mime_arg_to_imap(string_t *dest,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen const struct mail_search_mime_arg *arg, const char **error_r)
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainen str_printfa(dest, "SIZE %"PRIuUOFF_T, arg->value.size);
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_printfa(dest, "SIZE LARGER %"PRIuUOFF_T, arg->value.size);
892e25e1c0caad62ced087d9eba2741a59e3d9ceTimo Sirainen str_printfa(dest, "SIZE SMALLER %"PRIuUOFF_T, arg->value.size);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTBEFORE can't be written as IMAP MIMEPART key "
7bccaece91a0b1bc61111c30443d6bad6b22c6d0Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTON can't be written as IMAP MIMEPART key "
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen if (!mail_search_mime_arg_to_imap_date(dest, arg)) {
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "SENTSINCE can't be written as IMAP MIMEPART key "
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen "for timestamp %"PRIdTIME_T, arg->value.time);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH %u", arg->value.number);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH MIN %u", arg->value.number);
11ee3b40320a31669bd717fecbe1e332dad4fd84Timo Sirainen str_printfa(dest, "DEPTH MAX %u", arg->value.number);
3c3001681da75afc68578a180ec8f8b2d6dfacfaTimo Sirainen str_printfa(dest, "INDEX %u", arg->value.number);
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainenbool mail_search_mime_part_to_imap(string_t *dest,
b2024fa4e6ed39f9b5b6bb6c051f6d535fc0e011Timo Sirainen const struct mail_search_mime_part *mpart, const char **error_r)
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen if (!mail_search_mime_arg_to_imap(dest, mpart->args, error_r))
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen for (arg = mpart->args; arg != NULL; arg = arg->next) {