]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Add message_part_is_equal_ex() allowing additional checks on parts
authorMarco Bettini <marco.bettini@open-xchange.com>
Tue, 5 Jul 2022 15:32:22 +0000 (15:32 +0000)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Wed, 6 Jul 2022 20:47:38 +0000 (20:47 +0000)
src/lib-mail/message-part.c
src/lib-mail/message-part.h

index 340dbbb95a608cbf1628975575f673b28632a981..bf7922a043a9a541e9a33baaa0d911a2c984c3e6 100644 (file)
@@ -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);
+}
index d8f99ab5d7b13bc51606b5642ff64d59a33fbb41..a8b6cdbcd5f85d36ff203c8baa143a4800959cac 100644 (file)
@@ -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