[balsa] Declare LibBalsaAddressBookText derivable



commit 3ee8ec996a6eb9ee94a2bd5c4338e17d8454f32d
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Tue May 14 20:50:55 2019 -0400

    Declare LibBalsaAddressBookText derivable
    
    Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaAddressBookText
    and provide and use the necessary getters and setters.
    
    * libbalsa/address-book-ldif.c (libbalsa_address_book_ldif_new):
    * libbalsa/address-book-rubrica.c
      (libbalsa_address_book_rubrica_class_init),
      (libbalsa_address_book_rubrica_init),
      (libbalsa_address_book_rubrica_new),
      (libbalsa_address_book_rubrica_load),
      (libbalsa_address_book_rubrica_alias_complete),
      (libbalsa_address_book_rubrica_add_address),
      (libbalsa_address_book_rubrica_modify_address),
      (lbab_rubrica_load_xml):
    * libbalsa/address-book-text.c (lbab_text_item_free),
      (libbalsa_address_book_text_class_init),
      (libbalsa_address_book_text_init),
      (libbalsa_address_book_text_finalize),
      (lbab_text_address_book_need_reload), (lbab_text_load_file),
      (lbab_text_lock_book), (lbab_text_unlock_book),
      (lbab_text_open_temp), (lbab_text_close_temp),
      (libbalsa_address_book_text_load),
      (libbalsa_address_book_text_add_address),
      (libbalsa_address_book_text_modify_address),
      (libbalsa_address_book_text_save_config),
      (libbalsa_address_book_text_load_config),
      (libbalsa_address_book_text_alias_complete),
      (libbalsa_address_book_text_get_path),
      (libbalsa_address_book_text_get_item_list),
      (libbalsa_address_book_text_get_mtime),
      (libbalsa_address_book_text_get_name_complete),
      (libbalsa_address_book_text_set_path),
      (libbalsa_address_book_text_set_item_list),
      (libbalsa_address_book_text_set_mtime),
      (libbalsa_address_book_text_set_name_complete):
    * libbalsa/address-book-text.h:
    * libbalsa/address-book-vcard.c (libbalsa_address_book_vcard_new):
    * src/address-book-config.c (create_local_dialog), (modify_book):

 ChangeLog                       |  41 ++++++
 libbalsa/address-book-ldif.c    |   2 +-
 libbalsa/address-book-rubrica.c | 113 +++++++--------
 libbalsa/address-book-text.c    | 300 ++++++++++++++++++++++++++++------------
 libbalsa/address-book-text.h    |  67 +++++----
 libbalsa/address-book-vcard.c   |   2 +-
 src/address-book-config.c       |   9 +-
 7 files changed, 340 insertions(+), 194 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 08ed19ceb..d52d88e35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,44 @@
+2019-05-14  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaAddressBookText
+
+       and provide and use the necessary getters and setters.
+
+       * libbalsa/address-book-ldif.c (libbalsa_address_book_ldif_new):
+       * libbalsa/address-book-rubrica.c
+       (libbalsa_address_book_rubrica_class_init),
+       (libbalsa_address_book_rubrica_init),
+       (libbalsa_address_book_rubrica_new),
+       (libbalsa_address_book_rubrica_load),
+       (libbalsa_address_book_rubrica_alias_complete),
+       (libbalsa_address_book_rubrica_add_address),
+       (libbalsa_address_book_rubrica_modify_address),
+       (lbab_rubrica_load_xml):
+       * libbalsa/address-book-text.c (lbab_text_item_free),
+       (libbalsa_address_book_text_class_init),
+       (libbalsa_address_book_text_init),
+       (libbalsa_address_book_text_finalize),
+       (lbab_text_address_book_need_reload), (lbab_text_load_file),
+       (lbab_text_lock_book), (lbab_text_unlock_book),
+       (lbab_text_open_temp), (lbab_text_close_temp),
+       (libbalsa_address_book_text_load),
+       (libbalsa_address_book_text_add_address),
+       (libbalsa_address_book_text_modify_address),
+       (libbalsa_address_book_text_save_config),
+       (libbalsa_address_book_text_load_config),
+       (libbalsa_address_book_text_alias_complete),
+       (libbalsa_address_book_text_get_path),
+       (libbalsa_address_book_text_get_item_list),
+       (libbalsa_address_book_text_get_mtime),
+       (libbalsa_address_book_text_get_name_complete),
+       (libbalsa_address_book_text_set_path),
+       (libbalsa_address_book_text_set_item_list),
+       (libbalsa_address_book_text_set_mtime),
+       (libbalsa_address_book_text_set_name_complete):
+       * libbalsa/address-book-text.h:
+       * libbalsa/address-book-vcard.c (libbalsa_address_book_vcard_new):
+       * src/address-book-config.c (create_local_dialog), (modify_book):
+
 2019-05-13  Peter Bloomfield  <pbloomfield bellsouth net>
 
        Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaAddressBook
diff --git a/libbalsa/address-book-ldif.c b/libbalsa/address-book-ldif.c
index 67c99cfea..e5e147b0f 100644
--- a/libbalsa/address-book-ldif.c
+++ b/libbalsa/address-book-ldif.c
@@ -98,7 +98,7 @@ libbalsa_address_book_ldif_new(const gchar * name, const gchar * path)
     ab = LIBBALSA_ADDRESS_BOOK(ab_ldif);
 
     libbalsa_address_book_set_name(ab, name);
