[balsa] Use macro to declare LibBalsaAddressBook



commit bc7b24766de23d658fa612c9e5d912af1019e7ee
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon May 13 22:46:27 2019 -0400

    Use macro to declare LibBalsaAddressBook
    
    Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaAddressBook
    
    The macro defines _LibBalsaAddressBook to be a bare structure
    with a single GObject member. The instance data must be in a
    _LibBalsaAddressBookPrivate structure, access to which is channeled
    through getters and setters.
    
    * libbalsa/address-book-extern.c
      (libbalsa_address_book_externq_new),
      (libbalsa_address_book_externq_alias_complete):
    * libbalsa/address-book-gpe.c (libbalsa_address_book_gpe_init),
      (libbalsa_address_book_gpe_new), (libbalsa_address_book_gpe_load):
    * libbalsa/address-book-ldap.c (libbalsa_address_book_ldap_init),
      (libbalsa_address_book_ldap_new),
      (libbalsa_address_book_ldap_open_connection),
      (libbalsa_address_book_ldap_add_address),
      (libbalsa_address_book_ldap_remove_address),
      (libbalsa_address_book_ldap_modify_address),
      (libbalsa_address_book_ldap_load_config),
      (libbalsa_address_book_ldap_alias_complete):
    * libbalsa/address-book-ldif.c (libbalsa_address_book_ldif_new):
    * libbalsa/address-book-osmo.c (libbalsa_address_book_osmo_init),
      (libbalsa_address_book_osmo_new),
      (libbalsa_address_book_osmo_load),
      (libbalsa_address_book_osmo_alias_complete):
    * libbalsa/address-book-rubrica.c
      (libbalsa_address_book_rubrica_new),
      (libbalsa_address_book_rubrica_alias_complete),
      (lbab_rubrica_load_xml):
    * libbalsa/address-book-text.c (lbab_text_load_file),
      (libbalsa_address_book_text_alias_complete):
    * libbalsa/address-book-vcard.c (libbalsa_address_book_vcard_new):
    * libbalsa/address-book.c (libbalsa_address_book_class_init),
      (libbalsa_address_book_init), (libbalsa_address_book_finalize),
      (libbalsa_address_book_set_status),
      (libbalsa_address_book_load_config),
      (libbalsa_address_is_dist_list),
      (libbalsa_address_book_real_save_config),
      (libbalsa_address_book_real_load_config),
      (libbalsa_address_book_strerror),
      (libbalsa_address_book_get_expand_aliases),
      (libbalsa_address_book_get_is_expensive),
      (libbalsa_address_book_get_dist_list_mode),
      (libbalsa_address_book_get_name),
      (libbalsa_address_book_get_config_prefix),
      (libbalsa_address_book_set_name),
      (libbalsa_address_book_set_is_expensive),
      (libbalsa_address_book_set_expand_aliases),

 ChangeLog                       |  71 ++++++++++++
 libbalsa/address-book-extern.c  |   6 +-
 libbalsa/address-book-gpe.c     | 138 +++++++++++------------
 libbalsa/address-book-ldap.c    |  33 +++---
 libbalsa/address-book-ldif.c    |   2 +-
 libbalsa/address-book-osmo.c    |  14 ++-
 libbalsa/address-book-rubrica.c |   6 +-
 libbalsa/address-book-text.c    |   4 +-
 libbalsa/address-book-vcard.c   |   2 +-
 libbalsa/address-book.c         | 240 ++++++++++++++++++++++++++++------------
 libbalsa/address-book.h         |  50 ++++-----
 libbalsa/address-view.c         |   3 +-
 src/ab-main.c                   |  29 +++--
 src/ab-window.c                 |  14 ++-
 src/address-book-config.c       |  53 +++++----
 src/pref-manager.c              |   8 +-
 src/save-restore.c              |  26 +++--
 src/store-address.c             |   4 +-
 18 files changed, 442 insertions(+), 261 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index aff4671be..08ed19ceb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,74 @@
+2019-05-13  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaAddressBook
+
+       The macro defines _LibBalsaAddressBook to be a bare structure
+       with a single GObject member. The instance data must be in a
+       _LibBalsaAddressBookPrivate structure, access to which is
+       channeled through getters and setters.
+
+       * libbalsa/address-book-extern.c
+       (libbalsa_address_book_externq_new),
+       (libbalsa_address_book_externq_alias_complete):
+       * libbalsa/address-book-gpe.c (libbalsa_address_book_gpe_init),
+       (libbalsa_address_book_gpe_new), (libbalsa_address_book_gpe_load):
+       * libbalsa/address-book-ldap.c (libbalsa_address_book_ldap_init),
+       (libbalsa_address_book_ldap_new),
+       (libbalsa_address_book_ldap_open_connection),
+       (libbalsa_address_book_ldap_add_address),
+       (libbalsa_address_book_ldap_remove_address),
+       (libbalsa_address_book_ldap_modify_address),
+       (libbalsa_address_book_ldap_load_config),
+       (libbalsa_address_book_ldap_alias_complete):
+       * libbalsa/address-book-ldif.c (libbalsa_address_book_ldif_new):
+       * libbalsa/address-book-osmo.c (libbalsa_address_book_osmo_init),
+       (libbalsa_address_book_osmo_new),
+       (libbalsa_address_book_osmo_load),
+       (libbalsa_address_book_osmo_alias_complete):
+       * libbalsa/address-book-rubrica.c
+       (libbalsa_address_book_rubrica_new),
+       (libbalsa_address_book_rubrica_alias_complete),
+       (lbab_rubrica_load_xml):
+       * libbalsa/address-book-text.c (lbab_text_load_file),
+       (libbalsa_address_book_text_alias_complete):
+       * libbalsa/address-book-vcard.c (libbalsa_address_book_vcard_new):
+       * libbalsa/address-book.c (libbalsa_address_book_class_init),
+       (libbalsa_address_book_init), (libbalsa_address_book_finalize),
+       (libbalsa_address_book_set_status),
+       (libbalsa_address_book_load_config),
+       (libbalsa_address_is_dist_list),
+       (libbalsa_address_book_real_save_config),
+       (libbalsa_address_book_real_load_config),
+       (libbalsa_address_book_strerror),
+       (libbalsa_address_book_get_expand_aliases),
+       (libbalsa_address_book_get_is_expensive),
+       (libbalsa_address_book_get_dist_list_mode),
+       (libbalsa_address_book_get_name),
+       (libbalsa_address_book_get_config_prefix),
+       (libbalsa_address_book_set_name),
+       (libbalsa_address_book_set_is_expensive),
+       (libbalsa_address_book_set_expand_aliases),
+       (libbalsa_address_book_set_dist_list_mode):
+       * libbalsa/address-book.h:
+       * libbalsa/address-view.c (lbav_get_matching_addresses):
+       * src/ab-main.c (bab_set_address_book), (bab_window_set_title),
+       (address_book_change_state), (set_address_book_menu_items),
+       (address_book_change), (file_delete_activated),
+       (bab_set_intial_address_book):
+       * src/ab-window.c (balsa_ab_window_load_books),
+       (balsa_ab_window_init), (balsa_ab_window_set_title),
+       (balsa_ab_window_load), (balsa_ab_window_dist_mode_toggled),
+       (balsa_ab_window_menu_changed):
+       * src/address-book-config.c (add_radio_buttons),
+       (create_local_dialog), (create_osmo_dialog),
+       (create_externq_dialog), (create_ldap_dialog), (create_gpe_dialog),
+       (create_book), (modify_book):
+       * src/pref-manager.c (update_address_books):
+       * src/save-restore.c (address_book_section_path),
+       (config_address_book_delete), (config_save):
+       * src/store-address.c (store_address_book_frame),
+       (store_address_add_list):
+
 2019-05-13  Peter Bloomfield  <pbloomfield bellsouth net>
 
        Clean up conditional compilations after bumping required
diff --git a/libbalsa/address-book-extern.c b/libbalsa/address-book-extern.c
index 22e786ce0..61b3ff583 100644
--- a/libbalsa/address-book-extern.c
+++ b/libbalsa/address-book-extern.c
@@ -187,7 +187,7 @@ libbalsa_address_book_externq_new(const gchar * name, const gchar * load,
                                       NULL));
     ab = LIBBALSA_ADDRESS_BOOK(abvc);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(ab, name);
     abvc->load = g_strdup(load);
     abvc->save = g_strdup(save);
 
