From 603fb5ac719acb7000559299c6fa7df2848f63ca Mon Sep 17 00:00:00 2001
From: Matthew Barnes <mbarnes@redhat.com>
Date: Sun, 2 Jun 2013 09:46:42 -0400
Subject: em-composer-utils.c cleanups.

---
 mail/em-composer-utils.c | 574 +++++++++++++++++++++++++++--------------------
 1 file changed, 328 insertions(+), 246 deletions(-)

(limited to 'mail/em-composer-utils.c')

diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 21961ef573..342ffbeb4b 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -93,33 +93,24 @@ struct _ForwardData {
 };
 
 static void
-async_context_free (AsyncContext *context)
+async_context_free (AsyncContext *async_context)
 {
-	if (context->message != NULL)
-		g_object_unref (context->message);
+	g_clear_object (&async_context->message);
+	g_clear_object (&async_context->session);
+	g_clear_object (&async_context->composer);
+	g_clear_object (&async_context->activity);
+	g_clear_object (&async_context->reader);
 
-	if (context->session != NULL)
-		g_object_unref (context->session);
+	if (async_context->ptr_array != NULL)
+		g_ptr_array_unref (async_context->ptr_array);
 
-	if (context->composer != NULL)
-		g_object_unref (context->composer);
+	if (async_context->destroy_when_done != NULL)
+		gtk_widget_destroy (async_context->destroy_when_done);
 
-	if (context->activity != NULL)
-		g_object_unref (context->activity);
+	g_free (async_context->folder_uri);
+	g_free (async_context->message_uid);
 
-	if (context->reader != NULL)
-		g_object_unref (context->reader);
-
-	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);
-
-	g_slice_free (AsyncContext, context);
+	g_slice_free (AsyncContext, async_context);
 }
 
 static void
@@ -517,17 +508,24 @@ composer_presend_check_unwanted_html (EMsgComposer *composer,
 }
 
 static void
-composer_send_completed (EMailSession *session,
+composer_send_completed (GObject *source_object,
                          GAsyncResult *result,
-                         AsyncContext *context)
+                         gpointer user_data)
 {
-	GError *error = NULL;
+	EActivity *activity;
 	gboolean service_unavailable;
 	gboolean set_changed = FALSE;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
+
+	async_context = (AsyncContext *) user_data;
 
-	e_mail_session_send_to_finish (session, result, &error);
+	activity = async_context->activity;
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
+	e_mail_session_send_to_finish (
+		E_MAIL_SESSION (source_object), result, &local_error);
+
+	if (e_activity_handle_cancellation (activity, local_error)) {
 		set_changed = TRUE;
 		goto exit;
 	}
@@ -536,70 +534,74 @@ composer_send_completed (EMailSession *session,
 	 * or name resolution failed or connection attempt failed. */
 	service_unavailable =
 		g_error_matches (
-			error, CAMEL_SERVICE_ERROR,
+			local_error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_UNAVAILABLE) ||
 		/* XXX camel_getaddrinfo() sets this, unfortunately. */
-		g_error_matches (error, CAMEL_ERROR, CAMEL_ERROR_GENERIC);
+		g_error_matches (
+			local_error, CAMEL_ERROR, CAMEL_ERROR_GENERIC);
 	if (service_unavailable) {
 		/* Inform the user. */
 		e_alert_run_dialog_for_args (
-			GTK_WINDOW (context->composer),
+			GTK_WINDOW (async_context->composer),
 			"mail-composer:saving-to-outbox", NULL);
-		e_msg_composer_save_to_outbox (context->composer);
+		e_msg_composer_save_to_outbox (async_context->composer);
 		goto exit;
 	}
 
 	/* Post-processing errors are shown in the shell window. */
-	if (g_error_matches (error, E_MAIL_ERROR, E_MAIL_ERROR_POST_PROCESSING)) {
+	if (g_error_matches (
+		local_error, E_MAIL_ERROR,
+		E_MAIL_ERROR_POST_PROCESSING)) {
 		EAlert *alert;
 		EShell *shell;
 
-		shell = e_msg_composer_get_shell (context->composer);
+		shell = e_msg_composer_get_shell (async_context->composer);
 
 		alert = e_alert_new (
 			"mail-composer:send-post-processing-error",
-			error->message, NULL);
+			local_error->message, NULL);
 		e_shell_submit_alert (shell, alert);
 		g_object_unref (alert);
 
 	/* All other errors are shown in the composer window. */
-	} else if (error != NULL) {
+	} else if (local_error != NULL) {
 		gint response;
 
 		/* Clear the activity bar before
 		 * presenting the error dialog. */
-		g_object_unref (context->activity);
-		context->activity = NULL;
+		g_clear_object (&async_context->activity);
+		activity = async_context->activity;
 
 		response = e_alert_run_dialog_for_args (
-			GTK_WINDOW (context->composer),
+			GTK_WINDOW (async_context->composer),
 			"mail-composer:send-error",
-			error->message, NULL);
+			local_error->message, NULL);
 		if (response == GTK_RESPONSE_OK)  /* Try Again */
-			e_msg_composer_send (context->composer);
+			e_msg_composer_send (async_context->composer);
 		if (response == GTK_RESPONSE_ACCEPT)  /* Save to Outbox */
-			e_msg_composer_save_to_outbox (context->composer);
+			e_msg_composer_save_to_outbox (async_context->composer);
 		set_changed = TRUE;
 		goto exit;
 	}
 
-	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+	e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
 	/* Wait for the EActivity's completion message to
 	 * time out and then destroy the composer window. */
 	g_object_weak_ref (
-		G_OBJECT (context->activity), (GWeakNotify)
-		gtk_widget_destroy, context->composer);
+		G_OBJECT (activity), (GWeakNotify)
+		gtk_widget_destroy, async_context->composer);
 
 exit:
