aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-composer-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/em-composer-utils.c')
-rw-r--r--mail/em-composer-utils.c334
1 files changed, 124 insertions, 210 deletions
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 505d50e850..704bd2bd37 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -71,6 +71,7 @@
#define GCONF_KEY_TEMPLATE_PLACEHOLDERS "/apps/evolution/mail/template_placeholders"
typedef struct _AsyncContext AsyncContext;
+typedef struct _ForwardData ForwardData;
struct _AsyncContext {
CamelMimeMessage *message;
@@ -80,6 +81,14 @@ struct _AsyncContext {
gchar *message_uid;
};
+struct _ForwardData {
+ EShell *shell;
+ CamelFolder *folder;
+ GPtrArray *uids;
+ gchar *from_uri;
+ EMailForwardStyle style;
+};
+
static void
async_context_free (AsyncContext *context)
{
@@ -98,6 +107,23 @@ async_context_free (AsyncContext *context)
g_slice_free (AsyncContext, context);
}
+static void
+forward_data_free (ForwardData *data)
+{
+ if (data->shell != NULL)
+ g_object_unref (data->shell);
+
+ if (data->folder != NULL)
+ g_object_unref (data->folder);
+
+ if (data->uids != NULL)
+ em_utils_uids_free (data->uids);
+
+ g_free (data->from_uri);
+
+ g_slice_free (ForwardData, data);
+}
+
static gboolean
ask_confirm_for_unwanted_html_mail (EMsgComposer *composer, EDestination **recipients)
{
@@ -1194,15 +1220,6 @@ emu_update_composers_security (EMsgComposer *composer, guint32 validity_found)
}
}
-/* Forwarding messages... */
-struct forward_attached_data
-{
- EShell *shell;
- CamelFolder *folder;
- GPtrArray *uids;
- gchar *from_uri;
-};
-
static void
real_update_forwarded_flag (gpointer uid, gpointer folder)
{
@@ -1213,44 +1230,40 @@ real_update_forwarded_flag (gpointer uid, gpointer folder)
}
static void
-update_forwarded_flags_cb (EMsgComposer *composer, gpointer user_data)
-{
- struct forward_attached_data *fad = (struct forward_attached_data *) user_data;
-
- if (fad && fad->uids && fad->folder)
- g_ptr_array_foreach (fad->uids, real_update_forwarded_flag, fad->folder);
-}
-
-static void
-composer_destroy_fad_cb (gpointer user_data, GObject *deadbeef)
+update_forwarded_flags_cb (EMsgComposer *composer,
+ ForwardData *data)
{
- struct forward_attached_data *fad = (struct forward_attached_data*) user_data;
-
- if (fad) {
- g_object_unref (fad->folder);
- em_utils_uids_free (fad->uids);
- g_free (fad);
- }
+ if (data && data->uids && data->folder)
+ g_ptr_array_foreach (
+ data->uids, real_update_forwarded_flag, data->folder);
}
static void
-setup_forward_attached_callbacks (EMsgComposer *composer, CamelFolder *folder, GPtrArray *uids)
+setup_forward_attached_callbacks (EMsgComposer *composer,
+ CamelFolder *folder,
+ GPtrArray *uids)
{
- struct forward_attached_data *fad;
+ ForwardData *data;
if (!composer || !folder || !uids || !uids->len)
return;
g_object_ref (folder);
- fad = g_new0 (struct forward_attached_data, 1);
- fad->folder = folder;
- fad->uids = em_utils_uids_copy (uids);
+ data = g_slice_new0 (ForwardData);
+ data->folder = g_object_ref (folder);
+ data->uids = em_utils_uids_copy (uids);
- g_signal_connect (composer, "send", G_CALLBACK (update_forwarded_flags_cb), fad);
- g_signal_connect (composer, "save-draft", G_CALLBACK (update_forwarded_flags_cb), fad);
+ g_signal_connect (
+ composer, "send",
+ G_CALLBACK (update_forwarded_flags_cb), data);
+ g_signal_connect (
+ composer, "save-draft",
+ G_CALLBACK (update_forwarded_flags_cb), data);
- g_object_weak_ref ((GObject *) composer, (GWeakNotify) composer_destroy_fad_cb, fad);
+ g_object_set_data_full (
+ G_OBJECT (composer), "forward-data", data,
+ (GDestroyNotify) forward_data_free);
}
static EMsgComposer *
@@ -1287,49 +1300,14 @@ forward_attached_cb (CamelFolder *folder,
gchar *subject,
gpointer user_data)
{
- struct forward_attached_data *fad = user_data;
+ ForwardData *data = user_data;
if (part)
forward_attached (
- fad->shell, folder, fad->uids,
- messages, part, subject, fad->from_uri);
-
- g_object_unref (fad->shell);
- g_free (fad->from_uri);
- g_free (fad);
-}
+ data->shell, folder, data->uids,
+ messages, part, subject, data->from_uri);
-/**
- * em_utils_forward_attached:
- * @shell: an #EShell
- * @folder: folder containing messages to forward
- * @uids: uids of messages to forward
- * @from_uri: from folder uri
- *
- * 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.
- **/
-void
-em_utils_forward_attached (EShell *shell,
- CamelFolder *folder,
- GPtrArray *uids,
- const gchar *from_uri)
-{
- struct forward_attached_data *fad;
-
- g_return_if_fail (E_IS_SHELL (shell));
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
- g_return_if_fail (uids != NULL);
-
- fad = g_new0 (struct forward_attached_data, 1);
- fad->shell = g_object_ref (shell);
- fad->uids = uids;
- fad->from_uri = g_strdup (from_uri);
-
- mail_build_attachment (folder, uids, forward_attached_cb, fad);
+ forward_data_free (data);
}
static EMsgComposer *
@@ -1393,133 +1371,33 @@ forward_non_attached (EShell *shell,
return composer;
}
-typedef struct {
- EShell *shell;
- gchar *from_uri;
-} ForwardData;
-
-static void
-forward_inline_cb (CamelFolder *folder,
- GPtrArray *uids,
- GPtrArray *messages,
- gpointer user_data)
-{
- ForwardData *data = user_data;
-
- forward_non_attached (
- data->shell, folder, uids, messages,
- E_MAIL_FORWARD_STYLE_INLINE, data->from_uri);
-
- g_free (data->from_uri);
- g_object_unref (data->shell);
- g_slice_free (ForwardData, data);
-}
-
-/**
- * em_utils_forward_inline:
- * @shell: an #EShell
- * @folder: folder containing messages to forward
- * @uids: uids of messages to forward
- * @from_uri: from folder/account uri
- *
- * Forwards each message in the 'inline' form, each in its own composer window.
- **/
-void
-em_utils_forward_inline (EShell *shell,
- CamelFolder *folder,
- GPtrArray *uids,
- const gchar *from_uri)
-{
- ForwardData *data;
-
- g_return_if_fail (E_IS_SHELL (shell));
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
- g_return_if_fail (uids != NULL);
-
- data = g_slice_new (ForwardData);
- data->shell = g_object_ref (shell);
- data->from_uri = g_strdup (from_uri);
-
- mail_get_messages (folder, uids, forward_inline_cb, data);
-}
-
-static void
-forward_quoted_cb (CamelFolder *folder,
- GPtrArray *uids,
- GPtrArray *messages,
- gpointer user_data)
-{
- ForwardData *data = user_data;
-
- forward_non_attached (
- data->shell, folder, uids, messages,
- E_MAIL_FORWARD_STYLE_QUOTED, data->from_uri);
-
- g_free (data->from_uri);
- g_object_unref (data->shell);
- g_slice_free (ForwardData, data);
-}
-
-/**
- * em_utils_forward_quoted:
- * @shell: an #EShell
- * @folder: folder containing messages to forward
- * @uids: uids of messages to forward
- * @from_uri: from folder uri
- *
- * Forwards each message in the 'quoted' form (each line starting with
- * a "> "), each in its own composer window.
- **/
-void
-em_utils_forward_quoted (EShell *shell,
- CamelFolder *folder,
- GPtrArray *uids,
- const gchar *from_uri)
-{
- ForwardData *data;
-
- g_return_if_fail (E_IS_SHELL (shell));
- g_return_if_fail (CAMEL_IS_FOLDER (folder));
- g_return_if_fail (uids != NULL);
-
- data = g_slice_new (ForwardData);
- data->shell = g_object_ref (shell);
- data->from_uri = g_strdup (from_uri);
-
- mail_get_messages (folder, uids, forward_quoted_cb, data);
-}
-
/**
* em_utils_forward_message:
* @shell: an #EShell
* @message: message to be forwarded
* @from_uri: from folder uri
+ * @style: the forward style to use
*
- * Forwards a message in the user's configured default style.
+ * Forwards a message in the given style. See em_utils_forward_messages()
+ * for more details about forwarding styles.
**/
EMsgComposer *
em_utils_forward_message (EShell *shell,
CamelMimeMessage *message,
- const gchar *from_uri)
+ const gchar *from_uri,
+ EMailForwardStyle style)
{
GPtrArray *messages;
CamelMimePart *part;
- GConfClient *client;
- const gchar *key;
gchar *subject;
- EMailForwardStyle style;
EMsgComposer *composer = NULL;
g_return_val_if_fail (E_IS_SHELL (shell), NULL);
+ g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), NULL);
messages = g_ptr_array_new ();
g_ptr_array_add (messages, message);
- client = gconf_client_get_default ();
- key = "/apps/evolution/mail/format/forward_style";
- style = gconf_client_get_int (client, key, NULL);
- g_object_unref (client);
-
switch (style) {
case E_MAIL_FORWARD_STYLE_ATTACHED:
default:
@@ -1552,43 +1430,75 @@ em_utils_forward_message (EShell *shell,
return composer;
}
+static void
+forward_got_messages_cb (CamelFolder *folder,
+ GPtrArray *uids,
+ GPtrArray *messages,
+ gpointer user_data)
+{
+ ForwardData *data = user_data;
+
+ forward_non_attached (
+ data->shell, folder, uids, messages,
+ data->style, data->from_uri);
+
+ forward_data_free (data);
+}
+
/**
* 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.
*
- * Forwards a group of messages in the user's configured default
- * style.
+ * 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 (EShell *shell,
CamelFolder *folder,
GPtrArray *uids,
- const gchar *from_uri)
+ const gchar *from_uri,
+ EMailForwardStyle style)
{
- GConfClient *client;
- const gchar *key;
- EMailForwardStyle style;
+ ForwardData *data;
g_return_if_fail (E_IS_SHELL (shell));
- client = gconf_client_get_default ();
- key = "/apps/evolution/mail/format/forward_style";
- style = gconf_client_get_int (client, key, NULL);
- g_object_unref (client);
+ data = g_slice_new0 (ForwardData);
+ data->shell = g_object_ref (shell);
+ data->uids = em_utils_uids_copy (uids);
+ data->from_uri = g_strdup (from_uri);
+ data->style = style;
switch (style) {
case E_MAIL_FORWARD_STYLE_ATTACHED:
- default:
- em_utils_forward_attached (shell, folder, uids, from_uri);
+ mail_build_attachment (
+ folder, uids, forward_attached_cb, data);
break;
+
case E_MAIL_FORWARD_STYLE_INLINE:
- em_utils_forward_inline (shell, folder, uids, from_uri);
- break;
case E_MAIL_FORWARD_STYLE_QUOTED:
- em_utils_forward_quoted (shell, folder, uids, from_uri);
+ mail_get_messages (
+ folder, uids, forward_got_messages_cb, data);
break;
+
+ default:
+ g_return_if_reached ();
}
}
@@ -2457,7 +2367,10 @@ attribution_format (const gchar *format, CamelMimeMessage *message)
}
static void
-composer_set_body (EMsgComposer *composer, CamelMimeMessage *message, EMFormat *source)
+composer_set_body (EMsgComposer *composer,
+ CamelMimeMessage *message,
+ EMailReplyStyle style,
+ EMFormat *source)
{
gchar *text, *credits;
CamelMimePart *part;
@@ -2466,16 +2379,12 @@ composer_set_body (EMsgComposer *composer, CamelMimeMessage *message, EMFormat *
gboolean start_bottom;
guint32 validity_found = 0;
const gchar *key;
- EMailReplyStyle style;
client = gconf_client_get_default ();
key = "/apps/evolution/mail/composer/reply_start_bottom";
start_bottom = gconf_client_get_bool (client, key, NULL);
- key = "/apps/evolution/mail/format/reply_style";
- style = gconf_client_get_int (client, key, NULL);
-
switch (style) {
case E_MAIL_REPLY_STYLE_DO_NOT_QUOTE:
/* do nothing */
@@ -2527,7 +2436,8 @@ composer_set_body (EMsgComposer *composer, CamelMimeMessage *message, EMFormat *
struct _reply_data {
EShell *shell;
EMFormat *source;
- gint mode;
+ EMailReplyType reply_type;
+ EMailReplyStyle reply_style;
};
gchar *
@@ -2557,7 +2467,8 @@ reply_to_message (CamelFolder *folder,
an extra ref for em_utils_reply_to_message () to drop. */
g_object_ref (message);
em_utils_reply_to_message (
- rd->shell, folder, uid, message, rd->mode, rd->source);
+ rd->shell, folder, uid, message,
+ rd->reply_type, rd->reply_style, rd->source);
}
if (rd->shell != NULL)
@@ -2575,7 +2486,8 @@ reply_to_message (CamelFolder *folder,
* @folder: optional folder
* @uid: optional uid
* @message: message to reply to, optional
- * @mode: reply mode
+ * @type: the type of reply to create
+ * @style: the reply style to use
* @source: source to inherit view settings from
*
* Creates a new composer ready to reply to @message.
@@ -2592,7 +2504,8 @@ em_utils_reply_to_message (EShell *shell,
CamelFolder *folder,
const gchar *uid,
CamelMimeMessage *message,
- gint mode,
+ EMailReplyType type,
+ EMailReplyStyle style,
EMFormat *source)
{
CamelInternetAddress *to, *cc;
@@ -2607,7 +2520,8 @@ em_utils_reply_to_message (EShell *shell,
struct _reply_data *rd = g_malloc0 (sizeof (*rd));
rd->shell = g_object_ref (shell);
- rd->mode = mode;
+ rd->reply_type = type;
+ rd->reply_style = style;
rd->source = source;
if (rd->source)
g_object_ref (rd->source);
@@ -2626,25 +2540,25 @@ em_utils_reply_to_message (EShell *shell,
account = em_utils_guess_account_with_recipients (message, folder);
flags = CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_SEEN;
- switch (mode) {
- case REPLY_MODE_FROM:
+ switch (type) {
+ case E_MAIL_REPLY_TO_FROM:
if (folder)
postto = camel_nntp_address_new ();
get_reply_from (message, to, postto);
break;
- case REPLY_MODE_SENDER:
+ case E_MAIL_REPLY_TO_SENDER:
if (folder)
postto = camel_nntp_address_new ();
get_reply_sender (message, to, postto);
break;
- case REPLY_MODE_LIST:
+ case E_MAIL_REPLY_TO_LIST:
flags |= CAMEL_MESSAGE_ANSWERED_ALL;
if (get_reply_list (message, to))
break;
/* falls through */
- case REPLY_MODE_ALL:
+ case E_MAIL_REPLY_TO_ALL:
flags |= CAMEL_MESSAGE_ANSWERED_ALL;
if (folder)
postto = camel_nntp_address_new ();
@@ -2662,7 +2576,7 @@ em_utils_reply_to_message (EShell *shell,
g_object_unref (to);
g_object_unref (cc);
- composer_set_body (composer, message, source);
+ composer_set_body (composer, message, style, source);
g_object_unref (message);