[balsa/wip/gtk4: 172/351] address-book-text: Declare it derivable
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa/wip/gtk4: 172/351] address-book-text: Declare it derivable
- Date: Wed, 23 May 2018 21:31:24 +0000 (UTC)
commit a7253265404927407094e4c68cc34185539065b5
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Tue Feb 13 19:57:56 2018 -0500
address-book-text: Declare it derivable
Use G_DECLARE_DERIVABLE_TYPE for LibBalsaAddressBookText, take all members
private, and provide a getter and a setter for the path.
libbalsa/address-book-ldif.c | 2 +-
libbalsa/address-book-text.c | 183 +++++++++++++++++++++++++----------------
libbalsa/address-book-text.h | 43 ++++------
libbalsa/address-book-vcard.c | 2 +-
src/address-book-config.c | 9 +-
5 files changed, 132 insertions(+), 107 deletions(-)
---
diff --git a/libbalsa/address-book-ldif.c b/libbalsa/address-book-ldif.c
index 17a73c6..9cff5d4 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-text.c b/libbalsa/address-book-text.c
index fac0206..0d714b0 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,32 +80,18 @@ 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;
- return address_book_text_type;
-}
+ GSList *item_list;
+
+ time_t mtime;
+
+ LibBalsaCompletion *name_complete;
+} LibBalsaAddressBookTextPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE(LibBalsaAddressBookText, libbalsa_address_book_text,
+ LIBBALSA_TYPE_ADDRESS_BOOK)
static void
libbalsa_address_book_text_class_init(LibBalsaAddressBookTextClass * klass)
@@ -115,8 +99,6 @@ 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);
@@ -142,14 +124,17 @@ 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);
+
+ priv->path = NULL;
+ priv->item_list = NULL;
+ priv->mtime = 0;
- ab_text->name_complete =
+ 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 {
@@ -178,15 +163,15 @@ lbab_text_item_free(LibBalsaAddressBookTextItem * item)
static void
libbalsa_address_book_text_finalize(GObject * object)
{
- LibBalsaAddressBookText *ab_text;
+ LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
+ LibBalsaAddressBookTextPrivate *priv =
+ libbalsa_address_book_text_get_instance_private(ab_text);
- ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
+ g_free(priv->path);
+ g_slist_free_full(priv->item_list, (GDestroyNotify) lbab_text_item_free);
+ libbalsa_completion_free(priv->name_complete);
- g_free(ab_text->path);
- g_slist_free_full(ab_text->item_list, (GDestroyNotify) lbab_text_item_free);
- libbalsa_completion_free(ab_text->name_complete);
-
- G_OBJECT_CLASS(parent_class)->finalize(object);
+ G_OBJECT_CLASS(libbalsa_address_book_text_parent_class)->finalize(object);
}
/* Load helpers */
@@ -195,13 +180,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;
}
@@ -284,6 +271,8 @@ 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);
LibBalsaABErr(*parse_address) (FILE * stream_in,
LibBalsaAddress * address,
FILE * stream_out,
@@ -298,8 +287,8 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
if (!lbab_text_address_book_need_reload(ab_text))
return TRUE;
- libbalsa_clear_slist(&ab_text->item_list, (GDestroyNotify) lbab_text_item_free);
- libbalsa_completion_clear_items(ab_text->name_complete);
+ libbalsa_clear_slist(&priv->item_list, (GDestroyNotify) lbab_text_item_free);
+ libbalsa_completion_clear_items(priv->name_complete);
parse_address =
LIBBALSA_ADDRESS_BOOK_TEXT_GET_CLASS(ab_text)->parse_address;
@@ -319,7 +308,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;
@@ -327,7 +316,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
@@ -395,7 +384,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;
@@ -406,13 +395,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 */
@@ -422,7 +417,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
@@ -440,18 +438,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);
@@ -499,12 +500,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;
@@ -520,7 +523,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; list = list->next) {
LibBalsaAddressBookTextItem *item = list->data;
LibBalsaAddress *address = item->address;
@@ -548,11 +551,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;
@@ -566,7 +571,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;
@@ -577,7 +582,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;
}
@@ -597,6 +602,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;
@@ -605,7 +612,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)) {
@@ -616,7 +623,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);
@@ -653,7 +660,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;
}
@@ -664,11 +671,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 */
@@ -677,12 +685,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 */
@@ -691,6 +700,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;
@@ -698,7 +709,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;
@@ -713,7 +724,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;
@@ -723,3 +734,31 @@ libbalsa_address_book_text_alias_complete(LibBalsaAddressBook * ab,
return g_list_reverse(res);
}
+
+/*
+ * Getter
+ */
+
+const gchar *
+libbalsa_address_book_text_get_path(LibBalsaAddressBookText * ab_text)
+{
+ LibBalsaAddressBookTextPrivate *priv =
+ libbalsa_address_book_text_get_instance_private(ab_text);
+
+ return priv->path;
+}
+
+/*
+ * Setter
+ */
+
+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_free(priv->path);
+ priv->path = g_strdup(path);
+}
diff --git a/libbalsa/address-book-text.h b/libbalsa/address-book-text.h
index d129e7d..6208adb 100644
--- a/libbalsa/address-book-text.h
+++ b/libbalsa/address-book-text.h
@@ -33,33 +33,9 @@
#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;
@@ -74,6 +50,17 @@ struct _LibBalsaAddressBookTextClass {
typedef struct _LibBalsaAddressBookText LibBalsaAddressBookText;
typedef struct _LibBalsaAddressBookTextClass LibBalsaAddressBookTextClass;
-GType libbalsa_address_book_text_get_type(void);
+/*
+ * Getter
+ */
+
+const gchar * libbalsa_address_book_text_get_path(LibBalsaAddressBookText * ab_text);
+
+/*
+ * Setter
+ */
+
+void libbalsa_address_book_text_set_path(LibBalsaAddressBookText * ab_text,
+ const gchar * path);
#endif /* __LIBBALSA_ADDRESS_BOOK_TEXT_H__ */
diff --git a/libbalsa/address-book-vcard.c b/libbalsa/address-book-vcard.c
index d20edf5..b28172f 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 a132265..fc91669 100644
--- a/src/address-book-config.c
+++ b/src/address-book-config.c
@@ -254,7 +254,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;
@@ -786,10 +787,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]