aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2012-04-13 22:18:47 +0800
committerMilan Crha <mcrha@redhat.com>2012-04-13 22:18:47 +0800
commit5cba7977dceec451ddf65db946aada5e1582567c (patch)
tree00a1a6ec10f533f7e23e20dd5f44988659e689e7
parentd3c48ad5af1ffe313f5427ab78ef4ddebb38cf72 (diff)
downloadgsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar.gz
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar.bz2
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar.lz
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar.xz
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.tar.zst
gsoc2013-evolution-5cba7977dceec451ddf65db946aada5e1582567c.zip
Bug #600860 - Opening IMAP message with large attachment blocks UI
-rw-r--r--mail/em-format-html-display.c6
-rw-r--r--modules/calendar/e-cal-attachment-handler.c4
-rw-r--r--modules/mail/e-mail-attachment-handler.c5
-rw-r--r--widgets/misc/e-attachment.c34
4 files changed, 40 insertions, 9 deletions
diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c
index 013e1ac731..aca7fef8d8 100644
--- a/mail/em-format-html-display.c
+++ b/mail/em-format-html-display.c
@@ -1174,8 +1174,10 @@ efhd_attachment_button (EMFormatHTML *efh,
GFileInfo *fileinfo;
fileinfo = e_attachment_get_file_info (info->attachment);
- g_file_info_set_size (fileinfo, size);
- e_attachment_set_file_info (info->attachment, fileinfo);
+ if (fileinfo) {
+ g_file_info_set_size (fileinfo, size);
+ e_attachment_set_file_info (info->attachment, fileinfo);
+ }
}
widget = e_attachment_button_new (view);
diff --git a/modules/calendar/e-cal-attachment-handler.c b/modules/calendar/e-cal-attachment-handler.c
index 604bc737da..3b18f426aa 100644
--- a/modules/calendar/e-cal-attachment-handler.c
+++ b/modules/calendar/e-cal-attachment-handler.c
@@ -75,6 +75,10 @@ attachment_handler_get_component (EAttachment *attachment)
if (component != NULL)
return component;
+ if (e_attachment_get_loading (attachment) ||
+ e_attachment_get_saving (attachment))
+ return NULL;
+
mime_part = e_attachment_get_mime_part (attachment);
if (!CAMEL_IS_MIME_PART (mime_part))
return NULL;
diff --git a/modules/mail/e-mail-attachment-handler.c b/modules/mail/e-mail-attachment-handler.c
index 7e1b8fcddd..3e3414fb14 100644
--- a/modules/mail/e-mail-attachment-handler.c
+++ b/modules/mail/e-mail-attachment-handler.c
@@ -443,6 +443,11 @@ mail_attachment_handler_update_actions (EAttachmentView *view,
goto exit;
attachment = E_ATTACHMENT (selected->data);
+
+ if (e_attachment_get_loading (attachment) ||
+ e_attachment_get_saving (attachment))
+ goto exit;
+
mime_part = e_attachment_get_mime_part (attachment);
if (!CAMEL_IS_MIME_PART (mime_part))
diff --git a/widgets/misc/e-attachment.c b/widgets/misc/e-attachment.c
index 0678296767..31e0abf330 100644
--- a/widgets/misc/e-attachment.c
+++ b/widgets/misc/e-attachment.c
@@ -1751,17 +1751,27 @@ attachment_load_query_info_cb (GFile *file,
attachment_load_file_read_cb, load_context);
}
+#define ATTACHMENT_LOAD_CONTEXT "attachment-load-context-data"
+
static void
-attachment_load_from_mime_part (LoadContext *load_context)
+attachment_load_from_mime_part_thread (GSimpleAsyncResult *simple,
+ GObject *object,
+ GCancellable *cancellable)
{
+ LoadContext *load_context;
GFileInfo *file_info;
EAttachment *attachment;
- GSimpleAsyncResult *simple;
CamelContentType *content_type;
CamelMimePart *mime_part;
const gchar *attribute;
const gchar *string;
gchar *allocated;
+ CamelStream *null;
+ CamelDataWrapper *dw;
+
+ load_context = g_object_get_data (G_OBJECT (simple), ATTACHMENT_LOAD_CONTEXT);
+ g_return_if_fail (load_context != NULL);
+ g_object_set_data (G_OBJECT (simple), ATTACHMENT_LOAD_CONTEXT, NULL);
attachment = load_context->attachment;
mime_part = e_attachment_get_mime_part (attachment);
@@ -1819,6 +1829,13 @@ attachment_load_from_mime_part (LoadContext *load_context)
g_file_info_set_attribute_string (
file_info, attribute, string);
+ dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
+ null = camel_stream_null_new ();
+ /* this actually downloads the part and makes it available later */
+ camel_data_wrapper_decode_to_stream_sync (dw, null, attachment->priv->cancellable, NULL);
+ g_file_info_set_size (file_info, CAMEL_STREAM_NULL (null)->written);
+ g_object_unref (null);
+
string = camel_mime_part_get_disposition (mime_part);
e_attachment_set_disposition (attachment, string);
@@ -1826,11 +1843,9 @@ attachment_load_from_mime_part (LoadContext *load_context)
g_object_ref (mime_part);
- simple = load_context->simple;
g_simple_async_result_set_op_res_gpointer (
simple, mime_part,
(GDestroyNotify) g_object_unref);
- g_simple_async_result_complete (simple);
attachment_load_context_free (load_context);
}
@@ -1873,16 +1888,21 @@ e_attachment_load_async (EAttachment *attachment,
cancellable = attachment->priv->cancellable;
g_cancellable_reset (cancellable);
- if (file != NULL)
+ if (file != NULL) {
g_file_query_info_async (
file, ATTACHMENT_QUERY,
G_FILE_QUERY_INFO_NONE,G_PRIORITY_DEFAULT,
cancellable, (GAsyncReadyCallback)
attachment_load_query_info_cb, load_context);
- else if (mime_part != NULL)
- attachment_load_from_mime_part (load_context);
+ } else if (mime_part != NULL) {
+ g_object_set_data (G_OBJECT (load_context->simple), ATTACHMENT_LOAD_CONTEXT, load_context);
+ g_simple_async_result_run_in_thread (load_context->simple,
+ attachment_load_from_mime_part_thread,
+ G_PRIORITY_DEFAULT,
+ cancellable);
+ }
}
gboolean