]> git.0d.be Git - empathy.git/commitdiff
Fix disconnection of AccountStatusChanged signal.
authorXavier Claessens <xclaesse@src.gnome.org>
Sun, 13 Apr 2008 12:39:13 +0000 (12:39 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Sun, 13 Apr 2008 12:39:13 +0000 (12:39 +0000)
svn path=/trunk/; revision=932

libempathy-gtk/empathy-account-chooser.c
libempathy-gtk/empathy-accounts-dialog.c
libempathy-gtk/empathy-chat.c
libempathy/empathy-contact-manager.c
libempathy/empathy-tp-contact-factory.c
libempathy/empathy-utils.c
libempathy/empathy-utils.h
src/empathy-main-window.c

index 6b731ff7376e813abf8989caaa0836135e002b45..f46f4cec602fb7cb738ae523cbccf1a28a930914 100644 (file)
@@ -47,6 +47,7 @@ typedef struct {
        gboolean                        has_all_option;
        EmpathyAccountChooserFilterFunc filter;
        gpointer                        filter_data;
+       gpointer                        token;
 } EmpathyAccountChooserPriv;
 
 typedef struct {
@@ -151,10 +152,7 @@ account_chooser_finalize (GObject *object)
        g_signal_handlers_disconnect_by_func (priv->monitor,
                                              account_chooser_account_deleted_cb,
                                              chooser);
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc),
-                                       "AccountStatusChanged",
-                                       G_CALLBACK (account_chooser_status_changed_cb),
-                                       chooser);
+       empathy_disconnect_account_status_changed (priv->token);
        g_object_unref (priv->mc);
        g_object_unref (priv->monitor);
 
@@ -223,7 +221,7 @@ empathy_account_chooser_new (void)
        g_signal_connect (priv->monitor, "account-deleted",
                          G_CALLBACK (account_chooser_account_deleted_cb),
                          chooser);
