Load up to 4096 characters in formatter creating reply/forward messages.
authorJose Dapena Paz <jdapena@igalia.com>
Tue, 19 May 2009 09:52:42 +0000 (11:52 +0200)
committerJose Dapena Paz <jdapena@igalia.com>
Tue, 19 May 2009 10:06:00 +0000 (12:06 +0200)
* src/modest-formatter.c (extract_text): extract up to 4096 characters
  for creating reply/forward messages. This should limit problems
  creating derivated big messages (fixes NB#116091).

src/modest-formatter.c

index 82418ed..5392b06 100644 (file)
@@ -38,6 +38,8 @@
 #include "modest-tny-platform-factory.h"
 #include <modest-runtime.h>
 
 #include "modest-tny-platform-factory.h"
 #include <modest-runtime.h>
 
+#define MAX_BODY_LENGTH 4096
+
 typedef struct _ModestFormatterPrivate ModestFormatterPrivate;
 struct _ModestFormatterPrivate {
        gchar *content_type;
 typedef struct _ModestFormatterPrivate ModestFormatterPrivate;
 struct _ModestFormatterPrivate {
        gchar *content_type;
@@ -66,16 +68,39 @@ static TnyMimePart *find_body_parent (TnyMimePart *part);
 static gchar *
 extract_text (ModestFormatter *self, TnyMimePart *body)
 {
 static gchar *
 extract_text (ModestFormatter *self, TnyMimePart *body)
 {
+       TnyStream *mp_stream;
        TnyStream *stream;
        GtkTextBuffer *buf;
        GtkTextIter start, end;
        gchar *text, *converted_text;
        ModestFormatterPrivate *priv;
        TnyStream *stream;
        GtkTextBuffer *buf;
        GtkTextIter start, end;
        gchar *text, *converted_text;
        ModestFormatterPrivate *priv;
+       gint total;
 
        buf = gtk_text_buffer_new (NULL);
        stream = TNY_STREAM (tny_gtk_text_buffer_stream_new (buf));
        tny_stream_reset (stream);
 
        buf = gtk_text_buffer_new (NULL);
        stream = TNY_STREAM (tny_gtk_text_buffer_stream_new (buf));
        tny_stream_reset (stream);
-       tny_mime_part_decode_to_stream (body, stream, NULL);
+       mp_stream = tny_mime_part_get_decoded_stream (body);
+
+       total = 0;
+
+       while (!tny_stream_is_eos (mp_stream)) {
+               gchar buffer [128];
+               gint n_read;
+               gint next_read;
+
+               next_read = MIN (128, MAX_BODY_LENGTH - total);
+               if (next_read == 0)
+                       break;
+               n_read = tny_stream_read (mp_stream, buffer, next_read);
+               if (n_read > 0) {
+                       gint n_write;
+                       n_write = tny_stream_write (stream, buffer, n_read);
+                       total += n_write;
+               } else if (n_read == -1) {
+                       break;
+               }
+       }
+
        tny_stream_reset (stream);
 
        g_object_unref (G_OBJECT(stream));
        tny_stream_reset (stream);
 
        g_object_unref (G_OBJECT(stream));