Use non-localized reply and forward prefixes
authorSergio Villar Senín <svillar@igalia.com>
Thu, 14 Jan 2010 20:39:19 +0000 (21:39 +0100)
committerSergio Villar Senín <svillar@igalia.com>
Thu, 14 Jan 2010 20:40:22 +0000 (21:40 +0100)
Fixes NB#142363

src/modest-text-utils.c

index c244d44..7b60998 100644 (file)
@@ -302,8 +302,7 @@ modest_text_utils_derived_subject (const gchar *subject, gboolean is_reply)
        gchar *tmp, *subject_dup, *retval, *prefix;
        const gchar *untranslated_prefix;
        gint prefix_len, untranslated_prefix_len;
-       gboolean translated_found = FALSE;
-       gboolean first_time;
+       gboolean found = FALSE;
 
        if (!subject || subject[0] == '\0')
                subject = _("mail_va_no_subject");
@@ -318,54 +317,33 @@ modest_text_utils_derived_subject (const gchar *subject, gboolean is_reply)
        untranslated_prefix =  (is_reply) ? "Re:" : "Fw:";
        untranslated_prefix_len = 3;
 
-       /* We do not want things like "Re: Re: Re:" or "Fw: Fw:" so
-          delete the previous ones */
-       first_time = TRUE;
-       do {
-               if (g_str_has_prefix (tmp, prefix)) {
-                       tmp += prefix_len;
-                       tmp = g_strchug (tmp);
-                       /* Do not consider translated prefixes in the
-                          middle of a Re:Re:..Re: like sequence */
-                       if (G_UNLIKELY (first_time))
-                               translated_found = TRUE;
-               } else if (g_str_has_prefix (tmp, untranslated_prefix)) {
-                       tmp += untranslated_prefix_len;
-                       tmp = g_strchug (tmp);
-               } else {
-                       gchar *prefix_down, *tmp_down;
-
-                       /* We need this to properly check the cases of
-                          some clients adding FW: instead of Fw: for
-                          example */
-                       prefix_down = g_utf8_strdown (prefix, -1);
-                       tmp_down = g_utf8_strdown (tmp, -1);
-                       if (g_str_has_prefix (tmp_down, prefix_down)) {
-                               tmp += prefix_len;
-                               tmp = g_strchug (tmp);
-                               g_free (prefix_down);
-                               g_free (tmp_down);
-                       } else {
-                               g_free (prefix_down);
-                               g_free (tmp_down);
-                               break;
-                       }
-               }
-               first_time = FALSE;
-       } while (tmp);
+       if (g_str_has_prefix (tmp, prefix) ||
+           g_str_has_prefix (tmp, untranslated_prefix)) {
+               found = TRUE;
+       } else {
+               gchar *prefix_down, *tmp_down, *untranslated_down;
 
-       if (!g_strcmp0 (subject, tmp)) {
-               /* normal case */
-               retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+               prefix_down = g_utf8_strdown (prefix, -1);
+               untranslated_down = g_utf8_strdown (untranslated_prefix, -1);
+               tmp_down = g_utf8_strdown (tmp, -1);
+               if (g_str_has_prefix (tmp_down, prefix_down) ||
+                   g_str_has_prefix (tmp_down, untranslated_down) ||
+                   (!is_reply && g_str_has_prefix (tmp_down, "fwd:")))
+                       found = TRUE;
+
+               g_free (prefix_down);
+               g_free (untranslated_down);
+               g_free (tmp_down);
+       }
+
+       if (found) {
+               /* If the prefix is already present do not touch the subject */
+               retval = subject_dup;
        } else {
-               if (translated_found) {
-                       /* Found a translated prefix, i.e, "VS:" in Finish */
-                       retval = g_strdup_printf ("%s %s", prefix, tmp);
-               } else {
-                       retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
-               }
+               /* Normal case, add the prefix */
+               retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+               g_free (subject_dup);
        }
-       g_free (subject_dup);
        g_free (prefix);
 
        return retval;