From 2b97bd935b8d4becffb4df667a2ee6162c706465 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Wed, 8 Nov 2000 09:13:52 +0000 Subject: Keep track of the caller bestenc flags that make sense. 2000-11-08 Not Zed * camel-mime-message.c (find_best_encoding): Keep track of the caller bestenc flags that make sense. * camel-mime-filter-bestenc.c (filter): Added code to detect when we have "^From " lines in the sequence of text. (camel_mime_filter_bestenc_get_best_encoding): Added a new flag CAMEL_BESTENC_NO_FROM: if set, it will not allow any lines matching "^From " to appear in the output - currently forcing base64 encoding to achieve this. * camel-mime-parser.c (folder_scan_step): Call camel_mime-filter_complete() once we're done, rather than filter_filter(). (folder_scan_content): Some fixes for state changing; so that when we do find another boundary it is properly flagged. Since we strip the last \n off all data, we must take that into account too. Sigh. Fixes a rather nasty set of bugs where multipart messages could start including following messages as parts, etc. (struct _header_scan_stack): Added new parameter, boundarylenfinal, which holds the length of the final boundary, if it is different (e.g. for From lines, whihc aren't) (folder_scan_step): Setup teh boundarylenfinal value when creating a new boundary. (folder_scan_content): Hmm, if we hit the end-of-buffer sentinal, reset the scanner back to leave 'atleast' chars in the buffer still, dump that content, and retry again. Stops us losing a check for a boundary on some data we haven't really looked at yet! (folder_scan_content): Use boundarylenfinal to calculate 'atleast'. (folder_scan_header): And here too. (folder_boundary_check): Use the atleast value directly, dont truncate it. Use the boundarylen/boundarylenfinal values directly too. (struct _header_scan_stack): Add an atleast parameter to cache the atleast info. (folder_push_part): Determine/set 'atleast', every time we add a new part. (folder_scan_header): Get the cached atleast info from the current part. (folder_scan_content): And here too. (folder_scan_header): Fix a problem where a part starting with " text" would be interpreted as a followon header wrongly. * camel-mime-filter-charset.c (complete): Add some assertions to find a bug. svn path=/trunk/; revision=6500 --- camel/camel-mime-message.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'camel/camel-mime-message.c') diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c index 6423072c91..c75b83b77f 100644 --- a/camel/camel-mime-message.c +++ b/camel/camel-mime-message.c @@ -583,7 +583,7 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest CamelMimeFilterBestenc *bestenc; int idb, idc = -1; gboolean istext; - unsigned int flags; + unsigned int flags, callerflags; CamelMimePartEncodingType encoding; CamelDataWrapper *content; @@ -591,7 +591,7 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest not have to read the whole lot into memory - although i have a feeling it would make things a fair bit simpler to do so ... */ - printf("starting to check part\n"); + d(printf("starting to check part\n")); content = camel_medium_get_content_object((CamelMedium *)part); if (content == NULL) { @@ -610,6 +610,9 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest /* when building the message, any encoded parts are translated already */ flags |= CAMEL_BESTENC_LF_IS_CRLF; + /* and get any flags the caller passed in */ + callerflags = (required & CAMEL_BESTENC_NO_FROM); + flags |= callerflags; /* first a null stream, so any filtering is thrown away; we only want the sideeffects */ null = (CamelStream *)camel_stream_null_new(); @@ -628,7 +631,7 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest bestenc = camel_mime_filter_bestenc_new(flags); idb = camel_stream_filter_add(filter, (CamelMimeFilter *)bestenc); - printf("writing to checking stream\n"); + d(printf("writing to checking stream\n")); camel_data_wrapper_write_to_stream(content, (CamelStream *)filter); camel_stream_filter_remove(filter, idb); if (idc != -1) { @@ -640,13 +643,13 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest if (istext) charsetin = camel_mime_filter_bestenc_get_best_charset(bestenc); - printf("charsetin = %s\n", charsetin); + d(printf("charsetin = %s\n", charsetin)); /* if we have US-ASCII, or we're not doing text, we dont need to bother with the rest */ if (charsetin != NULL && (required & CAMEL_BESTENC_GET_CHARSET) != 0) { charset = g_strdup(charsetin); - printf("have charset, trying conversion/etc\n"); + d(printf("have charset, trying conversion/etc\n")); /* now the 'bestenc' can has told us what the best encoding is, we can use that to create a charset conversion filter as well, and then re-add the bestenc to filter the @@ -663,7 +666,7 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest /* otherwise, try another pass, converting to the real charset */ camel_mime_filter_reset((CamelMimeFilter *)bestenc); - camel_mime_filter_bestenc_set_flags(bestenc, CAMEL_BESTENC_GET_ENCODING|CAMEL_BESTENC_LF_IS_CRLF); + camel_mime_filter_bestenc_set_flags(bestenc, CAMEL_BESTENC_GET_ENCODING|CAMEL_BESTENC_LF_IS_CRLF|callerflags); camel_stream_filter_add(filter, (CamelMimeFilter *)charenc); camel_stream_filter_add(filter, (CamelMimeFilter *)bestenc); @@ -681,7 +684,7 @@ find_best_encoding(CamelMimePart *part, CamelBestencRequired required, CamelBest camel_object_unref((CamelObject *)bestenc); camel_object_unref((CamelObject *)null); - printf("done, best encoding = %d\n", encoding); + d(printf("done, best encoding = %d\n", encoding)); if (charsetp) *charsetp = charset; @@ -719,7 +722,7 @@ best_encoding(CamelMimeMessage *msg, CamelMimePart *part, void *datap) gmime_content_field_set_parameter(part->content_type, "charset", charset?charset:"us-ascii"); newct = header_content_type_format(part->content_type->content_type); if (newct) { - printf("Setting content-type to %s\n", newct); + d(printf("Setting content-type to %s\n", newct)); camel_mime_part_set_content_type(part, newct); g_free(newct); -- cgit v1.2.3