NetworkRTCProvider.h [plain text]
#pragma once
#if USE(LIBWEBRTC)
#include "LibWebRTCSocketClient.h"
#include "NetworkRTCMonitor.h"
#include "RTCNetwork.h"
#include <WebCore/LibWebRTCMacros.h>
#include <webrtc/rtc_base/sigslot.h>
#include <webrtc/p2p/base/basicpacketsocketfactory.h>
#include <wtf/HashMap.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/UniqueRef.h>
#include <wtf/text/WTFString.h>
namespace IPC {
class Connection;
class Decoder;
}
namespace WebKit {
class NetworkConnectionToWebProcess;
class NetworkRTCResolver;
class NetworkRTCSocket;
class NetworkRTCProvider : public ThreadSafeRefCounted<NetworkRTCProvider>, public rtc::MessageHandler {
public:
static Ref<NetworkRTCProvider> create(NetworkConnectionToWebProcess& connection) { return adoptRef(*new NetworkRTCProvider(connection)); }
~NetworkRTCProvider();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
void didReceiveNetworkRTCMonitorMessage(IPC::Connection& connection, IPC::Decoder& decoder) { m_rtcMonitor.didReceiveMessage(connection, decoder); }
void didReceiveNetworkRTCSocketMessage(IPC::Connection&, IPC::Decoder&);
std::unique_ptr<LibWebRTCSocketClient> takeSocket(uint64_t);
void resolverDone(uint64_t);
void close();
void callSocket(uint64_t, Function<void(LibWebRTCSocketClient&)>&&);
void callOnRTCNetworkThread(Function<void()>&&);
void sendFromMainThread(Function<void(IPC::Connection&)>&&);
void newConnection(LibWebRTCSocketClient&, std::unique_ptr<rtc::AsyncPacketSocket>&&);
void closeListeningSockets(Function<void()>&&);
void authorizeListeningSockets() { m_isListeningSocketAuthorized = true; }
private:
explicit NetworkRTCProvider(NetworkConnectionToWebProcess&);
void createUDPSocket(uint64_t, const RTCNetwork::SocketAddress&, uint16_t, uint16_t);
void createClientTCPSocket(uint64_t, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, int);
void createServerTCPSocket(uint64_t, const RTCNetwork::SocketAddress&, uint16_t minPort, uint16_t maxPort, int);
void wrapNewTCPConnection(uint64_t identifier, uint64_t newConnectionSocketIdentifier);
void createResolver(uint64_t, const String&);
void stopResolver(uint64_t);
void addSocket(uint64_t, std::unique_ptr<LibWebRTCSocketClient>&&);
void createSocket(uint64_t identifier, std::unique_ptr<rtc::AsyncPacketSocket>&&, LibWebRTCSocketClient::Type);
void OnMessage(rtc::Message*);
HashMap<uint64_t, std::unique_ptr<NetworkRTCResolver>> m_resolvers;
HashMap<uint64_t, std::unique_ptr<LibWebRTCSocketClient>> m_sockets;
NetworkConnectionToWebProcess* m_connection;
bool m_isStarted { true };
NetworkRTCMonitor m_rtcMonitor;
std::unique_ptr<rtc::Thread> m_rtcNetworkThread;
UniqueRef<rtc::BasicPacketSocketFactory> m_packetSocketFactory;
HashMap<uint64_t, std::unique_ptr<rtc::AsyncPacketSocket>> m_pendingIncomingSockets;
uint64_t m_incomingSocketIdentifier { 0 };
bool m_isListeningSocketAuthorized { true };
};
}
#endif // USE(LIBWEBRTC)