aboutsummaryrefslogtreecommitdiffstats
path: root/my-evolution/e-summary.c
diff options
context:
space:
mode:
Diffstat (limited to 'my-evolution/e-summary.c')
-rw-r--r--my-evolution/e-summary.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/my-evolution/e-summary.c b/my-evolution/e-summary.c
index 582926bf10..5c2f8feabd 100644
--- a/my-evolution/e-summary.c
+++ b/my-evolution/e-summary.c
@@ -65,9 +65,8 @@ struct _ESummaryMailFolderInfo {
typedef struct _DownloadInfo {
GtkHTMLStream *stream;
char *uri;
- char *buffer;
-
- gboolean error;
+ char *buffer, *ptr;
+ guint32 bufsize;
} DownloadInfo;
struct _ESummaryPrivate {
@@ -256,17 +255,16 @@ close_callback (GnomeVFSAsyncHandle *handle,
{
DownloadInfo *info = data;
- if (info->error) {
- gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
- } else {
- gtk_html_stream_close (info->stream, GTK_HTML_STREAM_OK);
- }
-
g_free (info->uri);
g_free (info->buffer);
g_free (info);
}
+/* The way this behaves is a workaround for ximian bug 10235: loading
+ * the image into gtkhtml progressively will result in garbage being
+ * drawn, so we wait until we've read the whole thing and then write
+ * it all at once.
+ */
static void
read_callback (GnomeVFSAsyncHandle *handle,
GnomeVFSResult result,
@@ -278,16 +276,18 @@ read_callback (GnomeVFSAsyncHandle *handle,
DownloadInfo *info = data;
if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
- info->error = TRUE;
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
gnome_vfs_async_close (handle, close_callback, info);
- }
-
- if (bytes_read == 0) {
- info->error = FALSE;
+ } else if (bytes_read == 0) {
+ gtk_html_stream_write (info->stream, info->buffer, info->ptr - info->buffer);
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_OK);
gnome_vfs_async_close (handle, close_callback, info);
} else {
- gtk_html_stream_write (info->stream, buffer, bytes_read);
- gnome_vfs_async_read (handle, buffer, 4095, read_callback, info);
+ bytes_read += info->ptr - info->buffer;
+ info->bufsize += 4096;
+ info->buffer = g_realloc (info->buffer, info->bufsize);
+ info->ptr = info->buffer + bytes_read;
+ gnome_vfs_async_read (handle, info->ptr, 4095, read_callback, info);
}
}
@@ -303,7 +303,8 @@ open_callback (GnomeVFSAsyncHandle *handle,
return;
}
- info->buffer = g_new (char, 4096);
+ info->bufsize = 4096;
+ info->buffer = info->ptr = g_new (char, info->bufsize);
gnome_vfs_async_read (handle, info->buffer, 4095, read_callback, info);
}
@@ -364,7 +365,6 @@ e_summary_url_requested (GtkHTML *html,
info = g_new (DownloadInfo, 1);
info->stream = stream;
info->uri = filename;
- info->error = FALSE;
gnome_vfs_async_open (&handle, filename, GNOME_VFS_OPEN_READ,
(GnomeVFSAsyncOpenCallback) open_callback, info);