123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // 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/observer_list.h"
- #include "base/sequence_checker.h"
- #include "base/task/single_thread_task_runner.h"
- #include "base/time/time.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(const LibcastSocketService&) = delete;
- LibcastSocketService& operator=(const LibcastSocketService&) = delete;
- ~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_;
- };
- } // namespace cast_channel
- #endif // COMPONENTS_CAST_CHANNEL_LIBCAST_SOCKET_SERVICE_H_
|