diff options
Diffstat (limited to 'camel/camel-mime-part.c')
-rw-r--r-- | camel/camel-mime-part.c | 84 |
1 files changed, 50 insertions, 34 deletions
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index ca4f71dc31..67be67d248 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -39,9 +39,9 @@ #include "hash-table-utils.h" #include "camel-stream-mem.h" #include "camel-mime-part-utils.h" -#include "gmime-base64.h" #include "camel-seekable-substream.h" -#include "camel-stream-b64.h" +#include "camel-stream-filter.h" +#include "camel-mime-filter-basic.h" typedef enum { @@ -237,13 +237,12 @@ my_finalize (GtkObject *object) { CamelMimePart *mime_part = CAMEL_MIME_PART (object); -#warning do something for (mime_part->disposition) which should not be a GMimeContentField - g_free (mime_part->description); g_free (mime_part->content_id); g_free (mime_part->content_MD5); string_list_free (mime_part->content_languages); g_free (mime_part->filename); + header_disposition_unref(mime_part->disposition); if (mime_part->header_lines) string_list_free (mime_part->header_lines); if (mime_part->content_type) gmime_content_field_unref (mime_part->content_type); @@ -313,15 +312,8 @@ camel_mime_part_get_description (CamelMimePart *mime_part) static void my_set_disposition (CamelMimePart *mime_part, const gchar *disposition) { -#warning Do not use MimeContentfield here !!! - - if (mime_part->disposition) { - g_free (mime_part->disposition->type); - g_free (mime_part->disposition); - } - - mime_part->disposition = g_new0 (GMimeContentField,1); - mime_part->disposition->type = g_strdup (disposition); + header_disposition_unref(mime_part->disposition); + mime_part->disposition = header_disposition_decode(disposition); } @@ -340,7 +332,7 @@ static const gchar * my_get_disposition (CamelMimePart *mime_part) { if (!mime_part->disposition) return NULL; - return (mime_part->disposition)->type; + return (mime_part->disposition)->disposition; } @@ -605,6 +597,7 @@ my_get_content_object (CamelMedium *medium) CamelMimePart *mime_part = CAMEL_MIME_PART (medium); CamelStream *stream; CamelStream *decoded_stream; + CamelMimeFilter *mf = NULL; if (!medium->content ) { stream = mime_part->content_input_stream; @@ -615,16 +608,23 @@ my_get_content_object (CamelMedium *medium) case CAMEL_MIME_PART_ENCODING_DEFAULT: case CAMEL_MIME_PART_ENCODING_7BIT: case CAMEL_MIME_PART_ENCODING_8BIT: + break; + case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: + mf = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC); break; case CAMEL_MIME_PART_ENCODING_BASE64: - decoded_stream = camel_stream_b64_new_with_input_stream (stream); - camel_stream_b64_set_mode (CAMEL_STREAM_B64 (decoded_stream), - CAMEL_STREAM_B64_DECODER); + mf = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC); break; } + if (mf) { + decoded_stream = (CamelStream *)camel_stream_filter_new_with_stream (stream); + camel_stream_filter_add((CamelStreamFilter *)decoded_stream, mf); + gtk_object_unref((GtkObject *)mf); + } + camel_mime_part_construct_content_from_stream (mime_part, decoded_stream); } @@ -651,8 +651,8 @@ my_write_content_to_stream (CamelMimePart *mime_part, CamelStream *stream) { CamelMedium *medium; CamelStream *wrapper_stream; - CamelStreamB64 *stream_b64; - + CamelStream *stream_encode; + CamelMimeFilter *mf = NULL; CamelDataWrapper *content; g_assert (mime_part); @@ -672,18 +672,11 @@ my_write_content_to_stream (CamelMimePart *mime_part, CamelStream *stream) case CAMEL_MIME_PART_ENCODING_8BIT: camel_data_wrapper_write_to_stream (content, stream); break; + case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: + mf = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_ENC); + break; case CAMEL_MIME_PART_ENCODING_BASE64: - /* encode the data wrapper output stream in base 64 ... */ - wrapper_stream = camel_data_wrapper_get_output_stream (content); - camel_stream_reset (wrapper_stream); - stream_b64 = CAMEL_STREAM_B64 (camel_stream_b64_new_with_input_stream (wrapper_stream)); - camel_stream_b64_set_mode (stream_b64, CAMEL_STREAM_B64_ENCODER); - - /* ... and write it to the output stream in a blocking way */ - camel_stream_b64_write_to_stream (stream_b64, stream); - - /* now free the intermediate b64 stream */ - gtk_object_unref (GTK_OBJECT (stream_b64)); + mf = (CamelMimeFilter *)camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_ENC); break; default: camel_data_wrapper_write_to_stream (content, stream); @@ -691,6 +684,21 @@ my_write_content_to_stream (CamelMimePart *mime_part, CamelStream *stream) camel_mime_part_encoding_to_string (mime_part->encoding)); } + + if (mf) { + /* encode the data wrapper output stream in the filtered encoding */ + wrapper_stream = camel_data_wrapper_get_output_stream (content); + camel_stream_reset (wrapper_stream); + stream_encode = camel_stream_filter_new_with_stream (wrapper_stream); + camel_stream_filter_add((CamelStreamFilter *)stream_encode, mf); + + /* ... and write it to the output stream in a blocking way */ + camel_stream_write_to_stream (stream_encode, stream); + + /* now free the intermediate b64 stream */ + gtk_object_unref (GTK_OBJECT (stream_encode)); + gtk_object_unref((GtkObject *)mf); + } } @@ -703,7 +711,18 @@ my_write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream) CamelMimePart *mp = CAMEL_MIME_PART (data_wrapper); CamelMedium *medium = CAMEL_MEDIUM (data_wrapper); - gmime_content_field_write_to_stream(mp->disposition, stream); + if (mp->disposition) { + struct _header_param *p; + + camel_stream_write_strings(stream, "Content-Disposition: ", mp->disposition->disposition, NULL); + /* FIXME: use proper quoting rules here ... */ + p = mp->disposition->params; + while (p) { + camel_stream_write_strings (stream, ";\n ", p->name, "= \"", p->value, "\"", NULL); + p = p->next; + } + camel_stream_write_string (stream, "\n"); + } WHPT (stream, "Content-Transfer-Encoding", camel_mime_part_encoding_to_string (mp->encoding)); WHPT (stream, "Content-Description", mp->description); @@ -848,9 +867,6 @@ my_get_output_stream (CamelDataWrapper *data_wrapper) return input_stream; case CAMEL_MIME_PART_ENCODING_BASE64: - output_stream = camel_stream_b64_new_with_input_stream (input_stream); - camel_stream_b64_set_mode (CAMEL_STREAM_B64 (output_stream), - CAMEL_STREAM_B64_ENCODER); return output_stream; case CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE: |