* revert to the in-place 'modest_text_utils_get_display_address',
[modest] / src / modest-text-utils.c
index 51e340e..6b3709c 100644 (file)
 #endif /*HAVE_CONFIG_H */
 
 /* defines */
-#define FORWARD_STRING _("-----Forwarded Message-----")
-#define FROM_STRING _("From:")
-#define SENT_STRING _("Sent:")
-#define TO_STRING _("To:")
-#define        SUBJECT_STRING _("Subject:")
+#define FORWARD_STRING _("mcen_ia_editor_original_message")
+#define FROM_STRING _("mail_va_from")
+#define SENT_STRING _("mcen_fi_message_properties_sent")
+#define TO_STRING _("mail_va_to")
+#define        SUBJECT_STRING _("mail_va_subject")
 #define EMPTY_STRING ""
 
 /*
@@ -96,6 +96,19 @@ struct _url_match_t {
          NULL, "mailto:"}\
        }
 
+const gchar account_title_forbidden_chars[] = {
+       '\\', '/', ':', '*', '?', '\'', '<', '>', '|', '^'
+};
+const gchar folder_name_forbidden_chars[] = {
+       '<', '>', ':', '\'', '/', '\\', '|', '?', '*', '^', '%', '$'
+};
+const gchar user_name_forbidden_chars[] = {
+       '<', '>'
+};
+const guint ACCOUNT_TITLE_FORBIDDEN_CHARS_LENGTH = G_N_ELEMENTS (account_title_forbidden_chars);
+const guint FOLDER_NAME_FORBIDDEN_CHARS_LENGTH = G_N_ELEMENTS (folder_name_forbidden_chars);
+const guint USER_NAME_FORBIDDEN_CHARS_LENGTH = G_N_ELEMENTS (user_name_forbidden_chars);
+
 /* private */
 static gchar*   cite                    (const time_t sent_date, const gchar *from);
 static void     hyperlinkify_plain_text (GString *txt);
