Remove undisclosed recipients only for creating new messages, not in simplifying
[modest] / src / modest-tny-msg.c
index 4934028..b7de9db 100644 (file)
@@ -659,6 +659,7 @@ create_reply_forward_mail (TnyMsg *msg, TnyHeader *header, const gchar *from,
        gchar *subject_prefix;
        gboolean no_text_part;
        gchar *parent_uid;
+       gboolean forward_as_attach = FALSE;
 
        if (header)
                g_object_ref (header);
@@ -684,12 +685,14 @@ create_reply_forward_mail (TnyMsg *msg, TnyHeader *header, const gchar *from,
 
        /* when we're reply, include the text part if we have it, or nothing otherwise. */
        if (is_reply)
-               new_msg = modest_formatter_quote  (formatter, no_text_part ? NULL: body, header,
+               new_msg = modest_formatter_quote  (formatter, body, header,
                                                    attachments);
        else {
                if (no_text_part || (html_body && (strcmp (tny_mime_part_get_content_type (html_body), "text/html")==0))) {
+                       forward_as_attach = TRUE;
                        new_msg = modest_formatter_attach (formatter, msg, header);
                } else {
+                       forward_as_attach = FALSE;
                        new_msg = modest_formatter_inline  (formatter, body, header,
                                                            attachments);
                }
@@ -737,7 +740,7 @@ create_reply_forward_mail (TnyMsg *msg, TnyHeader *header, const gchar *from,
        g_object_unref (G_OBJECT (header));
        /* ugly to unref it here instead of in the calling func */
 
-       if (!is_reply & !no_text_part) {
+       if (!is_reply & !forward_as_attach) {
                add_attachments (TNY_MIME_PART (new_msg), attachments, FALSE, NULL);
        }
 
@@ -917,6 +920,38 @@ count_addresses (const gchar* addresses)
        return count;
 }
 
+static void
+remove_undisclosed_recipients (gchar **recipients)
+{
+       GSList *addresses, *node;
+       gboolean is_first;
+       GString *result;
+
+       g_return_if_fail (recipients);
+       addresses = modest_text_utils_split_addresses_list (*recipients);
+
+       is_first = TRUE;
+       result = g_string_new ("");
+       for (node = addresses; node != NULL; node = g_slist_next (node)) {
+               const gchar *address = (const gchar *) node->data;
+
+               if (address && strstr (address, "undisclosed-recipients"))
+                       continue;
+
+               if (is_first)
+                       is_first = FALSE;
+               else
+                       result = g_string_append (result, ", ");
+
+               result = g_string_append (result, address);
+       }
+       g_slist_foreach (addresses, (GFunc)g_free, NULL);
+       g_slist_free (addresses);
+
+       g_free (*recipients);
+       *recipients = g_string_free (result, FALSE);
+}
+
 
 /* get the new To:, based on the old header,
  * result is newly allocated or NULL in case of error
@@ -993,6 +1028,7 @@ get_new_to (TnyMsg *msg, TnyHeader *header, const gchar* from,
        }
 
        tmp = modest_text_utils_simplify_recipients (new_to);
+       remove_undisclosed_recipients  (&tmp);
        g_free (new_to);
        new_to = tmp;
 
@@ -1003,7 +1039,7 @@ get_new_to (TnyMsg *msg, TnyHeader *header, const gchar* from,
 /* get the new Cc:, based on the old header,
  * result is newly allocated or NULL in case of error */
 static gchar*
-get_new_cc (TnyHeader *header, const gchar* from)
+get_new_cc (TnyHeader *header, const gchar* from, const gchar *new_to)
 {
        gchar *old_cc, *result, *dup;
 
@@ -1013,8 +1049,27 @@ get_new_cc (TnyHeader *header, const gchar* from)
 
        /* remove me (the new From:) from the Cc: list */
        dup =  modest_text_utils_remove_address (old_cc, from);
+
+       if (new_to) {
+               gchar **to_parts, **current;
+
+               to_parts = g_strsplit (new_to, ",", 0);
+               for (current = to_parts; current && *current != '\0'; current++) {
+                       gchar *dup2;
+
+                       dup2 = modest_text_utils_remove_address (dup, g_strstrip (*current));
+                       g_free (dup);
+                       dup = dup2;
+               }
+               g_strfreev (to_parts);
+       }
+
        result = modest_text_utils_remove_duplicate_addresses (dup);
        g_free (dup);
+       dup = result;
+       result = modest_text_utils_simplify_recipients (dup);
+       remove_undisclosed_recipients  (&result);
+       g_free (dup);
        g_free (old_cc);
        return result;
 }
@@ -1168,17 +1223,19 @@ modest_tny_msg_create_reply_msg (TnyMsg *msg,
                g_debug ("%s: failed to get new To:", __FUNCTION__);
        else {
                tny_header_set_to (new_header, new_to);
-               g_free (new_to);
        }
 
        if (reply_mode == MODEST_TNY_MSG_REPLY_MODE_ALL) {
-               gchar *new_cc = get_new_cc (header, from);
+               gchar *new_cc = get_new_cc (header, from, new_to);
                if (new_cc) { 
                        tny_header_set_cc (new_header, new_cc);
                        g_free (new_cc);
                }
        }
 
+       if (new_to)
+               g_free (new_to);
+
        /* Clean */
        g_object_unref (G_OBJECT (new_header));
        g_object_unref (G_OBJECT (header));
@@ -1251,11 +1308,15 @@ modest_tny_msg_header_get_all_recipients_list (TnyHeader *header)
 {
        GSList *recipients = NULL;
        gchar *from = NULL, *to = NULL, *cc = NULL, *bcc = NULL;
-       gchar *tmp = NULL, *old_tmp = NULL;
+       gchar *after_remove;
+       GString *buffer;
+       gboolean add_separator = TRUE;
 
        if (header == NULL)
                return NULL;
 
+       buffer = g_string_new ("");
+
        from = tny_header_dup_from (header);
        to = tny_header_dup_to (header);
        cc = tny_header_dup_cc (header);
@@ -1263,32 +1324,39 @@ modest_tny_msg_header_get_all_recipients_list (TnyHeader *header)
 
        recipients = NULL;
        if (from) {
-               tmp = g_strdup (from);
-               old_tmp = tmp;
-               g_free (from);
+               buffer = g_string_append (buffer, from);
+               add_separator = TRUE;
        }
        if (to) {
-               tmp = g_strjoin ("; ", old_tmp, to, NULL);
-               g_free (old_tmp);
-               old_tmp = tmp;
-               g_free (to);
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, to);
        }
        if (cc) {
-               tmp = g_strjoin ("; ", old_tmp, cc, NULL);
-               g_free (old_tmp);
-               old_tmp = tmp;
-               g_free (cc);
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, cc);
        }
        if (bcc) {
-               tmp = g_strjoin ("; ", old_tmp, bcc, NULL);
-               g_free (old_tmp);
-               old_tmp = tmp;
-               g_free (bcc);
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, bcc);
        }
 
-       old_tmp = modest_text_utils_remove_duplicate_addresses (tmp);
-       recipients = modest_text_utils_split_addresses_list (old_tmp);
-       g_free (tmp);
+       after_remove = modest_text_utils_remove_duplicate_addresses (buffer->str);
+       g_string_free (buffer, TRUE);
+
+       recipients = modest_text_utils_split_addresses_list (after_remove);
+       g_free (after_remove);
 
        return recipients;
 }