-    LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path);
+    libbalsa_address_book_text_set_path(LIBBALSA_ADDRESS_BOOK_TEXT(ab), path);
 
     return ab;
 }
diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c
index 13a1ba13f..8aa2f8641 100644
--- a/libbalsa/address-book-rubrica.c
+++ b/libbalsa/address-book-rubrica.c
@@ -50,7 +50,6 @@ libbalsa_address_book_rubrica_class_init(LibBalsaAddressBookRubricaClass *
                                         klass);
 static void libbalsa_address_book_rubrica_init(LibBalsaAddressBookRubrica *
                                               ab_rubrica);
-static void libbalsa_address_book_rubrica_finalize(GObject * object);
 
 static LibBalsaABErr libbalsa_address_book_rubrica_load(LibBalsaAddressBook
                                                        * ab,
@@ -99,12 +98,10 @@ libbalsa_address_book_rubrica_class_init(LibBalsaAddressBookRubricaClass *
                                         klass)
 {
     LibBalsaAddressBookClass *address_book_class;
-    GObjectClass *object_class;
+    LibBalsaAddressBookTextClass *address_book_text_class;
 
-    object_class = G_OBJECT_CLASS(klass);
     address_book_class = LIBBALSA_ADDRESS_BOOK_CLASS(klass);
-
-    object_class->finalize = libbalsa_address_book_rubrica_finalize;
+    address_book_text_class = LIBBALSA_ADDRESS_BOOK_TEXT_CLASS(klass);
 
     address_book_class->load = libbalsa_address_book_rubrica_load;
     address_book_class->add_address =
@@ -116,6 +113,8 @@ libbalsa_address_book_rubrica_class_init(LibBalsaAddressBookRubricaClass *
 
     address_book_class->alias_complete =
        libbalsa_address_book_rubrica_alias_complete;
+
+    address_book_text_class->text_item_free_func = g_object_unref;
 }
 
 static void
@@ -123,33 +122,18 @@ libbalsa_address_book_rubrica_init(LibBalsaAddressBookRubrica * ab_rubrica)
 {
     LibBalsaAddressBookText *ab_text =
         LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica);
-    ab_text->path = NULL;
-    ab_text->item_list = NULL;
-    ab_text->mtime = 0;
-
-    if (ab_text->name_complete != NULL)
-        libbalsa_completion_free(ab_text->name_complete);
-    ab_text->name_complete =
-        libbalsa_completion_new((LibBalsaCompletionFunc)
-                                completion_data_extract);
-    libbalsa_completion_set_compare(ab_text->name_complete, strncmp_word);
-}
-
-static void
-libbalsa_address_book_rubrica_finalize(GObject * object)
-{
-    LibBalsaAddressBookText *ab_text;
-
-    ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
 
-    /* item_list is different from the default
-     * LibBalsaAddressBookText::item_list, so we free it here. */
-    g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
-
-    (*G_OBJECT_CLASS(libbalsa_address_book_rubrica_parent_class)->
-     finalize) (object);
+    libbalsa_address_book_text_set_path(ab_text, NULL);
+    libbalsa_address_book_text_set_item_list(ab_text, NULL);
+    libbalsa_address_book_text_set_mtime(ab_text, 0);
+
+    if (libbalsa_address_book_text_get_name_complete(ab_text) != NULL)
+        libbalsa_completion_free(libbalsa_address_book_text_get_name_complete(ab_text));
+    libbalsa_address_book_text_set_name_complete(ab_text,
+                                                 libbalsa_completion_new((LibBalsaCompletionFunc)
+                                                                          completion_data_extract));
+    libbalsa_completion_set_compare(libbalsa_address_book_text_get_name_complete(ab_text),
+                                    strncmp_word);
 }
 
 /* Public method */
@@ -168,7 +152,7 @@ libbalsa_address_book_rubrica_new(const gchar * name, const gchar * path)
     ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica);
 
     libbalsa_address_book_set_name(ab, name);
-    ab_text->path = g_strdup(path);
+    libbalsa_address_book_text_set_path(ab_text, path);
 
     return ab;
 }
