aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog45
-rw-r--r--mail/mail-autofilter.c31
-rw-r--r--mail/mail-display.c19
-rw-r--r--mail/mail-format.c202
-rw-r--r--mail/mail-tools.c24
5 files changed, 165 insertions, 156 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index a95eb87b4f..5639220852 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,48 @@
+2000-11-07 Not Zed <NotZed@HelixCode.com>
+
+ * mail-display.c (on_object_requested): God, I sure wish people
+ would listen when i'm saying i'm changing and API. I mean
+ I even mailed everyone and everything. Can't see any changelog
+ either.
+
+2000-11-06 Not Zed <NotZed@HelixCode.com>
+
+ * mail-autofilter.c (rule_from_message): Updates for api changes.
+
+ * mail-tools.c (mail_tool_generate_forward_subject): Fixed for api
+ changes. Sigh, whoever wrote the multithread code of the mailer,
+ had little idea. You can't just lock for getting a const value,
+ until you are finished with it, cause the owner still owns it.
+ Fixed this too. Yuck, what a horrid forwarding format, can we
+ change this, or make it configurable? The mail headers show who
+ forwarded it, we dont need to duplicate it in that UGLY subject.
+
+ * mail-format.c (write_field_to_stream): Removed some jeffness.
+ dont g_strdup stuff we dont need to, and remove the
+ value_is_encoded thing since we can get the unencoded address
+ now.
+ (write_address): New function to write an address field.
+ (write_headers): Uses write_address to write addresses, cleaner,
+ fixed the god-awful unreadable indenting too.
+ (handle_text_plain): Use a 'smarter' printf format, so we dont
+ need to allocate and copy substrings unecessarily (esp since
+ they're about to be allocated any copied another few times
+ anyway *sigh*).
+ (write_field_to_stream): Commented out the isprint check, which
+ afaik serves no purpose.
+ (list_add_addresses): New function to build a list of
+ display-ready addresses. Although I think the composer then uses
+ these as internet-ready addresses. It should probably take a list
+ of CamelAddress's if thats what it wants.
+ (mail_generate_reply): Cleaned up the address list creation stuff
+ a heap, and fixes for camel api changes. Also fixed a small
+ memory leak as a side effect (fulladdr wasn't freed if it was the
+ same as the sender).
+
+ * mail-display.c (on_object_requested): Changed for interface
+ changes to the from address. I think passing the encoded
+ (internet version) of the address is right here.
+
2000-11-06 Jeffrey Stedfast <fejj@helixcode.com>
* folder-browser.c (on_right_click): Move filter stuff into a
diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c
index d4b537ab31..d1a1795f48 100644
--- a/mail/mail-autofilter.c
+++ b/mail/mail-autofilter.c
@@ -217,25 +217,20 @@ rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg
}
/* should parse the from address into an internet address? */
if (flags & AUTO_FROM) {
- struct _header_address *haddr, *scan;
- char *name, *namestr;
-
- haddr = header_address_decode (msg->from);
- scan = haddr;
- while (scan) {
- if (scan->type == HEADER_ADDRESS_NAME) {
- rule_add_sender (context, rule, scan->v.addr);
- if (scan->name && scan->name[0])
- name = scan->name;
- else
- name = scan->v.addr;
- namestr = g_strdup_printf (_("Mail from %s"), name);
- filter_rule_set_name (rule, namestr);
- g_free (namestr);
- }
- scan = scan->next;
+ const CamelInternetAddress *from;
+ int i;
+ const char *name, *addr;
+ char *namestr;
+
+ from = camel_mime_message_get_from(msg);
+ for (i=0;camel_internet_address_get(from, i, &name, &addr); i++) {
+ rule_add_sender(context, rule, addr);
+ if (name==NULL || name[0]==0)
+ name = addr;
+ namestr = g_strdup_printf(_("Mail from %s"), name);
+ filter_rule_set_name(rule, namestr);
+ g_free(namestr);
}
- header_address_unref (haddr);
}
if (flags & AUTO_TO) {
addr = (CamelInternetAddress *)camel_mime_message_get_recipients (msg, CAMEL_RECIPIENT_TYPE_TO);
diff --git a/mail/mail-display.c b/mail/mail-display.c
index 6ac113414b..350d1e1772 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -471,7 +471,6 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
BonoboStream *bstream;
BonoboControlFrame *control_frame;
Bonobo_PropertyBag prop_bag;
- const char *from_address;
char *cid;
cid = eb->classid;
@@ -554,24 +553,16 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
the iTip control, and it needs only the From email address,
but perhaps in the future we can generalize this section of code
to pass a bunch of useful things to all embedded controls. */
-
- CamelInternetAddress *ia;
- const char *addr;
- const char *name;
+ const CamelInternetAddress *from;
+ char *from_address;
CORBA_exception_init (&ev);
- ia = camel_internet_address_new ();
- addr = camel_mime_message_get_from (md->current_message);
- camel_address_decode (CAMEL_ADDRESS (ia), (const char *) addr);
-
- camel_internet_address_get (ia, 0, &name, &from_address);
-
+ from = camel_mime_message_get_from (md->current_message);
+ from_address = camel_address_encode((CamelAddress *)from);
bonobo_property_bag_client_set_value_string (prop_bag, "from_address",
from_address, &ev);
-
- camel_object_unref (CAMEL_OBJECT (ia));
-
+ g_free(from_address);
CORBA_exception_free (&ev);
}
}
diff --git a/mail/mail-format.c b/mail/mail-format.c
index bd9aee294b..e1109a09c1 100644
--- a/mail/mail-format.c
+++ b/mail/mail-format.c
@@ -540,80 +540,73 @@ call_handler_function (CamelMimePart *part, MailDisplay *md)
return output;
}
+/* flags for write_field_to_stream */
+enum {
+ WRITE_BOLD=1,
+};
+
static void
-write_field_to_stream (const char *description, const char *value,
- gboolean value_is_encoded, gboolean bold, GtkHTML *html,
- GtkHTMLStream *stream)
+write_field_to_stream(const char *description, const char *value, int flags, GtkHTML *html, GtkHTMLStream *stream)
{
char *encoded_value;
+ int bold = (flags&WRITE_BOLD) == WRITE_BOLD;
if (value) {
- char *raw, *p;
-
- if (value_is_encoded)
- raw = header_decode_string (value);
- else
- raw = g_strdup (value);
-
- encoded_value = e_text_to_html (raw,
- E_TEXT_TO_HTML_CONVERT_NL |
- E_TEXT_TO_HTML_CONVERT_URLS);
- g_free (raw);
+ encoded_value = e_text_to_html (value, E_TEXT_TO_HTML_CONVERT_NL|E_TEXT_TO_HTML_CONVERT_URLS);
+#if 0 /* I dont think this needs to be here anymore ... e_text_to_html should handle that anyway */
+ char *p;
for (p = encoded_value; *p; p++) {
if (!isprint (*p))
*p = '?';
}
+#endif
} else
encoded_value = "";
- mail_html_write (html, stream,
- "<tr valign=top><%s align=right>%s</%s>"
- "<td>%s</td></tr>", bold ? "th" : "td",
- description, bold ? "th" : "td", encoded_value);
+ mail_html_write(html, stream,
+ "<tr valign=top><%s align=right>%s</%s>"
+ "<td>%s</td></tr>", bold ? "th" : "td",
+ description, bold ? "th" : "td", encoded_value);
if (value)
- g_free (encoded_value);
+ g_free(encoded_value);
}
static void
-write_headers (CamelMimeMessage *message, MailDisplay *md)
+write_address(MailDisplay *md, const CamelInternetAddress *addr, const char *name, int flags)
{
- const CamelInternetAddress *recipients;
- const char *reply_to;
char *string;
+ if (addr == NULL)
+ return;
+
+ string = camel_address_format((CamelAddress *)addr);
+ if (string && string[0]) {
+ write_field_to_stream(name, string, flags, md->html, md->stream);
+ }
+ g_free(string);
+}
+
+
+static void
+write_headers (CamelMimeMessage *message, MailDisplay *md)
+{
mail_html_write (md->html, md->stream,
"<table bgcolor=\"#EEEEEE\" width=\"100%%\" "
"cellspacing=0 border=1>"
"<tr><td><table>\n");
- write_field_to_stream (_("From:"),
- camel_mime_message_get_from (message),
- TRUE, TRUE, md->html, md->stream);
+ write_address(md, camel_mime_message_get_from(message),
+ _("From:"), WRITE_BOLD);
+ write_address(md, camel_mime_message_get_reply_to(message),
+ _("Reply-To:"), 0);
+ write_address(md, camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_TO),
+ _("To:"), WRITE_BOLD);
+ write_address(md, camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_CC),
+ _("Cc:"), WRITE_BOLD);
- reply_to = camel_mime_message_get_reply_to (message);
- if (reply_to) {
- write_field_to_stream (_("Reply-To:"), reply_to, TRUE, FALSE,
- md->html, md->stream);
- }
-
- recipients = camel_mime_message_get_recipients (
- message, CAMEL_RECIPIENT_TYPE_TO);
- string = camel_address_encode (CAMEL_ADDRESS (recipients));
- write_field_to_stream (_("To:"), string ? string : "", TRUE, TRUE,
- md->html, md->stream);
- g_free (string);
-
- recipients = camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_CC);
- string = camel_address_encode(CAMEL_ADDRESS(recipients));
- if (string) {
- write_field_to_stream (_("Cc:"), string, TRUE, TRUE,
- md->html, md->stream);
- }
- g_free (string);
-
write_field_to_stream (_("Subject:"),
camel_mime_message_get_subject (message),
- FALSE, TRUE, md->html, md->stream);
+ TRUE, md->html, md->stream);
mail_html_write (md->html, md->stream,
"</table></td></tr></table></center><p>");
@@ -671,7 +664,7 @@ handle_text_plain (CamelMimePart *part, const char *mime_type,
{
CamelDataWrapper *wrapper =
camel_medium_get_content_object (CAMEL_MEDIUM (part));
- char *text, *p, *start, *subtext;
+ char *text, *p, *start;
GMimeContentField *type;
const char *format;
int i;
@@ -701,10 +694,8 @@ handle_text_plain (CamelMimePart *part, const char *mime_type,
/* Deal with special case */
if (start != p) {
- subtext = g_strndup (p, start - p);
- mail_text_write (md->html, md->stream,
- "%s", subtext);
- g_free (subtext);
+ /* the %.*s thing just grabs upto start-p chars; go read ANSI C */
+ mail_text_write (md->html, md->stream, "%.*s", start-p, p);
}
p = text_specials[i].handler (start, md);
if (p == start) {
@@ -714,10 +705,7 @@ handle_text_plain (CamelMimePart *part, const char *mime_type,
p = strchr (start, '\n');
if (!p++)
break;
- subtext = g_strndup (start, p - start);
- mail_text_write (md->html, md->stream,
- "%s", subtext);
- g_free (subtext);
+ mail_text_write (md->html, md->stream, "%.*s", p-start, start);
} else if (p)
mail_html_write (md->html, md->stream, "<hr>");
}
@@ -1625,17 +1613,45 @@ free_recipients (GList *list)
g_list_free (list);
}
+static GList *
+list_add_addresses(GList *list, const CamelInternetAddress *cia, const char *notme)
+{
+ int i;
+ const char *name, *addr;
+ char *full;
+
+ for (i=0;camel_internet_address_get(cia, i, &name, &addr);i++) {
+ /* now, we format this, as if for display, but does the composer
+ then use it as a real address? If so, very broken. */
+ /* we should probably pass around CamelAddresse's if thats what
+ we mean */
+ full = camel_internet_address_format_address(name, addr);
+
+ /* Here I'll check to see if the cc:'d address is the address
+ of the sender, and if so, don't add it to the cc: list; this
+ is to fix Bugzilla bug #455. */
+
+ if (notme && strcmp(addr, notme) == 0)
+ g_free(full);
+ else
+ list = g_list_append(list, full);
+ }
+
+ return list;
+}
+
EMsgComposer *
mail_generate_reply (CamelMimeMessage *message, gboolean to_all)
{
CamelDataWrapper *contents;
- char *text, *subject, *recipient;
+ char *text, *subject;
EMsgComposer *composer;
gboolean want_plain, is_html;
- const char *repl_to, *message_id, *references;
- GList *to, *cc;
+ const char *message_id, *references;
+ GList *to = NULL, *cc = NULL;
MailConfigIdentity *id;
gchar *sig_file = NULL;
+ const CamelInternetAddress *reply_to;
id = mail_config_get_default_identity ();
if (id)
@@ -1699,64 +1715,20 @@ mail_generate_reply (CamelMimeMessage *message, gboolean to_all)
}
/* Set the recipients */
- repl_to = camel_mime_message_get_reply_to (message);
- if (!repl_to)
- repl_to = camel_mime_message_get_from (message);
-
- recipient = header_decode_string (repl_to ? repl_to : "");
- to = g_list_append (NULL, (gpointer)recipient);
+ reply_to = camel_mime_message_get_reply_to(message);
+ if (!reply_to)
+ reply_to = camel_mime_message_get_from(message);
+ if (reply_to)
+ to = g_list_append(to, camel_address_format((CamelAddress *)reply_to));
if (to_all) {
- const CamelInternetAddress *recip;
- const char *name, *addr;
- char *fulladdr;
- int i;
-
- recip = camel_mime_message_get_recipients (message,
- CAMEL_RECIPIENT_TYPE_TO);
- i = 0;
- cc = NULL;
- while (camel_internet_address_get (recip, i++, &name, &addr)) {
- if (name && *name) {
- char *dname = header_decode_string (name);
-
- if (dname && *dname)
- fulladdr = g_strdup_printf ("\"%s\" <%s>", dname, addr);
- else
- fulladdr = g_strdup (addr);
-
- g_free (dname);
- } else
- fulladdr = g_strdup (addr);
-
- /* Here I'll check to see if the cc:'d address is the address
- of the sender, and if so, don't add it to the cc: list; this
- is to fix Bugzilla bug #455. */
-
- if (strcmp (addr, id->address) != 0)
- cc = g_list_append (cc, fulladdr);
- }
-
- recip = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
- i = 0;
- while (camel_internet_address_get (recip, i++, &name, &addr)) {
- if (name && *name) {
- char *dname = header_decode_string (name);
-
- if (dname && *dname)
- fulladdr = g_strdup_printf ("\"%s\" <%s>", dname, addr);
- else
- fulladdr = g_strdup (addr);
-
- g_free (dname);
- } else
- fulladdr = g_strdup (addr);
-
- if (strcmp (addr, id->address) != 0)
- cc = g_list_append (cc, fulladdr);
- }
- } else
- cc = NULL;
+ cc = list_add_addresses(cc,
+ camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_TO),
+ id->address);
+ cc = list_add_addresses(cc,
+ camel_mime_message_get_recipients(message, CAMEL_RECIPIENT_TYPE_CC),
+ id->address);
+ }
/* Set the subject of the new message. */
subject = (char *)camel_mime_message_get_subject (message);
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index 0ab7862200..25b353016e 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -345,25 +345,29 @@ mail_tool_set_uid_flags (CamelFolder *folder, const char *uid, guint32 mask, gui
mail_tool_camel_lock_down ();
}
-gchar *
+char *
mail_tool_generate_forward_subject (CamelMimeMessage *msg)
{
- const gchar *from;
- const gchar *subject;
- gchar *fwd_subj;
+ const char *subject;
+ char *fwd_subj, *fromstr;
+ const CamelInternetAddress *from;
+ /* we need to lock around the whole function, as we are
+ only getting references to the message's data */
mail_tool_camel_lock_up();
- from = camel_mime_message_get_from (msg);
- subject = camel_mime_message_get_subject (msg);
- mail_tool_camel_lock_down();
+
+ from = camel_mime_message_get_from(msg);
+ subject = camel_mime_message_get_subject(msg);
if (from) {
+ fromstr = camel_address_format((CamelAddress *)from);
if (subject && *subject) {
- fwd_subj = g_strdup_printf ("[%s] %s", from, subject);
+ fwd_subj = g_strdup_printf ("[%s] %s", fromstr, subject);
} else {
fwd_subj = g_strdup_printf (_("[%s] (forwarded message)"),
- from);
+ fromstr);
}
+ g_free(fromstr);
} else {
if (subject && *subject) {
if (strncmp (subject, "Fwd: ", 5) == 0)
@@ -373,6 +377,8 @@ mail_tool_generate_forward_subject (CamelMimeMessage *msg)
fwd_subj = g_strdup (_("Fwd: (no subject)"));
}
+ mail_tool_camel_lock_down();
+
return fwd_subj;
}