diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/gmime-utils.c | 57 | ||||
-rw-r--r-- | camel/gmime-utils.h | 2 |
2 files changed, 59 insertions, 0 deletions
diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c index 92d04d5bf8..b2d95e439e 100644 --- a/camel/gmime-utils.c +++ b/camel/gmime-utils.c @@ -171,3 +171,60 @@ get_header_table_from_file (FILE *file) } +GHashTable * +get_header_table_from_stream (GnomeStream *stream) +{ + int next_char; + + gboolean crlf = FALSE; + gboolean end_of_header_line = FALSE; + gboolean end_of_headers = FALSE; + gboolean end_of_file = FALSE; + GString *header_line=NULL; + GHashTable *header_table; + + header_table = g_hash_table_new (g_string_hash, g_string_equal_for_hash); + //next_char = fgetc (file); + do { + header_line = g_string_new(""); + end_of_header_line = FALSE; + crlf = FALSE; + + /* read a whole header line */ + do { + switch (next_char) { + case EOF: + end_of_file=TRUE; + end_of_header_line = TRUE; + break; + case '\n': /* a blank line means end of headers */ + if (crlf) { + end_of_headers=TRUE; + end_of_header_line = TRUE; + } + else crlf = TRUE; + break; + case ' ': + case 't': + if (crlf) crlf = FALSE; + + default: + if (!crlf) header_line = g_string_append_c (header_line, next_char); + else end_of_header_line = TRUE; + } + /* if we have read a whole header line, we have also read + the first character of the next line to be sure the + crlf was not followed by a space or a tab char */ + //if (!end_of_header_line) next_char = fgetc (file); + + } while ( !end_of_header_line ); + if ( strlen(header_line->str) ) + _store_header_pair_from_gstring (header_table, header_line); + g_string_free (header_line, FALSE); + + } while ( (!end_of_headers) && (!end_of_file) ); + + return header_table; +} + + diff --git a/camel/gmime-utils.h b/camel/gmime-utils.h index dafc5ca18a..1c2097434f 100644 --- a/camel/gmime-utils.h +++ b/camel/gmime-utils.h @@ -33,12 +33,14 @@ extern "C" { #include <glib.h> #include <stdio.h> +#include <bonobo/gnome-stream.h> void gmime_write_header_pair_to_file (FILE* file, gchar* name, GString *value); void write_header_table_to_file (FILE *file, GHashTable *header_table); void write_header_with_glist_to_file (FILE *file, gchar *header_name, GList *header_values); GHashTable *get_header_table_from_file (FILE *file); +GHashTable *get_header_table_from_stream (GnomeStream *stream); |