changeset 30696:88a047f92c39

Add a timeout which forces the login process to complete. This won't fix the underlying problem of a failed FQY, but at least it will complete the connection and show people online. Refs #10023. Refs #12210.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 17 Jul 2010 23:10:39 +0000
parents 3ff6c193efee
children a37aa0ddfc0f
files libpurple/protocols/msn/notification.c libpurple/protocols/msn/session.c libpurple/protocols/msn/session.h
diffstat 3 files changed, 42 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/msn/notification.c	Sat Jul 17 20:13:29 2010 +0000
+++ b/libpurple/protocols/msn/notification.c	Sat Jul 17 23:10:39 2010 +0000
@@ -674,6 +674,8 @@
 	xmlnode_free(adl_node);
 	xmlnode_free(fqy_node);
 
+	msn_session_activate_login_timeout(session);
+
 	pc = purple_account_get_connection(session->account);
 	display_name = purple_connection_get_display_name(pc);
 	if (display_name
--- a/libpurple/protocols/msn/session.c	Sat Jul 17 20:13:29 2010 +0000
+++ b/libpurple/protocols/msn/session.c	Sat Jul 17 23:10:39 2010 +0000
@@ -131,6 +131,11 @@
 	if (!session->connected)
 		return;
 
+	if (session->login_timeout) {
+		purple_timeout_remove(session->login_timeout);
+		session->login_timeout = 0;
+	}
+
 	session->connected = FALSE;
 
 	while (session->switches != NULL)
@@ -258,6 +263,28 @@
 	return swboard;
 }
 
+static gboolean
+msn_login_timeout_cb(gpointer data)
+{
+	MsnSession *session = data;
+	/* This forces the login process to finish, even though we haven't heard
+	   a response for our FQY requests yet. We'll at least end up online to the
+	   people we've already added. The rest will follow later. */
+	msn_session_finish_login(session);
+	session->login_timeout = 0;
+	return FALSE;
+}
+
+void
+msn_session_activate_login_timeout(MsnSession *session)
+{
+	if (!session->logged_in) {
+		session->login_timeout =
+			purple_timeout_add_seconds(MSN_LOGIN_FQY_TIMEOUT,
+			                           msn_login_timeout_cb, session);
+	}
+}
+
 static void
 msn_session_sync_users(MsnSession *session)
 {
--- a/libpurple/protocols/msn/session.h	Sat Jul 17 20:13:29 2010 +0000
+++ b/libpurple/protocols/msn/session.h	Sat Jul 17 23:10:39 2010 +0000
@@ -59,6 +59,8 @@
 
 #define MSN_LOGIN_STEPS MSN_LOGIN_STEP_END
 
+#define MSN_LOGIN_FQY_TIMEOUT 30
+
 #include "group.h"
 #include "httpconn.h"
 #include "nexus.h"
@@ -83,6 +85,7 @@
 	gboolean connected;
 	gboolean logged_in; /**< A temporal flag to ignore local buddy list adds. */
 	int      adl_fqy; /**< A count of ADL/FQY so status is only changed once. */
+	guint    login_timeout; /**< Timeout to force status change if ADL/FQY fail. */
 	gboolean destroying; /**< A flag that states if the session is being destroyed. */
 	gboolean http_method;
 
@@ -213,7 +216,16 @@
 						   const char *info);
 
 /**
- * Sets the current step in the login proccess.
+ * Starts a timeout to initiate finishing login. Sometimes the server ignores
+ * our FQY requests, so this forces ourselves online eventually.
+ *
+ * @param session The MSN session.
+ */
+void
+msn_session_activate_login_timeout(MsnSession *session);
+
+/**
+ * Sets the current step in the login process.
  *
  * @param session The MSN session.
  * @param step The current step.