aboutsummaryrefslogtreecommitdiff
path: root/lib/message-file.c
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2017-08-27 15:54:50 -0300
committerDavid Bremner <david@tethera.net>2017-08-27 15:54:50 -0300
commita565f71e1c160431ff99f088bc8fc08d367603a2 (patch)
tree2f7c33d7296e15b2c33f6ede436d412c812c3f15 /lib/message-file.c
parent00f87faf4bc19e90e19b8b27c13845efb6a68152 (diff)
parent6354745dcd6505c5f12c185a29c25a8d1c240595 (diff)
Merge tag 'debian/0.25-6' into debian/stretch-backports
Diffstat (limited to 'lib/message-file.c')
-rw-r--r--lib/message-file.c91
1 files changed, 66 insertions, 25 deletions
diff --git a/lib/message-file.c b/lib/message-file.c
index db18b163..d7acf0d5 100644
--- a/lib/message-file.c
+++ b/lib/message-file.c
@@ -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,