[evolution-patches] Improvement to replying to messages without Date:



When replying to a message without Date: header,
camel_mime_message_get_date() returns CAMEL_MESSAGE_DATE_CURRENT (-1).
attribution_format() in em-composer-utils.c does not check for this, and
proceeds to pass this bogus time to gmtime_r(). (Which presumably on
most Unixes is interpreted as one second before the Unix epoch. The
Win32 gmtime() returns NULL when given a -1, though... which is what
made me notice this.)

It would be better to then just return an attribution without date like
"${Sender} wrote:", but as we are in a string freeze, a workaround is to
look for the Received: headers instead.

OK to commit?

--tml




? mail/em-folder-view.c.THREAD-HACK
? mail/em-migrate.c.HUUH
? mail/mail.error
? mail/message-list.c.THREAD-HACK
? mail/message-list.h.THREAD-HACK
Index: mail/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.3806
diff -p -u -2 -r1.3806 ChangeLog
--- mail/ChangeLog	20 Feb 2006 16:01:00 -0000	1.3806
+++ mail/ChangeLog	21 Feb 2006 08:13:48 -0000
@@ -1,2 +1,11 @@
+2006-02-21  Tor Lillqvist  <tml novell com>
+
+	* em-composer-utils.c: Use the same Win32 macro for gmtime_r()
+	that guards against gmtime() returning NULL as elsewhere. gmtime()
+	is thread-safe on Win32.
+	(attribution_format): Check if camel returns
+	CAMEL_MESSAGE_DATE_CURRENT for Date:, try the date from Received:
+	then. If that doesn't work either, use current date.
+
 2006-02-20  Srinivasa Ragavan <sragavan novell com>
 
Index: mail/em-composer-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-composer-utils.c,v
retrieving revision 1.51
diff -p -u -2 -r1.51 em-composer-utils.c
--- mail/em-composer-utils.c	8 Feb 2006 11:51:31 -0000	1.51
+++ mail/em-composer-utils.c	21 Feb 2006 08:13:50 -0000
@@ -57,4 +57,14 @@
 #include <camel/camel-vee-folder.h>
 
+#ifdef G_OS_WIN32
+/* Undef the similar macro from pthread.h, it doesn't check if
+ * gmtime() returns NULL.
+ */
+#undef gmtime_r
+
+/* The gmtime() in Microsoft's C library is MT-safe */
+#define gmtime_r(tp,tmp) (gmtime(tp)?(*(tmp)=*gmtime(tp),(tmp)):0)
+#endif
+
 static EAccount * guess_account (CamelMimeMessage *message, CamelFolder *folder);
 
@@ -1717,13 +1727,20 @@ attribution_format (const char *format, 
 	
 	date = camel_mime_message_get_date (message, &tzone);
+
+	if (date == CAMEL_MESSAGE_DATE_CURRENT) {
+		/* The message has no Date: header, look at Received: */
+		date = camel_mime_message_get_date_received (message, &tzone);
+	}
+	if (date == CAMEL_MESSAGE_DATE_CURRENT) {
+		/* That didn't work either, use current time */
+		time (&date);
+		tzone = 0;
+	}
+	
 	/* Convert to UTC */
 	date += (tzone / 100) * 60 * 60;
 	date += (tzone % 100) * 60;
 	
-#ifdef HAVE_GMTIME_R
 	gmtime_r (&date, &tm);
-#else
-	memcpy (&tm, gmtime (&date), sizeof (struct tm));
-#endif
 	
 	start = inptr = format;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]