blob: 3cff48299b63b94c1ff43756bb6ce897a10c1272 [file] [log] [blame]
// Copyright 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_H_
#define GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_H_
#include "base/time/time.h"
#include "google_apis/gcm/base/gcm_export.h"
#include "google_apis/gcm/engine/connection_handler.h"
namespace mcs_proto {
class LoginRequest;
}
namespace gcm {
// 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:
typedef base::Callback<void(mcs_proto::LoginRequest* login_request)>
BuildLoginRequestCallback;
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;
// 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;
};
} // namespace gcm
#endif // GOOGLE_APIS_GCM_ENGINE_CONNECTION_FACTORY_H_