#ifndef TGVOIP_WEBRTC_NETWORK_MANAGER_H #define TGVOIP_WEBRTC_NETWORK_MANAGER_H #include "rtc_base/thread.h" #include #include #include "rtc_base/copy_on_write_buffer.h" #include "api/candidate.h" #include "TgVoip.h" namespace rtc { class BasicPacketSocketFactory; class BasicNetworkManager; class PacketTransportInternal; } namespace cricket { class BasicPortAllocator; class P2PTransportChannel; class IceTransportInternal; } namespace webrtc { class BasicAsyncResolverFactory; } #ifdef TGVOIP_NAMESPACE namespace TGVOIP_NAMESPACE { #endif class NetworkManager: public sigslot::has_slots<> { public: struct State { bool isReadyToSendData; }; public: NetworkManager( rtc::Thread *thread, TgVoipEncryptionKey encryptionKey, bool enableP2P, std::function stateUpdated, std::function packetReceived, std::function &)> signalingDataEmitted ); ~NetworkManager(); void receiveSignalingData(const std::vector &data); void sendPacket(const rtc::CopyOnWriteBuffer &packet); private: rtc::Thread *_thread; TgVoipEncryptionKey _encryptionKey; std::function _stateUpdated; std::function _packetReceived; std::function &)> _signalingDataEmitted; std::unique_ptr _socketFactory; std::unique_ptr _networkManager; std::unique_ptr _portAllocator; std::unique_ptr _asyncResolverFactory; std::unique_ptr _transportChannel; private: void candidateGathered(cricket::IceTransportInternal *transport, const cricket::Candidate &candidate); void candidateGatheringState(cricket::IceTransportInternal *transport); void transportStateChanged(cricket::IceTransportInternal *transport); void transportReadyToSend(cricket::IceTransportInternal *transport); void transportPacketReceived(rtc::PacketTransportInternal *transport, const char *bytes, size_t size, const int64_t ×tamp, int unused); }; #ifdef TGVOIP_NAMESPACE } #endif #endif