-	g_clear_error (&error);
+	g_clear_error (&local_error);
 
 	if (set_changed) {
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		gtk_window_present (GTK_WINDOW (context->composer));
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		gtk_window_present (GTK_WINDOW (async_context->composer));
 	}
 
-	async_context_free (context);
+	async_context_free (async_context);
 }
 
 static void
@@ -608,21 +610,22 @@ em_utils_composer_send_cb (EMsgComposer *composer,
                            EActivity *activity,
                            EMailSession *session)
 {
-	AsyncContext *context;
+	AsyncContext *async_context;
 	GCancellable *cancellable;
 
-	context = g_slice_new0 (AsyncContext);
-	context->message = g_object_ref (message);
-	context->composer = g_object_ref (composer);
-	context->activity = g_object_ref (activity);
+	async_context = g_slice_new0 (AsyncContext);
+	async_context->message = g_object_ref (message);
+	async_context->composer = g_object_ref (composer);
+	async_context->activity = g_object_ref (activity);
 
 	cancellable = e_activity_get_cancellable (activity);
 
 	e_mail_session_send_to (
 		session, message,
-		G_PRIORITY_DEFAULT, cancellable, NULL, NULL,
-		(GAsyncReadyCallback) composer_send_completed,
-		context);
+		G_PRIORITY_DEFAULT,
+		cancellable, NULL, NULL,
+		composer_send_completed,
+		async_context);
 }
 
 static void
@@ -674,90 +677,110 @@ manage_x_evolution_replace_outbox (EMsgComposer *composer,
 }
 
 static void
-composer_save_to_drafts_complete (EMailSession *session,
+composer_save_to_drafts_complete (GObject *source_object,
                                   GAsyncResult *result,
-                                  AsyncContext *context)
+                                  gpointer user_data)
 {
-	GError *error = NULL;
+	EActivity *activity;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
 	/* We don't really care if this failed.  If something other than
 	 * cancellation happened, emit a runtime warning so the error is
 	 * not completely lost. */
 
-	e_mail_session_handle_draft_headers_finish (session, result, &error);
+	async_context = (AsyncContext *) user_data;
+
+	activity = async_context->activity;
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		g_error_free (error);
+	e_mail_session_handle_draft_headers_finish (
+		E_MAIL_SESSION (source_object), result, &local_error);
 
-	} else if (error != NULL) {
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		g_warning ("%s", error->message);
-		g_error_free (error);
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		g_error_free (local_error);
+
+	} else if (local_error != NULL) {
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		g_warning ("%s", local_error->message);
+		g_error_free (local_error);
 
 	} else
-		e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+		e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
 	/* Encode the draft message we just saved into the EMsgComposer
 	 * as X-Evolution-Draft headers.  The message will be marked for
 	 * deletion if the user saves a newer draft message or sends the
 	 * composed message. */
 	e_msg_composer_set_draft_headers (
-		context->composer, context->folder_uri,
-		context->message_uid);
+		async_context->composer,
+		async_context->folder_uri,
+		async_context->message_uid);
 
