Remove addresses already in To: on creatin ReplyToAll Cc: (fixes NB#125907)
[modest] / src / modest-tny-msg.c
index 5b56469..c4b8cf0 100644 (file)
@@ -1006,7 +1006,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;
 
@@ -1016,6 +1016,21 @@ 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);
        g_free (old_cc);
@@ -1171,17 +1186,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));
@@ -1254,11 +1271,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);
@@ -1266,32 +1287,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;
 }