[devhelp/wip/book-manager-singleton: 3/3] BookManager: add get_singleton() and free_singleton()



commit a6f1df27c69382db42ca65d9e80d4b09c0958b0d
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Mon May 1 14:26:34 2017 +0200

    BookManager: add get_singleton() and free_singleton()
    
    The implementation is like in DhSettings.
    
    It makes sense to make DhBookManager a singleton, because it's the
    top-level class containing the data. And we want to load the data just
    once, and access the same data everywhere. There is no need to create
    several DhBookManager instances.
    
    Currently a lot of classes take a DhBookManager reference, either with a
    construct-only property or a set_book_manager() function. So it'll be
    possible to simplify the code, by just calling
    dh_book_manager_get_singleton() where we need it.

 docs/reference/devhelp-sections.txt |    1 +
 src/dh-book-manager.c               |   32 ++++++++++++++++++++++++++++----
 src/dh-book-manager.h               |    4 ++++
 3 files changed, 33 insertions(+), 4 deletions(-)
---
diff --git a/docs/reference/devhelp-sections.txt b/docs/reference/devhelp-sections.txt
index 5bdd307..11537d9 100644
--- a/docs/reference/devhelp-sections.txt
+++ b/docs/reference/devhelp-sections.txt
@@ -97,6 +97,7 @@ dh_book_get_type
 <TITLE>DhBookManager</TITLE>
 DhBookManager
 dh_book_manager_new
+dh_book_manager_get_singleton
 dh_book_manager_populate
 dh_book_manager_get_books
 dh_book_manager_get_group_by_language
diff --git a/src/dh-book-manager.c b/src/dh-book-manager.c
index babff68..2d5768f 100644
--- a/src/dh-book-manager.c
+++ b/src/dh-book-manager.c
@@ -68,6 +68,8 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
+static DhBookManager *singleton = NULL;
+
 G_DEFINE_TYPE_WITH_PRIVATE (DhBookManager, dh_book_manager, G_TYPE_OBJECT);
 
 static void book_manager_add_from_filepath (DhBookManager *book_manager,
@@ -134,14 +136,15 @@ dh_book_manager_dispose (GObject *object)
 static void
 dh_book_manager_finalize (GObject *object)
 {
-        DhBookManagerPrivate *priv;
-
-        priv = dh_book_manager_get_instance_private (DH_BOOK_MANAGER (object));
+        DhBookManager *book_manager = DH_BOOK_MANAGER (object);
+        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
 
         g_list_free_full (priv->languages, g_object_unref);
-
         g_slist_free_full (priv->books_disabled, g_free);
 
+        if (singleton == book_manager)
+                singleton = NULL;
+
         G_OBJECT_CLASS (dh_book_manager_parent_class)->finalize (object);
 }
 
@@ -813,6 +816,27 @@ dh_book_manager_new (void)
 }
 
 /**
+ * dh_book_manager_get_singleton:
+ *
+ * Returns: (transfer none): the #DhBookManager singleton instance.
+ */
+DhBookManager *
+dh_book_manager_get_singleton (void)
+{
+        if (singleton == NULL)
+                singleton = g_object_new (DH_TYPE_BOOK_MANAGER, NULL);
+
+        return singleton;
+}
+
+void
+_dh_book_manager_free_singleton (void)
+{
+        if (singleton != NULL)
+                g_object_unref (singleton);
+}
+
+/**
  * dh_book_manager_populate:
  * @book_manager: a #DhBookManager.
  *
diff --git a/src/dh-book-manager.h b/src/dh-book-manager.h
index 03a559f..dee9188 100644
--- a/src/dh-book-manager.h
+++ b/src/dh-book-manager.h
@@ -42,6 +42,7 @@ struct _DhBookManagerClass {
 };
 
 GType          dh_book_manager_get_type              (void) G_GNUC_CONST;
+DhBookManager *dh_book_manager_get_singleton         (void);
 DhBookManager *dh_book_manager_new                   (void);
 GList         *dh_book_manager_get_books             (DhBookManager *book_manager);
 gboolean       dh_book_manager_get_group_by_language (DhBookManager *book_manager);
@@ -51,6 +52,9 @@ void           dh_book_manager_set_group_by_language (DhBookManager *book_manage
 G_DEPRECATED
 void           dh_book_manager_populate              (DhBookManager *book_manager);
 
+G_GNUC_INTERNAL
+void           _dh_book_manager_free_singleton       (void);
+
 G_END_DECLS
 
 #endif /* DH_BOOK_MANAGER_H */


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