-	async_context_free (context);
+	async_context_free (async_context);
 }
 
 static void
-composer_save_to_drafts_cleanup (CamelFolder *drafts_folder,
+composer_save_to_drafts_cleanup (GObject *source_object,
                                  GAsyncResult *result,
-                                 AsyncContext *context)
+                                 gpointer user_data)
 {
 	CamelSession *session;
+	EActivity *activity;
 	EAlertSink *alert_sink;
 	GCancellable *cancellable;
-	GError *error = NULL;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	alert_sink = e_activity_get_alert_sink (context->activity);
-	cancellable = e_activity_get_cancellable (context->activity);
+	async_context = (AsyncContext *) user_data;
 
-	e_mail_folder_append_message_finish (
-		drafts_folder, result, &context->message_uid, &error);
+	activity = async_context->activity;
+	alert_sink = e_activity_get_alert_sink (activity);
+	cancellable = e_activity_get_cancellable (activity);
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		g_warn_if_fail (context->message_uid == NULL);
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		async_context_free (context);
-		g_error_free (error);
+	e_mail_folder_append_message_finish (
+		CAMEL_FOLDER (source_object), result,
+		&async_context->message_uid, &local_error);
+
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		g_warn_if_fail (async_context->message_uid == NULL);
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		async_context_free (async_context);
+		g_error_free (local_error);
 		return;
 
-	} else if (error != NULL) {
-		g_warn_if_fail (context->message_uid == NULL);
+	} else if (local_error != NULL) {
+		g_warn_if_fail (async_context->message_uid == NULL);
 		e_alert_submit (
 			alert_sink,
 			"mail-composer:save-to-drafts-error",
-			error->message, NULL);
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		async_context_free (context);
-		g_error_free (error);
+			local_error->message, NULL);
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		async_context_free (async_context);
+		g_error_free (local_error);
 		return;
 	}
 
-	session = e_msg_composer_ref_session (context->composer);
+	session = e_msg_composer_ref_session (async_context->composer);
 
 	/* Mark the previously saved draft message for deletion.
 	 * Note: This is just a nice-to-have; ignore failures. */
 	e_mail_session_handle_draft_headers (
-		E_MAIL_SESSION (session), context->message,
-		G_PRIORITY_DEFAULT, cancellable, (GAsyncReadyCallback)
-		composer_save_to_drafts_complete, context);
+		E_MAIL_SESSION (session),
+		async_context->message,
+		G_PRIORITY_DEFAULT, cancellable,
+		composer_save_to_drafts_complete,
+		async_context);
 
 	g_object_unref (session);
 }
 
 static void
