From f2c34011833c291568023f2a52a65f540f59671f Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Wed, 3 Aug 2011 16:59:22 +0200 Subject: Avoid crashes when moving between messages quickly The itip-formatter part is clean, but the one for attachment_button can still introduce runtime warnings, which requires more changes and rethinking of this all, which I prefer to postpone, the best after WebKit work will land, because it also may change most of the mail formatting code (I guess). It doesn't crash, at least. --- mail/em-format-html-display.c | 2 ++ mail/em-format-html.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'mail') diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index 90b60ac20d..d5e0353bf8 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -978,10 +978,12 @@ efhd_attachment_button (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObj e_attachment_set_can_show (attachment, info->handle != NULL); web_view = em_format_html_get_web_view (efh); + g_return_val_if_fail (web_view != NULL, TRUE); parent = gtk_widget_get_toplevel (GTK_WIDGET (web_view)); parent = gtk_widget_is_toplevel (parent) ? parent : NULL; view = em_format_html_display_get_attachment_view (efhd, info->attachment_view_part_id); + g_return_val_if_fail (view != NULL, TRUE); gtk_widget_show (GTK_WIDGET (view)); store = e_attachment_view_get_store (view); diff --git a/mail/em-format-html.c b/mail/em-format-html.c index 4a34aa0f28..d79fa450bc 100644 --- a/mail/em-format-html.c +++ b/mail/em-format-html.c @@ -157,6 +157,7 @@ struct _format_msg { CamelFolder *folder; gchar *uid; CamelMimeMessage *message; + gboolean cancelled; }; static gchar * @@ -177,8 +178,10 @@ efh_format_exec (struct _format_msg *m, CamelURL *base; gchar *content; - if (m->format->priv->web_view == NULL) + if (m->format->priv->web_view == NULL) { + m->cancelled = TRUE; return; + } format = EM_FORMAT (m->format); stream = CAMEL_STREAM (m->estream); @@ -265,6 +268,10 @@ efh_format_exec (struct _format_msg *m, (CamelStream *) m->estream, "\n\n", cancellable, NULL); camel_stream_close ((CamelStream *) m->estream, cancellable, NULL); + if (g_cancellable_is_cancelled (cancellable)) { + m->cancelled = TRUE; + m->estream->sync.cancel = TRUE; + } g_object_unref (m->estream); m->estream = NULL; } @@ -274,6 +281,7 @@ efh_format_exec (struct _format_msg *m, d(printf("out of jobs, done\n")); format->pending_uri_level = puri_level; + m->cancelled = m->cancelled || g_cancellable_is_cancelled (cancellable); } static void @@ -294,6 +302,8 @@ efh_format_free (struct _format_msg *m) g_object_unref (m->format); if (m->estream) { camel_stream_close ((CamelStream *) m->estream, NULL, NULL); + if (m->cancelled) + m->estream->sync.cancel = TRUE; g_object_unref (m->estream); } if (m->folder) -- cgit v1.2.3