flush the filter stream before unreffing it, so it will

* camel-mime-part.c (write_to_stream): flush the filter stream
	before unreffing it, so it will camel_mime_filter_complete.

	* camel-stream-filter.c (camel_stream_filter_class_init): Fix a
	braino so camel_stream_flush works here.

	* camel-stream-mem.c (stream_seek): Fix a bug that resulted in
	large attachments being silently dropped.

	* providers/pop3/camel-pop3-store.c
	(camel_pop3_command_get_additional_data): Don't use g_strjoinv
	here, since it is O(n^2) on the length of the output string, and
	we can do O(n).

	* camel-mime-part-utils.c
	(simple_data_wrapper_construct_from_parser): add a CRLF decoder
	after the QP/B64 decoder if it's text.

svn path=/trunk/; revision=3658
This commit is contained in:
Dan Winship
2000-06-21 02:09:48 +00:00
parent ed11b82023
commit 4f20138bfc
6 changed files with 60 additions and 20 deletions

View File

@ -1,3 +1,23 @@
2000-06-20 Dan Winship <danw@helixcode.com>
* camel-mime-part.c (write_to_stream): flush the filter stream
before unreffing it, so it will camel_mime_filter_complete.
* camel-stream-filter.c (camel_stream_filter_class_init): Fix a
braino so camel_stream_flush works here.
* camel-stream-mem.c (stream_seek): Fix a bug that resulted in
large attachments being silently dropped.
* providers/pop3/camel-pop3-store.c
(camel_pop3_command_get_additional_data): Don't use g_strjoinv
here, since it is O(n^2) on the length of the output string, and
we can do O(n).
* camel-mime-part-utils.c
(simple_data_wrapper_construct_from_parser): add a CRLF decoder
after the QP/B64 decoder if it's text.
2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
* providers/imap/camel-imap-folder.c (imap_get_summary): Only

View File

@ -33,6 +33,7 @@
#include "camel-stream-mem.h"
#include "camel-mime-filter-basic.h"
#include "camel-mime-filter-charset.h"
#include "camel-mime-filter-crlf.h"
#define d(x)
@ -44,9 +45,9 @@ simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser
char *buf;
int len;
off_t start, end; /* ignore the start may be used unitialised warning */
CamelMimeFilter *fdec = NULL, *fch = NULL;
CamelMimeFilter *fdec = NULL, *fcrlf = NULL, *fch = NULL;
struct _header_content_type *ct;
int decid=-1, chrid=-1, cache=TRUE;
int decid=-1, crlfid=-1, chrid=-1, cache=TRUE;
CamelStream *source;
CamelSeekableStream *seekable_source; /* and ignore the warning about this one too. */
char *encoding;
@ -82,10 +83,18 @@ simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser
g_free(encoding);
}
/* if we're doing text, then see if we have to convert it to UTF8 as well */
/* If we're doing text, we also need to do CRLF->LF and may have to convert it to UTF8 as well. */
ct = camel_mime_parser_content_type(mp);
if (header_content_type_is(ct, "text", "*")) {
const char *charset = header_content_type_param(ct, "charset");
if (fdec) {
d(printf("Adding CRLF conversion filter\n"));
fcrlf = (CamelMimeFilter *)camel_mime_filter_crlf_new(CAMEL_MIME_FILTER_CRLF_DECODE,
CAMEL_MIME_FILTER_CRLF_MODE_CRLF_ONLY);
crlfid = camel_mime_parser_filter_add(mp, fcrlf);
}
if (charset!=NULL
&& !(strcasecmp(charset, "us-ascii")==0
|| strcasecmp(charset, "iso-8859-1")==0)) {
@ -141,6 +150,10 @@ simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser
camel_mime_filter_reset(fdec);
camel_stream_filter_add(filter, fdec);
}
if (fcrlf) {
camel_mime_filter_reset(fcrlf);
camel_stream_filter_add(filter, fcrlf);
}
if (fch) {
camel_mime_filter_reset(fch);
camel_stream_filter_add(filter, fch);
@ -154,10 +167,13 @@ simple_data_wrapper_construct_from_parser(CamelDataWrapper *dw, CamelMimeParser
}
camel_mime_parser_filter_remove(mp, decid);
camel_mime_parser_filter_remove(mp, crlfid);
camel_mime_parser_filter_remove(mp, chrid);
if (fdec)
gtk_object_unref((GtkObject *)fdec);
if (fcrlf)
gtk_object_unref((GtkObject *)fcrlf);
if (fch)
gtk_object_unref((GtkObject *)fch);
if (source)

View File

@ -542,8 +542,10 @@ write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
#endif
count = camel_data_wrapper_write_to_stream (content, stream);
if (filter_stream)
if (filter_stream) {
camel_stream_flush((CamelStream *)filter_stream);
gtk_object_unref((GtkObject *)filter_stream);
}
if (count == -1)
return -1;
total += count;

View File

@ -120,7 +120,7 @@ camel_stream_filter_class_init (CamelStreamFilterClass *klass)
camel_stream_class->read = do_read;
camel_stream_class->write = do_write;
camel_stream_class->flush = do_flush;
camel_stream_class->flush = do_close;
camel_stream_class->close = do_close;
camel_stream_class->eos = do_eos;
camel_stream_class->reset = do_reset;

View File

@ -233,9 +233,9 @@ stream_seek (CamelSeekableStream *stream, off_t offset,
break;
}
if (stream->bound_end == CAMEL_STREAM_UNBOUND)
if (stream->bound_end != CAMEL_STREAM_UNBOUND)
position = MIN (position, stream->bound_end);
if (stream->bound_start == CAMEL_STREAM_UNBOUND)
if (stream->bound_start != CAMEL_STREAM_UNBOUND)
position = MAX (position, 0);
else
position = MAX (position, stream->bound_start);

View File

@ -642,8 +642,8 @@ camel_pop3_command_get_additional_data (CamelPop3Store *store,
{
CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream);
GPtrArray *data;
char *buf;
int i, status = CAMEL_POP3_OK;
char *buf, *p;
int i, len = 0, status = CAMEL_POP3_OK;
data = g_ptr_array_new ();
while (1) {
@ -655,24 +655,26 @@ camel_pop3_command_get_additional_data (CamelPop3Store *store,
if (!strcmp (buf, "."))
break;
if (*buf == '.')
memmove (buf, buf + 1, strlen (buf));
g_ptr_array_add (data, buf);
p = (*buf == '.') ? buf + 1 : buf;
g_ptr_array_add (data, p);
len += strlen (p) + 1;
}
g_free (buf);
if (status == CAMEL_POP3_OK) {
/* Append an empty string to the end of the array
* so when we g_strjoinv it, we get a "\n" after
* the last real line.
*/
g_ptr_array_add (data, "");
g_ptr_array_add (data, NULL);
buf = g_strjoinv ("\n", (char **)data->pdata);
buf = g_malloc (len + 1);
for (i = 0, p = buf; i < data->len; i++) {
len = strlen (data->pdata[i]);
memcpy (p, data->pdata[i], len);
p += len;
*p++ = '\n';
}
*p = '\0';
} else
buf = NULL;
for (i = 0; i < data->len - 2; i++)
for (i = 0; i < data->len; i++)
g_free (data->pdata[i]);
g_ptr_array_free (data, TRUE);