From a27c70e42741771b43d264f17b14c4674d0e51a7 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 2 Jun 2013 15:45:29 -0400 Subject: Add e_mail_reader_forward_messages(). Replaces em_utils_forward_messages(). --- mail/em-composer-utils.c | 279 +++++++---------------------------------------- 1 file changed, 37 insertions(+), 242 deletions(-) (limited to 'mail/em-composer-utils.c') diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index d6c85f3968..b061c85dd0 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -75,9 +75,6 @@ struct _AsyncContext { EMailSession *session; EMsgComposer *composer; EActivity *activity; - EMailReader *reader; - GPtrArray *ptr_array; - EMailForwardStyle style; gchar *folder_uri; gchar *message_uid; }; @@ -96,10 +93,6 @@ async_context_free (AsyncContext *async_context) 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 (async_context->ptr_array != NULL) - g_ptr_array_unref (async_context->ptr_array); g_free (async_context->folder_uri); g_free (async_context->message_uid); @@ -1618,110 +1611,6 @@ setup_forward_attached_callbacks (EMsgComposer *composer, (GDestroyNotify) forward_data_free); } -static EMsgComposer * -forward_attached (EMailBackend *backend, - CamelFolder *folder, - GPtrArray *uids, - CamelMimePart *part, - gchar *subject) -{ - EShell *shell; - EMsgComposer *composer; - - shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend)); - - composer = create_new_composer (shell, subject, folder); - - e_msg_composer_attach (composer, part); - - if (uids) - setup_forward_attached_callbacks (composer, folder, uids); - - composer_set_no_change (composer); - - gtk_widget_show (GTK_WIDGET (composer)); - - return composer; -} - -static void -forward_attached_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - CamelFolder *folder; - EMailBackend *backend; - EActivity *activity; - EAlertSink *alert_sink; - CamelMimePart *part; - CamelDataWrapper *content; - EMsgComposer *composer; - gchar *subject = NULL; - AsyncContext *async_context; - GError *local_error = NULL; - - 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, &local_error); - - /* Sanity check. */ - g_return_if_fail ( - ((part != NULL) && (local_error == NULL)) || - ((part == NULL) && (local_error != NULL))); - - if (e_activity_handle_cancellation (activity, local_error)) { - g_warn_if_fail (subject == NULL); - g_error_free (local_error); - goto exit; - - } else if (local_error != NULL) { - g_warn_if_fail (subject == NULL); - e_alert_submit ( - alert_sink, - "mail:get-multiple-messages", - local_error->message, NULL); - g_error_free (local_error); - goto exit; - } - - backend = e_mail_reader_get_backend (async_context->reader); - - composer = forward_attached ( - backend, folder, async_context->ptr_array, part, subject); - - content = camel_medium_get_content (CAMEL_MEDIUM (part)); - if (CAMEL_IS_MIME_MESSAGE (content)) { - e_mail_reader_composer_created ( - async_context->reader, composer, - CAMEL_MIME_MESSAGE (content)); - } else { - /* XXX What to do for the multipart/digest case? - * Extract the first message from the digest, or - * change the argument type to CamelMimePart and - * just pass the whole digest through? - * - * This signal is primarily serving EMailBrowser, - * which can only forward one message at a time. - * So for the moment it doesn't matter, but still - * something to consider. */ - e_mail_reader_composer_created ( - async_context->reader, composer, NULL); - } - - e_activity_set_state (activity, E_ACTIVITY_COMPLETED); - - g_object_unref (part); - g_free (subject); - -exit: - async_context_free (async_context); -} - static EMsgComposer * forward_non_attached (EMailBackend *backend, CamelFolder *folder, @@ -1800,8 +1689,21 @@ forward_non_attached (EMailBackend *backend, * @folder: a #CamelFolder, or %NULL * @uid: the UID of %message, or %NULL * - * Forwards a message in the given style. See em_utils_forward_messages() - * for more details about forwarding styles. + * Forwards @message in the given @style. + * + * If @style is #E_MAIL_FORWARD_STYLE_ATTACHED, the new message is + * created as follows. If there is more than a single message in @uids, + * a multipart/digest will be constructed and attached to a new composer + * window preset with the appropriate header defaults for forwarding the + * first message in the list. If only one message is to be forwarded, + * it is forwarded as a simple message/rfc822 attachment. + * + * If @style is #E_MAIL_FORWARD_STYLE_INLINE, each message is forwarded + * in its own composer window in 'inline' form. + * + * If @style is #E_MAIL_FORWARD_STYLE_QUOTED, each message is forwarded + * in its own composer window in 'quoted' form (each line starting with + * a "> "). **/ EMsgComposer * em_utils_forward_message (EMailBackend *backend, @@ -1823,8 +1725,8 @@ em_utils_forward_message (EMailBackend *backend, part = mail_tool_make_message_attachment (message); subject = mail_tool_generate_forward_subject (message); - composer = forward_attached ( - backend, NULL, NULL, part, subject); + composer = em_utils_forward_attachment ( + backend, part, subject, NULL, NULL); g_object_unref (part); g_free (subject); @@ -1840,143 +1742,36 @@ em_utils_forward_message (EMailBackend *backend, return composer; } -static void -forward_got_messages_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) +EMsgComposer * +em_utils_forward_attachment (EMailBackend *backend, + CamelMimePart *part, + const gchar *subject, + CamelFolder *folder, + GPtrArray *uids) { - CamelFolder *folder; - EMailBackend *backend; - EActivity *activity; - EAlertSink *alert_sink; - GHashTable *hash_table; - GHashTableIter iter; - gpointer key, value; - AsyncContext *async_context; - GError *local_error = NULL; - - folder = CAMEL_FOLDER (source_object); - async_context = (AsyncContext *) user_data; - - activity = async_context->activity; - alert_sink = e_activity_get_alert_sink (activity); - - backend = e_mail_reader_get_backend (async_context->reader); - - hash_table = e_mail_folder_get_multiple_messages_finish ( - folder, result, &local_error); - - /* 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 (local_error != NULL) { - e_alert_submit ( - alert_sink, - "mail:get-multiple-messages", - local_error->message, NULL); - g_error_free (local_error); - goto exit; - } - - /* Create a new composer window for each message. */ - - g_hash_table_iter_init (&iter, hash_table); - - while (g_hash_table_iter_next (&iter, &key, &value)) { - EMsgComposer *composer; - CamelMimeMessage *message; - const gchar *message_uid; - - message_uid = (const gchar *) key; - message = CAMEL_MIME_MESSAGE (value); - - composer = em_utils_forward_message ( - backend, message, async_context->style, - folder, message_uid); - - e_mail_reader_composer_created ( - async_context->reader, composer, message); - } - - g_hash_table_unref (hash_table); + EShell *shell; + EMsgComposer *composer; - e_activity_set_state (activity, E_ACTIVITY_COMPLETED); + g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); + g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL); -exit: - async_context_free (async_context); -} + if (folder != NULL) + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); -/** - * em_utils_forward_messages: - * @shell: an #EShell - * @folder: folder containing messages to forward - * @uids: uids of messages to forward - * @style: the forward style to use - * - * Forwards a group of messages in the given style. - * - * If @style is #E_MAIL_FORWARD_STYLE_ATTACHED, the new message is - * created as follows. If there is more than a single message in @uids, - * a multipart/digest will be constructed and attached to a new composer - * window preset with the appropriate header defaults for forwarding the - * first message in the list. If only one message is to be forwarded, - * it is forwarded as a simple message/rfc822 attachment. - * - * If @style is #E_MAIL_FORWARD_STYLE_INLINE, each message is forwarded - * in its own composer window in 'inline' form. - * - * If @style is #E_MAIL_FORWARD_STYLE_QUOTED, each message is forwarded - * in its own composer window in 'quoted' form (each line starting with - * a "> "). - **/ -void -em_utils_forward_messages (EMailReader *reader, - CamelFolder *folder, - GPtrArray *uids, - EMailForwardStyle style) -{ - EActivity *activity; - AsyncContext *async_context; - GCancellable *cancellable; + shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend)); - g_return_if_fail (E_IS_MAIL_READER (reader)); - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (uids != NULL); + composer = create_new_composer (shell, subject, folder); - activity = e_mail_reader_new_activity (reader); - cancellable = e_activity_get_cancellable (activity); + e_msg_composer_attach (composer, part); - 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; + if (uids != NULL) + setup_forward_attached_callbacks (composer, folder, uids); - switch (style) { - case E_MAIL_FORWARD_STYLE_ATTACHED: - e_mail_folder_build_attachment ( - folder, uids, G_PRIORITY_DEFAULT, - cancellable, forward_attached_cb, - async_context); - break; + composer_set_no_change (composer); - case E_MAIL_FORWARD_STYLE_INLINE: - case E_MAIL_FORWARD_STYLE_QUOTED: - e_mail_folder_get_multiple_messages ( - folder, uids, G_PRIORITY_DEFAULT, - cancellable, forward_got_messages_cb, - async_context); - break; + gtk_widget_show (GTK_WIDGET (composer)); - default: - g_warn_if_reached (); - } + return composer; } static gint -- cgit v1.2.3