]> git.notmuchmail.org Git - notmuch/blobdiff - lib/message-file.c
lib: add version of _n_m_f_get_combinded_header for gmime 3.0
[notmuch] / lib / message-file.c
index db18b1630bfd0468fc967c684b33cb186b925a34..d7acf0d5b4e2739eac56756c1ca35f30eeacf424 100644 (file)
@@ -201,6 +201,38 @@ _notmuch_message_file_get_mime_message (notmuch_message_file_t *message,
  *
  * Return NULL on errors, empty string for non-existing headers.
  */
+
+static char *
+_extend_header (char *combined, const char *value) {
+    char *decoded;
+
+    decoded = g_mime_utils_header_decode_text (value);
+    if (! decoded) {
+       if (combined) {
+           g_free (combined);
+           combined = NULL;
+       }
+       goto DONE;
+    }
+
+    if (combined) {
+       char *tmp = g_strdup_printf ("%s %s", combined, decoded);
+       g_free (decoded);
+       g_free (combined);
+       if (! tmp) {
+           combined = NULL;
+           goto DONE;
+       }
+
+       combined = tmp;
+    } else {
+       combined = decoded;
+    }
+ DONE:
+    return combined;
+}
+
+#if (GMIME_MAJOR_VERSION < 3)
 static char *
 _notmuch_message_file_get_combined_header (notmuch_message_file_t *message,
                                           const char *header)
@@ -222,37 +254,13 @@ _notmuch_message_file_get_combined_header (notmuch_message_file_t *message,
 
     do {
        const char *value;
-       char *decoded;
-
        if (strcasecmp (g_mime_header_iter_get_name (iter), header) != 0)
            continue;
 
        /* Note that GMime retains ownership of value... */
        value = g_mime_header_iter_get_value (iter);
 
-       /* ... while decoded needs to be freed with g_free(). */
-       decoded = g_mime_utils_header_decode_text (value);
-       if (! decoded) {
-           if (combined) {
-               g_free (combined);
-               combined = NULL;
-           }
-           goto DONE;
-       }
-
-       if (combined) {
-           char *tmp = g_strdup_printf ("%s %s", combined, decoded);
-           g_free (decoded);
-           g_free (combined);
-           if (! tmp) {
-               combined = NULL;
-               goto DONE;
-           }
-
-           combined = tmp;
-       } else {
-           combined = decoded;
-       }
+       combined = _extend_header (combined, value);
     } while (g_mime_header_iter_next (iter));
 
     /* Return empty string for non-existing headers. */
@@ -264,6 +272,39 @@ _notmuch_message_file_get_combined_header (notmuch_message_file_t *message,
 
     return combined;
 }
+#else
+static char *
+_notmuch_message_file_get_combined_header (notmuch_message_file_t *message,
+                                          const char *header)
+{
+    char *combined = NULL;
+    GMimeHeaderList *headers;
+
+    headers = g_mime_object_get_header_list (GMIME_OBJECT (message->message));
+    if (! headers)
+       return NULL;
+
+
+    for (int i=0; i < g_mime_header_list_get_count (headers); i++) {
+       const char *value;
+       GMimeHeader *g_header = g_mime_header_list_get_header_at (headers, i);
+
+       if (strcasecmp (g_mime_header_get_name (g_header), header) != 0)
+           continue;
+
+       /* GMime retains ownership of value, we hope */
+       value = g_mime_header_get_value (g_header);
+
+       combined = _extend_header (combined, value);
+    }
+
+    /* Return empty string for non-existing headers. */
+    if (! combined)
+       combined = g_strdup ("");
+
+    return combined;
+}
+#endif
 
 const char *
 _notmuch_message_file_get_header (notmuch_message_file_t *message,