[balsa] mailbox-remote: declare it derivable



commit 0e5135c9084c756a05b48abe40a335f2cd12489b
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Fri Jul 5 17:51:12 2019 -0400

    mailbox-remote: declare it derivable
    
    Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaMailboxRemote
    and provide libbalsa_mailbox_remote_get_server().
    
    * libbalsa/mailbox_imap.c (libbalsa_mailbox_imap_class_init),
    (libbalsa_mailbox_imap_dispose), (libbalsa_mailbox_imap_finalize),
    (get_header_cache_path), (get_cache_name_pair),
    (libbalsa_mailbox_imap_close), (libbalsa_mailbox_imap_save_config),
    (libbalsa_mailbox_imap_load_config),
    (libbalsa_mailbox_imap_add_messages),
    (libbalsa_mailbox_imap_messages_copy):
    * libbalsa/mailbox_imap.h:
    * libbalsa/mailbox_pop3.c (libbalsa_mailbox_pop3_class_init),
    (libbalsa_mailbox_pop3_init), (libbalsa_mailbox_pop3_finalize),
    (libbalsa_mailbox_pop3_new), (libbalsa_mailbox_pop3_open),
    (libbalsa_mailbox_pop3_startup), (update_msg_list),
    (libbalsa_mailbox_pop3_check), (libbalsa_mailbox_pop3_save_config),
    (libbalsa_mailbox_pop3_load_config),
    (libbalsa_mailbox_pop3_set_inbox),
    (libbalsa_mailbox_pop3_set_msg_size_limit):
    * libbalsa/mailbox_pop3.h:
    * libbalsa/mailbox_remote.c (libbalsa_mailbox_remote_class_init),
    (libbalsa_mailbox_remote_init), (libbalsa_mailbox_remote_dispose),
    (libbalsa_mailbox_remote_test_can_reach),
    (libbalsa_mailbox_remote_set_server),
    (libbalsa_mailbox_remote_get_server):
    * libbalsa/mailbox_remote.h:
    * libinit_balsa/assistant_page_user.c (create_pop3_mbx),
    (create_imap_mbx):
    * src/mailbox-conf.c (update_pop_mailbox),
    (create_pop_mailbox_dialog):
    * src/main-window.c (bw_check_mailbox_list):

 ChangeLog                           |  36 ++++++
 libbalsa/mailbox_imap.c             | 219 +++++++++++++++++-------------------
 libbalsa/mailbox_imap.h             |   2 +-
 libbalsa/mailbox_pop3.c             | 154 ++++++++++---------------
 libbalsa/mailbox_pop3.h             |  16 +--
 libbalsa/mailbox_remote.c           |  94 +++++++++-------
 libbalsa/mailbox_remote.h           |  43 +++----
 libinit_balsa/assistant_page_user.c |  26 ++---
 src/mailbox-conf.c                  |  36 +++---
 src/main-window.c                   |   2 +-
 10 files changed, 308 insertions(+), 320 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f26b62b05..e73fd2fb2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,39 @@
+2019-07-05  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       mailbox-remote: declare it derivable
+
+       Use G_DECLARE_DERIVABLE_TYPE to declare LibBalsaMailboxRemote
+       and provide libbalsa_mailbox_remote_get_server().
+
+       * libbalsa/mailbox_imap.c (libbalsa_mailbox_imap_class_init),
+       (libbalsa_mailbox_imap_dispose), (libbalsa_mailbox_imap_finalize),
+       (get_header_cache_path), (get_cache_name_pair),
+       (libbalsa_mailbox_imap_close), (libbalsa_mailbox_imap_save_config),
+       (libbalsa_mailbox_imap_load_config),
+       (libbalsa_mailbox_imap_add_messages),
+       (libbalsa_mailbox_imap_messages_copy):
+       * libbalsa/mailbox_imap.h:
+       * libbalsa/mailbox_pop3.c (libbalsa_mailbox_pop3_class_init),
+       (libbalsa_mailbox_pop3_init), (libbalsa_mailbox_pop3_finalize),
+       (libbalsa_mailbox_pop3_new), (libbalsa_mailbox_pop3_open),
+       (libbalsa_mailbox_pop3_startup), (update_msg_list),
+       (libbalsa_mailbox_pop3_check), (libbalsa_mailbox_pop3_save_config),
+       (libbalsa_mailbox_pop3_load_config),
+       (libbalsa_mailbox_pop3_set_inbox),
+       (libbalsa_mailbox_pop3_set_msg_size_limit):
+       * libbalsa/mailbox_pop3.h:
+       * libbalsa/mailbox_remote.c (libbalsa_mailbox_remote_class_init),
+       (libbalsa_mailbox_remote_init), (libbalsa_mailbox_remote_dispose),
+       (libbalsa_mailbox_remote_test_can_reach),
+       (libbalsa_mailbox_remote_set_server),
+       (libbalsa_mailbox_remote_get_server):
+       * libbalsa/mailbox_remote.h:
+       * libinit_balsa/assistant_page_user.c (create_pop3_mbx),
+       (create_imap_mbx):
+       * src/mailbox-conf.c (update_pop_mailbox),
+       (create_pop_mailbox_dialog):
+       * src/main-window.c (bw_check_mailbox_list):
+
 2019-07-04  Peter Bloomfield  <pbloomfield bellsouth net>
 
        mailbox-mh: Declare it final
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index e3e91794c..7ca4c80ad 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -1,6 +1,6 @@
 /* -*-mode:c; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -91,16 +91,12 @@ struct message_info {
     LibBalsaMessageFlag user_flags;
 };
 
-static LibBalsaMailboxClass *parent_class = NULL;
-
 static off_t ImapCacheSize = 30*1024*1024; /* 30MB */
 
  /* issue message if downloaded part has more than this size */
 static unsigned SizeMsgThreshold = 50*1024;
+static void libbalsa_mailbox_imap_dispose(GObject * object);
 static void libbalsa_mailbox_imap_finalize(GObject * object);
