X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=3c32ada5bbda1c8adc75cdf0c1d0d1755e9ace58;hb=398d45654eaaefd1a20631a343192f68a6025dcd;hp=f35a1271a074e6c6afb5965a331e791258a213e3;hpb=1310c638b65414fad9be0ed2fcfb93a5cbc23433;p=modest
diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c
index f35a127..3c32ada 100644
--- a/src/modest-text-utils.c
+++ b/src/modest-text-utils.c
@@ -140,7 +140,7 @@ modest_text_utils_quote (const gchar *text,
retval = modest_text_utils_quote_plain_text (text, cited, signature, attachments, limit);
g_free (cited);
-
+
return retval;
}
@@ -159,19 +159,32 @@ modest_text_utils_cite (const gchar *text,
g_return_val_if_fail (content_type, NULL);
if (!signature)
- tmp_sig = g_strdup ("");
+ retval = g_strdup ("");
else if (!strcmp(content_type, "text/html")) {
- tmp_sig = modest_text_utils_convert_to_html_body(signature);
+ tmp_sig = g_strconcat ("\n", signature, NULL);
+ retval = modest_text_utils_convert_to_html_body(tmp_sig);
+ g_free (tmp_sig);
} else {
- tmp_sig = g_strdup (signature);
+ retval = g_strconcat ("\n", signature, NULL);
}
- retval = g_strdup_printf ("\n%s\n", tmp_sig);
- g_free (tmp_sig);
-
return retval;
}
+static gchar *
+forward_cite (const gchar *from,
+ 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,
+ FROM_STRING, (from)?from:"",
+ SENT_STRING, sent,
+ TO_STRING, (to)?to:"",
+ SUBJECT_STRING, (subject)?subject:"");
+}
+
gchar *
modest_text_utils_inline (const gchar *text,
const gchar *content_type,
@@ -182,47 +195,23 @@ modest_text_utils_inline (const gchar *text,
const gchar *subject)
{
gchar sent_str[101];
- gchar *formatted_signature;
- const gchar *plain_format = "%s%s\n%s %s\n%s %s\n%s %s\n%s %s\n\n%s";
- const gchar *html_format = \
- "%s%s
\n
\n" \
- "%s | %s |
\n" \
- "%s | %s |
\n" \
- "%s | %s |
\n" \
- "%s | %s |
\n" \
- "
%s";
- const gchar *format;
-
+ gchar *cited;
+ gchar *retval;
+
g_return_val_if_fail (text, NULL);
g_return_val_if_fail (content_type, NULL);
- g_return_val_if_fail (text, NULL);
modest_text_utils_strftime (sent_str, 100, "%c", sent_date);
- if (!strcmp (content_type, "text/html"))
- /* TODO: extract the of the HTML and pass it to
- the function */
- format = html_format;
+ cited = forward_cite (from, sent_str, to, subject);
+
+ if (content_type && strcmp (content_type, "text/html") == 0)
+ retval = modest_text_utils_quote_html (text, cited, signature, NULL, 80);
else
- format = plain_format;
-
- if (signature != NULL) {
- if (!strcmp (content_type, "text/html")) {
- formatted_signature = g_strconcat (signature, "
", NULL);
- } else {
- formatted_signature = g_strconcat (signature, "\n", NULL);
- }
- } else {
- formatted_signature = "";
- }
-
- return g_strdup_printf (format, formatted_signature,
- FORWARD_STRING,
- FROM_STRING, (from) ? from : EMPTY_STRING,
- SENT_STRING, sent_str,
- TO_STRING, (to) ? to : EMPTY_STRING,
- SUBJECT_STRING, (subject) ? subject : EMPTY_STRING,
- text);
+ retval = modest_text_utils_quote_plain_text (text, cited, signature, NULL, 80);
+
+ g_free (cited);
+ return retval;
}
/* just to prevent warnings:
@@ -311,6 +300,7 @@ modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
guint i;
gboolean space_seen = FALSE;
gsize len;
+ guint break_dist = 0; /* distance since last break point */
len = strlen (data);
@@ -323,6 +313,15 @@ modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
space_seen = FALSE;
}
+ /* we artificially insert a breakpoint (newline)
+ * after 256, to make sure our lines are not so long
+ * they will DOS the regexping later
+ */
+ if (++break_dist == 256) {
+ g_string_append_c (html, '\n');
+ break_dist = 0;
+ }
+
switch (kar) {
case 0: break; /* ignore embedded \0s */
case '<' : g_string_append (html, "<"); break;
@@ -330,9 +329,10 @@ modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
case '&' : g_string_append (html, "&"); break;
case '"' : g_string_append (html, """); break;
case '\'' : g_string_append (html, "'"); break;
- case '\n' : g_string_append (html, "
\n"); break;
- case '\t' : g_string_append (html, " "); break; /* note the space at the end*/
+ case '\n' : g_string_append (html, "
\n"); break_dist= 0; break;
+ case '\t' : g_string_append (html, " "); break_dist=0; break; /* note the space at the end*/
case ' ':
+ break_dist = 0;
if (space_seen) { /* second space in a row */
g_string_append (html, " ");
space_seen = FALSE;
@@ -786,6 +786,7 @@ modest_text_utils_quote_html (const gchar *text,
"\n";
gchar *attachments_string = NULL;
gchar *q_attachments_string = NULL;
+ gchar *q_cite = NULL;
gchar *html_text = NULL;
if (signature == NULL)
@@ -795,8 +796,10 @@ modest_text_utils_quote_html (const gchar *text,
attachments_string = quoted_attachments (attachments);
q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string);
+ q_cite = modest_text_utils_convert_to_html_body (cite);
html_text = modest_text_utils_convert_to_html_body (text);
- result = g_strdup_printf (format, signature_result, cite, html_text, q_attachments_string);
+ result = g_strdup_printf (format, signature_result, q_cite, html_text, q_attachments_string);
+ g_free (q_cite);
g_free (html_text);
g_free (attachments_string);
g_free (q_attachments_string);
@@ -957,10 +960,11 @@ modest_text_utils_get_subject_prefix_len (const gchar *sub)
{
gint i;
static const gchar* prefix[] = {
- "Re:", "RE:", "Fwd:", "FWD:", "FW:", NULL
+ "Re:", "RE:", "RV:", "re:"
+ "Fwd:", "FWD:", "FW:", "fwd:", "Fw:", "fw:", NULL
};
- if (!sub || (sub[0] != 'R' && sub[0] != 'F')) /* optimization */
+ if (!sub || (sub[0] != 'R' && sub[0] != 'F' && sub[0] != 'r' && sub[0] != 'f')) /* optimization */
return 0;
i = 0;
@@ -1025,12 +1029,15 @@ modest_text_utils_get_display_date (time_t date)
return g_strdup(date_buf);
}
-gboolean
-modest_text_utils_validate_email_address (const gchar *email_address)
+gboolean
+modest_text_utils_validate_email_address (const gchar *email_address, const gchar **invalid_char_position)
{
int count = 0;
const gchar *c = NULL, *domain = NULL;
- static gchar *rfc822_specials = "()<>@,;:\\\"[]";
+ static gchar *rfc822_specials = "()<>@,;:\\\"[]&";
+
+ if (invalid_char_position != NULL)
+ *invalid_char_position = NULL;
/* first we validate the name portion (name@domain) */
for (c = email_address; *c; c++) {
@@ -1058,8 +1065,11 @@ modest_text_utils_validate_email_address (const gchar *email_address)
break;
if (*c <= ' ' || *c >= 127)
return FALSE;
- if (strchr(rfc822_specials, *c))
+ if (strchr(rfc822_specials, *c)) {
+ if (invalid_char_position)
+ *invalid_char_position = c;
return FALSE;
+ }
}
if (c == email_address || *(c - 1) == '.')
return FALSE;
@@ -1075,21 +1085,24 @@ modest_text_utils_validate_email_address (const gchar *email_address)
}
if (*c <= ' ' || *c >= 127)
return FALSE;
- if (strchr(rfc822_specials, *c))
+ if (strchr(rfc822_specials, *c)) {
+ if (invalid_char_position)
+ *invalid_char_position = c;
return FALSE;
+ }
} while (*++c);
return (count >= 1) ? TRUE : FALSE;
}
gboolean
-modest_text_utils_validate_recipient (const gchar *recipient)
+modest_text_utils_validate_recipient (const gchar *recipient, const gchar **invalid_char_position)
{
gchar *stripped, *current;
gchar *right_part;
gboolean has_error = FALSE;
- if (modest_text_utils_validate_email_address (recipient))
+ if (modest_text_utils_validate_email_address (recipient, invalid_char_position))
return TRUE;
stripped = g_strdup (recipient);
stripped = g_strstrip (stripped);
@@ -1146,7 +1159,7 @@ modest_text_utils_validate_recipient (const gchar *recipient)
address = g_strndup (right_part+1, strlen (right_part) - 2);
g_free (right_part);
- valid = modest_text_utils_validate_email_address (address);
+ valid = modest_text_utils_validate_email_address (address, invalid_char_position);
g_free (address);
return valid;
} else {
@@ -1192,3 +1205,16 @@ get_email_from_address (const gchar * address)
else
return g_strndup (left_limit + 1, (right_limit - left_limit) - 1);
}
+
+gchar *
+modest_text_utils_get_color_string (GdkColor *color)
+{
+
+ return g_strdup_printf ("#%x%x%x%x%x%x%x%x%x%x%x%x",
+ (color->red >> 12) & 0xf, (color->red >> 8) & 0xf,
+ (color->red >> 4) & 0xf, (color->red) & 0xf,
+ (color->green >> 12) & 0xf, (color->green >> 8) & 0xf,
+ (color->green >> 4) & 0xf, (color->green) & 0xf,
+ (color->blue >> 12) & 0xf, (color->blue >> 8) & 0xf,
+ (color->blue >> 4) & 0xf, (color->blue) & 0xf);
+}