-composer_save_to_drafts_append_mail (AsyncContext *context,
+composer_save_to_drafts_append_mail (AsyncContext *async_context,
                                      CamelFolder *drafts_folder)
 {
 	CamelFolder *local_drafts_folder;
@@ -766,12 +789,12 @@ composer_save_to_drafts_append_mail (AsyncContext *context,
 
 	local_drafts_folder =
 		e_mail_session_get_local_folder (
-		context->session, E_MAIL_LOCAL_FOLDER_DRAFTS);
+		async_context->session, E_MAIL_LOCAL_FOLDER_DRAFTS);
 
 	if (drafts_folder == NULL)
 		drafts_folder = g_object_ref (local_drafts_folder);
 
-	cancellable = e_activity_get_cancellable (context->activity);
+	cancellable = e_activity_get_cancellable (async_context->activity);
 
 	info = camel_message_info_new (NULL);
 
@@ -779,14 +802,14 @@ composer_save_to_drafts_append_mail (AsyncContext *context,
 		info, CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_SEEN, ~0);
 
 	camel_medium_remove_header (
-		CAMEL_MEDIUM (context->message),
+		CAMEL_MEDIUM (async_context->message),
 		"X-Evolution-Replace-Outbox-UID");
 
 	e_mail_folder_append_message (
-		drafts_folder, context->message,
+		drafts_folder, async_context->message,
 		info, G_PRIORITY_DEFAULT, cancellable,
-		(GAsyncReadyCallback) composer_save_to_drafts_cleanup,
-		context);
+		composer_save_to_drafts_cleanup,
+		async_context);
 
 	camel_message_info_free (info);
 
@@ -794,45 +817,55 @@ composer_save_to_drafts_append_mail (AsyncContext *context,
 }
 
 static void
-composer_save_to_drafts_got_folder (EMailSession *session,
+composer_save_to_drafts_got_folder (GObject *source_object,
                                     GAsyncResult *result,
-                                    AsyncContext *context)
+                                    gpointer user_data)
 {
+	EActivity *activity;
 	CamelFolder *drafts_folder;
-	GError *error = NULL;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	drafts_folder = e_mail_session_uri_to_folder_finish (
-		session, result, &error);
+	async_context = (AsyncContext *) user_data;
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		g_warn_if_fail (drafts_folder == NULL);
-		gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-		async_context_free (context);
-		g_error_free (error);
+	activity = async_context->activity;
+
+	drafts_folder = e_mail_session_uri_to_folder_finish (
+		E_MAIL_SESSION (source_object), result, &local_error);
+
+	/* Sanity check. */
+	g_return_if_fail (
+		((drafts_folder != NULL) && (local_error == NULL)) ||
+		((drafts_folder == NULL) && (local_error != NULL)));
+
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		gtkhtml_editor_set_changed (
+			GTKHTML_EDITOR (async_context->composer), TRUE);
+		async_context_free (async_context);
+		g_error_free (local_error);
 		return;
 
-	} else if (error != NULL) {
+	} else if (local_error != NULL) {
 		gint response;
 
-		g_warn_if_fail (drafts_folder == NULL);
-
 		/* XXX Not showing the error message in the dialog? */
-		g_error_free (error);
+		g_error_free (local_error);
 
 		/* If we can't retrieve the Drafts folder for the
 		 * selected account, ask the user if he wants to
 		 * save to the local Drafts folder instead. */
 		response = e_alert_run_dialog_for_args (
-			GTK_WINDOW (context->composer),
+			GTK_WINDOW (async_context->composer),
 			"mail:ask-default-drafts", NULL);
 		if (response != GTK_RESPONSE_YES) {
-			gtkhtml_editor_set_changed (GTKHTML_EDITOR (context->composer), TRUE);
-			async_context_free (context);
+			gtkhtml_editor_set_changed (
+				GTKHTML_EDITOR (async_context->composer), TRUE);
+			async_context_free (async_context);
 			return;
 		}
 	}
 
-	composer_save_to_drafts_append_mail (context, drafts_folder);
+	composer_save_to_drafts_append_mail (async_context, drafts_folder);
 }
 
 static void
@@ -841,18 +874,18 @@ em_utils_composer_save_to_drafts_cb (EMsgComposer *composer,
                                      EActivity *activity,
                                      EMailSession *session)
 {
-	AsyncContext *context;
+	AsyncContext *async_context;
 	EComposerHeaderTable *table;
 	ESource *source;
 	const gchar *local_drafts_folder_uri;
 	const gchar *identity_uid;
 	gchar *drafts_folder_uri = NULL;
 
-	context = g_slice_new0 (AsyncContext);
-	context->message = g_object_ref (message);
-	context->session = g_object_ref (session);
-	context->composer = g_object_ref (composer);
-	context->activity = g_object_ref (activity);
+	async_context = g_slice_new0 (AsyncContext);
+	async_context->message = g_object_ref (message);
+	async_context->session = g_object_ref (session);
+	async_context->composer = g_object_ref (composer);
+	async_context->activity = g_object_ref (activity);
 
 	table = e_msg_composer_get_header_table (composer);
 
@@ -879,65 +912,76 @@ em_utils_composer_save_to_drafts_cb (EMsgComposer *composer,
 		session, E_MAIL_LOCAL_FOLDER_DRAFTS);
 
 	if (drafts_folder_uri == NULL) {
-		composer_save_to_drafts_append_mail (context, NULL);
-		context->folder_uri = g_strdup (local_drafts_folder_uri);
+		composer_save_to_drafts_append_mail (async_context, NULL);
+		async_context->folder_uri = g_strdup (local_drafts_folder_uri);
 	} else {
 		GCancellable *cancellable;
 
 		cancellable = e_activity_get_cancellable (activity);
-		context->folder_uri = g_strdup (drafts_folder_uri);
+		async_context->folder_uri = g_strdup (drafts_folder_uri);
 
 		e_mail_session_uri_to_folder (
 			session, drafts_folder_uri, 0,
 			G_PRIORITY_DEFAULT, cancellable,
-			(GAsyncReadyCallback)
-			composer_save_to_drafts_got_folder, context);
+			composer_save_to_drafts_got_folder,
+			async_context);
 
 		g_free (drafts_folder_uri);
 	}
 }
 
 static void
