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:
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user