gmime r1442 - in trunk: . gmime
- From: fejj svn gnome org
- To: svn-commits-list gnome org
- Subject: gmime r1442 - in trunk: . gmime
- Date: Tue, 9 Sep 2008 00:32:00 +0000 (UTC)
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]