15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/server_information.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/communicator/login_settings.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/communicator/single_login_attempt.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/xmppengine.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace buzz { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppClient; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppClientSettings; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppTaskParentInterface; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace buzz 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginSettings; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Does the login, keeps it alive (with refreshing cookies and 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reattempting login when disconnected), and figures out what actions 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to take on the various errors that may occur. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Make this observe proxy config changes also. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Login : public net::NetworkChangeNotifier::IPAddressObserver, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::NetworkChangeNotifier::ConnectionTypeObserver, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::NetworkChangeNotifier::DNSObserver, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public SingleLoginAttempt::Delegate { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Delegate { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a connection has been successfully established. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnConnect( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<buzz::XmppTaskParentInterface> base_task) = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when there's no connection to the server but we expect 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it to come back come back eventually. The connection will be 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // retried with exponential backoff. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTransientDisconnection() = 0; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the current login credentials have been rejected. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The connection will still be retried with exponential backoff; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's up to the delegate to stop connecting and/or prompt for 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new credentials. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCredentialsRejected() = 0; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not take ownership of |delegate|, which must not be NULL. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Login(Delegate* delegate, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const buzz::XmppClientSettings& user_settings, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_getter, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ServerList& servers, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool try_ssltcp_first, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& auth_mechanism); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Login(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts connecting (or forces a reconnection if we're backed off). 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartConnection(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The updated settings take effect only the next time when a 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connection is attempted (either via reconnection or a call to 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StartConnection()). 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateXmppSettings(const buzz::XmppClientSettings& user_settings); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkChangeNotifier::IPAddressObserver implementation. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnIPAddressChanged() OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkChangeNotifier::ConnectionTypeObserver implementation. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnConnectionTypeChanged( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkChangeNotifier::DNSObserver implementation. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDNSChanged() OVERRIDE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SingleLoginAttempt::Delegate implementation. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnConnect( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<buzz::XmppTaskParentInterface> base_task) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRedirect(const ServerInformation& redirect_server) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCredentialsRejected() OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSettingsExhausted() OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the various network notifications. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNetworkEvent(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops any existing reconnect timer and sets an initial reconnect 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interval. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetReconnectState(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tries to reconnect in some point in the future. If called 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeatedly, will wait longer and longer until reconnecting. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TryReconnect(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual function (called by |reconnect_timer_|) that does the 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reconnection. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoReconnect(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* const delegate_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginSettings login_settings_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SingleLoginAttempt> single_attempt_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reconnection state. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta reconnect_interval_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<Login> reconnect_timer_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Login); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace notifier 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 132