@@ -386,12 +386,12 @@ libbalsa_address_book_externq_alias_complete(LibBalsaAddressBook * ab,
 
     ex = LIBBALSA_ADDRESS_BOOK_EXTERN(ab);
 
-    if ( !ab->expand_aliases )
+    if (!libbalsa_address_book_get_expand_aliases(ab))
        return NULL;
 
     if(!parse_externq_file(ex, (gchar *)prefix, lbe_expand_cb, &res))
         return NULL;
-       
+
     res = g_list_reverse(res);
 
     return res;
diff --git a/libbalsa/address-book-gpe.c b/libbalsa/address-book-gpe.c
index 0f5d10684..fd0f8dc33 100644
--- a/libbalsa/address-book-gpe.c
+++ b/libbalsa/address-book-gpe.c
@@ -128,10 +128,10 @@ libbalsa_address_book_gpe_class_init(LibBalsaAddressBookGpeClass * klass)
 }
 
 static void
-libbalsa_address_book_gpe_init(LibBalsaAddressBookGpe * ab)
+libbalsa_address_book_gpe_init(LibBalsaAddressBookGpe * gpe)
 {
-    ab->db = NULL;
-    LIBBALSA_ADDRESS_BOOK(ab)->is_expensive = FALSE;
+    gpe->db = NULL;
+    libbalsa_address_book_set_is_expensive(LIBBALSA_ADDRESS_BOOK(gpe), FALSE);
 }
 
 static void
@@ -153,7 +153,7 @@ libbalsa_address_book_gpe_new(const gchar *name)
                                      NULL));
     ab = LIBBALSA_ADDRESS_BOOK(gpe);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(LIBBALSA_ADDRESS_BOOK(gpe), name);
     /* We open on demand... */
     gpe->db = NULL;
     return ab;
