From c520043a094d81d222aa0c3e23b0035ddb89d0bf Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 27 Sep 2011 11:15:12 +0200 Subject: Bug #660224 - Assertion failure when forwarding message --- mail/e-mail-reader.c | 45 +++++++++++++++++++++++++++------------------ mail/em-composer-utils.c | 11 ++++++++++- mail/em-composer-utils.h | 3 ++- 3 files changed, 39 insertions(+), 20 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 430f71dc4f..920994242a 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -479,8 +479,8 @@ action_mail_flag_for_followup_cb (GtkAction *action, em_utils_flag_for_followup (reader, folder, uids); } -static void -check_close_browser_reader (EMailReader *reader) +static gboolean +get_close_browser_reader (EMailReader *reader) { GConfClient *client; const gchar *key; @@ -489,7 +489,7 @@ check_close_browser_reader (EMailReader *reader) /* only allow closing of a mail browser and nothing else */ if (!E_IS_MAIL_BROWSER (reader)) - return; + return FALSE; client = gconf_client_get_default (); @@ -529,11 +529,16 @@ check_close_browser_reader (EMailReader *reader) } g_free (value); + g_object_unref (client); - if (close_it) - gtk_widget_destroy (GTK_WIDGET (reader)); + return close_it; +} - g_object_unref (client); +static void +check_close_browser_reader (EMailReader *reader) +{ + if (get_close_browser_reader (reader)) + gtk_widget_destroy (GTK_WIDGET (reader)); } static void @@ -543,11 +548,13 @@ action_mail_forward_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -556,11 +563,10 @@ action_mail_forward_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - e_mail_reader_get_forward_style (reader)); + e_mail_reader_get_forward_style (reader), + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -570,11 +576,13 @@ action_mail_forward_attached_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -583,11 +591,10 @@ action_mail_forward_attached_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - E_MAIL_FORWARD_STYLE_ATTACHED); + E_MAIL_FORWARD_STYLE_ATTACHED, + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -597,11 +604,13 @@ action_mail_forward_inline_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -610,11 +619,10 @@ action_mail_forward_inline_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - E_MAIL_FORWARD_STYLE_INLINE); + E_MAIL_FORWARD_STYLE_INLINE, + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -624,11 +632,13 @@ action_mail_forward_quoted_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -637,11 +647,10 @@ action_mail_forward_quoted_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - E_MAIL_FORWARD_STYLE_QUOTED); + E_MAIL_FORWARD_STYLE_QUOTED, + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index 8c98040ada..1dfa3c4a58 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -85,6 +85,7 @@ struct _AsyncContext { gchar *folder_uri; gchar *message_uid; gboolean replace; + GtkWidget *destroy_when_done; }; struct _ForwardData { @@ -112,6 +113,9 @@ async_context_free (AsyncContext *context) if (context->ptr_array != NULL) g_ptr_array_unref (context->ptr_array); + if (context->destroy_when_done != NULL) + gtk_widget_destroy (context->destroy_when_done); + g_free (context->folder_uri); g_free (context->message_uid); @@ -1680,6 +1684,7 @@ forward_got_messages_cb (CamelFolder *folder, if (e_activity_handle_cancellation (context->activity, error)) { g_warn_if_fail (hash_table == NULL); + context->destroy_when_done = NULL; async_context_free (context); g_error_free (error); return; @@ -1690,6 +1695,7 @@ forward_got_messages_cb (CamelFolder *folder, alert_sink, "mail:get-multiple-messages", error->message, NULL); + context->destroy_when_done = NULL; async_context_free (context); g_error_free (error); return; @@ -1721,6 +1727,7 @@ forward_got_messages_cb (CamelFolder *folder, * @folder: folder containing messages to forward * @uids: uids of messages to forward * @style: the forward style to use + * @destroy_when_done: a #GtkWidget to destroy with gtk_widget_destroy() when done; can be NULL * * Forwards a group of messages in the given style. * @@ -1742,7 +1749,8 @@ void em_utils_forward_messages (EMailReader *reader, CamelFolder *folder, GPtrArray *uids, - EMailForwardStyle style) + EMailForwardStyle style, + GtkWidget *destroy_when_done) { EActivity *activity; AsyncContext *context; @@ -1760,6 +1768,7 @@ em_utils_forward_messages (EMailReader *reader, context->reader = g_object_ref (reader); context->ptr_array = g_ptr_array_ref (uids); context->style = style; + context->destroy_when_done = destroy_when_done; switch (style) { case E_MAIL_FORWARD_STYLE_ATTACHED: diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h index e651186afc..3dba3e9216 100644 --- a/mail/em-composer-utils.h +++ b/mail/em-composer-utils.h @@ -54,7 +54,8 @@ EMsgComposer * em_utils_forward_message (EShell *shell, void em_utils_forward_messages (EMailReader *reader, CamelFolder *folder, GPtrArray *uids, - EMailForwardStyle style); + EMailForwardStyle style, + GtkWidget *destroy_when_done); void em_utils_redirect_message (EShell *shell, CamelMimeMessage *message); void em_utils_handle_receipt (EMailSession *session, -- cgit