* will hang modest
*/
#define HYPERLINKIFY_MAX_LENGTH (1024*50)
-
+#define SIGNATURE_MARKER "--"
/*
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;
{
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);
*/
gchar *
modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix)
{
- gchar *tmp;
+ gchar *tmp, *subject_dup, *retval;
+ gint prefix_len;
g_return_val_if_fail (prefix, NULL);
if (!subject || subject[0] == '\0')
subject = _("mail_va_no_subject");
- tmp = g_strchug (g_strdup (subject));
+ subject_dup = g_strdup (subject);
+ tmp = g_strchug (subject_dup);
- if (!strncmp (tmp, prefix, strlen (prefix))) {
- return tmp;
- } else {
- g_free (tmp);
- return g_strdup_printf ("%s %s", prefix, subject);
- }
+ /* We do not want things like "Re: Re: Re:" or "Fw: Fw:" so
+ delete the previous ones */
+ prefix_len = strlen (prefix);
+ do {
+ if (g_str_has_prefix (tmp, prefix)) {
+ tmp += prefix_len;
+ tmp = g_strchug (tmp);
+ } else {
+ break;
+ }
+ } while (tmp);
+
+ retval = g_strdup_printf ("%s %s", prefix, tmp);
+ g_free (subject_dup);
+
+ return retval;
}
gchar*
g_return_val_if_fail (address_list, NULL);
- table = g_hash_table_new (g_str_hash, g_str_equal);
+ table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
addresses = modest_text_utils_split_addresses_list (address_list);
cursor = addresses;
while (cursor) {
const gchar* address = (const gchar*)cursor->data;
+ /* We need only the email to just compare it and not
+ the full address which would make "a <a@a.com>"
+ different from "a@a.com" */
+ const gchar *email = get_email_from_address (address);
+
/* ignore the address if already seen */
- if (g_hash_table_lookup (table, address) == 0) {
+ if (g_hash_table_lookup (table, email) == 0) {
gchar *tmp;
+ /* Include the full address and not only the
+ email in the returned list */
if (!new_list) {
tmp = g_strdup (address);
} else {
}
new_list = tmp;
- g_hash_table_insert (table, (gchar*)address, GINT_TO_POINTER(1));
+ g_hash_table_insert (table, (gchar*)email, GINT_TO_POINTER(1));
}
cursor = g_slist_next (cursor);
}
- g_hash_table_destroy (table);
+ g_hash_table_unref (table);
g_slist_foreach (addresses, (GFunc)g_free, NULL);
g_slist_free (addresses);
/* nope, we are at the start of some address
* now, let's find the end of the address */
end = my_addrs + 1;
- while (end[0] && end[0] != ',' && end[0] != ';')
+ while (end[0] && end[0] != ';') {
+ if (end[0] == '\"') {
+ while (end[0] && end[0] != '\"')
+ ++end;
+ }
+ if ((end[0] && end[0] == '>')&&(end[1] && end[1] == ',')) {
+ ++end;
+ break;
+ }
++end;
+ }
/* we got the address; copy it and remove trailing whitespace */
addr = g_strndup (my_addrs, end - my_addrs);
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_c (q, '\n');
}
+
+ q = g_string_append (q, "\n");
q = g_string_append (q, cite);
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,
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" \
- "<br/>%s<br/>" \
- "<pre>%s<br/>%s<br/>%s</pre>\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, 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);
- g_free (signature_result);
-
- return result;
+ return g_string_free (result_string, FALSE);
}
static gint
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;
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;
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);
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);
/* if it's today, show the time, if it's not today, show the date instead */
+ /* TODO: take into account the system config for 24/12h */
if (day == date_day) /* is the date today? */
- modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date);
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, _HL("wdgt_va_24h_time"), date);
else
- modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date);
+ modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, _HL("wdgt_va_date"), date);
return date_buf; /* this is a static buffer, don't free! */
}
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",
- ".", "..", "cur", "tmp", "new", NULL /* cur, tmp new are reserved for Maildir */
+ "CON", "PRN", "AUX", "NUL", ".", "..", "cur", "tmp", "new",
+ NULL /* cur, tmp, new are reserved for Maildir */
};
/* cannot be NULL */
for (i = 0; i < len; i++)
if (modest_text_utils_is_forbidden_char (folder_name[i], FOLDER_NAME_FORBIDDEN_CHARS))
return FALSE;
+
+ /* 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)) {
+ glong val;
+ gchar *endptr;
+
+ /* We skip the first 3 characters for the
+ comparison */
+ val = strtol(folder_name+3, &endptr, 10);
+
+ /* If the conversion to long succeeded then the string
+ is not valid for us */
+ if (*endptr == '\0')
+ return FALSE;
+ else
+ return TRUE;
+ }
/* cannot contain a forbidden word */
if (len <= 4) {