-static void libbalsa_mailbox_imap_class_init(LibBalsaMailboxImapClass *
-                                            klass);
-static void libbalsa_mailbox_imap_init(LibBalsaMailboxImap * mailbox);
 static gboolean libbalsa_mailbox_imap_open(LibBalsaMailbox * mailbox,
                                           GError **err);
 static void libbalsa_mailbox_imap_close(LibBalsaMailbox * mailbox,
@@ -204,32 +200,7 @@ static struct message_info *message_info_from_msgno(
 
 #define IMAP_MAILBOX_UID_VALIDITY(mailbox) (LIBBALSA_MAILBOX_IMAP(mailbox)->uid_validity)
 
-GType
-libbalsa_mailbox_imap_get_type(void)
-{
-    static GType mailbox_type = 0;
-
-    if (!mailbox_type) {
-       static const GTypeInfo mailbox_info = {
-           sizeof(LibBalsaMailboxImapClass),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_mailbox_imap_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaMailboxImap),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_mailbox_imap_init
-       };
-
-       mailbox_type =
-           g_type_register_static(LIBBALSA_TYPE_MAILBOX_REMOTE,
-                                  "LibBalsaMailboxImap",
-                                  &mailbox_info, 0);
-    }
-
-    return mailbox_type;
-}
+G_DEFINE_TYPE(LibBalsaMailboxImap, libbalsa_mailbox_imap, LIBBALSA_TYPE_MAILBOX_REMOTE)
 
 static void
 libbalsa_mailbox_imap_class_init(LibBalsaMailboxImapClass * klass)
@@ -240,15 +211,14 @@ libbalsa_mailbox_imap_class_init(LibBalsaMailboxImapClass * klass)
     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_imap_dispose;
     object_class->finalize = libbalsa_mailbox_imap_finalize;
 
     libbalsa_mailbox_class->open_mailbox = libbalsa_mailbox_imap_open;
     libbalsa_mailbox_class->close_mailbox = libbalsa_mailbox_imap_close;
 
     libbalsa_mailbox_class->check = libbalsa_mailbox_imap_check;
-    
+
     libbalsa_mailbox_class->search_iter_free =
        libbalsa_mailbox_imap_search_iter_free;
     libbalsa_mailbox_class->message_match =
@@ -309,39 +279,43 @@ libbalsa_mailbox_imap_init(LibBalsaMailboxImap * mailbox)
    and close requires server for proper operation.  
 */
 static void
-libbalsa_mailbox_imap_finalize(GObject * object)
+libbalsa_mailbox_imap_dispose(GObject * object)
 {
-    LibBalsaMailboxImap *mailbox;
+    LibBalsaMailboxImap *mimap;
     LibBalsaMailboxRemote *remote;
+    LibBalsaServer *server;
 
-    g_return_if_fail(LIBBALSA_IS_MAILBOX_IMAP(object));
-
-    mailbox = LIBBALSA_MAILBOX_IMAP(object);
+    mimap = LIBBALSA_MAILBOX_IMAP(object);
 
-    g_assert(libbalsa_mailbox_get_open_ref(LIBBALSA_MAILBOX(mailbox)) == 0);
+    g_assert(libbalsa_mailbox_get_open_ref(LIBBALSA_MAILBOX(mimap)) == 0);
 
     remote = LIBBALSA_MAILBOX_REMOTE(object);
-    g_free(mailbox->path); mailbox->path = NULL;
-
-    if(remote->server) {
-        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_object_unref(G_OBJECT(remote->server));
-       remote->server = NULL;
     }
 
-    g_array_free(mailbox->sort_ranks, TRUE); mailbox->sort_ranks = NULL;
-    if(mailbox->unread_update_id) {
-        g_source_remove(mailbox->unread_update_id);
-        mailbox->unread_update_id = 0;
+    if (mimap->unread_update_id != 0) {
+        g_source_remove(mimap->unread_update_id);
+        mimap->unread_update_id = 0;
     }
 
-    g_list_free_full(mailbox->acls, (GDestroyNotify) imap_user_acl_free);
+    G_OBJECT_CLASS(libbalsa_mailbox_imap_parent_class)->dispose(object);
+}
+
+static void
+libbalsa_mailbox_imap_finalize(GObject * object)
+{
+    LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(object);
+
+    g_free(mimap->path);
+    g_array_free(mimap->sort_ranks, TRUE);
+    g_list_free_full(mimap->acls, (GDestroyNotify) imap_user_acl_free);
 
-    if (G_OBJECT_CLASS(parent_class)->finalize)
-       G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_mailbox_imap_parent_class)->finalize(object);
 }
 
 LibBalsaMailbox*
@@ -466,37 +440,45 @@ get_cache_dir(gboolean is_persistent)
 static gchar*
 get_header_cache_path(LibBalsaMailboxImap *mimap)
 {
-    LibBalsaServer *s = LIBBALSA_MAILBOX_REMOTE(mimap)->server;
-    gchar *cache_dir = get_cache_dir(TRUE); /* FIXME */
-    gchar *header_file = g_strdup_printf("%s@%s-%s-%u-headers2",
-                                        libbalsa_server_get_user(s),
-                                        libbalsa_server_get_host(s),
-                                        (mimap->path ? mimap->path : "INBOX"),
-                                        mimap->uid_validity);
-    gchar *encoded_path = libbalsa_urlencode(header_file);
+    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(mimap);
+    LibBalsaServer *server = libbalsa_mailbox_remote_get_server(remote);
+    gchar *cache_dir;
+    gchar *header_file;
+    gchar *encoded_path;
+
+    header_file = g_strdup_printf("%s@%s-%s-%u-headers2",
+                                  libbalsa_server_get_user(server),
+                                  libbalsa_server_get_host(server),
+                                  (mimap->path != NULL ? mimap->path : "INBOX"),
+                                  mimap->uid_validity);
+    encoded_path = libbalsa_urlencode(header_file);
     g_free(header_file);
+
+    cache_dir = get_cache_dir(TRUE); /* FIXME */
     header_file = g_build_filename(cache_dir, encoded_path, NULL);
-    g_free(cache_dir);
     g_free(encoded_path);
+    g_free(cache_dir);
 
     return header_file;
 }
 
 static gchar**
-get_cache_name_pair(LibBalsaMailboxImap* mailbox, const gchar *type,
+get_cache_name_pair(LibBalsaMailboxImap *mimap, const gchar *type,
                     ImapUID uid)
 {
-    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
-    LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
-    gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
+    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(mimap);
+    LibBalsaServer *server = libbalsa_mailbox_remote_get_server(remote);
+    LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
+    gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(imap_server);
     gchar **res = g_malloc(3*sizeof(gchar*));
-    ImapUID uid_validity = LIBBALSA_MAILBOX_IMAP(mailbox)->uid_validity;
+    ImapUID uid_validity = mimap->uid_validity;
     gchar *fname;
 
     res[0] = get_cache_dir(is_persistent);
     fname = g_strdup_printf("%s@%s-%s-%u-%u-%s",
-                            libbalsa_server_get_user(s), libbalsa_server_get_host(s),
-                            (mailbox->path ? mailbox->path : "INBOX"),
+                            libbalsa_server_get_user(server),
+                            libbalsa_server_get_host(server),
+                            (mimap->path != NULL ? mimap->path : "INBOX"),
                             uid_validity, uid, type);
     res[1] = libbalsa_urlencode(fname);
     g_free(fname);
@@ -1168,13 +1150,14 @@ free_messages_info(LibBalsaMailboxImap * mbox)
 static void
 libbalsa_mailbox_imap_close(LibBalsaMailbox * mailbox, gboolean expunge)
 {
-    LibBalsaServer *s      = LIBBALSA_MAILBOX_REMOTE(mailbox)->server;
-    LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
-    gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
-    LibBalsaMailboxImap *mbox = LIBBALSA_MAILBOX_IMAP(mailbox);
-    struct ImapCacheManager *icm = icm_store_cached_data(mbox->handle);
+    LibBalsaMailboxRemote *remote   = LIBBALSA_MAILBOX_REMOTE(mailbox);
+    LibBalsaServer *server          = libbalsa_mailbox_remote_get_server(remote);
+    LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
+    gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(imap_server);
+    LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
+    struct ImapCacheManager *icm = icm_store_cached_data(mimap->handle);
 
-    mbox->opened = FALSE;
+    mimap->opened = FALSE;
     g_object_set_data_full(G_OBJECT(mailbox), "cache-manager", icm,
                            (GDestroyNotify) imap_cache_manager_free);
 
@@ -1182,26 +1165,26 @@ libbalsa_mailbox_imap_close(LibBalsaMailbox * mailbox, gboolean expunge)
     if (expunge) {
        if (is_persistent) { /* We appreciate expunge info to simplify
                                next resync. */
-           imap_mbox_expunge_a(mbox->handle);
+           imap_mbox_expunge_a(mimap->handle);
        }
-       imap_mbox_close(mbox->handle);
+       imap_mbox_close(mimap->handle);
     } else
-       imap_mbox_unselect(mbox->handle);
+       imap_mbox_unselect(mimap->handle);
 
     /* We have received last notificiations, we can save the cache now. */
     if(is_persistent) {
        /* Implement only for persistent. Cache dir is shared for all
           non-persistent caches. */
-       gchar *header_file = get_header_cache_path(mbox);
+       gchar *header_file = get_header_cache_path(mimap);
        icm_save_to_file(icm, header_file);
        g_free(header_file);
     }
     clean_cache(mailbox);
 
 
-    free_messages_info(mbox);
-    libbalsa_mailbox_imap_release_handle(mbox);
-    mbox->sort_field = -1;     /* Invalidate. */
+    free_messages_info(mimap);
+    libbalsa_mailbox_imap_release_handle(mimap);
+    mimap->sort_field = -1;    /* Invalidate. */
 }
 
 static FILE*
@@ -1668,8 +1651,8 @@ libbalsa_mailbox_imap_save_config(LibBalsaMailbox * mailbox,
 
     libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
 
-    if (LIBBALSA_MAILBOX_CLASS(parent_class)->save_config)
-       LIBBALSA_MAILBOX_CLASS(parent_class)->save_config(mailbox, prefix);
+    if (LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_imap_parent_class)->save_config)
+       LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_imap_parent_class)->save_config(mailbox, prefix);
 }
 
 static void
@@ -1678,6 +1661,7 @@ libbalsa_mailbox_imap_load_config(LibBalsaMailbox * mailbox,
 {
     LibBalsaMailboxImap *mimap;
     LibBalsaMailboxRemote *remote;
+    LibBalsaImapServer *imap_server;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_IMAP(mailbox));
 
@@ -1694,14 +1678,15 @@ libbalsa_mailbox_imap_load_config(LibBalsaMailbox * mailbox,
     }
 
     remote = LIBBALSA_MAILBOX_REMOTE(mailbox);
-    remote->server = LIBBALSA_SERVER(libbalsa_imap_server_new_from_config());
+    imap_server = libbalsa_imap_server_new_from_config();
+    libbalsa_mailbox_remote_set_server(remote, LIBBALSA_SERVER(imap_server));
 
-    g_signal_connect(G_OBJECT(remote->server), "config-changed",
+    g_signal_connect(imap_server, "config-changed",
                     G_CALLBACK(server_host_settings_changed_cb),
                     (gpointer) mailbox);
 
-    if (LIBBALSA_MAILBOX_CLASS(parent_class)->load_config)
-       LIBBALSA_MAILBOX_CLASS(parent_class)->load_config(mailbox, prefix);
+    if (LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_imap_parent_class)->load_config)
+       LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_imap_parent_class)->load_config(mailbox, prefix);
 
     libbalsa_mailbox_imap_update_url(mimap);
 }
