[balsa] Declare LibBalsaAddressBookText derivable
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] Declare LibBalsaAddressBookText derivable
- Date: Wed, 15 May 2019 00:52:48 +0000 (UTC)
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]