@@ -183,11 +167,12 @@ libbalsa_address_book_rubrica_load(LibBalsaAddressBook * ab,
     LibBalsaAddressBookRubrica *ab_rubrica =
        LIBBALSA_ADDRESS_BOOK_RUBRICA(ab);
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    const gchar *path = libbalsa_address_book_text_get_path(ab_text);
     LibBalsaABErr load_res;
     gchar *filter_hi = NULL;
     GSList *list;
 
-    g_return_val_if_fail(ab_text->path != NULL, LBABERR_CANNOT_READ);
+    g_return_val_if_fail(path != NULL, LBABERR_CANNOT_READ);
 
     /* try to load the xml file if necessary */
     load_res = lbab_rubrica_load_xml(ab_rubrica, NULL);
@@ -197,7 +182,7 @@ libbalsa_address_book_rubrica_load(LibBalsaAddressBook * ab,
     if (filter)
        filter_hi = g_utf8_strup(filter, -1);
 
-    for (list = ab_text->item_list; list; list = list->next) {
+    for (list = libbalsa_address_book_text_get_item_list(ab_text); list != NULL; list = list->next) {
        LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data);
 
        if (!address)
@@ -235,7 +220,7 @@ libbalsa_address_book_rubrica_alias_complete(LibBalsaAddressBook * ab,
         return NULL;
 
     for (list =
-         libbalsa_completion_complete(ab_text->name_complete,
+         libbalsa_completion_complete(libbalsa_address_book_text_get_name_complete(ab_text),
                                       (gchar *) prefix);
          list; list = list->next) {
         InternetAddress *ia = ((CompletionData *) list->data)->ia;
@@ -253,6 +238,7 @@ libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab,
     LibBalsaAddressBookRubrica *ab_rubrica =
        LIBBALSA_ADDRESS_BOOK_RUBRICA(ab);
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    const gchar *path = libbalsa_address_book_text_get_path(ab_text);
     int fd;
     xmlDocPtr doc = NULL;
     xmlNodePtr root_element = NULL;
@@ -264,18 +250,18 @@ libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab,
        return result;
 
     /* eject if we already have this address */
-    if (g_slist_find_custom(ab_text->item_list, new_address,
+    if (g_slist_find_custom(libbalsa_address_book_text_get_item_list(ab_text), new_address,
                            (GCompareFunc) address_compare)) {
        xmlFreeDoc(doc);
        return LBABERR_DUPLICATE;
     }
 
     /* try to open the address book for writing */
-    if ((fd = open(ab_text->path, O_WRONLY | O_CREAT, 0666)) == -1) {
+    if ((fd = open(path, O_WRONLY | O_CREAT, 0666)) == -1) {
        xmlFreeDoc(doc);
        return LBABERR_CANNOT_WRITE;
     }
-    if (libbalsa_lock_file(ab_text->path, fd, TRUE, TRUE, FALSE) < 0) {
+    if (libbalsa_lock_file(path, fd, TRUE, TRUE, FALSE) < 0) {
        xmlFreeDoc(doc);
        close(fd);
        return LBABERR_CANNOT_WRITE;
@@ -298,14 +284,15 @@ libbalsa_address_book_rubrica_add_address(LibBalsaAddressBook * ab,
     lbab_insert_address_node(new_address, root_element);
 
     /* store the document */
-    if (xmlSaveFormatFileEnc(ab_text->path, doc, "UTF-8", 1) == -1)
+    if (xmlSaveFormatFileEnc(path, doc, "UTF-8", 1) == -1)
        result = LBABERR_CANNOT_WRITE;
     else
        result = LBABERR_OK;
-    libbalsa_unlock_file(ab_text->path, fd, FALSE);
+    libbalsa_unlock_file(path, fd, FALSE);
     close(fd);
     xmlFreeDoc(doc);
-    ab_text->mtime = 0;        /* force re-load upon the next access */
+    /* force re-load upon the next access: */
+    libbalsa_address_book_text_set_mtime(ab_text, 0);
 
     /* done */
     return result;
@@ -328,6 +315,7 @@ libbalsa_address_book_rubrica_modify_address(LibBalsaAddressBook * ab,
     LibBalsaAddressBookRubrica *ab_rubrica =
        LIBBALSA_ADDRESS_BOOK_RUBRICA(ab);
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    const gchar *path = libbalsa_address_book_text_get_path(ab_text);
     int fd;
     xmlDocPtr doc = NULL;
     xmlNodePtr root_element;
@@ -371,25 +359,26 @@ libbalsa_address_book_rubrica_modify_address(LibBalsaAddressBook * ab,
        lbab_insert_address_node(newval, root_element);
 
     /* try to open the address book for writing */
-    if ((fd = open(ab_text->path, O_WRONLY | O_CREAT, 0666)) == -1) {
+    if ((fd = open(path, O_WRONLY | O_CREAT, 0666)) == -1) {
        xmlFreeDoc(doc);
        return LBABERR_CANNOT_WRITE;
     }
-    if (libbalsa_lock_file(ab_text->path, fd, TRUE, TRUE, FALSE) < 0) {
+    if (libbalsa_lock_file(path, fd, TRUE, TRUE, FALSE) < 0) {
        xmlFreeDoc(doc);
        close(fd);
        return LBABERR_CANNOT_WRITE;
     }
 
     /* store the document */
-    if (xmlSaveFormatFileEnc(ab_text->path, doc, "UTF-8", 1) == -1)
+    if (xmlSaveFormatFileEnc(path, doc, "UTF-8", 1) == -1)
        result = LBABERR_CANNOT_WRITE;
     else
        result = LBABERR_OK;
-    libbalsa_unlock_file(ab_text->path, fd, FALSE);
+    libbalsa_unlock_file(path, fd, FALSE);
     close(fd);
     xmlFreeDoc(doc);
-    ab_text->mtime = 0;        /* force re-load upon the next access */
+    /* force re-load upon the next access: */
+    libbalsa_address_book_text_set_mtime(ab_text, 0);
 
     /* done */
     return result;
@@ -402,6 +391,7 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
 {
     LibBalsaAddressBookText *ab_text =
         LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica);
+    const gchar *path = libbalsa_address_book_text_get_path(ab_text);
     struct stat stat_buf;
     int fd;
     xmlDocPtr doc = NULL;
@@ -415,33 +405,30 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
        *docptr = NULL;
 
     /* eject if the file did not change on disk and no document result pointer is passed */
-    if (!docptr && stat(ab_text->path, &stat_buf) == 0) {
-       if (stat_buf.st_mtime == ab_text->mtime)
+    if (!docptr && stat(path, &stat_buf) == 0) {
+       if (stat_buf.st_mtime == libbalsa_address_book_text_get_mtime(ab_text))
            return LBABERR_OK;
        else
-           ab_text->mtime = stat_buf.st_mtime;
+           libbalsa_address_book_text_set_mtime(ab_text, stat_buf.st_mtime);
     }
 
     /* free old data */
-    g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
+    libbalsa_address_book_text_set_item_list(ab_text, NULL);
 
-    g_list_foreach(ab_text->name_complete->items,
+    g_list_foreach(libbalsa_address_book_text_get_name_complete(ab_text)->items,
                   (GFunc) completion_data_free, NULL);
-    libbalsa_completion_clear_items(ab_text->name_complete);
-
+    libbalsa_completion_clear_items(libbalsa_address_book_text_get_name_complete(ab_text));
 
     /* try to read the address book */
-    if ((fd = open(ab_text->path, O_RDONLY)) == -1)
+    if ((fd = open(path, O_RDONLY)) == -1)
        return LBABERR_CANNOT_READ;
-    if (libbalsa_lock_file(ab_text->path, fd, FALSE, TRUE, FALSE) < 0) {
+    if (libbalsa_lock_file(path, fd, FALSE, TRUE, FALSE) < 0) {
        close(fd);
        return LBABERR_CANNOT_READ;
     }
 
-    doc = xmlParseFile(ab_text->path);
-    libbalsa_unlock_file(ab_text->path, fd, FALSE);
+    doc = xmlParseFile(path);
+    libbalsa_unlock_file(path, fd, FALSE);
     close(fd);
     if (!doc)
        return LBABERR_CANNOT_READ;
@@ -449,7 +436,8 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     /* Get the root element node and extract cards if it is a Rubrica book */
     root_element = xmlDocGetRootElement(doc);
     if (!xmlStrcmp(root_element->name, CXMLCHARP("Rubrica")))
-       ab_text->item_list = extract_cards(root_element->children);
+        libbalsa_address_book_text_set_item_list(ab_text,
+                                                 extract_cards(root_element->children));
 
     /* return the document if requested of free it */
     if (docptr)
@@ -460,7 +448,7 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     /* build the completion list */
     // FIXME - Rubrica provides groups...
     completion_list = NULL;
-    for (list = ab_text->item_list; list; list = list->next) {
+    for (list = libbalsa_address_book_text_get_item_list(ab_text); list != NULL; list = list->next) {
        LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data);
        GList *l;
 
@@ -499,7 +487,8 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     }
 
     completion_list = g_list_reverse(completion_list);
-    libbalsa_completion_add_items(ab_text->name_complete, completion_list);
+    libbalsa_completion_add_items(libbalsa_address_book_text_get_name_complete(ab_text),
+                                  completion_list);
     g_list_free(completion_list);
 
     return LBABERR_OK;
diff --git a/libbalsa/address-book-text.c b/libbalsa/address-book-text.c
index 801acdfd6..abb77b269 100644
--- a/libbalsa/address-book-text.c
+++ b/libbalsa/address-book-text.c
@@ -44,8 +44,6 @@
 /* FIXME: Arbitrary constant */
 #define LINE_LEN 256
 
-static LibBalsaAddressBookClass *parent_class = NULL;
-
 static void
 libbalsa_address_book_text_class_init(LibBalsaAddressBookTextClass *
                                       klass);
@@ -82,31 +80,31 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
 
 /* GObject class stuff */
 
-GType
-libbalsa_address_book_text_get_type(void)
-{
-    static GType address_book_text_type = 0;
-
-    if (!address_book_text_type) {
-        static const GTypeInfo address_book_text_info = {
-            sizeof(LibBalsaAddressBookTextClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-            (GClassInitFunc) libbalsa_address_book_text_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-            sizeof(LibBalsaAddressBookText),
-            0,                  /* n_preallocs */
-            (GInstanceInitFunc) libbalsa_address_book_text_init
-        };
-
-        address_book_text_type =
-            g_type_register_static(LIBBALSA_TYPE_ADDRESS_BOOK,
-                                   "LibBalsaAddressBookText",
-                                   &address_book_text_info, 0);
-    }
+typedef struct {
+    gchar *path;
+
+    GSList *item_list;
+
+    time_t mtime;
+
+    LibBalsaCompletion *name_complete;
+} LibBalsaAddressBookTextPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE(LibBalsaAddressBookText, libbalsa_address_book_text,
+        LIBBALSA_TYPE_ADDRESS_BOOK)
+
+typedef struct {
+    long begin;
+    long end;
+    LibBalsaAddress *address;
+} LibBalsaAddressBookTextItem;
 
-    return address_book_text_type;
+static void
+lbab_text_item_free(LibBalsaAddressBookTextItem * item)
+{
+    if (item->address)
+        g_object_unref(item->address);
+    g_free(item);
 }
 
 static void
@@ -115,11 +113,11 @@ libbalsa_address_book_text_class_init(LibBalsaAddressBookTextClass * klass)
     LibBalsaAddressBookClass *address_book_class;
     GObjectClass *object_class;
 
-    parent_class = g_type_class_peek_parent(klass);
-
     object_class = G_OBJECT_CLASS(klass);
     address_book_class = LIBBALSA_ADDRESS_BOOK_CLASS(klass);
 
+    klass->text_item_free_func = (GDestroyNotify) lbab_text_item_free;
+
     object_class->finalize = libbalsa_address_book_text_finalize;
 
     address_book_class->load = libbalsa_address_book_text_load;
@@ -142,22 +140,19 @@ libbalsa_address_book_text_class_init(LibBalsaAddressBookTextClass * klass)
 static void
 libbalsa_address_book_text_init(LibBalsaAddressBookText * ab_text)
 {
-    ab_text->path = NULL;
-    ab_text->item_list = NULL;
-    ab_text->mtime = 0;
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
 
-    ab_text->name_complete =
+    priv->path = NULL;
+    priv->item_list = NULL;
+    priv->mtime = 0;
+
+    priv->name_complete =
         libbalsa_completion_new((LibBalsaCompletionFunc)
                                 completion_data_extract);
-    libbalsa_completion_set_compare(ab_text->name_complete, strncmp_word);
+    libbalsa_completion_set_compare(priv->name_complete, strncmp_word);
 }
 
-typedef struct {
-    long begin;
-    long end;
-    LibBalsaAddress *address;
-} LibBalsaAddressBookTextItem;
-
 static LibBalsaAddressBookTextItem *
 lbab_text_item_new(void)
 {
@@ -167,32 +162,24 @@ lbab_text_item_new(void)
     return item;
 }
 
-static void
-lbab_text_item_free(LibBalsaAddressBookTextItem * item)
-{
-    if (item->address)
-        g_object_unref(item->address);
-    g_free(item);
-}
-
 static void
 libbalsa_address_book_text_finalize(GObject * object)
 {
-    LibBalsaAddressBookText *ab_text;
-
-    ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
+    LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
+    LibBalsaAddressBookTextClass *ab_text_class = LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(object);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
 
-    g_free(ab_text->path);
+    g_free(priv->path);
 
-    g_slist_foreach(ab_text->item_list, (GFunc) lbab_text_item_free, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
+    g_slist_free_full(priv->item_list, ab_text_class->text_item_free_func);
+    priv->item_list = NULL;
 
-    g_list_foreach(ab_text->name_complete->items,
+    g_list_foreach(priv->name_complete->items,
                    (GFunc) completion_data_free, NULL);
-    libbalsa_completion_free(ab_text->name_complete);
+    libbalsa_completion_free(priv->name_complete);
 
-    G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_address_book_text_parent_class)->finalize(object);
 }
 
 /* Load helpers */
@@ -201,13 +188,15 @@ libbalsa_address_book_text_finalize(GObject * object)
 static gboolean
 lbab_text_address_book_need_reload(LibBalsaAddressBookText * ab_text)
 {
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
     struct stat stat_buf;
 
-    if (stat(ab_text->path, &stat_buf) == -1)
+    if (stat(priv->path, &stat_buf) == -1)
         return TRUE;
 
-    if (stat_buf.st_mtime > ab_text->mtime) {
-        ab_text->mtime = stat_buf.st_mtime;
+    if (stat_buf.st_mtime > priv->mtime) {
+        priv->mtime = stat_buf.st_mtime;
         return TRUE;
     }
 
@@ -290,6 +279,10 @@ lbab_text_item_compare(LibBalsaAddressBookTextItem * a,
 static gboolean
 lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
 {
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+    LibBalsaAddressBookTextClass *ab_text_class =
+        LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(ab_text);
     LibBalsaABErr(*parse_address) (FILE * stream_in,
                                    LibBalsaAddress * address,
                                    FILE * stream_out,
@@ -304,13 +297,12 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
     if (!lbab_text_address_book_need_reload(ab_text))
         return TRUE;
 
-    g_slist_foreach(ab_text->item_list, (GFunc) lbab_text_item_free, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
+    g_slist_free_full(priv->item_list, ab_text_class->text_item_free_func);
+    priv->item_list = NULL;
 
-    g_list_foreach(ab_text->name_complete->items,
+    g_list_foreach(priv->name_complete->items,
                    (GFunc) completion_data_free, NULL);
-    libbalsa_completion_clear_items(ab_text->name_complete);
+    libbalsa_completion_clear_items(priv->name_complete);
 
     parse_address =
         LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(ab_text)->parse_address;
@@ -330,7 +322,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
     if (!list)
         return TRUE;
 
-    ab_text->item_list =
+    priv->item_list =
         g_slist_sort(list, (GCompareFunc) lbab_text_item_compare);
 
     completion_list = NULL;
@@ -338,7 +330,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
     group_table =
         g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 #endif                          /* MAKE_GROUP_BY_ORGANIZATION */
-    for (list = ab_text->item_list; list; list = list->next) {
+    for (list = priv->item_list; list; list = list->next) {
         LibBalsaAddressBookTextItem *item = list->data;
         LibBalsaAddress *address = item->address;
 #if MAKE_GROUP_BY_ORGANIZATION
@@ -406,7 +398,7 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
 #endif                          /* MAKE_GROUP_BY_ORGANIZATION */
 
     completion_list = g_list_reverse(completion_list);
-    libbalsa_completion_add_items(ab_text->name_complete, completion_list);
+    libbalsa_completion_add_items(priv->name_complete, completion_list);
     g_list_free(completion_list);
 
     return TRUE;
@@ -417,13 +409,19 @@ static gboolean
 lbab_text_lock_book(LibBalsaAddressBookText * ab_text, FILE * stream,
                     gboolean exclusive)
 {
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
     return (libbalsa_lock_file
-            (ab_text->path, fileno(stream), exclusive, TRUE, TRUE) >= 0);
+            (priv->path, fileno(stream), exclusive, TRUE, TRUE) >= 0);
 }
 static void
 lbab_text_unlock_book(LibBalsaAddressBookText * ab_text, FILE * stream)
 {
-    libbalsa_unlock_file(ab_text->path, fileno(stream), TRUE);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    libbalsa_unlock_file(priv->path, fileno(stream), TRUE);
 }
 
 /* Modify helpers */
@@ -433,7 +431,10 @@ static LibBalsaABErr
 lbab_text_open_temp(LibBalsaAddressBookText * ab_text, gchar ** path,
                     FILE ** stream)
 {
-    *path = g_strconcat(ab_text->path, ".tmp", NULL);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    *path = g_strconcat(priv->path, ".tmp", NULL);
     *stream = fopen(*path, "w");
     if (*stream == NULL) {
 #if DEBUG
@@ -451,18 +452,21 @@ lbab_text_open_temp(LibBalsaAddressBookText * ab_text, gchar ** path,
 static LibBalsaABErr
 lbab_text_close_temp(LibBalsaAddressBookText * ab_text, const gchar * path)
 {
-    if (unlink(ab_text->path) < 0
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    if (unlink(priv->path) < 0
         && g_file_error_from_errno(errno) != G_FILE_ERROR_NOENT) {
 #if DEBUG
         g_message("Failed to unlink address book file “%s”\n"
-                  " new address book file saved as “%s”", ab_text->path,
+                  " new address book file saved as “%s”", priv->path,
                   path);
         perror("TEXT");
 #endif                          /* DEBUG */
         return LBABERR_CANNOT_WRITE;
     }
 
-    if (rename(path, ab_text->path) < 0) {
+    if (rename(path, priv->path) < 0) {
 #if DEBUG
         g_message("Failed to rename temporary address book file “%s”\n",
                   path);
@@ -510,12 +514,14 @@ libbalsa_address_book_text_load(LibBalsaAddressBook * ab,
                                 gpointer data)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
     FILE *stream;
     gboolean ok;
     GSList *list;
     gchar *filter_hi = NULL;
 
-    stream = fopen(ab_text->path, "r");
+    stream = fopen(priv->path, "r");
     if (!stream)
         return LBABERR_CANNOT_READ;
 
@@ -531,7 +537,7 @@ libbalsa_address_book_text_load(LibBalsaAddressBook * ab,
     if (filter)
         filter_hi = g_utf8_strup(filter, -1);
 
-    for (list = ab_text->item_list; list; list = list->next) {
+    for (list = priv->item_list; list != NULL; list = list->next) {
         LibBalsaAddressBookTextItem *item = list->data;
         LibBalsaAddress *address = item->address;
 
@@ -559,11 +565,13 @@ libbalsa_address_book_text_add_address(LibBalsaAddressBook * ab,
                                        LibBalsaAddress * new_address)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
     LibBalsaAddressBookTextItem new_item;
     FILE *stream;
     LibBalsaABErr res = LBABERR_OK;
 
-    stream = fopen(ab_text->path, "a+");
+    stream = fopen(priv->path, "a+");
     if (stream == NULL)
         return LBABERR_CANNOT_WRITE;
 
@@ -577,7 +585,7 @@ libbalsa_address_book_text_add_address(LibBalsaAddressBook * ab,
                                                  * the first address. */
 
     new_item.address = new_address;
-    if (g_slist_find_custom(ab_text->item_list, &new_item,
+    if (g_slist_find_custom(priv->item_list, &new_item,
                             (GCompareFunc) lbab_text_item_compare))
         return LBABERR_DUPLICATE;
 
@@ -588,7 +596,7 @@ libbalsa_address_book_text_add_address(LibBalsaAddressBook * ab,
     fclose(stream);
 
     /* Invalidate the time stamp, so the book will be reloaded. */
-    ab_text->mtime = 0;
+    priv->mtime = 0;
 
     return res;
 }
@@ -608,6 +616,8 @@ libbalsa_address_book_text_modify_address(LibBalsaAddressBook * ab,
                                           LibBalsaAddress * newval)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
     LibBalsaAddressBookTextItem old_item;
     GSList *found;
     LibBalsaAddressBookTextItem *item;
@@ -616,7 +626,7 @@ libbalsa_address_book_text_modify_address(LibBalsaAddressBook * ab,
     gchar *path = NULL;
     FILE *stream_out = NULL;
 
-    if ((stream_in = fopen(ab_text->path, "r")) == NULL)
+    if ((stream_in = fopen(priv->path, "r")) == NULL)
         return LBABERR_CANNOT_READ;
 
     if (!lbab_text_lock_book(ab_text, stream_in, FALSE)) {
@@ -627,7 +637,7 @@ libbalsa_address_book_text_modify_address(LibBalsaAddressBook * ab,
     lbab_text_load_file(ab_text, stream_in);
 
     old_item.address = address;
-    found = g_slist_find_custom(ab_text->item_list, &old_item,
+    found = g_slist_find_custom(priv->item_list, &old_item,
                                 (GCompareFunc) lbab_text_item_compare);
     if (!found) {
         lbab_text_unlock_book(ab_text, stream_in);
@@ -664,7 +674,7 @@ libbalsa_address_book_text_modify_address(LibBalsaAddressBook * ab,
     g_free(path);
 
     /* Invalidate the time stamp, so the book will be reloaded. */
-    ab_text->mtime = 0;
+    priv->mtime = 0;
 
     return res;
 }
@@ -675,11 +685,12 @@ libbalsa_address_book_text_save_config(LibBalsaAddressBook * ab,
                                        const gchar * prefix)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
 
-    libbalsa_conf_set_string("Path", ab_text->path);
+    libbalsa_conf_set_string("Path", priv->path);
 
-    if (LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->save_config)
-        LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->save_config(ab, prefix);
+    LIBBALSA_ADDRESS_BOOK_CLASS(libbalsa_address_book_text_parent_class)->save_config(ab, prefix);
 }
 
 /* Load config method */
@@ -688,12 +699,13 @@ libbalsa_address_book_text_load_config(LibBalsaAddressBook * ab,
                                        const gchar * prefix)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
 
-    g_free(ab_text->path);
-    ab_text->path = libbalsa_conf_get_string("Path");
+    g_free(priv->path);
+    priv->path = libbalsa_conf_get_string("Path");
 
-    if (LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->load_config)
-        LIBBALSA_ADDRESS_BOOK_CLASS(parent_class)->load_config(ab, prefix);
+    LIBBALSA_ADDRESS_BOOK_CLASS(libbalsa_address_book_text_parent_class)->load_config(ab, prefix);
 }
 
 /* Alias complete method */
@@ -702,6 +714,8 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
                                           const gchar * prefix)
 {
     LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab);
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
     FILE *stream;
     GList *list;
     GList *res = NULL;
@@ -709,7 +723,7 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
     if (!libbalsa_address_book_get_expand_aliases(ab))
         return NULL;
 
-    stream = fopen(ab_text->path, "r");
+    stream = fopen(priv->path, "r");
     if (!stream)
         return NULL;
 
@@ -724,7 +738,7 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
     fclose(stream);
 
     for (list =
-         libbalsa_completion_complete(ab_text->name_complete,
+         libbalsa_completion_complete(priv->name_complete,
                                       (gchar *) prefix);
          list; list = list->next) {
         InternetAddress *ia = ((CompletionData *) list->data)->ia;
@@ -734,3 +748,107 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
 
     return g_list_reverse(res);
 }
+
+/*
+ * Getters
+ */
+
+const gchar *
+libbalsa_address_book_text_get_path(LibBalsaAddressBookText * ab_text)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text), NULL);
+
+    return priv->path;
+}
+
+GSList *
+libbalsa_address_book_text_get_item_list(LibBalsaAddressBookText * ab_text)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text), NULL);
+
+    return priv->item_list;
+}
+
+time_t
+libbalsa_address_book_text_get_mtime(LibBalsaAddressBookText * ab_text)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text), 0);
+
+    return priv->mtime;
+}
+
+LibBalsaCompletion *
+libbalsa_address_book_text_get_name_complete(LibBalsaAddressBookText * ab_text)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_val_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text), 0);
+
+    return priv->name_complete;
+}
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_address_book_text_set_path(LibBalsaAddressBookText * ab_text,
+                                    const gchar             * path)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text));
+
+    g_free(priv->path);
+    priv->path = g_strdup(path);
+}
+
+void
+libbalsa_address_book_text_set_item_list(LibBalsaAddressBookText * ab_text,
+                                         GSList                  * item_list)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+    LibBalsaAddressBookTextClass *ab_text_class;
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text));
+
+    ab_text_class = LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(ab_text);
+    g_slist_free_full(priv->item_list, ab_text_class->text_item_free_func);
+    priv->item_list = item_list;
+}
+
+void
+libbalsa_address_book_text_set_mtime(LibBalsaAddressBookText * ab_text,
+                                     time_t                    mtime)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text));
+
+    priv->mtime = mtime;
+}
+
+void
+libbalsa_address_book_text_set_name_complete(LibBalsaAddressBookText * ab_text,
+                                             LibBalsaCompletion      * name_complete)
+{
+    LibBalsaAddressBookTextPrivate *priv =
+        libbalsa_address_book_text_get_instance_private(ab_text);
+
+    g_return_if_fail(LIBBALSA_IS_ADDRESS_BOOK_TEXT(ab_text));
+
+    priv->name_complete = name_complete;
+}
diff --git a/libbalsa/address-book-text.h b/libbalsa/address-book-text.h
index d129e7d09..2625108d8 100644
--- a/libbalsa/address-book-text.h
+++ b/libbalsa/address-book-text.h
@@ -33,47 +33,46 @@
 #include "address-book.h"
 #include "completion.h"
 
-#define LIBBALSA_TYPE_ADDRESS_BOOK_TEXT                                       \
-    (libbalsa_address_book_text_get_type())
-#define LIBBALSA_ADDRESS_BOOK_TEXT(obj)                                       \
-    (G_TYPE_CHECK_INSTANCE_CAST(obj, LIBBALSA_TYPE_ADDRESS_BOOK_TEXT,  \
-                                LibBalsaAddressBookText))
-#define LIBBALSA_ADDRESS_BOOK_TEXT_CLASS(klass)                               \
-    (G_TYPE_CHECK_CLASS_CAST(klass, LIBBALSA_TYPE_ADDRESS_BOOK_TEXT,   \
-                             LibBalsaAddressBookTextClass))
-#define LIBBALSA_IS_ADDRESS_BOOK_TEXT(obj)                             \
-    (G_TYPE_CHECK_INSTANCE_TYPE(obj, LIBBALSA_TYPE_ADDRESS_BOOK_TEXT))
-#define LIBBALSA_IS_ADDRESS_BOOK_TEXT_CLASS(klass)                     \
-    (G_TYPE_CHECK_CLASS_TYPE(klass, LIBBALSA_TYPE_ADDRESS_BOOK_TEXT))
-#define LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(obj)                      \
-    (G_TYPE_INSTANCE_GET_CLASS((obj), LIBBALSA_TYPE_ADDRESS_BOOK_TEXT, \
-                              LibBalsaAddressBookTextClass))
-
-struct _LibBalsaAddressBookText {
-    LibBalsaAddressBook parent;
-
-    gchar *path;
-
-    GSList *item_list;
-
-    time_t mtime;
-
-    LibBalsaCompletion *name_complete;
-};
+#define LIBBALSA_TYPE_ADDRESS_BOOK_TEXT        (libbalsa_address_book_text_get_type())
+G_DECLARE_DERIVABLE_TYPE(LibBalsaAddressBookText, libbalsa_address_book_text,
+        LIBBALSA, ADDRESS_BOOK_TEXT, LibBalsaAddressBook)
 
 struct _LibBalsaAddressBookTextClass {
     LibBalsaAddressBookClass parent_class;
-     LibBalsaABErr(*parse_address) (FILE * stream_in,
-                                    LibBalsaAddress * address_in,
-                                    FILE * stream_out,
-                                    LibBalsaAddress * address_out);
-     LibBalsaABErr(*save_address)  (FILE * stream,
-                                    LibBalsaAddress * address);
+
+    LibBalsaABErr (*parse_address)(FILE * stream_in,
+                                   LibBalsaAddress * address_in,
+                                   FILE * stream_out,
+                                   LibBalsaAddress * address_out);
+    LibBalsaABErr (*save_address) (FILE * stream,
+                                   LibBalsaAddress * address);
+
+    GDestroyNotify text_item_free_func;
 };
 
 typedef struct _LibBalsaAddressBookText LibBalsaAddressBookText;
 typedef struct _LibBalsaAddressBookTextClass LibBalsaAddressBookTextClass;
 
-GType libbalsa_address_book_text_get_type(void);
+/*
+ * Getters
+ */
+
+const gchar *        libbalsa_address_book_text_get_path(LibBalsaAddressBookText * ab_text);
+GSList *             libbalsa_address_book_text_get_item_list(LibBalsaAddressBookText * ab_text);
+time_t               libbalsa_address_book_text_get_mtime(LibBalsaAddressBookText * ab_text);
+LibBalsaCompletion * libbalsa_address_book_text_get_name_complete(LibBalsaAddressBookText * ab_text);
+
+/*
+ * Setters
+ */
+
+void libbalsa_address_book_text_set_path(LibBalsaAddressBookText * ab_text,
+                                         const gchar             * path);
+void libbalsa_address_book_text_set_item_list(LibBalsaAddressBookText * ab_text,
+                                              GSList                  * item_list);
+void libbalsa_address_book_text_set_mtime(LibBalsaAddressBookText * ab_text,
+                                          time_t                    mtime);
+void libbalsa_address_book_text_set_name_complete(LibBalsaAddressBookText * ab_text,
+                                                  LibBalsaCompletion      * name_complete);
 
 #endif                          /* __LIBBALSA_ADDRESS_BOOK_TEXT_H__ */
diff --git a/libbalsa/address-book-vcard.c b/libbalsa/address-book-vcard.c
index e3ef4a60c..2e2c2202c 100644
--- a/libbalsa/address-book-vcard.c
+++ b/libbalsa/address-book-vcard.c
@@ -106,7 +106,7 @@ libbalsa_address_book_vcard_new(const gchar * name, const gchar * path)
     ab = LIBBALSA_ADDRESS_BOOK(abvc);
 
     libbalsa_address_book_set_name(ab, name);
-    LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path);
+    libbalsa_address_book_text_set_path(LIBBALSA_ADDRESS_BOOK_TEXT(ab), path);
 
     return ab;
 }
diff --git a/src/address-book-config.c b/src/address-book-config.c
index a280d97ca..bbbe1f82a 100644
--- a/src/address-book-config.c
+++ b/src/address-book-config.c
@@ -255,7 +255,8 @@ create_local_dialog(AddressBookConfig * abc, const gchar * type)
     add_radio_buttons(grid, 1, abc);
 
     if (ab) {
-        const gchar *path = LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path;
+        LibBalsaAddressBookText *abt = (LibBalsaAddressBookText *) ab;
+        const gchar *path = libbalsa_address_book_text_get_path(abt);
         gchar *folder;
         gchar *utf8name;
 
@@ -791,10 +792,8 @@ modify_book(AddressBookConfig * abc)
         gchar *path =
             gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(abc->window));
 
-        if (path) {
-            g_free(ab_text->path);
-            ab_text->path = path;
-        }
+        if (path != NULL)
+            libbalsa_address_book_text_set_path(ab_text, path);
     } else if (abc->type == LIBBALSA_TYPE_ADDRESS_BOOK_EXTERN) {
         LibBalsaAddressBookExtern *externq;
         gchar *load =



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