#ifndef REMOTING_PROTOCOL_CHANNEL_SOCKET_ADAPTER_H_
#define REMOTING_PROTOCOL_CHANNEL_SOCKET_ADAPTER_H_
#include <stddef.h>
#include "base/compiler_specific.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/threading/thread_checker.h"
#include "net/base/net_errors.h"
#include "remoting/protocol/p2p_datagram_socket.h"
#include "third_party/webrtc/p2p/base/ice_transport_internal.h"
#include "third_party/webrtc/p2p/base/packet_transport_internal.h"
#include "third_party/webrtc/rtc_base/async_packet_socket.h"
#include "third_party/webrtc/rtc_base/socket_address.h"
#include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h"
namespace remoting::protocol {
class TransportChannelSocketAdapter : public P2PDatagramSocket,
public sigslot::has_slots<> {
public:
explicit TransportChannelSocketAdapter(
cricket::IceTransportInternal* ice_transport);
TransportChannelSocketAdapter(const TransportChannelSocketAdapter&) = delete;
TransportChannelSocketAdapter& operator=(
const TransportChannelSocketAdapter&) = delete;
~TransportChannelSocketAdapter() override;
void SetOnDestroyedCallback(base::OnceClosure callback);
void Close(int error_code);
int Recv(const scoped_refptr<net::IOBuffer>& buf,
int buf_len,
const net::CompletionRepeatingCallback& callback) override;
int Send(const scoped_refptr<net::IOBuffer>& buf,
int buf_len,
const net::CompletionRepeatingCallback& callback) override;
private:
void OnNewPacket(rtc::PacketTransportInternal* transport,
const char* data,
size_t data_size,
const int64_t& packet_time,
int flags);
void OnWritableState(rtc::PacketTransportInternal* transport);
void OnChannelDestroyed(cricket::IceTransportInternal* ice_transport);
raw_ptr<cricket::IceTransportInternal> channel_;
base::OnceClosure destruction_callback_;
net::CompletionRepeatingCallback read_callback_;
scoped_refptr<net::IOBuffer> read_buffer_;
int read_buffer_size_;
net::CompletionRepeatingCallback write_callback_;
scoped_refptr<net::IOBuffer> write_buffer_;
int write_buffer_size_;
int closed_error_code_ = net::OK;
THREAD_CHECKER(thread_checker_);
};
}
#endif