-       empathy_connect_to_account_status_changed (priv->mc,
+       priv->token = empathy_connect_to_account_status_changed (priv->mc,
                                                   G_CALLBACK (account_chooser_status_changed_cb),
                                                   chooser, NULL);
 
index 6f4421b887113bd1de4e7c3f8ea25a75ce7dfec1..0ea4416a3bc68ba7fd62996bfc7cd5d0e98ed7ff 100644 (file)
@@ -84,6 +84,7 @@ typedef struct {
 
        MissionControl   *mc;
        McAccountMonitor *monitor;
+       gpointer          token;
 } EmpathyAccountsDialog;
 
 enum {
@@ -962,10 +963,7 @@ accounts_dialog_destroy_cb (GtkWidget            *widget,
        g_signal_handlers_disconnect_by_func (dialog->monitor,
                                              accounts_dialog_account_enabled_cb,
                                              dialog);
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (dialog->mc),
-                                       "AccountStatusChanged",
-                                       G_CALLBACK (accounts_dialog_status_changed_cb),
-                                       dialog);
+       empathy_disconnect_account_status_changed (dialog->token);
 
        /* Delete incomplete accounts */
        accounts = mc_accounts_list ();
@@ -1074,7 +1072,7 @@ empathy_accounts_dialog_show (GtkWindow *parent)
        g_signal_connect (dialog->monitor, "account-disabled",
                          G_CALLBACK (accounts_dialog_account_enabled_cb),
                          dialog);
-       empathy_connect_to_account_status_changed (dialog->mc,
+       dialog->token = empathy_connect_to_account_status_changed (dialog->mc,
                                                   G_CALLBACK (accounts_dialog_status_changed_cb),
                                                   dialog, NULL);
 
index 0328c4ee90a4d10488e135560c95609c55f068c9..fce7856c4c0e5911c3e97c57616d95c58a116d17 100644 (file)
@@ -77,6 +77,7 @@ struct _EmpathyChatPriv {
        guint              composing_stop_timeout_id;
        guint              block_events_timeout_id;
        TpHandleType       handle_type;
+       gpointer           token;
 
        GtkWidget         *widget;
        GtkWidget         *hpaned;
@@ -1405,9 +1406,7 @@ chat_finalize (GObject *object)
 
        chat_composing_remove_timeout (chat);
 
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged",
-                                       G_CALLBACK (chat_status_changed_cb),
-                                       chat);
+       empathy_disconnect_account_status_changed (priv->token);
        g_object_unref (priv->mc);
        g_object_unref (priv->log_manager);
        g_object_unref (priv->store);
@@ -1537,7 +1536,7 @@ empathy_chat_init (EmpathyChat *chat)
        priv->sent_messages_index = -1;
        priv->mc = empathy_mission_control_new ();
 
-       empathy_connect_to_account_status_changed (priv->mc,
+       priv->token = empathy_connect_to_account_status_changed (priv->mc,
                                                   G_CALLBACK (chat_status_changed_cb),
                                                   chat, NULL);
 
index a151dbd26b649f7c1c6b0ca61687b5e84f365383..cad19293e1bab7e01c575c968412b3bc6f3d1e6a 100644 (file)
@@ -38,6 +38,7 @@
 struct _EmpathyContactManagerPriv {
        GHashTable     *lists;
        MissionControl *mc;
+       gpointer        token;
 };
 
 static void empathy_contact_manager_class_init (EmpathyContactManagerClass *klass);
@@ -188,11 +189,7 @@ contact_manager_finalize (GObject *object)
 {
        EmpathyContactManagerPriv *priv = GET_PRIV (object);
 
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc),
-                                       "AccountStatusChanged",
-                                       G_CALLBACK (contact_manager_status_changed_cb),
-                                       object);
-
+       empathy_disconnect_account_status_changed (priv->token);
        g_hash_table_foreach (priv->lists,
                              contact_manager_disconnect_foreach,
                              object);
@@ -224,10 +221,9 @@ empathy_contact_manager_init (EmpathyContactManager *manager)
                                             (GDestroyNotify) g_object_unref);
 
        priv->mc = empathy_mission_control_new ();
-
-       empathy_connect_to_account_status_changed (priv->mc,
-                                                  G_CALLBACK (contact_manager_status_changed_cb),
-                                                  manager, NULL);
+       priv->token = empathy_connect_to_account_status_changed (priv->mc,
+               G_CALLBACK (contact_manager_status_changed_cb),
+               manager, NULL);
 
        /* Get ContactList for existing connections */
        accounts = mission_control_get_online_connections (priv->mc, NULL);
index 678e53b365dbb3dbb455664dcdac2f4072d209e7..1c7c33f76ca52105d6a4d485e895e43fbfbe528b 100644 (file)
@@ -44,6 +44,7 @@ struct _EmpathyTpContactFactoryPriv {
 
        GList          *contacts;
        EmpathyContact *user;
+       gpointer        token;
 };
 
 static void empathy_tp_contact_factory_class_init (EmpathyTpContactFactoryClass *klass);
@@ -1196,10 +1197,7 @@ tp_contact_factory_finalize (GObject *object)
                       object,
                       mc_account_get_normalized_name (priv->account));
 
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc),
-                                       "AccountStatusChanged",
-                                       G_CALLBACK (tp_contact_factory_status_changed_cb),
-                                       object);
+       empathy_disconnect_account_status_changed (priv->token);
 
        for (l = priv->contacts; l; l = l->next) {
                g_object_weak_unref (G_OBJECT (l->data),
@@ -1277,7 +1275,7 @@ empathy_tp_contact_factory_init (EmpathyTpContactFactory *tp_factory)
        EmpathyTpContactFactoryPriv *priv = GET_PRIV (tp_factory);
 
        priv->mc = empathy_mission_control_new ();
-       empathy_connect_to_account_status_changed (priv->mc,
+       priv->token = empathy_connect_to_account_status_changed (priv->mc,
                                                   G_CALLBACK (tp_contact_factory_status_changed_cb),
                                                   tp_factory, NULL);
 }
index 46fb97027be78bd7a3a4a4761e69a763777eac04..3876cdf48ac521cca2977c1b1313710e9aac082c 100644 (file)
@@ -639,16 +639,16 @@ typedef void (*AccountStatusChangedFunc) (MissionControl           *mc,
                                          McPresence                presence,
                                          TpConnectionStatusReason  reason,
                                          const gchar              *unique_name,
-                                         gpointer                 *user_data);
+                                         gpointer                  user_data);
 
 typedef struct {
        AccountStatusChangedFunc handler;
        gpointer                 user_data;
        GClosureNotify           free_func;
+       MissionControl          *mc;
 } AccountStatusChangedData;
 
 typedef struct {
-       MissionControl           *mc;
        TpConnectionStatus        status;
        McPresence                presence;
        TpConnectionStatusReason  reason;
@@ -665,6 +665,7 @@ account_status_changed_data_free (gpointer ptr,
        if (data->free_func) {
                data->free_func (data->user_data, closure);
        }
+       g_object_unref (data->mc);
        g_slice_free (AccountStatusChangedData, data);
 }
 
@@ -673,7 +674,7 @@ account_status_changed_invoke_callback (gpointer data)
 {
        InvocationData *invocation_data = data;
 
-       invocation_data->data->handler (invocation_data->mc,
+       invocation_data->data->handler (invocation_data->data->mc,
                                        invocation_data->status,
                                        invocation_data->presence,
                                        invocation_data->reason,
@@ -697,18 +698,18 @@ account_status_changed_cb (MissionControl           *mc,
        InvocationData *invocation_data;
 
        invocation_data = g_slice_new (InvocationData);
-       invocation_data->mc = mc;
        invocation_data->status = status;
        invocation_data->presence = presence;
        invocation_data->reason = reason;
        invocation_data->unique_name = g_strdup (unique_name);
        invocation_data->data = data;
+
        g_idle_add_full (G_PRIORITY_HIGH,
                         account_status_changed_invoke_callback,
                         invocation_data, NULL);
 }
 
-void
+gpointer
 empathy_connect_to_account_status_changed (MissionControl *mc,
                                           GCallback       handler,
                                           gpointer        user_data,
@@ -716,16 +717,30 @@ empathy_connect_to_account_status_changed (MissionControl *mc,
 {
        AccountStatusChangedData *data;
 
-       g_return_if_fail (IS_MISSIONCONTROL (mc));
-       g_return_if_fail (handler != NULL);
+       g_return_val_if_fail (IS_MISSIONCONTROL (mc), NULL);
+       g_return_val_if_fail (handler != NULL, NULL);
        
        data = g_slice_new (AccountStatusChangedData);
-
        data->handler = (AccountStatusChangedFunc) handler;
        data->user_data = user_data;
        data->free_func = free_func;
+       data->mc = g_object_ref (mc);
+
        dbus_g_proxy_connect_signal (DBUS_G_PROXY (mc), "AccountStatusChanged",
                                     G_CALLBACK (account_status_changed_cb),
                                     data, account_status_changed_data_free);
+
+       return data;
+}
+
+void
+empathy_disconnect_account_status_changed (gpointer token)
+{
+       AccountStatusChangedData *data = token;
+
+       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (data->mc),
+                                       "AccountStatusChanged",
+                                       G_CALLBACK (account_status_changed_cb),
+                                       data);
 }
 
index 2b14374fb410cc96cecb026f1c80a9a64bf245a5..421031704886259f92b5a7f78b0fe9811eb4a19c 100644 (file)
@@ -102,10 +102,11 @@ void          empathy_run_until_ready_full          (gpointer         object,
                                                     gpointer         user_data,
                                                     GMainLoop      **loop);
 McAccount *  empathy_channel_get_account            (TpChannel       *channel);
-void          empathy_connect_to_account_status_changed (MissionControl *mc,
+gpointer      empathy_connect_to_account_status_changed (MissionControl *mc,
                                                         GCallback       handler,
                                                         gpointer        user_data,
                                                         GClosureNotify  free_func);
+void          empathy_disconnect_account_status_changed (gpointer        token);
 
 G_END_DECLS
 
index 5c46d7f7cd53790aba87548890825412f7e16014..065c6fcc82319370ca99d48aaacb4ac8d64afb16 100644 (file)
@@ -73,6 +73,7 @@ typedef struct {
        EmpathyContactListStore *list_store;
        MissionControl          *mc;
        EmpathyChatroomManager  *chatroom_manager;
+       gpointer                 token;
 
        GtkWidget              *window;
        GtkWidget              *main_vbox;
@@ -239,7 +240,7 @@ empathy_main_window_show (void)
        g_object_unref (glade);
 
        window->mc = empathy_mission_control_new ();
-       empathy_connect_to_account_status_changed (window->mc,
+       window->token = empathy_connect_to_account_status_changed (window->mc,
                                                   G_CALLBACK (main_window_status_changed_cb),
                                                   window, NULL);
 
@@ -374,9 +375,7 @@ main_window_destroy_cb (GtkWidget         *widget,
        /* Save user-defined accelerators. */
        main_window_accels_save ();
 
-       dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (window->mc), "AccountStatusChanged",
-                                       G_CALLBACK (main_window_status_changed_cb),
-                                       window);
+       empathy_disconnect_account_status_changed (window->token);
 
        if (window->size_timeout_id) {
                g_source_remove (window->size_timeout_id);