@@ -2993,15 +2978,15 @@ 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;
-       LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
-       gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(is);
+       LibBalsaServer *server = libbalsa_mailbox_remote_get_server(LIBBALSA_MAILBOX_REMOTE(mailbox));
+       LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
+       gboolean is_persistent = libbalsa_imap_server_has_persistent_cache(imap_server);
        struct append_to_cache_data atcd;
        gchar *cache_dir;
 
-       atcd.user = libbalsa_server_get_user(s);
-       atcd.host = libbalsa_server_get_host(s);
-       atcd.path = mimap->path ? mimap->path : "INBOX";
+       atcd.user = libbalsa_server_get_user(server);
+       atcd.host = libbalsa_server_get_host(server);
+       atcd.path = mimap->path != NULL ? mimap->path : "INBOX";
        atcd.cache_dir = cache_dir = get_cache_dir(is_persistent);
        atcd.curr_name = macd.outfiles;
        atcd.uid_validity = uid_sequence.uid_validity;
@@ -3312,17 +3297,21 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
                                    GArray * msgnos,
                                    LibBalsaMailbox * dest, GError **err)
 {
-    if (LIBBALSA_IS_MAILBOX_IMAP(dest) &&
-       LIBBALSA_MAILBOX_REMOTE(dest)->server ==
-       LIBBALSA_MAILBOX_REMOTE(mailbox)->server) {
+    LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
+    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(mimap);
+    LibBalsaServer *server = libbalsa_mailbox_remote_get_server(remote);
+    LibBalsaMailboxImap *mimap_dest = LIBBALSA_MAILBOX_IMAP(dest);
+    LibBalsaMailboxRemote *remote_dest = LIBBALSA_MAILBOX_REMOTE(mimap_dest);
+    LibBalsaServer *server_dest = libbalsa_mailbox_remote_get_server(remote_dest);
+
+    if (server == server_dest) {
         gboolean ret;
-       LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
-       ImapMboxHandle *handle = LIBBALSA_MAILBOX_IMAP(mailbox)->handle;
+       ImapMboxHandle *handle = mimap->handle;
        ImapSequence uid_sequence;
        unsigned *seqno = (unsigned*)msgnos->data, *uids;
        unsigned im;
        g_return_val_if_fail(handle, FALSE);
-       
+
        imap_sequence_init(&uid_sequence);
        /* User server-side copy. */
        g_array_sort(msgnos, cmp_msgno);
@@ -3331,10 +3320,10 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
            ImapMessage * imsg = imap_mbox_handle_get_msg(handle, seqno[im]);
            uids[im] = imsg ? imsg->uid : 0;
        }
-           
+
        ret = imap_mbox_handle_copy(handle, msgnos->len,
                                     (guint *) msgnos->data,
-                                    LIBBALSA_MAILBOX_IMAP(dest)->path,
+                                    mimap_dest->path,
                                    &uid_sequence)
            == IMR_OK;
         if(!ret) {
@@ -3346,21 +3335,20 @@ 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;
-           LibBalsaImapServer *is = LIBBALSA_IMAP_SERVER(s);
-           LibBalsaMailboxImap *dst_imap = LIBBALSA_MAILBOX_IMAP(dest);
+           LibBalsaImapServer *imap_server = LIBBALSA_IMAP_SERVER(server);
            gboolean is_persistent =
-               libbalsa_imap_server_has_persistent_cache(is);
+               libbalsa_imap_server_has_persistent_cache(imap_server);
            gchar *dir_name = get_cache_dir(is_persistent);
            gchar *src_prefix = g_strdup_printf("%s@%s-%s-%u-",
-                                               libbalsa_server_get_user(s), libbalsa_server_get_host(s),
-                                               (mimap->path 
+                                               libbalsa_server_get_user(server),
+                                                libbalsa_server_get_host(server),
+                                               (mimap->path
                                                 ? mimap->path : "INBOX"),
                                                mimap->uid_validity);
            gchar *encoded_path = libbalsa_urlencode(src_prefix);
            g_free(src_prefix);
            dir = g_dir_open(dir_name, 0, NULL);
-           if(dir) {
+           if (dir != NULL) {
                const gchar *filename;
                size_t prefix_length = strlen(encoded_path);
                unsigned nth;
@@ -3379,10 +3367,10 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
                                g_build_filename(dir_name, filename, NULL);
                            gchar *dst_prefix =
                                g_strdup_printf("%s@%s-%s-%u-%u%s",
-                                               libbalsa_server_get_user(s),
-                                                libbalsa_server_get_host(s),
-                                               (dst_imap->path 
-                                                ? dst_imap->path : "INBOX"),
+                                               libbalsa_server_get_user(server),
+                                                libbalsa_server_get_host(server),
+                                               (mimap_dest->path != NULL ?
+                                                mimap_dest->path : "INBOX"),
                                                uid_sequence.uid_validity,
                                                nth, tail);
 
@@ -3402,7 +3390,8 @@ libbalsa_mailbox_imap_messages_copy(LibBalsaMailbox * mailbox,
     }
 
     /* Couldn't use server-side copy, fall back to default method. */
-    return parent_class->messages_copy(mailbox, msgnos, dest, err);
+    return LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_imap_parent_class)->
+        messages_copy(mailbox, msgnos, dest, err);
 }
 
 void
diff --git a/libbalsa/mailbox_imap.h b/libbalsa/mailbox_imap.h
index f1a19caf7..ae81a3529 100644
--- a/libbalsa/mailbox_imap.h
+++ b/libbalsa/mailbox_imap.h
@@ -1,6 +1,6 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
diff --git a/libbalsa/mailbox_pop3.c b/libbalsa/mailbox_pop3.c
index b6436f262..06b810fdf 100644
--- a/libbalsa/mailbox_pop3.c
+++ b/libbalsa/mailbox_pop3.c
@@ -1,7 +1,7 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
  *
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -40,23 +40,18 @@
 enum {
     LAST_SIGNAL
 };
-static LibBalsaMailboxClass *parent_class = NULL;
 
-struct _LibBalsaMailboxPop3Class {
+struct _LibBalsaMailboxPOP3Class {
     LibBalsaMailboxRemoteClass klass;
 
-    void (*config_changed) (LibBalsaMailboxPop3* mailbox);
+    void (*config_changed) (LibBalsaMailboxPOP3 *mailbox_pop3);
 };
 
 static void libbalsa_mailbox_pop3_finalize(GObject * object);
-static void libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class *
-                                            klass);
-static void libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox);
 
 static gboolean libbalsa_mailbox_pop3_open(LibBalsaMailbox * mailbox,
                                           GError **err);
 static void libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox);
-
 static void libbalsa_mailbox_pop3_save_config(LibBalsaMailbox * mailbox,
                                              const gchar * prefix);
 static void libbalsa_mailbox_pop3_load_config(LibBalsaMailbox * mailbox,
@@ -65,36 +60,10 @@ static void libbalsa_mailbox_pop3_load_config(LibBalsaMailbox * mailbox,
 
 #define MBOX_POP3_ERROR        (g_quark_from_static_string("mailbox-pop3"))
 
-
-GType
-libbalsa_mailbox_pop3_get_type(void)
-{
-    static GType mailbox_type = 0;
-
-    if (!mailbox_type) {
-       static const GTypeInfo mailbox_info = {
-           sizeof(LibBalsaMailboxPop3Class),
-            NULL,               /* base_init */
-            NULL,               /* base_finalize */
-           (GClassInitFunc) libbalsa_mailbox_pop3_class_init,
-            NULL,               /* class_finalize */
-            NULL,               /* class_data */
-           sizeof(LibBalsaMailboxPop3),
-            0,                  /* n_preallocs */
-           (GInstanceInitFunc) libbalsa_mailbox_pop3_init
-       };
-
-       mailbox_type =
-           g_type_register_static(LIBBALSA_TYPE_MAILBOX_REMOTE,
-                                   "LibBalsaMailboxPOP3",
-                                  &mailbox_info, 0);
-    }
-
-    return mailbox_type;
-}
+G_DEFINE_TYPE(LibBalsaMailboxPOP3, libbalsa_mailbox_pop3, LIBBALSA_TYPE_MAILBOX_REMOTE)
 
 static void
-libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
+libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPOP3Class * klass)
 {
     GObjectClass *object_class;
     LibBalsaMailboxClass *libbalsa_mailbox_class;
@@ -102,8 +71,6 @@ libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
     object_class = G_OBJECT_CLASS(klass);
     libbalsa_mailbox_class = LIBBALSA_MAILBOX_CLASS(klass);
 
-    parent_class = g_type_class_peek_parent(klass);
-
     object_class->finalize = libbalsa_mailbox_pop3_finalize;
 
     libbalsa_mailbox_class->open_mailbox = libbalsa_mailbox_pop3_open;
@@ -117,38 +84,38 @@ libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
 }
 
 static void
-libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox)
+libbalsa_mailbox_pop3_init(LibBalsaMailboxPOP3 * mailbox_pop3)
 {
-    LibBalsaMailboxRemote *remote;
-    mailbox->check = FALSE;
-    mailbox->delete_from_server = FALSE;
-    mailbox->inbox = NULL;
-    mailbox->msg_size_limit = -1;
-
-    mailbox->filter = FALSE;
-    mailbox->filter_cmd = g_strdup("procmail -f -");
-    remote = LIBBALSA_MAILBOX_REMOTE(mailbox);
-    remote->server = libbalsa_server_new();
-    libbalsa_server_set_protocol(remote->server, "pop3");
+    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(mailbox_pop3);
+    LibBalsaServer *server;
+
+    mailbox_pop3->check = FALSE;
+    mailbox_pop3->delete_from_server = FALSE;
+    mailbox_pop3->inbox = NULL;
+    mailbox_pop3->msg_size_limit = -1;
+
+    mailbox_pop3->filter = FALSE;
+    mailbox_pop3->filter_cmd = g_strdup("procmail -f -");
+
+    server = libbalsa_server_new();
+    libbalsa_server_set_protocol(server, "pop3");
+    libbalsa_mailbox_remote_set_server(remote, server);
 }
 
 static void
 libbalsa_mailbox_pop3_finalize(GObject * object)
 {
-    LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(object);
-    LibBalsaMailboxPop3 *mailbox = LIBBALSA_MAILBOX_POP3(object);
+    LibBalsaMailboxPOP3 *mailbox_pop3 = LIBBALSA_MAILBOX_POP3(object);
 
-    g_object_unref(G_OBJECT(remote->server));
-    g_free(mailbox->filter_cmd);
+    g_free(mailbox_pop3->filter_cmd);
 
-    if (G_OBJECT_CLASS(parent_class)->finalize)
-       G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(libbalsa_mailbox_pop3_parent_class)->finalize(object);
 }
 
-LibBalsaMailboxPop3*
+LibBalsaMailboxPOP3*
 libbalsa_mailbox_pop3_new(void)
 {
-    LibBalsaMailboxPop3 *mailbox_pop3;
+    LibBalsaMailboxPOP3 *mailbox_pop3;
 
     mailbox_pop3 = g_object_new(LIBBALSA_TYPE_MAILBOX_POP3, NULL);
 
@@ -159,8 +126,6 @@ libbalsa_mailbox_pop3_new(void)
 static gboolean
 libbalsa_mailbox_pop3_open(LibBalsaMailbox * mailbox, GError **err)
 {
-    g_return_val_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox), FALSE);
-
     /* FIXME: it should never be called. */
 
     g_print("Opened a POP3 mailbox!\n");
@@ -473,7 +438,7 @@ message_cb(const gchar                    *buffer,
 
 static NetClientPop *
 libbalsa_mailbox_pop3_startup(LibBalsaServer      *server,
-                              LibBalsaMailboxPop3 *mailbox_pop3,
+                              LibBalsaMailboxPOP3 *mailbox_pop3,
                               const gchar         *name,
                               GList              **msg_list)
 {
@@ -559,7 +524,7 @@ libbalsa_mailbox_pop3_startup(LibBalsaServer      *server,
 
 static GList *
 update_msg_list(struct fetch_data         *fd,
-                const LibBalsaMailboxPop3 *mailbox_pop3,
+                const LibBalsaMailboxPOP3 *mailbox_pop3,
                 GHashTable               **current_uids,
                 LibBalsaServer            *server,
                 GList                     *msg_list)
@@ -645,7 +610,7 @@ update_msg_list(struct fetch_data         *fd,
 static void
 libbalsa_mailbox_pop3_check(LibBalsaMailbox * mailbox)
 {
-       LibBalsaMailboxPop3 *mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
+       LibBalsaMailboxPOP3 *mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
        LibBalsaServer *server;
        NetClientPop *pop;
        GList *msg_list;
@@ -738,24 +703,22 @@ static void
 libbalsa_mailbox_pop3_save_config(LibBalsaMailbox * mailbox,
                                  const gchar * prefix)
 {
-    LibBalsaMailboxPop3 *pop;
-
-    g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
-
-    pop = LIBBALSA_MAILBOX_POP3(mailbox);
+    LibBalsaMailboxPOP3 *mailbox_pop3;
 
     libbalsa_server_save_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
 
-    libbalsa_conf_set_bool("Check", pop->check);
-    libbalsa_conf_set_bool("Delete", pop->delete_from_server);
-    libbalsa_conf_set_bool("DisableApop", pop->disable_apop);
-    libbalsa_conf_set_bool("EnablePipe", pop->enable_pipe);
-    libbalsa_conf_set_bool("Filter", pop->filter);
-    if(pop->filter_cmd)
-        libbalsa_conf_set_string("FilterCmd", pop->filter_cmd);
+    mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
-    if (LIBBALSA_MAILBOX_CLASS(parent_class)->save_config)
-       LIBBALSA_MAILBOX_CLASS(parent_class)->save_config(mailbox, prefix);
+    libbalsa_conf_set_bool("Check", mailbox_pop3->check);
+    libbalsa_conf_set_bool("Delete", mailbox_pop3->delete_from_server);
+    libbalsa_conf_set_bool("DisableApop", mailbox_pop3->disable_apop);
+    libbalsa_conf_set_bool("EnablePipe", mailbox_pop3->enable_pipe);
+    libbalsa_conf_set_bool("Filter", mailbox_pop3->filter);
+    if (mailbox_pop3->filter_cmd != NULL)
+        libbalsa_conf_set_string("FilterCmd", mailbox_pop3->filter_cmd);
+
+    if (LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_pop3_parent_class)->save_config != NULL)
+       LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_pop3_parent_class)->save_config(mailbox, prefix);
 
 }
 
@@ -763,44 +726,45 @@ static void
 libbalsa_mailbox_pop3_load_config(LibBalsaMailbox * mailbox,
                                  const gchar * prefix)
 {
-    LibBalsaMailboxPop3 *pop;
-
-    g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
+    LibBalsaMailboxPOP3 *mailbox_pop3;
 
-    pop = LIBBALSA_MAILBOX_POP3(mailbox);
+    mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
     libbalsa_server_load_config(LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox));
 
-    pop->check = libbalsa_conf_get_bool("Check=false");
-    pop->delete_from_server = libbalsa_conf_get_bool("Delete=false");
-    pop->disable_apop = libbalsa_conf_get_bool("DisableApop=false");
-    pop->enable_pipe = libbalsa_conf_get_bool("EnablePipe=false");
-    pop->filter = libbalsa_conf_get_bool("Filter=false");
-    g_free(pop->filter_cmd);
-    pop->filter_cmd = libbalsa_conf_get_string("FilterCmd");
-    if(pop->filter_cmd && *pop->filter_cmd == '\0') {
-       g_free(pop->filter_cmd); pop->filter_cmd = NULL;
+    mailbox_pop3->check = libbalsa_conf_get_bool("Check=false");
+    mailbox_pop3->delete_from_server = libbalsa_conf_get_bool("Delete=false");
+    mailbox_pop3->disable_apop = libbalsa_conf_get_bool("DisableApop=false");
+    mailbox_pop3->enable_pipe = libbalsa_conf_get_bool("EnablePipe=false");
+    mailbox_pop3->filter = libbalsa_conf_get_bool("Filter=false");
+
+    g_free(mailbox_pop3->filter_cmd);
+    mailbox_pop3->filter_cmd = libbalsa_conf_get_string("FilterCmd");
+    if (mailbox_pop3->filter_cmd != NULL && mailbox_pop3->filter_cmd[0] == '\0') {
+       g_free(mailbox_pop3->filter_cmd);
+        mailbox_pop3->filter_cmd = NULL;
     }
 
-    if (LIBBALSA_MAILBOX_CLASS(parent_class)->load_config)
-       LIBBALSA_MAILBOX_CLASS(parent_class)->load_config(mailbox, prefix);
+    if (LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_pop3_parent_class)->load_config != NULL)
+       LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_pop3_parent_class)->load_config(mailbox, prefix);
 
 }
 void
 libbalsa_mailbox_pop3_set_inbox(LibBalsaMailbox *mailbox,
                                 LibBalsaMailbox *inbox)
 {
-    LibBalsaMailboxPop3 *mailbox_pop3;
+    LibBalsaMailboxPOP3 *mailbox_pop3;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_POP3(mailbox));
+    g_return_if_fail(LIBBALSA_IS_MAILBOX(inbox));
 
     mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
-       mailbox_pop3->inbox=inbox;
+    mailbox_pop3->inbox=inbox;
 }
 
 void
-libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPop3 *mailbox_pop3,
+libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPOP3 *mailbox_pop3,
                                          gint sz_limit)
 {
     mailbox_pop3->msg_size_limit = sz_limit;
diff --git a/libbalsa/mailbox_pop3.h b/libbalsa/mailbox_pop3.h
index 1e345a234..4c2ed7f7a 100644
--- a/libbalsa/mailbox_pop3.h
+++ b/libbalsa/mailbox_pop3.h
@@ -1,7 +1,7 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
  *
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -25,10 +25,10 @@
     (libbalsa_mailbox_pop3_get_type())
 #define LIBBALSA_MAILBOX_POP3(obj) \
     (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIBBALSA_TYPE_MAILBOX_POP3, \
-                                 LibBalsaMailboxPop3))
+                                 LibBalsaMailboxPOP3))
 #define LIBBALSA_MAILBOX_POP3_CLASS(klass) \
     (G_TYPE_CHECK_CLASS_CAST ((klass), LIBBALSA_TYPE_MAILBOX_POP3, \
-                              LibBalsaMailboxPop3Class))
+                              LibBalsaMailboxPOP3Class))
 #define LIBBALSA_IS_MAILBOX_POP3(obj) \
     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIBBALSA_TYPE_MAILBOX_POP3))
 #define LIBBALSA_IS_MAILBOX_POP3_CLASS(klass) \