-composer_save_to_outbox_completed (EMailSession *session,
+composer_save_to_outbox_completed (GObject *source_object,
                                    GAsyncResult *result,
-                                   AsyncContext *context)
+                                   gpointer user_data)
 {
+	EMailSession *session;
+	EActivity *activity;
 	EAlertSink *alert_sink;
-	GError *error = NULL;
+	GCancellable *cancellable;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	alert_sink = e_activity_get_alert_sink (context->activity);
+	session = E_MAIL_SESSION (source_object);
+	async_context = (AsyncContext *) user_data;
+
+	activity = async_context->activity;
+	alert_sink = e_activity_get_alert_sink (activity);
+	cancellable = e_activity_get_cancellable (activity);
 
 	e_mail_session_append_to_local_folder_finish (
-		session, result, NULL, &error);
+		session, result, NULL, &local_error);
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		g_error_free (error);
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		g_error_free (local_error);
 		goto exit;
 
-	} else if (error != NULL) {
+	} else if (local_error != NULL) {
 		e_alert_submit (
 			alert_sink,
 			"mail-composer:append-to-outbox-error",
-			error->message, NULL);
-		g_error_free (error);
+			local_error->message, NULL);
+		g_error_free (local_error);
 		goto exit;
 	}
 
 	/* special processing for Outbox folder */
 	manage_x_evolution_replace_outbox (
-		context->composer, session, context->message,
-		e_activity_get_cancellable (context->activity));
+		async_context->composer,
+		session,
+		async_context->message,
+		cancellable);
 
-	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+	e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
 	/* Wait for the EActivity's completion message to
 	 * time out and then destroy the composer window. */
 	g_object_weak_ref (
-		G_OBJECT (context->activity), (GWeakNotify)
-		gtk_widget_destroy, context->composer);
+		G_OBJECT (activity), (GWeakNotify)
+		gtk_widget_destroy, async_context->composer);
 
 exit:
-	async_context_free (context);
+	async_context_free (async_context);
 }
 
 static void
@@ -946,14 +990,14 @@ em_utils_composer_save_to_outbox_cb (EMsgComposer *composer,
                                      EActivity *activity,
                                      EMailSession *session)
 {
-	AsyncContext *context;
+	AsyncContext *async_context;
 	CamelMessageInfo *info;
 	GCancellable *cancellable;
 
-	context = g_slice_new0 (AsyncContext);
-	context->message = g_object_ref (message);
-	context->composer = g_object_ref (composer);
-	context->activity = g_object_ref (activity);
+	async_context = g_slice_new0 (AsyncContext);
+	async_context->message = g_object_ref (message);
+	async_context->composer = g_object_ref (composer);
+	async_context->activity = g_object_ref (activity);
 
 	cancellable = e_activity_get_cancellable (activity);
 
@@ -963,8 +1007,8 @@ em_utils_composer_save_to_outbox_cb (EMsgComposer *composer,
 	e_mail_session_append_to_local_folder (
 		session, E_MAIL_LOCAL_FOLDER_OUTBOX,
 		message, info, G_PRIORITY_DEFAULT, cancellable,
-		(GAsyncReadyCallback) composer_save_to_outbox_completed,
-		context);
+		composer_save_to_outbox_completed,
+		async_context);
 
 	camel_message_info_free (info);
 }
