/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
while (procheader_get_one_field_asis(buf, sizeof(buf), fp) != -1) {
if ((header = procheader_parse_header(buf)) != NULL)
g_ptr_array_add(headers, header);
- /*
- if (*buf == ':') continue;
- for (p = buf; *p && *p != ' '; p++) {
- if (*p == ':') {
- header = g_new(Header, 1);
- header->name = g_strndup(buf, p - buf);
- p++;
- conv_unmime_header(tmp, sizeof(tmp), p, NULL);
- header->body = g_strdup(tmp);
-
- g_ptr_array_add(headers, header);
- break;
- }
- }
- */
}
return headers;
header->name = "From:"
header->body = "dinh@enseirb.fr"
*/
+static gboolean header_is_addr_field(const gchar *hdr)
+{
+ static char *addr_headers[] = {
+ "To:",
+ "Cc:",
+ "Bcc:",
+ "From:",
+ "Reply-To:",
+ "Followup-To:",
+ "Followup-and-Reply-To:",
+ "Disposition-Notification-To:",
+ "Return-Receipt-To:",
+ NULL};
+ int i;
+
+ if (!hdr)
+ return FALSE;
+
+ for (i = 0; addr_headers[i] != NULL; i++)
+ if (!strcasecmp(hdr, addr_headers[i]))
+ return FALSE;
+
+ return FALSE;
+}
Header * procheader_parse_header(gchar * buf)
{
gchar *p = buf;
Header * header;
+ gboolean addr_field = FALSE;
if ((*buf == ':') || (*buf == ' '))
return NULL;
if ((*p == ':') || (*p == ' ')) {
header = g_new(Header, 1);
header->name = g_strndup(buf, p - buf + 1);
+ addr_field = header_is_addr_field(header->name);
p++;
while (*p == ' ' || *p == '\t') p++;
- header->body = conv_unmime_header(p, NULL);
+ header->body = conv_unmime_header(p, NULL, addr_field);
return header;
}
}
break;
case H_FROM:
if (msginfo->from) break;
- msginfo->from = conv_unmime_header(hp, NULL);
+ msginfo->from = conv_unmime_header(hp, NULL, TRUE);
msginfo->fromname = procheader_get_fromname(msginfo->from);
remove_return(msginfo->from);
remove_return(msginfo->fromname);
break;
case H_TO:
- tmp = conv_unmime_header(hp, NULL);
+ tmp = conv_unmime_header(hp, NULL, TRUE);
remove_return(tmp);
if (msginfo->to) {
p = msginfo->to;
g_free(tmp);
break;
case H_CC:
- tmp = conv_unmime_header(hp, NULL);
+ tmp = conv_unmime_header(hp, NULL, TRUE);
remove_return(tmp);
if (msginfo->cc) {
p = msginfo->cc;
break;
case H_SUBJECT:
if (msginfo->subject) break;
- msginfo->subject = conv_unmime_header(hp, NULL);
+ msginfo->subject = conv_unmime_header(hp, NULL, FALSE);
unfold_line(msginfo->subject);
break;
case H_MSG_ID:
return 0;
}
+
+HeaderEntry *procheader_entries_from_str(const gchar *str)
+{
+ HeaderEntry *entries = NULL, *he;
+ int numh = 0, i = 0;
+ gchar **names = NULL;
+ gchar *s = str;
+
+ if (s == NULL) {
+ return NULL;
+ }
+ while (*s != '\0') {
+ if (*s == ' ') ++numh;
+ ++s;
+ }
+ if (numh == 0) {
+ return NULL;
+ }
+ entries = g_new0(HeaderEntry, numh + 1); /* room for last NULL */
+ s = str;
+ ++s; /* skip first space */
+ names = g_strsplit(s, " ", numh);
+ he = entries;
+ while (names[i]) {
+ he->name = g_strdup_printf("%s:", names[i]);
+ he->body = NULL;
+ he->unfold = FALSE;
+ ++i, ++he;
+ }
+ he->name = NULL;
+ g_strfreev(names);
+ return entries;
+}
+
+void procheader_entries_free (HeaderEntry *entries)
+{
+ if (entries != NULL) {
+ HeaderEntry *he = entries;
+ while (he->name != NULL) {
+ g_free(he->name);
+ if (he->body != NULL)
+ g_free(he->body);
+ ++he;
+ }
+ g_free(entries);
+ }
+}
+