aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog6
-rw-r--r--mail/em-format-html-display.c7
-rw-r--r--widgets/misc/ChangeLog6
-rw-r--r--widgets/misc/e-attachment-bar.c60
4 files changed, 78 insertions, 1 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index fb340f1499..a7d92febd6 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-22 Srinivasa Ragavan <sragavan@novell.com>
+
+ * em-format-html-display.c: (efhd_attachment_button),
+ (efhd_format_attachment): Added code to create image cache of image
+ attachment in the ethread instead of main thread to avoid gui lockup.
+
2006-04-21 Sankar P <psankar@novell.com>
* mail-mt.c: (do_op_status):
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 6ebf316d54..3a18ad28ab 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -166,6 +166,9 @@ struct _attach_puri {
CamelStream *output;
unsigned int shown:1;
+ /* Attachment */
+ EAttachment *attachment;
+
/* image stuff */
int fit_width;
int fit_height;
@@ -1552,7 +1555,7 @@ efhd_attachment_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObje
if (efhd->priv->attachment_bar) {
file = camel_mime_part_get_filename(info->puri.part);
- new = e_attachment_new_from_mime_part (info->puri.part);
+ new = info->attachment;
if (!file) {
file = "attachment.dat";
@@ -2141,6 +2144,8 @@ efhd_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part,
info->handle = handle;
info->shown = em_format_is_inline(emf, info->puri.part_id, info->puri.part, handle);
info->snoop_mime_type = emf->snoop_mime_type;
+ info->attachment = e_attachment_new_from_mime_part (info->puri.part);
+ e_attachment_bar_create_attachment_cache (info->attachment);
if (emf->valid) {
info->sign = emf->valid->sign.status;
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index 0199f9cad3..3e64e1bbe1 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-22 Srinivasa Ragavan <sragavan@novell.com>
+
+
+ * e-attachment-bar.c: (e_attachment_bar_create_attachment_cache):
+ Added a new function that creates a attachment with a image cache.
+
2006-03-28 Li Yuan <li.yuan@sun.com>
**Fixes bug #335618
diff --git a/widgets/misc/e-attachment-bar.c b/widgets/misc/e-attachment-bar.c
index 7bf8de6844..c6bf9972f3 100644
--- a/widgets/misc/e-attachment-bar.c
+++ b/widgets/misc/e-attachment-bar.c
@@ -233,6 +233,66 @@ calculate_height_width(EAttachmentBar *bar, int *new_width, int *new_height)
return;
}
+void
+e_attachment_bar_create_attachment_cache (EAttachment *attachment)
+{
+
+ CamelContentType *content_type;
+
+ content_type = camel_mime_part_get_content_type (attachment->body);
+
+ if (camel_content_type_is(content_type, "image", "*")) {
+ CamelDataWrapper *wrapper;
+ CamelStreamMem *mstream;
+ GdkPixbufLoader *loader;
+ gboolean error = TRUE;
+ GdkPixbuf *pixbuf;
+
+ wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
+ mstream = (CamelStreamMem *) camel_stream_mem_new ();
+
+ camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
+
+ /* Stream image into pixbuf loader */
+ loader = gdk_pixbuf_loader_new ();
+ error = !gdk_pixbuf_loader_write (loader, mstream->buffer->data, mstream->buffer->len, NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+
+ if (!error) {
+ int ratio, width, height;
+
+ /* Shrink pixbuf */
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ if (width >= height) {
+ if (width > 48) {
+ ratio = width / 48;
+ width = 48;
+ height = height / ratio;
+ }
+ } else {
+ if (height > 48) {
+ ratio = height / 48;
+ height = 48;
+ width = width / ratio;
+ }
+ }
+
+ attachment->pixbuf_cache = gdk_pixbuf_scale_simple (pixbuf, width,height,GDK_INTERP_BILINEAR);
+ pixbuf = attachment->pixbuf_cache;
+ g_object_ref(pixbuf);
+ } else {
+ attachment->pixbuf_cache = NULL;
+ g_warning ("GdkPixbufLoader Error");
+ }
+
+ /* Destroy everything */
+ g_object_unref (loader);
+ camel_object_unref (mstream);
+ }
+}
+
static void
update (EAttachmentBar *bar)
{