Index: google_apis/gcm/engine/connection_factory_impl.h |
diff --git a/google_apis/gcm/engine/connection_factory_impl.h b/google_apis/gcm/engine/connection_factory_impl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e4052150e1b0ae5f45781d34d347a48102e405e |
--- /dev/null |
+++ b/google_apis/gcm/engine/connection_factory_impl.h |
@@ -0,0 +1,99 @@ |
+// Copyright (c) 2013 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. |
+ |
+#ifndef GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_IMPL_H_ |
+#define GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_IMPL_H_ |
+ |
+#include "google_apis/gcm/engine/connection_factory.h" |
+ |
+#include "base/memory/weak_ptr.h" |
+#include "google_apis/gcm/protocol/mcs.pb.h" |
+#include "net/base/backoff_entry.h" |
+#include "net/base/network_change_notifier.h" |
+#include "net/socket/client_socket_handle.h" |
+#include "url/gurl.h" |
+ |
+namespace net { |
+class HttpNetworkSession; |
+class NetLog; |
+} |
+ |
+namespace gcm { |
+ |
+class ConnectionHandlerImpl; |
+ |
+class GCM_EXPORT ConnectionFactoryImpl : |
+ public ConnectionFactory, |
+ public net::NetworkChangeNotifier::ConnectionTypeObserver, |
+ public net::NetworkChangeNotifier::IPAddressObserver { |
+ public: |
+ ConnectionFactoryImpl( |
+ const GURL& mcs_endpoint, |
+ scoped_refptr<net::HttpNetworkSession> network_session, |
+ net::NetLog* net_log); |
+ virtual ~ConnectionFactoryImpl(); |
+ |
+ // ConnectionFactory implementation. |
+ virtual ConnectionHandler* BuildConnectionHandler( |
+ const ConnectionHandler::ProtoReceivedCallback& read_callback, |
+ const ConnectionHandler::ProtoSentCallback& write_callback) OVERRIDE; |
+ virtual void Connect(const mcs_proto::LoginRequest& login_request) OVERRIDE; |
+ virtual bool IsEndpointReachable() const OVERRIDE; |
+ virtual base::TimeTicks NextRetryAttempt() const OVERRIDE; |
+ |
+ // NetworkChangeNotifier observer implementations. |
+ virtual void OnConnectionTypeChanged( |
+ net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; |
+ virtual void OnIPAddressChanged() OVERRIDE; |
+ |
+ protected: |
+ // Implementation of Connect(..). If not in backoff, uses |login_request_| |
+ // in attempting a connection/handshake. On connection/handshake failure, goes |
+ // into backoff. |
+ // Virtual for testing. |
+ virtual void ConnectImpl(); |
+ |
+ // Helper method for initalizing the connection hander. |
+ // Virtual for testing. |
+ virtual void InitHandler(); |
+ |
+ // Helper method for creating a backoff entry. |
+ // Virtual for testing. |
+ virtual scoped_ptr<net::BackoffEntry> CreateBackoffEntry( |
+ const net::BackoffEntry::Policy* const policy); |
+ |
+ // Callback for Socket connection completion. |
+ void OnConnectDone(int result); |
+ |
+ private: |
+ // ConnectionHandler callback for connection issues. |
+ void ConnectionHandlerCallback(int result); |
+ |
+ // The MCS endpoint to make connections to. |
+ const GURL mcs_endpoint_; |
+ |
+ // ---- net:: components for establishing connections. ---- |
+ // Network session for creating new connections. |
+ const scoped_refptr<net::HttpNetworkSession> network_session_; |
+ // Net log to use in connection attempts. |
+ net::NetLog* const net_log_; |
+ // The handle to the socket for the current connection, if one exists. |
+ net::ClientSocketHandle socket_handle_; |
+ // Connection attempt backoff policy. |
+ scoped_ptr<net::BackoffEntry> backoff_entry_; |
+ |
+ // The current connection handler, if one exists. |
+ scoped_ptr<ConnectionHandlerImpl> connection_handler_; |
+ |
+ // The current login request if a connection attempt is in progress/pending. |
+ mcs_proto::LoginRequest login_request_; |
+ |
+ base::WeakPtrFactory<ConnectionFactoryImpl> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ConnectionFactoryImpl); |
+}; |
+ |
+} // namespace gcm |
+ |
+#endif // GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_IMPL_H_ |