@@ -1351,7 +1395,7 @@ em_utils_edit_message (EShell *shell,
                        CamelFolder *folder,
                        CamelMimeMessage *message,
                        const gchar *message_uid,
-		       gboolean keep_signature)
+                       gboolean keep_signature)
 {
 	EMsgComposer *composer;
 	ESourceRegistry *registry;
@@ -1447,43 +1491,49 @@ em_utils_edit_message (EShell *shell,
 }
 
 static void
-edit_messages_cb (CamelFolder *folder,
+edit_messages_cb (GObject *source_object,
                   GAsyncResult *result,
-                  AsyncContext *context)
+                  gpointer user_data)
 {
+	CamelFolder *folder;
 	EShell *shell;
 	EMailBackend *backend;
+	EActivity *activity;
 	EAlertSink *alert_sink;
 	GHashTable *hash_table;
 	GHashTableIter iter;
 	gpointer key, value;
-	GError *error = NULL;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	alert_sink = e_mail_reader_get_alert_sink (context->reader);
+	folder = CAMEL_FOLDER (source_object);
+	async_context = (AsyncContext *) user_data;
+
+	activity = async_context->activity;
+	alert_sink = e_activity_get_alert_sink (activity);
 
 	hash_table = e_mail_folder_get_multiple_messages_finish (
-		folder, result, &error);
+		folder, result, &local_error);
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		g_warn_if_fail (hash_table == NULL);
-		async_context_free (context);
-		g_error_free (error);
-		return;
+	/* Sanity check. */
+	g_return_if_fail (
+		((hash_table != NULL) && (local_error == NULL)) ||
+		((hash_table == NULL) && (local_error != NULL)));
+
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		g_error_free (local_error);
+		goto exit;
 
-	} else if (error != NULL) {
-		g_warn_if_fail (hash_table == NULL);
+	} else if (local_error != NULL) {
 		e_alert_submit (
 			alert_sink,
 			"mail:get-multiple-messages",
-			error->message, NULL);
-		async_context_free (context);
-		g_error_free (error);
-		return;
+			local_error->message, NULL);
+		g_error_free (local_error);
+		goto exit;
 	}
 
-	g_return_if_fail (hash_table != NULL);
-
-	backend = e_mail_reader_get_backend (context->reader);
+	backend = e_mail_reader_get_backend (async_context->reader);
 	shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
 
 	/* Open each message in its own composer window. */
@@ -1492,20 +1542,27 @@ edit_messages_cb (CamelFolder *folder,
 
 	while (g_hash_table_iter_next (&iter, &key, &value)) {
 		CamelMimeMessage *message;
+		const gchar *message_uid;
 
-		if (!context->replace)
+		if (!async_context->replace)
 			key = NULL;
 
+		message_uid = (const gchar *) key;
 		message = CAMEL_MIME_MESSAGE (value);
+
 		camel_medium_remove_header (CAMEL_MEDIUM (value), "X-Mailer");
-		em_utils_edit_message (shell, folder, message, key, context->keep_signature);
+
+		em_utils_edit_message (
+			shell, folder, message, message_uid,
+			async_context->keep_signature);
 	}
 
 	g_hash_table_unref (hash_table);
 
-	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+	e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
-	async_context_free (context);
+exit:
+	async_context_free (async_context);
 }
 
 /**
@@ -1522,10 +1579,10 @@ em_utils_edit_messages (EMailReader *reader,
                         CamelFolder *folder,
                         GPtrArray *uids,
                         gboolean replace,
-			gboolean keep_signature)
+                        gboolean keep_signature)
 {
 	EActivity *activity;
-	AsyncContext *context;
+	AsyncContext *async_context;
 	GCancellable *cancellable;
 
 	g_return_if_fail (E_IS_MAIL_READER (reader));
@@ -1535,17 +1592,17 @@ em_utils_edit_messages (EMailReader *reader,
 	activity = e_mail_reader_new_activity (reader);
 	cancellable = e_activity_get_cancellable (activity);
 
-	context = g_slice_new0 (AsyncContext);
-	context->activity = activity;
-	context->reader = g_object_ref (reader);
-	context->ptr_array = g_ptr_array_ref (uids);
-	context->replace = replace;
-	context->keep_signature = keep_signature;
+	async_context = g_slice_new0 (AsyncContext);
+	async_context->activity = activity;
+	async_context->reader = g_object_ref (reader);
+	async_context->ptr_array = g_ptr_array_ref (uids);
+	async_context->replace = replace;
+	async_context->keep_signature = keep_signature;
 
 	e_mail_folder_get_multiple_messages (
 		folder, uids, G_PRIORITY_DEFAULT,
-		cancellable, (GAsyncReadyCallback)
-		edit_messages_cb, context);
+		cancellable, edit_messages_cb,
+		async_context);
 }
 
 static void
@@ -1702,54 +1759,62 @@ forward_attached (EShell *shell,
 }
 
 static void
-forward_attached_cb (CamelFolder *folder,
+forward_attached_cb (GObject *source_object,
                      GAsyncResult *result,
-                     AsyncContext *context)
+                     gpointer user_data)
 {
+	CamelFolder *folder;
 	EShell *shell;
 	EMailBackend *backend;
+	EActivity *activity;
 	EAlertSink *alert_sink;
 	CamelMimePart *part;
 	gchar *subject = NULL;
-	GError *error = NULL;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	alert_sink = e_mail_reader_get_alert_sink (context->reader);
+	folder = CAMEL_FOLDER (source_object);
+	async_context = (AsyncContext *) user_data;
+
+	activity = async_context->activity;
+	alert_sink = e_activity_get_alert_sink (activity);
 
 	part = e_mail_folder_build_attachment_finish (
-		folder, result, &subject, &error);
+		folder, result, &subject, &local_error);
+
+	/* Sanity check. */
+	g_return_if_fail (
+		((part != NULL) && (local_error == NULL)) ||
+		((part == NULL) && (local_error != NULL)));
 
