aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/camel-mime-message.c2
-rw-r--r--camel/camel-mime-part.c23
-rw-r--r--camel/gmime-content-field.c63
-rw-r--r--camel/gmime-utils.c64
4 files changed, 90 insertions, 62 deletions
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c
index dd984fbeac..fc4d28eced 100644
--- a/camel/camel-mime-message.c
+++ b/camel/camel-mime-message.c
@@ -563,7 +563,7 @@ _set_recipient_list_from_string (CamelMimeMessage *message, GString *recipient_t
{
GList *recipients_list;
CAMEL_LOG (FULL_DEBUG,"CamelMimeMessage::_set_recipient_list_from_string parsing ##%s##\n", recipients_string->str);
- recipients_list = g_string_split (recipients_string, ',', " ", TRIM_STRIP_TRAILING | TRIM_STRIP_LEADING);
+ recipients_list = g_string_split (recipients_string, ',', "\t ", TRIM_STRIP_TRAILING | TRIM_STRIP_LEADING);
g_hash_table_insert (message->recipients, recipient_type, recipients_list);
}
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
index 503e303c06..2d294b6b8b 100644
--- a/camel/camel-mime-part.c
+++ b/camel/camel-mime-part.c
@@ -36,8 +36,11 @@ typedef enum {
HEADER_CONTENT_ID,
HEADER_ENCODING,
HEADER_CONTENT_MD5,
- HEADER_CONTENT_LANGUAGES
+ HEADER_CONTENT_LANGUAGES,
+ HEADER_CONTENT_TYPE
} CamelHeaderType;
+
+
static GHashTable *header_name_table;
@@ -72,6 +75,9 @@ static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *strea
static gboolean _parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *header_value);
+/* loads in a hash table the set of header names we */
+/* recognize and associate them with a unique enum */
+/* identifier (see CamelHeaderType above) */
static void
_init_header_name_table()
{
@@ -81,6 +87,7 @@ _init_header_name_table()
g_hash_table_insert (header_name_table, g_string_new ("Content-id"), (gpointer)HEADER_CONTENT_ID);
g_hash_table_insert (header_name_table, g_string_new ("Content-Transfer-Encoding"), (gpointer)HEADER_ENCODING);
g_hash_table_insert (header_name_table, g_string_new ("Content-MD5"), (gpointer)HEADER_CONTENT_MD5);
+ g_hash_table_insert (header_name_table, g_string_new ("Content-Type"), (gpointer)HEADER_CONTENT_TYPE);
}
@@ -165,7 +172,10 @@ _add_header (CamelMimePart *mime_part, GString *header_name, GString *header_val
gboolean header_exists;
GString *old_header_name;
GString *old_header_value;
-
+
+ /* Try to parse the header pair. If it corresponds to something */
+ /* known, the job is done in the parsing routine. If not, */
+ /* we simply add the header in a raw fashion */
if (CMP_CLASS(mime_part)->parse_header_pair (mime_part, header_name, header_value))
return;
header_exists = g_hash_table_lookup_extended (mime_part->headers, header_name,
@@ -604,6 +614,15 @@ _parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *hea
header_handled = TRUE;
break;
+ case HEADER_CONTENT_TYPE:
+ CAMEL_LOG (FULL_DEBUG,
+ "CamelMimePart::parse_header_pair found HEADER_CONTENT_TYPE: %s\n",
+ header_value->str );
+
+ /* CMP_CLASS(mime_part)->set_content_MD5 (mime_part, header_value); */
+ header_handled = TRUE;
+ break;
+
}
diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c
index 87ceaf39f0..6cd368664e 100644
--- a/camel/gmime-content-field.c
+++ b/camel/gmime-content-field.c
@@ -90,7 +90,7 @@ gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStre
camel_stream_write_strings (stream, "Content-Type: ", content_field->type->str, NULL);
if ((content_field->subtype) && ((content_field->subtype)->str)) {
//fprintf (file, "/%s", content_field->subtype->str);
- camel_stream_write_strings (stream, "/", content_field->type->str, NULL);
+ camel_stream_write_strings (stream, "/", content_field->subtype->str, NULL);
}
/* print all parameters */
g_hash_table_foreach (content_field->parameters, _print_parameter, stream);
@@ -99,3 +99,64 @@ gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStre
}
}
+GMimeContentField *
+gmime_content_field_construct_from_string (GString *string)
+{
+ GMimeContentField *cf;
+ gint first, len;
+ gchar *str;
+ gint i=0;
+ GString *type, *subtype;
+ GString *param_name, *param_value;
+ gboolean param_end;
+
+ g_assert (string);
+ g_assert (string->str);
+
+ cf = g_new (GMimeContentField,1);
+ str = string->str;
+ first = 0;
+ len = string->len;
+ if (!len) return NULL;
+
+ /* find the type */
+ while ( (i<len) && (!strchr ("/;", str[i])) ) i++;
+
+ if (i == 0) return NULL;
+
+ type = g_string_new (strndup (str, i));
+ if (i == len) return (gmime_content_field_new (type, NULL));
+
+ first = i+1;
+ /* find the subtype, if any */
+ if (str[i++] == '/') {
+ while ( (i<len) && (str[i] != ';') ) i++;
+ if (i != first) {
+ subtype = g_string_new (strndup (str+first, i-first));
+ if (first == len) return (gmime_content_field_new (type, subtype));
+ }
+ }
+ first = i+1;
+ cf = gmime_content_field_new (type, subtype);
+
+ /* parse parameters list */
+ param_end = FALSE;
+ do {
+ while ( (i<len) && (str[i] != '=') ) i++;
+ if ((i == len) || (i==first)) param_end = TRUE;
+ else {
+ /* we have found parameter name */
+ param_name = g_string_new (strndup (str+first, i-first));
+ i++;
+ first = i;
+ while ( (i<len) && (str[i] != ';') ) i++;
+ if (i != first) {
+ /** ****/
+ } else {
+
+ }
+ }
+ } while ((!param_end) && (first < len));
+
+ return cf;
+}
diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c
index e2390b1499..917c426801 100644
--- a/camel/gmime-utils.c
+++ b/camel/gmime-utils.c
@@ -127,62 +127,7 @@ _store_header_pair_from_gstring (GHashTable *header_table, GString *header_line)
}
-GHashTable *
-get_header_table_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;
- 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;
-}
-
+
GHashTable *
get_header_table_from_stream (CamelStream *stream)
@@ -218,8 +163,11 @@ get_header_table_from_stream (CamelStream *stream)
else crlf = TRUE;
break;
case ' ':
- case 't':
- if (crlf) crlf = FALSE;
+ case '\t':
+ if (crlf) {
+ crlf = FALSE;
+ next_char = ' ';
+ }
default:
if (!crlf) header_line = g_string_append_c (header_line, next_char);