[evolution] Bug 732724 - mail-send-recv.c:report_error_to_ui() does UI calls in non-main thread



commit 610fcbd75a00514395bb69b0d4667111b92ec560
Author: Milan Crha <mcrha redhat com>
Date:   Fri Jul 4 10:39:56 2014 +0200

    Bug 732724 - mail-send-recv.c:report_error_to_ui() does UI calls in non-main thread

 mail/mail-send-recv.c |   75 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 54 insertions(+), 21 deletions(-)
---
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 2513ade..87a1957 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -431,28 +431,23 @@ format_service_name (CamelService *service)
        return pretty_url;
 }
 
-static void
-report_error_to_ui (CamelService *service,
-                   const gchar *folder_name,
-                   const GError *error)
+struct ReportErrorToUIData
 {
-       EShellView *shell_view = NULL;
-       gchar *tmp = NULL;
-       const gchar *display_name, *ident;
+       gchar *display_name;
+       gchar *error_ident;
+       GError *error;
+};
 
-       g_return_if_fail (CAMEL_IS_SERVICE (service));
-       g_return_if_fail (error != NULL);
+static gboolean
+report_error_to_ui_cb (gpointer user_data)
+{
+       struct ReportErrorToUIData *data = user_data;
+       EShellView *shell_view = NULL;
 
-       if (folder_name) {
-               tmp = g_strdup_printf ("%s: %s",
-                       camel_service_get_display_name (service),
-                       folder_name);
-               display_name = tmp;
-               ident = "mail:no-refresh-folder";
-       } else {
-               display_name = camel_service_get_display_name (service);
-               ident = "mail:failed-connect";
-       }
+       g_return_val_if_fail (data != NULL, FALSE);
+       g_return_val_if_fail (data->display_name != NULL, FALSE);
+       g_return_val_if_fail (data->error_ident != NULL, FALSE);
+       g_return_val_if_fail (data->error != NULL, FALSE);
 
        if (send_recv_dialog) {
                GtkWidget *parent;
@@ -487,16 +482,54 @@ report_error_to_ui (CamelService *service,
                shell_content = e_shell_view_get_shell_content (shell_view);
                alert_sink = E_ALERT_SINK (shell_content);
 
-               alert = e_alert_new (ident, display_name, error->message, NULL);
+               alert = e_alert_new (data->error_ident, data->display_name, data->error->message, NULL);
 
                e_alert_sink_submit_alert (alert_sink, alert);
 
                g_object_unref (alert);
        } else {
                /* This may not happen, but just in case... */
-               g_warning ("%s: %s '%s': %s\n", G_STRFUNC, ident, display_name, error->message);
+               g_warning ("%s: %s '%s': %s\n", G_STRFUNC, data->error_ident, data->display_name, 
data->error->message);
+       }
+
+       g_free (data->display_name);
+       g_free (data->error_ident);
+       g_error_free (data->error);
+       g_free (data);
+
+       return FALSE;
+}
+
+static void
+report_error_to_ui (CamelService *service,
+                   const gchar *folder_name,
+                   const GError *error)
+{
+       gchar *tmp = NULL;
+       const gchar *display_name, *ident;
+       struct ReportErrorToUIData *data;
+
+       g_return_if_fail (CAMEL_IS_SERVICE (service));
+       g_return_if_fail (error != NULL);
+
+       if (folder_name) {
+               tmp = g_strdup_printf ("%s: %s",
+                       camel_service_get_display_name (service),
+                       folder_name);
+               display_name = tmp;
+               ident = "mail:no-refresh-folder";
+       } else {
+               display_name = camel_service_get_display_name (service);
+               ident = "mail:failed-connect";
        }
 
+       data = g_new0 (struct ReportErrorToUIData, 1);
+       data->display_name = g_strdup (display_name);
+       data->error_ident = g_strdup (ident);
+       data->error = g_error_copy (error);
+
+       g_idle_add_full (G_PRIORITY_DEFAULT, report_error_to_ui_cb, data, NULL);
+
        g_free (tmp);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]