From: Sergio Villar Senin Date: Fri, 11 Sep 2009 08:31:17 +0000 (+0200) Subject: Added the function that quotes emails X-Git-Tag: 3.0.17-rc52~1 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=1f240a543af567aeac580bbd10d07f55f015c4cc Added the function that quotes emails 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 --- diff --git a/src/hildon2/modest-msg-edit-window.c b/src/hildon2/modest-msg-edit-window.c index c9c8497..d320080 100644 --- a/src/hildon2/modest-msg-edit-window.c +++ b/src/hildon2/modest-msg-edit-window.c @@ -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)) { diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 15405e8..ae7f8eb 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -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); +} diff --git a/src/modest-text-utils.h b/src/modest-text-utils.h index 7cb5ab5..7415003 100644 --- a/src/modest-text-utils.h +++ b/src/modest-text-utils.h @@ -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" -> "my name" + * my name aaa@bbb.com -> "my name" aaa@bbb.com + * + * It even supports things like + * my, name , aaa@ccc.com -> "my, name" ; 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__ */ diff --git a/src/widgets/modest-recpt-editor.c b/src/widgets/modest-recpt-editor.c index 14c8d11..3717363 100644 --- a/src/widgets/modest-recpt-editor.c +++ b/src/widgets/modest-recpt-editor.c @@ -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);