From a6ae0dc956e2e6a05a842d2001ade946c2c4ea98 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Thu, 14 Jun 2007 09:50:42 +0000 Subject: [PATCH] * src/modest-formatter.[ch]: * New API to create modest new messages. Method modest_formatter_create_message creates a message with the expected multiparts. modest_formatter_create_body_part obtains a new body part to add body contents. * The new API is used now in modest_formatter_do and modest_formatter_attach. * src/modest-tny-msg.c: * (modest_tny_msg_new, modest_tny_msg_new_html_plain, add_body_part, add_html_body_part, add_attachments, create_reply_forward_mail) Uses the new ModestFormatter API to create specific modest formatted messages. This should make creation of messages with attachments and alternatives work far better. * (modest_tny_msg_create_forward_msg): silly bug creating the attachments list removed. * src/modest-mail-operation.c: * Removes a warning on sending new mails without priority set. pmo-trunk-r2222 --- src/modest-formatter.c | 98 ++++++++++++++++++++++++++++++++++++++----- src/modest-formatter.h | 31 +++++++++++++- src/modest-mail-operation.c | 3 +- src/modest-tny-msg.c | 68 +++++++++++++----------------- 4 files changed, 148 insertions(+), 52 deletions(-) diff --git a/src/modest-formatter.c b/src/modest-formatter.c index 8fcbf0d..7bcd5fe 100644 --- a/src/modest-formatter.c +++ b/src/modest-formatter.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -52,7 +53,7 @@ static GObjectClass *parent_class = NULL; typedef gchar* FormatterFunc (ModestFormatter *self, const gchar *text, TnyHeader *header); static TnyMsg *modest_formatter_do (ModestFormatter *self, TnyMimePart *body, TnyHeader *header, - FormatterFunc func); + FormatterFunc func, gboolean has_attachments); static gchar* modest_formatter_wrapper_cite (ModestFormatter *self, const gchar *text, TnyHeader *header); static gchar* modest_formatter_wrapper_quote (ModestFormatter *self, const gchar *text, TnyHeader *header); @@ -116,18 +117,20 @@ construct_from_text (TnyMimePart *part, } static TnyMsg * -modest_formatter_do (ModestFormatter *self, TnyMimePart *body, TnyHeader *header, FormatterFunc func) +modest_formatter_do (ModestFormatter *self, TnyMimePart *body, TnyHeader *header, FormatterFunc func, gboolean has_attachments) { TnyMsg *new_msg = NULL; gchar *body_text = NULL, *txt = NULL; ModestFormatterPrivate *priv; + TnyMimePart *body_part = NULL; g_return_val_if_fail (self, NULL); g_return_val_if_fail (header, NULL); g_return_val_if_fail (func, NULL); /* Build new part */ - new_msg = tny_platform_factory_new_msg (modest_runtime_get_platform_factory()); + new_msg = modest_formatter_create_message (self, TRUE, has_attachments); + body_part = modest_formatter_create_body_part (self, new_msg); if (body) body_text = extract_text (self, body); @@ -136,7 +139,8 @@ modest_formatter_do (ModestFormatter *self, TnyMimePart *body, TnyHeader *header txt = (gchar *) func (self, (const gchar*) body_text, header); priv = MODEST_FORMATTER_GET_PRIVATE (self); - construct_from_text (TNY_MIME_PART (new_msg), (const gchar*) txt, priv->content_type); + construct_from_text (TNY_MIME_PART (body_part), (const gchar*) txt, priv->content_type); + g_object_unref (body_part); /* Clean */ g_free (body_text); @@ -148,19 +152,19 @@ modest_formatter_do (ModestFormatter *self, TnyMimePart *body, TnyHeader *header TnyMsg * modest_formatter_cite (ModestFormatter *self, TnyMimePart *body, TnyHeader *header) { - return modest_formatter_do (self, body, header, modest_formatter_wrapper_cite); + return modest_formatter_do (self, body, header, modest_formatter_wrapper_cite, FALSE); } TnyMsg * modest_formatter_quote (ModestFormatter *self, TnyMimePart *body, TnyHeader *header) { - return modest_formatter_do (self, body, header, modest_formatter_wrapper_quote); + return modest_formatter_do (self, body, header, modest_formatter_wrapper_quote, FALSE); } TnyMsg * -modest_formatter_inline (ModestFormatter *self, TnyMimePart *body, TnyHeader *header) +modest_formatter_inline (ModestFormatter *self, TnyMimePart *body, TnyHeader *header, gboolean has_attachments) { - return modest_formatter_do (self, body, header, modest_formatter_wrapper_inline); + return modest_formatter_do (self, body, header, modest_formatter_wrapper_inline, has_attachments); } TnyMsg * @@ -175,21 +179,22 @@ modest_formatter_attach (ModestFormatter *self, TnyMimePart *body, TnyHeader *he fact = modest_runtime_get_platform_factory (); /* Build new part */ - new_msg = tny_platform_factory_new_msg (fact); - body_part = tny_platform_factory_new_mime_part (fact); + new_msg = modest_formatter_create_message (self, TRUE, TRUE); + body_part = modest_formatter_create_body_part (self, new_msg); attach_part = tny_platform_factory_new_mime_part (fact); /* Create the two parts */ priv = MODEST_FORMATTER_GET_PRIVATE (self); attach_text = extract_text (self, body); construct_from_text (body_part, "", priv->content_type); + g_object_unref (body_part); construct_from_text (attach_part, (const gchar*) attach_text, priv->content_type); subject = tny_header_get_subject (header); tny_mime_part_set_filename (attach_part, subject ? subject : _("No subject")); /* Add parts */ - tny_mime_part_add_part (TNY_MIME_PART (new_msg), body_part); tny_mime_part_add_part (TNY_MIME_PART (new_msg), attach_part); + g_object_unref (attach_part); /* Clean */ g_free (attach_text); @@ -315,3 +320,74 @@ modest_formatter_wrapper_quote (ModestFormatter *self, const gchar *text, TnyHea tny_header_get_date_sent (header), 80); } + +TnyMsg * +modest_formatter_create_message (ModestFormatter *self, gboolean single_body, gboolean has_attachments) +{ + TnyMsg *result = NULL; + TnyPlatformFactory *fact = NULL; + TnyMimePart *body_mime_part = NULL; + fact = modest_runtime_get_platform_factory (); + result = tny_platform_factory_new_msg (fact); + if (has_attachments) { + tny_mime_part_set_content_type (TNY_MIME_PART (result), "multipart/mixed"); + if (!single_body) { + body_mime_part = tny_platform_factory_new_mime_part (fact); + tny_mime_part_set_content_type (body_mime_part, "multipart/alternative"); + tny_mime_part_add_part (TNY_MIME_PART (result), body_mime_part); + g_object_unref (body_mime_part); + } + } else if (!single_body) { + tny_mime_part_set_content_type (TNY_MIME_PART (result), "multipart/alternative"); + } + + return result; +} + +TnyMimePart * +modest_formatter_create_body_part (ModestFormatter *self, TnyMsg *msg) +{ + TnyMimePart *result = NULL; + const gchar *msg_content_type = NULL; + TnyPlatformFactory *fact = NULL; + + fact = modest_runtime_get_platform_factory (); + msg_content_type = tny_mime_part_get_content_type (TNY_MIME_PART (msg)); + /* First it checks if the main part is alternative */ + if ((msg_content_type != NULL) && + (!g_strcasecmp (msg_content_type, "multipart/alternative"))) { + result = tny_platform_factory_new_mime_part (fact); + tny_mime_part_add_part (TNY_MIME_PART (msg), result); + return result; + } else if ((msg_content_type != NULL) && + (!g_strcasecmp (msg_content_type, "multipart/mixed"))) { + TnyList *parts = NULL; + TnyIterator *iter = NULL; + TnyMimePart *alternative_part = NULL; + + parts = TNY_LIST (tny_simple_list_new ()); + tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); + iter = tny_list_create_iterator (parts); + while (!tny_iterator_is_done (iter)) { + TnyMimePart *part = TNY_MIME_PART (tny_iterator_get_current (iter)); + if (!g_strcasecmp(tny_mime_part_get_content_type (part), "multipart/alternative")) { + alternative_part = part; + break; + } + tny_iterator_next (iter); + } + result = tny_platform_factory_new_mime_part (fact); + if (alternative_part != NULL) { + tny_mime_part_add_part (alternative_part, result); + } else { + tny_mime_part_add_part (TNY_MIME_PART (msg), result); + } + g_object_unref (G_OBJECT (parts)); + return result; + } else { + /* We add a reference as this method is intended to obtain + a ref'ed part */ + g_object_ref (msg); + return TNY_MIME_PART (msg); + } +} diff --git a/src/modest-formatter.h b/src/modest-formatter.h index b8c5a92..73fa4f7 100644 --- a/src/modest-formatter.h +++ b/src/modest-formatter.h @@ -152,7 +152,7 @@ TnyMsg * modest_formatter_quote (ModestFormatter *self, TnyMimePart *part, TnyH * * Returns: a newly formatted #TnyMsg or NULL in case of error **/ -TnyMsg * modest_formatter_inline (ModestFormatter *self, TnyMimePart *part, TnyHeader *header); +TnyMsg * modest_formatter_inline (ModestFormatter *self, TnyMimePart *part, TnyHeader *header, gboolean has_attachments); /** * modest_formatter_attach: @@ -166,6 +166,35 @@ TnyMsg * modest_formatter_inline (ModestFormatter *self, TnyMimePart *part, TnyH **/ TnyMsg * modest_formatter_attach (ModestFormatter *self, TnyMimePart *part, TnyHeader *header); +/** + * modest_formatter_create_message: + * @self: a #ModestFormatter + * @single_body: a #gboolean + * @has_attachments: a #gboolean + * + * Creates an empty #TnyMsg with the expected parts for Modest + * formatters and body embedders. + * + * If @has_attachments is %TRUE, the mail will be formatted as + * "multipart/mixed", and attachments will be stored as parts + * of it. The body will be just another multipart. If %FALSE, + * the bodies will be stored directly as the message. + * + * If @single_body is %TRUE, the body will be stored as a + * "multipart/alternative", and the parts will be the different + * alternatives. If %FALSE, this body will be stored directly. + */ +TnyMsg * modest_formatter_create_message (ModestFormatter *self, gboolean single_body, gboolean has_attachments); + +/** + * modest_formatter_create_body_part: + * @self: a #ModestFormatter + * + * Obtains a new formatted body part for @msg, or + * @msg itself if the body is intended to be stored directly + * in it. + */ +TnyMimePart * modest_formatter_create_body_part (ModestFormatter *self, TnyMsg *msg); G_END_DECLS diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index b0e77eb..80e19ca 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -528,7 +528,8 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, /* Set priority flags in message */ header = tny_msg_get_header (new_msg); - tny_header_set_flags (header, priority_flags); + if (priority_flags != 0) + tny_header_set_flags (header, priority_flags); /* Call mail operation */ modest_mail_operation_send_mail (self, transport_account, new_msg); diff --git a/src/modest-tny-msg.c b/src/modest-tny-msg.c index 52890f3..6cf08c1 100644 --- a/src/modest-tny-msg.c +++ b/src/modest-tny-msg.c @@ -45,7 +45,7 @@ #include "modest-text-utils.h" static TnyMimePart * add_body_part (TnyMsg *msg, const gchar *body, - const gchar *content_type, gboolean has_attachments); + const gchar *content_type); static TnyMimePart * add_html_body_part (TnyMsg *msg, const gchar *body); static void add_attachments (TnyMsg *msg, GList *attachments_list); static char * get_content_type(const gchar *s); @@ -56,14 +56,12 @@ modest_tny_msg_new (const gchar* mailto, const gchar* from, const gchar *cc, const gchar *bcc, const gchar* subject, const gchar *body, GSList *attachments) { - TnyPlatformFactory *fact; TnyMsg *new_msg; TnyHeader *header; gchar *content_type; /* Create new msg */ - fact = modest_runtime_get_platform_factory (); - new_msg = tny_platform_factory_new_msg (fact); + new_msg = modest_formatter_create_message (NULL, TRUE, (attachments != NULL)); header = tny_msg_get_header (new_msg); if ((from != NULL) && (strlen(from) > 0)) { @@ -84,7 +82,7 @@ modest_tny_msg_new (const gchar* mailto, const gchar* from, const gchar *cc, /* Add the body of the new mail */ /* This is needed even if body is NULL or empty. */ - add_body_part (new_msg, body, content_type, (attachments ? TRUE: FALSE)); + add_body_part (new_msg, body, content_type); g_free (content_type); /* Add attachments */ @@ -100,14 +98,12 @@ modest_tny_msg_new_html_plain (const gchar* mailto, const gchar* from, const gch const gchar *html_body, const gchar *plain_body, GSList *attachments) { - TnyPlatformFactory *fact; TnyMsg *new_msg; TnyHeader *header; gchar *content_type; /* Create new msg */ - fact = modest_runtime_get_platform_factory (); - new_msg = tny_platform_factory_new_msg (fact); + new_msg = modest_formatter_create_message (NULL, FALSE, (attachments != NULL)); header = tny_msg_get_header (new_msg); if ((from != NULL) && (strlen(from) > 0)) { @@ -127,7 +123,7 @@ modest_tny_msg_new_html_plain (const gchar* mailto, const gchar* from, const gch content_type = get_content_type(plain_body); /* Add the body of the new mail */ - add_body_part (new_msg, plain_body, content_type, TRUE); + add_body_part (new_msg, plain_body, content_type); add_html_body_part (new_msg, html_body); g_free (content_type); @@ -142,8 +138,7 @@ modest_tny_msg_new_html_plain (const gchar* mailto, const gchar* from, const gch static TnyMimePart * add_body_part (TnyMsg *msg, const gchar *body, - const gchar *content_type, - gboolean has_attachments) + const gchar *content_type) { TnyMimePart *text_body_part = NULL; TnyStream *text_body_stream; @@ -153,12 +148,7 @@ add_body_part (TnyMsg *msg, (camel_stream_mem_new_with_buffer (body, (body ? strlen(body) : 0)))); - /* Create body part if needed */ - if (has_attachments) - text_body_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); - else - text_body_part = TNY_MIME_PART(msg); + text_body_part = modest_formatter_create_body_part (NULL, msg); /* Construct MIME part */ tny_stream_reset (text_body_stream); @@ -167,11 +157,7 @@ add_body_part (TnyMsg *msg, content_type); tny_stream_reset (text_body_stream); - /* Add part if needed */ - if (has_attachments) { - tny_mime_part_add_part (TNY_MIME_PART (msg), text_body_part); - g_object_unref (G_OBJECT(text_body_part)); - } + g_object_unref (G_OBJECT(text_body_part)); /* Clean */ g_object_unref (text_body_stream); @@ -192,8 +178,7 @@ add_html_body_part (TnyMsg *msg, (body, strlen(body)))); /* Create body part if needed */ - html_body_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); + html_body_part = modest_formatter_create_body_part (NULL, msg); /* Construct MIME part */ tny_stream_reset (html_body_stream); @@ -202,8 +187,6 @@ add_html_body_part (TnyMsg *msg, "text/html; charset=utf-8"); tny_stream_reset (html_body_stream); - /* Add part if needed */ - tny_mime_part_add_part (TNY_MIME_PART (msg), html_body_part); g_object_unref (G_OBJECT(html_body_part)); /* Clean */ @@ -227,12 +210,16 @@ add_attachments (TnyMsg *msg, GList *attachments_list) old_attachment = pos->data; attachment_filename = tny_mime_part_get_filename (old_attachment); attachment_stream = tny_mime_part_get_stream (old_attachment); - attachment_part = tny_platform_factory_new_mime_part ( - modest_runtime_get_platform_factory()); - + if (TNY_IS_MSG (old_attachment)) { + attachment_part = TNY_MIME_PART (tny_platform_factory_new_msg (modest_runtime_get_platform_factory ())); + } else { + attachment_part = tny_platform_factory_new_mime_part ( + modest_runtime_get_platform_factory()); + } attachment_content_type = tny_mime_part_get_content_type (old_attachment); attachment_cid = tny_mime_part_get_content_id (old_attachment); - + + tny_stream_reset (attachment_stream); tny_mime_part_construct_from_stream (attachment_part, attachment_stream, attachment_content_type); @@ -242,6 +229,7 @@ add_attachments (TnyMsg *msg, GList *attachments_list) tny_mime_part_set_content_id (attachment_part, attachment_cid); tny_mime_part_add_part (TNY_MIME_PART (msg), attachment_part); + g_object_unref (attachment_stream); /* g_object_unref (attachment_part); */ } } @@ -358,7 +346,8 @@ modest_tny_msg_find_body_part (TnyMsg *msg, gboolean want_html) static TnyMsg * -create_reply_forward_mail (TnyMsg *msg, const gchar *from, const gchar *signature, gboolean is_reply, guint type) +create_reply_forward_mail (TnyMsg *msg, const gchar *from, const gchar *signature, + gboolean is_reply, guint type, gboolean has_attachments) { TnyMsg *new_msg; TnyHeader *new_header, *header; @@ -393,7 +382,7 @@ create_reply_forward_mail (TnyMsg *msg, const gchar *from, const gchar *signatur switch (type) { case MODEST_TNY_MSG_FORWARD_TYPE_INLINE: default: - new_msg = modest_formatter_inline (formatter, body, header); + new_msg = modest_formatter_inline (formatter, body, header, has_attachments); break; case MODEST_TNY_MSG_FORWARD_TYPE_ATTACHMENT: new_msg = modest_formatter_attach (formatter, body, header); @@ -431,13 +420,13 @@ static void add_if_attachment (gpointer data, gpointer user_data) { TnyMimePart *part; - GList *attachments_list; + GList **attachments_list; part = TNY_MIME_PART (data); - attachments_list = (GList *) user_data; + attachments_list = ((GList **) user_data); - if (tny_mime_part_is_attachment (part)) - attachments_list = g_list_prepend (attachments_list, part); + if ((tny_mime_part_is_attachment (part))||(TNY_IS_MSG (part))) + *attachments_list = g_list_prepend (*attachments_list, part); } TnyMsg* @@ -450,12 +439,13 @@ modest_tny_msg_create_forward_msg (TnyMsg *msg, TnyList *parts = NULL; GList *attachments_list = NULL; - new_msg = create_reply_forward_mail (msg, from, signature, FALSE, forward_type); /* Add attachments */ parts = TNY_LIST (tny_simple_list_new()); tny_mime_part_get_parts (TNY_MIME_PART (msg), parts); - tny_list_foreach (parts, add_if_attachment, attachments_list); + tny_list_foreach (parts, add_if_attachment, &attachments_list); + + new_msg = create_reply_forward_mail (msg, from, signature, FALSE, forward_type, (attachments_list != NULL)); add_attachments (new_msg, attachments_list); /* Clean */ @@ -480,7 +470,7 @@ modest_tny_msg_create_reply_msg (TnyMsg *msg, const gchar *cc = NULL, *bcc = NULL; GString *tmp = NULL; - new_msg = create_reply_forward_mail (msg, from, signature, TRUE, reply_type); + new_msg = create_reply_forward_mail (msg, from, signature, TRUE, reply_type, FALSE); /* Fill the header */ header = tny_msg_get_header (msg); -- 1.7.9.5