Added the function that quotes emails
authorSergio Villar Senin <svillar@igalia.com>
Fri, 11 Sep 2009 08:31:17 +0000 (10:31 +0200)
committerSergio Villar Senin <svillar@igalia.com>
Fri, 11 Sep 2009 08:31:17 +0000 (10:31 +0200)
Insert a "\n" when resolving recipients if the resolved recipient is in the middle of others
This is fix 2/2 for bug NB#137187

src/hildon2/modest-msg-edit-window.c
src/modest-text-utils.c
src/modest-text-utils.h
src/widgets/modest-recpt-editor.c

index c9c8497..d320080 100644 (file)
@@ -1359,12 +1359,17 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich)
        modest_tny_msg_get_references (TNY_MSG (msg), NULL, &(priv->references), &(priv->in_reply_to));
        priority_flags = tny_header_get_priority (header);
 
-       if (to)
-               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->to_field),  to);
+       if (to) {
+               gchar *quoted_names = modest_text_utils_quote_names (to);
+               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->to_field), quoted_names);
+               g_free (quoted_names);
+       }
 
        field_view_set = TRUE;
        if (cc) {
-               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->cc_field),  cc);
+               gchar *quoted_names = modest_text_utils_quote_names (cc);
+               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->cc_field),  quoted_names);
+               g_free (quoted_names);
                gtk_widget_set_no_show_all (priv->cc_caption, FALSE);
                gtk_widget_show (priv->cc_caption);
        } else if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_SHOW_CC, NULL)) {
@@ -1376,7 +1381,9 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich)
 
        field_view_set = TRUE;
        if (bcc) {
-               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->bcc_field), bcc);
+               gchar *quoted_names = modest_text_utils_quote_names (bcc);
+               modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->bcc_field), quoted_names);
+               g_free (quoted_names);
                gtk_widget_set_no_show_all (priv->bcc_caption, FALSE);
                gtk_widget_show (priv->bcc_caption);
        } else if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_SHOW_BCC, NULL)) {
index 15405e8..ae7f8eb 100644 (file)
@@ -2084,3 +2084,84 @@ modest_text_utils_get_secure_header (const gchar *value,
 
        return new_value;
 }
+
+static gboolean
+is_quoted (const char *start, const gchar *end)
+{
+       gchar *c;
+
+       c = (gchar *) start;
+       while (*c == ' ')
+               c = g_utf8_next_char (c);
+
+       if (*c == '\0' || *c != '\"')
+               return FALSE;
+
+       c = (gchar *) end;
+       while (*c == ' ' && c != start)
+               c = g_utf8_prev_char (c);
+
+       if (c == start || *c != '\"')
+               return FALSE;
+
+       return TRUE;
+}
+
+
+static void
+quote_name_part (GString **str, gchar **cur, gchar **start)
+{
+       gchar *blank;
+       gint str_len = g_utf8_pointer_to_offset (*start, *cur) -
+               g_utf8_pointer_to_offset (*start, *start) + 1;
+
+       while (**start == ' ')
+               *start = g_utf8_next_char (*start);
+
+       blank = g_utf8_strrchr (*start, str_len, g_utf8_get_char (" "));
+       if (blank && (blank != *start)) {
+               if (is_quoted (*start, blank - 1)) {
+                       *str = g_string_append_len (*str, *start, str_len - 1);
+                       *str = g_string_append (*str, ";\n ");
+                       *start = g_utf8_next_char (*cur);
+               } else {
+                       *str = g_string_append_c (*str, '"');
+                       *str = g_string_append_len (*str, *start,
+                                                   (g_utf8_pointer_to_offset (*start, blank) -
+                                                    g_utf8_pointer_to_offset (*start, *start)));
+                       *str = g_string_append_c (*str, '"');
+                       *str = g_string_append_len (*str, blank,
+                                                   (g_utf8_pointer_to_offset (*start, *cur) -
+                                                    g_utf8_pointer_to_offset (*start, blank)));
+                       *str = g_string_append (*str, ";\n");
+                       *start = g_utf8_next_char (*cur);
+               }
+       } else {
+               *str = g_string_append_len (*str, *start, (str_len - 1));
+               *str = g_string_append (*str, ";\n");
+               *start = g_utf8_next_char (*cur);
+       }
+}
+
+gchar *
+modest_text_utils_quote_names (const gchar *recipients)
+{
+       GString *str;
+       gchar *start, *cur;
+
+       str = g_string_new ("");
+       start = (gchar*) recipients;
+       cur = (gchar*) recipients;
+
+       for (cur = start; *cur != '\0'; cur = g_utf8_next_char (cur)) {
+               if (*cur == ',' || *cur == ';') {
+                       if (!g_utf8_strchr (start, (cur - start + 1), g_utf8_get_char ("@")))
+                               continue;
+                       quote_name_part (&str, &cur, &start);
+               }
+       }
+
+       quote_name_part (&str, &cur, &start);
+
+       return g_string_free (str, FALSE);
+}
index 7cb5ab5..7415003 100644 (file)
@@ -528,4 +528,21 @@ GSList *modest_text_utils_remove_duplicate_addresses_list (GSList *address_list)
  **/
 gchar * modest_text_utils_get_secure_header (const gchar *value, const gchar *header);
 
+/**
+ * modest_text_utils_quote_names:
+ * @recipients: a list of valid email addresses separated by ',' or ';'
+ *
+ * This function quotes the name part of an email address if it's not
+ * quoted and if it exists. For example
+ * aaa@bbb.com -> aaa@bbb.com
+ * "my name" <aaa@bbb.com> -> "my name" <aaa@bbb.com>
+ * my name aaa@bbb.com -> "my name" aaa@bbb.com
+ *
+ * It even supports things like
+ * my, name <aaa@bbb.com>, aaa@ccc.com -> "my, name" <aaa@bbb.com>; aaa@ccc.com
+ *
+ * Returns: a newly allocated string with the quoted email addresses
+ **/
+gchar * modest_text_utils_quote_names (const gchar *recipients);
+
 #endif /* __MODEST_TEXT_UTILS_H__ */
index 14c8d11..3717363 100644 (file)
@@ -322,7 +322,7 @@ modest_recpt_editor_replace_with_resolved_recipients (ModestRecptEditor *recpt_e
 
                        if ((recipient) && (strlen (recipient) != 0)) {
 
-                               if (!is_first_recipient)
+                               if (!is_first_recipient || !gtk_text_iter_is_start(start))
                                        gtk_text_buffer_insert (buffer, start, "\n", -1);
 
                                gtk_text_buffer_insert_with_tags (buffer, start, recipient, -1, tag, NULL);