@@ -36,10 +36,10 @@
 
 GType libbalsa_mailbox_pop3_get_type(void);
 
-typedef struct _LibBalsaMailboxPop3 LibBalsaMailboxPop3;
-typedef struct _LibBalsaMailboxPop3Class LibBalsaMailboxPop3Class;
+typedef struct _LibBalsaMailboxPOP3 LibBalsaMailboxPOP3;
+typedef struct _LibBalsaMailboxPOP3Class LibBalsaMailboxPOP3Class;
 
-struct _LibBalsaMailboxPop3 {
+struct _LibBalsaMailboxPOP3 {
     LibBalsaMailboxRemote mailbox;
 
     gboolean check;
@@ -53,10 +53,10 @@ struct _LibBalsaMailboxPop3 {
     gboolean enable_pipe;  /* ditto */
 };
 
-LibBalsaMailboxPop3 *libbalsa_mailbox_pop3_new(void);
+LibBalsaMailboxPOP3 *libbalsa_mailbox_pop3_new(void);
 void libbalsa_mailbox_pop3_set_inbox(LibBalsaMailbox *mailbox,
                                      LibBalsaMailbox *inbox);
-void libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPop3 *mailbox,
+void libbalsa_mailbox_pop3_set_msg_size_limit(LibBalsaMailboxPOP3 *mailbox,
                                               gint sz_limit);
 
 #endif                         /* __LIBBALSA_MAILBOX_POP3_H__ */
diff --git a/libbalsa/mailbox_remote.c b/libbalsa/mailbox_remote.c
index c9be8e23f..cafcfe542 100644
--- a/libbalsa/mailbox_remote.c
+++ b/libbalsa/mailbox_remote.c
@@ -1,7 +1,7 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
  *
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -25,55 +25,52 @@
 #include "libbalsa.h"
 #include "server.h"
 
-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,16 +80,35 @@ 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 = LIBBALSA_MAILBOX_REMOTE(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 */
 
-void 
-libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote *m, LibBalsaServer *s)
+void
+libbalsa_mailbox_remote_set_server(LibBalsaMailboxRemote *remote, LibBalsaServer *server)
 {
-    if(m->server) g_object_unref(G_OBJECT(m->server));
-    m->server = s;
-    if(s) g_object_ref(G_OBJECT(s));
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    g_return_if_fail(LIBBALSA_IS_MAILBOX_REMOTE(remote));
+    g_return_if_fail(server == NULL || LIBBALSA_IS_SERVER(server));
+
+    g_set_object(&priv->server, server);
+}
+
+LibBalsaServer *
+libbalsa_mailbox_remote_get_server(LibBalsaMailboxRemote *remote)
+{
+    LibBalsaMailboxRemotePrivate *priv =
+        libbalsa_mailbox_remote_get_instance_private(remote);
+
+    g_return_val_if_fail(LIBBALSA_IS_MAILBOX_REMOTE(remote), NULL);
+
+    return priv->server;
 }
diff --git a/libbalsa/mailbox_remote.h b/libbalsa/mailbox_remote.h
index 1e9594f6b..050e33f4a 100644
--- a/libbalsa/mailbox_remote.h
+++ b/libbalsa/mailbox_remote.h
@@ -1,7 +1,7 @@
 /* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
 /* Balsa E-Mail Client
  *
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
  *                         See the file AUTHORS for a list.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -27,43 +27,26 @@
 /* Imap and Pop3 are remote mailboxes 
    
    this object doesn't do any real work.  it is abstract
-
-     this mini-struct greatly helps in getting the server
-     from the mailbox without having a Server pointer off of
-     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_MAILBOX_REMOTE_SERVER(mailbox) \
-    (LIBBALSA_SERVER(LIBBALSA_MAILBOX_REMOTE(mailbox)->server))
 
-typedef struct _LibBalsaMailboxRemoteClass LibBalsaMailboxRemoteClass;
+#define LIBBALSA_TYPE_MAILBOX_REMOTE libbalsa_mailbox_remote_get_type()
 
-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_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__ */
diff --git a/libinit_balsa/assistant_page_user.c b/libinit_balsa/assistant_page_user.c
index 5f9a92117..66b11f96f 100644
--- a/libinit_balsa/assistant_page_user.c
+++ b/libinit_balsa/assistant_page_user.c
@@ -197,9 +197,9 @@ create_pop3_mbx(const gchar *name, const gchar* host, gint security,
                 const gchar *login, const gchar *passwd,
                 gboolean remember)
 {
-    LibBalsaMailboxPop3 *pop = libbalsa_mailbox_pop3_new();
-    LibBalsaMailbox *mbx   = LIBBALSA_MAILBOX(pop);
-    LibBalsaServer *server = LIBBALSA_MAILBOX_REMOTE_SERVER(pop);
+    LibBalsaMailboxPOP3 *mailbox_pop3 = libbalsa_mailbox_pop3_new();
+    LibBalsaMailbox *mailbox          = LIBBALSA_MAILBOX(mailbox_pop3);
+    LibBalsaServer *server            = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
     gchar *mailbox_name;
 
     libbalsa_server_set_username(server, login);
@@ -207,17 +207,17 @@ create_pop3_mbx(const gchar *name, const gchar* host, gint security,
     libbalsa_server_set_host(server, host, security);
     libbalsa_server_set_remember_password(server, remember);
 
-    mailbox_name = g_strdup(name && *name ? name : host);
-    libbalsa_mailbox_set_name(mbx, mailbox_name);
+    mailbox_name = g_strdup(name != NULL && name[0] != '\0' ? name : host);
+    libbalsa_mailbox_set_name(mailbox, mailbox_name);
     g_free(mailbox_name);
 
-    pop->check              = TRUE;
-    pop->disable_apop       = FALSE;
-    pop->delete_from_server = TRUE;
-    pop->filter             = FALSE;
-    pop->filter_cmd         = g_strdup("procmail -f -");
-    
-    return mbx;
+    mailbox_pop3->check              = TRUE;
+    mailbox_pop3->disable_apop       = FALSE;
+    mailbox_pop3->delete_from_server = TRUE;
+    mailbox_pop3->filter             = FALSE;
+    mailbox_pop3->filter_cmd         = g_strdup("procmail -f -");
+
+    return mailbox;
 }
 
 static void
@@ -233,7 +233,7 @@ create_imap_mbx(const gchar *name, const gchar* host, NetClientCryptMode securit
     libbalsa_server_set_host(server, host, security);
     libbalsa_server_set_remember_password(server, remember);
     mbnode = balsa_mailbox_node_new_imap_folder(server, NULL);
-    mbnode->name = g_strdup(name && *name ? name : host);
+    mbnode->name = g_strdup(name != NULL && name[0] != '\0' ? name : host);
 
     config_folder_add(mbnode, NULL);
     /* memory leak? */
diff --git a/src/mailbox-conf.c b/src/mailbox-conf.c
index 265cd0b33..94fc10944 100644
--- a/src/mailbox-conf.c
+++ b/src/mailbox-conf.c
@@ -484,14 +484,14 @@ check_for_blank_fields(GtkWidget G_GNUC_UNUSED *widget,
 static void
 update_pop_mailbox(MailboxConfWindow *mcw)
 {
-       LibBalsaMailboxPop3 *pop3;
+       LibBalsaMailboxPOP3 *mailbox_pop3;
        LibBalsaMailbox *mailbox;
        LibBalsaServer *server;
         gchar *name;
 
-       pop3 = LIBBALSA_MAILBOX_POP3(mcw->mailbox);
-       server = LIBBALSA_MAILBOX_REMOTE_SERVER(pop3);
-        mailbox = (LibBalsaMailbox *) pop3;
+       mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mcw->mailbox);
+       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox_pop3);
+        mailbox = (LibBalsaMailbox *) mailbox_pop3;
 
        /* basic data */
        name = g_strdup(libbalsa_server_cfg_get_name(mcw->mb_data.pop3.server_cfg));
@@ -501,15 +501,15 @@ update_pop_mailbox(MailboxConfWindow *mcw)
        libbalsa_server_cfg_assign_server(mcw->mb_data.pop3.server_cfg, server);
        libbalsa_server_config_changed(server);
 
-       pop3->check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check));
-       pop3->delete_from_server = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON 
(mcw->mb_data.pop3.delete_from_server));
-       pop3->filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter));
-       g_free(pop3->filter_cmd);
-       pop3->filter_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd)));
+       mailbox_pop3->check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check));
+       mailbox_pop3->delete_from_server = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON 
(mcw->mb_data.pop3.delete_from_server));
+       mailbox_pop3->filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter));
+       g_free(mailbox_pop3->filter_cmd);
+       mailbox_pop3->filter_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd)));
 
        /* advanced settings */