@@ -337,7 +337,7 @@ libbalsa_address_book_gpe_load(LibBalsaAddressBook * ab,
                                LibBalsaAddressBookLoadFunc callback,
                                gpointer closure)
 {
-    LibBalsaAddressBookGpe *gpe_ab;
+    LibBalsaAddressBookGpe *gpe;
     gchar *err = NULL;
     struct gpe_closure gc;
     int r;
@@ -348,15 +348,15 @@ libbalsa_address_book_gpe_load(LibBalsaAddressBook * ab,
     if (callback == NULL)
        return LBABERR_OK;
 
-    gpe_ab = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
     
-    if (gpe_ab->db == NULL)
-        if (!libbalsa_address_book_gpe_open_db(gpe_ab))
+    if (gpe->db == NULL)
+        if (!libbalsa_address_book_gpe_open_db(gpe))
             return LBABERR_CANNOT_CONNECT;
 
     gc.callback = callback;
     gc.closure  = closure;
-    gc.gpe      = gpe_ab;
+    gc.gpe      = gpe;
     /* FIXME: error reporting */
 #ifdef HAVE_SQLITE3
     if (filter && *filter) {
@@ -369,17 +369,17 @@ libbalsa_address_book_gpe_load(LibBalsaAddressBook * ab,
                             " upper(tag)='HOME.EMAIL') "
                             "and value LIKE '%q%%'",
                             filter);
-        r = sqlite3_exec(gpe_ab->db, sql, gpe_read_address, &gc, &err);
+        r = sqlite3_exec(gpe->db, sql, gpe_read_address, &gc, &err);
         sqlite3_free(sql);
     } else {
-        r = sqlite3_exec(gpe_ab->db,
+        r = sqlite3_exec(gpe->db,
                          "select distinct urn from contacts_urn",
                          gpe_read_address, &gc, &err);
     }
 #else                           /* HAVE_SQLITE3 */
     if(filter && *filter) {
         r = sqlite_exec_printf
-            (gpe_ab->db, 
+            (gpe->db, 
              "select distinct urn from contacts where "
              "(upper(tag)='FAMILY_NAME' or upper(tag)='GIVEN_NAME' or "
              "upper(tag)='NAME' or "
@@ -387,14 +387,14 @@ libbalsa_address_book_gpe_load(LibBalsaAddressBook * ab,
              "and value LIKE '%q%%'",
              gpe_read_address, &gc, &err, filter);
     } else {
-        r = sqlite_exec(gpe_ab->db, "select distinct urn from contacts_urn",
+        r = sqlite_exec(gpe->db, "select distinct urn from contacts_urn",
                         gpe_read_address, &gc, &err);
     }
 #endif                          /* HAVE_SQLITE3 */
 
     if(r != SQLITE_OK) {
         printf("r=%d err=%s\n", r, err);
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
 #ifdef HAVE_SQLITE3
         sqlite3_free(err);
 #else                           /* HAVE_SQLITE3 */
@@ -428,7 +428,7 @@ static LibBalsaABErr
 libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
                                        LibBalsaAddress *address)
 {
-    LibBalsaAddressBookGpe *gpe_ab = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    LibBalsaAddressBookGpe *gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
     int r;
     guint id;
     char *err = NULL;
@@ -439,21 +439,21 @@ libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
     g_return_val_if_fail(address, LBABERR_CANNOT_WRITE);
     g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
 
-    if (gpe_ab->db == NULL) {
-        if(!libbalsa_address_book_gpe_open_db(gpe_ab))
+    if (gpe->db == NULL) {
+        if(!libbalsa_address_book_gpe_open_db(gpe))
            return LBABERR_CANNOT_CONNECT;
     }
 #ifdef HAVE_SQLITE3
-    r = sqlite3_exec(gpe_ab->db, "insert into contacts_urn values (NULL)",
+    r = sqlite3_exec(gpe->db, "insert into contacts_urn values (NULL)",
                      NULL, NULL, &err);
     if (r != SQLITE_OK) {
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
         sqlite3_free(err);
 #else                           /* HAVE_SQLITE3 */
-    r = sqlite_exec(gpe_ab->db, "insert into contacts_urn values (NULL)",
+    r = sqlite_exec(gpe->db, "insert into contacts_urn values (NULL)",
                     NULL, NULL, &err);
     if (r != SQLITE_OK) {
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
         free(err);
 #endif                          /* HAVE_SQLITE3 */
         return LBABERR_CANNOT_WRITE;
@@ -461,25 +461,25 @@ libbalsa_address_book_gpe_add_address(LibBalsaAddressBook *ab,
     /* FIXME: duplicate detection! */
 
 #ifdef HAVE_SQLITE3
-    id = sqlite3_last_insert_rowid(gpe_ab->db);
+    id = sqlite3_last_insert_rowid(gpe->db);
 #else                           /* HAVE_SQLITE3 */
-    id = sqlite_last_insert_rowid(gpe_ab->db);
+    id = sqlite_last_insert_rowid(gpe->db);
 #endif                          /* HAVE_SQLITE3 */
-    INSERT_ATTR(gpe_ab->db,id, "NAME",        address->full_name);
-    INSERT_ATTR(gpe_ab->db,id, "GIVEN_NAME",  address->first_name);
-    INSERT_ATTR(gpe_ab->db,id, "FAMILY_NAME", address->last_name);
-    INSERT_ATTR(gpe_ab->db,id, "NICKNAME",    address->nick_name);
-    INSERT_ATTR(gpe_ab->db,id, "WORK.ORGANIZATION", address->organization);
-    INSERT_ATTR(gpe_ab->db,id, "WORK.EMAIL",
+    INSERT_ATTR(gpe->db,id, "NAME",        address->full_name);
+    INSERT_ATTR(gpe->db,id, "GIVEN_NAME",  address->first_name);
+    INSERT_ATTR(gpe->db,id, "FAMILY_NAME", address->last_name);
+    INSERT_ATTR(gpe->db,id, "NICKNAME",    address->nick_name);
+    INSERT_ATTR(gpe->db,id, "WORK.ORGANIZATION", address->organization);
+    INSERT_ATTR(gpe->db,id, "WORK.EMAIL",
                 (char*)address->address_list->data);
 #ifdef HAVE_SQLITE3
     sql = sqlite3_mprintf("insert into contacts values "
                           "('%d', 'MODIFIED', %d)",
                           id, time(NULL));
-    sqlite3_exec(gpe_ab->db, sql, NULL, NULL, NULL);
+    sqlite3_exec(gpe->db, sql, NULL, NULL, NULL);
     sqlite3_free(sql);
 #else                           /* HAVE_SQLITE3 */
-    sqlite_exec_printf(gpe_ab->db, "insert into contacts values "
+    sqlite_exec_printf(gpe->db, "insert into contacts values "
                        "('%d', 'MODIFIED', %d)", NULL, NULL, NULL,
                        id, time(NULL));
 #endif                          /* HAVE_SQLITE3 */
@@ -548,23 +548,23 @@ static LibBalsaABErr
 libbalsa_address_book_gpe_remove_address(LibBalsaAddressBook *ab,
                                           LibBalsaAddress *address)
 {
-    LibBalsaAddressBookGpe *gpe_ab = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    LibBalsaAddressBookGpe *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);
 
-    if (gpe_ab->db == NULL) {
-        if( !libbalsa_address_book_gpe_open_db(gpe_ab))
+    if (gpe->db == NULL) {
+        if( !libbalsa_address_book_gpe_open_db(gpe))
            return LBABERR_CANNOT_CONNECT;
     }
     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(gpe_ab->db, uid);
+    err = db_delete_by_uid(gpe->db, uid);
     if(err) {
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
 #ifdef HAVE_SQLITE3
         sqlite3_free(err);
 #else                           /* HAVE_SQLITE3 */
@@ -600,7 +600,7 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
                                          LibBalsaAddress *address,
                                          LibBalsaAddress *newval)
 {
-    LibBalsaAddressBookGpe *gpe_ab = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    LibBalsaAddressBookGpe *gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
     guint uid;
     int r;
     char *err;
@@ -612,8 +612,8 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
     g_return_val_if_fail(address->address_list, LBABERR_CANNOT_WRITE);
     g_return_val_if_fail(newval->address_list, LBABERR_CANNOT_WRITE);
 
-    if (gpe_ab->db == NULL) {
-        if( !libbalsa_address_book_gpe_open_db(gpe_ab))
+    if (gpe->db == NULL) {
+        if( !libbalsa_address_book_gpe_open_db(gpe))
            return LBABERR_CANNOT_CONNECT;
     }
     uid = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(address), "urn"));
@@ -622,9 +622,9 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
 
     /* do the real work here */
 #ifdef HAVE_SQLITE3
-    if ((r = sqlite3_exec(gpe_ab->db, "begin transaction",
+    if ((r = sqlite3_exec(gpe->db, "begin transaction",
                           NULL, NULL, &err)) != SQLITE_OK) {
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
         sqlite3_free(err);              /* failed, so soon!? */
         return LBABERR_CANNOT_WRITE;
     }
@@ -636,20 +636,20 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
                           " upper(tag)='WORK.ORGANIZATION' or"
                           " upper(tag)='WORK.EMAIL' or"
                           " upper(tag)='MODIFIED')", uid);
-    r = sqlite3_exec(gpe_ab->db, sql, NULL, NULL, &err);
+    r = sqlite3_exec(gpe->db, sql, NULL, NULL, &err);
     sqlite3_free(sql);
     if (r != SQLITE_OK)
         goto rollback;
 #else                           /* HAVE_SQLITE3 */
-    if( (r=sqlite_exec(gpe_ab->db, "begin transaction",
+    if( (r=sqlite_exec(gpe->db, "begin transaction",
                        NULL, NULL, &err)) != SQLITE_OK) {
-        libbalsa_address_book_set_status(ab, g_strdup(err));
+        libbalsa_address_book_set_status(ab, err);
         free(err); /* failed, so soon!? */
         return LBABERR_CANNOT_WRITE;
     }
 
     if( (r=sqlite_exec_printf
-         (gpe_ab->db,
+         (gpe->db,
           "delete from contacts where urn='%d' and "
           "(upper(tag)='NAME' or upper(tag)='GIVEN_NAME' or "
           "upper(tag)='NICKNAME' or upper(tag)='WORK.ORGANIZATION' or "
@@ -657,42 +657,42 @@ libbalsa_address_book_gpe_modify_address(LibBalsaAddressBook *ab,
           NULL, NULL, &err, uid)) != SQLITE_OK)
         goto rollback;
 #endif                          /* HAVE_SQLITE3 */
-    INSERT_ATTR_R(gpe_ab->db,uid, "NAME",        newval->full_name);
-    INSERT_ATTR_R(gpe_ab->db,uid, "GIVEN_NAME",  newval->first_name);
-    INSERT_ATTR_R(gpe_ab->db,uid, "FAMILY_NAME", newval->last_name);
-    INSERT_ATTR_R(gpe_ab->db,uid, "NICKNAME",    newval->nick_name);
-    INSERT_ATTR_R(gpe_ab->db,uid, "WORK.ORGANIZATION", newval->organization);
-    INSERT_ATTR_R(gpe_ab->db,uid, "WORK.EMAIL",
+    INSERT_ATTR_R(gpe->db,uid, "NAME",        newval->full_name);
+    INSERT_ATTR_R(gpe->db,uid, "GIVEN_NAME",  newval->first_name);
+    INSERT_ATTR_R(gpe->db,uid, "FAMILY_NAME", newval->last_name);
+    INSERT_ATTR_R(gpe->db,uid, "NICKNAME",    newval->nick_name);
+    INSERT_ATTR_R(gpe->db,uid, "WORK.ORGANIZATION", newval->organization);
+    INSERT_ATTR_R(gpe->db,uid, "WORK.EMAIL",
                 (char*)newval->address_list->data);
 #ifdef HAVE_SQLITE3
     sql = sqlite3_mprintf("insert into contacts values "
                           "('%d', 'MODIFIED', %d)", uid, time(NULL));
-    r = sqlite3_exec(gpe_ab->db, sql, NULL, NULL, &err);
+    r = sqlite3_exec(gpe->db, sql, NULL, NULL, &err);
     sqlite3_free(sql);
     if (r != SQLITE_OK)
         goto rollback;
 
-    if (sqlite3_exec(gpe_ab->db, "commit transaction", NULL, NULL, &err) ==
+    if (sqlite3_exec(gpe->db, "commit transaction", NULL, NULL, &err) ==
         SQLITE_OK)
         return LBABERR_OK;
 #else                           /* HAVE_SQLITE3 */
-    if( (r=sqlite_exec_printf(gpe_ab->db, "insert into contacts values "
+    if( (r=sqlite_exec_printf(gpe->db, "insert into contacts values "
                               "('%d', 'MODIFIED', %d)", NULL, NULL, &err,
                               uid, time(NULL))) != SQLITE_OK)
         goto rollback;
     
-    if( (r=sqlite_exec(gpe_ab->db, "commit transaction", NULL,
+    if( (r=sqlite_exec(gpe->db, "commit transaction", NULL,
                        NULL, &err)) == SQLITE_OK) return LBABERR_OK;
 #endif                          /* HAVE_SQLITE3 */
 
  rollback:
-    libbalsa_address_book_set_status(ab, g_strdup(err));
+    libbalsa_address_book_set_status(ab, err);
 #ifdef HAVE_SQLITE3
     sqlite3_free(err);
-    sqlite3_exec(gpe_ab->db, "rollback transaction", NULL, NULL, NULL);
+    sqlite3_exec(gpe->db, "rollback transaction", NULL, NULL, NULL);
 #else                           /* HAVE_SQLITE3 */
     free(err);
-    sqlite_exec(gpe_ab->db, "rollback transaction", NULL, NULL, NULL);
+    sqlite_exec(gpe->db, "rollback transaction", NULL, NULL, NULL);
 #endif                          /* HAVE_SQLITE3 */
 
     return LBABERR_CANNOT_WRITE;
@@ -756,30 +756,32 @@ libbalsa_address_book_gpe_alias_complete(LibBalsaAddressBook * ab,
         "upper(tag)='WORK.EMAIL' or upper(tag)='HOME.EMAIL') "
         "and upper(value) LIKE '%q%%'";
     struct gpe_completion_closure gcc;
-    LibBalsaAddressBookGpe *gpe_ab;
+    LibBalsaAddressBookGpe *gpe;
     char *err = NULL;
     int r;
 
     g_return_val_if_fail ( LIBBALSA_ADDRESS_BOOK_GPE(ab), NULL);
 
-    gpe_ab = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+    gpe = LIBBALSA_ADDRESS_BOOK_GPE(ab);
+
+    if (!libbalsa_address_book_get_expand_aliases(ab))
+        return NULL;
 
-    if (!ab->expand_aliases) return NULL;
-    if (gpe_ab->db == NULL) {
-        if( !libbalsa_address_book_gpe_open_db(gpe_ab))
+    if (gpe->db == NULL) {
+        if( !libbalsa_address_book_gpe_open_db(gpe))
            return NULL;
     }
 
-    gcc.db = gpe_ab->db;
+    gcc.db = gpe->db;
     gcc.prefix = prefix;
     gcc.res = NULL;
 #ifdef HAVE_SQLITE3
     if (prefix) {
         gchar *sql = sqlite3_mprintf(query, prefix);
-        r = sqlite3_exec(gpe_ab->db, sql, gpe_read_completion, &gcc, &err);
+        r = sqlite3_exec(gpe->db, sql, gpe_read_completion, &gcc, &err);
         sqlite3_free(sql);
     } else
-        r = sqlite3_exec(gpe_ab->db,
+        r = sqlite3_exec(gpe->db,
                          "select distinct urn from contacts_urn",
                          gpe_read_completion, &gcc, &err);
     if(err) {
@@ -788,11 +790,11 @@ libbalsa_address_book_gpe_alias_complete(LibBalsaAddressBook * ab,
     }
 #else                           /* HAVE_SQLITE3 */
     if(prefix)
-        r = sqlite_exec_printf(gpe_ab->db, query,
+        r = sqlite_exec_printf(gpe->db, query,
                                gpe_read_completion, &gcc, &err,
                                prefix);
     else
-        r = sqlite_exec(gpe_ab->db, "select distinct urn from contacts_urn",
+        r = sqlite_exec(gpe->db, "select distinct urn from contacts_urn",
                         gpe_read_completion, &gcc, &err);
     if(err) {
         printf("r=%d err=%s\n", r, err);
diff --git a/libbalsa/address-book-ldap.c b/libbalsa/address-book-ldap.c
index e13481ea3..136861770 100644
--- a/libbalsa/address-book-ldap.c
+++ b/libbalsa/address-book-ldap.c
@@ -185,7 +185,7 @@ libbalsa_address_book_ldap_init(LibBalsaAddressBookLdap * ab)
     ab->passwd  = NULL;
     ab->enable_tls = FALSE;
     ab->directory = NULL;
-    LIBBALSA_ADDRESS_BOOK(ab)->is_expensive = TRUE;
+    libbalsa_address_book_set_is_expensive(LIBBALSA_ADDRESS_BOOK(ab), TRUE);
 }
 
 static void
@@ -221,7 +221,7 @@ libbalsa_address_book_ldap_new(const gchar *name, const gchar *host,
                                     NULL));
     ab = LIBBALSA_ADDRESS_BOOK(ldap);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(ab, name);
     ldap->host = g_strdup(host);
     ldap->base_dn = g_strdup(base_dn);
     ldap->bind_dn = g_strdup(bind_dn);
@@ -303,7 +303,7 @@ libbalsa_address_book_ldap_open_connection(LibBalsaAddressBookLdap * ab)
 
     ldap_initialize(&ab->directory, ab->host);
     if (ab->directory == NULL) { /* very unlikely... */
-        libbalsa_address_book_set_status(lbab, g_strdup("Host not found"));
+        libbalsa_address_book_set_status(lbab, _("Host not found"));
        return LDAP_SERVER_DOWN;
     }
     /* ignore error if the V3 LDAP cannot be set */
@@ -318,8 +318,7 @@ libbalsa_address_book_ldap_open_connection(LibBalsaAddressBookLdap * ab)
         if(result != LDAP_SUCCESS) {
             ldap_unbind_ext(ab->directory, NULL, NULL);
             ab->directory = NULL;
-            libbalsa_address_book_set_status
-                (lbab, g_strdup(ldap_err2string(result)));
+            libbalsa_address_book_set_status(lbab, ldap_err2string(result));
             return result;
         }
 #else /* HAVE_LDAP_TLS */
@@ -349,8 +348,7 @@ libbalsa_address_book_ldap_open_connection(LibBalsaAddressBookLdap * ab)
        result = ldap_set_option(ab->directory, LDAP_OPT_REFERRALS, (void *)LDAP_OPT_OFF);
 
     if (result != LDAP_SUCCESS) {
-        libbalsa_address_book_set_status(lbab,
-                                         g_strdup(ldap_err2string(result)));
+        libbalsa_address_book_set_status(lbab, ldap_err2string(result));
        ldap_unbind_ext(ab->directory, NULL, NULL);
        ab->directory = NULL;
     }
@@ -605,7 +603,7 @@ 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,
@@ -646,8 +644,7 @@ libbalsa_address_book_ldap_add_address(LibBalsaAddressBook *ab,
         case LDAP_SUCCESS: g_free(dn); return LBABERR_OK;
         case LDAP_ALREADY_EXISTS: 
            g_free(dn);
-           libbalsa_address_book_set_status(ab,
-                                            g_strdup(ldap_err2string(rc)));
+           libbalsa_address_book_set_status(ab, ldap_err2string(rc));
            return LBABERR_DUPLICATE;
         case LDAP_SERVER_DOWN:
             libbalsa_address_book_ldap_close_connection(ldap_ab);
@@ -706,8 +703,7 @@ libbalsa_address_book_ldap_remove_address(LibBalsaAddressBook *ab,
         }
     } while(cnt++<1);
     g_free(dn);
-    libbalsa_address_book_set_status(ab,
-                                    g_strdup(ldap_err2string(rc)));
+    libbalsa_address_book_set_status(ab, ldap_err2string(rc));
     return LBABERR_CANNOT_WRITE;
 }
 
@@ -818,8 +814,7 @@ libbalsa_address_book_ldap_modify_address(LibBalsaAddressBook *ab,
         }
     } while(cnt++<1);
     g_free(dn);
-    libbalsa_address_book_set_status(ab,
-                                    g_strdup(ldap_err2string(rc)));
+    libbalsa_address_book_set_status(ab, ldap_err2string(rc));
     return LBABERR_CANNOT_WRITE;
 }
 
@@ -877,8 +872,8 @@ libbalsa_address_book_ldap_load_config(LibBalsaAddressBook * ab,
     if (LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->load_config)
        LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->load_config(ab, prefix);
 
-    if (ab->is_expensive < 0)
-        ab->is_expensive = TRUE;
+    if (libbalsa_address_book_get_is_expensive(ab) < 0)
+        libbalsa_address_book_set_is_expensive(ab, TRUE);
 }
 
 
@@ -959,11 +954,11 @@ libbalsa_address_book_ldap_alias_complete(LibBalsaAddressBook * ab,
     int rc;
     LDAPMessage * e, *result;
 
-    g_return_val_if_fail ( LIBBALSA_ADDRESS_BOOK_LDAP(ab), NULL);
-
     ldap_ab = LIBBALSA_ADDRESS_BOOK_LDAP(ab);
 
-    if (!ab->expand_aliases || strlen(prefix)<ABL_MIN_LEN) return NULL;
+    if (!libbalsa_address_book_get_expand_aliases(ab) || strlen(prefix) < ABL_MIN_LEN)
+        return NULL;
+
     if (ldap_ab->directory == NULL) {
         if( (rc=libbalsa_address_book_ldap_open_connection(ldap_ab))
            != LDAP_SUCCESS)
diff --git a/libbalsa/address-book-ldif.c b/libbalsa/address-book-ldif.c
index f0c5b6f4d..67c99cfea 100644
--- a/libbalsa/address-book-ldif.c
+++ b/libbalsa/address-book-ldif.c
@@ -97,7 +97,7 @@ libbalsa_address_book_ldif_new(const gchar * name, const gchar * path)
                                     NULL));
     ab = LIBBALSA_ADDRESS_BOOK(ab_ldif);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(ab, name);
     LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path);
 
     return ab;
diff --git a/libbalsa/address-book-osmo.c b/libbalsa/address-book-osmo.c
index e5028cf32..bf0f70ead 100644
--- a/libbalsa/address-book-osmo.c
+++ b/libbalsa/address-book-osmo.c
@@ -89,7 +89,7 @@ libbalsa_address_book_osmo_class_init(LibBalsaAddressBookOsmoClass *klass)
 static void
 libbalsa_address_book_osmo_init(LibBalsaAddressBookOsmo *ab)
 {
-       LIBBALSA_ADDRESS_BOOK(ab)->is_expensive = FALSE;
+       libbalsa_address_book_set_is_expensive(LIBBALSA_ADDRESS_BOOK(ab), FALSE);
 }
 
 
@@ -116,7 +116,7 @@ libbalsa_address_book_osmo_new(const gchar *name)
 
        osmo = LIBBALSA_ADDRESS_BOOK_OSMO(g_object_new(LIBBALSA_TYPE_ADDRESS_BOOK_OSMO, NULL));
        ab = LIBBALSA_ADDRESS_BOOK(osmo);
-       ab->name = g_strdup(name);
+       libbalsa_address_book_set_name(ab, name);
 
        return ab;
 }
@@ -143,7 +143,12 @@ libbalsa_address_book_osmo_load(LibBalsaAddressBook                *ab,
 
                addresses = osmo_read_addresses(osmo, filter, &error);
                if (error != NULL) {
-                       libbalsa_address_book_set_status(ab, g_strdup_printf(_("Reading Osmo contacts failed: 
%s"), error->message));
+                        gchar *message;
+
+                       message =
+                            g_strdup_printf(_("Reading Osmo contacts failed: %s"), error->message);
+                       libbalsa_address_book_set_status(ab, message);
+                        g_free(message);
                        g_error_free(error);
                        result = LBABERR_CANNOT_SEARCH;
                } else {
@@ -220,9 +225,8 @@ libbalsa_address_book_osmo_alias_complete(LibBalsaAddressBook *ab,
 
        osmo = LIBBALSA_ADDRESS_BOOK_OSMO(ab);
 
-       if (!ab->expand_aliases || strlen(prefix) < LOOKUP_MIN_LEN) {
+       if (!libbalsa_address_book_get_expand_aliases(ab) || strlen(prefix) < LOOKUP_MIN_LEN)
                return NULL;
-       }
 
        g_debug("%s: filter for %s", __func__, prefix);
        addresses = osmo_read_addresses(osmo, prefix, &error);
diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c
index 6064fa825..13a1ba13f 100644
--- a/libbalsa/address-book-rubrica.c
+++ b/libbalsa/address-book-rubrica.c
@@ -167,7 +167,7 @@ libbalsa_address_book_rubrica_new(const gchar * name, const gchar * path)
     ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica);
     ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(ab, name);
     ab_text->path = g_strdup(path);
 
     return ab;
@@ -228,7 +228,7 @@ libbalsa_address_book_rubrica_alias_complete(LibBalsaAddressBook * ab,
     GList *list;
     GList *res = NULL;
 
-    if (ab->expand_aliases == FALSE)
+    if (!libbalsa_address_book_get_expand_aliases(ab))
         return NULL;
 
     if (lbab_rubrica_load_xml(ab_rubrica, NULL) != LBABERR_OK)
@@ -468,7 +468,7 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
            continue;
 
        if (address->address_list->next
-           && LIBBALSA_ADDRESS_BOOK(ab_rubrica)->dist_list_mode) {
+           && libbalsa_address_book_get_dist_list_mode(LIBBALSA_ADDRESS_BOOK(ab_rubrica))) {
            /* Create a group address. */
            InternetAddress *ia =
                internet_address_group_new(address->full_name);
diff --git a/libbalsa/address-book-text.c b/libbalsa/address-book-text.c
index 04cf2f465..801acdfd6 100644
--- a/libbalsa/address-book-text.c
+++ b/libbalsa/address-book-text.c
@@ -348,7 +348,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
             continue;
 
         if (address->address_list->next
-            && LIBBALSA_ADDRESS_BOOK(ab_text)->dist_list_mode) {
+            && libbalsa_address_book_get_dist_list_mode(LIBBALSA_ADDRESS_BOOK(ab_text))) {
             /* Create a group address. */
             InternetAddress *ia =
                 internet_address_group_new(address->full_name);
@@ -706,7 +706,7 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
     GList *list;
     GList *res = NULL;
 
-    if (ab->expand_aliases == FALSE)
+    if (!libbalsa_address_book_get_expand_aliases(ab))
         return NULL;
 
     stream = fopen(ab_text->path, "r");
diff --git a/libbalsa/address-book-vcard.c b/libbalsa/address-book-vcard.c
index 7dbe6008b..e3ef4a60c 100644
--- a/libbalsa/address-book-vcard.c
+++ b/libbalsa/address-book-vcard.c
@@ -105,7 +105,7 @@ libbalsa_address_book_vcard_new(const gchar * name, const gchar * path)
                                      NULL));
     ab = LIBBALSA_ADDRESS_BOOK(abvc);
 
-    ab->name = g_strdup(name);
+    libbalsa_address_book_set_name(ab, name);
     LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path);
 
     return ab;
diff --git a/libbalsa/address-book.c b/libbalsa/address-book.c
index 44953d7ec..7bcc85a4b 100644
--- a/libbalsa/address-book.c
+++ b/libbalsa/address-book.c
@@ -28,11 +28,20 @@
 
 #include "libbalsa-conf.h"
 
-static GObjectClass *parent_class = NULL;
+typedef struct _LibBalsaAddressBookPrivate LibBalsaAddressBookPrivate;
+
+struct _LibBalsaAddressBookPrivate {
+    /* The gnome_config prefix where we save this address book */
+    gchar *config_prefix;
+    gchar *name;
+    gchar *ext_op_code;    /* extra description for last operation */
+    gboolean is_expensive; /* is lookup to the address book expensive? 
+                             e.g. LDAP address book */
+    gboolean expand_aliases;
+
+    gboolean dist_list_mode;
+};
 
-static void libbalsa_address_book_class_init(LibBalsaAddressBookClass *
-                                            klass);
-static void libbalsa_address_book_init(LibBalsaAddressBook * ab);
 static void libbalsa_address_book_finalize(GObject * object);
 
 static void libbalsa_address_book_real_save_config(LibBalsaAddressBook *
@@ -42,39 +51,13 @@ static void libbalsa_address_book_real_load_config(LibBalsaAddressBook *
                                                   ab,
                                                   const gchar * group);
 
-GType libbalsa_address_book_get_type(void)
-{
-    static GType address_book_type = 0;
-
-    if (!address_book_type) {
-       static const GTypeInfo address_book_info = {
-           sizeof(LibBalsaAddressBookClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_address_book_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaAddressBook),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_address_book_init
-       };
-
-       address_book_type =
-           g_type_register_static(G_TYPE_OBJECT,
-                                   "LibBalsaAddressBook",
-                                   &address_book_info, 0);
-    }
-
-    return address_book_type;
-}
+G_DEFINE_TYPE_WITH_PRIVATE(LibBalsaAddressBook, libbalsa_address_book, G_TYPE_OBJECT)
 
 static void
 libbalsa_address_book_class_init(LibBalsaAddressBookClass * klass)
 {
     GObjectClass *object_class;
 
-    parent_class = g_type_class_peek_parent(klass);
-
     object_class = G_OBJECT_CLASS(klass);
 
     klass->load = NULL;
@@ -91,28 +74,29 @@ libbalsa_address_book_class_init(LibBalsaAddressBookClass * klass)
 static void
 libbalsa_address_book_init(LibBalsaAddressBook * ab)
 {
-    ab->config_prefix = NULL;
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    priv->config_prefix = NULL;
 
-    ab->name = NULL;
-    ab->expand_aliases = TRUE;
-    ab->dist_list_mode = FALSE;
-    ab->is_expensive   = FALSE;
+    priv->name = NULL;
+    priv->expand_aliases = TRUE;
+    priv->dist_list_mode = FALSE;
+    priv->is_expensive   = FALSE;
 }
 
 static void
 libbalsa_address_book_finalize(GObject * object)
 {
-    LibBalsaAddressBook *ab;
+    LibBalsaAddressBook *ab = LIBBALSA_ADDRESS_BOOK(object);
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
 
-    ab = LIBBALSA_ADDRESS_BOOK(object);
+    g_free(priv->config_prefix);
+    priv->config_prefix = NULL;
 
-    g_free(ab->config_prefix);
-    ab->config_prefix = NULL;
+    g_free(priv->name);
+    priv->name = NULL;
 
-    g_free(ab->name);
-    ab->name = NULL;
-
-    G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_address_book_parent_class)->finalize(object);
 }
 
 LibBalsaAddressBook *
@@ -202,13 +186,15 @@ libbalsa_address_book_modify_address(LibBalsaAddressBook * ab,
     return res;
 }
 
-/* set_status takes over the string ownership */
 void
-libbalsa_address_book_set_status(LibBalsaAddressBook * ab, gchar *str)
+libbalsa_address_book_set_status(LibBalsaAddressBook * ab, const gchar *str)
 {
-    g_return_if_fail(ab);
-    g_free(ab->ext_op_code);
-    ab->ext_op_code = str;
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+
+    g_free(priv->ext_op_code);
+    priv->ext_op_code = g_strdup(str);
 }
 
 void
@@ -229,14 +215,16 @@ void
 libbalsa_address_book_load_config(LibBalsaAddressBook * ab,
                                  const gchar * group)
 {
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
     g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
 
     libbalsa_conf_push_group(group);
     LIBBALSA_ADDRESS_BOOK_GET_CLASS(ab)->load_config(ab, group);
     libbalsa_conf_pop_group();
 
-    if (ab->is_expensive < 0)
-        ab->is_expensive = FALSE;
+    if (priv->is_expensive < 0)
+        priv->is_expensive = FALSE;
 }
 
 GList *
@@ -249,10 +237,16 @@ libbalsa_address_book_alias_complete(LibBalsaAddressBook * ab,
 }
 
 
-gboolean libbalsa_address_is_dist_list(const LibBalsaAddressBook *ab,
-                                      const LibBalsaAddress *address)
+gboolean
+libbalsa_address_is_dist_list(LibBalsaAddressBook *ab,
+                              LibBalsaAddress *address)
 {
-    return (ab->dist_list_mode && g_list_length(address->address_list)>1);
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), FALSE);
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS(address), FALSE);
+
+    return (priv->dist_list_mode && address->address_list->next != NULL);
 }
 
 
@@ -261,51 +255,55 @@ static void
 libbalsa_address_book_real_save_config(LibBalsaAddressBook * ab,
                                       const gchar * group)
 {
-    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
 
     libbalsa_conf_set_string("Type", g_type_name(G_OBJECT_TYPE(ab)));
-    libbalsa_conf_set_string("Name", ab->name);
-    libbalsa_conf_set_bool("ExpandAliases", ab->expand_aliases);
-    libbalsa_conf_set_bool("IsExpensive", ab->is_expensive);
-    libbalsa_conf_set_bool("DistListMode", ab->dist_list_mode);
+    libbalsa_conf_set_string("Name", priv->name);
+    libbalsa_conf_set_bool("ExpandAliases", priv->expand_aliases);
+    libbalsa_conf_set_bool("IsExpensive", priv->is_expensive);
+    libbalsa_conf_set_bool("DistListMode", priv->dist_list_mode);
 
-    g_free(ab->config_prefix);
-    ab->config_prefix = g_strdup(group);
+    g_free(priv->config_prefix);
+    priv->config_prefix = g_strdup(group);
 }
 
 static void
 libbalsa_address_book_real_load_config(LibBalsaAddressBook * ab,
                                       const gchar * group)
 {
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
     gboolean def;
 
     g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
 
-    g_free(ab->config_prefix);
-    ab->config_prefix = g_strdup(group);
+    g_free(priv->config_prefix);
+    priv->config_prefix = g_strdup(group);
 
-    ab->expand_aliases = libbalsa_conf_get_bool("ExpandAliases=false");
+    priv->expand_aliases = libbalsa_conf_get_bool("ExpandAliases=false");
 
-    ab->is_expensive =
+    priv->is_expensive =
         libbalsa_conf_get_bool_with_default("IsExpensive", &def);
     if (def)
         /* Default will be supplied by the backend, or in
          * libbalsa_address_book_load_config. */
-        ab->is_expensive = -1;
+        priv->is_expensive = -1;
 
-    ab->dist_list_mode = libbalsa_conf_get_bool("DistListMode=false");
+    priv->dist_list_mode = libbalsa_conf_get_bool("DistListMode=false");
 
-    g_free(ab->name);
-    ab->name = libbalsa_conf_get_string("Name=Address Book");
+    g_free(priv->name);
+    priv->name = libbalsa_conf_get_string("Name=Address Book");
 }
 
 const gchar*
 libbalsa_address_book_strerror(LibBalsaAddressBook * ab, LibBalsaABErr err)
 {
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
     const gchar *s;
-    g_return_val_if_fail(ab, NULL);
-    if(ab->ext_op_code)
-       return ab->ext_op_code;
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), NULL);
+
+    if(priv->ext_op_code)
+       return priv->ext_op_code;
 
     switch(err) {
     case LBABERR_OK:             s= _("No error"); break;
@@ -322,4 +320,102 @@ libbalsa_address_book_strerror(LibBalsaAddressBook * ab, LibBalsaABErr err)
     return s;
 }
 
+/*
+ * Getters
+ */
+
+gboolean
+libbalsa_address_book_get_expand_aliases(LibBalsaAddressBook * ab)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), FALSE);
+
+    return priv->expand_aliases;
+}
+
+gboolean
+libbalsa_address_book_get_is_expensive(LibBalsaAddressBook * ab)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), FALSE);
+
+    return priv->is_expensive;
+}
+
+gboolean
+libbalsa_address_book_get_dist_list_mode(LibBalsaAddressBook * ab)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), FALSE);
+
+    return priv->dist_list_mode;
+}
+
+const gchar *
+libbalsa_address_book_get_name(LibBalsaAddressBook *ab)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), NULL);
+
+    return priv->name;
+}
+
+const gchar *
+libbalsa_address_book_get_config_prefix(LibBalsaAddressBook *ab)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab), NULL);
+
+    return priv->config_prefix;
+}
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_address_book_set_name(LibBalsaAddressBook *ab, const gchar *name)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+
+    g_free(priv->name);
+    priv->name = g_strdup(name);
+}
+
+void
+libbalsa_address_book_set_is_expensive(LibBalsaAddressBook *ab, gboolean is_expensive)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+
+    priv->is_expensive = is_expensive;
+}
+
+void
+libbalsa_address_book_set_expand_aliases(LibBalsaAddressBook *ab, gboolean expand_aliases)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+
+    priv->expand_aliases = expand_aliases;
+}
+
+void
+libbalsa_address_book_set_dist_list_mode(LibBalsaAddressBook *ab, gboolean dist_list_mode)
+{
+    LibBalsaAddressBookPrivate *priv = libbalsa_address_book_get_instance_private(ab);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK(ab));
+
+    priv->dist_list_mode = dist_list_mode;
+}
 
diff --git a/libbalsa/address-book.h b/libbalsa/address-book.h
index b48e541d0..82d115aa3 100644
--- a/libbalsa/address-book.h
+++ b/libbalsa/address-book.h
@@ -24,13 +24,7 @@
 #include "address.h"
 
 #define LIBBALSA_TYPE_ADDRESS_BOOK                     (libbalsa_address_book_get_type())
-#define LIBBALSA_ADDRESS_BOOK(obj)                     (G_TYPE_CHECK_INSTANCE_CAST (obj, 
LIBBALSA_TYPE_ADDRESS_BOOK, LibBalsaAddressBook))
-#define LIBBALSA_ADDRESS_BOOK_CLASS(klass)             (G_TYPE_CHECK_CLASS_CAST (klass, 
LIBBALSA_TYPE_ADDRESS_BOOK, LibBalsaAddressBookClass))
-#define LIBBALSA_IS_ADDRESS_BOOK(obj)                  (G_TYPE_CHECK_INSTANCE_TYPE (obj, 
LIBBALSA_TYPE_ADDRESS_BOOK))
-#define LIBBALSA_IS_ADDRESS_BOOK_CLASS(klass)          (G_TYPE_CHECK_CLASS_TYPE (klass, 
LIBBALSA_TYPE_ADDRESS_BOOK))
-#define LIBBALSA_ADDRESS_BOOK_GET_CLASS(obj) \
-    (G_TYPE_INSTANCE_GET_CLASS ((obj), LIBBALSA_TYPE_ADDRESS_BOOK, \
-                               LibBalsaAddressBookClass))
+G_DECLARE_DERIVABLE_TYPE(LibBalsaAddressBook, libbalsa_address_book, LIBBALSA, ADDRESS_BOOK, GObject)
 
 typedef enum {
     LBABERR_OK = 0,
@@ -41,28 +35,11 @@ typedef enum {
     LBABERR_DUPLICATE,
     LBABERR_ADDRESS_NOT_FOUND
 } LibBalsaABErr;
-    
-typedef struct _LibBalsaAddressBook LibBalsaAddressBook;
-typedef struct _LibBalsaAddressBookClass LibBalsaAddressBookClass;
 
 typedef LibBalsaABErr (*LibBalsaAddressBookLoadFunc)(LibBalsaAddressBook *ab,
                                                      LibBalsaAddress *address,
                                                      gpointer closure);
 
-struct _LibBalsaAddressBook {
-    GObject parent;
-
-    /* The gnome_config prefix where we save this address book */
-    gchar *config_prefix;
-    gchar *name;
-    gchar *ext_op_code;    /* extra description for last operation */
-    gboolean is_expensive; /* is lookup to the address book expensive? 
-                             e.g. LDAP address book */
-    gboolean expand_aliases;
-
-    gboolean dist_list_mode;
-};
-
 struct _LibBalsaAddressBookClass {
     GObjectClass parent;
 
@@ -120,8 +97,7 @@ LibBalsaABErr libbalsa_address_book_modify_address(LibBalsaAddressBook *ab,
                                                    LibBalsaAddress *address,
                                                    LibBalsaAddress *newval);
 
-/* set_status takes over the string ownership */
-void libbalsa_address_book_set_status(LibBalsaAddressBook * ab, gchar *str);
+void libbalsa_address_book_set_status(LibBalsaAddressBook * ab, const gchar *str);
 void libbalsa_address_book_save_config(LibBalsaAddressBook * ab,
                                       const gchar * prefix);
 void libbalsa_address_book_load_config(LibBalsaAddressBook * ab,
@@ -139,8 +115,26 @@ 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);
+gboolean libbalsa_address_is_dist_list(LibBalsaAddressBook *ab,
+                                      LibBalsaAddress *address);
+
+/*
+ * Getters
+ */
+gboolean libbalsa_address_book_get_dist_list_mode(LibBalsaAddressBook *ab);
+gboolean libbalsa_address_book_get_expand_aliases(LibBalsaAddressBook *ab);
+gboolean libbalsa_address_book_get_is_expensive(LibBalsaAddressBook *ab);
+const gchar *libbalsa_address_book_get_name(LibBalsaAddressBook *ab);
+const gchar *libbalsa_address_book_get_config_prefix(LibBalsaAddressBook *ab);
+
+/*
+ * Setters
+ */
+void libbalsa_address_book_set_dist_list_mode(LibBalsaAddressBook *ab, gboolean dist_list_mode);
+void libbalsa_address_book_set_expand_aliases(LibBalsaAddressBook *ab, gboolean expand_aliases);
+void libbalsa_address_book_set_is_expensive(LibBalsaAddressBook *ab, gboolean is_expensive);
+void libbalsa_address_book_set_name(LibBalsaAddressBook *ab, const gchar *name);
+
 
 #endif
 
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index b70f0ffee..8d1fe3a48 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -190,7 +190,8 @@ lbav_get_matching_addresses(LibBalsaAddressView * address_view,
 
         ab = LIBBALSA_ADDRESS_BOOK(list->data);
         if (type == LIBBALSA_ADDRESS_VIEW_MATCH_FAST
-            && (!ab->expand_aliases || ab->is_expensive))
+            && (!libbalsa_address_book_get_expand_aliases(ab) ||
+                libbalsa_address_book_get_is_expensive(ab)))
             continue;
 
         match =
diff --git a/src/ab-main.c b/src/ab-main.c
index b8276f7bb..6f44998e2 100644
--- a/src/ab-main.c
+++ b/src/ab-main.c
@@ -175,7 +175,7 @@ bab_set_address_book(LibBalsaAddressBook * ab,
          libbalsa_address_book_load(ab, filter,
                                     (LibBalsaAddressBookLoadFunc)
                                     bab_load_cb, model)) != LBABERR_OK) {
-        printf("error loading address book from %s: %d\n", ab->name,
+        printf("error loading address book from %s: %d\n", libbalsa_address_book_get_name(ab),
                ab_err);
     }
 
@@ -208,7 +208,7 @@ bab_window_set_title(LibBalsaAddressBook * address_book)
 #endif /* HAVE_RUBRICA */
 
     title =
-        g_strconcat(type, _(" address book: "), address_book->name, NULL);
+        g_strconcat(type, _(" address book: "), libbalsa_address_book_get_name(address_book), NULL);
     gtk_window_set_title(contacts_app.window, title);
     g_free(title);
 }
@@ -225,7 +225,7 @@ address_book_change_state(GSimpleAction * action,
     value = g_variant_get_string(state, NULL);
     for (l = contacts_app.address_book_list; l; l = l->next) {
         address_book = l->data;
-        if (address_book && strcmp(value, address_book->name) == 0)
+        if (address_book && strcmp(value, libbalsa_address_book_get_name(address_book)) == 0)
             break;
     }
 
@@ -276,7 +276,7 @@ set_address_book_menu_items(void)
 
         g_string_append(string, "<attribute name='label'>");
         g_string_append_printf(string, "_%d:%s", ++pos,
-                               address_book->name);
+                               libbalsa_address_book_get_name(address_book));
         g_string_append(string, "</attribute>");
 
         g_string_append(string, "<attribute name='action'>");
@@ -284,7 +284,7 @@ set_address_book_menu_items(void)
         g_string_append(string, "</attribute>");
 
         g_string_append(string, "<attribute name='target'>");
-        g_string_append(string, address_book->name);
+        g_string_append(string, libbalsa_address_book_get_name(address_book));
         g_string_append(string, "</attribute>");
 
         g_string_append(string, "<attribute name='accel'>");
@@ -337,17 +337,20 @@ get_unused_group(const gchar * prefix)
 static void
 address_book_change(LibBalsaAddressBook * address_book, gboolean append)
 {
+    const gchar *config_prefix;
     gchar *group;
 
-    if (append)
+    if (append) {
         contacts_app.address_book_list =
             g_list_append(contacts_app.address_book_list, address_book);
+    }
 
     set_address_book_menu_items();
     bab_window_set_title(address_book);
 
-    group = address_book->config_prefix ?
-        g_strdup(address_book->config_prefix) :
+    config_prefix = libbalsa_address_book_get_config_prefix(address_book);
+    group = config_prefix != NULL ?
+        g_strdup(config_prefix) :
         get_unused_group(ADDRESS_BOOK_SECTION_PREFIX);
     libbalsa_address_book_save_config(address_book, group);
     g_free(group);
@@ -441,15 +444,17 @@ file_delete_activated(GSimpleAction * action,
                       gpointer        user_data)
 {
     LibBalsaAddressBook *address_book;
+    const gchar *config_prefix;
     GList *list;
 
     if (!(address_book = contacts_app.address_book)
         || !g_list_next(contacts_app.address_book_list))
         return;
 
-    if (address_book->config_prefix) {
-        libbalsa_conf_remove_group(address_book->config_prefix);
-        libbalsa_conf_private_remove_group(address_book->config_prefix);
+    config_prefix = libbalsa_address_book_get_config_prefix(address_book);
+    if (config_prefix != NULL) {
+        libbalsa_conf_remove_group(config_prefix);
+        libbalsa_conf_private_remove_group(config_prefix);
         libbalsa_conf_queue_sync();
     }
 
@@ -1029,7 +1034,7 @@ bab_set_intial_address_book(LibBalsaAddressBook * ab,
 
     action =
         g_action_map_lookup_action(G_ACTION_MAP(window), "address-book");
-    g_action_change_state(action, g_variant_new_string(ab->name));
+    g_action_change_state(action, g_variant_new_string(libbalsa_address_book_get_name(ab)));
 }
 
 GtkDialogFlags
diff --git a/src/ab-window.c b/src/ab-window.c
index d3820a022..53bc209f3 100644
--- a/src/ab-window.c
+++ b/src/ab-window.c
@@ -215,7 +215,7 @@ balsa_ab_window_load_books(BalsaAbWindow * ab)
         LibBalsaAddressBook *address_book = ab_list->data;
 
         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(ab->combo_box),
-                                  address_book->name);
+                                       libbalsa_address_book_get_name(address_book));
 
         if (ab->current_address_book == NULL)
             ab->current_address_book = address_book;
@@ -401,7 +401,7 @@ balsa_ab_window_init(BalsaAbWindow *ab)
     if(ab->current_address_book)
        gtk_toggle_button_set_active(
            GTK_TOGGLE_BUTTON(ab->dist_address_mode_radio),
-           ab->current_address_book->dist_list_mode);
+           libbalsa_address_book_get_dist_list_mode(ab->current_address_book));
 
     /* Pack them into a box  */
     box2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1);
@@ -703,7 +703,8 @@ balsa_ab_window_set_title(BalsaAbWindow *ab)
 #endif
 
     title =
-        g_strconcat(type, _(" address book: "), address_book->name, NULL);
+        g_strconcat(type, _(" address book: "),
+                    libbalsa_address_book_get_name(address_book), NULL);
     gtk_window_set_title(GTK_WINDOW(ab), title);
     g_free(title);
 }
@@ -732,7 +733,8 @@ balsa_ab_window_load(BalsaAbWindow *ab)
         balsa_information_parented(GTK_WINDOW(ab),
                                   LIBBALSA_INFORMATION_ERROR,
                                   _("Error opening address book ā€œ%sā€:\n%s"),
-                                  ab->current_address_book->name, desc);
+                                  libbalsa_address_book_get_name(ab->current_address_book),
+                                   desc);
     }
     balsa_ab_window_set_title(ab);
 }
@@ -860,7 +862,7 @@ balsa_ab_window_dist_mode_toggled(GtkWidget * w, BalsaAbWindow *ab)
     active = gtk_toggle_button_get_active
        (GTK_TOGGLE_BUTTON(ab->single_address_mode_radio));
 
-    ab->current_address_book->dist_list_mode = !active;
+    libbalsa_address_book_set_dist_list_mode(ab->current_address_book, !active);
 
     balsa_ab_window_load(ab);
 }
@@ -881,7 +883,7 @@ balsa_ab_window_menu_changed(GtkWidget * widget, BalsaAbWindow *ab)
 
     g_signal_handler_block(G_OBJECT(ab->single_address_mode_radio),
                           ab->toggle_handler_id);
-    if ( ab->current_address_book->dist_list_mode )
+    if (libbalsa_address_book_get_dist_list_mode(ab->current_address_book))
        gtk_toggle_button_set_active(
            GTK_TOGGLE_BUTTON(ab->dist_address_mode_radio), TRUE);
     else
diff --git a/src/address-book-config.c b/src/address-book-config.c
index 87a7f4632..a280d97ca 100644
--- a/src/address-book-config.c
+++ b/src/address-book-config.c
@@ -200,10 +200,10 @@ add_radio_buttons(GtkWidget * grid, gint row, AddressBookConfig * abc)
     gtk_grid_attach(GTK_GRID(grid), abc->never, 0, row, 2, 1);
 
     button = abc->as_i_type;
-    if (abc->address_book) {
-        if (!abc->address_book->expand_aliases)
+    if (abc->address_book != NULL) {
+        if (!libbalsa_address_book_get_expand_aliases(abc->address_book))
             button = abc->never;
-        else if (abc->address_book->is_expensive)
+        else if (libbalsa_address_book_get_is_expensive(abc->address_book))
             button = abc->on_request;
     }
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@@ -222,10 +222,10 @@ create_local_dialog(AddressBookConfig * abc, const gchar * type)
     GtkSizeGroup *size_group;
 
     ab = abc->address_book;
-    if (ab) {
+    if (ab != NULL) {
         title = g_strdup_printf(_("Modify %s Address Book"), type);
         action = _("_Apply");
-        name = ab->name;
+        name = libbalsa_address_book_get_name(ab);
     } else {
         title = g_strdup_printf(_("Add %s Address Book"), type);
         action = _("_Add");
@@ -374,7 +374,7 @@ create_osmo_dialog(AddressBookConfig *abc)
     if (ab) {
         title = g_strdup_printf(_("Modify Osmo Address Book"));
         action = _("_Apply");
-        name = ab->name;
+        name = libbalsa_address_book_get_name(ab);
     } else {
         title = g_strdup_printf(_("Add Osmo Address Book"));
         action = _("_Add");
@@ -425,8 +425,10 @@ create_externq_dialog(AddressBookConfig * abc)
     /* mailbox name */
 
     label = libbalsa_create_grid_label(_("A_ddress Book Name:"), grid, 0);
-    abc->name_entry = libbalsa_create_grid_entry(grid, NULL, NULL, 0, 
-                                  ab ? abc->address_book->name : NULL, 
+    abc->name_entry =
+        libbalsa_create_grid_entry(grid, NULL, NULL, 0,
+                                  ab != NULL ?
+                                   libbalsa_address_book_get_name(LIBBALSA_ADDRESS_BOOK(ab)) : NULL,
                                   label);
 
     label = gtk_label_new(_("Load program location:"));
@@ -491,8 +493,10 @@ create_ldap_dialog(AddressBookConfig * abc)
     /* mailbox name */
 
     label = libbalsa_create_grid_label(_("A_ddress Book Name:"), grid, 0);
-    abc->name_entry = libbalsa_create_grid_entry(grid, NULL, NULL, 0, 
-                                  ab ? abc->address_book->name : name, 
+    abc->name_entry =
+        libbalsa_create_grid_entry(grid, NULL, NULL, 0, 
+                                  ab != NULL ?
+                                   libbalsa_address_book_get_name(LIBBALSA_ADDRESS_BOOK(ab)) : name,
                                   label);
 
     label = libbalsa_create_grid_label(_("_Host Name"), grid, 1);
@@ -558,8 +562,10 @@ create_gpe_dialog(AddressBookConfig * abc)
     /* mailbox name */
 
     label = libbalsa_create_grid_label(_("A_ddress Book Name:"), grid, 0);
-    abc->name_entry = libbalsa_create_grid_entry(grid, NULL, NULL, 0, 
-                                  ab ? ab->name : _("GPE Address Book"), 
+    abc->name_entry =
+        libbalsa_create_grid_entry(grid, NULL, NULL, 0,
+                                  ab != NULL ?  libbalsa_address_book_get_name(ab) :
+                                   _("GPE Address Book"),
                                   label);
 
     add_radio_buttons(grid, 1, abc);
@@ -755,11 +761,11 @@ create_book(AddressBookConfig * abc)
     } else
         g_assert_not_reached();
 
-    if (address_book) {
-        address_book->expand_aliases =
-            !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->never));
-        address_book->is_expensive =
-            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->on_request));
+    if (address_book != NULL) {
+        libbalsa_address_book_set_expand_aliases(address_book,
+            !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->never)));
+        libbalsa_address_book_set_is_expensive(address_book,
+            gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->on_request)));
         abc->callback(address_book, TRUE);
     }
 
