aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/camel-mime-message.c24
-rw-r--r--camel/camel-mime-part.c7
-rw-r--r--camel/gmime-utils.c115
-rw-r--r--camel/gmime-utils.h5
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);