Properly disconnect the signals in the send queues
authorSergio Villar Senin <svillar@igalia.com>
Wed, 20 May 2009 14:23:37 +0000 (16:23 +0200)
committerSergio Villar Senin <svillar@igalia.com>
Thu, 21 May 2009 09:30:25 +0000 (11:30 +0200)
Moved some signal connections to new() call

src/modest-tny-account-store.c
src/modest-tny-send-queue.c

index d887e9e..ababcdf 100644 (file)
@@ -255,7 +255,6 @@ modest_tny_account_store_class_init (ModestTnyAccountStoreClass *klass)
 static void
 modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
 {
-       GnomeVFSVolumeMonitor* monitor = NULL;
        ModestTnyAccountStorePrivate *priv;
 
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(obj);
@@ -278,21 +277,6 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
          */
        priv->password_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                     g_free, g_free);
-
-       /* Respond to volume mounts and unmounts, such 
-        * as the insertion/removal of the memory card: */
-       /* This is a singleton, so it does not need to be unrefed. */
-       monitor = gnome_vfs_get_volume_monitor();
-
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
-                                                      G_OBJECT(monitor), 
-                                                      "volume-mounted",
-                                                      G_CALLBACK(on_vfs_volume_mounted),
-                                                      obj);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
-                                                      G_OBJECT(monitor), "volume-unmounted",
-                                                      G_CALLBACK(on_vfs_volume_unmounted),
-                                                      obj);
 }
 
 /* disconnect the list of TnyAccounts */
@@ -841,7 +825,7 @@ modest_tny_account_store_finalize (GObject *obj)
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
-gboolean 
+static gboolean 
 volume_path_is_mounted (const gchar* path)
 {
        g_return_val_if_fail (path, FALSE);
@@ -896,13 +880,14 @@ volume_path_is_mounted (const gchar* path)
 }
 
 ModestTnyAccountStore*
-modest_tny_account_store_new (ModestAccountMgr *account_mgr, 
-                             TnyDevice *device) 
+modest_tny_account_store_new (ModestAccountMgr *account_mgr,
+                             TnyDevice *device)
 {
        GObject *obj;
        ModestTnyAccountStorePrivate *priv;
        TnyAccount *local_account = NULL;
-       TnyLockable *lockable;  
+       TnyLockable *lockable;
+       GnomeVFSVolumeMonitor* monitor = NULL;
 
        g_return_val_if_fail (account_mgr, NULL);
        g_return_val_if_fail (device, NULL);
@@ -912,7 +897,7 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr,
 
        priv->account_mgr = g_object_ref (G_OBJECT(account_mgr));
        priv->device = g_object_ref (device);
-       
+
        priv->session = tny_session_camel_new (TNY_ACCOUNT_STORE(obj));
        if (!priv->session) {
                g_warning ("failed to get TnySessionCamel");
@@ -923,7 +908,7 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr,
        lockable = tny_gtk_lockable_new ();
        tny_session_camel_set_ui_locker (priv->session, lockable);
        g_object_unref (lockable);
-       
+
        /* Connect signals */
        priv->sighandlers  =  modest_signal_mgr_connect (priv->sighandlers,
                                                         G_OBJECT(account_mgr), "account_inserted",
@@ -935,6 +920,20 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr,
                                                         G_OBJECT(account_mgr), "account_removed",
                                                         G_CALLBACK (on_account_removed), obj);
 
+       /* Respond to volume mounts and unmounts, such as the
+          insertion/removal of the memory card. This is a singleton,
+          so it does not need to be unrefed */
+       monitor = gnome_vfs_get_volume_monitor();
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT(monitor),
+                                                      "volume-mounted",
+                                                      G_CALLBACK(on_vfs_volume_mounted),
+                                                      obj);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT(monitor), "volume-unmounted",
+                                                      G_CALLBACK(on_vfs_volume_unmounted),
+                                                      obj);
+
        /* Create the lists of accounts */
        priv->store_accounts = tny_simple_list_new ();
        priv->transport_accounts = tny_simple_list_new ();
index 985e0a6..b5a430d 100644 (file)
@@ -113,6 +113,8 @@ struct _ModestTnySendQueuePrivate {
        gboolean requested_send_receive;
 
        gboolean sending;
+
+       GSList *sighandlers;
 };
 
 #define MODEST_TNY_SEND_QUEUE_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
@@ -407,6 +409,7 @@ modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class)
        priv->outbox = NULL;
        priv->sentbox = NULL;
        priv->sending = FALSE;
+       priv->sighandlers = NULL;
 }
 
 static void
@@ -416,6 +419,9 @@ modest_tny_send_queue_finalize (GObject *obj)
 
        priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (obj);
 
+       modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
+       priv->sighandlers = NULL;
+
        g_queue_foreach (priv->queue, (GFunc)modest_tny_send_queue_info_free, NULL);
        g_queue_free (priv->queue);
 
@@ -487,9 +493,9 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account)
        ModestTnySendQueuePrivate *priv = NULL;
        TnyList *headers = NULL;
        GetHeadersInfo *info;
-       
+
        g_return_val_if_fail (TNY_IS_CAMEL_TRANSPORT_ACCOUNT(account), NULL);
-       
+
        self = MODEST_TNY_SEND_QUEUE(g_object_new(MODEST_TYPE_TNY_SEND_QUEUE, NULL));
 
        /* Set outbox and sentbox */
@@ -507,24 +513,27 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account)
        }
 
        /* Connect signals to control when a msg is being or has been sent */
-       g_signal_connect (G_OBJECT(self), "msg-sending",
-                         G_CALLBACK(_on_msg_start_sending),
-                         NULL);                          
-       g_signal_connect (G_OBJECT(self), "msg-sent",
-                         G_CALLBACK(_on_msg_has_been_sent), 
-                         NULL);
-       g_signal_connect (G_OBJECT(self), "error-happened",
-                         G_CALLBACK(_on_msg_error_happened),
-                         NULL);
-
-       g_signal_connect (G_OBJECT (self), "queue-start",
-                         G_CALLBACK (_on_queue_start),
-                         NULL);
-
-       g_signal_connect (G_OBJECT (self), "queue-stop",
-                         G_CALLBACK (_on_queue_stop),
-                         NULL);
-
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT(self),
+                                                      "msg-sending",
+                                                      G_CALLBACK(_on_msg_start_sending),
+                                                      NULL);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT(self), "msg-sent",
+                                                      G_CALLBACK(_on_msg_has_been_sent),
+                                                      NULL);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT(self), "error-happened",
+                                                      G_CALLBACK(_on_msg_error_happened),
+                                                      NULL);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT (self), "queue-start",
+                                                      G_CALLBACK (_on_queue_start),
+                                                      NULL);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                      G_OBJECT (self), "queue-stop",
+                                                      G_CALLBACK (_on_queue_stop),
+                                                      NULL);
        priv->requested_send_receive = FALSE;
 
        headers = tny_simple_list_new ();