diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/camel-mime-part.c | 37 | ||||
-rw-r--r-- | camel/camel-mime-part.h | 6 | ||||
-rw-r--r-- | camel/gmime-content-field.c | 81 | ||||
-rw-r--r-- | camel/gmime-content-field.h | 3 |
4 files changed, 105 insertions, 22 deletions
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index 2d294b6b8b..489e6d0d27 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -68,6 +68,8 @@ static void _set_content_languages (CamelMimePart *mime_part, GList *content_lan static GList *_get_content_languages (CamelMimePart *mime_part); static void _set_header_lines (CamelMimePart *mime_part, GList *header_lines); static GList *_get_header_lines (CamelMimePart *mime_part); +static void _set_content_type (CamelMimePart *mime_part, GString *content_type); +static GString *_get_content_type (CamelMimePart *mime_part); static CamelDataWrapper *_get_content_object(CamelMimePart *mime_part); static void _write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream); @@ -120,6 +122,8 @@ camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class) camel_mime_part_class->get_header_lines=_get_header_lines; camel_mime_part_class->parse_header_pair = _parse_header_pair; camel_mime_part_class->get_content_object = _get_content_object; + camel_mime_part_class->set_content_type = _set_content_type; + camel_mime_part_class->get_content_type = _get_content_type; @@ -133,6 +137,7 @@ camel_mime_part_init (gpointer object, gpointer klass) CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object); camel_mime_part->headers = g_hash_table_new (g_string_hash, g_string_equal_for_hash); + camel_mime_part->content_type_field = gmime_content_field_new (NULL, NULL); } @@ -491,6 +496,38 @@ camel_mime_part_get_content_object(CamelMimePart *mime_part) return CMP_CLASS(mime_part)->get_content_object (mime_part); } + +static void +_set_content_type (CamelMimePart *mime_part, GString *content_type) +{ + g_assert (content_type); + gmime_content_field_construct_from_string (mime_part->content_type_field, content_type); +} + +void +camel_mime_part_set_content_type (CamelMimePart *mime_part, GString *content_type) +{ + CMP_CLASS(mime_part)->set_content_type (mime_part, content_type); +} + +static GString * +_get_content_type (CamelMimePart *mime_part) +{ + GString *mime_type; + + mime_type = gmime_content_field_get_mime_type (mime_part->content_type_field); + return mime_type; +} + +static GString * +camel_mime_part_get_content_type (CamelMimePart *mime_part) +{ + return CMP_CLASS(mime_part)->get_content_type (mime_part); +} + + + +/**********************************************************************/ #ifdef WHPT #warning : WHPT is already defined !!!!!! #endif diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h index 87ed6e7a4f..8ab5fc152c 100644 --- a/camel/camel-mime-part.h +++ b/camel/camel-mime-part.h @@ -58,6 +58,7 @@ typedef struct GString *encoding; GString *filename; GList *header_lines; + GMimeContentField *content_type_field; CamelDataWrapper *content; /* part real content */ @@ -88,6 +89,9 @@ typedef struct { GList * (*get_content_languages) (CamelMimePart *mime_part); void (*set_header_lines) (CamelMimePart *mime_part, GList *header_lines); GList * (*get_header_lines) (CamelMimePart *mime_part); + void (*set_content_type) (CamelMimePart *mime_part, GString *content_type); + GString * (*get_content_type) (CamelMimePart *mime_part); + gboolean (*parse_header_pair) (CamelMimePart *mime_part, GString *header_name, GString *header_value); CamelDataWrapper * (*get_content_object) (CamelMimePart *mime_part); @@ -117,6 +121,8 @@ void camel_mime_part_set_content_languages (CamelMimePart *mime_part, GList *con GList *camel_mime_part_get_content_languages (CamelMimePart *mime_part); void camel_mime_part_set_header_lines (CamelMimePart *mime_part, GList *header_lines); GList *camel_mime_part_get_header_lines (CamelMimePart *mime_part); +void camel_mime_part_set_content_type (CamelMimePart *mime_part, GString *content_type); +static GString *camel_mime_part_get_content_type (CamelMimePart *mime_part); #ifdef __cplusplus } diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c index 6cd368664e..a22bbe2979 100644 --- a/camel/gmime-content-field.c +++ b/camel/gmime-content-field.c @@ -27,6 +27,7 @@ #include "gmime-content-field.h" #include "gstring-util.h" + GMimeContentField * gmime_content_field_new (GString *type, GString *subtype) { @@ -41,7 +42,7 @@ gmime_content_field_new (GString *type, GString *subtype) void -gmime_content_field_set_parameter(GMimeContentField *content_field, GString *attribute, GString *value) +gmime_content_field_set_parameter (GMimeContentField *content_field, GString *attribute, GString *value) { gboolean attribute_exists; GString *old_attribute; @@ -86,23 +87,34 @@ gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStre { if (!content_field) return; if ((content_field->type) && ((content_field->type)->str)) { - //fprintf (file, "Content-Type: %s", content_field->type->str); 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->subtype->str, NULL); } /* print all parameters */ g_hash_table_foreach (content_field->parameters, _print_parameter, stream); - //fprintf (file, "\n"); camel_stream_write_string (stream, "\n"); } } -GMimeContentField * -gmime_content_field_construct_from_string (GString *string) +GString * +gmime_content_field_get_mime_type (GMimeContentField *content_field) +{ + GString *mime_type; + + if (!content_field->type) return NULL; + mime_type = g_string_clone (content_field->type); + if (content_field->subtype) { + g_string_append_c (mime_type, '/'); + g_string_append_g_string (mime_type, content_field->subtype); + } + return mime_type; +} + + +void +gmime_content_field_construct_from_string (GMimeContentField *content_field, GString *string) { - GMimeContentField *cf; gint first, len; gchar *str; gint i=0; @@ -113,31 +125,38 @@ gmime_content_field_construct_from_string (GString *string) g_assert (string); g_assert (string->str); - cf = g_new (GMimeContentField,1); + if (content_field->type) g_string_free (content_field->type, FALSE); + if (content_field->subtype) g_string_free (content_field->subtype, FALSE); + str = string->str; first = 0; len = string->len; - if (!len) return NULL; + if (!len) return; /* find the type */ while ( (i<len) && (!strchr ("/;", str[i])) ) i++; - if (i == 0) return NULL; + if (i == 0) return; + + type = g_string_new (g_strndup (str, i)); + content_field->type = type; - type = g_string_new (strndup (str, i)); - if (i == len) return (gmime_content_field_new (type, NULL)); + if (i == len) { + content_field->subtype = NULL; + return; + } 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)); + subtype = g_string_new (g_strndup (str+first, i-first)); + content_field->subtype = subtype; + if (i == len) return; } } first = i+1; - cf = gmime_content_field_new (type, subtype); /* parse parameters list */ param_end = FALSE; @@ -146,17 +165,35 @@ gmime_content_field_construct_from_string (GString *string) if ((i == len) || (i==first)) param_end = TRUE; else { /* we have found parameter name */ - param_name = g_string_new (strndup (str+first, i-first)); + param_name = g_string_new (g_strndup (str+first, i-first)); i++; first = i; + /* Let's find parameter value */ while ( (i<len) && (str[i] != ';') ) i++; - if (i != first) { - /** ****/ - } else { - - } + if (i != first) param_value = g_string_new (g_strndup (str+first, i-first)); + else param_value = g_string_new (""); + gmime_content_field_set_parameter (content_field, param_name, param_value); + i++; + first = i; } } while ((!param_end) && (first < len)); - return cf; +} + + +static void +_free_parameter (gpointer name, gpointer value, gpointer user_data) +{ + g_string_free (name, FALSE); + g_string_free (value, FALSE); +} + +void +gmime_content_field_free (GMimeContentField *content_field) +{ + g_hash_table_foreach (content_field->parameters, _free_parameter, NULL); + g_string_free (content_field->type, FALSE); + g_string_free (content_field->subtype, FALSE); + g_hash_table_destroy (content_field->parameters); + g_free (content_field); } diff --git a/camel/gmime-content-field.h b/camel/gmime-content-field.h index 2711deabb9..7fe66bf7a9 100644 --- a/camel/gmime-content-field.h +++ b/camel/gmime-content-field.h @@ -46,6 +46,9 @@ typedef struct { GMimeContentField *gmime_content_field_new (GString *type, GString *subtype); void gmime_content_field_set_parameter(GMimeContentField *content_field, GString *attribute, GString *value); void gmime_content_field_write_to_stream (GMimeContentField *content_field, CamelStream *stream); +void gmime_content_field_construct_from_string (GMimeContentField *content_field, GString *string); +void gmime_content_field_free (GMimeContentField *content_field); +GString * gmime_content_field_get_mime_type (GMimeContentField *content_field); #ifdef __cplusplus |