#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"
namespace remoting::protocol {
class TransportChannelSocketAdapter : public P2PDatagramSocket {
public:
explicit TransportChannelSocketAdapter(
webrtc::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(webrtc::PacketTransportInternal* transport,
const webrtc::ReceivedIpPacket& packet);
void OnWritableState(webrtc::PacketTransportInternal* transport);
raw_ptr<webrtc::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