blob: 927ca89d4a107ea06b9397db8032d26f1452c119 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// 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_H_
#define GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_H_
#include <string>
#include "base/functional/callback_forward.h"
#include "base/time/time.h"
#include "google_apis/gcm/base/gcm_export.h"
#include "google_apis/gcm/engine/connection_handler.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "services/network/public/mojom/proxy_resolving_socket.mojom.h"
class GURL;
namespace net {
class IPEndPoint;
}
namespace mcs_proto {
class LoginRequest;
}
namespace gcm {
using GetProxyResolvingFactoryCallback = base::RepeatingCallback<void(
mojo::PendingReceiver<network::mojom::ProxyResolvingSocketFactory>)>;
// Factory for creating a ConnectionHandler and maintaining its connection.
// The factory retains ownership of the ConnectionHandler and will enforce
// backoff policies when attempting connections.
class GCM_EXPORT ConnectionFactory {
public:
using BuildLoginRequestCallback =
base::RepeatingCallback<void(mcs_proto::LoginRequest* login_request)>;
// Reasons for triggering a connection reset. Note that these enums are
// consumed by a histogram, so ordering should not be modified.
enum ConnectionResetReason {
LOGIN_FAILURE, // Login response included an error.
CLOSE_COMMAND, // Received a close command.
HEARTBEAT_FAILURE, // Heartbeat was not acknowledged in time.
SOCKET_FAILURE, // net::Socket error.
NETWORK_CHANGE, // NetworkChangeNotifier notified of a network
// change.
NEW_HEARTBEAT_INTERVAL, // New heartbeat interval was set.
// Count of total number of connection reset reasons. All new reset reasons
// should be added above this line.
CONNECTION_RESET_COUNT,
};
// Listener interface to be notified of endpoint connection events.
class GCM_EXPORT ConnectionListener {
public:
ConnectionListener();
virtual ~ConnectionListener();
// Notifies the listener that GCM has performed a handshake with and is now
// actively connected to |current_server|. |ip_endpoint| is the resolved
// ip address/port through which the connection is being made.
virtual void OnConnected(const GURL& current_server,
const net::IPEndPoint& ip_endpoint) = 0;
// Notifies the listener that the connection has been interrupted.
virtual void OnDisconnected() = 0;
};
ConnectionFactory();
virtual ~ConnectionFactory();
// Initialize the factory, creating a connection handler with a disconnected
// socket. Should only be called once.
// Upon connection:
// |read_callback| will be invoked with the contents of any received protobuf
// message.
// |write_callback| will be invoked anytime a message has been successfully
// sent. Note: this just means the data was sent to the wire, not that the
// other end received it.
virtual void Initialize(
const BuildLoginRequestCallback& request_builder,
const ConnectionHandler::ProtoReceivedCallback& read_callback,
const ConnectionHandler::ProtoSentCallback& write_callback) = 0;
// Get the connection handler for this factory. Initialize(..) must have
// been called.
virtual ConnectionHandler* GetConnectionHandler() const = 0;
// Opens a new connection and initiates login handshake. Upon completion of
// the handshake, |read_callback| will be invoked with a valid
// mcs_proto::LoginResponse.
// Note: Initialize must have already been invoked.
virtual void Connect() = 0;
// Whether or not the MCS endpoint is currently reachable with an active
// connection.
virtual bool IsEndpointReachable() const = 0;
// Returns a debug string describing the connection state.
virtual std::string GetConnectionStateString() const = 0;
// If in backoff, the time at which the next retry will be made. Otherwise,
// a null time, indicating either no attempt to connect has been made or no
// backoff is in progress.
virtual base::TimeTicks NextRetryAttempt() const = 0;
// Manually reset the connection. This can occur if an application specific
// event forced a reset (e.g. server sends a close connection response).
// If the last connection was made within kConnectionResetWindowSecs, the old
// backoff is restored, else a new backoff kicks off.
virtual void SignalConnectionReset(ConnectionResetReason reason) = 0;
// Sets the current connection listener. Only one listener is supported at a
// time, and the listener must either outlive the connection factory or
// call SetConnectionListener(NULL) upon destruction.
virtual void SetConnectionListener(ConnectionListener* listener) = 0;
};
} // namespace gcm
#endif // GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_H_