From 8ff0684fa2e371a80cca60e8df167cc104c473c2 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 12 May 2011 18:18:59 -0400 Subject: em_format_html_print_message(): Require a CamelMimeMessage. Let EMailReader fetch the CamelMimeMessage itself, handle errors, and then pass it off to EMFormatHTMLPrint. This also eliminates the need for em_format_html_print_raw_message(). --- mail/e-mail-reader-utils.c | 88 +++++++++++++++++++++++++++++++++++++++------ mail/em-composer-utils.c | 2 +- mail/em-format-html-print.c | 47 +++++++----------------- mail/em-format-html-print.h | 3 +- 4 files changed, 91 insertions(+), 49 deletions(-) diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c index 6ed50b1742..194758489e 100644 --- a/mail/e-mail-reader-utils.c +++ b/mail/e-mail-reader-utils.c @@ -50,6 +50,9 @@ struct _AsyncContext { EActivity *activity; CamelFolder *folder; EMailReader *reader; + gchar *message_uid; + + GtkPrintOperationAction print_action; const gchar *filter_source; gint filter_type; }; @@ -66,6 +69,8 @@ async_context_free (AsyncContext *context) if (context->reader != NULL) g_object_unref (context->reader); + g_free (context->message_uid); + g_slice_free (AsyncContext, context); } @@ -327,12 +332,61 @@ e_mail_reader_open_selected (EMailReader *reader) return ii; } +/* Helper for e_mail_reader_print() */ +static void +mail_reader_print_cb (CamelFolder *folder, + GAsyncResult *result, + AsyncContext *context) +{ + EAlertSink *alert_sink; + CamelMimeMessage *message; + EMFormatHTML *formatter; + EMFormatHTMLPrint *html_print; + GError *error = NULL; + + alert_sink = e_activity_get_alert_sink (context->activity); + + message = camel_folder_get_message_finish (folder, result, &error); + + if (e_activity_handle_cancellation (context->activity, error)) { + g_warn_if_fail (message == NULL); + async_context_free (context); + g_error_free (error); + return; + + } else if (error != NULL) { + g_warn_if_fail (message == NULL); + e_alert_submit ( + alert_sink, "no-retrieve-message", + error->message, NULL); + async_context_free (context); + g_error_free (error); + return; + } + + g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); + + formatter = e_mail_reader_get_formatter (context->reader); + + html_print = em_format_html_print_new ( + formatter, context->print_action); + em_format_merge_handler ( + EM_FORMAT (html_print), EM_FORMAT (formatter)); + em_format_html_print_message ( + html_print, message, folder, context->message_uid); + g_object_unref (html_print); + + g_object_unref (message); + + e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED); + + async_context_free (context); +} + void e_mail_reader_print (EMailReader *reader, GtkPrintOperationAction action) { - EMFormatHTML *formatter; - EMFormatHTMLPrint *html_print; CamelFolder *folder; GPtrArray *uids; @@ -343,18 +397,30 @@ e_mail_reader_print (EMailReader *reader, /* XXX Learn to handle len > 1. */ uids = e_mail_reader_get_selected_uids (reader); - if (uids->len != 1) - goto exit; + g_return_if_fail (uids != NULL); - formatter = e_mail_reader_get_formatter (reader); + if (uids->len == 1) { + EActivity *activity; + AsyncContext *context; + GCancellable *cancellable; + const gchar *message_uid; - html_print = em_format_html_print_new (formatter, action); - em_format_merge_handler ( - EM_FORMAT (html_print), EM_FORMAT (formatter)); - em_format_html_print_message (html_print, folder, uids->pdata[0]); - g_object_unref (html_print); + activity = e_mail_reader_new_activity (reader); + cancellable = e_activity_get_cancellable (activity); + message_uid = uids->pdata[0]; + + context = g_slice_new0 (AsyncContext); + context->activity = activity; + context->reader = g_object_ref (reader); + context->message_uid = g_strdup (message_uid); + context->print_action = action; + + camel_folder_get_message ( + folder, message_uid, G_PRIORITY_DEFAULT, + cancellable, (GAsyncReadyCallback) + mail_reader_print_cb, context); + } -exit: em_utils_uids_free (uids); } diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index a8208dc225..e72e5db257 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -864,7 +864,7 @@ em_utils_composer_print_cb (EMsgComposer *composer, EMFormatHTMLPrint *efhp; efhp = em_format_html_print_new (NULL, action); - em_format_html_print_raw_message (efhp, message); + em_format_html_print_message (efhp, message, NULL, NULL); g_object_unref (efhp); } diff --git a/mail/em-format-html-print.c b/mail/em-format-html-print.c index 1be0e5ed63..e6da0c983a 100644 --- a/mail/em-format-html-print.c +++ b/mail/em-format-html-print.c @@ -222,36 +222,14 @@ emfhp_complete (EMFormatHTMLPrint *efhp) g_object_unref (operation); } -static void -emfhp_got_message (CamelFolder *folder, - const gchar *uid, - CamelMimeMessage *msg, - gpointer data) -{ - EMFormatHTMLPrint *efhp = data; - - if (msg == NULL) { - g_object_unref (efhp); - return; - } - - em_format_html_load_images (EM_FORMAT_HTML (efhp)); - - g_signal_connect ( - efhp, "complete", G_CALLBACK (emfhp_complete), efhp); - - /* FIXME Not passing a GCancellable here. */ - em_format_format_clone ( - (EMFormat *) efhp, folder, uid, msg, - (EMFormat *) efhp->source, NULL); -} - void em_format_html_print_message (EMFormatHTMLPrint *efhp, + CamelMimeMessage *message, CamelFolder *folder, - const gchar *uid) + const gchar *message_uid) { - g_object_ref (efhp); + g_return_if_fail (EM_IS_FORMAT_HTML_PRINT (efhp)); + g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); /* Wrap flags to display all entries by default.*/ EM_FORMAT_HTML (efhp)->header_wrap_flags |= @@ -259,15 +237,14 @@ em_format_html_print_message (EMFormatHTMLPrint *efhp, EM_FORMAT_HTML_HEADER_CC | EM_FORMAT_HTML_HEADER_BCC; - mail_get_message ( - folder, uid, emfhp_got_message, efhp, mail_msg_unordered_push); -} + em_format_html_load_images (EM_FORMAT_HTML (efhp)); -void -em_format_html_print_raw_message (EMFormatHTMLPrint *efhp, - CamelMimeMessage *msg) -{ - g_object_ref (efhp); + g_signal_connect ( + efhp, "complete", G_CALLBACK (emfhp_complete), efhp); - emfhp_got_message (NULL, NULL, msg, efhp); + /* FIXME Not passing a GCancellable here. */ + em_format_format_clone ( + EM_FORMAT (efhp), + folder, message_uid, message, + EM_FORMAT (efhp->source), NULL); } diff --git a/mail/em-format-html-print.h b/mail/em-format-html-print.h index 7b05d7a28e..446f93fd78 100644 --- a/mail/em-format-html-print.h +++ b/mail/em-format-html-print.h @@ -64,10 +64,9 @@ EMFormatHTMLPrint * em_format_html_print_new (EMFormatHTML *source, GtkPrintOperationAction action); void em_format_html_print_message (EMFormatHTMLPrint *efhp, + CamelMimeMessage *message, CamelFolder *folder, const gchar *uid); -void em_format_html_print_raw_message (EMFormatHTMLPrint *efhp, - CamelMimeMessage *msg); G_END_DECLS -- cgit v1.2.3