[balsa/wip/gtk4: 251/351] mailbox remote: Declare it derivable



commit ac83fff82211623d9a4ed011ffe060474af2e2cd
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Mar 26 11:33:37 2018 -0400

    mailbox remote: Declare it derivable
    
    Use G_DECLARE_DERIVABLE_TYPE for LibBalsaMailboxRemote, make it private,
    add set_server, and a macro wrapper for get_server to avoid casts.

 libbalsa/mailbox_imap.c   |   28 +++++++++------
 libbalsa/mailbox_pop3.c   |   17 +---------
 libbalsa/mailbox_remote.c |   83 +++++++++++++++++++++++++++------------------
 libbalsa/mailbox_remote.h |   37 ++++++-------------
 4 files changed, 79 insertions(+), 86 deletions(-)
---
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index d76946c..cf02d07 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -310,15 +310,16 @@ static void
 libbalsa_mailbox_imap_dispose(GObject * object)
 {
     LibBalsaMailboxRemote *remote;
+    LibBalsaServer *server;
     LibBalsaMailboxImap *mailbox;
 
     remote = LIBBALSA_MAILBOX_REMOTE(object);
-    if (remote->server != NULL) {
-        g_signal_handlers_disconnect_matched(remote->server,
+    server = libbalsa_mailbox_remote_get_server(remote);
+    if (server != NULL) {
+        g_signal_handlers_disconnect_matched(server,
                                              G_SIGNAL_MATCH_DATA, 0,
                                              (GQuark) 0, NULL, NULL,
                                              remote);
-       g_clear_object(&remote->server);
     }
 
     mailbox = LIBBALSA_MAILBOX_IMAP(object);
@@ -472,7 +473,7 @@ get_cache_dir(gboolean is_persistent)
 static gchar*
 get_header_cache_path(LibBalsaMailboxImap *mimap)
 {
-    LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE(mimap)->server;
+    LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mimap);
     gchar *cache_dir = get_cache_dir(TRUE); /* FIXME */
     gchar *header_file = g_strdup_printf("%s@%s-%s-%u-headers2",
                                         libbalsa_server_get_username(s), libbalsa_server_get_host(s),
@@ -491,7 +492,7 @@ static gchar**
 get_cache_name_pair(LibBalsaMailboxImap* mailbox, const gchar *type,
                     ImapUID uid)
 {
-    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
+    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
     gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
     gchar **res = g_malloc(3*sizeof(gchar*));
@@ -1169,7 +1170,7 @@ free_messages_info(LibBalsaMailboxImap * mbox)
 static void
 libbalsa_mailbox_imap_close(LibBalsaMailbox * mailbox, gboolean expunge)
 {
-    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
+    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
     LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
     gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
     LibBalsaMailboxImap *mbox = LIBBALSA_MAILBOX_IMAP(mailbox);
@@ -1674,6 +1675,7 @@ libbalsa_mailbox_imap_load_config(LibBalsaMailbox * mailbox,
 {
     LibBalsaMailboxImap *mimap;
     LibBalsaMailboxRemote *remote;
+    LibBalsaServer *server;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_IMAP(mailbox));
 
@@ -1690,12 +1692,14 @@ libbalsa_mailbox_imap_load_config(LibBalsaMailbox * mailbox,
     }
 
     remote = LIBBALSA_MAILBOX_REMOTE(mailbox);
-    remote->server = LIBBALSA_SERVER(libbalsa_imap_server_new_from_config());
+    server = LIBBALSA_SERVER(libbalsa_imap_server_new_from_config());
 
-    g_signal_connect(G_OBJECT(remote->server), "config-changed",
+    g_signal_connect(G_OBJECT(server), "config-changed",
                     G_CALLBACK(server_host_settings_changed_cb),
                     (gpointer) mailbox);
 
+    libbalsa_mailbox_remote_set_server(remote, server);
+
     if (LIBBALSA_MAILBOX_CLASS(parent_class)->load_config)
        LIBBALSA_MAILBOX_CLASS(parent_class)->load_config(mailbox, prefix);
 
@@ -3006,7 +3010,7 @@ libbalsa_mailbox_imap_add_messages(LibBalsaMailbox * mailbox,
     if(!imap_sequence_empty(&uid_sequence) &&
        g_list_length(macd.outfiles) == imap_sequence_length(&uid_sequence)) {
        /* Hurray, server returned UID data on appended messages! */
-       LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
+       LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
        LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
        gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
        struct append_to_cache_data atcd;
@@ -3326,8 +3330,8 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
                                    LibBalsaMailbox * dest, GError **err)
 {
     if (LIBBALSA_IS_MAILBOX_IMAP(dest) &&
-       LIBBALSA_MAILBOX_REMOTE(dest)->server ==
-       LIBBALSA_MAILBOX_REMOTE(mailbox)->server) {
+       LIBBALSA_MAILBOX_REMOTE_GET_SERVER(dest) ==
+       LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox)) {
         gboolean ret;
        LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
        ImapMboxHandle *handle = LIBBALSA_MAILBOX_IMAP(mailbox)->handle;
@@ -3359,7 +3363,7 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
         } else if(!imap_sequence_empty(&uid_sequence)) {
            /* Copy cache files. */
            GDir *dir;
-           LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
+           LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
            LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
            LibBalsaMailboxImap *dst_imap = LIBBALSA_MAILBOX_IMAP(dest);
            gboolean is_persistent =
diff --git a/libbalsa/mailbox_pop3.c b/libbalsa/mailbox_pop3.c
index d5230ab..730a817 100644
--- a/libbalsa/mailbox_pop3.c
+++ b/libbalsa/mailbox_pop3.c
@@ -48,7 +48,6 @@ struct _LibBalsaMailboxPop3Class {
     void (*config_changed) (LibBalsaMailboxPop3* mailbox_pop3);
 };
 
-static void libbalsa_mailbox_pop3_dispose(GObject * object);
 static void libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class *
                                             klass);
 static void libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox_pop3);
@@ -96,16 +95,12 @@ libbalsa_mailbox_pop3_get_type(void)
 static void
 libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
 {
-    GObjectClass *object_class;
     LibBalsaMailboxClass *libbalsa_mailbox_class;
 
-    object_class = G_OBJECT_CLASS(klass);
     libbalsa_mailbox_class = LIBBALSA_MAILBOX_CLASS(klass);
 
     parent_class = g_type_class_peek_parent(klass);
 
-    object_class->dispose = libbalsa_mailbox_pop3_dispose;
-
     libbalsa_mailbox_class->open_mailbox = libbalsa_mailbox_pop3_open;
     libbalsa_mailbox_class->check = libbalsa_mailbox_pop3_check;
 
@@ -128,17 +123,7 @@ libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox_pop3)
     mailbox_pop3->filter = FALSE;
     mailbox_pop3->filter_cmd = NULL;
     remote = LIBBALSA_MAILBOX_REMOTE(mailbox_pop3);
-    remote->server = libbalsa_server_new();
-}
-
-static void
-libbalsa_mailbox_pop3_dispose(GObject * object)
-{
-    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(object);
-
-    g_clear_object(&remote->server);
-
-    G_OBJECT_CLASS(parent_class)->dispose(object);
+    libbalsa_mailbox_remote_set_server(remote, libbalsa_server_new());
 }
 
 LibBalsaMailboxPop3*
diff --git a/libbalsa/mailbox_remote.c b/libbalsa/mailbox_remote.c
index 815c003..8dbdd3f 100644
--- a/libbalsa/mailbox_remote.c
+++ b/libbalsa/mailbox_remote.c
@@ -28,52 +28,52 @@
 static void libbalsa_mailbox_remote_class_init(LibBalsaMailboxRemoteClass *
                                               klass);
 static void libbalsa_mailbox_remote_init(LibBalsaMailboxRemote * mailbox);
+static void libbalsa_mailbox_remote_dispose(GObject * object);
 static void libbalsa_mailbox_remote_test_can_reach(LibBalsaMailbox          * mailbox,
                                                    LibBalsaCanReachCallback * cb,
                                                    gpointer                   cb_data);
 
-GType
-libbalsa_mailbox_remote_get_type(void)
-{
-    static GType mailbox_type = 0;
-
-    if (!mailbox_type) {
-       static const GTypeInfo mailbox_info = {
-           sizeof(LibBalsaMailboxClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_mailbox_remote_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaMailbox),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_mailbox_remote_init
-       };
-
-       mailbox_type =
-           g_type_register_static(LIBBALSA_TYPE_MAILBOX,
-                                  "LibBalsaMailboxRemote",
-                                   &mailbox_info, 0);
-    }
-
-    return mailbox_type;
-}
+typedef struct _LibBalsaMailboxRemotePrivate LibBalsaMailboxRemotePrivate;
+struct _LibBalsaMailboxRemotePrivate {
+    LibBalsaServer *server;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(LibBalsaMailboxRemote,
+                           libbalsa_mailbox_remote,
+                           LIBBALSA_TYPE_MAILBOX)
 
 static void
 libbalsa_mailbox_remote_class_init(LibBalsaMailboxRemoteClass * klass)
 {
+    GObjectClass *object_class;
     LibBalsaMailboxClass *libbalsa_mailbox_class;
 
+    object_class = G_OBJECT_CLASS(klass);
     libbalsa_mailbox_class = LIBBALSA_MAILBOX_CLASS(klass);
 
+    object_class->dispose = libbalsa_mailbox_remote_dispose;
+
     libbalsa_mailbox_class->test_can_reach =
         libbalsa_mailbox_remote_test_can_reach;
 }
 
 static void
-libbalsa_mailbox_remote_init(LibBalsaMailboxRemote * mailbox)
+libbalsa_mailbox_remote_init(LibBalsaMailboxRemote * remote)
+{
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    priv->server = NULL;
+}
+
+static void
+libbalsa_mailbox_remote_dispose(GObject * object)
 {
-    mailbox->server = NULL;
+    LibBalsaMailboxRemote *remote = (LibBalsaMailboxRemote *) object;
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    g_clear_object(&priv->server);
 }
 
 /* Test whether a mailbox is reachable */
@@ -83,14 +83,31 @@ libbalsa_mailbox_remote_test_can_reach(LibBalsaMailbox          * mailbox,
                                        LibBalsaCanReachCallback * cb,
                                        gpointer                   cb_data)
 {
-    libbalsa_server_test_can_reach_full(LIBBALSA_MAILBOX_REMOTE(mailbox)->server,
+    LibBalsaMailboxRemote *remote = (LibBalsaMailboxRemote *) mailbox;
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    libbalsa_server_test_can_reach_full(priv->server,
                                         cb, cb_data, (GObject *) mailbox);
 }
 
-/* Public method */
+/* Public methods */
+
+LibBalsaServer *
+libbalsa_mailbox_remote_get_server(LibBalsaMailboxRemote *remote)
+{
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    return priv->server;
+}
 
-void 
-libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote *m, LibBalsaServer *s)
+void
+libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote *remote,
+                                   LibBalsaServer        *server)
 {
-    g_set_object(&m->server, s);
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    g_set_object(&priv->server, server);
 }
diff --git a/libbalsa/mailbox_remote.h b/libbalsa/mailbox_remote.h
index 38749e9..a165d50 100644
--- a/libbalsa/mailbox_remote.h
+++ b/libbalsa/mailbox_remote.h
@@ -33,37 +33,24 @@
      all mailboxes....  which arguably we might want eventually,
      and claim that a directory is a "server", but until then...
  */
-#define LIBBALSA_TYPE_MAILBOX_REMOTE \
-    (libbalsa_mailbox_remote_get_type())
-#define LIBBALSA_MAILBOX_REMOTE(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIBBALSA_TYPE_MAILBOX_REMOTE, \
-                                 LibBalsaMailboxRemote))
-#define LIBBALSA_MAILBOX_REMOTE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST ((klass), LIBBALSA_TYPE_MAILBOX, \
-                              LibBalsaMailboxRemoteClass))
-#define LIBBALSA_IS_MAILBOX_REMOTE(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIBBALSA_TYPE_MAILBOX_REMOTE))
-#define LIBBALSA_IS_MAILBOX_REMOTE_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE ((klass), LIBBALSA_TYPE_MAILBOX_REMOTE))
+#define LIBBALSA_TYPE_MAILBOX_REMOTE libbalsa_mailbox_remote_get_type()
 
-#define LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox) \
-    ((LibBalsaServer *) LIBBALSA_MAILBOX_REMOTE(mailbox)->server)
-
-typedef struct _LibBalsaMailboxRemoteClass LibBalsaMailboxRemoteClass;
-
-struct _LibBalsaMailboxRemote {
-    LibBalsaMailbox mailbox;
-
-    LibBalsaServer *server;
-};
+G_DECLARE_DERIVABLE_TYPE(LibBalsaMailboxRemote,
+                         libbalsa_mailbox_remote,
+                         LIBBALSA,
+                         MAILBOX_REMOTE,
+                         LibBalsaMailbox)
 
 struct _LibBalsaMailboxRemoteClass {
     LibBalsaMailboxClass parent_class;
 };
 
-GType libbalsa_mailbox_remote_get_type(void);
+LibBalsaServer *libbalsa_mailbox_remote_get_server(LibBalsaMailboxRemote *remote);
+/* Macro to avoid casts: */
+#define LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox) \
+    libbalsa_mailbox_remote_get_server(LIBBALSA_MAILBOX_REMOTE(mailbox))
 
-void libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote* m, 
-                                       LibBalsaServer* s);
+void libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote *remote,
+                                       LibBalsaServer        *server);
 
 #endif                         /* __LIBBALSA_MAILBOX_REMOTE_H__ */


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