-	if (e_activity_handle_cancellation (context->activity, error)) {
-		g_warn_if_fail (part == NULL);
+	if (e_activity_handle_cancellation (activity, local_error)) {
 		g_warn_if_fail (subject == NULL);
-		async_context_free (context);
-		g_error_free (error);
-		return;
+		g_error_free (local_error);
+		goto exit;
 
-	} else if (error != NULL) {
-		g_warn_if_fail (part == NULL);
+	} else if (local_error != NULL) {
 		g_warn_if_fail (subject == NULL);
 		e_alert_submit (
 			alert_sink,
 			"mail:get-multiple-messages",
-			error->message, NULL);
-		async_context_free (context);
-		g_error_free (error);
-		return;
+			local_error->message, NULL);
+		g_error_free (local_error);
+		goto exit;
 	}
 
-	g_return_if_fail (CAMEL_IS_MIME_PART (part));
-
-	backend = e_mail_reader_get_backend (context->reader);
+	backend = e_mail_reader_get_backend (async_context->reader);
 	shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
 
-	forward_attached (shell, folder, context->ptr_array, part, subject);
+	forward_attached (
+		shell, folder, async_context->ptr_array, part, subject);
 
-	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+	e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
 	g_object_unref (part);
 	g_free (subject);
 
-	async_context_free (context);
+exit:
+	async_context_free (async_context);
 }
 
 static EMsgComposer *
