summaryrefslogtreecommitdiff
path: root/libpurple/protocols/msn/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/protocols/msn/session.c')
-rw-r--r--libpurple/protocols/msn/session.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/libpurple/protocols/msn/session.c b/libpurple/protocols/msn/session.c
index 1517717fdd..0b763caa1c 100644
--- a/libpurple/protocols/msn/session.c
+++ b/libpurple/protocols/msn/session.c
@@ -57,6 +57,11 @@ msn_session_destroy(MsnSession *session)
session->destroying = TRUE;
+ while (session->url_datas) {
+ purple_util_fetch_url_cancel(session->url_datas->data);
+ session->url_datas = g_slist_delete_link(session->url_datas, session->url_datas);
+ }
+
if (session->connected)
msn_session_disconnect(session);
@@ -131,6 +136,11 @@ msn_session_disconnect(MsnSession *session)
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 +268,28 @@ msn_session_get_swboard(MsnSession *session, const char *username,
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->connected) {
+ session->login_timeout =
+ purple_timeout_add_seconds(MSN_LOGIN_FQY_TIMEOUT,
+ msn_login_timeout_cb, session);
+ }
+}
+
static void
msn_session_sync_users(MsnSession *session)
{
@@ -362,6 +394,9 @@ msn_session_set_error(MsnSession *session, MsnErrorType error,
msg = g_strdup_printf(_("Unable to authenticate: %s"),
(info == NULL ) ?
_("Unknown error") : info);
+ /* Clear the password if it isn't being saved */
+ if (!purple_account_get_remember_password(session->account))
+ purple_account_set_password(session->account, NULL);
break;
case MSN_ERROR_BAD_BLIST:
reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
@@ -407,7 +442,7 @@ msn_session_set_login_step(MsnSession *session, MsnLoginStep step)
/* Prevent the connection progress going backwards, eg. if we get
* transferred several times during login */
- if (session->login_step > step)
+ if (session->login_step >= step)
return;
/* If we're already logged in, we're probably here because of a