aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog14
-rw-r--r--camel/camel-mime-message.c50
-rw-r--r--camel/camel-mime-message.h5
-rw-r--r--camel/camel-mime-utils.c53
4 files changed, 105 insertions, 17 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 0ab171ce23..fb17283447 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,17 @@
+2001-02-26 Jeffrey Stedfast <fejj@ximian.com>
+
+ * camel-mime-utils.c: Made thread-safe and moved to above the test
+ code.
+
+ * camel-mime-message.c (camel_mime_message_init): Set the
+ message_id to NULL.
+ (camel_mime_message_finalize): Free the message_id.
+ (camel_mime_message_set_message_id): New function to set the
+ Message-Id.
+ (camel_mime_message_get_message_id): New function to get the
+ Message-Id.
+ (process_header): Decode the message-id.
+
2001-02-24 Jeffrey Stedfast <fejj@ximian.com>
* camel-store.c (construct): init the vTrash folder here instead
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c
index 40199eac21..9e0fb7de11 100644
--- a/camel/camel-mime-message.c
+++ b/camel/camel-mime-message.c
@@ -51,12 +51,13 @@ typedef enum {
HEADER_TO,
HEADER_CC,
HEADER_BCC,
- HEADER_DATE
+ HEADER_DATE,
+ HEADER_MESSAGE_ID
} CamelHeaderType;
static char *header_names[] = {
/* dont include HEADER_UNKNOWN string */
- "From", "Reply-To", "Subject", "To", "Cc", "Bcc", "Date", NULL
+ "From", "Reply-To", "Subject", "To", "Cc", "Bcc", "Date", "Message-Id", NULL
};
static GHashTable *header_name_table;
@@ -124,6 +125,7 @@ camel_mime_message_init (gpointer object, gpointer klass)
mime_message->date_offset = 0;
mime_message->date_received = CAMEL_MESSAGE_DATE_CURRENT;
mime_message->date_received_offset = 0;
+ mime_message->message_id = NULL;
}
static void
@@ -133,6 +135,8 @@ camel_mime_message_finalize (CamelObject *object)
g_free(message->subject);
+ g_free(message->message_id);
+
if (message->reply_to)
camel_object_unref((CamelObject *)message->reply_to);
@@ -235,6 +239,37 @@ camel_mime_message_get_date_received(CamelMimeMessage *msg, int *offset)
return msg->date_received;
}
+/* **** Message-Id: */
+
+void
+camel_mime_message_set_message_id (CamelMimeMessage *mime_message, const char *message_id)
+{
+ char *id;
+
+ g_assert (mime_message);
+
+ g_free (mime_message->message_id);
+
+ if (message_id) {
+ id = g_strstrip (g_strdup (message_id));
+ } else {
+ id = header_msgid_generate ();
+ }
+
+ mime_message->message_id = id;
+ id = g_strdup_printf ("<%s>", mime_message->message_id);
+ CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), "Message-Id", id);
+ g_free (id);
+}
+
+const char *
+camel_mime_message_get_message_id (CamelMimeMessage *mime_message)
+{
+ g_assert (mime_message);
+
+ return mime_message->message_id;
+}
+
/* **** Reply-To: */
void
@@ -429,6 +464,10 @@ write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
g_warning("Application did not set subject, creating one");
camel_mime_message_set_subject(mm, "No Subject");
}
+ if (mm->message_id == NULL) {
+ g_warning ("Application did not set message-id, creating one");
+ camel_mime_message_set_message_id (mm, NULL);
+ }
/* FIXME: "To" header needs to be set explicitly as well ... */
@@ -481,6 +520,13 @@ process_header (CamelMedium *medium, const char *header_name, const char *header
message->date_offset = 0;
}
break;
+ case HEADER_MESSAGE_ID:
+ g_free (message->message_id);
+ if (header_value)
+ message->message_id = header_msgid_decode (header_value);
+ else
+ message->message_id = NULL;
+ break;
default:
return FALSE;
}
diff --git a/camel/camel-mime-message.h b/camel/camel-mime-message.h
index b386632a86..0ab406c27e 100644
--- a/camel/camel-mime-message.h
+++ b/camel/camel-mime-message.h
@@ -65,6 +65,8 @@ struct _CamelMimeMessage
char *subject;
+ char *message_id;
+
CamelInternetAddress *reply_to;
CamelInternetAddress *from;
@@ -93,6 +95,9 @@ time_t camel_mime_message_get_date (CamelMimeMess
int *offset);
time_t camel_mime_message_get_date_received (CamelMimeMessage *mime_message,
int *offset);
+void camel_mime_message_set_message_id (CamelMimeMessage *mime_message,
+ const char *message_id);
+const char *camel_mime_message_get_message_id (CamelMimeMessage *mime_message);
void camel_mime_message_set_reply_to (CamelMimeMessage *mime_message,
const CamelInternetAddress *reply_to);
const CamelInternetAddress *camel_mime_message_get_reply_to (CamelMimeMessage *mime_message);
diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c
index 448c3dc077..10d2c99001 100644
--- a/camel/camel-mime-utils.c
+++ b/camel/camel-mime-utils.c
@@ -27,11 +27,16 @@
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/param.h> /* for MAXHOSTNAMELEN */
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 1024
+#endif
+
#include <unicode.h>
#include <iconv.h>
@@ -46,6 +51,10 @@
#include "camel-mime-utils.h"
#include "camel-charset-map.h"
+#ifdef ENABLE_THREADS
+#include <pthread.h>
+#endif
+
#ifndef CLEAN_DATE
#include "broken-date-parser.h"
#endif
@@ -2895,6 +2904,35 @@ header_raw_clear(struct _header_raw **list)
*list = NULL;
}
+char *
+header_msgid_generate (void)
+{
+ char host[MAXHOSTNAMELEN], domain[MAXHOSTNAMELEN];
+#ifdef ENABLE_THREADS
+ static pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
+#define COUNT_LOCK() pthread_mutex_lock (&count_lock)
+#define COUNT_UNLOCK() pthread_mutex_unlock (&count_lock)
+#else
+#define COUNT_LOCK()
+#define COUNT_UNLOCK()
+#endif /* ENABLE_THREADS */
+ static gint count = 0;
+ gint hrv, drv;
+ char *ret;
+
+ hrv = gethostname (host, sizeof (host));
+ drv = getdomainname (domain, sizeof (domain));
+
+ COUNT_LOCK ();
+ ret = g_strdup_printf ("%d.%d.%d.camel@%s.%s", (gint) time (NULL), getpid (), count++,
+ (hrv == 0 && host && *host) ? host : "unknown.host",
+ (drv && domain && *domain) ? domain : "unknown.domain");
+ COUNT_UNLOCK ();
+
+ return ret;
+}
+
+
static struct {
char *name;
char *pattern;
@@ -3335,18 +3373,3 @@ void run_test(void)
}
#endif /* BUILD_TABLE */
-
-char *
-header_msgid_generate (void)
-{
- gchar host [256], domain [768];
- static gint count = 0;
- gint hrv, drv;
-
- hrv = gethostname (host, sizeof (host));
- drv = getdomainname (domain, sizeof (domain));
-
- return g_strdup_printf ("%d.%d.%d.camel@%s.%s", (gint) time (NULL), getpid (), count++,
- (hrv == 0 && host && *host) ? host : "unknown.host",
- (drv && domain && *domain) ? domain : "unknown.domain");
-}