#pragma once #include #include #include "logger.h" #include "stun_packet.h" typedef std::function UdpSendCallback; class IceServer { public: enum class IceState { kNew = 1, kConnect, kCompleted, kDisconnected }; typedef std::shared_ptr Ptr; IceServer(); IceServer(const std::string &username_fragment, const std::string &password); const std::string &GetUsernameFragment() const; const std::string &GetPassword() const; void SetUsernameFragment(const std::string &username_fragment); void SetPassword(const std::string &password); IceState GetState() const; void ProcessStunPacket(RTC::StunPacket *packet, struct sockaddr_in *remote_address); void HandleTuple(struct sockaddr_in *remote_address, bool has_use_candidate); ~IceServer(); void SetSendCB(UdpSendCallback send_cb) { send_callback_ = send_cb; } void SetIceServerCompletedCB(std::function cb) { ice_server_completed_callback_ = cb; }; struct sockaddr_in *GetSelectAddr() { return &remote_address_; } private: UdpSendCallback send_callback_; std::function ice_server_completed_callback_; std::string username_fragment_; std::string password_; std::string old_username_fragment_; std::string old_password_; IceState state{IceState::kNew}; struct sockaddr_in remote_address_; };