[balsa/wip/gtk4: 181/351] address: Declare it final



commit 4362a430fa4e61619c7b72e26b305b154bf249f1
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Sat Feb 17 18:34:10 2018 -0500

    address: Declare it final
    
    G_DECLARE_FINAL_TYPE for LibBalsaAddress, take all members
    private, and provide getters and setters.

 libbalsa/abook-completion.c       |    9 --
 libbalsa/abook-completion.h       |    1 -
 libbalsa/address-book-extern.c    |   16 +--
 libbalsa/address-book-gpe.c       |  156 ++++++++++++++--------
 libbalsa/address-book-ldap.c      |  194 +++++++++++++++++-----------
 libbalsa/address-book-ldif.c      |  100 ++++++++++-----
 libbalsa/address-book-osmo.c      |   32 +++--
 libbalsa/address-book-rubrica.c   |   86 ++++++++-----
 libbalsa/address-book-text.c      |   47 ++++---
 libbalsa/address-book-vcard.c     |   84 +++++++-----
 libbalsa/address-book.c           |   11 --
 libbalsa/address-book.h           |    2 -
 libbalsa/address.c                |  261 +++++++++++++++++++++++++++----------
 libbalsa/address.h                |   94 ++++++-------
 libbalsa/rfc2445.c                |   14 +-
 libbalsa/rfc6350.c                |   36 ++----
 src/ab-main.c                     |   13 ++-
 src/ab-window.c                   |   20 ++-
 src/balsa-mime-widget-text.c      |   27 ++--
 src/balsa-mime-widget-vcalendar.c |    5 +-
 src/balsa-print-object-text.c     |   24 ++--
 src/store-address.c               |   27 ++--
 22 files changed, 762 insertions(+), 497 deletions(-)
---
diff --git a/libbalsa/abook-completion.c b/libbalsa/abook-completion.c
index 3b975cf..3d63592 100644
--- a/libbalsa/abook-completion.c
+++ b/libbalsa/abook-completion.c
@@ -92,15 +92,6 @@ completion_data_extract(CompletionData * data)
     return data->string;
 }
 
-gint
-address_compare(LibBalsaAddress *a, LibBalsaAddress *b)
-{
-    g_return_val_if_fail(a != NULL, -1);
-    g_return_val_if_fail(b != NULL, 1);
-
-    return g_ascii_strcasecmp(a->full_name, b->full_name);
-}
-
 /*
  * A LibBalsaCompletionStrncmpFunc for matching words instead of the
  * whole string.
diff --git a/libbalsa/abook-completion.h b/libbalsa/abook-completion.h
index 20d0de4..dc01697 100644
--- a/libbalsa/abook-completion.h
+++ b/libbalsa/abook-completion.h
@@ -37,7 +37,6 @@ CompletionData *completion_data_new(InternetAddress * ia,
                                     const gchar * nick_name);
 void completion_data_free(CompletionData * data);
 gchar *completion_data_extract(CompletionData * data);
-gint address_compare(LibBalsaAddress *a, LibBalsaAddress *b);
 gint strncmp_word(const gchar * s1, const gchar * s2, gsize n);
 
 #endif
diff --git a/libbalsa/address-book-extern.c b/libbalsa/address-book-extern.c
index 36737b2..328d4ee 100644
--- a/libbalsa/address-book-extern.c
+++ b/libbalsa/address-book-extern.c
@@ -195,12 +195,9 @@ lbe_load_cb(const gchar *email, const gchar *name, void *data)
     LibBalsaAddress *address = libbalsa_address_new();
 
     /* The extern database doesn't support Id's, sorry! */
-    address->nick_name = g_strdup(_("No-Id"));
-    address->address_list = g_list_append(address->address_list,
-                                          g_strdup(email));
-    
-    if (name) address->full_name = g_strdup(name);
-    else address->full_name = g_strdup(_("No-Name"));
+    libbalsa_address_set_nick_name(address, _("No-Id"));
+    libbalsa_address_add_addr(address, email);
+    libbalsa_address_set_full_name(address, name != NULL ? name : _("No-Name"));
     d->callback(d->ab, address, d->closure);
     g_object_unref(G_OBJECT(address));
 }
@@ -285,10 +282,11 @@ libbalsa_address_book_externq_add_address(LibBalsaAddressBook * ab,
 
     ex = LIBBALSA_ADDRESS_BOOK_EXTERN(ab);
     if(ex->save) {
+        const gchar *addr = libbalsa_address_get_addr(new_address);
         g_snprintf(command, sizeof(command), "%s \"%s\" \"%s\" \"%s\"", 
-                   ex->save, 
-                   (gchar *) new_address->address_list->data, 
-                   new_address->full_name, "TODO");
+                   ex->save,
+                   addr,
+                   libbalsa_address_get_full_name(new_address), "TODO");
         
         if( (gc = popen(command, "r")) == NULL)
             return LBABERR_CANNOT_WRITE;
diff --git a/libbalsa/address-book-gpe.c b/libbalsa/address-book-gpe.c
index e33b3e4..a11abd2 100644
--- a/libbalsa/address-book-gpe.c
+++ b/libbalsa/address-book-gpe.c
@@ -239,23 +239,30 @@ libbalsa_address_book_gpe_open_db(LibBalsaAddressBookGpe * ab_gpe)
 static int
 gpe_read_attr(void *arg, int argc, char **argv, char **names)
 {
-    LibBalsaAddress * a= arg;
+    LibBalsaAddress *address = arg;
 
     /* follow read_entry_data/db_set_multi_data */
     if(g_ascii_strcasecmp(argv[0], "NAME") == 0 &&
-       !a->full_name) a->full_name = g_strdup(argv[1]);
-    else if(g_ascii_strcasecmp(argv[0], "GIVEN_NAME") == 0 &&
-            !a->first_name) a->first_name = g_strdup(argv[1]);
-    else if(g_ascii_strcasecmp(argv[0], "FAMILY_NAME") == 0 &&
-            !a->last_name) a->last_name = g_strdup(argv[1]);
-    else if(g_ascii_strcasecmp(argv[0], "NICKNAME") == 0 &&
-            !a->nick_name) a->nick_name = g_strdup(argv[1]);
-    else if(g_ascii_strcasecmp(argv[0], "WORK.ORGANIZATION") == 0 &&
-            !a->organization) a->organization = g_strdup(argv[1]);
-    else if(g_ascii_strcasecmp(argv[0], "HOME.EMAIL") == 0)
-        a->address_list = g_list_prepend(a->address_list, g_strdup(argv[1]));
-    else if(g_ascii_strcasecmp(argv[0], "WORK.EMAIL") == 0)
-        a->address_list = g_list_prepend(a->address_list, g_strdup(argv[1]));
+       libbalsa_address_get_full_name(address) == NULL) {
+        libbalsa_address_set_full_name(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "GIVEN_NAME") == 0 &&
+              libbalsa_address_get_first_name(address) == NULL) {
+        libbalsa_address_set_first_name(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "FAMILY_NAME") == 0 &&
+              libbalsa_address_get_last_name(address) == NULL) {
+        libbalsa_address_set_last_name(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "NICKNAME") == 0 &&
+              libbalsa_address_get_nick_name(address) == NULL) {
+        libbalsa_address_set_nick_name(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "WORK.ORGANIZATION") == 0 &&
+              libbalsa_address_get_organization(address) == NULL) {
+        libbalsa_address_set_organization(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "HOME.EMAIL") == 0) {
+        libbalsa_address_add_addr(address, argv[1]);
+    } else if(g_ascii_strcasecmp(argv[0], "WORK.EMAIL") == 0) {
+        libbalsa_address_add_addr(address, argv[1]);
+    }
+
     return 0;
 }
 
