[balsa] compose window: Hold a reference to identity



commit e471ecd47bcccb27fcbca53287134b93a84acc85
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Fri May 29 12:58:42 2020 -0400

    compose window: Hold a reference to identity
    
    It is possible for BalsaSendmsg:ident to be unreffed by the
    identity configuration editor; it is only a minor inconvenience,
    but we can make it more robust by holding a reference.
    
    * src/sendmsg-window.c (update_bsmsg_identity),
      (set_identity_from_mailbox), (guess_identity_from_list),
      (sendmsg_window_new): manage the reference;
      (balsa_sendmsg_destroy_handler): ditto; also do not bother to
        clear members of BalsaSendmsg, as it is about to be deallocated.

 ChangeLog            | 14 ++++++++++++++
 src/sendmsg-window.c | 36 ++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 20 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 8abb75803..ff3d8dbb3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2020-05-29  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       compose window: Hold a reference to identity
+
+       It is possible for BalsaSendmsg:ident to be unreffed by the
+       identity configuration editor; it is only a minor inconvenience,
+       but we can make it more robust by holding a reference.
+
+       * src/sendmsg-window.c (update_bsmsg_identity),
+         (set_identity_from_mailbox), (guess_identity_from_list),
+         (sendmsg_window_new): manage the reference;
+         (balsa_sendmsg_destroy_handler): ditto; also do not bother to
+           clear members of BalsaSendmsg, as it is about to be deallocated.
+
 2020-05-23  Peter Bloomfield  <pbloomfield bellsouth net>
 
        autocrypt: Stop using direct access to GdkEvent structs
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index f9e0631ce..52ce56127 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -548,8 +548,11 @@ destroy_event_cb(GtkWidget * widget, gpointer data)
 }
 
 /* the balsa_sendmsg destructor; copies first the shown headers setting
-   to the balsa_app structure.
-*/
+ * to the balsa_app structure. The BalsaSendmsg is deallocated after
+ * freeing up all resources, so we do not clear its members; if it were
+ * to become a GObject::dispose method, we would need to be more
+ * careful, to protect against repeated calls.
+ */
 #define BALSA_SENDMSG_WINDOW_KEY "balsa-sendmsg-window-key"
 static void
 balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
@@ -577,7 +580,6 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
                    /* Respect pref setting: */
                                   balsa_app.expunge_on_close);
        g_object_unref(bsmsg->parent_message);
-        bsmsg->parent_message = NULL;
     }
 
     if (bsmsg->draft_message != NULL) {
@@ -591,7 +593,6 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
                    /* Respect pref setting: */
                                   balsa_app.expunge_on_close);
        g_object_unref(bsmsg->draft_message);
-        bsmsg->draft_message = NULL;
     }
 
     if (balsa_app.debug)
@@ -600,19 +601,14 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
     quit_on_close = bsmsg->quit_on_close;
     g_free(bsmsg->fcc_url);
     g_free(bsmsg->in_reply_to);
-    if(bsmsg->references) {
-        g_list_free_full(bsmsg->references, g_free);
-        bsmsg->references = NULL;
-    }
+    g_list_free_full(bsmsg->references, g_free);
 
 #if !(HAVE_GSPELL || HAVE_GTKSPELL)
     if (bsmsg->spell_checker)
         gtk_widget_destroy(bsmsg->spell_checker);
 #endif                          /* HAVE_GTKSPELL */
-    if (bsmsg->autosave_timeout_id) {
+    if (bsmsg->autosave_timeout_id != 0)
         g_source_remove(bsmsg->autosave_timeout_id);
-        bsmsg->autosave_timeout_id = 0;
-    }
 
 #if !HAVE_GTKSOURCEVIEW
     g_object_unref(bsmsg->buffer2);
@@ -624,14 +620,11 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
             g_list_remove(balsa_app.identities, bsmsg->ident);
         balsa_app.identities =
             g_list_prepend(balsa_app.identities, bsmsg->ident);
-    } else {
-        /* The identity was removed from balsa_app.identities, and
-         * probably destroyed, so we'll just drop the pointer. */
-        bsmsg->ident = NULL;
+
     }
+    g_object_unref(bsmsg->ident);
 
     g_free(bsmsg->spell_check_lang);
-    bsmsg->spell_check_lang = NULL;
 
     g_free(bsmsg);
 
@@ -1042,6 +1035,7 @@ sw_action_get_active(BalsaSendmsg * bsmsg,
  * Change the specified BalsaSendmsg current identity, and update the
  * corresponding fields.
  * */
+
 static void
 update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
 {
@@ -1193,7 +1187,7 @@ update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
 
     /* switch identities in bsmsg here so we can use read_signature
      * again */
-    bsmsg->ident = ident;
+    g_set_object(&bsmsg->ident, ident);
     if ( (reply_type && libbalsa_identity_get_sig_whenreply(ident))
          || (forward_type && libbalsa_identity_get_sig_whenforward(ident))
          || (bsmsg->type == SEND_NORMAL && libbalsa_identity_get_sig_sending(ident)))
@@ -3994,7 +3988,7 @@ set_identity_from_mailbox(BalsaSendmsg *bsmsg, LibBalsaMessage *message)
         const gchar *name = libbalsa_identity_get_identity_name(ident);
 
         if (g_ascii_strcasecmp(name, identity) == 0) {
-            bsmsg->ident = ident;
+            g_set_object(&bsmsg->ident, ident);
             return TRUE;
         }
     }
@@ -4038,7 +4032,7 @@ guess_identity_from_list(BalsaSendmsg * bsmsg, InternetAddressList * list,
                 LibBalsaIdentity *ident = LIBBALSA_IDENTITY(l->data);
                 if (libbalsa_ia_rfc2821_equal(libbalsa_identity_get_address(ident),
                                               ia)) {
-                    bsmsg->ident = ident;
+                    g_set_object(&bsmsg->ident, ident);
                     return TRUE;
                 }
             }
@@ -6834,7 +6828,9 @@ sendmsg_window_new()
     bsmsg->spell_check_lang = NULL;
     bsmsg->fcc_url  = NULL;
     bsmsg->insert_mark = NULL;
-    bsmsg->ident = balsa_app.current_ident;
+
+    bsmsg->ident = g_object_ref(balsa_app.current_ident);
+
     bsmsg->update_config = FALSE;
     bsmsg->quit_on_close = FALSE;
     bsmsg->state = SENDMSG_STATE_CLEAN;


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