From: Marco Bettini Date: Tue, 5 Jul 2022 15:32:22 +0000 (+0000) Subject: lib-mail: Add message_part_is_equal_ex() allowing additional checks on parts X-Git-Tag: 2.4.0~3800 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=44b32a742ec2fe634532594eea176b5ba2e7a2eb;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: Add message_part_is_equal_ex() allowing additional checks on parts --- diff --git a/src/lib-mail/message-part.c b/src/lib-mail/message-part.c index 340dbbb95a..bf7922a043 100644 --- a/src/lib-mail/message-part.c +++ b/src/lib-mail/message-part.c @@ -60,8 +60,9 @@ message_part_by_idx(struct message_part *parts, unsigned int idx) return message_sub_part_by_idx(parts, idx); } -bool message_part_is_equal(const struct message_part *p1, - const struct message_part *p2) +bool message_part_is_equal_ex(const struct message_part *p1, + const struct message_part *p2, + message_part_comparator_t *equals_ex) { /* This cannot be p1 && p2, because then we would return TRUE when either part is NULL, and we should return FALSE */ @@ -93,6 +94,9 @@ bool message_part_is_equal(const struct message_part *p1, p1->flags != p2->flags) return FALSE; + if (equals_ex != NULL && !equals_ex(p1, p2)) + return FALSE; + /* Move forward */ p1 = p1->next; p2 = p2->next; @@ -101,3 +105,9 @@ bool message_part_is_equal(const struct message_part *p1, /* Parts are equal */ return TRUE; } + +bool message_part_is_equal(const struct message_part *p1, + const struct message_part *p2) ATTR_NULL(1, 2) +{ + return message_part_is_equal_ex(p1, p2, NULL); +} diff --git a/src/lib-mail/message-part.h b/src/lib-mail/message-part.h index d8f99ab5d7..a8b6cdbcd5 100644 --- a/src/lib-mail/message-part.h +++ b/src/lib-mail/message-part.h @@ -54,6 +54,9 @@ unsigned int message_part_to_idx(const struct message_part *part); struct message_part * message_part_by_idx(struct message_part *parts, unsigned int idx); +typedef bool message_part_comparator_t( + const struct message_part *p1, const struct message_part *p2); + /* Returns TRUE when message parts are considered equal. Equality is determined to be TRUE, when @@ -64,4 +67,10 @@ message_part_by_idx(struct message_part *parts, unsigned int idx); bool message_part_is_equal(const struct message_part *p1, const struct message_part *p2) ATTR_NULL(1, 2); +/* Same as message_part_is_equal(), but it allows to invoke an additional + comparator on each incountered part */ +bool message_part_is_equal_ex(const struct message_part *p1, + const struct message_part *p2, + message_part_comparator_t *equals_ex) ATTR_NULL(1, 2, 3); + #endif