@@ -1765,7 +1830,8 @@ forward_non_attached (EShell *shell,
 	guint32 validity_found = 0;
 	guint32 flags;
 
-	flags = E_MAIL_FORMATTER_QUOTE_FLAG_HEADERS | E_MAIL_FORMATTER_QUOTE_FLAG_KEEP_SIG;
+	flags = E_MAIL_FORMATTER_QUOTE_FLAG_HEADERS |
+		E_MAIL_FORMATTER_QUOTE_FLAG_KEEP_SIG;
 	if (style == E_MAIL_FORWARD_STYLE_QUOTED)
 		flags |= E_MAIL_FORMATTER_QUOTE_FLAG_CITE;
 
@@ -1792,7 +1858,8 @@ forward_non_attached (EShell *shell,
 		if (uid != NULL) {
 			gchar *folder_uri = NULL, *tmp_message_uid = NULL;
 
-			em_utils_get_real_folder_uri_and_message_uid (folder, uid, &folder_uri, &tmp_message_uid);
+			em_utils_get_real_folder_uri_and_message_uid (
+				folder, uid, &folder_uri, &tmp_message_uid);
 
 			e_msg_composer_set_source_headers (
 				composer, folder_uri, tmp_message_uid,
@@ -1867,46 +1934,52 @@ em_utils_forward_message (EShell *shell,
 }
 
 static void
-forward_got_messages_cb (CamelFolder *folder,
+forward_got_messages_cb (GObject *source_object,
                          GAsyncResult *result,
-                         AsyncContext *context)
+                         gpointer user_data)
 {
+	CamelFolder *folder;
 	EShell *shell;
 	EMailBackend *backend;
 	EMailSession *session;
+	EActivity *activity;
 	EAlertSink *alert_sink;
 	GHashTable *hash_table;
 	GHashTableIter iter;
 	gpointer key, value;
-	GError *error = NULL;
+	AsyncContext *async_context;
+	GError *local_error = NULL;
 
-	alert_sink = e_mail_reader_get_alert_sink (context->reader);
+	folder = CAMEL_FOLDER (source_object);
+	async_context = (AsyncContext *) user_data;
+
+	activity = async_context->activity;
+	alert_sink = e_activity_get_alert_sink (activity);
 
 	hash_table = e_mail_folder_get_multiple_messages_finish (
-		folder, result, &error);
+		folder, result, &local_error);
 
-	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;
+	/* Sanity check. */
+	g_return_if_fail (
+		((hash_table != NULL) && (local_error == NULL)) ||
+		((hash_table == NULL) && (local_error != NULL)));
 
-	} else if (error != NULL) {
-		g_warn_if_fail (hash_table == NULL);
+	if (e_activity_handle_cancellation (activity, local_error)) {
+		async_context->destroy_when_done = NULL;
+		g_error_free (local_error);
+		goto exit;
+
+	} else if (local_error != NULL) {
 		e_alert_submit (
 			alert_sink,
 			"mail:get-multiple-messages",
-			error->message, NULL);
-		context->destroy_when_done = NULL;
-		async_context_free (context);
-		g_error_free (error);
-		return;
+			local_error->message, NULL);
+		async_context->destroy_when_done = NULL;
+		g_error_free (local_error);
+		goto exit;
 	}
 
-	g_return_if_fail (hash_table != NULL);
-
-	backend = e_mail_reader_get_backend (context->reader);
+	backend = e_mail_reader_get_backend (async_context->reader);
 	session = e_mail_backend_get_session (backend);
 	shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend));
 
@@ -1914,16 +1987,25 @@ forward_got_messages_cb (CamelFolder *folder,
 
 	g_hash_table_iter_init (&iter, hash_table);
 
-	while (g_hash_table_iter_next (&iter, &key, &value))
+	while (g_hash_table_iter_next (&iter, &key, &value)) {
+		CamelMimeMessage *message;
+		const gchar *message_uid;
+
+		message_uid = (const gchar *) key;
+		message = CAMEL_MIME_MESSAGE (value);
+
 		em_utils_forward_message (
 			shell, CAMEL_SESSION (session),
-			value, context->style, folder, key);
+			message, async_context->style,
+			folder, message_uid);
+	}
 
 	g_hash_table_unref (hash_table);
 
-	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+	e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
 
-	async_context_free (context);
+exit:
+	async_context_free (async_context);
 }
 
 /**
@@ -1959,7 +2041,7 @@ em_utils_forward_messages (EMailReader *reader,
                            GtkWidget *destroy_when_done)
 {
 	EActivity *activity;
-	AsyncContext *context;
+	AsyncContext *async_context;
 	GCancellable *cancellable;
 
 	g_return_if_fail (E_IS_MAIL_READER (reader));
@@ -1969,27 +2051,27 @@ em_utils_forward_messages (EMailReader *reader,
 	activity = e_mail_reader_new_activity (reader);
 	cancellable = e_activity_get_cancellable (activity);
 
-	context = g_slice_new0 (AsyncContext);
-	context->activity = activity;
-	context->reader = g_object_ref (reader);
-	context->ptr_array = g_ptr_array_ref (uids);
-	context->style = style;
-	context->destroy_when_done = destroy_when_done;
+	async_context = g_slice_new0 (AsyncContext);
+	async_context->activity = activity;
+	async_context->reader = g_object_ref (reader);
+	async_context->ptr_array = g_ptr_array_ref (uids);
+	async_context->style = style;
+	async_context->destroy_when_done = destroy_when_done;
 
 	switch (style) {
 		case E_MAIL_FORWARD_STYLE_ATTACHED:
 			e_mail_folder_build_attachment (
 				folder, uids, G_PRIORITY_DEFAULT,
-				cancellable, (GAsyncReadyCallback)
-				forward_attached_cb, context);
+				cancellable, forward_attached_cb,
+				async_context);
 			break;
 
 		case E_MAIL_FORWARD_STYLE_INLINE:
 		case E_MAIL_FORWARD_STYLE_QUOTED:
 			e_mail_folder_get_multiple_messages (
 				folder, uids, G_PRIORITY_DEFAULT,
-				cancellable, (GAsyncReadyCallback)
-				forward_got_messages_cb, context);
+				cancellable, forward_got_messages_cb,
+				async_context);
 			break;
 
 		default:
-- 
cgit