@@ -167,18 +180,18 @@ modest_text_utils_cite (const gchar *text,
 {
        gchar *retval;
        gchar *tmp_sig;
-
+       
        g_return_val_if_fail (text, NULL);
        g_return_val_if_fail (content_type, NULL);
-
+       
        if (!signature)
                retval = g_strdup ("");
-       else if (!strcmp(content_type, "text/html")) {
+       else if (strcmp(content_type, "text/html") == 0) {
                tmp_sig = g_strconcat ("\n", signature, NULL);
                retval = modest_text_utils_convert_to_html_body(tmp_sig);
                g_free (tmp_sig);
        } else {
-               retval = g_strconcat ("\n", signature, NULL);
+               retval = g_strconcat (text, "\n", signature, NULL);
        }
 
        return retval;
@@ -186,9 +199,9 @@ modest_text_utils_cite (const gchar *text,
 
 static gchar *
 forward_cite (const gchar *from,
-                   const gchar *sent,
-                   const gchar *to,
-                   const gchar *subject)
+             const gchar *sent,
+             const gchar *to,
+             const gchar *subject)
 {
        return g_strdup_printf ("%s\n%s %s\n%s %s\n%s %s\n%s %s\n", 
                                FORWARD_STRING, 
@@ -341,7 +354,9 @@ modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
                case '>'  : g_string_append (html, "&gt;");   break;
                case '&'  : g_string_append (html, "&amp;");  break;
                case '"'  : g_string_append (html, "&quot;");  break;
-               case '\'' : g_string_append (html, "&apos;"); break;
+
+               /* don't convert &apos; --> wpeditor will try to re-convert it... */    
+               //case '\'' : g_string_append (html, "&apos;"); break;
                case '\n' : g_string_append (html, "<br>\n");              break_dist= 0; break;
                case '\t' : g_string_append (html, "&nbsp;&nbsp;&nbsp; "); break_dist=0; break; /* note the space at the end*/
                case ' ':
@@ -820,6 +835,7 @@ modest_text_utils_quote_html (const gchar *text,
        g_free (attachments_string);
        g_free (q_attachments_string);
        g_free (signature_result);
+       
        return result;
 }
 
@@ -881,7 +897,6 @@ get_url_matches (GString *txt)
                                match->offset = offset + rm.rm_so;
                                match->len    = rm.rm_eo - rm.rm_so;
                                match->prefix = patterns[i].prefix;
-                               g_warning ("<%d, %d, %s>",  match->offset, match->len, match->prefix);
                                match_list = g_slist_prepend (match_list, match);
                        }
                                
@@ -938,37 +953,39 @@ hyperlinkify_plain_text (GString *txt)
 }
 
 
-
-gchar*
+/* for optimization reasons, we change the string in-place */
+void
 modest_text_utils_get_display_address (gchar *address)
 {
-       gchar *cursor;
+       int i;
        
        if (!address)
-               return NULL;
+               return;
        
-       g_return_val_if_fail (g_utf8_validate (address, -1, NULL), NULL);
+       /* should not be needed, and otherwise, we probably won't screw up the address
+        * more than it already is :) 
+        * g_return_val_if_fail (g_utf8_validate (address, -1, NULL), NULL);
+        * */
        
-       g_strchug (address); /* remove leading whitespace */
+       /* remove leading whitespace */
+       if (address[0] == ' ')
+               g_strchug (address);
+               
+       for (i = 0; address[i]; ++i) {
+               if (address[i] == '<') {
+                       if (G_UNLIKELY(i == 0))
+                               return; /* there's nothing else, leave it */
+                       else {
+                               address[i] = '\0'; /* terminate the string here */
+                               return;
+                       }
+               }
+       }
+}
 
-       /*  <email@address> from display name */
-       cursor = g_strstr_len (address, strlen(address), "<");
-       if (cursor == address) /* there's nothing else? leave it */
-               return address;
-       if (cursor) 
-               cursor[0]='\0';
 
-       /* remove (bla bla) from display name */
-       cursor = g_strstr_len (address, strlen(address), "(");
-       if (cursor == address) /* there's nothing else? leave it */
-               return address;
-       if (cursor) 
-               cursor[0]='\0';
 
-       g_strchomp (address); /* remove trailing whitespace */
 
-       return address;
-}
 
 gchar *
 modest_text_utils_get_email_address (const gchar *full_address)
@@ -1083,10 +1100,8 @@ modest_text_utils_validate_folder_name (const gchar *folder_name)
         * with some extras */
        
        guint len;
-       const gchar **cursor;
-       const gchar *forbidden_chars[] = {
-               "<", ">", ":", "\"", "/", "\\", "|", "?", "*", "^", "%", "$", NULL
-       };
+       gint i;
+       const gchar **cursor = NULL;
        const gchar *forbidden_names[] = { /* windows does not like these */
                "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6",
                "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9",
@@ -1106,9 +1121,9 @@ modest_text_utils_validate_folder_name (const gchar *folder_name)
        if (g_ascii_isspace(folder_name[0]) || g_ascii_isspace(folder_name[len - 1]))
                return FALSE; 
 
-       /* cannot contain a forbidden char */
-       for (cursor = forbidden_chars; cursor && *cursor; ++cursor)
-               if (strstr(folder_name, *cursor) != NULL)
+       /* cannot contain a forbidden char */   
+       for (i = 0; i < len; i++)
+               if (modest_text_utils_is_forbidden_char (folder_name[i], FOLDER_NAME_FORBIDDEN_CHARS))
                        return FALSE;
        
        /* cannot contain a forbidden word */
@@ -1130,6 +1145,8 @@ modest_text_utils_validate_domain_name (const gchar *domain)
        regex_t rx;
        const gchar* domain_regex = "^[a-z0-9]([.]?[a-z0-9-])*[a-z0-9]$";
 
+       memset (&rx, 0, sizeof(regex_t)); /* coverity wants this... */
+       
        if (!domain)
                return FALSE;
        
@@ -1379,3 +1396,36 @@ modest_text_utils_text_buffer_get_text (GtkTextBuffer *buffer)
        return g_string_free (result, FALSE);
        
 }
+
+gboolean
+modest_text_utils_is_forbidden_char (const gchar character,
+                                    ModestTextUtilsForbiddenCharType type)
+{
+       gint i, len;
+       const gchar *forbidden_chars = NULL;
+       
+       /* We need to get the length in the switch because the
+          compiler needs to know the size at compile time */
+       switch (type) {
+       case ACCOUNT_TITLE_FORBIDDEN_CHARS:
+               forbidden_chars = account_title_forbidden_chars;
+               len = G_N_ELEMENTS (account_title_forbidden_chars);
+               break;
+       case FOLDER_NAME_FORBIDDEN_CHARS:
+               forbidden_chars = folder_name_forbidden_chars;
+               len = G_N_ELEMENTS (folder_name_forbidden_chars);
+               break;
+       case USER_NAME_FORBIDDEN_NAMES:
+               forbidden_chars = user_name_forbidden_chars;
+               len = G_N_ELEMENTS (user_name_forbidden_chars);
+               break;
+       default:
+               g_return_val_if_reached (TRUE);
+       }
+
+       for (i = 0; i < len ; i++)
+               if (forbidden_chars[i] == character)
+                       return TRUE;
+
+       return FALSE; /* it's valid! */
+}