From c821e81c68acc1daba78899c9c844f916ea2c99e Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 24 Mar 2010 11:49:18 +0100 Subject: disconnect NewChannels signal once we got all the list channels we care about --- libempathy/empathy-tp-contact-list.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'libempathy/empathy-tp-contact-list.c') diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c index fd2cfaa38..9288baa4c 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. */ -- cgit v1.2.3