Index: jingle/notifier/communicator/login.cc |
diff --git a/jingle/notifier/communicator/login.cc b/jingle/notifier/communicator/login.cc |
index 886ea848c2ed125c00107c5797548034a19fe612..db4813b433b324ce37980abcf73122c7d3e2a4ab 100644 |
--- a/jingle/notifier/communicator/login.cc |
+++ b/jingle/notifier/communicator/login.cc |
@@ -27,6 +27,8 @@ namespace notifier { |
// Redirect valid for 5 minutes. |
static const int kRedirectTimeoutMinutes = 5; |
+Login::Delegate::~Delegate() {} |
+ |
Login::Login(Delegate* delegate, |
const buzz::XmppClientSettings& user_settings, |
const scoped_refptr<net::URLRequestContextGetter>& |
@@ -57,19 +59,31 @@ void Login::UpdateXmppSettings(const buzz::XmppClientSettings& user_settings) { |
login_settings_.set_user_settings(user_settings); |
} |
+// In the code below, we assume that calling a delegate method may end |
+// up in ourselves being deleted, so we always call it last. |
+// |
+// TODO(akalin): Add unit tests to enforce the behavior above. |
+ |
void Login::OnConnect(base::WeakPtr<buzz::XmppTaskParentInterface> base_task) { |
ResetReconnectState(); |
delegate_->OnConnect(base_task); |
} |
-void Login::OnNeedReconnect() { |
- TryReconnect(); |
-} |
- |
void Login::OnRedirect(const ServerInformation& redirect_server) { |
login_settings_.SetRedirectServer(redirect_server); |
// Drop the current connection, and start the login process again. |
StartConnection(); |
+ delegate_->OnTransientDisconnection(); |
+} |
+ |
+void Login::OnCredentialsRejected() { |
+ TryReconnect(); |
+ delegate_->OnCredentialsRejected(); |
+} |
+ |
+void Login::OnSettingsExhausted() { |
+ TryReconnect(); |
+ delegate_->OnTransientDisconnection(); |
} |
void Login::OnIPAddressChanged() { |
@@ -78,6 +92,7 @@ void Login::OnIPAddressChanged() { |
// avoid spikey behavior on network hiccups). |
reconnect_interval_ = base::TimeDelta::FromSeconds(base::RandInt(1, 9)); |
TryReconnect(); |
+ delegate_->OnTransientDisconnection(); |
} |
void Login::ResetReconnectState() { |
@@ -94,7 +109,6 @@ void Login::TryReconnect() { |
<< reconnect_interval_.InSeconds() << " seconds"; |
reconnect_timer_.Start( |
FROM_HERE, reconnect_interval_, this, &Login::DoReconnect); |
- delegate_->OnDisconnect(); |
} |
void Login::DoReconnect() { |