#include "notmuch-private.h"
+#include <gmime/gmime.h>
+
#include <glib.h> /* GHashTable */
typedef struct {
const char *header_desired)
{
int contains;
- char *header, *value;
+ char *header, *decoded_value;
const char *s, *colon;
int match;
+ static int initialized = 0;
+
+ if (! initialized) {
+ g_mime_init (0);
+ initialized = 1;
+ }
message->parsing_started = 1;
else
contains = g_hash_table_lookup_extended (message->headers,
header_desired, NULL,
- (gpointer *) &value);
+ (gpointer *) &decoded_value);
- if (contains && value)
- return value;
+ if (contains && decoded_value)
+ return decoded_value;
if (message->parsing_finished)
return NULL;
else
match = (strcasecmp (header, header_desired) == 0);
- value = xstrdup (message->value.str);
+ decoded_value = g_mime_utils_header_decode_text (message->value.str);
- g_hash_table_insert (message->headers, header, value);
+ g_hash_table_insert (message->headers, header, decoded_value);
if (match)
- return value;
+ return decoded_value;
}
if (message->line)
return NULL;
}
-
-size_t
-notmuch_message_file_get_header_size (notmuch_message_file_t *message)
-{
- if (! message->parsing_finished)
- notmuch_message_file_get_header (message, NULL);
-
- if (! message->parsing_finished)
- INTERNAL_ERROR ("Parsing for NULL header did not force parsing to finish.\n");
-
- return message->header_size;
-}
-
-const char *
-notmuch_message_file_get_all_headers (notmuch_message_file_t *message)
-{
- char *headers = NULL;
- size_t header_size = notmuch_message_file_get_header_size (message);
-
- if (header_size == 0)
- return "";
-
- headers = talloc_size (message, header_size + 1);
- if (unlikely (headers == NULL))
- return NULL;
-
- rewind (message->file);
- if (fread (headers, 1, header_size, message->file) != header_size) {
- fprintf (stderr, "Error: Short read occurred trying to read message header.\n");
- talloc_free (headers);
- return NULL;
- }
-
- headers[header_size] = '\0';
-
- return headers;
-}