diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/camel-mime-message.c | 24 | ||||
-rw-r--r-- | camel/camel-mime-part.c | 7 | ||||
-rw-r--r-- | camel/gmime-utils.c | 115 | ||||
-rw-r--r-- | camel/gmime-utils.h | 5 |
4 files changed, 126 insertions, 25 deletions
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c index 270cbcc5ef..13d8f30f8c 100644 --- a/camel/camel-mime-message.c +++ b/camel/camel-mime-message.c @@ -495,28 +495,10 @@ _write_one_recipient_to_file (gpointer key, gpointer value, gpointer user_data) { GString *recipient_type = (GString *)key; GList *recipients = (GList *)value; - GString *current; + // GString *current; FILE *file = (FILE *)user_data; - - if ( (recipient_type) && (recipient_type->str) && - (recipients) ) - { - gboolean first; - - fprintf(file, "%s: ", recipient_type->str); - first = TRUE; - while (recipients) { - current = (GString *)recipients->data; - if ( (current) && (current->str) ) { - if (!first) fprintf(file, ", "); - else first = FALSE; - fprintf(file, "%s", current->str); - } - recipients = g_list_next(recipients); - - } - fprintf(file, "\n"); - } + if ( (recipient_type) && (recipient_type->str) ) + write_header_with_glist_to_file (file, recipient_type->str, recipients); } static void diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index 02932214b9..7be15d20fe 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -1,8 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* camelMimePart.c : Abstract class for a mime_part */ -/** THIS IS MOSTLY AN ABSTRACT CLASS THAT SHOULD HAVE BEEN AN - INTERFACE. **/ /* * @@ -485,6 +483,9 @@ _write_content_to_file (CamelMimePart *mime_part, FILE *file) } + + + static void _write_to_file(CamelDataWrapper *data_wrapper, FILE *file) { @@ -495,6 +496,8 @@ _write_to_file(CamelDataWrapper *data_wrapper, FILE *file) WHPTF (file, "Content-Description", mp->description); WHPTF (file, "Content-MD5", mp->content_MD5); WHPTF (file, "Content-id", mp->content_id); + write_header_with_glist_to_file (file, "Content-Language", mp->content_languages); + write_header_table_to_file (file, mp->headers); fprintf(file,"\n"); if (mp->content) camel_data_wrapper_write_to_file (mp->content, file); diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c index b2ead8310c..f4009e91cf 100644 --- a/camel/gmime-utils.c +++ b/camel/gmime-utils.c @@ -25,7 +25,7 @@ #include "gmime-utils.h" void -gmime_write_header_pair_to_file(FILE* file, gchar* name, GString *value) +gmime_write_header_pair_to_file (FILE* file, gchar* name, GString *value) { g_assert(name); @@ -34,3 +34,116 @@ gmime_write_header_pair_to_file(FILE* file, gchar* name, GString *value) } +static void +_write_one_header_to_file (gpointer key, gpointer value, gpointer user_data) +{ + GString *header_name = (GString *)key; + GString *header_value = (GString *)value; + FILE *file = (FILE *)user_data; + + if ( (header_name) && (header_name->str) && + (header_value) && (header_value->str) ) + fprintf(file, "%s: %s\n", header_name->str, header_value->str); +} + +void +write_header_table_to_file (FILE *file, GHashTable *header_table) +{ + g_hash_table_foreach (header_table, + _write_one_header_to_file, + (gpointer)file); +} + + +void +write_header_with_glist_to_file (FILE *file, gchar *header_name, GList *header_values) +{ + + GString *current; + + if ( (header_name) && (header_values) ) + { + gboolean first; + + fprintf(file, "%s: ", header_name); + first = TRUE; + while (header_values) { + current = (GString *)header_values->data; + if ( (current) && (current->str) ) { + if (!first) fprintf(file, ", "); + else first = FALSE; + fprintf(file, "%s", current->str); + } + header_values = g_list_next(header_values); + } + fprintf(file, "\n"); + } + +} + + + + + +/* * * * * * * * * * * */ +/* scanning functions */ + + +GList * +get_header_lines_from_file (FILE *file) +{ + 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; + GList *header_lines=NULL; + + 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) ) + header_lines = g_list_append (header_lines, header_line); + else + g_string_free (header_line, FALSE); + + } while ( (!end_of_headers) && (!end_of_file) ); + + return header_lines; +} + + diff --git a/camel/gmime-utils.h b/camel/gmime-utils.h index ca175f4120..d7ce1d0843 100644 --- a/camel/gmime-utils.h +++ b/camel/gmime-utils.h @@ -34,8 +34,11 @@ extern "C" { #include <glib.h> #include <stdio.h> -void gmime_write_header_pair_to_file(FILE* file, gchar* name, GString *value); +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); +GList *get_header_lines_from_file (FILE *file); |