[balsa/wip/gmime3: 1/197] Initial commit for gmime3 branch



commit 46076fb4f3044d4a5d556d9b76a9b4f82fe8a4ac
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Jun 22 20:53:31 2017 -0400

    Initial commit for gmime3 branch

 configure.ac                       |    4 +-
 libbalsa/abook-completion.c        |    2 +-
 libbalsa/address-view.c            |   16 +++--
 libbalsa/address.c                 |    4 +-
 libbalsa/body.c                    |   25 ++++---
 libbalsa/filter.c                  |    6 +-
 libbalsa/gmime-application-pkcs7.c |   24 ++----
 libbalsa/gmime-multipart-crypt.c   |   33 +++++----
 libbalsa/gmime-part-rfc2440.c      |   16 ++--
 libbalsa/identity.c                |    2 +-
 libbalsa/imap/imap-handle.c        |   10 +++
 libbalsa/libbalsa.c                |   12 +---
 libbalsa/mailbox.c                 |    3 +-
 libbalsa/mailbox_imap.c            |   24 +++----
 libbalsa/mailbox_local.c           |   10 ++--
 libbalsa/mailbox_maildir.c         |    4 +-
 libbalsa/mailbox_mbox.c            |   31 ++++----
 libbalsa/mailbox_mh.c              |    3 +-
 libbalsa/message.c                 |  135 +++++++++++++++++++++---------------
 libbalsa/misc.c                    |   18 +++++-
 libbalsa/misc.h                    |    3 +
 libbalsa/rfc3156.c                 |    2 +-
 libbalsa/send.c                    |   97 +++++++++++---------------
 src/ab-main.c                      |    3 +-
 src/balsa-message.c                |   16 ++--
 src/balsa-mime-widget-message.c    |   11 ++--
 src/balsa-mime-widget-vcalendar.c  |    5 +-
 src/balsa-print-object-header.c    |    2 +-
 src/message-window.c               |    2 +-
 src/print-gtk.c                    |    2 +-
 src/sendmsg-window.c               |   36 +++++-----
 src/store-address.c                |    2 +-
 32 files changed, 294 insertions(+), 269 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index c1cc703..370e3ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -276,7 +276,7 @@ LIBS="$LIBS -lz"
 PKG_CHECK_MODULES(BALSA, [
 glib-2.0 >= 2.40.0
 gtk+-3.0 >= 3.10.0
-gmime-2.6
+gmime-3.0
 gio-2.0
 gthread-2.0
 gnutls
@@ -286,7 +286,7 @@ $gnome_extras
 PKG_CHECK_MODULES(BALSA_AB, [
    glib-2.0
    gtk+-3.0
-   gmime-2.6
+   gmime-3.0
    $gnome_extras
 ])
 
diff --git a/libbalsa/abook-completion.c b/libbalsa/abook-completion.c
index 3b975cf..7a207ec 100644
--- a/libbalsa/abook-completion.c
+++ b/libbalsa/abook-completion.c
@@ -52,7 +52,7 @@ completion_data_new(InternetAddress * ia, const gchar * nick_name)
     string = g_string_new(nick_name);
     if (string->len > 0)
        g_string_append_c(string, ' ');
-    address_string = internet_address_to_string(ia, FALSE);
+    address_string = internet_address_to_string(ia, NULL, FALSE);
     /* Remove '"' and '<'. */
     for (p = q = address_string; *p; p++)
         if (*p != '"' && *p != '<')
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index aa86553..2415c12 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -39,7 +39,7 @@
  */
 #include "address-book.h"
 #include "cell-renderer-button.h"
-#include "misc.h"
+#include "libbalsa.h"
 
 struct _LibBalsaAddressView {
     GtkTreeView parent;
@@ -223,7 +223,7 @@ lbav_append_addresses(LibBalsaAddressView * address_view,
 
     for (; match; match = match->next) {
         InternetAddress *ia = match->data;
-        name = internet_address_to_string(ia, FALSE);
+        name = internet_address_to_string(ia, NULL, FALSE);
         gtk_list_store_append(store, &iter);
         gtk_list_store_set(store, &iter, COMPLETION_NAME_COL, name, -1);
         g_free(name);
@@ -400,7 +400,7 @@ lbav_add_from_list(LibBalsaAddressView * address_view,
 
     for (i = 0; i < internet_address_list_length(list); i++) {
         InternetAddress *ia = internet_address_list_get_address(list, i);
-        gchar *name = internet_address_to_string(ia, FALSE);
+        gchar *name = internet_address_to_string(ia, NULL, FALSE);
 
         libbalsa_utf8_sanitize(&name, address_view->fallback, NULL);
         lbav_clean_text(name);
@@ -427,7 +427,7 @@ static gboolean
 lbav_add_from_string(LibBalsaAddressView * address_view,
                      GtkTreeIter * iter, const gchar * string)
 {
-    InternetAddressList *list = internet_address_list_parse_string(string);
+    InternetAddressList *list = internet_address_list_parse(libbalsa_parser_options(), string);
     gboolean retval = FALSE;
 
     if (list) {
@@ -771,7 +771,7 @@ lbav_focus_out_cb(GtkEntry * entry, GdkEventFocus * event,
             if (!match->next) {
                 gchar *the_addr =
                     internet_address_to_string((InternetAddress *) match->
-                                               data, FALSE);
+                                               data, NULL, FALSE);
 
                 g_signal_handlers_block_by_func(entry,
                                                 lbav_entry_changed_cb,
@@ -1275,8 +1275,10 @@ libbalsa_address_view_get_list(LibBalsaAddressView * address_view,
                            ADDRESS_NAME_COL, &name, -1);
 
         if (this_type == type) {
-            InternetAddressList *tmp_list =
-                internet_address_list_parse_string(name);
+            InternetAddressList *tmp_list = NULL;
+
+            if (name != NULL)
+                tmp_list = internet_address_list_parse(libbalsa_parser_options(), name);
             if (tmp_list) {
                 internet_address_list_append(address_list, tmp_list);
                 g_object_unref(tmp_list);
diff --git a/libbalsa/address.c b/libbalsa/address.c
index 0e85aab..58ac01b 100644
--- a/libbalsa/address.c
+++ b/libbalsa/address.c
@@ -553,7 +553,7 @@ rfc2822_mailbox(const gchar * full_name, const gchar * address)
     gchar *new_str;
 
     ia = internet_address_mailbox_new(full_name, address);
-    new_str = internet_address_to_string(ia, FALSE);
+    new_str = internet_address_to_string(ia, NULL, FALSE);
     g_object_unref(ia);
 
     return new_str;
@@ -573,7 +573,7 @@ rfc2822_group(const gchar *full_name, GList *addr_list)
        internet_address_group_add_member(INTERNET_ADDRESS_GROUP(ia), member);
        g_object_unref(member);
     }
-    res = internet_address_to_string(ia, FALSE);
+    res = internet_address_to_string(ia, NULL, FALSE);
     g_object_unref(ia);
 
     return res;
diff --git a/libbalsa/body.c b/libbalsa/body.c
index 6b2bdbc..5e8cfc5 100644
--- a/libbalsa/body.c
+++ b/libbalsa/body.c
@@ -105,7 +105,6 @@ libbalsa_message_body_extract_embedded_headers(GMimeMessage* msg)
 {
     LibBalsaMessageHeaders *ehdr;
     const char *subj;
-    int offset;
 
     ehdr = g_new0(LibBalsaMessageHeaders, 1);
 
@@ -114,12 +113,16 @@ libbalsa_message_body_extract_embedded_headers(GMimeMessage* msg)
 
     subj = g_mime_message_get_subject(msg);
     if (subj) {
-       ehdr->subject =
-           g_mime_utils_header_decode_text(subj);
+       ehdr->subject = g_mime_utils_header_decode_text(libbalsa_parser_options(), subj);
        libbalsa_utf8_sanitize(&ehdr->subject, TRUE, NULL);
     } else 
        ehdr->subject = g_strdup(_("(No subject)"));
-    g_mime_message_get_date(msg, &ehdr->date, &offset);
+    {
+        GDateTime *datetime;
+
+        datetime = g_mime_message_get_date(msg);
+        ehdr->date = g_date_time_to_unix(datetime);
+    }
 
     return ehdr;
 }
@@ -166,7 +169,7 @@ libbalsa_message_body_set_types(LibBalsaMessageBody * body)
     else body->body_type = LIBBALSA_MESSAGE_BODY_TYPE_OTHER;
 
     g_free(body->content_type);
-    body->content_type = g_mime_content_type_to_string(type);
+    body->content_type = g_mime_content_type_get_mime_type(type);
 }
 
 static LibBalsaMessageBody **
@@ -232,7 +235,7 @@ libbalsa_message_body_set_text_rfc822headers(LibBalsaMessageBody *body)
        g_mime_stream_reset(headers);
        parser = g_mime_parser_new_with_stream(headers);
        g_object_unref(headers);
-       dummy_msg = g_mime_parser_construct_message(parser);
+       dummy_msg = g_mime_parser_construct_message(parser, libbalsa_parser_options());
        g_object_unref(parser);
 
        body->embhdrs = libbalsa_message_body_extract_embedded_headers(dummy_msg);
@@ -307,7 +310,7 @@ libbalsa_message_body_get_parameter(LibBalsaMessageBody * body,
        type = g_mime_object_get_content_type(body->mime_part);
        res = g_strdup(g_mime_content_type_get_parameter(type, param));
     } else if (body->content_type) {
-       type = g_mime_content_type_new_from_string(body->content_type);
+       type = g_mime_content_type_parse(libbalsa_parser_options(), body->content_type);
        res = g_strdup(g_mime_content_type_get_parameter(type, param));
        g_object_unref(type);
     }
@@ -485,7 +488,7 @@ libbalsa_message_body_get_part_stream(LibBalsaMessageBody * body,
     gchar *mime_type = NULL;
     const gchar *charset;
 
-    wrapper = g_mime_part_get_content_object(GMIME_PART(body->mime_part));
+    wrapper = g_mime_part_get_content(GMIME_PART(body->mime_part));
     if (!wrapper) {
         /* part is incomplete. */
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
@@ -560,7 +563,7 @@ libbalsa_message_body_get_message_part_stream(LibBalsaMessageBody * body,
     stream = g_mime_stream_mem_new();
     libbalsa_mailbox_lock_store(body->message->mailbox);
     bytes_written =
-        g_mime_object_write_to_stream(GMIME_OBJECT(msg), stream);
+        g_mime_object_write_to_stream(GMIME_OBJECT(msg), NULL, stream);
     libbalsa_mailbox_unlock_store(body->message->mailbox);
     printf("Written %ld bytes of embedded message\n",
            (long) bytes_written);
@@ -726,7 +729,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
         g_mime_stream_reset(stream);
 
         if (filter_crlf) {
-            GMimeFilter *filter = g_mime_filter_crlf_new(FALSE, FALSE);
+            GMimeFilter *filter = g_mime_filter_dos2unix_new(FALSE);
             stream =
                 libbalsa_message_body_stream_add_filter(stream, filter);
         }
@@ -735,7 +738,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
         g_object_unref(stream);
     } else
         /* body->mime_part is neither a GMimePart nor a GMimeMessagePart. */
-        len = g_mime_object_write_to_stream(body->mime_part, dest);
+        len = g_mime_object_write_to_stream(body->mime_part, NULL, dest);
 
     libbalsa_mailbox_unlock_store(body->message->mailbox);
     g_object_unref(dest);
diff --git a/libbalsa/filter.c b/libbalsa/filter.c
index 51e48d7..45d8d25 100644
--- a/libbalsa/filter.c
+++ b/libbalsa/filter.c
@@ -132,7 +132,7 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
             && message->headers->to_list) {
             str =
                 internet_address_list_to_string(message->headers->to_list,
-                                                FALSE);
+                                                NULL, FALSE);
            match=libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
             if(match) break;
@@ -141,7 +141,7 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
             && message->headers->from) {
             str =
                 internet_address_list_to_string(message->headers->from,
-                                                FALSE);
+                                                NULL, FALSE);
            match=libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
            if (match) break;
@@ -157,7 +157,7 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
             && message->headers->cc_list) {
             str =
                 internet_address_list_to_string(message->headers->cc_list,
-                                                FALSE);
+                                                NULL, FALSE);
            match=libbalsa_utf8_strstr(str,cond->match.string.string);
            g_free(str);
            if (match) break;
diff --git a/libbalsa/gmime-application-pkcs7.c b/libbalsa/gmime-application-pkcs7.c
index e3b76cc..6d38130 100644
--- a/libbalsa/gmime-application-pkcs7.c
+++ b/libbalsa/gmime-application-pkcs7.c
@@ -23,16 +23,8 @@
 
 #include <string.h>
 
-#include <gmime/gmime-stream-filter.h>
-#include <gmime/gmime-filter-crlf.h>
-#include <gmime/gmime-filter-from.h>
-#include <gmime/gmime-filter-basic.h>
-#include <gmime/gmime-stream-mem.h>
-#include <gmime/gmime-parser.h>
-#include <gmime/gmime-message-part.h>
-#include <gmime/gmime-multipart.h>
-#include <gmime/gmime-multipart-signed.h>
-#include <gmime/gmime-multipart-encrypted.h>
+#include <gmime/gmime.h>
+#include "libbalsa.h"
 #include "libbalsa-gpgme.h"
 #include "gmime-application-pkcs7.h"
 #include <glib/gi18n.h>
@@ -74,7 +66,7 @@ g_mime_application_pkcs7_decrypt_verify(GMimePart * pkcs7,
     }
 
     /* get the ciphertext stream */
-    wrapper = g_mime_part_get_content_object(GMIME_PART(pkcs7));
+    wrapper = g_mime_part_get_content(GMIME_PART(pkcs7));
     g_return_val_if_fail(wrapper, NULL); /* Incomplete part. */
     ciphertext = g_mime_stream_mem_new();
     g_mime_data_wrapper_write_to_stream(wrapper, ciphertext);
@@ -82,7 +74,7 @@ g_mime_application_pkcs7_decrypt_verify(GMimePart * pkcs7,
 
     stream = g_mime_stream_mem_new();
     filtered_stream = g_mime_stream_filter_new(stream);
-    crlf_filter = g_mime_filter_crlf_new(FALSE, FALSE);
+    crlf_filter = g_mime_filter_dos2unix_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream),
                             crlf_filter);
     g_object_unref(crlf_filter);
@@ -113,7 +105,7 @@ g_mime_application_pkcs7_decrypt_verify(GMimePart * pkcs7,
     g_mime_parser_init_with_stream(parser, stream);
     g_object_unref(stream);
 
-    decrypted = g_mime_parser_construct_part(parser);
+    decrypted = g_mime_parser_construct_part(parser, libbalsa_parser_options());
     g_object_unref(parser);
 
     if (decrypted)
@@ -150,12 +142,12 @@ g_mime_application_pkcs7_encrypt(GMimePart * pkcs7, GMimeObject * content,
     stream = g_mime_stream_mem_new();
     filtered_stream = g_mime_stream_filter_new(stream);
        
-    crlf_filter = g_mime_filter_crlf_new(TRUE, FALSE);
+    crlf_filter = g_mime_filter_unix2dos_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream),
                             crlf_filter);
     g_object_unref(crlf_filter);
        
-    g_mime_object_write_to_stream(content, filtered_stream);
+    g_mime_object_write_to_stream(content, NULL, filtered_stream);
     g_mime_stream_flush(filtered_stream);
     g_object_unref(filtered_stream);
        
@@ -179,7 +171,7 @@ g_mime_application_pkcs7_encrypt(GMimePart * pkcs7, GMimeObject * content,
     wrapper = g_mime_data_wrapper_new();
     g_mime_data_wrapper_set_stream(wrapper, ciphertext);
     g_object_unref(ciphertext);
-    g_mime_part_set_content_object(GMIME_PART(pkcs7), wrapper);
+    g_mime_part_set_content(GMIME_PART(pkcs7), wrapper);
     g_mime_part_set_filename(GMIME_PART(pkcs7), "smime.p7m");
     g_mime_part_set_content_encoding(GMIME_PART(pkcs7),
                                     GMIME_CONTENT_ENCODING_BASE64);
diff --git a/libbalsa/gmime-multipart-crypt.c b/libbalsa/gmime-multipart-crypt.c
index 2820da2..a8900e9 100644
--- a/libbalsa/gmime-multipart-crypt.c
+++ b/libbalsa/gmime-multipart-crypt.c
@@ -34,6 +34,7 @@
 #include <gtk/gtk.h>
 #include "libbalsa-gpgme.h"
 #include "gmime-multipart-crypt.h"
+#include "libbalsa.h"
 
 
 /**
@@ -117,14 +118,14 @@ g_mime_gpgme_mps_sign(GMimeMultipartSigned * mps, GMimeObject * content,
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered), filter);
     g_object_unref(filter);
 
-    g_mime_object_write_to_stream(content, filtered);
+    g_mime_object_write_to_stream(content, NULL, filtered);
     g_mime_stream_flush(filtered);
     g_object_unref(filtered);
     g_mime_stream_reset(stream);
 
     /* Note: see rfc2015 or rfc3156, section 5.1 */
     filtered = g_mime_stream_filter_new(stream);
-    filter = g_mime_filter_crlf_new(TRUE, FALSE);
+    filter = g_mime_filter_unix2dos_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered), filter);
     g_object_unref(filter);
 
@@ -164,7 +165,7 @@ g_mime_gpgme_mps_sign(GMimeMultipartSigned * mps, GMimeObject * content,
 
     /* construct the content part */
     parser = g_mime_parser_new_with_stream(stream);
-    content = g_mime_parser_construct_part(parser);
+    content = g_mime_parser_construct_part(parser, libbalsa_parser_options());
     g_object_unref(stream);
     g_object_unref(parser);
 
@@ -173,7 +174,7 @@ g_mime_gpgme_mps_sign(GMimeMultipartSigned * mps, GMimeObject * content,
 
     wrapper = g_mime_data_wrapper_new();
     g_mime_data_wrapper_set_stream(wrapper, sigstream);
-    g_mime_part_set_content_object(signature, wrapper);
+    g_mime_part_set_content(signature, wrapper);
     g_object_unref(sigstream);
     g_object_unref(wrapper);
 
@@ -252,7 +253,7 @@ g_mime_gpgme_mps_verify(GMimeMultipartSigned * mps, GError ** error)
                                  GMIME_MULTIPART_SIGNED_SIGNATURE);
 
     /* make sure the protocol matches the signature content-type */
-    content_type = g_mime_content_type_to_string(signature->content_type);
+    content_type = g_mime_content_type_get_mime_type(signature->content_type);
     if (g_ascii_strcasecmp(content_type, protocol) != 0) {
        g_set_error(error, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, "%s",
                    _
@@ -271,18 +272,18 @@ g_mime_gpgme_mps_verify(GMimeMultipartSigned * mps, GError ** error)
     filtered_stream = g_mime_stream_filter_new(stream);
 
     /* Note: see rfc2015 or rfc3156, section 5.1 */
-    crlf_filter = g_mime_filter_crlf_new(TRUE, FALSE);
+    crlf_filter = g_mime_filter_unix2dos_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream),
                             crlf_filter);
     g_object_unref(crlf_filter);
 
-    g_mime_object_write_to_stream(content, filtered_stream);
+    g_mime_object_write_to_stream(content, NULL, filtered_stream);
     g_mime_stream_flush(filtered_stream);
     g_object_unref(filtered_stream);
     g_mime_stream_reset(stream);
 
     /* get the signature stream */
-    wrapper = g_mime_part_get_content_object(GMIME_PART(signature));
+    wrapper = g_mime_part_get_content(GMIME_PART(signature));
 
     /* a s/mime signature is always encoded, a pgp signature shouldn't,
      * but there exist implementations which encode it... */
@@ -322,12 +323,12 @@ g_mime_gpgme_mpe_encrypt(GMimeMultipartEncrypted * mpe,
     stream = g_mime_stream_mem_new();
     filtered_stream = g_mime_stream_filter_new(stream);
 
-    crlf_filter = g_mime_filter_crlf_new(TRUE, FALSE);
+    crlf_filter = g_mime_filter_unix2dos_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream),
                             crlf_filter);
     g_object_unref(crlf_filter);
 
-    g_mime_object_write_to_stream(content, filtered_stream);
+    g_mime_object_write_to_stream(content, NULL, filtered_stream);
     g_mime_stream_flush(filtered_stream);
     g_object_unref(filtered_stream);
 
@@ -358,7 +359,7 @@ g_mime_gpgme_mpe_encrypt(GMimeMultipartEncrypted * mpe,
     wrapper =
        g_mime_data_wrapper_new_with_stream(stream,
                                            GMIME_CONTENT_ENCODING_7BIT);
-    g_mime_part_set_content_object(version_part, wrapper);
+    g_mime_part_set_content(version_part, wrapper);
     g_object_unref(wrapper);
     g_object_unref(stream);
 
@@ -370,7 +371,7 @@ g_mime_gpgme_mpe_encrypt(GMimeMultipartEncrypted * mpe,
     wrapper =
        g_mime_data_wrapper_new_with_stream(ciphertext,
                                            GMIME_CONTENT_ENCODING_7BIT);
-    g_mime_part_set_content_object(encrypted_part, wrapper);
+    g_mime_part_set_content(encrypted_part, wrapper);
     g_object_unref(ciphertext);
     g_object_unref(wrapper);
 
@@ -462,7 +463,7 @@ g_mime_gpgme_mpe_decrypt(GMimeMultipartEncrypted * mpe,
                                  GMIME_MULTIPART_ENCRYPTED_VERSION);
 
     /* make sure the protocol matches the version part's content-type */
-    content_type = g_mime_content_type_to_string(version->content_type);
+    content_type = g_mime_content_type_get_mime_type(version->content_type);
     if (g_ascii_strcasecmp(content_type, protocol) != 0) {
        g_set_error(err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, "%s",
                    _
@@ -486,13 +487,13 @@ g_mime_gpgme_mpe_decrypt(GMimeMultipartEncrypted * mpe,
     }
 
     /* get the ciphertext stream */
-    wrapper = g_mime_part_get_content_object(GMIME_PART(encrypted));
+    wrapper = g_mime_part_get_content(GMIME_PART(encrypted));
     ciphertext = g_mime_data_wrapper_get_decoded_stream(wrapper);
     g_mime_stream_reset(ciphertext);
 
     stream = g_mime_stream_mem_new();
     filtered_stream = g_mime_stream_filter_new(stream);
-    crlf_filter = g_mime_filter_crlf_new(FALSE, FALSE);
+    crlf_filter = g_mime_filter_dos2unix_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(filtered_stream),
                             crlf_filter);
     g_object_unref(crlf_filter);
@@ -517,7 +518,7 @@ g_mime_gpgme_mpe_decrypt(GMimeMultipartEncrypted * mpe,
     g_mime_parser_init_with_stream(parser, stream);
     g_object_unref(stream);
 
-    decrypted = g_mime_parser_construct_part(parser);
+    decrypted = g_mime_parser_construct_part(parser, libbalsa_parser_options());
     g_object_unref(parser);
 
     if (!decrypted) {
diff --git a/libbalsa/gmime-part-rfc2440.c b/libbalsa/gmime-part-rfc2440.c
index 22e9de0..44c6003 100644
--- a/libbalsa/gmime-part-rfc2440.c
+++ b/libbalsa/gmime-part-rfc2440.c
@@ -52,7 +52,7 @@ g_mime_part_check_rfc2440(GMimePart * part)
     GMimePartRfc2440Mode retval = GMIME_PART_RFC2440_NONE;
 
     /* try to get the content stream */
-    wrapper = g_mime_part_get_content_object(part);
+    wrapper = g_mime_part_get_content(part);
     g_return_val_if_fail(wrapper, GMIME_PART_RFC2440_NONE);
 
     stream = g_mime_data_wrapper_get_stream(wrapper);
@@ -136,7 +136,7 @@ g_mime_part_rfc2440_sign_encrypt(GMimePart * part, const char *sign_userid,
     g_return_val_if_fail(recipients != NULL || sign_userid != NULL, FALSE);
 
     /* get the raw content */
-    wrapper = g_mime_part_get_content_object(part);
+    wrapper = g_mime_part_get_content(part);
     g_return_val_if_fail(wrapper, FALSE); /* Incomplete part. */
     stream = g_mime_data_wrapper_get_stream(wrapper);
     g_mime_stream_reset(stream);
@@ -210,7 +210,7 @@ g_mime_part_rfc2440_sign_encrypt(GMimePart * part, const char *sign_userid,
                                                 "charset", "US-ASCII");
     }
 
-    g_mime_part_set_content_object(part, wrapper);
+    g_mime_part_set_content(part, wrapper);
     g_object_unref(cipherstream);
     g_object_unref(wrapper);
 
@@ -241,7 +241,7 @@ g_mime_part_rfc2440_verify(GMimePart * part, GError ** err)
     g_return_val_if_fail(GMIME_IS_PART(part), NULL);
 
     /* get the raw content */
-    wrapper = g_mime_part_get_content_object(GMIME_PART(part));
+    wrapper = g_mime_part_get_content(GMIME_PART(part));
     g_return_val_if_fail(wrapper, NULL); /* Incomplete part. */
     stream = g_mime_stream_mem_new();
     g_mime_data_wrapper_write_to_stream(wrapper, stream);
@@ -260,7 +260,7 @@ g_mime_part_rfc2440_verify(GMimePart * part, GError ** err)
        GMimeDataWrapper *wrapper = g_mime_data_wrapper_new();
 
        g_mime_data_wrapper_set_stream(wrapper, plainstream);
-       g_mime_part_set_content_object(GMIME_PART(part), wrapper);
+       g_mime_part_set_content(GMIME_PART(part), wrapper);
        g_object_unref(wrapper);
     }
     g_object_unref(plainstream);
@@ -297,7 +297,7 @@ g_mime_part_rfc2440_decrypt(GMimePart * part, GtkWindow * parent,
     g_return_val_if_fail(GMIME_IS_PART(part), NULL);
 
     /* get the raw content */
-    wrapper = g_mime_part_get_content_object(part);
+    wrapper = g_mime_part_get_content(part);
     g_return_val_if_fail(wrapper, NULL); /* Incomplete part. */
     stream = g_mime_stream_mem_new();
     g_mime_data_wrapper_write_to_stream(wrapper, stream);
@@ -322,7 +322,7 @@ g_mime_part_rfc2440_decrypt(GMimePart * part, GtkWindow * parent,
 
        /* strip crlf off encrypted stuff coming from Winbloze crap */
        filter_stream = g_mime_stream_filter_new(plainstream);
-       filter = g_mime_filter_crlf_new(FALSE, FALSE);
+       filter = g_mime_filter_dos2unix_new(FALSE);
        g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream),
                                 filter);
        g_object_unref(filter);
@@ -330,7 +330,7 @@ g_mime_part_rfc2440_decrypt(GMimePart * part, GtkWindow * parent,
        /* replace the old contents by the decrypted stuff */
        out_stream = g_mime_stream_mem_new();
        g_mime_data_wrapper_set_stream(wrapper, out_stream);
-       g_mime_part_set_content_object(part, wrapper);
+       g_mime_part_set_content(part, wrapper);
        g_mime_stream_reset(filter_stream);
        g_mime_stream_write_to_stream(filter_stream, out_stream);
        g_object_unref(filter_stream);
diff --git a/libbalsa/identity.c b/libbalsa/identity.c
index 04971a3..30343b5 100644
--- a/libbalsa/identity.c
+++ b/libbalsa/identity.c
@@ -2202,7 +2202,7 @@ libbalsa_identity_combo_box(GList       * identities,
         GtkTreeIter iter;
 
         ident = list->data;
-        from = internet_address_to_string(ident->ia, FALSE);
+        from = internet_address_to_string(ident->ia, NULL, FALSE);
        name = g_strconcat("(", ident->identity_name, ")", NULL);
 
         gtk_list_store_append(store, &iter);
diff --git a/libbalsa/imap/imap-handle.c b/libbalsa/imap/imap-handle.c
index 9abc84e..9587a1b 100644
--- a/libbalsa/imap/imap-handle.c
+++ b/libbalsa/imap/imap-handle.c
@@ -3322,7 +3322,17 @@ ir_envelope(struct siobuf *sio, ImapEnvelope *env)
 
   date = imap_get_nstring(sio);
   if(date) {
+#if (GMIME_MAJOR_VERSION >= 3)
+    if (env != NULL) {
+      GDateTime *datetime;
+
+      datetime = g_mime_utils_header_decode_date(date);
+      env->date = g_date_time_to_unix(datetime);
+      g_date_time_unref(datetime);
+    }
+#else                           /* (GMIME_MAJOR_VERSION >= 3) */
     if(env) env->date = g_mime_utils_header_decode_date(date, NULL);
+#endif                          /* (GMIME_MAJOR_VERSION >= 3) */
     g_free(date);
   }
   if( (c=sio_getc(sio)) != ' ') return IMR_PROTOCOL;
diff --git a/libbalsa/libbalsa.c b/libbalsa/libbalsa.c
index 861649c..b5e6177 100644
--- a/libbalsa/libbalsa.c
+++ b/libbalsa/libbalsa.c
@@ -89,16 +89,8 @@ libbalsa_init(LibBalsaInformationFunc information_callback)
 
     libbalsa_real_information_func = information_callback;
 
-    g_mime_init(GMIME_ENABLE_RFC2047_WORKAROUNDS);
-
-    GMIME_TYPE_DATA_WRAPPER;
-    GMIME_TYPE_FILTER;
-    GMIME_TYPE_FILTER_CRLF;
-    GMIME_TYPE_PARSER;
-    GMIME_TYPE_STREAM;
-    GMIME_TYPE_STREAM_BUFFER;
-    GMIME_TYPE_STREAM_MEM;
-    GMIME_TYPE_STREAM_NULL;
+    g_mime_init(); /* Registers all GMime types */
+    libbalsa_parser_options_init();
 
     /* Register our types to avoid possible race conditions. See
        output of "valgrind --tool=helgrind --log-file=balsa.log balsa"
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 1accc40..0e659c2 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -3917,7 +3917,8 @@ lbm_get_mime_msg(LibBalsaMailbox * mailbox, LibBalsaMessage * msg)
                                                     TRUE);
         parser = g_mime_parser_new_with_stream(stream);
         g_object_unref(stream);
-        mime_msg = g_mime_parser_construct_message(parser);
+        mime_msg = g_mime_parser_construct_message(parser, libbalsa_parser_options());
+
         g_object_unref(parser);
     }
     libbalsa_mailbox_release_message(mailbox, msg);
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 1c21b2b..957ce88 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -1927,11 +1927,11 @@ libbalsa_mailbox_imap_sync(LibBalsaMailbox * mailbox, gboolean expunge)
 static InternetAddress*
 imap_address_to_gmime_mailbox(ImapAddress *addr)
 {
-    gchar *tmp = g_mime_utils_header_decode_text(addr->addr_spec);
+    gchar *tmp = g_mime_utils_header_decode_text(libbalsa_parser_options(), addr->addr_spec);
     InternetAddress *address = internet_address_mailbox_new(NULL, tmp);
     g_free(tmp);
     if (addr->name) {
-        tmp = g_mime_utils_header_decode_text(addr->name);
+        tmp = g_mime_utils_header_decode_text(libbalsa_parser_options(), addr->name);
         internet_address_set_name(address, tmp);
         g_free(tmp);
     }
@@ -1958,7 +1958,7 @@ internet_address_new_list_from_imap_address(ImapAddress *list,
                 /* Group head */
                 ImapAddress *tail = NULL;
                 InternetAddressList *l;
-                gchar *tmp = g_mime_utils_header_decode_text(list->name);
+                gchar *tmp = g_mime_utils_header_decode_text(libbalsa_parser_options(), list->name);
                 addr = internet_address_group_new(tmp);
                 g_free(tmp);
                 l = internet_address_new_list_from_imap_address(list->next,
@@ -2008,7 +2008,7 @@ lb_set_headers(LibBalsaMessageHeaders *headers, ImapEnvelope *  envelope,
 
     if(is_embedded) {
         headers->subject =
-            g_mime_utils_header_decode_text(envelope->subject);
+            g_mime_utils_header_decode_text(libbalsa_parser_options(), envelope->subject);
         libbalsa_utf8_sanitize(&headers->subject, TRUE, NULL);
     }
 }
@@ -2134,7 +2134,7 @@ lbm_imap_construct_body(LibBalsaMessageBody *lbbody, ImapBody *imap_body)
     if(!str) str = imap_body_get_param(imap_body, "name");
     if(str) {
         lbbody->filename  =
-           g_mime_utils_header_decode_text(str);
+           g_mime_utils_header_decode_text(libbalsa_parser_options(), str);
         libbalsa_utf8_sanitize(&lbbody->filename, TRUE, NULL);
     }
     lbbody->charset   = g_strdup(imap_body_get_param(imap_body, "charset"));
@@ -2183,15 +2183,15 @@ get_struct_from_cache(LibBalsaMailbox *mailbox, LibBalsaMessage *message,
         fstream = g_mime_stream_filter_new(stream);
         g_object_unref(stream);
 
-        filter = g_mime_filter_crlf_new(FALSE, FALSE);
+        filter = g_mime_filter_dos2unix_new(FALSE);
         g_mime_stream_filter_add(GMIME_STREAM_FILTER(fstream), filter);
         g_object_unref(filter);
 
         mime_parser = g_mime_parser_new_with_stream(fstream);
         g_object_unref(fstream);
 
-        g_mime_parser_set_scan_from(mime_parser, FALSE);
-        message->mime_msg = g_mime_parser_construct_message(mime_parser);
+        g_mime_parser_set_format(mime_parser, GMIME_FORMAT_MESSAGE);
+        message->mime_msg = g_mime_parser_construct_message(mime_parser, libbalsa_parser_options());
         g_object_unref(mime_parser);
     }
     
@@ -2552,7 +2552,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
     {
         GMimeParser *parser =  
             g_mime_parser_new_with_stream (partstream);
-        part->mime_part = g_mime_parser_construct_part (parser);
+        part->mime_part = g_mime_parser_construct_part(parser, NULL);
         g_object_unref (parser);
     }
     g_object_unref (partstream);
@@ -2576,7 +2576,7 @@ lbm_imap_get_msg_part(LibBalsaMessage * msg, LibBalsaMessageBody * part,
 
     if (!part->mime_part) {
         GMimeContentType *type =
-            g_mime_content_type_new_from_string(part->content_type);
+            g_mime_content_type_parse(libbalsa_parser_options(), part->content_type);
         if (g_mime_content_type_is_type(type, "multipart", "*")) {
             if (g_mime_content_type_is_type(type, "multipart", "signed"))
                 part->mime_part =
@@ -2857,9 +2857,7 @@ multi_append_cb(char * buf, size_t buflen,
 
        tmpstream = g_mime_stream_filter_new(stream);
 
-       crlffilter =
-           g_mime_filter_crlf_new(TRUE,
-                                  FALSE);
+        crlffilter = g_mime_filter_dos2unix_new(TRUE);
        g_mime_stream_filter_add(GMIME_STREAM_FILTER(tmpstream), crlffilter);
        g_object_unref(crlffilter);
 
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index a8fd168..1894087 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -879,7 +879,7 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
             if (message->headers->to_list) {
                 gchar *str =
                     internet_address_list_to_string(message->headers->
-                                                    to_list, FALSE);
+                                                    to_list, NULL, FALSE);
                 match =
                     libbalsa_utf8_strstr(str, cond->match.string.string);
                 g_free(str);
@@ -906,7 +906,7 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
             if (message->headers->cc_list) {
                 gchar *str =
                     internet_address_list_to_string(message->headers->
-                                                    cc_list, FALSE);
+                                                    cc_list, NULL, FALSE);
                 match =
                     libbalsa_utf8_strstr(str, cond->match.string.string);
                 g_free(str);
@@ -1032,7 +1032,7 @@ libbalsa_mailbox_local_cache_message(LibBalsaMailboxLocal * local,
     info->sender = NULL;
     if (message->headers->from)
         info->sender =
-            internet_address_list_to_string(message->headers->from, FALSE);
+            internet_address_list_to_string(message->headers->from, NULL, FALSE);
     if (!info->sender)
         info->sender = g_strdup("");
 }
@@ -2103,8 +2103,8 @@ libbalsa_mailbox_local_get_mime_message(LibBalsaMailbox * mailbox,
        return NULL;
 
     mime_parser = g_mime_parser_new_with_stream(mime_stream);
-    g_mime_parser_set_scan_from(mime_parser, FALSE);
-    mime_message = g_mime_parser_construct_message(mime_parser);
+    g_mime_parser_set_format(mime_parser, GMIME_FORMAT_MESSAGE);
+    mime_message = g_mime_parser_construct_message(mime_parser, libbalsa_parser_options());
 
     g_object_unref(mime_parser);
     g_object_unref(mime_stream);
diff --git a/libbalsa/mailbox_maildir.c b/libbalsa/mailbox_maildir.c
index 78e7f43..db3358c 100644
--- a/libbalsa/mailbox_maildir.c
+++ b/libbalsa/mailbox_maildir.c
@@ -904,9 +904,7 @@ lbm_maildir_add_message(LibBalsaMailboxLocal * local,
     out_stream = g_mime_stream_fs_new(fd);
 
     in_stream = g_mime_stream_filter_new(stream);
-    crlffilter =
-        g_mime_filter_crlf_new(FALSE,
-                               FALSE);
+    crlffilter = g_mime_filter_dos2unix_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(in_stream), crlffilter);
     g_object_unref(crlffilter);
  
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index ff5ecbb..92e258f 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -470,7 +470,7 @@ parse_mailbox(LibBalsaMailboxMbox * mbox)
     unsigned msgno = mbox->msgno_2_msg_info->len;
 
     gmime_parser = g_mime_parser_new_with_stream(mbox->gmime_stream);
-    g_mime_parser_set_scan_from(gmime_parser, TRUE);
+    g_mime_parser_set_format(gmime_parser, GMIME_FORMAT_MBOX);
     g_mime_parser_set_respect_content_length(gmime_parser, TRUE);
     g_mime_parser_set_header_regex(gmime_parser,
                                    "^Status|^X-Status|^MIME-Version",
@@ -486,7 +486,7 @@ parse_mailbox(LibBalsaMailboxMbox * mbox)
         off_t offset;
 
         msg_info.status = msg_info.x_status = msg_info.mime_version = -1;
-        mime_message   = g_mime_parser_construct_message(gmime_parser);
+        mime_message   = g_mime_parser_construct_message(gmime_parser, libbalsa_parser_options());
         if (mime_message == NULL) {
             /* Skip to the next message, if any */
             GMimeStream *mbox_stream;
@@ -506,10 +506,10 @@ parse_mailbox(LibBalsaMailboxMbox * mbox)
             g_mime_parser_init_with_stream(gmime_parser, mbox_stream);
             continue;
         }
-        msg_info.start = g_mime_parser_get_from_offset(gmime_parser);
+        msg_info.start = g_mime_parser_get_mbox_marker_offset(gmime_parser);
         msg_info.end   = g_mime_parser_tell(gmime_parser);
         if (msg_info.end <= msg_info.start
-            || !(from = g_mime_parser_get_from(gmime_parser))) {
+            || !(from = g_mime_parser_get_mbox_marker(gmime_parser))) {
            g_object_unref(mime_message);
             continue;
        }
@@ -1160,7 +1160,7 @@ lbm_mbox_get_mime_message(LibBalsaMailbox * mailbox,
     libbalsa_mime_stream_shared_lock(stream);
     parser = g_mime_parser_new_with_stream(stream);
 
-    mime_message = g_mime_parser_construct_message(parser);
+    mime_message = g_mime_parser_construct_message(parser, libbalsa_parser_options());
     g_object_unref(parser);
     libbalsa_mime_stream_shared_unlock(stream);
     g_object_unref(stream);
@@ -1680,7 +1680,7 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
        return FALSE;
     }
     gmime_parser = g_mime_parser_new_with_stream(mbox_stream);
-    g_mime_parser_set_scan_from(gmime_parser, TRUE);
+    g_mime_parser_set_format(gmime_parser, GMIME_FORMAT_MBOX);
     g_mime_parser_set_respect_content_length(gmime_parser, TRUE);
     g_mime_parser_set_header_regex(gmime_parser,
                                    "^Status|^X-Status|^MIME-Version",
@@ -1710,11 +1710,11 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
            msg_info->local_info.message->msgno = j + 1;
 
        msg_info->status = msg_info->x_status = msg_info->mime_version = -1;
-       mime_msg = g_mime_parser_construct_message(gmime_parser);
+       mime_msg = g_mime_parser_construct_message(gmime_parser, libbalsa_parser_options());
         if (!mime_msg)
             /* Try to recover */
             continue;
-        msg_info->start = g_mime_parser_get_from_offset(gmime_parser);
+        msg_info->start = g_mime_parser_get_mbox_marker_offset(gmime_parser);
 
        /* Make sure we don't have offsets for any encapsulated headers. */
        if (!g_mime_object_get_header(GMIME_OBJECT(mime_msg), "Status"))
@@ -1724,7 +1724,7 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
        if (!g_mime_object_get_header(GMIME_OBJECT(mime_msg), "MIME-Version"))
            msg_info->mime_version = -1;
 
-       from = g_mime_parser_get_from(gmime_parser);
+       from = g_mime_parser_get_mbox_marker(gmime_parser);
         if (!from) {
             /* Try to recover */
             g_object_unref(mime_msg);
@@ -1844,10 +1844,10 @@ static void update_message_status_headers(GMimeMessage *message,
     /* Create headers with spaces in place of flags, if necessary, so we
      * can later update them in place. */
     lbm_mbox_status_hdr(flags, 2, new_header);
-    g_mime_object_set_header(GMIME_OBJECT(message), "Status", new_header->str);
+    g_mime_object_set_header(GMIME_OBJECT(message), "Status", new_header->str, NULL);
     g_string_truncate(new_header, 0);
     lbm_mbox_x_status_hdr(flags, 3, new_header);
-    g_mime_object_set_header(GMIME_OBJECT(message), "X-Status", new_header->str);
+    g_mime_object_set_header(GMIME_OBJECT(message), "X-Status", new_header->str, NULL);
     g_string_free(new_header, TRUE);
 }
 
@@ -1859,7 +1859,7 @@ lbm_mbox_armored_object(GMimeStream * stream)
     GMimeObject *object;
 
     parser = g_mime_parser_new_with_stream(stream);
-    object = GMIME_OBJECT(g_mime_parser_construct_message(parser));
+    object = GMIME_OBJECT(g_mime_parser_construct_message(parser, libbalsa_parser_options()));
     g_object_unref(parser);
     g_mime_object_encode(object, GMIME_ENCODING_CONSTRAINT_7BIT);
 
@@ -1874,8 +1874,7 @@ lbm_mbox_armored_stream(GMimeStream * stream)
     
     fstream = g_mime_stream_filter_new(stream);
 
-    filter = g_mime_filter_crlf_new(FALSE,
-                                   FALSE);
+    filter = g_mime_filter_dos2unix_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(fstream), filter);
     g_object_unref(filter);
 
@@ -1914,7 +1913,7 @@ lbm_mbox_add_message(LibBalsaMailboxLocal * local,
     ctime_r(&(message->headers->date), date_string);
 
     sender = message->headers->from ?
-       internet_address_list_to_string(message->headers->from, FALSE) :
+       internet_address_list_to_string(message->headers->from, NULL, FALSE) :
        g_strdup("none");
 
     g_object_unref(message);
@@ -1980,7 +1979,7 @@ lbm_mbox_add_message(LibBalsaMailboxLocal * local,
         retval = lbm_mbox_newline(dest);
     if (retval < 0
         || g_mime_stream_write_string(dest, from) < (gint) strlen(from)
-       || g_mime_object_write_to_stream(armored_object, armored_dest) < 0) {
+       || g_mime_object_write_to_stream(armored_object, NULL, armored_dest) < 0) {
         g_set_error(err, LIBBALSA_MAILBOX_ERROR,
                     LIBBALSA_MAILBOX_APPEND_ERROR, _("Data copy error"));
        retval = -1;
diff --git a/libbalsa/mailbox_mh.c b/libbalsa/mailbox_mh.c
index 9fe73e3..3e680a1 100644
--- a/libbalsa/mailbox_mh.c
+++ b/libbalsa/mailbox_mh.c
@@ -1086,8 +1086,7 @@ lbm_mh_add_message(LibBalsaMailboxLocal * local,
     }
     out_stream = g_mime_stream_fs_new(fd);
 
-    crlffilter = g_mime_filter_crlf_new(FALSE,
-                                        FALSE);
+    crlffilter = g_mime_filter_dos2unix_new(FALSE);
     in_stream = g_mime_stream_filter_new(stream);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(in_stream), crlffilter);
     g_object_unref(crlffilter);
diff --git a/libbalsa/message.c b/libbalsa/message.c
index 85731e7..5fe876f 100644
--- a/libbalsa/message.c
+++ b/libbalsa/message.c
@@ -473,7 +473,8 @@ GList *
 libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
 {
     GMimeHeaderList *hdrlist;
-    GMimeHeaderIter iter;
+    gint count;
+    gint i;
     GList *res = NULL;
     const char *value;
 
@@ -517,16 +518,18 @@ libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
             g_list_prepend(res,
                            libbalsa_create_hdr_pair
                            ("In-Reply-To",
-                            g_mime_utils_header_decode_text(value)));
+                            g_mime_utils_header_decode_text(libbalsa_parser_options(), value)));
     }
 
     hdrlist = g_mime_object_get_header_list (GMIME_OBJECT(message));
-    if (g_mime_header_list_get_iter (hdrlist, &iter)) {
-       do {
-           prepend_header_misc (g_mime_header_iter_get_name (&iter),
-                                g_mime_header_iter_get_value (&iter),
-                                &res);
-       } while (g_mime_header_iter_next (&iter));
+    count = g_mime_header_list_get_count(hdrlist);
+    for (i = 0; i < count; i++) {
+        GMimeHeader *header;
+
+        header = g_mime_header_list_get_header_at(hdrlist, i);
+        prepend_header_misc(g_mime_header_get_name(header),
+                            g_mime_header_get_value(header),
+                            &res);
     }
     
     return g_list_reverse(res);
@@ -880,36 +883,43 @@ libbalsa_message_get_no(LibBalsaMessage* msg)
 
 /* Populate headers from mime_msg, but only the members that are needed
  * all the time. */
+
 static InternetAddressList *
-lb_message_recipients(GMimeMessage * message, GMimeRecipientType type)
+lb_message_address_list_ref(InternetAddressList * list)
 {
-    const InternetAddressList *list;
-    InternetAddressList *copy = NULL;
-
-    if ((list = g_mime_message_get_recipients (message, type))) {
-       copy = internet_address_list_new ();
-       internet_address_list_append (copy, (InternetAddressList *) list);
+    if (list != NULL && internet_address_list_length(list) > 0) {
+        return g_object_ref(list);
     }
-    
-    return copy;
+
+    return NULL;
+}
+
+static InternetAddressList *
+lb_message_recipients(GMimeMessage   * message,
+                      GMimeAddressType type)
+{
+    return lb_message_address_list_ref(g_mime_message_get_addresses(message, type));
 }
 
 static void
 lb_message_headers_basic_from_gmime(LibBalsaMessageHeaders *headers,
                                    GMimeMessage *mime_msg)
 {
-    g_return_if_fail(headers);
-    g_return_if_fail(mime_msg != NULL);
+    if (headers->from == NULL) {
+        headers->from =
+            lb_message_address_list_ref(g_mime_message_get_from(mime_msg));
+    }
 
-    if (!headers->from)
-        headers->from = internet_address_list_parse_string(mime_msg->from);
+    if (headers->date == 0) {
+        GDateTime *datetime;
 
-    if (!headers->date)
-       g_mime_message_get_date(mime_msg, &headers->date, NULL);
+        datetime = g_mime_message_get_date(mime_msg);
+        headers->date = g_date_time_to_unix(datetime);
+    }
 
-    if (!headers->to_list)
+    if (headers->to_list == NULL)
         headers->to_list =
-            lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_TO);
+            lb_message_recipients(mime_msg, GMIME_ADDRESS_TYPE_TO);
 
     if (!headers->content_type) {
        /* If we could:
@@ -921,8 +931,8 @@ lb_message_headers_basic_from_gmime(LibBalsaMessageHeaders *headers,
        gchar *str;
        g_return_if_fail(headers->content_type == NULL);
        content_type = g_mime_object_get_content_type(mime_msg->mime_part);
-       str = g_mime_content_type_to_string(content_type);
-       headers->content_type = g_mime_content_type_new_from_string(str);
+       str = g_mime_content_type_get_mime_type(content_type);
+       headers->content_type = g_mime_content_type_parse(libbalsa_parser_options(), str);
        g_free(str);
     }
 }
@@ -936,23 +946,29 @@ lb_message_headers_extra_from_gmime(LibBalsaMessageHeaders *headers,
     g_return_if_fail(headers);
     g_return_if_fail(mime_msg != NULL);
 
-    if (!headers->reply_to)
+    if (headers->reply_to == NULL) {
         headers->reply_to =
-           internet_address_list_parse_string(mime_msg->reply_to);
+            lb_message_address_list_ref(g_mime_message_get_reply_to(mime_msg));
+    }
+
+    if (headers->dispnotify_to == NULL) {
+        const gchar *value =
+            g_mime_object_get_header(GMIME_OBJECT(mime_msg), "Disposition-Notification-To");
 
-    if (!headers->dispnotify_to)
-        headers->dispnotify_to =
-            internet_address_list_parse_string(g_mime_object_get_header
-                                          (GMIME_OBJECT(mime_msg),
-                                           "Disposition-Notification-To"));
+        if (value != NULL)
+            headers->dispnotify_to =
+                internet_address_list_parse(libbalsa_parser_options(), value);
+    }
 
-    if (!headers->cc_list)
+    if (headers->cc_list == NULL) {
         headers->cc_list =
-            lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_CC);
+            lb_message_recipients(mime_msg, GMIME_ADDRESS_TYPE_CC);
+    }
 
-    if (!headers->bcc_list)
+    if (headers->bcc_list == NULL) {
         headers->bcc_list =
-            lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_BCC);
+            lb_message_recipients(mime_msg, GMIME_ADDRESS_TYPE_BCC);
+    }
 
     /* Get fcc from message */
     if (!headers->fcc_url)
@@ -1043,15 +1059,20 @@ libbalsa_message_refs_for_threading(LibBalsaMessage * message)
 static GList *
 references_decode(const gchar * str)
 {
-    GMimeReferences *references, *reference;
+    GMimeReferences *references;
     GList *list = NULL;
+    gint length;
+    gint i;
 
-    reference = references = g_mime_references_decode(str);
-    while (reference) {
-       list = g_list_prepend(list, g_strdup(reference->msgid));
-       reference = reference->next;
+    references = g_mime_references_parse(NULL, str);
+    length = g_mime_references_length(references);
+    for (i = 0; i < length; i++) {
+        const gchar *message_id;
+
+        message_id = g_mime_references_get_message_id(references, i);
+        list = g_list_prepend(list, g_strdup(message_id));
     }
-    g_mime_references_clear(&references);
+    g_mime_references_free(references);
 
     return g_list_reverse(list);
 }
@@ -1105,7 +1126,7 @@ lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
          * appropriate GMime decoder. */
         gchar *tmp = g_strdup(value);
         libbalsa_utf8_sanitize(&tmp, TRUE, NULL);
-        val = g_mime_utils_header_encode_text(tmp);
+        val = g_mime_utils_header_encode_text(NULL, tmp, NULL);
         g_free(tmp);
 #ifdef DEBUG
         g_print("%s: non-ascii “%s” header “%s” encoded as “%s”\n",
@@ -1125,15 +1146,21 @@ lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
 #endif
     } else
     if (g_ascii_strcasecmp(name, "Date") == 0) {
-       message->headers->date = g_mime_utils_header_decode_date(value, NULL);
+        GDateTime *datetime;
+
+        datetime = g_mime_utils_header_decode_date(value);
+       message->headers->date = g_date_time_to_unix(datetime);
+        g_date_time_unref(datetime);
     } else
     if (message->headers->from == NULL &&
        g_ascii_strcasecmp(name, "From") == 0) {
-        message->headers->from = internet_address_list_parse_string(value);
+        message->headers->from =
+            internet_address_list_parse(libbalsa_parser_options(), value);
     } else
     if (message->headers->to_list == NULL &&
         g_ascii_strcasecmp(name, "To") == 0) {
-       message->headers->to_list = internet_address_list_parse_string(value);
+        message->headers->to_list =
+            internet_address_list_parse(libbalsa_parser_options(), value);
     } else
     if (g_ascii_strcasecmp(name, "In-Reply-To") == 0) {
        libbalsa_message_set_in_reply_to_from_string(message, value);
@@ -1148,12 +1175,12 @@ lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
     if (message->headers->content_type == NULL &&
        g_ascii_strcasecmp(name, "Content-Type") == 0) {
        message->headers->content_type =
-           g_mime_content_type_new_from_string(value);
+           g_mime_content_type_parse(libbalsa_parser_options(), value);
     } else
     if (message->headers->dispnotify_to == NULL &&
        g_ascii_strcasecmp(name, "Disposition-Notification-To") == 0) {
        message->headers->dispnotify_to =
-           internet_address_list_parse_string(value);
+            internet_address_list_parse(libbalsa_parser_options(), value);
     } else
 #ifdef MESSAGE_COPY_CONTENT
     if (g_ascii_strcasecmp(name, "Content-Length") == 0) {
@@ -1223,9 +1250,7 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
     gmime_stream_filter =
         g_mime_stream_filter_new(gmime_stream);
 
-    gmime_filter_crlf =
-        g_mime_filter_crlf_new(FALSE,
-                               FALSE);
+    gmime_filter_crlf = g_mime_filter_dos2unix_new(FALSE);
     g_mime_stream_filter_add(GMIME_STREAM_FILTER(gmime_stream_filter),
                                                  gmime_filter_crlf);
     g_object_unref(gmime_filter_crlf);
@@ -1303,7 +1328,7 @@ libbalsa_message_stream(LibBalsaMessage * message)
                                                    message->msgno, FALSE);
 
     mime_stream = g_mime_stream_mem_new();
-    g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg),
+    g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), NULL,
                                   mime_stream);
     g_mime_stream_reset(mime_stream);
 
@@ -1355,7 +1380,7 @@ libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
 {
     if (header) {
         gchar *subject =
-            g_mime_utils_header_decode_text(header);
+            g_mime_utils_header_decode_text(libbalsa_parser_options(), header);
         libbalsa_message_set_subject(message, subject);
         g_free(subject);
     }
diff --git a/libbalsa/misc.c b/libbalsa/misc.c
index c05da73..6aa591e 100644
--- a/libbalsa/misc.c
+++ b/libbalsa/misc.c
@@ -290,7 +290,7 @@ libbalsa_set_fallback_codeset(LibBalsaCodeset codeset)
         NULL
     };
 
-    g_mime_set_user_charsets(charsets);
+    g_mime_parser_options_set_fallback_charsets(libbalsa_parser_options(), charsets);
 
     sanitize_fallback_codeset = codeset;
     return ret;
@@ -1224,3 +1224,19 @@ libbalsa_font_string_to_css(const gchar * font_string,
     return g_string_free(string, FALSE);
 #endif                          /* !GTK_CHECK_VERSION(3, 22,0) */
 }
+
+static GMimeParserOptions *parser_options;
+
+void
+libbalsa_parser_options_init(void)
+{
+    parser_options = g_mime_parser_options_new();
+    g_mime_parser_options_set_rfc2047_compliance_mode(parser_options,
+                                                      GMIME_RFC_COMPLIANCE_LOOSE);
+}
+
+GMimeParserOptions *
+libbalsa_parser_options(void)
+{
+    return parser_options;
+}
diff --git a/libbalsa/misc.h b/libbalsa/misc.h
index b2639e6..0e7ae23 100644
--- a/libbalsa/misc.h
+++ b/libbalsa/misc.h
@@ -158,4 +158,7 @@ gchar * libbalsa_text_to_html(const gchar * title, const gchar * body, const gch
 GString * libbalsa_html_encode_hyperlinks(GString * paragraph);
 gchar *libbalsa_font_string_to_css(const gchar * font_string, const gchar * name);
 
+void libbalsa_parser_options_init(void);
+GMimeParserOptions *libbalsa_parser_options(void);
+
 #endif                         /* __LIBBALSA_MISC_H__ */
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index 59527dc..afcf084 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -67,7 +67,7 @@ body_is_type(LibBalsaMessageBody * body, const gchar * type,
        retval = g_mime_content_type_is_type(content_type, type, sub_type);
     } else {
        GMimeContentType *content_type =
-           g_mime_content_type_new_from_string(body->content_type);
+           g_mime_content_type_parse(libbalsa_parser_options(), body->content_type);
        retval = g_mime_content_type_is_type(content_type, type, sub_type);
        g_object_unref(content_type);
     }
diff --git a/libbalsa/send.c b/libbalsa/send.c
index fc447d3..39c7f80 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -266,7 +266,7 @@ lbs_set_content(GMimePart *mime_part,
                                             GMIME_CONTENT_ENCODING_DEFAULT);
     g_object_unref(stream);
 
-    g_mime_part_set_content_object(mime_part, wrapper);
+    g_mime_part_set_content(mime_part, wrapper);
     g_object_unref(wrapper);
 }
 
@@ -344,7 +344,7 @@ add_mime_body_plain(LibBalsaMessageBody * body, gboolean flow, gboolean postpone
                                                 GMIME_CONTENT_ENCODING_DEFAULT);
         g_object_unref(stream);
 
-        g_mime_part_set_content_object(mime_part, wrapper);
+        g_mime_part_set_content(mime_part, wrapper);
         g_object_unref(G_OBJECT(wrapper));
     } else {
         lbs_set_content(mime_part, body->buffer);
@@ -445,12 +445,12 @@ lbs_message_queue_real(LibBalsaMessage    *message,
 
     if (fccbox != NULL) {
         g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-Fcc",
-                                 fccbox->url);
+                                 fccbox->url, NULL);
     }
     g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-DSN",
-                             message->request_dsn ? "1" : "0");
+                             message->request_dsn ? "1" : "0", NULL);
     g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-SmtpServer",
-                             libbalsa_smtp_server_get_name(smtp_server));
+                             libbalsa_smtp_server_get_name(smtp_server), NULL);
 
     big_message = libbalsa_smtp_server_get_big_message(smtp_server);
     if (big_message > 0) {
@@ -1117,14 +1117,14 @@ message_add_references(const LibBalsaMessage *message,
             }
             g_string_append_printf(str, "<%s>", (gchar *) list->data);
         } while ((list = list->next) != NULL);
-        g_mime_object_set_header(GMIME_OBJECT(msg), "References", str->str);
+        g_mime_object_set_header(GMIME_OBJECT(msg), "References", str->str, NULL);
         g_string_free(str, TRUE);
     }
 
     if (message->in_reply_to != NULL) {
         /* There's no specific header function for In-Reply-To */
         g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To",
-                                 message->in_reply_to->data);
+                                 message->in_reply_to->data, NULL);
     }
 }
 
@@ -1174,24 +1174,6 @@ parse_content_type(const char *content_type)
 }
 
 
-/* get_tz_offset() returns tz offset in RFC 5322 format ([-]hhmm) */
-static gint
-get_tz_offset(time_t t)
-{
-    GTimeZone *local_tz;
-    gint interval;
-    gint32 offset;
-    gint hours;
-
-    local_tz = g_time_zone_new_local();
-    interval = g_time_zone_find_interval(local_tz, G_TIME_TYPE_UNIVERSAL, t);
-    offset = g_time_zone_get_offset(local_tz, interval);
-    g_time_zone_unref(local_tz);
-    hours = offset / 3600;
-    return (hours * 100) + ((offset - (hours * 3600)) / 60);
-}
-
-
 static LibBalsaMsgCreateResult
 libbalsa_message_create_mime_message(LibBalsaMessage *message,
                                      gboolean         flow,
@@ -1230,7 +1212,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
             if (body->attach_mode == LIBBALSA_ATTACH_AS_EXTBODY) {
                 GMimeContentType *content_type =
                     g_mime_content_type_new("message", "external-body");
-                mime_part = g_mime_object_new_type("message", "external-body");
+                mime_part = g_mime_object_new_type(libbalsa_parser_options(), "message", "external-body");
                 g_mime_object_set_content_type(mime_part, content_type);
                 g_mime_part_set_content_encoding(GMIME_PART(mime_part),
                                                  GMIME_CONTENT_ENCODING_7BIT);
@@ -1273,7 +1255,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
                 }
                 parser = g_mime_parser_new_with_stream(stream);
                 g_object_unref(stream);
-                mime_message = g_mime_parser_construct_message(parser);
+                mime_message = g_mime_parser_construct_message(parser, libbalsa_parser_options());
                 g_object_unref(parser);
                 mime_part =
                     GMIME_OBJECT(g_mime_message_part_new_with_message
@@ -1341,8 +1323,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
                 content = g_mime_data_wrapper_new_with_stream(stream,
                                                               GMIME_CONTENT_ENCODING_DEFAULT);
                 g_object_unref(stream);
-                g_mime_part_set_content_object(GMIME_PART(mime_part),
-                                               content);
+                g_mime_part_set_content(GMIME_PART(mime_part), content);
                 g_object_unref(content);
             }
             g_strfreev(mime_type);
@@ -1410,56 +1391,58 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
     message_add_references(message, mime_message);
 
     if (message->headers->from != NULL) {
-        tmp = internet_address_list_to_string(message->headers->from,
-                                              TRUE);
-        if (tmp != NULL) {
-            g_mime_message_set_sender(mime_message, tmp);
-            g_free(tmp);
-        }
+        InternetAddressList *list;
+
+        list = g_mime_message_get_from(mime_message);
+        internet_address_list_append(list, message->headers->from);
     }
     if (message->headers->reply_to != NULL) {
-        tmp = internet_address_list_to_string(message->headers->reply_to,
-                                              TRUE);
-        if (tmp != NULL) {
-            g_mime_message_set_reply_to(mime_message, tmp);
-            g_free(tmp);
-        }
+        InternetAddressList *list;
+
+        list = g_mime_message_get_reply_to(mime_message);
+        internet_address_list_append(list, message->headers->reply_to);
     }
 
     if (LIBBALSA_MESSAGE_GET_SUBJECT(message)) {
         g_mime_message_set_subject(mime_message,
-                                   LIBBALSA_MESSAGE_GET_SUBJECT(message));
+                                   LIBBALSA_MESSAGE_GET_SUBJECT(message), NULL);
     }
 
-    g_mime_message_set_date(mime_message, message->headers->date,
-                            get_tz_offset(message->headers->date));
+    {
+        GDateTime *datetime;
+
+        datetime = g_date_time_new_from_unix_local(message->headers->date);
+        g_mime_message_set_date(mime_message, datetime);
+        g_date_time_unref(datetime);
+    }
 
     if ((ia_list = message->headers->to_list)) {
         InternetAddressList *recipients =
-            g_mime_message_get_recipients(mime_message,
-                                          GMIME_RECIPIENT_TYPE_TO);
+            g_mime_message_get_addresses(mime_message,
+                                          GMIME_ADDRESS_TYPE_TO);
         internet_address_list_append(recipients, ia_list);
     }
 
     if ((ia_list = message->headers->cc_list)) {
         InternetAddressList *recipients =
-            g_mime_message_get_recipients(mime_message,
-                                          GMIME_RECIPIENT_TYPE_CC);
+            g_mime_message_get_addresses(mime_message,
+                                          GMIME_ADDRESS_TYPE_CC);
         internet_address_list_append(recipients, ia_list);
     }
 
     if ((ia_list = message->headers->bcc_list)) {
         InternetAddressList *recipients =
-            g_mime_message_get_recipients(mime_message,
-                                          GMIME_RECIPIENT_TYPE_BCC);
+            g_mime_message_get_addresses(mime_message,
+                                          GMIME_ADDRESS_TYPE_BCC);
         internet_address_list_append(recipients, ia_list);
     }
 
     if (message->headers->dispnotify_to != NULL) {
-        tmp = internet_address_list_to_string(message->headers->dispnotify_to, TRUE);
+        tmp = internet_address_list_to_string(message->headers->dispnotify_to,
+                                              NULL, TRUE);
         if (tmp != NULL) {
             g_mime_object_append_header(GMIME_OBJECT(mime_message),
-                                        "Disposition-Notification-To", tmp);
+                                        "Disposition-Notification-To", tmp, NULL);
             g_free(tmp);
         }
     }
@@ -1467,14 +1450,14 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
     for (list = message->headers->user_hdrs; list; list = list->next) {
         gchar **pair = list->data;
         g_strchug(pair[1]);
-        g_mime_object_append_header(GMIME_OBJECT(mime_message), pair[0], pair[1]);
+        g_mime_object_append_header(GMIME_OBJECT(mime_message), pair[0], pair[1], NULL);
 #if DEBUG_USER_HEADERS
         printf("adding header '%s:%s'\n", pair[0], pair[1]);
 #endif
     }
 
     tmp = g_strdup_printf("Balsa %s", VERSION);
-    g_mime_object_append_header(GMIME_OBJECT(mime_message), "X-Mailer", tmp);
+    g_mime_object_append_header(GMIME_OBJECT(mime_message), "X-Mailer", tmp, NULL);
     g_free(tmp);
 
     message->mime_msg = mime_message;
@@ -1509,7 +1492,7 @@ libbalsa_message_postpone(LibBalsaMessage *message,
 
         for (i = 0; extra_headers[i] && extra_headers[i + 1]; i += 2) {
             g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), extra_headers[i],
-                                     extra_headers[i + 1]);
+                                     extra_headers[i + 1], NULL);
         }
     }
 
@@ -1633,7 +1616,7 @@ libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage  *message,
     if (message->mime_msg != NULL) {
         msg_stream = g_mime_stream_mem_new();
         libbalsa_mailbox_lock_store(message->mailbox);
-        g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), msg_stream);
+        g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), NULL, msg_stream);
         libbalsa_mailbox_unlock_store(message->mailbox);
         g_mime_stream_reset(msg_stream);
     } else {
@@ -1652,7 +1635,7 @@ libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage  *message,
         g_object_unref(G_OBJECT(filter));
 
         /* add CRLF, encode dot */
-        filter = g_mime_filter_crlf_new(TRUE, TRUE);
+        filter = g_mime_filter_unix2dos_new(TRUE);
         g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
         g_object_unref(G_OBJECT(filter));
 
diff --git a/src/ab-main.c b/src/ab-main.c
index 6d0d2ef..a0c7797 100644
--- a/src/ab-main.c
+++ b/src/ab-main.c
@@ -1089,7 +1089,8 @@ main(int argc, char *argv[])
 
     bab_init();
     libbalsa_real_information_func = (LibBalsaInformationFunc)information_real;
-    g_mime_init(GMIME_ENABLE_RFC2047_WORKAROUNDS);
+    g_mime_init();
+    libbalsa_parser_options_init();
 
     /* load address book data */
     libbalsa_conf_push_group("Globals");
diff --git a/src/balsa-message.c b/src/balsa-message.c
index 31b24aa..2168a0f 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -1105,9 +1105,9 @@ balsa_message_sender_to_gchar(InternetAddressList * list, gint which)
     if (!list)
        return g_strdup(_("(No sender)"));
     if (which < 0)
-       return internet_address_list_to_string(list, FALSE);
+       return internet_address_list_to_string(list, NULL, FALSE);
     ia = internet_address_list_get_address (list, which);
-    return internet_address_to_string(ia, FALSE);
+    return internet_address_to_string(ia, NULL, FALSE);
 }
 
 static void
@@ -2155,7 +2155,7 @@ add_multipart_mixed(BalsaMessage * bm, LibBalsaMessageBody * body,
         for (body = body->next; body; body = body->next) {
 #ifdef HAVE_GPGME
            GMimeContentType *type =
-               g_mime_content_type_new_from_string(body->content_type);
+               g_mime_content_type_parse(libbalsa_parser_options(), body->content_type);
 
             if (libbalsa_message_body_is_inline(body) ||
                bm->force_inline ||
@@ -2189,7 +2189,7 @@ add_multipart(BalsaMessage *bm, LibBalsaMessageBody *body,
     if (!body->parts)
        return body;
 
-    type=g_mime_content_type_new_from_string(body->content_type);
+    type = g_mime_content_type_parse(libbalsa_parser_options(), body->content_type);
 
     if (g_mime_content_type_is_type(type, "multipart", "related")) {
         /* FIXME: more processing required see RFC1872 */
@@ -2463,10 +2463,10 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
     if (action == BALSA_MDN_REPLY_ASKME) {
         gchar *sender;
         gchar *reply_to;
-        sender = from ? internet_address_to_string (from, FALSE) : NULL;
+        sender = from ? internet_address_to_string (from, NULL, FALSE) : NULL;
         reply_to =
-            internet_address_list_to_string (message->headers->dispnotify_to,
-                                            FALSE);
+            internet_address_list_to_string(message->headers->dispnotify_to,
+                                           NULL, FALSE);
         gtk_widget_show_all (create_mdn_dialog (parent, sender, reply_to, mdn,
                                                 mdn_ident));
         g_free (reply_to);
@@ -2523,7 +2523,7 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
     /* the first part of the body is an informational note */
     body = libbalsa_message_body_new(message);
     date = libbalsa_message_date_to_utf8(for_msg, balsa_app.date_string);
-    dummy = internet_address_list_to_string(for_msg->headers->to_list, FALSE);
+    dummy = internet_address_list_to_string(for_msg->headers->to_list, NULL, FALSE);
     body->buffer = g_strdup_printf(
         "The message sent on %s to %s with subject “%s” has been displayed.\n"
         "There is no guarantee that the message has been read or understood.\n\n",
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index 7adfcde..7f715a1 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -347,7 +347,8 @@ extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
     }
 
     data = libbalsa_message_body_get_parameter(mime_body, "server");
-    message->headers->to_list = internet_address_list_parse_string(data);
+    message->headers->to_list =
+        internet_address_list_parse(libbalsa_parser_options(), data);
     g_free(data);
 
     /* the original body my have some data to be returned as commands... */
@@ -666,7 +667,7 @@ add_header_address_list(BalsaMessage * bm, GtkGrid * grid,
          libbalsa_find_word(header, balsa_app.selected_headers)))
        return;
 
-    value = internet_address_list_to_string(list, FALSE);
+    value = internet_address_list_to_string(list, NULL, FALSE);
 
     add_header_gchar(grid, header, label, value, show_all_headers);
 
@@ -731,14 +732,14 @@ bmw_message_set_headers_d(BalsaMessage           * bm,
 
     if (headers->from) {
        gchar *from =
-           internet_address_list_to_string(headers->from, FALSE);
+           internet_address_list_to_string(headers->from, NULL, FALSE);
        add_header_gchar(grid, "from", _("From:"), from, show_all_headers);
        g_free(from);
     }
 
     if (headers->reply_to) {
        gchar *reply_to =
-           internet_address_list_to_string(headers->reply_to, FALSE);
+           internet_address_list_to_string(headers->reply_to, NULL, FALSE);
        add_header_gchar(grid, "reply-to", _("Reply-To:"), reply_to,
                          show_all_headers);
        g_free(reply_to);
@@ -758,7 +759,7 @@ bmw_message_set_headers_d(BalsaMessage           * bm,
 
     if (headers->dispnotify_to) {
        gchar *mdn_to =
-           internet_address_list_to_string(headers->dispnotify_to, FALSE);
+           internet_address_list_to_string(headers->dispnotify_to, NULL, FALSE);
        add_header_gchar(grid, "disposition-notification-to",
                         _("Disposition-Notification-To:"), mdn_to,
                          show_all_headers);
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index 4438fe0..7e28a3d 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -220,7 +220,7 @@ balsa_vevent_widget(LibBalsaVEvent * event, gboolean may_reply,
        g_object_ref(event);
        g_object_ref(sender);
        g_object_set_data_full(G_OBJECT(event), "ev:sender",
-                              internet_address_to_string(sender, FALSE),
+                              internet_address_to_string(sender, NULL, FALSE),
                               (GDestroyNotify) g_free);
         g_object_set_data_full(G_OBJECT(event), "ev:ident",
                                g_object_ref(vevent_ident),
@@ -295,7 +295,8 @@ vevent_reply(GObject * button, GtkWidget * box)
     message = libbalsa_message_new();
     message->headers->from = internet_address_list_new();
     internet_address_list_add(message->headers->from, ident->ia);
-    message->headers->to_list = internet_address_list_parse_string(rcpt);
+    message->headers->to_list =
+        internet_address_list_parse(libbalsa_parser_options(), rcpt);
     message->headers->date = time(NULL);
 
     /* create the message subject */
diff --git a/src/balsa-print-object-header.c b/src/balsa-print-object-header.c
index 9c272e1..352a461 100644
--- a/src/balsa-print-object-header.c
+++ b/src/balsa-print-object-header.c
@@ -531,7 +531,7 @@ header_add_list(PangoLayout * layout, GString * header_buf,
          balsa_app.shown_headers == HEADERS_ALL ||
          libbalsa_find_word(field_id, balsa_app.selected_headers)) ||
         !values ||
-        !(_value = internet_address_list_to_string(values, FALSE)))
+        !(_value = internet_address_list_to_string(values, NULL, FALSE)))
        return;
 
     p_width = p_string_width_from_layout(layout, label);
diff --git a/src/message-window.c b/src/message-window.c
index 5a76993..0d179b2 100644
--- a/src/message-window.c
+++ b/src/message-window.c
@@ -744,7 +744,7 @@ mw_select_part_cb(BalsaMessage * bm, gpointer data)
     /* set window title */
     if (bm && bm->message) {
         from = internet_address_list_to_string(bm->message->headers->from,
-                                               FALSE);
+                                               NULL, FALSE);
         title = g_strdup_printf(_("Message from %s: %s"), from,
                                 LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
         g_free(from);
diff --git a/src/print-gtk.c b/src/print-gtk.c
index ed0a96c..2ac1bed 100644
--- a/src/print-gtk.c
+++ b/src/print-gtk.c
@@ -286,7 +286,7 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
 
     if (pdata->message->headers->from) {
        gchar *from =
-           internet_address_list_to_string(pdata->message->headers->from, FALSE);
+           internet_address_list_to_string(pdata->message->headers->from, NULL, FALSE);
 
        libbalsa_utf8_sanitize(&from, balsa_app.convert_unknown_8bit,
                               NULL);
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index 8eab501..05349ff 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -510,8 +510,8 @@ delete_handler(BalsaSendmsg * bsmsg)
     ia = internet_address_list_get_address(list, 0);
     if (ia) {
         tmp = ia->name;
-        if (!tmp || !*tmp)
-            tmp = free_me = internet_address_to_string(ia, FALSE);
+        if (tmp == NULL || *tmp == '\0')
+            tmp = free_me = internet_address_to_string(ia, NULL, FALSE);
     }
     if (!tmp || !*tmp)
         tmp = _("(No name)");
@@ -844,7 +844,7 @@ sw_edit_activated(GSimpleAction * action,
             InternetAddressList *list =
                 libbalsa_address_view_get_list(bsmsg->recipient_view,
                                                address_types[type]);
-            gchar *p = internet_address_list_to_string(list, FALSE);
+            gchar *p = internet_address_list_to_string(list, NULL, FALSE);
             g_object_unref(list);
             fprintf(tmp, "%s %s\n", _(address_types[type]), p);
             g_free(p);
@@ -1118,7 +1118,8 @@ update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
         bcc_list =
             libbalsa_address_view_get_list(bsmsg->recipient_view, "BCC:");
 
-        ident_list = internet_address_list_parse_string(bsmsg->ident->bcc);
+        ident_list =
+            internet_address_list_parse(libbalsa_parser_options(), bsmsg->ident->bcc);
         if (ident_list) {
             /* Remove any Bcc addresses that came from the old identity
              * from the list. */
@@ -1147,7 +1148,8 @@ update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
         }
 
         /* Add the new Bcc addresses, if any: */
-        ident_list = internet_address_list_parse_string(ident->bcc);
+        ident_list =
+            internet_address_list_parse(libbalsa_parser_options(), ident->bcc);
         if (ident_list) {
             internet_address_list_append(bcc_list, ident_list);
             g_object_unref(ident_list);
@@ -1669,7 +1671,7 @@ get_fwd_mail_headers(const gchar *mailfile)
     /* parse the file */
     parser = g_mime_parser_new();
     g_mime_parser_init_with_stream(parser, stream);
-    message = g_mime_parser_construct_message (parser);
+    message = g_mime_parser_construct_message(parser, libbalsa_parser_options());
     g_object_unref (parser);
     g_object_unref(stream);
     close(fd);
@@ -1683,7 +1685,8 @@ get_fwd_mail_headers(const gchar *mailfile)
        if (!subject)
            headers->subject = g_strdup(_("(no subject)"));
        else
-           headers->subject = g_mime_utils_header_decode_text(subject);
+           headers->subject =
+                g_mime_utils_header_decode_text(libbalsa_parser_options(), subject);
     }
     libbalsa_utf8_sanitize(&headers->subject,
                           balsa_app.convert_unknown_8bit,
@@ -1771,7 +1774,7 @@ add_attachment(BalsaSendmsg * bsmsg, const gchar *filename,
        else {
             gchar *tmp =
                 internet_address_list_to_string(attach_data->headers->from,
-                                                FALSE);
+                                                NULL, FALSE);
            utf8name = g_strdup_printf(_("Message from %s, subject: “%s”"),
                                       tmp,
                                       attach_data->headers->subject);
@@ -3514,25 +3517,22 @@ quote_body(BalsaSendmsg * bsmsg, LibBalsaMessageHeaders *headers,
        g_free(subject);
 
        if (headers->from) {
-           gchar *from =
-               internet_address_list_to_string(headers->from,
-                                               FALSE);
+            gchar *from =
+                internet_address_list_to_string(headers->from, NULL, FALSE);
            g_string_append_printf(body, "%s %s\n", _("From:"), from);
            g_free(from);
        }
 
        if (internet_address_list_length(headers->to_list) > 0) {
-           gchar *to_list =
-               internet_address_list_to_string(headers->to_list,
-                                               FALSE);
+            gchar *to_list =
+                internet_address_list_to_string(headers->to_list, NULL, FALSE);
            g_string_append_printf(body, "%s %s\n", _("To:"), to_list);
            g_free(to_list);
        }
 
        if (internet_address_list_length(headers->cc_list) > 0) {
-           gchar *cc_list =
-               internet_address_list_to_string(headers->cc_list,
-                                               FALSE);
+            gchar *cc_list =
+                internet_address_list_to_string(headers->cc_list, NULL, FALSE);
            g_string_append_printf(body, "%s %s\n", _("CC:"), cc_list);
            g_free(cc_list);
        }
@@ -6396,7 +6396,7 @@ sendmsg_window_set_title(BalsaSendmsg * bsmsg)
     }
 
     list = libbalsa_address_view_get_list(bsmsg->recipient_view, "To:");
-    to_string = internet_address_list_to_string(list, FALSE);
+    to_string = internet_address_list_to_string(list, NULL, FALSE);
     g_object_unref(list);
 
     title = g_strdup_printf(title_format, to_string ? to_string : "",
diff --git a/src/store-address.c b/src/store-address.c
index 5efd9ae..e1609ed 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -373,7 +373,7 @@ store_address_add_address(StoreAddressInfo * info,
     entries = g_new(GtkWidget *, NUM_FIELDS);
     info->entries_list = g_list_append(info->entries_list, entries);
 
-    text = internet_address_to_string(ia, FALSE);
+    text = internet_address_to_string(ia, NULL, FALSE);
     address = libbalsa_address_new();
     address->full_name =
         g_strdup(ia->name ? ia->name : group ? group->name : NULL);


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