[empathy] chat: wait that connection is ready before re-requesting the channel (#603976)



commit ce76a397628746402c494ee8aec6e14a7d8322c7
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Mon Dec 7 15:40:18 2009 +0000

    chat: wait that connection is ready before re-requesting the channel (#603976)

 libempathy-gtk/empathy-chat.c |   69 ++++++++++++++++++++++++++--------------
 1 files changed, 45 insertions(+), 24 deletions(-)
---
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 611f2eb..c66f92d 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -206,6 +206,43 @@ chat_connect_channel_reconnected (EmpathyDispatchOperation *dispatch,
 }
 
 static void
+reconnected_connection_ready_cb (TpConnection *connection,
+			const GError *error,
+			gpointer user_data)
+{
+	EmpathyChat *chat = EMPATHY_CHAT (user_data);
+	EmpathyChatPriv *priv = GET_PRIV (chat);
+
+	if (error != NULL) {
+		DEBUG ("connection is not ready: %s", error->message);
+		goto out;
+	}
+
+	DEBUG ("Account reconnected, request a new Text channel");
+
+	switch (priv->handle_type) {
+		case TP_HANDLE_TYPE_CONTACT:
+			empathy_dispatcher_chat_with_contact_id (
+				connection, priv->id,
+				chat_connect_channel_reconnected,
+				chat);
+			break;
+		case TP_HANDLE_TYPE_ROOM:
+			empathy_dispatcher_join_muc (connection,
+				priv->id,
+				chat_connect_channel_reconnected,
+				chat);
+			break;
+		default:
+			g_assert_not_reached ();
+			break;
+	}
+
+out:
+	g_object_unref (chat);
+}
+
+static void
 chat_new_connection_cb (TpAccount   *account,
 			guint        old_status,
 			guint        new_status,
@@ -222,30 +259,14 @@ chat_new_connection_cb (TpAccount   *account,
 
 	connection = tp_account_get_connection (account);
 
-	if (!priv->tp_chat && account == priv->account &&
-	    priv->handle_type != TP_HANDLE_TYPE_NONE &&
-	    !EMP_STR_EMPTY (priv->id)) {
-
-		DEBUG ("Account reconnected, request a new Text channel");
+	if (priv->tp_chat != NULL || account != priv->account ||
+	    priv->handle_type == TP_HANDLE_TYPE_NONE ||
+	    EMP_STR_EMPTY (priv->id))
+		return;
 
-		switch (priv->handle_type) {
-			case TP_HANDLE_TYPE_CONTACT:
-				empathy_dispatcher_chat_with_contact_id (
-					connection, priv->id,
-					chat_connect_channel_reconnected,
-					chat);
-				break;
-			case TP_HANDLE_TYPE_ROOM:
-				empathy_dispatcher_join_muc (connection,
-					priv->id,
-					chat_connect_channel_reconnected,
-					chat);
-				break;
-			default:
-				g_assert_not_reached ();
-				break;
-		}
-	}
+	g_object_ref (chat);
+	tp_connection_call_when_ready (connection, reconnected_connection_ready_cb,
+				   chat);
 }
 
 static void



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