1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 6 #define JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 7 8 #include <string> 9 10 #include "base/compiler_specific.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/weak_ptr.h" 14 #include "base/time/time.h" 15 #include "base/timer/timer.h" 16 #include "jingle/notifier/base/server_information.h" 17 #include "jingle/notifier/communicator/login_settings.h" 18 #include "jingle/notifier/communicator/single_login_attempt.h" 19 #include "net/base/network_change_notifier.h" 20 #include "talk/xmpp/xmppengine.h" 21 22 namespace buzz { 23 class XmppClient; 24 class XmppClientSettings; 25 class XmppTaskParentInterface; 26 } // namespace buzz 27 28 namespace net { 29 class URLRequestContextGetter; 30 } // namespace net 31 32 namespace notifier { 33 34 class LoginSettings; 35 36 // Does the login, keeps it alive (with refreshing cookies and 37 // reattempting login when disconnected), and figures out what actions 38 // to take on the various errors that may occur. 39 // 40 // TODO(akalin): Make this observe proxy config changes also. 41 class Login : public net::NetworkChangeNotifier::IPAddressObserver, 42 public net::NetworkChangeNotifier::ConnectionTypeObserver, 43 public net::NetworkChangeNotifier::DNSObserver, 44 public SingleLoginAttempt::Delegate { 45 public: 46 class Delegate { 47 public: 48 // Called when a connection has been successfully established. 49 virtual void OnConnect( 50 base::WeakPtr<buzz::XmppTaskParentInterface> base_task) = 0; 51 52 // Called when there's no connection to the server but we expect 53 // it to come back come back eventually. The connection will be 54 // retried with exponential backoff. 55 virtual void OnTransientDisconnection() = 0; 56 57 // Called when the current login credentials have been rejected. 58 // The connection will still be retried with exponential backoff; 59 // it's up to the delegate to stop connecting and/or prompt for 60 // new credentials. 61 virtual void OnCredentialsRejected() = 0; 62 63 protected: 64 virtual ~Delegate(); 65 }; 66 67 // Does not take ownership of |delegate|, which must not be NULL. 68 Login(Delegate* delegate, 69 const buzz::XmppClientSettings& user_settings, 70 const scoped_refptr<net::URLRequestContextGetter>& 71 request_context_getter, 72 const ServerList& servers, 73 bool try_ssltcp_first, 74 const std::string& auth_mechanism); 75 virtual ~Login(); 76 77 // Starts connecting (or forces a reconnection if we're backed off). 78 void StartConnection(); 79 80 // The updated settings take effect only the next time when a 81 // connection is attempted (either via reconnection or a call to 82 // StartConnection()). 83 void UpdateXmppSettings(const buzz::XmppClientSettings& user_settings); 84 85 // net::NetworkChangeNotifier::IPAddressObserver implementation. 86 virtual void OnIPAddressChanged() OVERRIDE; 87 88 // net::NetworkChangeNotifier::ConnectionTypeObserver implementation. 89 virtual void OnConnectionTypeChanged( 90 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 91 92 // net::NetworkChangeNotifier::DNSObserver implementation. 93 virtual void OnDNSChanged() OVERRIDE; 94 95 // SingleLoginAttempt::Delegate implementation. 96 virtual void OnConnect( 97 base::WeakPtr<buzz::XmppTaskParentInterface> base_task) OVERRIDE; 98 virtual void OnRedirect(const ServerInformation& redirect_server) OVERRIDE; 99 virtual void OnCredentialsRejected() OVERRIDE; 100 virtual void OnSettingsExhausted() OVERRIDE; 101 102 private: 103 // Called by the various network notifications. 104 void OnNetworkEvent(); 105 106 // Stops any existing reconnect timer and sets an initial reconnect 107 // interval. 108 void ResetReconnectState(); 109 110 // Tries to reconnect in some point in the future. If called 111 // repeatedly, will wait longer and longer until reconnecting. 112 void TryReconnect(); 113 114 // The actual function (called by |reconnect_timer_|) that does the 115 // reconnection. 116 void DoReconnect(); 117 118 Delegate* const delegate_; 119 LoginSettings login_settings_; 120 scoped_ptr<SingleLoginAttempt> single_attempt_; 121 122 // reconnection state. 123 base::TimeDelta reconnect_interval_; 124 base::OneShotTimer<Login> reconnect_timer_; 125 126 DISALLOW_COPY_AND_ASSIGN(Login); 127 }; 128 129 } // namespace notifier 130 131 #endif // JINGLE_NOTIFIER_COMMUNICATOR_LOGIN_H_ 132