[empathy/gnome-2-34] Fix some races in the chatroom joining code
- From: Sjoerd Simons <sjoerds src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy/gnome-2-34] Fix some races in the chatroom joining code
- Date: Mon, 21 Mar 2011 09:35:52 +0000 (UTC)
commit bfcad7858e75c99a2cb6fa51a5fc47c473df23dc
Author: Sjoerd Simons <sjoerd simons collabora co uk>
Date: Mon Mar 21 09:27:00 2011 +0000
Fix some races in the chatroom joining code
The auto-reconnection logic for chatrooms was a bit odd. It would for
every chatroom that existed when the account manager was prepared
connect once to status-changed for each account for each chatroom...
Change this such that whenever an account connects, we simply
get the then current list of chatrooms and auto-connect those as needed.
This fixes issues when a chatroom gets removed from the manager and when
the auto-connect options on a chatrooms change.
Conflicts:
src/empathy.c
src/empathy.c | 69 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 38 insertions(+), 31 deletions(-)
---
diff --git a/src/empathy.c b/src/empathy.c
index 325c4d7..96a509d 100644
--- a/src/empathy.c
+++ b/src/empathy.c
@@ -292,19 +292,49 @@ account_manager_ready_cb (GObject *source_object,
}
static void
+account_join_chatrooms (TpAccount *account,
+ EmpathyChatroomManager *chatroom_manager)
+{
+ TpConnection *conn;
+ GList *chatrooms, *p;
+
+ if (tp_account_get_connection_status (account, NULL) !=
+ TP_CONNECTION_STATUS_CONNECTED)
+ return;
+
+ /* If we're connected we should have a connection */
+ conn = tp_account_get_connection (account);
+ g_return_if_fail (conn != NULL);
+
+ chatrooms = empathy_chatroom_manager_get_chatrooms (
+ chatroom_manager, account);
+
+ for (p = chatrooms; p != NULL; p = p->next)
+ {
+ EmpathyChatroom *room = EMPATHY_CHATROOM (p->data);
+
+ if (!empathy_chatroom_get_auto_connect (room))
+ continue;
+
+ empathy_dispatcher_join_muc (account,
+ empathy_chatroom_get_room (room), TP_USER_ACTION_TIME_NOT_USER_ACTION);
+ }
+ g_list_free (chatrooms);
+}
+
+static void
account_status_changed_cb (TpAccount *account,
guint old_status,
guint new_status,
guint reason,
gchar *dbus_error_name,
GHashTable *details,
- EmpathyChatroom *room)
+ EmpathyChatroomManager *manager)
{
if (new_status != TP_CONNECTION_STATUS_CONNECTED)
return;
- empathy_dispatcher_join_muc (account,
- empathy_chatroom_get_room (room), TP_USER_ACTION_TIME_NOT_USER_ACTION);
+ account_join_chatrooms (account, manager);
}
static void
@@ -329,37 +359,14 @@ account_manager_chatroom_ready_cb (GObject *source_object,
for (l = accounts; l != NULL; l = g_list_next (l))
{
TpAccount *account = TP_ACCOUNT (l->data);
- TpConnection *conn;
- GList *chatrooms, *p;
-
- conn = tp_account_get_connection (account);
- chatrooms = empathy_chatroom_manager_get_chatrooms (
- chatroom_manager, account);
+ /* Try to join all rooms if we're connected */
+ account_join_chatrooms (account, chatroom_manager);
- for (p = chatrooms; p != NULL; p = p->next)
- {
- EmpathyChatroom *room = EMPATHY_CHATROOM (p->data);
-
- if (!empathy_chatroom_get_auto_connect (room))
- continue;
-
- if (conn == NULL)
- {
- g_signal_connect (G_OBJECT (account), "status-changed",
- G_CALLBACK (account_status_changed_cb), room);
- }
- else
- {
- empathy_dispatcher_join_muc (account,
- empathy_chatroom_get_room (room),
- TP_USER_ACTION_TIME_NOT_USER_ACTION);
- }
- }
-
- g_list_free (chatrooms);
+ /* And/or join them on (re)connection */
+ tp_g_signal_connect_object (account, "status-changed",
+ G_CALLBACK (account_status_changed_cb), chatroom_manager, 0);
}
-
g_list_free (accounts);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]