* Fixes NB#91650, fixes a potential problem with strftime
[modest] / src / modest-text-utils.c
index 6e89e71..5aa8860 100644 (file)
@@ -63,7 +63,7 @@
  * will hang modest
  */
 #define HYPERLINKIFY_MAX_LENGTH (1024*50)
-
+#define SIGNATURE_MARKER "--"
 
 
 /*
@@ -215,11 +215,11 @@ modest_text_utils_cite (const gchar *text,
        if (!signature)
                retval = g_strdup ("");
        else if (strcmp(content_type, "text/html") == 0) {
-               tmp_sig = g_strconcat ("\n", signature, NULL);
+               tmp_sig = g_strconcat ("\n", SIGNATURE_MARKER,"\n", signature, NULL);
                retval = modest_text_utils_convert_to_html_body(tmp_sig, -1, TRUE);
                g_free (tmp_sig);
        } else {
-               retval = g_strconcat (text, "\n", signature, NULL);
+               retval = g_strconcat (text, "\n", SIGNATURE_MARKER, "\n", signature, NULL);
        }
 
        return retval;
@@ -278,6 +278,11 @@ modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet)
 {
         struct tm tm;
 
+       /* To prevent possible problems in strftime that could leave
+          garbage in the s variable */
+       if (s)
+               s[0] = '\0';
+
        /* does not work on old maemo glib: 
         *   g_date_set_time_t (&date, timet);
         */
@@ -881,7 +886,14 @@ modest_text_utils_quote_plain_text (const gchar *text,
        gsize len;
        gchar *attachments_string = NULL;
 
-       q = g_string_new ("\n");
+       q = g_string_new ("");
+
+       if (signature != NULL) {
+               q = g_string_append (q, "\n--\n");
+               q = g_string_append (q, signature);
+       }
+
+       q = g_string_append (q, "\n");
        q = g_string_append (q, cite);
        q = g_string_append_c (q, '\n');
 
@@ -932,15 +944,20 @@ modest_text_utils_quote_plain_text (const gchar *text,
        q = g_string_append (q, attachments_string);
        g_free (attachments_string);
 
-       if (signature != NULL) {
-               q = g_string_append (q, "\n--\n");
-               q = g_string_append (q, signature);
-               q = g_string_append_c (q, '\n');
-       }
-
        return g_string_free (q, FALSE);
 }
 
+static void
+quote_html_add_to_gstring (GString *string,
+                          const gchar *text)
+{
+       if (text && strcmp (text, "")) {
+               gchar *html_text = modest_text_utils_convert_to_html_body (text, -1, TRUE);
+               g_string_append_printf (string, "%s<br/>", html_text);
+               g_free (html_text);
+       }
+}
+
 static gchar*
 modest_text_utils_quote_html (const gchar *text, 
                              const gchar *cite, 
@@ -948,38 +965,33 @@ modest_text_utils_quote_html (const gchar *text,
                              GList *attachments,
                              int limit)
 {
-       gchar *result = NULL;
-       gchar *signature_result = NULL;
-       const gchar *format = \
-               "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" \
-               "<html>\n" \
-               "<body>\n" \
-               "<pre>%s<br/>%s<br/>%s</pre>\n" \
-               "<br/>--<br/>%s<br/>\n" \
-               "</body>\n" \
-               "</html>\n";
-       gchar *attachments_string = NULL;
-       gchar *q_attachments_string = NULL;
-       gchar *q_cite = NULL;
-       gchar *html_text = NULL;
-
-       if (signature == NULL)
-               signature_result = g_strdup ("");
-       else
-               signature_result = modest_text_utils_convert_to_html_body (signature, -1, TRUE);
+       GString *result_string;
+
+       result_string = 
+               g_string_new ( \
+                             "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" \
+                             "<html>\n"                                \
+                             "<body>\n<br/>\n");
+
+       if (text || cite || signature) {
+               g_string_append (result_string, "<pre>\n");
+               if (signature) {
+                       quote_html_add_to_gstring (result_string, SIGNATURE_MARKER);
+                       quote_html_add_to_gstring (result_string, signature);
+               }
+               quote_html_add_to_gstring (result_string, cite);
+               quote_html_add_to_gstring (result_string, text);
+               if (attachments) {
+                       gchar *attachments_string = quoted_attachments (attachments);
+                       quote_html_add_to_gstring (result_string, attachments_string);
+                       g_free (attachments_string);
+               }
+               g_string_append (result_string, "</pre>");
+       }
+       g_string_append (result_string, "</body>");
+       g_string_append (result_string, "</html>");
 
-       attachments_string = quoted_attachments (attachments);
-       q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string, -1, TRUE);
-       q_cite = modest_text_utils_convert_to_html_body (cite, -1, TRUE);
-       html_text = modest_text_utils_convert_to_html_body (text, -1, TRUE);
-       result = g_strdup_printf (format, q_cite, html_text, q_attachments_string, signature_result);
-       g_free (q_cite);
-       g_free (html_text);
-       g_free (attachments_string);
-       g_free (q_attachments_string);
-       g_free (signature_result);
-       
-       return result;
+       return g_string_free (result_string, FALSE);
 }
 
 static gint 
@@ -988,7 +1000,7 @@ cmp_offsets_reverse (const url_match_t *match1, const url_match_t *match2)
        return match2->offset - match1->offset;
 }
 
-static gboolean url_matches_block = 0;
+static gint url_matches_block = 0;
 static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
 
 
@@ -1262,7 +1274,7 @@ modest_text_utils_get_subject_prefix_len (const gchar *sub)
                int c = prefix_len + 1;
                while (sub[c] && sub[c] != ']')
                        ++c;
-               if (sub[c])
+               if (!sub[c])
                        return 0; /* no end to the ']' found */
                else
                        prefix_len = c + 1;
@@ -1297,7 +1309,8 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens
        if (!insensitive) {
 
                /* optimization: shortcut if first char is ascii */ 
-               if (((s1[0] & 0xf0)== 0) && ((s2[0] & 0xf0) == 0)) 
+               if (((s1[0] & 0x80)== 0) && ((s2[0] & 0x80) == 0) &&
+                   (s1[0] != s2[0])) 
                        return s1[0] - s2[0];
                
                return g_utf8_collate (s1, s2);
@@ -1306,8 +1319,9 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens
                gint result;
                gchar *n1, *n2;
 
-               /* optimization: short cut iif first char is ascii */ 
-               if (((s1[0] & 0xf0) == 0) && ((s2[0] & 0xf0) == 0)) 
+               /* optimization: shortcut if first char is ascii */ 
+               if (((s1[0] & 0x80) == 0) && ((s2[0] & 0x80) == 0) &&
+                   (s1[0] != s2[0])) 
                        return tolower(s1[0]) - tolower(s2[0]);
                
                n1 = g_utf8_strdown (s1, -1);
@@ -1385,8 +1399,8 @@ modest_text_utils_validate_folder_name (const gchar *folder_name)
 
        /* Cannot contain Windows port numbers. I'd like to use GRegex
           but it's still not available in Maemo. sergio */
-       if (g_ascii_strncasecmp (folder_name, "LPT", 3) ||
-           g_ascii_strncasecmp (folder_name, "COM", 3)) {
+       if (!g_ascii_strncasecmp (folder_name, "LPT", 3) ||
+           !g_ascii_strncasecmp (folder_name, "COM", 3)) {
                glong val;
                gchar *endptr;