gmime r1442 - in trunk: . gmime



Author: fejj
Date: Tue Sep  9 00:31:59 2008
New Revision: 1442
URL: http://svn.gnome.org/viewvc/gmime?rev=1442&view=rev

Log:
2008-09-08  Jeffrey Stedfast  <fejj novell com>

	* gmime/gmime-message.c (message_add_recipients_from_string):
	Prepend, append, or set the addresses in the recipients list
	depending on the new 'action' argument.
	(process_header): Pass along our 'action' to
	message_add_recipients_from_string().
	(message_prepend_header): Pass PREPEND as the action argument to
	process_header().
	(message_append_header): Pass APPEND as the action argument to
	process_header().
	(message_set_header): Pass SET as the action argument to
	process_header().

	* gmime/gmime-header.c (g_mime_header_list_set): If there is more
	than a single header with the specified name, remove them.



Modified:
   trunk/ChangeLog
   trunk/gmime/gmime-header.c
   trunk/gmime/gmime-message.c

Modified: trunk/gmime/gmime-header.c
==============================================================================
--- trunk/gmime/gmime-header.c	(original)
+++ trunk/gmime/gmime-header.c	Tue Sep  9 00:31:59 2008
@@ -92,7 +92,7 @@
 {
 	GMimeHeader *header;
 	
-	header = g_new (GMimeHeader, 1);
+	header = g_slice_new (GMimeHeader);
 	header->name = g_strdup (name);
 	header->value = g_strdup (value);
 	/*header->offset = offset;*/
@@ -114,7 +114,8 @@
 {
 	g_free (header->name);
 	g_free (header->value);
-	g_free (header);
+	
+	g_slice_free (GMimeHeader, header);
 }
 
 
@@ -654,16 +655,19 @@
  * @name: header name
  * @value: header value
  *
- * Set the value of the first header with the name specified. If
- * @value is %NULL and the header, @name, had not been previously set,
- * a space will be set aside for it (useful for setting the order of
- * headers before values can be obtained for them) otherwise the
- * header will be unset.
+ * Set the value of the specified header. If @value is %NULL and the
+ * header, @name, had not been previously set, a space will be set
+ * aside for it (useful for setting the order of headers before values
+ * can be obtained for them) otherwise the header will be unset.
+ *
+ * Note: If there are multiple headers with the specified field name,
+ * the first instance of the header will be replaced and further
+ * instances will be removed.
  **/
 void
 g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value)
 {
-	GMimeHeader *header;
+	GMimeHeader *header, *next;
 	
 	g_return_if_fail (headers != NULL);
 	g_return_if_fail (name != NULL);
@@ -671,6 +675,20 @@
 	if ((header = g_hash_table_lookup (headers->hash, name))) {
 		g_free (header->value);
 		header->value = g_strdup (value);
+		
+		header = header->next;
+		while (header->next) {
+			next = header->next;
+			
+			if (!g_ascii_strcasecmp (header->name, name)) {
+				/* remove/free the header */
+				list_unlink ((ListNode *) header);
+				g_mime_header_free (header);
+				headers->version++;
+			}
+			
+			header = next;
+		}
 	} else {
 		header = g_mime_header_new (name, value, -1);
 		list_append (&headers->list, (ListNode *) header);

Modified: trunk/gmime/gmime-message.c
==============================================================================
--- trunk/gmime/gmime-message.c	(original)
+++ trunk/gmime/gmime-message.c	Tue Sep  9 00:31:59 2008
@@ -662,19 +662,6 @@
 	return n;
 }
 
-static void
-message_add_recipients_from_string (GMimeMessage *message, GMimeRecipientType type, const char *str)
-{
-	InternetAddressList *recipients, *addrlist;
-	
-	recipients = g_mime_message_get_recipients (message, type);
-	
-	if ((addrlist = internet_address_list_parse_string (str))) {
-		internet_address_list_concat (recipients, addrlist);
-		g_object_unref (addrlist);
-	}
-}
-
 enum {
 	HEADER_FROM,
 	HEADER_REPLY_TO,
@@ -698,8 +685,39 @@
 	"Message-Id",
 };
 
+enum {
+	PREPEND,
+	APPEND,
+	SET
+};
+
+static void
+message_add_recipients_from_string (GMimeMessage *message, int action, GMimeRecipientType type, const char *str)
+{
+	InternetAddressList *recipients, *addrlist;
+	InternetAddress *ia;
+	int count, i;
+	
+	recipients = g_mime_message_get_recipients (message, type);
+	
+	if (action == SET)
+		internet_address_list_clear (recipients);
+	
+	if ((addrlist = internet_address_list_parse_string (str))) {
+		count = internet_address_list_length (addrlist);
+		for (i = 0; i < count; i++) {
+			ia = internet_address_list_get_address (addrlist, i);
+			if (action == PREPEND)
+				internet_address_list_insert (recipients, i, ia);
+			else
+				internet_address_list_add (recipients, ia);
+		}
+		g_object_unref (addrlist);
+	}
+}
+
 static gboolean
-process_header (GMimeObject *object, const char *header, const char *value)
+process_header (GMimeObject *object, int action, const char *header, const char *value)
 {
 	GMimeMessage *message = (GMimeMessage *) object;	
 	InternetAddressList *addrlist;
@@ -733,17 +751,17 @@
 		break;
 	case HEADER_TO:
 		block_changed_event (message, GMIME_RECIPIENT_TYPE_TO);
-		message_add_recipients_from_string (message, GMIME_RECIPIENT_TYPE_TO, value);
+		message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_TO, value);
 		unblock_changed_event (message, GMIME_RECIPIENT_TYPE_TO);
 		break;
 	case HEADER_CC:
 		block_changed_event (message, GMIME_RECIPIENT_TYPE_CC);
-		message_add_recipients_from_string (message, GMIME_RECIPIENT_TYPE_CC, value);
+		message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_CC, value);
 		unblock_changed_event (message, GMIME_RECIPIENT_TYPE_CC);
 		break;
 	case HEADER_BCC:
 		block_changed_event (message, GMIME_RECIPIENT_TYPE_BCC);
-		message_add_recipients_from_string (message, GMIME_RECIPIENT_TYPE_BCC, value);
+		message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_BCC, value);
 		unblock_changed_event (message, GMIME_RECIPIENT_TYPE_BCC);
 		break;
 	case HEADER_SUBJECT:
@@ -781,7 +799,7 @@
 	if (!g_ascii_strncasecmp ("Content-", header, 8))
 		return;
 	
-	if (!process_header (object, header, value))
+	if (!process_header (object, PREPEND, header, value))
 		GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value);
 	else
 		g_mime_header_list_prepend (object->headers, header, value);
@@ -803,7 +821,7 @@
 	if (!g_ascii_strncasecmp ("Content-", header, 8))
 		return;
 	
-	if (!process_header (object, header, value))
+	if (!process_header (object, APPEND, header, value))
 		GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value);
 	else
 		g_mime_header_list_append (object->headers, header, value);
@@ -825,7 +843,7 @@
 	if (!g_ascii_strncasecmp ("Content-", header, 8))
 		return;
 	
-	if (!process_header (object, header, value))
+	if (!process_header (object, SET, header, value))
 		GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value);
 	else
 		g_mime_header_list_set (object->headers, header, value);



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