-       pop3->disable_apop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop));
-       pop3->enable_pipe = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe));
+       mailbox_pop3->disable_apop = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop));
+       mailbox_pop3->enable_pipe = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe));
 }
 
 /* conf_update_mailbox:
@@ -782,7 +782,7 @@ static GtkWidget *
 create_pop_mailbox_dialog(MailboxConfWindow *mcw)
 {
        LibBalsaMailbox *mailbox = mcw->mailbox;
-    LibBalsaMailboxPop3 *pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
+    LibBalsaMailboxPOP3 *mailbox_pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
 
        mcw->window = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Remote Mailbox Configurator"),
         GTK_WINDOW(balsa_app.main_window),
@@ -802,25 +802,25 @@ create_pop_mailbox_dialog(MailboxConfWindow *mcw)
 
     /* toggle for deletion from server */
     mcw->mb_data.pop3.delete_from_server = libbalsa_server_cfg_add_check(mcw->mb_data.pop3.server_cfg, TRUE,
-       _("_Delete messages from server after download"), pop3->delete_from_server, NULL, NULL);
+       _("_Delete messages from server after download"), mailbox_pop3->delete_from_server, NULL, NULL);
 
     /* toggle for check */
     mcw->mb_data.pop3.check = libbalsa_server_cfg_add_check(mcw->mb_data.pop3.server_cfg, TRUE, _("_Enable 
check for new mail"),
-       pop3->check, NULL, NULL);
+       mailbox_pop3->check, NULL, NULL);
 
     /* Procmail */
     mcw->mb_data.pop3.filter = libbalsa_server_cfg_add_check(mcw->mb_data.pop3.server_cfg, TRUE,
-       _("_Filter messages through procmail"), pop3->filter, G_CALLBACK(check_for_blank_fields), mcw);
+       _("_Filter messages through procmail"), mailbox_pop3->filter, G_CALLBACK(check_for_blank_fields), 
mcw);
     mcw->mb_data.pop3.filter_cmd = libbalsa_server_cfg_add_entry(mcw->mb_data.pop3.server_cfg, TRUE, 
_("Fi_lter Command:"),
-       pop3->filter_cmd, G_CALLBACK(check_for_blank_fields), mcw);
+       mailbox_pop3->filter_cmd, G_CALLBACK(check_for_blank_fields), mcw);
 
     /* advanced - toggle for apop */
     mcw->mb_data.pop3.disable_apop = libbalsa_server_cfg_add_check(mcw->mb_data.pop3.server_cfg, FALSE, 
_("Disable _APOP"),
-       pop3->disable_apop, NULL, NULL);
+       mailbox_pop3->disable_apop, NULL, NULL);
 
     /* toggle for enabling pipeling */
     mcw->mb_data.pop3.enable_pipe = libbalsa_server_cfg_add_check(mcw->mb_data.pop3.server_cfg, FALSE, 
_("Overlap commands"),
-       pop3->enable_pipe, NULL, NULL);
+       mailbox_pop3->enable_pipe, NULL, NULL);
 
     /* initially call the check */
     check_for_blank_fields(NULL, mcw);
diff --git a/src/main-window.c b/src/main-window.c
index 9257f81a1..36ff76e27 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -3238,7 +3238,7 @@ bw_check_mailbox_list(struct check_messages_thread_info *info, GList *mailbox_li
 
     for ( ; mailbox_list; mailbox_list = mailbox_list->next) {
         LibBalsaMailbox *mailbox = BALSA_MAILBOX_NODE(mailbox_list->data)->mailbox;
-        LibBalsaMailboxPop3 *pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
+        LibBalsaMailboxPOP3 *pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
         bw_pop_mbox_t *bw_pop_mbox;
 
         bw_pop_mbox = g_malloc0(sizeof(bw_pop_mbox_t));


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