[empathy] disconnect NewChannels signal once we got all the list channels we care about



commit c821e81c68acc1daba78899c9c844f916ea2c99e
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Wed Mar 24 11:49:18 2010 +0100

    disconnect NewChannels signal once we got all the list channels we care about

 libempathy/empathy-tp-contact-list.c |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)
---
diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index fd2cfaa..9288baa 100644
--- a/libempathy/empathy-tp-contact-list.c
+++ b/libempathy/empathy-tp-contact-list.c
@@ -54,6 +54,8 @@ typedef struct {
 	GHashTable     *add_to_group; /* group name -> GArray of handles */
 
 	EmpathyContactListFlags flags;
+
+	TpProxySignalConnection *new_channels_sig;
 } EmpathyTpContactListPriv;
 
 typedef enum {
@@ -697,6 +699,15 @@ tp_contact_list_finalize (GObject *object)
 	G_OBJECT_CLASS (empathy_tp_contact_list_parent_class)->finalize (object);
 }
 
+static gboolean
+received_all_list_channels (EmpathyTpContactList *self)
+{
+	EmpathyTpContactListPriv *priv = GET_PRIV (self);
+
+	return (priv->stored != NULL && priv->publish != NULL &&
+		priv->subscribe != NULL);
+}
+
 static void
 got_list_channel (EmpathyTpContactList *list,
 		  TpChannel *channel)
@@ -728,6 +739,12 @@ got_list_channel (EmpathyTpContactList *list,
 				  G_CALLBACK (tp_contact_list_subscribe_group_members_changed_cb),
 				  list);
 	}
+
+	if (received_all_list_channels (list) && priv->new_channels_sig != NULL) {
+		/* We don't need to watch NewChannels anymore */
+		tp_proxy_signal_connection_disconnect (priv->new_channels_sig);
+		priv->new_channels_sig = NULL;
+	}
 }
 
 static void
@@ -815,7 +832,8 @@ conn_ready_cb (TpConnection *connection,
 	/* Watch the NewChannels signal so if ensuring list channels fails (for
 	 * example because the server is slow and the D-Bus call timeouts before CM
 	 * fetches the roster), we have a chance to get them later. */
-	tp_cli_connection_interface_requests_connect_to_new_channels (
+	priv->new_channels_sig =
+	  tp_cli_connection_interface_requests_connect_to_new_channels (
 		priv->connection, new_channels_cb, NULL, NULL, G_OBJECT (list), NULL);
 
 	/* Request the 'stored' list. */



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