blob: c0d2005c288c1cb5bb436f782a373a559c8c6c62 [file] [log] [blame]
// Copyright 2021 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 COMPONENTS_CAST_CHANNEL_LIBCAST_SOCKET_SERVICE_H_
#define COMPONENTS_CAST_CHANNEL_LIBCAST_SOCKET_SERVICE_H_
#include <map>
#include <memory>
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "base/single_thread_task_runner.h"
#include "components/cast_channel/cast_socket.h"
#include "components/cast_channel/cast_socket_service.h"
#include "components/openscreen_platform/task_runner.h"
#include "third_party/openscreen/src/cast/common/public/cast_socket.h"
#include "third_party/openscreen/src/cast/sender/public/sender_socket_factory.h"
#include "third_party/openscreen/src/platform/api/tls_connection_factory.h"
namespace cast_channel {
using LibcastSocket = openscreen::cast::CastSocket;
class CastSocketWrapper;
class LibcastSocketService final
: public CastSocketService,
public openscreen::cast::CastSocket::Client,
public openscreen::cast::SenderSocketFactory::Client {
public:
using CastSocketService::NetworkContextGetter;
~LibcastSocketService() override;
// CastSocketService overrides.
std::unique_ptr<CastSocket> RemoveSocket(int channel_id) override;
CastSocket* GetSocket(int channel_id) const override;
CastSocket* GetSocket(const net::IPEndPoint& ip_endpoint) const override;
void OpenSocket(NetworkContextGetter network_context_getter,
const CastSocketOpenParams& open_params,
CastSocket::OnOpenCallback open_cb) override;
void AddObserver(CastSocket::Observer* observer) override;
void RemoveObserver(CastSocket::Observer* observer) override;
// openscreen::cast::CastSocket::Client overrides.
void OnError(LibcastSocket* socket, openscreen::Error error) override;
void OnMessage(LibcastSocket* socket,
::cast::channel::CastMessage message) override;
// openscreen::cast::SenderSocketFactory::Client overrides.
void OnConnected(openscreen::cast::SenderSocketFactory* factory,
const openscreen::IPEndpoint& endpoint,
std::unique_ptr<LibcastSocket> socket) override;
void OnError(openscreen::cast::SenderSocketFactory* factory,
const openscreen::IPEndpoint& endpoint,
openscreen::Error error) override;
void SetLibcastSocketForTest(std::unique_ptr<LibcastSocket> socket_for_test) {
libcast_socket_for_test_ = std::move(socket_for_test);
}
private:
friend class CastSocketService;
friend class LibcastSocketServiceTest;
struct ConnectTimer {
ConnectTimer(std::unique_ptr<base::CancelableOnceClosure> callback,
std::unique_ptr<base::OneShotTimer> timer);
ConnectTimer(ConnectTimer&&);
~ConnectTimer();
ConnectTimer& operator=(ConnectTimer&&);
std::unique_ptr<base::CancelableOnceClosure> callback;
std::unique_ptr<base::OneShotTimer> timer;
};
struct SavedOpenParams {
base::TimeDelta ping_interval;
base::TimeDelta liveness_timeout;
};
LibcastSocketService();
bool EndpointPending(const net::IPEndPoint& ip_endpoint) const;
void OnErrorSocketIOThread(LibcastSocket* socket, openscreen::Error error);
void OnMessageIOThread(LibcastSocket* socket,
::cast::channel::CastMessage message);
void OnConnectedIOThread(openscreen::cast::SenderSocketFactory* factory,
const openscreen::IPEndpoint& endpoint,
std::unique_ptr<LibcastSocket> socket);
void OnErrorIOThread(openscreen::cast::SenderSocketFactory* factory,
const openscreen::IPEndpoint& endpoint,
openscreen::Error error);
void OnErrorBounce(LibcastSocket* socket, ChannelError error);
// Used to generate CastSocket IDs on error, since the socket factory doesn't
// provide us one in that case.
static int last_channel_id_;
// List of socket observers.
base::ObserverList<CastSocket::Observer>::Unchecked observers_;
openscreen_platform::TaskRunner openscreen_task_runner_;
openscreen::cast::SenderSocketFactory socket_factory_;
std::unique_ptr<openscreen::TlsConnectionFactory> tls_factory_;
std::map<int, std::unique_ptr<CastSocketWrapper>> sockets_;
std::map<openscreen::IPEndpoint, int> socket_endpoints_;
// Data for pending connections.
std::map<openscreen::IPEndpoint, ConnectTimer> pending_endpoints_;
std::map<openscreen::IPEndpoint, std::vector<CastSocket::OnOpenCallback>>
open_callbacks_;
std::map<openscreen::IPEndpoint, SavedOpenParams> open_params_;
std::unique_ptr<LibcastSocket> libcast_socket_for_test_;
DISALLOW_COPY_AND_ASSIGN(LibcastSocketService);
};
} // namespace cast_channel
#endif // COMPONENTS_CAST_CHANNEL_LIBCAST_SOCKET_SERVICE_H_