@@ -269,7 +276,7 @@ gpe_read_attr(void *arg, int argc, char **argv, char **names)
  *   NULL on failure (both first and last names invalid.
  */
 static gchar *
-create_name(gchar * first, gchar * last)
+create_name(const gchar * first, const gchar * last)
 {
     if ((first == NULL) && (last == NULL))
        return NULL;
@@ -291,7 +298,7 @@ static int
 gpe_read_address(void *arg, int argc, char **argv, char **names)
 {
     struct gpe_closure *gc = arg;
-    LibBalsaAddress * a= libbalsa_address_new();
+    LibBalsaAddress *address = libbalsa_address_new();
     guint uid = atoi(argv[0]);
 
     /* follow read_entry_data. FIXME: error reporting */
@@ -299,21 +306,31 @@ gpe_read_address(void *arg, int argc, char **argv, char **names)
     gchar *sql =
         sqlite3_mprintf("select tag,value from contacts where urn=%d",
                         uid);
-    sqlite3_exec(gc->gpe->db, sql, gpe_read_attr, a, NULL);
+    sqlite3_exec(gc->gpe->db, sql, gpe_read_attr, address, NULL);
     sqlite3_free(sql);
 #else                           /* HAVE_SQLITE3 */
     sqlite_exec_printf (gc->gpe->db,
                         "select tag,value from contacts where urn=%d",
                         gpe_read_attr, a, NULL, uid);
 #endif                          /* HAVE_SQLITE3 */
-    if(!a->address_list) { /* entry without address: ignore! */
-        g_object_unref(a);
+    if(libbalsa_address_get_addr_list(address) == NULL) {
+        /* entry without address: ignore! */
+        g_object_unref(address);
         return 0;
     }
-    if(!a->full_name)
-        a->full_name = create_name(a->first_name, a->last_name);
-    g_object_set_data(G_OBJECT(a), "urn", GUINT_TO_POINTER(uid));
-    gc->callback(LIBBALSA_ADDRESS_BOOK(gc->gpe), a, gc->closure);
+    if (libbalsa_address_get_full_name(address) == NULL) {
+        const gchar *first_name;
+        const gchar *last_name;
+        gchar *full_name;
+
+        first_name = libbalsa_address_get_first_name(address);
+        last_name  = libbalsa_address_get_last_name(address);
+        full_name  = create_name(first_name, last_name);
+        libbalsa_address_set_full_name(address, full_name);
+        g_free(full_name);
+    }
+    g_object_set_data(G_OBJECT(address), "urn", GUINT_TO_POINTER(uid));
+    gc->callback(LIBBALSA_ADDRESS_BOOK(gc->gpe), address, gc->closure);
     return 0;
 }
 
@@ -420,6 +437,7 @@ libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
                                        LibBalsaAddress *address)
 {
     LibBalsaAddressBookGpe *ab_gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    const gchar *addr;
     int r;
     guint id;
     char *err = NULL;
@@ -427,8 +445,9 @@ libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
     gchar *sql;
 #endif                          /* HAVE_SQLITE3 */
 
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
+    addr = libbalsa_address_get_addr(address);
+    g_return_val_if_fail(addr != NULL, LBABERR_CANNOT_WRITE);
 
     if (ab_gpe->db == NULL) {
         if(!libbalsa_address_book_gpe_open_db(ab_gpe))
@@ -456,13 +475,17 @@ libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
 #else                           /* HAVE_SQLITE3 */
     id = sqlite_last_insert_rowid(ab_gpe->db);
 #endif                          /* HAVE_SQLITE3 */
-    INSERT_ATTR(ab_gpe->db,id, "NAME",        address->full_name);
-    INSERT_ATTR(ab_gpe->db,id, "GIVEN_NAME",  address->first_name);
-    INSERT_ATTR(ab_gpe->db,id, "FAMILY_NAME", address->last_name);
-    INSERT_ATTR(ab_gpe->db,id, "NICKNAME",    address->nick_name);
-    INSERT_ATTR(ab_gpe->db,id, "WORK.ORGANIZATION", address->organization);
-    INSERT_ATTR(ab_gpe->db,id, "WORK.EMAIL",
-                (char*)address->address_list->data);
+    INSERT_ATTR(ab_gpe->db,id, "NAME",
+                libbalsa_address_get_full_name(address));
+    INSERT_ATTR(ab_gpe->db,id, "GIVEN_NAME",
+                libbalsa_address_get_first_name(address));
+    INSERT_ATTR(ab_gpe->db,id, "FAMILY_NAME",
+                libbalsa_address_get_last_name(address));
+    INSERT_ATTR(ab_gpe->db,id, "NICKNAME",
+                libbalsa_address_get_nick_name(address));
+    INSERT_ATTR(ab_gpe->db,id, "WORK.ORGANIZATION",
+                libbalsa_address_get_organization(address));
+    INSERT_ATTR(ab_gpe->db,id, "WORK.EMAIL", addr);
 #ifdef HAVE_SQLITE3
     sql = sqlite3_mprintf("insert into contacts values "
                           "('%d', 'MODIFIED', %d)",
@@ -542,8 +565,8 @@ libbalsa_address_book_gpe_remove_address(LibBalsaAddressBook *ab,
     LibBalsaAddressBookGpe *ab_gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
     guint uid;
     char *err;
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
+
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
 
     if (ab_gpe->db == NULL) {
         if( !libbalsa_address_book_gpe_open_db(ab_gpe))
@@ -552,7 +575,7 @@ libbalsa_address_book_gpe_remove_address(LibBalsaAddressBook *ab,
     uid = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(address), "urn"));
     if(!uid)/* safety check, perhaps unnecessary */
         return LBABERR_CANNOT_WRITE;
-        
+
     err = db_delete_by_uid(ab_gpe->db, uid);
     if(err) {
         libbalsa_address_book_set_status(ab, g_strdup(err));
@@ -592,6 +615,7 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
                                          LibBalsaAddress *newval)
 {
     LibBalsaAddressBookGpe *ab_gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    const gchar *addr;
     guint uid;
     int r;
     char *err;
@@ -599,9 +623,11 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
     gchar *sql;
 #endif                          /* HAVE_SQLITE3 */
 
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(newval->address_list, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(newval  != NULL, LBABERR_CANNOT_WRITE);
+
+    addr = libbalsa_address_get_addr(newval);
+    g_return_val_if_fail(addr != NULL, LBABERR_CANNOT_WRITE);
 
     if (ab_gpe->db == NULL) {
         if( !libbalsa_address_book_gpe_open_db(ab_gpe))
@@ -648,13 +674,17 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
           NULL, NULL, &err, uid)) != SQLITE_OK)
         goto rollback;
 #endif                          /* HAVE_SQLITE3 */
-    INSERT_ATTR_R(ab_gpe->db,uid, "NAME",        newval->full_name);
-    INSERT_ATTR_R(ab_gpe->db,uid, "GIVEN_NAME",  newval->first_name);
-    INSERT_ATTR_R(ab_gpe->db,uid, "FAMILY_NAME", newval->last_name);
-    INSERT_ATTR_R(ab_gpe->db,uid, "NICKNAME",    newval->nick_name);
-    INSERT_ATTR_R(ab_gpe->db,uid, "WORK.ORGANIZATION", newval->organization);
-    INSERT_ATTR_R(ab_gpe->db,uid, "WORK.EMAIL",
-                (char*)newval->address_list->data);
+    INSERT_ATTR_R(ab_gpe->db,uid, "NAME",
+                  libbalsa_address_get_full_name(newval));
+    INSERT_ATTR_R(ab_gpe->db,uid, "GIVEN_NAME",
+                  libbalsa_address_get_first_name(newval));
+    INSERT_ATTR_R(ab_gpe->db,uid, "FAMILY_NAME",
+                  libbalsa_address_get_last_name(newval));
+    INSERT_ATTR_R(ab_gpe->db,uid, "NICKNAME",
+                  libbalsa_address_get_nick_name(newval));
+    INSERT_ATTR_R(ab_gpe->db,uid, "WORK.ORGANIZATION",
+                  libbalsa_address_get_organization(newval));
+    INSERT_ATTR_R(ab_gpe->db,uid, "WORK.EMAIL", addr);
 #ifdef HAVE_SQLITE3
     sql = sqlite3_mprintf("insert into contacts values "
                           "('%d', 'MODIFIED', %d)", uid, time(NULL));
@@ -703,8 +733,9 @@ static int
 gpe_read_completion(void *arg, int argc, char **argv, char **names)
 {
     struct gpe_completion_closure *gc = arg;
-    LibBalsaAddress * a= libbalsa_address_new();
+    LibBalsaAddress *address = libbalsa_address_new();
     InternetAddress *ia;
+    GList *addr_list;
     GList *l;
     guint uid = atoi(argv[0]);
 #ifdef HAVE_SQLITE3
@@ -713,7 +744,7 @@ gpe_read_completion(void *arg, int argc, char **argv, char **names)
     /* follow read_entry_data. FIXME: error reporting */
     sql = sqlite3_mprintf("select tag,value from contacts where urn=%d",
                           uid);
-    sqlite3_exec(gc->db, sql, gpe_read_attr, a, NULL);
+    sqlite3_exec(gc->db, sql, gpe_read_attr, address, NULL);
     sqlite3_free(sql);
 #else                           /* HAVE_SQLITE3 */
 
@@ -722,17 +753,34 @@ gpe_read_completion(void *arg, int argc, char **argv, char **names)
                        "select tag,value from contacts where urn=%d",
                        gpe_read_attr, a, NULL, uid);
 #endif                          /* HAVE_SQLITE3 */
-    if(!a->address_list) { /* entry without address: ignore! */
-        g_object_unref(a);
+
+    addr_list = libbalsa_address_get_addr_list(address);
+    if (addr_list == NULL) {
+        /* entry without address: ignore! */
+        g_object_unref(address);
         return 0;
     }
-    if(!a->full_name)
-        a->full_name = create_name(a->first_name, a->last_name);
-    for(l=a->address_list; l; l = l->next) {
-        ia = internet_address_mailbox_new(a->full_name, l->data);
+
+    if (libbalsa_address_get_full_name(address) == NULL) {
+        const gchar *first_name;
+        const gchar *last_name;
+        gchar *full_name;
+
+        first_name = libbalsa_address_get_first_name(address);
+        last_name  = libbalsa_address_get_last_name(address);
+        full_name  = create_name(first_name, last_name);
+        libbalsa_address_set_full_name(address, full_name);
+        g_free(full_name);
+    }
+
+    for (l = addr_list; l != NULL; l = l->next) {
+        const gchar *full_name = libbalsa_address_get_full_name(address);
+        ia = internet_address_mailbox_new(full_name, (gchar *) l->data);
         gc->res = g_list_prepend(gc->res, ia);
     }
-    g_object_unref(G_OBJECT(a));
+
+    g_object_unref(address);
+
     return 0;
 }
 
diff --git a/libbalsa/address-book-ldap.c b/libbalsa/address-book-ldap.c
index b9af368..b5a5705 100644
--- a/libbalsa/address-book-ldap.c
+++ b/libbalsa/address-book-ldap.c
@@ -454,18 +454,25 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
         */
        if ((vals=ldap_get_values_len(ab_ldap->directory, e, attr)) != NULL) {
            for (i = 0; vals[i] != NULL; i++) {
-               if ((g_ascii_strcasecmp(attr, "sn") == 0) && (!last))
-                   last = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
-               if ((g_ascii_strcasecmp(attr, "cn") == 0) && (!cn))
-                   cn = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
-               if ((g_ascii_strcasecmp(attr, "givenName") == 0) && (!first))
-                   first = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
-               if ((g_ascii_strcasecmp(attr, "o") == 0) && (!org))
-                   org = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
-               if ((g_ascii_strcasecmp(attr, "uid") == 0) && (!uid))
-                   uid = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
-               if ((g_ascii_strcasecmp(attr, "mail") == 0) && (!email))
-                   email = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+               if (g_ascii_strcasecmp(attr, "sn") == 0) {
+                    if (last == NULL)
+                        last = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                } else if (g_ascii_strcasecmp(attr, "cn") == 0) {
+                    if (cn == NULL)
+                        cn = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                } else if (g_ascii_strcasecmp(attr, "givenName") == 0) {
+                    if (first == NULL)
+                        first = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                } else if (g_ascii_strcasecmp(attr, "o") == 0) {
+                    if (org == NULL)
+                        org = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                } else if (g_ascii_strcasecmp(attr, "uid") == 0) {
+                    if (uid == NULL)
+                        uid = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                } else if (g_ascii_strcasecmp(attr, "mail") == 0) {
+                    if (email == NULL)
+                        email = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+                }
            }
            ldap_value_free_len(vals);
        }
@@ -475,21 +482,33 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
      * Record will have e-mail (searched)
      */
     if(email == NULL) email = g_strdup("none");
-    g_return_val_if_fail(email != NULL, NULL);
 
     address = libbalsa_address_new();
-    if (cn)
-       address->full_name = cn;
-    else {
-       address->full_name = create_name(first, last);
-        if(!address->full_name)
-            address->full_name = g_strdup(_("No-Name"));
+    if (cn != NULL) {
+        libbalsa_address_set_full_name(address, cn);
+        g_free(cn);
+    } else {
+        gchar *full_name = create_name(first, last);
+
+        if (full_name != NULL) {
+            libbalsa_address_set_full_name(address, full_name);
+            g_free(full_name);
+        } else {
+            libbalsa_address_set_full_name(address, _("No-Name"));
+        }
     }
-    address->first_name = first;
-    address->last_name = last;
-    address->nick_name = uid;
-    address->organization = org;
-    address->address_list = g_list_prepend(address->address_list, email);
+
+    libbalsa_address_set_first_name(address, first);
+    libbalsa_address_set_last_name(address, last);
+    libbalsa_address_set_nick_name(address, uid);
+    libbalsa_address_set_organization(address, org);
+    libbalsa_address_add_addr(address, email);
+
+    g_free(first);
+    g_free(last);
+    g_free(uid);
+    g_free(org);
+    g_free(email);
 
     return address;
 }
@@ -562,7 +581,7 @@ create_name(gchar * first, gchar * last)
 
 #define SETMOD(mods,modarr,op,attr,strv,val) \
    do { (mods) = &(modarr); (modarr).mod_type=attr; (modarr).mod_op=op;\
-        (strv)[0]=(val); (modarr).mod_values=strv; \
+        (strv)[0]=(char*)(val); (modarr).mod_values=strv; \
       } while(0)
 
 static LibBalsaABErr
@@ -581,9 +600,12 @@ libbalsa_address_book_ldap_add_address(LibBalsaAddressBook *ab,
     char *sn[]   = {NULL, NULL};
     char *mail[] = {NULL, NULL};
     LibBalsaAddressBookLdap *ab_ldap = LIBBALSA_ADDRESS_BOOK_LDAP(ab);
+    const gchar *addr;
+    const gchar *item;
 
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
+    addr = libbalsa_address_get_addr(address);
+    g_return_val_if_fail(addr != NULL, LBABERR_CANNOT_WRITE);
 
     if (ab_ldap->directory == NULL) {
         if(libbalsa_address_book_ldap_open_connection(ab_ldap) != LDAP_SUCCESS)
@@ -594,10 +616,10 @@ libbalsa_address_book_ldap_add_address(LibBalsaAddressBook *ab,
         libbalsa_address_book_set_status
             (ab, _("Undefined location of user address book"));
         return LBABERR_CANNOT_WRITE;
-    }                                    
+    }
 
     dn = g_strdup_printf("mail=%s,%s",
-                         (char*)address->address_list->data,
+                         addr,
                          ab_ldap->priv_book_dn);
     mods[0] = &modarr[0];
     modarr[0].mod_op = LDAP_MOD_ADD;
@@ -605,27 +627,33 @@ libbalsa_address_book_ldap_add_address(LibBalsaAddressBook *ab,
     modarr[0].mod_values = object_class_values;
     cnt = 1;
 
-    if(address->full_name) {
-        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"cn",cn,address->full_name);
+    item = libbalsa_address_get_full_name(address);
+    if (item != NULL) {
+        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"cn",cn,item);
         cnt++;
     }
-    if(address->first_name) {
-        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"givenName",gn,
-               address->first_name);
+
+    item = libbalsa_address_get_first_name(address);
+    if (item != NULL) {
+        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"givenName",gn, item);
         cnt++;
     }
-    if(address->last_name) {
-        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"sn",sn,address->last_name);
+
+    item = libbalsa_address_get_last_name(address);
+    if (item != NULL) {
+        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"sn",sn,item);
         cnt++;
     }
-    if(address->organization) {
-        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"o",org,
-               address->organization);
+
+    item = libbalsa_address_get_organization(address);
+    if (item != NULL) {
+        SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"o",org, item);
         cnt++;
     }
-    SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"mail",mail,
-               (char*)address->address_list->data);
+
+    SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_ADD,"mail",mail, addr);
     cnt++;
+
     mods[cnt] = NULL;
 
     cnt = 0;
@@ -633,7 +661,7 @@ libbalsa_address_book_ldap_add_address(LibBalsaAddressBook *ab,
         int rc = ldap_add_ext_s(ab_ldap->directory, dn, mods, NULL, NULL);
         switch(rc) {
         case LDAP_SUCCESS: g_free(dn); return LBABERR_OK;
-        case LDAP_ALREADY_EXISTS: 
+        case LDAP_ALREADY_EXISTS:
            g_free(dn);
            libbalsa_address_book_set_status(ab,
                                             g_strdup(ldap_err2string(rc)));
@@ -661,11 +689,13 @@ libbalsa_address_book_ldap_remove_address(LibBalsaAddressBook *ab,
                                           LibBalsaAddress *address)
 {
     LibBalsaAddressBookLdap *ab_ldap = LIBBALSA_ADDRESS_BOOK_LDAP(ab);
+    const gchar *addr;
     gchar *dn;
     int cnt, rc;
 
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
+    addr = libbalsa_address_get_addr(address);
+    g_return_val_if_fail(addr != NULL, LBABERR_CANNOT_WRITE);
 
     if (ab_ldap->directory == NULL) {
         if( (rc=libbalsa_address_book_ldap_open_connection(ab_ldap))
@@ -674,7 +704,7 @@ libbalsa_address_book_ldap_remove_address(LibBalsaAddressBook *ab,
     }
 
     dn = g_strdup_printf("mail=%s,%s",
-                         (char*)address->address_list->data,
+                         addr,
                          ab_ldap->priv_book_dn);
     cnt = 0;
     do {
@@ -719,20 +749,28 @@ libbalsa_address_book_ldap_modify_address(LibBalsaAddressBook *ab,
     char *org[]  = {NULL, NULL};
     char *sn[]   = {NULL, NULL};
     LibBalsaAddressBookLdap *ab_ldap = LIBBALSA_ADDRESS_BOOK_LDAP(ab);
+    const gchar *addr;
+    const gchar *new_addr;
+    const gchar *item;
+    const gchar *new_item;
 
-    g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
-    g_return_val_if_fail(newval->address_list, LBABERR_CANNOT_WRITE);
+    g_return_val_if_fail(address != NULL, LBABERR_CANNOT_WRITE);
+    addr = libbalsa_address_get_addr(address);
+    g_return_val_if_fail(addr != NULL, LBABERR_CANNOT_WRITE);
 
-    if(!STREQ(address->address_list->data,newval->address_list->data)) {
+    g_return_val_if_fail(newval != NULL, LBABERR_CANNOT_WRITE);
+    new_addr = libbalsa_address_get_addr(newval);
+    g_return_val_if_fail(new_addr != NULL, LBABERR_CANNOT_WRITE);
+
+    if(!STREQ(addr, new_addr)) {
         /* email address has changed, we have to remove old entry and
          * add a new one. */
-        if( (rc=libbalsa_address_book_ldap_add_address(ab, newval)) 
+        if( (rc=libbalsa_address_book_ldap_add_address(ab, newval))
             != LBABERR_OK)
             return rc;
         return libbalsa_address_book_ldap_remove_address(ab, address);
     }
-    /* the email address has not changed, continue with changing other 
+    /* the email address has not changed, continue with changing other
      * attributes. */
     if (ab_ldap->directory == NULL) {
         if( (rc=libbalsa_address_book_ldap_open_connection(ab_ldap))
@@ -741,46 +779,50 @@ libbalsa_address_book_ldap_modify_address(LibBalsaAddressBook *ab,
     }
 
     dn = g_strdup_printf("mail=%s,%s",
-                         (char*)address->address_list->data,
+                         addr,
                          ab_ldap->priv_book_dn);
     cnt = 0;
 
-    if(!STREQ(address->full_name,newval->full_name)) {
-        if(newval->full_name)
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"cn",cn,
-                   newval->full_name);
+    item = libbalsa_address_get_full_name(address);
+    new_item = libbalsa_address_get_full_name(newval);
+    if (!STREQ(item, new_item)) {
+        if (new_item != NULL)
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"cn",cn, new_item);
         else
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"cn",cn,
-                   address->full_name);
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"cn",cn, item);
         cnt++;
     }
-    if(!STREQ(address->first_name,newval->first_name)) {
-        if(newval->first_name)
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"givenName",gn,
-                   newval->first_name);
+
+    item = libbalsa_address_get_first_name(address);
+    new_item = libbalsa_address_get_first_name(newval);
+    if (!STREQ(item, new_item)) {
+        if (new_item != NULL)
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"givenName",gn, new_item);
         else
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"givenName",gn,
-                   address->first_name);
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"givenName",gn, item);
         cnt++;
     }
-    if(!STREQ(address->last_name,newval->last_name)) {
-        if(newval->last_name)
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"sn",sn,
-                   newval->last_name);
+
+    item = libbalsa_address_get_last_name(address);
+    new_item = libbalsa_address_get_last_name(newval);
+    if (!STREQ(item, new_item)) {
+        if (new_item != NULL)
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"sn",sn, new_item);
         else
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"sn",sn,
-                   address->last_name);
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"sn",sn, item);
         cnt++;
     }
-    if(!STREQ(address->organization,newval->organization)) {
-        if(newval->organization)
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"o",
-                   org, newval->organization);
+
+    item = libbalsa_address_get_organization(address);
+    new_item = libbalsa_address_get_organization(newval);
+    if (!STREQ(item, new_item)) {
+        if (new_item != NULL)
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_REPLACE,"o", org, new_item);
         else
-            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"o",
-                   org, address->organization);
+            SETMOD(mods[cnt],modarr[cnt],LDAP_MOD_DELETE,"o", org, item);
         cnt++;
     }
+
     mods[cnt] = NULL;
 
     if(cnt == 0) {
diff --git a/libbalsa/address-book-ldif.c b/libbalsa/address-book-ldif.c
index ea782d0..cb40996 100644
--- a/libbalsa/address-book-ldif.c
+++ b/libbalsa/address-book-ldif.c
@@ -184,7 +184,7 @@ read_line(FILE* f)
    Returns a NULL pointer if it couldn't figure out a name. 
 */
 static gchar *
-build_name(gchar *cn, gchar *givenname, gchar *surname)
+build_name(const gchar *cn, const gchar *givenname, const gchar *surname)
 {
     gchar *name = NULL;
 
@@ -208,36 +208,65 @@ address_new_prefill(LibBalsaAddress * address, GList * address_list,
                     gchar * nickn, gchar * givenn, gchar * surn,
                     gchar * fulln, gchar * org)
 {
-    address->address_list = address_list;
-    
-    address->first_name = givenn ? givenn : g_strdup(nickn ? nickn : "");
-    address->last_name = surn ? surn : g_strdup("");
-    address->full_name = build_name(fulln, address->first_name, surn);
+    gchar *full_name;
+
+    libbalsa_address_set_addr_list(address, address_list);
+
+    if (givenn != NULL) {
+        libbalsa_address_set_first_name(address, givenn);
+        g_free(givenn);
+    } else {
+        libbalsa_address_set_first_name(address, nickn != NULL ? nickn : "");
+    }
+
+    if (surn != NULL) {
+        libbalsa_address_set_last_name(address, surn);
+        g_free(surn);
+    } else {
+        libbalsa_address_set_last_name(address, "");
+    }
+
+    full_name = build_name(fulln, libbalsa_address_get_first_name(address), surn);
+    libbalsa_address_set_full_name(address, full_name);
     g_free(fulln);
-    address->organization = org ? org : g_strdup("");
-    
-    address->nick_name = nickn ? nickn : 
-       g_strdup(address->full_name ? address->full_name : _("No-Id"));
-    
-    if (address->full_name == NULL)
-       address->full_name = g_strdup(_("No-Name"));
+
+    libbalsa_address_set_organization(address, org ? org : "");
+    g_free(org);
+
+    if (nickn != NULL) {
+        libbalsa_address_set_nick_name(address, nickn);
+        g_free(nickn);
+    } else {
+        libbalsa_address_set_nick_name(address,
+                                       full_name != NULL ? full_name : _("No-Id"));
+    }
+
+    if (full_name == NULL)
+        libbalsa_address_set_full_name(address, _("No-Name"));
+
+    g_free(full_name);
 }
 
 /* Class methods */
 
-/* 
+/*
  * Write various lines to the output stream.
  */
 static void
 lbab_ldif_write_dn(FILE * stream, LibBalsaAddress * address)
 {
+    const gchar *full_name = libbalsa_address_get_full_name(address);
     gchar *cn = NULL;
+    const gchar *addr;
     gchar *value, *value_spec;
 
-    if (address->full_name != NULL && address->full_name[0] != '\0') {
-        cn = g_strdup(address->full_name);
+    if (full_name != NULL && full_name[0] != '\0') {
+        cn = g_strdup(full_name);
     } else {
-        cn = build_name(NULL, address->first_name, address->last_name);
+        const gchar *first_name = libbalsa_address_get_first_name(address);
+        const gchar *last_name  = libbalsa_address_get_last_name(address);
+
+        cn = build_name(NULL, first_name, last_name);
         if (cn == NULL) {
             cn = g_strdup(_("No-Name"));
         } else {
@@ -248,10 +277,9 @@ lbab_ldif_write_dn(FILE * stream, LibBalsaAddress * address)
         }
     }
 
-    if (address->address_list && address->address_list->data) {
-        value =
-            g_strdup_printf("cn=%s,mail=%s",
-                            cn, (gchar *) address->address_list->data);
+    addr = libbalsa_address_get_addr(address);
+    if (addr != NULL && addr[0] != '\0') {
+        value = g_strdup_printf("cn=%s,mail=%s", cn, addr);
     } else
         value = g_strdup_printf("cn=%s", cn);
     value_spec = string_to_value_spec(value);
@@ -270,9 +298,11 @@ lbab_ldif_write_addresses(FILE * stream, LibBalsaAddress * address)
 {
     GList *list;
 
-    for (list = address->address_list; list; list = list->next) {
+    for (list = libbalsa_address_get_addr_list(address);
+         list != NULL; list = list->next) {
         const gchar *mail = list->data;
-        if (mail && *mail) {
+
+        if (mail != NULL && mail[0] != '\0') {
             gchar *value_spec = string_to_value_spec(mail);
             fprintf(stream, "mail:%s\n", value_spec);
             g_free(value_spec);
@@ -283,8 +313,10 @@ lbab_ldif_write_addresses(FILE * stream, LibBalsaAddress * address)
 static void
 lbab_ldif_write_surname(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->last_name && *(address->last_name)) {
-        gchar *value_spec = string_to_value_spec(address->last_name);
+    const gchar *last_name = libbalsa_address_get_last_name(address);
+
+    if (last_name != NULL && last_name[0] != '\0') {
+        gchar *value_spec = string_to_value_spec(last_name);
         fprintf(stream, "sn:%s\n", value_spec);
         g_free(value_spec);
     }
@@ -293,8 +325,10 @@ lbab_ldif_write_surname(FILE * stream, LibBalsaAddress * address)
 static void
 lbab_ldif_write_givenname(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->first_name && *(address->first_name)) {
-        gchar *value_spec = string_to_value_spec(address->first_name);
+    const gchar *first_name = libbalsa_address_get_first_name(address);
+
+    if (first_name != NULL && first_name[0] != '\0') {
+        gchar *value_spec = string_to_value_spec(first_name);
         fprintf(stream, "givenname:%s\n", value_spec);
         g_free(value_spec);
     }
@@ -303,8 +337,10 @@ lbab_ldif_write_givenname(FILE * stream, LibBalsaAddress * address)
 static void
 lbab_ldif_write_nickname(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->nick_name) {
-        gchar *value_spec = string_to_value_spec(address->nick_name);
+    const gchar *nick_name = libbalsa_address_get_nick_name(address);
+
+    if (nick_name != NULL) {
+        gchar *value_spec = string_to_value_spec(nick_name);
         fprintf(stream, "xmozillanickname:%s\n", value_spec);
         g_free(value_spec);
     }
@@ -313,8 +349,10 @@ lbab_ldif_write_nickname(FILE * stream, LibBalsaAddress * address)
 static void
 lbab_ldif_write_organization(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->organization) {
-        gchar *value_spec = string_to_value_spec(address->organization);
+    const gchar *organization = libbalsa_address_get_nick_name(address);
+
+    if (organization != NULL) {
+        gchar *value_spec = string_to_value_spec(organization);
         fprintf(stream, "o:%s\n", value_spec);
         g_free(value_spec);
     }
diff --git a/libbalsa/address-book-osmo.c b/libbalsa/address-book-osmo.c
index 95dbb64..caa4943 100644
--- a/libbalsa/address-book-osmo.c
+++ b/libbalsa/address-book-osmo.c
@@ -205,13 +205,13 @@ utf8_strstr(const gchar *haystack, const gchar *utf8_needle)
  * LibBalsaAddress::nick_name and LibBalsaAddress::organization.
  */
 static inline gboolean
-utf8_lba_strstr(const LibBalsaAddress *address, const gchar *utf8_needle)
+utf8_lba_strstr(LibBalsaAddress *address, const gchar *utf8_needle)
 {
-       return utf8_strstr(address->full_name, utf8_needle) ||
-               utf8_strstr(address->first_name, utf8_needle) ||
-               utf8_strstr(address->last_name, utf8_needle) ||
-               utf8_strstr(address->nick_name, utf8_needle) ||
-               utf8_strstr(address->organization, utf8_needle);
+       return utf8_strstr(libbalsa_address_get_full_name(address), utf8_needle) ||
+               utf8_strstr(libbalsa_address_get_first_name(address), utf8_needle) ||
+               utf8_strstr(libbalsa_address_get_last_name(address), utf8_needle) ||
+               utf8_strstr(libbalsa_address_get_nick_name(address), utf8_needle) ||
+               utf8_strstr(libbalsa_address_get_organization(address), utf8_needle);
 }
 
 
@@ -249,27 +249,29 @@ libbalsa_address_book_osmo_alias_complete(LibBalsaAddressBook *ab,
                        gboolean names_match;
 
                        names_match = utf8_lba_strstr(this_addr, utf8_filter);
-                       for (this_mail = this_addr->address_list; this_mail != NULL; this_mail = 
this_mail->next) {
+                       for (this_mail = libbalsa_address_get_addr_list(this_addr);
+                             this_mail != NULL; this_mail = this_mail->next) {
                                const gchar *mail_addr = (gchar *) this_mail->data;
 
                                if (names_match || (strstr(mail_addr, prefix) != NULL)) {
+                                        const gchar *full_name;
                                        InternetAddress *addr;
 
-                                       g_debug("%s: found %s <%s>", __func__, this_addr->full_name, 
mail_addr);
-                                       addr = internet_address_mailbox_new(this_addr->full_name, 
g_strdup(mail_addr));
+                                        full_name =
+                                            libbalsa_address_get_full_name(this_addr),
+                                       g_debug("%s: found %s <%s>", __func__,
+                                                full_name, mail_addr);
+                                       addr = internet_address_mailbox_new(full_name,
+                                                mail_addr);
                                        result = g_list_prepend(result, g_object_ref(addr));
                                }
                        }
                }
                g_free(utf8_filter);
                g_list_free_full(addresses, g_object_unref);
-
-               if (result != NULL) {
-                       result = g_list_reverse(result);
-               }
        }
 
-       return result;
+       return g_list_reverse(result);
 }
 
 
@@ -332,7 +334,7 @@ osmo_read_addresses(LibBalsaAddressBookOsmo *osmo,
 
                                this_addr = rfc6350_parse_from_stream(data, &eos, error);
                                if (this_addr != NULL) {
-                                       if (this_addr->address_list != NULL) {
+                                       if (libbalsa_address_get_addr(this_addr) != NULL) {
                                                addresses = g_list_prepend(addresses, this_addr);
                                        } else {
                                                g_object_unref(G_OBJECT(this_addr));
diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c
index c14d6ca..ceb5292 100644
--- a/libbalsa/address-book-rubrica.c
+++ b/libbalsa/address-book-rubrica.c
@@ -217,8 +217,8 @@ libbalsa_address_book_rubrica_load(LibBalsaAddressBook * ab,
 
        if (callback &&
            (!filter_hi ||
-            lbab_rubrica_starts_from(address->last_name, filter_hi) ||
-            lbab_rubrica_starts_from(address->full_name, filter_hi)))
+            lbab_rubrica_starts_from(libbalsa_address_get_last_name(address), filter_hi) ||
+            lbab_rubrica_starts_from(libbalsa_address_get_full_name(address), filter_hi)))
            callback(ab, address, data);
     }
     if (callback)
@@ -277,7 +277,7 @@ libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab,
 
     /* eject if we already have this address */
     if (g_slist_find_custom(ab_rubrica->item_list, new_address,
-                           (GCompareFunc) address_compare)) {
+                           (GCompareFunc) libbalsa_address_compare)) {
        xmlFreeDoc(doc);
        return LBABERR_DUPLICATE;
     }
@@ -366,7 +366,7 @@ libbalsa_address_book_rubrica_modify_address(LibBalsaAddressBook * ab,
            gchar *full_name = xml_node_get_attr(card, CXMLCHARP("name"));
 
            if (full_name) {
-               found = !g_ascii_strcasecmp(address->full_name, full_name);
+               found = !g_ascii_strcasecmp(libbalsa_address_get_full_name(address), full_name);
                g_free(full_name);
            }
        }
@@ -415,8 +415,8 @@ static LibBalsaABErr
 lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
                      xmlDocPtr * docptr)
 {
-    LibBalsaAddressBookText *ab_text =
-        LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica);
+    LibBalsaAddressBook *ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica);
+    LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica);
     struct stat stat_buf;
     const gchar *path;
     int fd;
@@ -475,34 +475,36 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     for (list = ab_rubrica->item_list; list; list = list->next) {
        LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data);
        GList *l;
+        GList *addr_list;
 
        if (!address)
            continue;
 
-       if (address->address_list->next
-           && libbalsa_address_book_get_dist_list_mode(LIBBALSA_ADDRESS_BOOK(ab_rubrica))) {
+        addr_list = libbalsa_address_get_addr_list(address);
+       if (libbalsa_address_book_get_dist_list_mode(ab)
+            && addr_list != NULL && addr_list->next != NULL) {
            /* Create a group address. */
            InternetAddress *ia =
-               internet_address_group_new(address->full_name);
+               internet_address_group_new(libbalsa_address_get_full_name(address));
             InternetAddressGroup *group = (InternetAddressGroup *) ia;
 
-           for (l = address->address_list; l; l = l->next) {
+           for (l = addr_list; l != NULL; l = l->next) {
                InternetAddress *member =
                    internet_address_mailbox_new(NULL, l->data);
                internet_address_group_add_member(group, member);
                g_object_unref(member);
            }
-           cmp_data = completion_data_new(ia, address->nick_name);
+           cmp_data = completion_data_new(ia, libbalsa_address_get_nick_name(address));
            completion_list = g_list_prepend(completion_list, cmp_data);
            g_object_unref(ia);
        } else {
            /* Create name addresses. */
            GList *l;
 
-           for (l = address->address_list; l; l = l->next) {
+           for (l = addr_list; l != NULL; l = l->next) {
                InternetAddress *ia =
-                   internet_address_mailbox_new(address->full_name, l->data);
-               cmp_data = completion_data_new(ia, address->nick_name);
+                   internet_address_mailbox_new(libbalsa_address_get_full_name(address), l->data);
+               cmp_data = completion_data_new(ia, libbalsa_address_get_nick_name(address));
                completion_list =
                    g_list_prepend(completion_list, cmp_data);
                g_object_unref(ia);
@@ -527,25 +529,25 @@ lbab_insert_address_node(const LibBalsaAddress * address,
 
     /* create a new card */
     new_addr = xmlNewChild(parent, NULL, CXMLCHARP("Card"), NULL);
-    xmlNewProp(new_addr, CXMLCHARP("name"), CXMLCHARP(address->full_name));
+    xmlNewProp(new_addr, CXMLCHARP("name"), CXMLCHARP(libbalsa_address_get_full_name(address)));
 
     /* create the Data section of the card */
     new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Data"), NULL);
     xmlNewChild(new_data, NULL, CXMLCHARP("FirstName"),
-               CXMLCHARP(address->first_name));
+               CXMLCHARP(libbalsa_address_get_first_name(address)));
     xmlNewChild(new_data, NULL, CXMLCHARP("LastName"),
-               CXMLCHARP(address->last_name));
+               CXMLCHARP(libbalsa_address_get_last_name(address)));
     xmlNewChild(new_data, NULL, CXMLCHARP("NickName"),
-               CXMLCHARP(address->nick_name));
+               CXMLCHARP(libbalsa_address_get_nick_name(address)));
 
     /* create the Work section of the card */
     new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Work"), NULL);
     xmlNewChild(new_data, NULL, CXMLCHARP("Organization"),
-               CXMLCHARP(address->organization));
+               CXMLCHARP(libbalsa_address_get_organization(address)));
 
     /* create the Net section of the card */
     new_data = xmlNewChild(new_addr, NULL, CXMLCHARP("Net"), NULL);
-    for (l = address->address_list; l != NULL; l = l->next) {
+    for (l = libbalsa_address_get_addr_list(address); l != NULL; l = l->next) {
        xmlNodePtr new_mail =
            xmlNewChild(new_data, NULL, CXMLCHARP("Uri"),
                        CXMLCHARP(l->data));
@@ -581,25 +583,45 @@ extract_cards(xmlNodePtr card)
        if (!xmlStrcmp(card->name, CXMLCHARP("Card"))) {
            LibBalsaAddress *address = libbalsa_address_new();
            xmlNodePtr children;
+            gchar *full_name;
+            GList *address_list = NULL;
+
+            full_name = xml_node_get_attr(card, CXMLCHARP("name"));
+           libbalsa_address_set_full_name(address, full_name);
+            g_free(full_name);
 
-           address->full_name =
-               xml_node_get_attr(card, CXMLCHARP("name"));
            children = card->children;
            while (children) {
-               if (!xmlStrcmp(children->name, CXMLCHARP("Data")))
-                   extract_data(children->children, &address->first_name,
-                                &address->last_name, &address->nick_name);
-               else if (!xmlStrcmp(children->name, CXMLCHARP("Work")))
-                   extract_work(children->children,
-                                &address->organization);
-               else if (!xmlStrcmp(children->name, CXMLCHARP("Net")))
-                   extract_net(children->children,
-                               &address->address_list);
+               if (!xmlStrcmp(children->name, CXMLCHARP("Data"))) {
+                    gchar *first_name;
+                    gchar *last_name = NULL;
+                    gchar *nick_name = NULL;
+
+                   extract_data(children->children,
+                                 &first_name, &last_name, &nick_name);
+
+                    libbalsa_address_set_first_name(address, first_name);
+                    libbalsa_address_set_last_name(address, last_name);
+                    libbalsa_address_set_nick_name(address, nick_name);
+
+                    g_free(first_name);
+                    g_free(last_name);
+                    g_free(nick_name);
+                } else if (!xmlStrcmp(children->name, CXMLCHARP("Work"))) {
+                    gchar *organization = NULL;
+
+                   extract_work(children->children, &organization);
+                    libbalsa_address_set_organization(address, organization);
+                    g_free(organization);
+                } else if (!xmlStrcmp(children->name, CXMLCHARP("Net"))) {
+                   extract_net(children->children, &address_list);
+                    libbalsa_address_set_addr_list(address, address_list);
+                }
 
                children = children->next;
            }
 
-           if (address->address_list)
+           if (address_list != NULL)
                addrlist = g_slist_prepend(addrlist, address);
            else
                g_object_unref(address);
diff --git a/libbalsa/address-book-text.c b/libbalsa/address-book-text.c
index 0d714b0..3d06fe2 100644
--- a/libbalsa/address-book-text.c
+++ b/libbalsa/address-book-text.c
@@ -233,10 +233,10 @@ lbab_text_group_address(const gchar * group_name,
         GList *mailbox;
         LibBalsaAddress *address = LIBBALSA_ADDRESS(l->data);
 
-        for (mailbox = address->address_list; mailbox;
+        for (mailbox = libbalsa_address_get_addr_list(address); mailbox;
              mailbox = mailbox->next) {
             InternetAddress *member =
-                internet_address_mailbox_new(address->full_name,
+                internet_address_mailbox_new(libbalsa_address_get_full_name(address),
                                             mailbox->data);
             internet_address_group_add_member((InternetAddressGroup *)ia, member);
             g_object_unref(member);
@@ -258,13 +258,13 @@ lbab_text_item_compare(LibBalsaAddressBookTextItem * a,
     g_return_val_if_fail(a != NULL, -1);
     g_return_val_if_fail(b != NULL, 1);
 
-    if (!a->address)
+    if (a->address == NULL)
         return -1;
-    if (!b->address)
+    if (b->address == NULL)
         return 1;
 
-    return g_ascii_strcasecmp(a->address->full_name,
-                              b->address->full_name);
+    return g_ascii_strcasecmp(libbalsa_address_get_full_name(a->address),
+                              libbalsa_address_get_full_name(b->address));
 }
 
 /* Load the book from the stream */
@@ -273,6 +273,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
 {
     LibBalsaAddressBookTextPrivate *priv =
         libbalsa_address_book_text_get_instance_private(ab_text);
+    LibBalsaAddressBook *ab = ( LibBalsaAddressBook *) ab_text;
     LibBalsaABErr(*parse_address) (FILE * stream_in,
                                    LibBalsaAddress * address,
                                    FILE * stream_out,
@@ -322,33 +323,38 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
 #if MAKE_GROUP_BY_ORGANIZATION
         gchar **groups, **group;
 #endif                          /* MAKE_GROUP_BY_ORGANIZATION */
+        GList *addr_list;
+
         if (!address)
             continue;
 
-        if (address->address_list->next
-            && libbalsa_address_book_get_dist_list_mode(LIBBALSA_ADDRESS_BOOK(ab_text))) {
+        addr_list = libbalsa_address_get_addr_list(address);
+       if (libbalsa_address_book_get_dist_list_mode(ab)
+            && addr_list != NULL && addr_list->next != NULL) {
             /* Create a group address. */
             InternetAddress *ia =
-                internet_address_group_new(address->full_name);
+                internet_address_group_new(libbalsa_address_get_full_name(address));
             GList *l;
 
-            for (l = address->address_list; l; l = l->next) {
+            for (l = addr_list; l; l = l->next) {
                 InternetAddress *member =
                     internet_address_mailbox_new(NULL, l->data);
                 internet_address_group_add_member((InternetAddressGroup *)ia, member);
                 g_object_unref(member);
             }
-            cmp_data = completion_data_new(ia, address->nick_name);
+            cmp_data = completion_data_new(ia, libbalsa_address_get_nick_name(address));
             completion_list = g_list_prepend(completion_list, cmp_data);
             g_object_unref(ia);
         } else {
             /* Create name addresses. */
             GList *l;
 
-            for (l = address->address_list; l; l = l->next) {
+            for (l = addr_list; l; l = l->next) {
                 InternetAddress *ia =
-                    internet_address_mailbox_new(address->full_name, l->data);
-                cmp_data = completion_data_new(ia, address->nick_name);
+                    internet_address_mailbox_new(libbalsa_address_get_full_name(address),
+                                                 l->data);
+                cmp_data =
+                    completion_data_new(ia, libbalsa_address_get_nick_name(address));
                 completion_list =
                     g_list_prepend(completion_list, cmp_data);
                 g_object_unref(ia);
@@ -530,11 +536,14 @@ libbalsa_address_book_text_load(LibBalsaAddressBook * ab,
         if (!address)
             continue;
 
-        if (callback && (!filter_hi
-                         || lbab_text_starts_from(address->last_name,
-                                                  filter_hi)
-                         || lbab_text_starts_from(address->full_name,
-                                                  filter_hi)))
+        if (callback
+            && (!filter_hi
+                ||
+                lbab_text_starts_from(libbalsa_address_get_last_name
+                                      (address), filter_hi)
+                ||
+                lbab_text_starts_from(libbalsa_address_get_full_name
+                                      (address), filter_hi)))
             callback(ab, address, data);
     }
     if (callback)
diff --git a/libbalsa/address-book-vcard.c b/libbalsa/address-book-vcard.c
index 5b2ec15..270d97f 100644
--- a/libbalsa/address-book-vcard.c
+++ b/libbalsa/address-book-vcard.c
@@ -128,21 +128,25 @@ lbab_vcard_write_begin(FILE * stream)
 static void
 lbab_vcard_write_fn(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->full_name && *address->full_name != '\0')
-        fprintf(stream, "FN:%s\n", address->full_name);
+    const gchar *full_name = libbalsa_address_get_full_name(address);
+
+    if (full_name && *full_name != '\0')
+        fprintf(stream, "FN:%s\n", full_name);
 }
 
 static void
 lbab_vcard_write_n(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->first_name && *address->first_name != '\0') {
-        if (address->last_name && *address->last_name != '\0') {
-            fprintf(stream, "N:%s;%s\n", address->last_name,
-                    address->first_name);
+    const gchar *first_name = libbalsa_address_get_first_name(address);
+    const gchar *last_name = libbalsa_address_get_last_name(address);
+
+    if (first_name && *first_name != '\0') {
+        if (last_name && *last_name != '\0') {
+            fprintf(stream, "N:%s;%s\n", last_name, first_name);
         } else
-            fprintf(stream, "N:;%s\n", address->first_name);
-    } else if (address->last_name && *address->last_name != '\0') {
-        fprintf(stream, "N:%s\n", address->last_name);
+            fprintf(stream, "N:;%s\n", first_name);
+    } else if (last_name && *last_name != '\0') {
+        fprintf(stream, "N:%s\n", last_name);
     } else
         fprintf(stream, "N:%s\n", _("No-Name"));
 }
@@ -150,15 +154,19 @@ lbab_vcard_write_n(FILE * stream, LibBalsaAddress * address)
 static void
 lbab_vcard_write_nickname(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->nick_name && *address->nick_name != '\0')
-        fprintf(stream, "NICKNAME:%s\n", address->nick_name);
+    const gchar *nick_name = libbalsa_address_get_nick_name(address);
+
+    if (nick_name && *nick_name != '\0')
+        fprintf(stream, "NICKNAME:%s\n", nick_name);
 }
 
 static void
 lbab_vcard_write_org(FILE * stream, LibBalsaAddress * address)
 {
-    if (address->organization && *address->organization != '\0')
-        fprintf(stream, "ORG:%s\n", address->organization);
+    const gchar *organization = libbalsa_address_get_organization(address);
+
+    if (organization && *organization != '\0')
+        fprintf(stream, "ORG:%s\n", organization);
 }
 
 static void
@@ -166,7 +174,8 @@ lbab_vcard_write_addresses(FILE * stream, LibBalsaAddress * address)
 {
     GList *list;
 
-    for (list = address->address_list; list; list = list->next)
+    for (list = libbalsa_address_get_addr_list(address);
+         list != NULL; list = list->next)
         fprintf(stream, "EMAIL;INTERNET:%s\n", (gchar *) list->data);
 }
 
@@ -201,7 +210,7 @@ libbalsa_address_book_vcard_parse_address(FILE * stream,
     gchar *name = NULL, *nick_name = NULL, *org = NULL;
     gchar *full_name = NULL, *last_name = NULL, *first_name = NULL;
     gint in_vcard = FALSE;
-    GList *address_list = NULL;
+    GList *addr_list = NULL;
     guint wrote = 0;
 
     while (fgets(string, sizeof(string), stream)) {
@@ -220,7 +229,7 @@ libbalsa_address_book_vcard_parse_address(FILE * stream,
             /*
              * We are done loading a card.
              */
-           if (address_list) {
+           if (addr_list) {
                 if (stream_out) {
                     if (!(wrote & (1 << FULL_NAME)))
                         lbab_vcard_write_fn(stream_out, address_out);
@@ -234,25 +243,33 @@ libbalsa_address_book_vcard_parse_address(FILE * stream,
                     res = lbab_vcard_write_end(stream_out);
                 }
                 if (address) {
-                    if (full_name) {
-                        address->full_name = full_name;
-                        g_free(name);
-                    } else if (name)
-                        address->full_name = name;
+                    if (full_name)
+                        libbalsa_address_set_full_name(address, full_name);
+                    else if (name)
+                        libbalsa_address_set_full_name(address, name);
                     else if (nick_name)
-                        address->full_name = g_strdup(nick_name);
+                        libbalsa_address_set_full_name(address, nick_name);
                     else
-                        address->full_name = g_strdup(_("No-Name"));
-
-                    address->last_name = last_name;
-                    address->first_name = first_name;
-                    address->nick_name = nick_name;
-                    address->organization = org;
-                    address->address_list = g_list_reverse(address_list);
-
-                    return LBABERR_OK;
+                        libbalsa_address_set_full_name(address, _("No-Name"));
+
+                    libbalsa_address_set_last_name(address, last_name);
+                    libbalsa_address_set_first_name(address, first_name);
+                    libbalsa_address_set_nick_name(address, nick_name);
+                    libbalsa_address_set_organization(address, org);
+                    libbalsa_address_set_addr_list(address,
+                                                   g_list_reverse(addr_list));
+
+                    res = LBABERR_OK;
+                    g_free(full_name);
+                    g_free(name);
+                    g_free(last_name);
+                    g_free(first_name);
+                    g_free(nick_name);
+                    g_free(org);
+
+                    return res;
                 }
-                g_list_free_full(address_list, g_free);
+                g_list_free_full(addr_list, g_free);
            }
             /* Record without e-mail address, or we're not creating
              * addresses: free memory. */
@@ -320,8 +337,7 @@ libbalsa_address_book_vcard_parse_address(FILE * stream,
        if (g_ascii_strncasecmp(string, "EMAIL", 5) == 0) {
            gchar *ptr = strchr(string + 5, ':');
            if (ptr) {
-               address_list =
-                   g_list_prepend(address_list, g_strdup(ptr + 1));
+               addr_list = g_list_prepend(addr_list, g_strdup(ptr + 1));
            }
            continue;
        }
diff --git a/libbalsa/address-book.c b/libbalsa/address-book.c
index 5408649..70e446c 100644
--- a/libbalsa/address-book.c
+++ b/libbalsa/address-book.c
@@ -243,17 +243,6 @@ libbalsa_address_book_alias_complete(LibBalsaAddressBook * ab,
 }
 
 
-gboolean libbalsa_address_is_dist_list(const LibBalsaAddressBook *ab,
-                                      const LibBalsaAddress *address)
-{
-    LibBalsaAddressBookPrivate *priv =
-        libbalsa_address_book_get_instance_private((LibBalsaAddressBook *) ab);
-
-    return (priv->dist_list_mode && g_list_length(address->address_list)>1);
-}
-
-
-
 static void
 libbalsa_address_book_real_save_config(LibBalsaAddressBook * ab,
                                       const gchar * group)
diff --git a/libbalsa/address-book.h b/libbalsa/address-book.h
index cf9c966..df75d80 100644
--- a/libbalsa/address-book.h
+++ b/libbalsa/address-book.h
@@ -118,8 +118,6 @@ const gchar* libbalsa_address_book_strerror(LibBalsaAddressBook * ab,
 */
 GList *libbalsa_address_book_alias_complete(LibBalsaAddressBook * ab, 
                                            const gchar *prefix);
-gboolean libbalsa_address_is_dist_list(const LibBalsaAddressBook *ab,
-                                      const LibBalsaAddress *address);
 
 /*
  * Getters
diff --git a/libbalsa/address.c b/libbalsa/address.c
index e70cd46..c3e6a0f 100644
--- a/libbalsa/address.c
+++ b/libbalsa/address.c
@@ -29,47 +29,55 @@
 #include "misc.h"
 #include <glib/gi18n.h>
 
-static GObjectClass *parent_class;
-
 static void libbalsa_address_class_init(LibBalsaAddressClass * klass);
 static void libbalsa_address_init(LibBalsaAddress * ab);
 static void libbalsa_address_finalize(GObject * object);
 
 static gchar ** vcard_strsplit(const gchar * string);
 
-GType libbalsa_address_get_type(void)
-{
-    static GType address_type = 0;
-
-    if (!address_type) {
-       static const GTypeInfo address_info = {
-           sizeof(LibBalsaAddressClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_address_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaAddress),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_address_init
-       };
-
-       address_type =
-           g_type_register_static(G_TYPE_OBJECT,
-                                  "LibBalsaAddress",
-                                   &address_info, 0);
-    }
+/* General address structure to be used with address books.
+*/
+struct _LibBalsaAddress {
+    GObject parent;
+
+    /*
+     * ID
+     * VCard FN: Field
+     * LDAP/LDIF: xmozillanickname
+     */
+    gchar *nick_name;
+
+    /* First and last names
+     * VCard: parsed from N: field
+     * LDAP/LDIF: cn, givenName, surName.
+     */
+    gchar *full_name;
+    gchar *first_name;
+    gchar *last_name;
+
+    /* Organisation
+     * VCard: ORG: field
+     * ldif: o: attribute.
+     */
+    gchar *organization;
+
+    /* Email addresses
+     * A list of mailboxes, ie. user@domain.
+     */
+    GList *addr_list;
+};
 
-    return address_type;
-}
+struct _LibBalsaAddressClass {
+    GObjectClass parent_class;
+};
+
+G_DEFINE_TYPE(LibBalsaAddress, libbalsa_address, G_TYPE_OBJECT)
 
 static void
 libbalsa_address_class_init(LibBalsaAddressClass * klass)
 {
     GObjectClass *object_class;
 
-    parent_class = g_type_class_peek_parent(klass);
-
     object_class = G_OBJECT_CLASS(klass);
     object_class->finalize = libbalsa_address_finalize;
 }
@@ -82,7 +90,7 @@ libbalsa_address_init(LibBalsaAddress * addr)
     addr->first_name = NULL;
     addr->last_name = NULL;
     addr->organization = NULL;
-    addr->address_list = NULL;
+    addr->addr_list = NULL;
 }
 
 static void
@@ -100,9 +108,9 @@ libbalsa_address_finalize(GObject * object)
     g_free(addr->last_name);
     g_free(addr->organization);
 
-    g_list_free_full(addr->address_list, g_free);
+    g_list_free_full(addr->addr_list, g_free);
 
-    G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_address_parent_class)->finalize(object);
 }
 
 LibBalsaAddress *
@@ -327,7 +335,7 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
     gchar *name = NULL, *nick_name = NULL, *org = NULL;
     gchar *full_name = NULL, *last_name = NULL, *first_name = NULL;
     gint in_vcard = FALSE;
-    GList *address_list = NULL;
+    GList *addr_list = NULL;
     const gchar *string, *next_line;
     gchar * vcard;
 
@@ -386,7 +394,7 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
                 */
                LibBalsaAddress *address;
 
-               if (!address_list)
+               if (!addr_list)
                     break;
 
                address = g_object_new(LIBBALSA_TYPE_ADDRESS, NULL);
@@ -405,7 +413,7 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
                 address->first_name = first_name;
                 address->nick_name = nick_name;
                 address->organization = org;
-                address->address_list = g_list_reverse(address_list);
+                address->addr_list = g_list_reverse(addr_list);
 
                 return address;
             }
@@ -498,8 +506,8 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
 
             } else if (g_ascii_strncasecmp(line, "EMAIL:", 6) == 0) {
 
-               address_list =
-                   g_list_prepend(address_list, g_strdup(line + 6));
+               addr_list =
+                   g_list_prepend(addr_list, g_strdup(line + 6));
             }
             g_free(line);
         }
@@ -511,7 +519,7 @@ libbalsa_address_new_from_vcard(const gchar *str, const gchar *charset)
     g_free(first_name);
     g_free(nick_name);
     g_free(org);
-    g_list_free_full(address_list, g_free);
+    g_list_free_full(addr_list, g_free);
 
     return NULL;
 }
@@ -534,12 +542,12 @@ libbalsa_address_set_copy(LibBalsaAddress * dest, LibBalsaAddress * src)
     dest->last_name = g_strdup(src->last_name);
     g_free(dest->organization);
     dest->organization = g_strdup(src->organization);
-    g_list_free_full(dest->address_list, g_free);
+    g_list_free_full(dest->addr_list, g_free);
 
     dst_al = NULL;
-    for (src_al = src->address_list; src_al; src_al = src_al->next)
+    for (src_al = src->addr_list; src_al; src_al = src_al->next)
         dst_al = g_list_prepend(dst_al, g_strdup(src_al->data));
-    dest->address_list = g_list_reverse(dst_al);
+    dest->addr_list = g_list_reverse(dst_al);
 }
 
 static gchar *
@@ -588,16 +596,16 @@ libbalsa_address_to_gchar(LibBalsaAddress * address, gint n)
 
     g_return_val_if_fail(LIBBALSA_IS_ADDRESS(address), NULL);
 
-    if(!address->address_list)
+    if (address->addr_list == NULL)
         return NULL;
-    if(n==-1) {
-        if(address->address_list->next)
-            retc = rfc2822_group(address->full_name, address->address_list);
+    if (n == -1) {
+        if (address->addr_list->next != NULL)
+            retc = rfc2822_group(address->full_name, address->addr_list);
         else
             retc = rfc2822_mailbox(address->full_name,
-                                   address->address_list->data);
+                                   address->addr_list->data);
     } else {
-       const gchar *mailbox = g_list_nth_data(address->address_list, n);
+       const gchar *mailbox = g_list_nth_data(address->addr_list, n);
        g_return_val_if_fail(mailbox != NULL, NULL);
 
        retc = rfc2822_mailbox(address->full_name, mailbox);
@@ -608,19 +616,19 @@ libbalsa_address_to_gchar(LibBalsaAddress * address, gint n)
 
 /* Helper */
 static const gchar *
-lba_get_name_or_mailbox(InternetAddressList * address_list,
+lba_get_name_or_mailbox(InternetAddressList * addr_list,
                         gboolean get_name, gboolean in_group)
 {
     const gchar *retval = NULL;
     InternetAddress *ia;
     gint i, len;
 
-    if (address_list == NULL)
+    if (addr_list == NULL)
        return NULL;
 
-    len = internet_address_list_length(address_list);
+    len = internet_address_list_length(addr_list);
     for (i = 0; i < len; i++) {
-        ia = internet_address_list_get_address (address_list, i);
+        ia = internet_address_list_get_address (addr_list, i);
 
         if (get_name && ia->name && *ia->name)
             return ia->name;
@@ -643,30 +651,30 @@ lba_get_name_or_mailbox(InternetAddressList * address_list,
 
 /* Get either a name or a mailbox from an InternetAddressList. */
 const gchar *
-libbalsa_address_get_name_from_list(InternetAddressList *address_list)
+libbalsa_address_get_name_from_list(InternetAddressList *addr_list)
 {
-    return lba_get_name_or_mailbox(address_list, TRUE, FALSE);
+    return lba_get_name_or_mailbox(addr_list, TRUE, FALSE);
 }
 
 /* Get a mailbox from an InternetAddressList. */
 const gchar *
-libbalsa_address_get_mailbox_from_list(InternetAddressList *address_list)
+libbalsa_address_get_mailbox_from_list(InternetAddressList *addr_list)
 {
-    return lba_get_name_or_mailbox(address_list, FALSE, FALSE);
+    return lba_get_name_or_mailbox(addr_list, FALSE, FALSE);
 }
 
 /* Number of individual mailboxes in an InternetAddressList. */
 gint
-libbalsa_address_n_mailboxes_in_list(InternetAddressList * address_list)
+libbalsa_address_n_mailboxes_in_list(InternetAddressList * addr_list)
 {
     gint i, len, n_mailboxes = 0;
 
-    g_return_val_if_fail(IS_INTERNET_ADDRESS_LIST(address_list), -1);
+    g_return_val_if_fail(IS_INTERNET_ADDRESS_LIST(addr_list), -1);
 
-    len = internet_address_list_length(address_list);
+    len = internet_address_list_length(addr_list);
     for (i = 0; i < len; i++) {
         const InternetAddress *ia =
-            internet_address_list_get_address(address_list, i);
+            internet_address_list_get_address(addr_list, i);
 
         if (INTERNET_ADDRESS_IS_MAILBOX(ia))
             ++n_mailboxes;
@@ -701,9 +709,9 @@ libbalsa_address_set_edit_entries(const LibBalsaAddress * address,
     GtkTreeIter iter;
 
     new_email = g_strdup(address
-                         && address->address_list
-                         && address->address_list->data ?
-                         address->address_list->data : "");
+                         && address->addr_list
+                         && address->addr_list->data ?
+                         address->addr_list->data : "");
     /* initialize the organization... */
     if (!address || address->organization == NULL)
        new_organization = g_strdup("");
@@ -765,7 +773,7 @@ libbalsa_address_set_edit_entries(const LibBalsaAddress * address,
     if (address) {
         GList *list;
 
-        for (list = address->address_list; list; list = list->next) {
+        for (list = address->addr_list; list; list = list->next) {
             gtk_list_store_append(store, &iter);
             gtk_list_store_set(store, &iter, 0, list->data, -1);
         }
@@ -816,7 +824,7 @@ lba_cell_edited(GtkCellRendererText * cell, const gchar * path_string,
 }
 
 static GtkWidget *
-lba_address_list_widget(GCallback changed_cb, gpointer changed_data)
+lba_addr_list_widget(GCallback changed_cb, gpointer changed_data)
 {
     GtkListStore *store;
     GtkWidget *tree_view;
@@ -886,12 +894,12 @@ addrlist_drag_received_cb(GtkWidget        * widget,
         if (target == g_intern_static_string("x-application/x-addr")) {
             addr = *(LibBalsaAddress **) gtk_selection_data_get_data(selection_data);
 
-            if (addr != NULL && addr->address_list != NULL) {
-                g_print ("string: %s\n", (gchar*) addr->address_list->data);
+            if (addr != NULL && addr->addr_list != NULL) {
+                g_print ("string: %s\n", (gchar*) addr->addr_list->data);
                 gtk_list_store_insert_with_values(GTK_LIST_STORE(model),
                                                   &iter, 99999,
                                                   0,
-                                                  addr->address_list->data,
+                                                  addr->addr_list->data,
                                                   -1);
                 dnd_success = TRUE;
             }
@@ -983,7 +991,7 @@ libbalsa_address_get_edit_widget(const LibBalsaAddress *address,
             GtkWidget *but = gtk_button_new_with_mnemonic(_("A_dd"));
             GdkContentFormats *formats;
 
-            entries[cnt] = lba_address_list_widget(changed_cb,
+            entries[cnt] = lba_addr_list_widget(changed_cb,
                                                    changed_data);
             gtk_box_pack_start(GTK_BOX(box), label);
             gtk_box_pack_start(GTK_BOX(box), but);
@@ -1084,7 +1092,124 @@ libbalsa_address_new_from_edit_entries(GtkWidget ** entries)
         if (email && *email)
             list = g_list_prepend(list, email);
     }
-    address->address_list = g_list_reverse(list);
+    address->addr_list = g_list_reverse(list);
 
     return address;
 }
+
+/*
+ * Comparison func
+ */
+
+gint
+libbalsa_address_compare(LibBalsaAddress *a, LibBalsaAddress *b)
+{
+    g_return_val_if_fail(a != NULL, -1);
+    g_return_val_if_fail(b != NULL, 1);
+
+    return g_ascii_strcasecmp(a->full_name, b->full_name);
+}
+
+/*
+ * Getters
+ */
+
+const gchar *
+libbalsa_address_get_full_name(const LibBalsaAddress * address)
+{
+    return address->full_name;
+}
+
+const gchar *
+libbalsa_address_get_first_name(const LibBalsaAddress * address)
+{
+    return address->first_name;
+}
+
+const gchar *
+libbalsa_address_get_last_name(const LibBalsaAddress * address)
+{
+    return address->last_name;
+}
+
+const gchar *
+libbalsa_address_get_nick_name(const LibBalsaAddress * address)
+{
+    return address->nick_name;
+}
+
+const gchar *
+libbalsa_address_get_organization(const LibBalsaAddress * address)
+{
+    return address->organization;
+}
+
+const gchar *
+libbalsa_address_get_addr(const LibBalsaAddress * address)
+{
+    return address->addr_list != NULL ? address->addr_list->data : NULL;
+}
+
+GList *
+libbalsa_address_get_addr_list(const LibBalsaAddress * address)
+{
+    return address->addr_list;
+}
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_address_set_full_name(LibBalsaAddress * address,
+                               const gchar     * full_name)
+{
+    g_free(address->full_name);
+    address->full_name = g_strdup(full_name);
+}
+
+void
+libbalsa_address_set_first_name(LibBalsaAddress * address,
+                                const gchar     * first_name)
+{
+    g_free(address->first_name);
+    address->first_name = g_strdup(first_name);
+}
+
+void
+libbalsa_address_set_last_name(LibBalsaAddress * address,
+                               const gchar     * last_name)
+{
+    g_free(address->last_name);
+    address->last_name = g_strdup(last_name);
+}
+
+void
+libbalsa_address_set_nick_name(LibBalsaAddress * address,
+                               const gchar     * nick_name)
+{
+    g_free(address->nick_name);
+    address->nick_name = g_strdup(nick_name);
+}
+
+void
+libbalsa_address_set_organization(LibBalsaAddress * address,
+                                  const gchar     * organization)
+{
+    g_free(address->organization);
+    address->organization = g_strdup(organization);
+}
+
+void
+libbalsa_address_set_addr_list(LibBalsaAddress * address,
+                               GList           * addr_list)
+{
+    g_list_free_full(address->addr_list, g_free);
+    address->addr_list = addr_list;
+}
+
+void libbalsa_address_add_addr(LibBalsaAddress * address,
+                               const gchar     * addr)
+{
+    address->addr_list = g_list_prepend(address->addr_list, g_strdup(addr));
+}
diff --git a/libbalsa/address.h b/libbalsa/address.h
index e88a462..f92c1ed 100644
--- a/libbalsa/address.h
+++ b/libbalsa/address.h
@@ -21,17 +21,11 @@
 #ifndef __LIBBALSA_ADDRESS_H__
 #define __LIBBALSA_ADDRESS_H__
 
-#include <gtk/gtk.h>
 #include <gmime/gmime.h>
+#include <gtk/gtk.h>
 
-#define LIBBALSA_TYPE_ADDRESS                          (libbalsa_address_get_type())
-#define LIBBALSA_ADDRESS(obj)                          (G_TYPE_CHECK_INSTANCE_CAST (obj, 
LIBBALSA_TYPE_ADDRESS, LibBalsaAddress))
-#define LIBBALSA_ADDRESS_CLASS(klass)                  (G_TYPE_CHECK_CLASS_CAST (klass, 
LIBBALSA_TYPE_ADDRESS, LibBalsaAddressClass))
-#define LIBBALSA_IS_ADDRESS(obj)                       (G_TYPE_CHECK_INSTANCE_TYPE (obj, 
LIBBALSA_TYPE_ADDRESS))
-#define LIBBALSA_IS_ADDRESS_CLASS(klass)               (G_TYPE_CHECK_CLASS_TYPE (klass, 
LIBBALSA_TYPE_ADDRESS))
-
-typedef struct _LibBalsaAddress LibBalsaAddress;
-typedef struct _LibBalsaAddressClass LibBalsaAddressClass;
+#define LIBBALSA_TYPE_ADDRESS (libbalsa_address_get_type())
+G_DECLARE_FINAL_TYPE(LibBalsaAddress, libbalsa_address, LIBBALSA, ADDRESS, GObject)
 
 typedef enum _LibBalsaAddressField LibBalsaAddressField;
 
@@ -45,44 +39,6 @@ enum _LibBalsaAddressField {
     NUM_FIELDS
 };
 
-/* General address structure to be used with address books.
-*/
-struct _LibBalsaAddress {
-    GObject parent;
-
-    /*
-     * ID
-     * VCard FN: Field
-     * LDAP/LDIF: xmozillanickname
-     */
-    gchar *nick_name;
-
-    /* First and last names
-     * VCard: parsed from N: field
-     * LDAP/LDIF: cn, givenName, surName.
-     */
-    gchar *full_name;
-    gchar *first_name;
-    gchar *last_name;
-
-    /* Organisation
-     * VCard: ORG: field
-     * ldif: o: attribute.
-     */
-    gchar *organization;
-
-    /* Email addresses
-     * A list of mailboxes, ie. user@domain.
-     */
-    GList *address_list;
-};
-
-struct _LibBalsaAddressClass {
-    GObjectClass parent_class;
-};
-
-GType libbalsa_address_get_type(void);
- 
 LibBalsaAddress *libbalsa_address_new(void);
 LibBalsaAddress *libbalsa_address_new_from_vcard(const gchar *str,
                                                 const gchar *charset);
@@ -94,11 +50,11 @@ void libbalsa_address_set_copy(LibBalsaAddress *dest, LibBalsaAddress *src);
 gchar *libbalsa_address_to_gchar(LibBalsaAddress * address, gint n);
 
 const gchar *libbalsa_address_get_name_from_list(InternetAddressList
-                                                 * address_list);
+                                                 * addr_list);
 const gchar *libbalsa_address_get_mailbox_from_list(InternetAddressList *
-                                                    address_list);
+                                                    addr_list);
 gint libbalsa_address_n_mailboxes_in_list(InternetAddressList *
-                                          address_list);
+                                          addr_list);
 
 /* =================================================================== */
 /*                                UI PART                              */
@@ -129,4 +85,42 @@ GtkWidget *libbalsa_address_get_edit_widget(const LibBalsaAddress *addr,
                                             GCallback changed_cb,
                                             gpointer changed_data);
 LibBalsaAddress *libbalsa_address_new_from_edit_entries(GtkWidget **widget);
+
+/*
+ * Comparison func
+ */
+gint libbalsa_address_compare(LibBalsaAddress *a,
+                              LibBalsaAddress *b);
+
+/*
+ * Getters
+ */
+
+const gchar * libbalsa_address_get_full_name   (const LibBalsaAddress * address);
+const gchar * libbalsa_address_get_first_name  (const LibBalsaAddress * address);
+const gchar * libbalsa_address_get_last_name   (const LibBalsaAddress * address);
+const gchar * libbalsa_address_get_nick_name   (const LibBalsaAddress * address);
+const gchar * libbalsa_address_get_organization(const LibBalsaAddress * address);
+const gchar * libbalsa_address_get_addr        (const LibBalsaAddress * address);
+GList       * libbalsa_address_get_addr_list   (const LibBalsaAddress * address);
+
+/*
+ * Setters
+ */
+
+void libbalsa_address_set_full_name   (LibBalsaAddress * address,
+                                       const gchar     * full_name);
+void libbalsa_address_set_first_name  (LibBalsaAddress * address,
+                                       const gchar     * first_name);
+void libbalsa_address_set_last_name   (LibBalsaAddress * address,
+                                       const gchar     * last_name);
+void libbalsa_address_set_nick_name   (LibBalsaAddress * address,
+                                       const gchar     * nick_name);
+void libbalsa_address_set_organization(LibBalsaAddress * address,
+                                       const gchar     * organization);
+void libbalsa_address_set_addr_list   (LibBalsaAddress * address,
+                                       GList           * addr_list);
+void libbalsa_address_add_addr        (LibBalsaAddress * address,
+                                       const gchar     * addr);
+
 #endif                         /* __LIBBALSA_ADDRESS_H__ */
diff --git a/libbalsa/rfc2445.c b/libbalsa/rfc2445.c
index ce2009a..e2af541 100644
--- a/libbalsa/rfc2445.c
+++ b/libbalsa/rfc2445.c
@@ -485,10 +485,12 @@ libbalsa_vevent_reply(const LibBalsaVEvent * event, const gchar * sender,
                           pstats[(int) new_stat].str_2445, sender);
     if (event->uid)
        g_string_append_printf(retval, "UID:%s\n", event->uid);
-    if (event->organizer && event->organizer->address_list)
-       g_string_append_printf(retval, "ORGANIZER:mailto:%s\n";,
-                              (gchar *) event->organizer->address_list->
-                              data);
+    if (event->organizer != NULL) {
+        const gchar *addr = libbalsa_address_get_addr(event->organizer);
+
+        if (addr != NULL)
+            g_string_append_printf(retval, "ORGANIZER:mailto:%s\n";, addr);
+    }
     if (event->summary) {
        buf = text_2445_escape(event->summary);
        g_string_append_printf(retval, "SUMMARY:%s\n", buf);
@@ -630,7 +632,7 @@ cal_address_2445_to_lbaddress(const gchar * uri, gchar ** attributes,
        return NULL;
 
     retval = libbalsa_address_new();
-    retval->address_list = g_list_prepend(NULL, g_strdup(uri + 7));
+    libbalsa_address_add_addr(retval, uri + 7);
     if (!is_organizer)
        g_object_set_data(G_OBJECT(retval), RFC2445_ROLE,
                          LB_ROLE2PTR(VCAL_ROLE_REQ_PART));
@@ -642,7 +644,7 @@ cal_address_2445_to_lbaddress(const gchar * uri, gchar ** attributes,
        /* scan attributes for extra information */
        for (n = 0; (the_attr = attributes[n]); n++) {
            if (!g_ascii_strncasecmp(the_attr, "CN=", 3))
-               retval->full_name = g_strdup(the_attr + 3);
+               libbalsa_address_set_full_name(retval, the_attr + 3);
            else if (!g_ascii_strncasecmp(the_attr, "ROLE=", 5))
                g_object_set_data(G_OBJECT(retval), RFC2445_ROLE,
                                  LB_ROLE2PTR(vcal_str_to_role(the_attr + 5)));
diff --git a/libbalsa/rfc6350.c b/libbalsa/rfc6350.c
index 81574d9..c6652e5 100644
--- a/libbalsa/rfc6350.c
+++ b/libbalsa/rfc6350.c
@@ -103,10 +103,10 @@ rfc6350_parse_from_stream(GDataInputStream *stream,
 
        /* ignore items without an Email address, fill empty full name if necessary */
        if (result != NULL) {
-               if (result->address_list == NULL) {
+               if (libbalsa_address_get_addr_list(result) == NULL) {
                         g_clear_object(&result);
-               } else if (result->full_name == NULL) {
-                       result->full_name = g_strdup(_("No-Name"));
+               } else if (libbalsa_address_get_full_name(result) == NULL) {
+                        libbalsa_address_set_full_name(result, _("No-Name"));
                }
        }
 
@@ -269,42 +269,30 @@ rfc6350_eval_line(gchar                     *line,
                        g_debug("%s: line='%s' name='%s', value='%s'", __func__, line, name, value);
                        if (g_ascii_strcasecmp(name, "FN") == 0) {
                                rfc6350_unescape(value);
-                               g_free(address->full_name);
-                               address->full_name = g_strdup(value);
+                                libbalsa_address_set_full_name(address, value);
                        } else if (g_ascii_strcasecmp(name, "N") == 0) {
                                gchar **n_items;
 
                                n_items = rfc6350_strsplit(value, 5U);
-                               g_free(address->first_name);
-                               g_free(address->last_name);
-                               if (n_items[1] != NULL) {
-                                       address->first_name = g_strdup(n_items[1]);
-                               } else {
-                                       address->first_name = NULL;
-                               }
-                               if (n_items[0] != NULL) {
-                                       address->last_name = g_strdup(n_items[0]);
-                               } else {
-                                       address->last_name = NULL;
-                               }
-                               if (address->full_name == NULL) {
-                                       address->full_name = rfc6350_fn_from_n(n_items);
+                                libbalsa_address_set_first_name(address, n_items[1]);
+                                libbalsa_address_set_last_name(address, n_items[0]);
+                               if (libbalsa_address_get_full_name(address) == NULL) {
+                                        libbalsa_address_set_full_name
+                                            (address, rfc6350_fn_from_n(n_items));
                                }
                                g_strfreev(n_items);
                        } else if (g_ascii_strcasecmp(name, "NICKNAME") == 0) {
                                rfc6350_unescape(value);
-                               g_free(address->nick_name);
-                               address->nick_name = g_strdup(value);
+                                libbalsa_address_set_nick_name(address, value);
                        } else if (g_ascii_strcasecmp(name, "ORG") == 0) {
                                gchar **n_items;
 
                                n_items = rfc6350_strsplit(value, 2U);
-                               g_free(address->organization);
-                               address->organization = g_strdup(n_items[0]);
+                                libbalsa_address_set_organization(address, n_items[0]);
                                g_strfreev(n_items);
                        } else if (g_ascii_strcasecmp(name, "EMAIL") == 0) {
                                rfc6350_unescape(value);
-                               address->address_list = g_list_prepend(address->address_list, 
g_strdup(value));
+                                libbalsa_address_add_addr(address, value);
                        } else {
                                /* ignore any other items */
                        }
diff --git a/src/ab-main.c b/src/ab-main.c
index 43d0372..13bd0d8 100644
--- a/src/ab-main.c
+++ b/src/ab-main.c
@@ -123,19 +123,23 @@ bab_load_cb(LibBalsaAddressBook *libbalsa_ab,
             LibBalsaAddress *address, GtkTreeModel *model)
 {
     GtkTreeIter iter;
+    GList *addr_list;
 
     g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(libbalsa_ab));
 
     if (address == NULL)
        return;
 
-    if (libbalsa_address_is_dist_list(libbalsa_ab, address)) {
+    addr_list = libbalsa_address_get_addr_list(address);
+    if (libbalsa_address_book_get_dist_list_mode(libbalsa_ab)
+        && addr_list != NULL && addr_list->next != NULL) {
         gchar *address_string = libbalsa_address_to_gchar(address, -1);
 
         gtk_list_store_prepend(GTK_LIST_STORE(model), &iter);
         /* GtkListStore refs address, and unrefs it when cleared  */
         gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-                           LIST_COLUMN_NAME, address->full_name,
+                           LIST_COLUMN_NAME,
+                           libbalsa_address_get_full_name(address),
                            LIST_COLUMN_ADDRSPEC, address_string,
                            LIST_COLUMN_ADDRESS, address,
                            -1);
@@ -144,13 +148,14 @@ bab_load_cb(LibBalsaAddressBook *libbalsa_ab,
     } else {
         GList *l;
 
-       for (l = address->address_list; l; l = l->next) {
+       for (l = addr_list; l != NULL; l = l->next) {
             gtk_list_store_prepend(GTK_LIST_STORE(model), &iter);
             /* GtkListStore refs address once for each address in
              * the list, and unrefs it the same number of times when
              * cleared */
             gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-                               LIST_COLUMN_NAME, address->full_name,
+                               LIST_COLUMN_NAME,
+                               libbalsa_address_get_full_name(address),
                                LIST_COLUMN_ADDRSPEC, l->data,
                                LIST_COLUMN_ADDRESS, address,
                                -1);
diff --git a/src/ab-window.c b/src/ab-window.c
index a095c47..4fd0884 100644
--- a/src/ab-window.c
+++ b/src/ab-window.c
@@ -758,8 +758,9 @@ balsa_ab_window_load_cb(LibBalsaAddressBook *libbalsa_ab,
 {
     GtkTreeModel *model;
     GtkTreeIter iter;
-    GList *address_list;
+    GList *addr_list;
     gint count;
+    const gchar *full_name;
 
     g_return_if_fail ( BALSA_IS_AB_WINDOW(ab));
     g_return_if_fail ( LIBBALSA_IS_ADDRESS_BOOK(libbalsa_ab) );
@@ -767,14 +768,18 @@ balsa_ab_window_load_cb(LibBalsaAddressBook *libbalsa_ab,
     if ( address == NULL )
        return;
 
+    full_name = libbalsa_address_get_full_name(address);
     model = gtk_tree_view_get_model(GTK_TREE_VIEW(ab->address_list));
-    if ( libbalsa_address_is_dist_list(libbalsa_ab, address) ) {
+
+    addr_list = libbalsa_address_get_addr_list(address);
+    if (libbalsa_address_book_get_dist_list_mode(libbalsa_ab)
+        && addr_list != NULL && addr_list->next != NULL) {
         gchar *address_string = libbalsa_address_to_gchar(address, -1);
 
         gtk_list_store_prepend(GTK_LIST_STORE(model), &iter);
         /* GtkListStore refs address, and unrefs it when cleared  */
         gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-                           LIST_COLUMN_NAME, address->full_name,
+                           LIST_COLUMN_NAME, full_name,
                            LIST_COLUMN_ADDRESS_STRING, address_string,
                            LIST_COLUMN_ADDRESS, address,
                            LIST_COLUMN_WHICH, -1,
@@ -782,22 +787,21 @@ balsa_ab_window_load_cb(LibBalsaAddressBook *libbalsa_ab,
 
        g_free(address_string);
     } else {
-       address_list = address->address_list;
        count = 0;
-       while ( address_list ) {
+       while (addr_list) {
             gtk_list_store_prepend(GTK_LIST_STORE(model), &iter);
             /* GtkListStore refs address once for each address in
              * the list, and unrefs it the same number of times when
              * cleared */
             gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-                               LIST_COLUMN_NAME, address->full_name,
+                               LIST_COLUMN_NAME, full_name,
                                LIST_COLUMN_ADDRESS_STRING,
-                               address_list->data,
+                               addr_list->data,
                                LIST_COLUMN_ADDRESS, address,
                                LIST_COLUMN_WHICH, count,
                                -1);
 
-           address_list = address_list->next;
+           addr_list = addr_list->next;
            count++;
        }
     }
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index efb4598..3be4587 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -1271,16 +1271,16 @@ bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
                     gchar *ptr, size_t len)
 {
     BalsaMimeWidget *mw;
-    LibBalsaAddress *addr;
+    LibBalsaAddress *address;
     GtkWidget *widget;
     GtkGrid *grid;
     GtkWidget *w;
     int row = 1;
 
-    addr =
+    address =
         libbalsa_address_new_from_vcard(ptr, mime_body->charset ?
                                         mime_body-> charset : "us-ascii");
-    if (!addr)
+    if (address == NULL)
         return NULL;
 
     mw = g_object_new(BALSA_TYPE_MIME_WIDGET, NULL);
@@ -1295,18 +1295,15 @@ bm_widget_new_vcard(BalsaMessage *bm, LibBalsaMessageBody *mime_body,
     w = gtk_button_new_with_mnemonic(_("S_tore Address"));
     gtk_grid_attach(grid, w, 0, 0, 2, 1);
     g_signal_connect_swapped(w, "clicked",
-                             G_CALLBACK(balsa_store_address), addr);
-    g_object_weak_ref(G_OBJECT(mw), (GWeakNotify)g_object_unref, addr);
-
-
-    GRID_ATTACH(grid, addr->full_name,    _("Full Name:"));
-    GRID_ATTACH(grid, addr->nick_name,    _("Nick Name:"));
-    GRID_ATTACH(grid, addr->first_name,   _("First Name:"));
-    GRID_ATTACH(grid, addr->last_name,    _("Last Name:"));
-    GRID_ATTACH(grid, addr->organization, _("Organization:"));
-    if(addr->address_list) {
-        GRID_ATTACH(grid, addr->address_list->data, _("Email Address:"));
-    }
+                             G_CALLBACK(balsa_store_address), address);
+    g_object_weak_ref(G_OBJECT(mw), (GWeakNotify)g_object_unref, address);
+
+    GRID_ATTACH(grid, libbalsa_address_get_full_name(address),    _("Full Name:"));
+    GRID_ATTACH(grid, libbalsa_address_get_nick_name(address),    _("Nick Name:"));
+    GRID_ATTACH(grid, libbalsa_address_get_first_name(address),   _("First Name:"));
+    GRID_ATTACH(grid, libbalsa_address_get_last_name(address),    _("Last Name:"));
+    GRID_ATTACH(grid, libbalsa_address_get_organization(address), _("Organization:"));
+    GRID_ATTACH(grid, libbalsa_address_get_addr(address),         _("Email Address:"));
 
     return mw;
 }
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index d98b52e..ca6f8ea 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -190,9 +190,8 @@ balsa_vevent_widget(LibBalsaVEvent * event, gboolean may_reply,
            g_free(this_att);
 
            if (may_reply && libbalsa_vcal_attendee_rsvp(lba)) {
-               InternetAddress *ia =
-                    internet_address_mailbox_new(NULL,
-                                                 lba->address_list->data);
+                const gchar *addr = libbalsa_address_get_addr(lba);
+               InternetAddress *ia = internet_address_mailbox_new(NULL, addr);
                 GList *list;
 
                 for (list = balsa_app.identities; list; list = list->next) {
diff --git a/src/balsa-print-object-text.c b/src/balsa-print-object-text.c
index 033e5c1..06b8f3e 100644
--- a/src/balsa-print-object-text.c
+++ b/src/balsa-print-object-text.c
@@ -432,7 +432,7 @@ balsa_print_object_text_vcard(GList * list,
     PangoTabArray *tabs;
     GString *desc_buf;
     gdouble c_max_height;
-    LibBalsaAddress * addr = NULL;
+    LibBalsaAddress *address = NULL;
     gchar *textbuf;
 
     /* check if we can create an address from the body and fall back to default if 
@@ -442,8 +442,8 @@ balsa_print_object_text_vcard(GList * list,
     else
        libbalsa_message_body_get_content(body, &textbuf, NULL);
     if (textbuf)
-        addr = libbalsa_address_new_from_vcard(textbuf, body->charset);
-    if (!addr) {
+        address = libbalsa_address_new_from_vcard(textbuf, body->charset);
+    if (address == NULL) {
        g_free(textbuf);
        return balsa_print_object_text(list, context, body, psetup);
     }
@@ -483,19 +483,19 @@ balsa_print_object_text_vcard(GList * list,
     desc_buf = g_string_new("");
     pod->p_label_width = 0;
     ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                   addr->full_name,    _("Full Name"));
+                   libbalsa_address_get_full_name(address),    _("Full Name"));
     ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                   addr->nick_name,    _("Nick Name"));
+                   libbalsa_address_get_nick_name(address),    _("Nick Name"));
     ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                   addr->first_name,   _("First Name"));
+                   libbalsa_address_get_first_name(address),   _("First Name"));
     ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                   addr->last_name,    _("Last Name"));
+                   libbalsa_address_get_last_name(address),    _("Last Name"));
     ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                   addr->organization, _("Organization"));
-    if (addr->address_list)
-        ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
-                       (const gchar *) addr->address_list->data, _("Email Address"));
-    g_object_unref(addr);
+                   libbalsa_address_get_organization(address), _("Organization"));
+    ADD_VCARD_FIELD(desc_buf, pod->p_label_width, test_layout,
+                    libbalsa_address_get_addr(address),         _("Email Address"));
+
+    g_object_unref(address);
 
     /* add a small space between label and value */
     pod->p_label_width += C_TO_P(C_LABEL_SEP);
diff --git a/src/store-address.c b/src/store-address.c
index 8e0bf1f..e8c4bb9 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -376,29 +376,24 @@ store_address_add_address(StoreAddressInfo * info,
 
     text = internet_address_to_string(ia, FALSE);
     address = libbalsa_address_new();
-    address->full_name =
-        g_strdup(ia->name ? ia->name : group ? group->name : NULL);
+    libbalsa_address_set_full_name(address,
+                                   ia->name != NULL ? ia->name :
+                                   group != NULL ? group->name : NULL);
     if (INTERNET_ADDRESS_IS_GROUP(ia)) {
         InternetAddressList *members;
         int j;
 
-        address->address_list = NULL;
         members = INTERNET_ADDRESS_GROUP(ia)->members;
 
         for (j = 0; j < internet_address_list_length(members); j++) {
             InternetAddress *member_address =
                 internet_address_list_get_address(members, j);
             if (INTERNET_ADDRESS_IS_MAILBOX(member_address))
-                address->address_list =
-                    g_list_prepend(address->address_list,
-                                   g_strdup(INTERNET_ADDRESS_MAILBOX
-                                            (member_address)->addr));
+                libbalsa_address_add_addr
+                    (address, INTERNET_ADDRESS_MAILBOX(member_address)->addr);
         }
-        address->address_list = g_list_reverse(address->address_list);
     } else {
-        address->address_list =
-            g_list_prepend(NULL,
-                           g_strdup(INTERNET_ADDRESS_MAILBOX(ia)->addr));
+        libbalsa_address_add_addr(address, INTERNET_ADDRESS_MAILBOX(ia)->addr);
     }
     ew = libbalsa_address_get_edit_widget(address, entries, NULL, NULL);
     g_object_unref(address);
@@ -419,15 +414,19 @@ store_address_add_lbaddress(StoreAddressInfo * info,
 {
     gchar *label_text;
     GtkWidget **entries, *ew;
+    const gchar *addr;
+    const gchar *full_name;
+
+    addr = libbalsa_address_get_addr(address);
+    g_return_if_fail(addr != NULL);
 
-    g_return_if_fail(address->address_list);
     entries = g_new(GtkWidget *, NUM_FIELDS);
     info->entries_list = g_list_append(info->entries_list, entries);
 
     ew = libbalsa_address_get_edit_widget(address, entries, NULL, NULL);
 
-    label_text = g_strdup(address->full_name ? address->full_name :
-                          address->address_list->data);
+    full_name = libbalsa_address_get_full_name(address);
+    label_text = g_strdup(full_name != NULL ? full_name : addr);
     if (g_utf8_strlen(label_text, -1) > 15)
         /* truncate to an arbitrary length: */
         *g_utf8_offset_to_pointer(label_text, 15) = '\0';



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