@@ -771,9 +777,8 @@ modify_book(AddressBookConfig * abc)
 {
     LibBalsaAddressBook *address_book = abc->address_book;
 
-    g_free(address_book->name);
-    address_book->name =
-        g_strdup(gtk_entry_get_text(GTK_ENTRY(abc->name_entry)));
+    libbalsa_address_book_set_name(address_book,
+        gtk_entry_get_text(GTK_ENTRY(abc->name_entry)));
 
     if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_VCARD
         || abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_LDIF
@@ -846,10 +851,10 @@ modify_book(AddressBookConfig * abc)
     } else
         g_assert_not_reached();
 
-    address_book->expand_aliases =
-        !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->never));
-    address_book->is_expensive =
-        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->on_request));
+    libbalsa_address_book_set_expand_aliases(address_book,
+        !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->never)));
+    libbalsa_address_book_set_is_expensive(address_book,
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(abc->on_request)));
 
     abc->callback(address_book, FALSE);
 }
diff --git a/src/pref-manager.c b/src/pref-manager.c
index f81944e3d..43d7b636b 100644
--- a/src/pref-manager.c
+++ b/src/pref-manager.c
@@ -943,16 +943,16 @@ update_address_books(void)
             type = _("Unknown");
 
         if (address_book == balsa_app.default_address_book) {
-            name = g_strdup_printf(_("%s (default)"), address_book->name);
+            name = g_strdup_printf(_("%s (default)"), libbalsa_address_book_get_name(address_book));
         } else {
-            name = g_strdup(address_book->name);
+            name = g_strdup(libbalsa_address_book_get_name(address_book));
         }
         gtk_list_store_append(GTK_LIST_STORE(model), &iter);
         gtk_list_store_set(GTK_LIST_STORE(model), &iter,
                            AB_TYPE_COLUMN, type,
                            AB_NAME_COLUMN, name,
-                           AB_XPND_COLUMN, (address_book->expand_aliases
-                                            && !address_book->is_expensive),
+                           AB_XPND_COLUMN, (libbalsa_address_book_get_expand_aliases(address_book)
+                                            && !libbalsa_address_book_get_is_expensive(address_book)),
                            AB_DATA_COLUMN, address_book, -1);
 
         g_free(name);
