Remove extra spaces in the middle of an address field.
[modest] / src / modest-text-utils.c
index ae7f8eb..fef874c 100644 (file)
@@ -163,6 +163,8 @@ static gchar*   modest_text_utils_quote_html       (const gchar *text,
                                                    GList *attachments,
                                                    int limit);
 static gchar*   get_email_from_address (const gchar *address);
+static void     remove_extra_spaces (gchar *string);
+
 
 
 /* ******************************************************************* */
@@ -604,59 +606,52 @@ modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gboolean hy
 void
 modest_text_utils_get_addresses_indexes (const gchar *addresses, GSList **start_indexes, GSList **end_indexes)
 {
-       gchar *current, *start, *last_blank;
-       gint start_offset = 0, current_offset = 0;
+       GString *str;
+       gchar *start, *cur;
+
+       if (!addresses)
+               return;
 
-       g_return_if_fail (start_indexes != NULL);
-       g_return_if_fail (end_indexes != NULL);
+       if (strlen (addresses) == 0)
+               return;
 
-       start = (gchar *) addresses;
-       current = start;
-       last_blank = start;
+       str = g_string_new ("");
+       start = (gchar*) addresses;
+       cur = (gchar*) addresses;
 
-       while (*current != '\0') {
-               if ((start == current)&&((*current == ' ')||(*current == ',')||(*current == ';'))) {
-                       start = g_utf8_next_char (start);
-                       start_offset++;
-                       last_blank = current;
-               } else if ((*current == ',')||(*current == ';')) {
+       for (cur = start; *cur != '\0'; cur = g_utf8_next_char (cur)) {
+               if (*cur == ',' || *cur == ';') {
                        gint *start_index, *end_index;
-                       start_index = g_new0(gint, 1);
-                       end_index = g_new0(gint, 1);
-                       *start_index = start_offset;
-                       *end_index = current_offset;
+                       gchar *next_char = g_utf8_next_char (cur);
+
+                       if (!g_utf8_strchr (start, (cur - start + 1), g_utf8_get_char ("@")) &&
+                           next_char && *next_char != '\n')
+                               continue;
+
+                       start_index = g_new0 (gint, 1);
+                       end_index = g_new0 (gint, 1);
+                       *start_index = g_utf8_pointer_to_offset (addresses, start);
+                       *end_index = g_utf8_pointer_to_offset (addresses, cur);;
                        *start_indexes = g_slist_prepend (*start_indexes, start_index);
                        *end_indexes = g_slist_prepend (*end_indexes, end_index);
-                       start = g_utf8_next_char (current);
-                       start_offset = current_offset + 1;
-                       last_blank = start;
-               } else if (*current == '"') {
-                       current = g_utf8_next_char (current);
-                       current_offset ++;
-                       while ((*current != '"')&&(*current != '\0')) {
-                               current = g_utf8_next_char (current);
-                               current_offset ++;
-                       }
+                       start = g_utf8_next_char (cur);
                }
-                               
-               current = g_utf8_next_char (current);
-               current_offset ++;
        }
 
-       if (start != current) {
-                       gint *start_index, *end_index;
-                       start_index = g_new0(gint, 1);
-                       end_index = g_new0(gint, 1);
-                       *start_index = start_offset;
-                       *end_index = current_offset;
-                       *start_indexes = g_slist_prepend (*start_indexes, start_index);
-                       *end_indexes = g_slist_prepend (*end_indexes, end_index);
+       if (start != cur) {
+               gint *start_index, *end_index;
+               start_index = g_new0 (gint, 1);
+               end_index = g_new0 (gint, 1);
+               *start_index = g_utf8_pointer_to_offset (addresses, start);
+               *end_index = g_utf8_pointer_to_offset (addresses, cur);;
+               *start_indexes = g_slist_prepend (*start_indexes, start_index);
+               *end_indexes = g_slist_prepend (*end_indexes, end_index);
        }
-       
-       *start_indexes = g_slist_reverse (*start_indexes);
-       *end_indexes = g_slist_reverse (*end_indexes);
 
-       return;
+       if (*start_indexes)
+               *start_indexes = g_slist_reverse (*start_indexes);
+       if (*end_indexes)
+               *end_indexes = g_slist_reverse (*end_indexes);
 }
 
 
@@ -701,6 +696,8 @@ modest_text_utils_split_addresses_list (const gchar *addresses)
        addr = g_strndup (my_addrs, end - my_addrs);
        g_strchomp (addr);
 
+       remove_extra_spaces (addr);
+
        head = g_slist_append (NULL, addr);
        head->next = modest_text_utils_split_addresses_list (end); /* recurse */
 
@@ -1719,7 +1716,7 @@ modest_text_utils_validate_recipient (const gchar *recipient, const gchar **inva
                        }
                }
                if (last_quote)
-                       current = last_quote;
+                       current = g_utf8_next_char (last_quote);
        } else {
                has_error = TRUE;
                for (current = stripped ; *current != '\0'; current = g_utf8_next_char (current)) {
@@ -1943,6 +1940,20 @@ remove_quotes (gchar **quotes)
        }
 }
 
+static void
+remove_extra_spaces (gchar *string)
+{
+       gchar *start;
+
+       start = string;
+       while (start && start[0] != '\0') {
+               if ((start[0] == ' ') && (start[1] == ' ')) {
+                       g_strchug (start+1);
+               }
+               start++;
+       }
+}
+
 gchar *
 modest_text_utils_escape_mnemonics (const gchar *text)
 {
@@ -2054,7 +2065,7 @@ gchar *
 modest_text_utils_get_secure_header (const gchar *value,
                                     const gchar *header)
 {
-       const gint max_len = 128;
+       const gint max_len = 16384;
        gchar *new_value = NULL;
        gchar *needle = g_strrstr (value, header);
 
@@ -2113,16 +2124,18 @@ 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;
+               g_utf8_pointer_to_offset (*start, *start);
 
-       while (**start == ' ')
+       while (**start == ' ') {
                *start = g_utf8_next_char (*start);
+               str_len--;
+       }
 
        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 ");
+                       *str = g_string_append_len (*str, *start, str_len);
+                       *str = g_string_append (*str, ";");
                        *start = g_utf8_next_char (*cur);
                } else {
                        *str = g_string_append_c (*str, '"');
@@ -2133,12 +2146,12 @@ quote_name_part (GString **str, gchar **cur, gchar **start)
                        *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");
+                       *str = g_string_append (*str, ";");
                        *start = g_utf8_next_char (*cur);
                }
        } else {
-               *str = g_string_append_len (*str, *start, (str_len - 1));
-               *str = g_string_append (*str, ";\n");
+               *str = g_string_append_len (*str, *start, str_len);
+               *str = g_string_append (*str, ";");
                *start = g_utf8_next_char (*cur);
        }
 }