| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 | // | 
 | // A class that manages a connection to an XMPP server. | 
 |  | 
 | #ifndef JINGLE_NOTIFIER_BASE_XMPP_CONNECTION_H_ | 
 | #define JINGLE_NOTIFIER_BASE_XMPP_CONNECTION_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/gtest_prod_util.h" | 
 | #include "base/macros.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/memory/weak_ptr.h" | 
 | #include "base/sequence_checker.h" | 
 | #include "jingle/glue/network_service_config.h" | 
 | #include "net/traffic_annotation/network_traffic_annotation.h" | 
 | #include "third_party/libjingle_xmpp/xmpp/xmppengine.h" | 
 | #include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h" | 
 |  | 
 | namespace jingle_xmpp { | 
 | class PreXmppAuth; | 
 | class XmlElement; | 
 | class XmppClientSettings; | 
 | class XmppTaskParentInterface; | 
 | }  // namespace jingle_xmpp | 
 |  | 
 | namespace jingle_glue { | 
 | class TaskPump; | 
 | }  // namespace jingle_glue | 
 |  | 
 | namespace notifier { | 
 |  | 
 | class WeakXmppClient; | 
 |  | 
 | class XmppConnection : public sigslot::has_slots<> { | 
 |  public: | 
 |   class Delegate { | 
 |    public: | 
 |     // Called (at most once) when a connection has been established. | 
 |     // |base_task| can be used by the client as the parent of any Task | 
 |     // it creates as long as it is valid (i.e., non-NULL). | 
 |     virtual void OnConnect( | 
 |         base::WeakPtr<jingle_xmpp::XmppTaskParentInterface> base_task) = 0; | 
 |  | 
 |     // Called if an error has occurred (either before or after a call | 
 |     // to OnConnect()).  No calls to the delegate will be made after | 
 |     // this call.  Invalidates any weak pointers passed to the client | 
 |     // by OnConnect(). | 
 |     // | 
 |     // |error| is the code for the raised error.  |subcode| is an | 
 |     // error-dependent subcode (0 if not applicable).  |stream_error| | 
 |     // is non-NULL iff |error| == ERROR_STREAM.  |stream_error| is | 
 |     // valid only for the lifetime of this function. | 
 |     // | 
 |     // Ideally, |error| would always be set to something that is not | 
 |     // ERROR_NONE, but due to inconsistent error-handling this doesn't | 
 |     // always happen. | 
 |     virtual void OnError(jingle_xmpp::XmppEngine::Error error, int subcode, | 
 |                          const jingle_xmpp::XmlElement* stream_error) = 0; | 
 |  | 
 |    protected: | 
 |     virtual ~Delegate(); | 
 |   }; | 
 |  | 
 |   // Does not take ownership of |delegate|, which must not be | 
 |   // NULL.  Takes ownership of |pre_xmpp_auth|, which may be NULL. | 
 |   // | 
 |   // TODO(akalin): Avoid the need for |pre_xmpp_auth|. | 
 |   XmppConnection(const jingle_xmpp::XmppClientSettings& xmpp_client_settings, | 
 |                  jingle_glue::GetProxyResolvingSocketFactoryCallback | 
 |                      get_socket_factory_callback, | 
 |                  Delegate* delegate, | 
 |                  jingle_xmpp::PreXmppAuth* pre_xmpp_auth, | 
 |                  const net::NetworkTrafficAnnotationTag& traffic_annotation); | 
 |  | 
 |   // Invalidates any weak pointers passed to the delegate by | 
 |   // OnConnect(), but does not trigger a call to the delegate's | 
 |   // OnError() function. | 
 |   ~XmppConnection() override; | 
 |  | 
 |  private: | 
 |   FRIEND_TEST_ALL_PREFIXES(XmppConnectionTest, RaisedError); | 
 |   FRIEND_TEST_ALL_PREFIXES(XmppConnectionTest, Connect); | 
 |   FRIEND_TEST_ALL_PREFIXES(XmppConnectionTest, MultipleConnect); | 
 |   FRIEND_TEST_ALL_PREFIXES(XmppConnectionTest, ConnectThenError); | 
 |   FRIEND_TEST_ALL_PREFIXES(XmppConnectionTest, | 
 |                            TasksDontRunAfterXmppConnectionDestructor); | 
 |  | 
 |   void OnStateChange(jingle_xmpp::XmppEngine::State state); | 
 |   void OnInputLog(const char* data, int len); | 
 |   void OnOutputLog(const char* data, int len); | 
 |  | 
 |   void ClearClient(); | 
 |  | 
 |   std::unique_ptr<jingle_glue::TaskPump> task_pump_; | 
 |   base::WeakPtr<WeakXmppClient> weak_xmpp_client_; | 
 |   bool on_connect_called_; | 
 |   Delegate* delegate_; | 
 |  | 
 |   SEQUENCE_CHECKER(sequence_checker_); | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(XmppConnection); | 
 | }; | 
 |  | 
 | }  // namespace notifier | 
 |  | 
 | #endif  // JINGLE_NOTIFIER_BASE_XMPP_CONNECTION_H_ |