diff --git a/src/save-restore.c b/src/save-restore.c
index ba7b025ab..29f4c08e6 100644
--- a/src/save-restore.c
+++ b/src/save-restore.c
@@ -79,10 +79,14 @@ static inline gboolean is_special_name(const gchar *name);
     g_strdup(LIBBALSA_MAILBOX(mbox)->config_prefix) : \
     config_get_unused_group(MAILBOX_SECTION_PREFIX)
 
-#define address_book_section_path(ab) \
-    LIBBALSA_ADDRESS_BOOK(ab)->config_prefix ? \
-    g_strdup(LIBBALSA_ADDRESS_BOOK(ab)->config_prefix) : \
-    config_get_unused_group(ADDRESS_BOOK_SECTION_PREFIX)
+static gchar *
+address_book_section_path(LibBalsaAddressBook *address_book)
+{
+    const gchar *config_prefix = libbalsa_address_book_get_config_prefix(address_book);
+
+    return config_prefix != NULL ? g_strdup(config_prefix) :
+        config_get_unused_group(ADDRESS_BOOK_SECTION_PREFIX);
+}
 
 gint config_load(void)
 {
@@ -327,9 +331,11 @@ config_address_book_save(LibBalsaAddressBook * ab)
 void
 config_address_book_delete(LibBalsaAddressBook * ab)
 {
-    if (ab->config_prefix) {
-       libbalsa_conf_remove_group(ab->config_prefix);
-       libbalsa_conf_private_remove_group(ab->config_prefix);
+    const gchar *config_prefix = libbalsa_address_book_get_config_prefix(ab);
+
+    if (config_prefix != NULL) {
+       libbalsa_conf_remove_group(config_prefix);
+       libbalsa_conf_private_remove_group(config_prefix);
        libbalsa_conf_queue_sync();
     }
 }
@@ -1486,10 +1492,10 @@ config_save(void)
 
     libbalsa_conf_set_bool("EmptyTrash", balsa_app.empty_trash_on_exit);
 
-    if (balsa_app.default_address_book)
+    if (balsa_app.default_address_book != NULL)
         libbalsa_conf_set_string("DefaultAddressBook",
-                                 balsa_app.default_address_book->
-                                 config_prefix);
+                                 libbalsa_address_book_get_config_prefix
+                                 (balsa_app.default_address_book));
     else
        libbalsa_conf_clean_key("DefaultAddressBook");
 
diff --git a/src/store-address.c b/src/store-address.c
index 288a3a24e..199c3f1f0 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -308,7 +308,7 @@ store_address_book_frame(StoreAddressInfo * info)
             info->current_address_book = address_book;
 
         gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box),
-                                       address_book->name);
+                                       libbalsa_address_book_get_name(address_book));
         if (address_book == balsa_app.default_address_book)
             default_ab_offset = off;
     }
@@ -457,7 +457,7 @@ store_address_add_list(StoreAddressInfo    * info,
 
         if (INTERNET_ADDRESS_IS_MAILBOX(ia)) {
             store_address_add_address(info, label, ia, NULL);
-        } else if (info->current_address_book->dist_list_mode) {
+        } else if (libbalsa_address_book_get_dist_list_mode(info->current_address_book)) {
             store_address_add_address(info, label, ia, ia);
         } else {
             InternetAddressList *members =


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