aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog9
-rw-r--r--camel/camel-mime-part-utils.c67
2 files changed, 40 insertions, 36 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index aa26d8451c..c8e48b9653 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,12 @@
+2002-02-28 Jeffrey Stedfast <fejj@ximian.com>
+
+ * camel-mime-part-utils.c
+ (camel_mime_part_construct_content_from_parser): Rearrange the
+ save filter stuff so that we save raw streams for all mime
+ parts. If the mime part turns out to be a multupart, then don't
+ bother saving the raw stream, we only need to save the raw stream
+ for leaf parts.
+
2002-02-27 Jeffrey Stedfast <fejj@ximian.com>
* camel-folder-summary.h: Don't #include camel-mime-filter-save.h,
diff --git a/camel/camel-mime-part-utils.c b/camel/camel-mime-part-utils.c
index e21152951b..3b93fab686 100644
--- a/camel/camel-mime-part-utils.c
+++ b/camel/camel-mime-part-utils.c
@@ -2,7 +2,8 @@
/* camel-mime-part-utils : Utility for mime parsing and so on
*
* Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@ximian.com>
+ * Michael Zucchi <notzed@ximian.com>
+ * Jeffrey Stedfast <fejj@ximian.com>
*
* Copyright 1999, 2000 Ximian, Inc. (www.ximian.com)
*
@@ -312,10 +313,24 @@ simple_data_wrapper_construct_from_parser (CamelDataWrapper *dw, CamelMimeParser
void
camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParser *mp)
{
+ struct _header_content_type *content_type;
CamelDataWrapper *content = NULL;
+ CamelMimeFilter *save_filter;
+ CamelStream *raw = NULL;
+ int saveid = -1;
char *buf;
int len;
+ content_type = camel_mime_parser_content_type (mp);
+
+#define SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
+#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
+ raw = camel_stream_mem_new ();
+ save_filter = camel_mime_filter_save_new_with_stream (raw);
+ saveid = camel_mime_parser_filter_add (mp, save_filter);
+ camel_object_unref (CAMEL_OBJECT (save_filter));
+#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */
+
switch (camel_mime_parser_state (mp)) {
case HSCAN_HEADER:
d(printf("Creating body part\n"));
@@ -328,53 +343,24 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse
camel_mime_part_construct_from_parser ((CamelMimePart *)content, mp);
break;
case HSCAN_MULTIPART: {
- struct _header_content_type *content_type;
- CamelMimeFilter *save_filter = NULL;
CamelDataWrapper *bodypart;
- CamelStream *raw = NULL;
- int saveid = -1;
/* FIXME: we should use a came-mime-mutlipart, not jsut a camel-multipart, but who cares */
d(printf("Creating multi-part\n"));
+
+ /* we don't need to save raw streams for multiparts */
+ camel_object_unref (CAMEL_OBJECT (raw));
+ camel_mime_parser_filter_remove (mp, saveid);
+
content = (CamelDataWrapper *)camel_multipart_new ();
-
- content_type = camel_mime_parser_content_type (mp);
+
camel_multipart_set_boundary ((CamelMultipart *)content,
header_content_type_param (content_type, "boundary"));
-#define SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
-#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
- if (header_content_type_is (content_type, "multipart", "signed")) {
- /* save the raw mime stream for the first mime part in the multipart/signed */
- raw = camel_stream_mem_new ();
- save_filter = camel_mime_filter_save_new_with_stream (raw);
- saveid = camel_mime_parser_filter_add (mp, save_filter);
- camel_object_unref (CAMEL_OBJECT (save_filter));
- }
-#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */
-
while (camel_mime_parser_step (mp, &buf, &len) != HSCAN_MULTIPART_END) {
camel_mime_parser_unstep (mp);
bodypart = (CamelDataWrapper *)camel_mime_part_new ();
camel_mime_part_construct_from_parser ((CamelMimePart *)bodypart, mp);
-#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
- if (raw) {
- /* set the raw mime stream on the first part within the multipart/signed */
- CamelDataWrapper *content_object;
-
- content_object = camel_medium_get_content_object (CAMEL_MEDIUM (bodypart));
- if (!CAMEL_IS_MULTIPART (content_object)) {
- camel_stream_reset (raw);
- CAMEL_MIME_PART (bodypart)->stream = raw;
- } else {
- camel_object_unref (CAMEL_OBJECT (raw));
- }
- camel_mime_parser_filter_remove (mp, saveid);
- saveid = -1;
- raw = NULL;
- }
-#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */
-
camel_multipart_add_part ((CamelMultipart *)content, (CamelMimePart *)bodypart);
camel_object_unref ((CamelObject *)bodypart);
}
@@ -395,4 +381,13 @@ camel_mime_part_construct_content_from_parser (CamelMimePart *dw, CamelMimeParse
camel_medium_set_content_object ((CamelMedium *)dw, content);
camel_object_unref ((CamelObject *)content);
}
+
+#ifdef SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES
+ if (!CAMEL_IS_MULTIPART (content)) {
+ /* set the raw mime stream on this leaf part in case our parent is a multipart/signed */
+ camel_mime_parser_filter_remove (mp, saveid);
+ camel_stream_reset (raw);
+ dw->stream = raw;
+ }
+#endif /* SAVE_RAW_MIME_STREAM_FOR_SECURE_MIME_SIGNATURES */
}