[evolution] Add e_mail_reader_forward_messages().



commit a27c70e42741771b43d264f17b14c4674d0e51a7
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Jun 2 15:45:29 2013 -0400

    Add e_mail_reader_forward_messages().
    
    Replaces em_utils_forward_messages().

 mail/e-mail-reader-utils.c |  206 ++++++++++++++++++++++++++++++++
 mail/e-mail-reader-utils.h |    4 +
 mail/e-mail-reader.c       |    8 +-
 mail/em-composer-utils.c   |  279 ++++++--------------------------------------
 mail/em-composer-utils.h   |    9 +-
 5 files changed, 256 insertions(+), 250 deletions(-)
---
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 81efa8f..d1b8d88 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -65,11 +65,13 @@ struct _AsyncContext {
        EMailPartList *part_list;
        EMailReader *reader;
        CamelInternetAddress *address;
+       GPtrArray *uids;
        gchar *folder_name;
        gchar *message_uid;
 
        EMailReplyType reply_type;
        EMailReplyStyle reply_style;
+       EMailForwardStyle forward_style;
        GtkPrintOperationAction print_action;
        const gchar *filter_source;
        gint filter_type;
@@ -87,6 +89,9 @@ async_context_free (AsyncContext *async_context)
        g_clear_object (&async_context->reader);
        g_clear_object (&async_context->address);
 
+       if (async_context->uids != NULL)
+               g_ptr_array_unref (async_context->uids);
+
        g_free (async_context->folder_name);
        g_free (async_context->message_uid);
 
@@ -1385,6 +1390,207 @@ e_mail_reader_edit_messages (EMailReader *reader,
        g_object_unref (activity);
 }
 
+static void
+mail_reader_forward_attachment_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 = em_utils_forward_attachment (
+               backend, part, subject, folder, async_context->uids);
+
+       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 void
+mail_reader_forward_messages_cb (GObject *source_object,
+                                 GAsyncResult *result,
+                                 gpointer user_data)
+{
+       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->forward_style,
+                       folder, message_uid);
+
+               e_mail_reader_composer_created (
+                       async_context->reader, composer, message);
+       }
+
+       g_hash_table_unref (hash_table);
+
+       e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
+
+exit:
+       async_context_free (async_context);
+}
+
+void
+e_mail_reader_forward_messages (EMailReader *reader,
+                                CamelFolder *folder,
+                                GPtrArray *uids,
+                                EMailForwardStyle style)
+{
+       EActivity *activity;
+       GCancellable *cancellable;
+       AsyncContext *async_context;
+
+       g_return_if_fail (E_IS_MAIL_READER (reader));
+       g_return_if_fail (CAMEL_IS_FOLDER (folder));
+       g_return_if_fail (uids != NULL);
+
+       activity = e_mail_reader_new_activity (reader);
+       cancellable = e_activity_get_cancellable (activity);
+
+       async_context = g_slice_new0 (AsyncContext);
+       async_context->activity = g_object_ref (activity);
+       async_context->reader = g_object_ref (reader);
+       async_context->uids = g_ptr_array_ref (uids);
+       async_context->forward_style = style;
+
+       switch (style) {
+               case E_MAIL_FORWARD_STYLE_ATTACHED:
+                       e_mail_folder_build_attachment (
+                               folder, uids,
+                               G_PRIORITY_DEFAULT,
+                               cancellable,
+                               mail_reader_forward_attachment_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,
+                               mail_reader_forward_messages_cb,
+                               async_context);
+                       break;
+
+               default:
+                       g_warn_if_reached ();
+       }
+
+       g_object_unref (activity);
+}
+
 /* Helper for e_mail_reader_reply_to_message()
  * XXX This function belongs in e-html-utils.c */
 static gboolean
diff --git a/mail/e-mail-reader-utils.h b/mail/e-mail-reader-utils.h
index 1b91a8f..692622c 100644
--- a/mail/e-mail-reader-utils.h
+++ b/mail/e-mail-reader-utils.h
@@ -73,6 +73,10 @@ void         e_mail_reader_edit_messages     (EMailReader *reader,
                                                 GPtrArray *uids,
                                                 gboolean replace,
                                                 gboolean keep_signature);
+void           e_mail_reader_forward_messages  (EMailReader *reader,
+                                                CamelFolder *folder,
+                                                GPtrArray *uids,
+                                                EMailForwardStyle style);
 void           e_mail_reader_reply_to_message  (EMailReader *reader,
                                                 CamelMimeMessage *message,
                                                 EMailReplyType reply_type);
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 4730ac5..f63908c 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -656,7 +656,7 @@ action_mail_forward_cb (GtkAction *action,
        g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
 
        if (em_utils_ask_open_many (window, uids->len))
-               em_utils_forward_messages (
+               e_mail_reader_forward_messages (
                        reader, folder, uids,
                        e_mail_reader_get_forward_style (reader));
 
@@ -681,7 +681,7 @@ action_mail_forward_attached_cb (GtkAction *action,
        g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
 
        if (em_utils_ask_open_many (window, uids->len))
-               em_utils_forward_messages (
+               e_mail_reader_forward_messages (
                        reader, folder, uids,
                        E_MAIL_FORWARD_STYLE_ATTACHED);
 
@@ -706,7 +706,7 @@ action_mail_forward_inline_cb (GtkAction *action,
        g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
 
        if (em_utils_ask_open_many (window, uids->len))
-               em_utils_forward_messages (
+               e_mail_reader_forward_messages (
                        reader, folder, uids,
                        E_MAIL_FORWARD_STYLE_INLINE);
 
@@ -731,7 +731,7 @@ action_mail_forward_quoted_cb (GtkAction *action,
        g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free);
 
        if (em_utils_ask_open_many (window, uids->len))
-               em_utils_forward_messages (
+               e_mail_reader_forward_messages (
                        reader, folder, uids,
                        E_MAIL_FORWARD_STYLE_QUOTED);
 
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index d6c85f3..b061c85 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);
@@ -1619,110 +1612,6 @@ setup_forward_attached_callbacks (EMsgComposer *composer,
 }
 
 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,
                       const gchar *uid,
@@ -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
diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h
index 3cca983..a99c3c8 100644
--- a/mail/em-composer-utils.h
+++ b/mail/em-composer-utils.h
@@ -26,8 +26,8 @@
 
 #include <em-format/e-mail-part.h>
 #include <mail/e-mail-backend.h>
-#include <mail/e-mail-reader.h>
 #include <composer/e-msg-composer.h>
+#include <em-format/e-mail-part-list.h>
 #include <libemail-engine/e-mail-enums.h>
 
 G_BEGIN_DECLS
@@ -48,10 +48,11 @@ EMsgComposer *      em_utils_forward_message        (EMailBackend *backend,
                                                 EMailForwardStyle style,
                                                 CamelFolder *folder,
                                                 const gchar *uid);
-void           em_utils_forward_messages       (EMailReader *reader,
+EMsgComposer * em_utils_forward_attachment     (EMailBackend *backend,
+                                                CamelMimePart *part,
+                                                const gchar *subject,
                                                 CamelFolder *folder,
-                                                GPtrArray *uids,
-                                                EMailForwardStyle style);
+                                                GPtrArray *uids);
 EMsgComposer * em_utils_redirect_message       (EShell *shell,
                                                 CamelMimeMessage *message);
 gchar *                em_utils_construct_composer_text


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