diff options
author | Milan Crha <mcrha@redhat.com> | 2012-04-13 22:18:47 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2012-04-13 22:18:47 +0800 |
commit | 5cba7977dceec451ddf65db946aada5e1582567c (patch) | |
tree | 00a1a6ec10f533f7e23e20dd5f44988659e689e7 | |
parent | d3c48ad5af1ffe313f5427ab78ef4ddebb38cf72 (diff) | |
download | gsoc2013-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.c | 6 | ||||
-rw-r--r-- | modules/calendar/e-cal-attachment-handler.c | 4 | ||||
-rw-r--r-- | modules/mail/e-mail-attachment-handler.c | 5 | ||||
-rw-r--r-- | widgets/misc/e-attachment.c | 34 |
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 |