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_SINGLE_LOGIN_ATTEMPT_H_ 6 #define JINGLE_NOTIFIER_COMMUNICATOR_SINGLE_LOGIN_ATTEMPT_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "jingle/notifier/base/xmpp_connection.h" 11 #include "jingle/notifier/communicator/connection_settings.h" 12 #include "jingle/notifier/communicator/login_settings.h" 13 #include "talk/xmpp/xmppengine.h" 14 15 namespace buzz { 16 class XmppTaskParentInterface; 17 } // namespace buzz 18 19 namespace notifier { 20 21 struct ServerInformation; 22 23 // Handles all of the aspects of a single login attempt. By 24 // containing this within one class, when another login attempt is 25 // made, this class can be destroyed to immediately stop the previous 26 // login attempt. 27 class SingleLoginAttempt : public XmppConnection::Delegate { 28 public: 29 // At most one delegate method will be called, depending on the 30 // result of the login attempt. After the delegate method is 31 // called, this class won't do anything anymore until it is 32 // destroyed, at which point it will disconnect if necessary. 33 class Delegate { 34 public: 35 // Called when the login attempt is successful. 36 virtual void OnConnect( 37 base::WeakPtr<buzz::XmppTaskParentInterface> base_task) = 0; 38 39 // Called when the server responds with a redirect. A new login 40 // attempt should be made to the given redirect server. 41 virtual void OnRedirect(const ServerInformation& redirect_server) = 0; 42 43 // Called when a server rejects the client's login credentials. A 44 // new login attempt should be made once the client provides new 45 // credentials. 46 virtual void OnCredentialsRejected() = 0; 47 48 // Called when no server could be logged into for reasons other 49 // than redirection or rejected credentials. A new login attempt 50 // may be created, but it should be done with exponential backoff. 51 virtual void OnSettingsExhausted() = 0; 52 53 protected: 54 virtual ~Delegate(); 55 }; 56 57 // Does not take ownership of |delegate|, which must not be NULL. 58 SingleLoginAttempt(const LoginSettings& login_settings, Delegate* delegate); 59 60 virtual ~SingleLoginAttempt(); 61 62 // XmppConnection::Delegate implementation. 63 virtual void OnConnect( 64 base::WeakPtr<buzz::XmppTaskParentInterface> parent) OVERRIDE; 65 virtual void OnError(buzz::XmppEngine::Error error, 66 int error_subcode, 67 const buzz::XmlElement* stream_error) OVERRIDE; 68 69 private: 70 void TryConnect(const ConnectionSettings& new_settings); 71 72 const LoginSettings login_settings_; 73 Delegate* const delegate_; 74 const ConnectionSettingsList settings_list_; 75 ConnectionSettingsList::const_iterator current_settings_; 76 scoped_ptr<XmppConnection> xmpp_connection_; 77 78 DISALLOW_COPY_AND_ASSIGN(SingleLoginAttempt); 79 }; 80 81 } // namespace notifier 82 83 #endif // JINGLE_NOTIFIER_COMMUNICATOR_SINGLE_LOGIN_ATTEMPT_H_ 84