#ifndef REMOTING_PROTOCOL_WEBRTC_DATA_STREAM_ADAPTER_H_
#define REMOTING_PROTOCOL_WEBRTC_DATA_STREAM_ADAPTER_H_
#include <memory>
#include <string>
#include "base/containers/queue.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "remoting/protocol/message_pipe.h"
#include "third_party/webrtc/api/peer_connection_interface.h"
#include "third_party/webrtc/rtc_base/ref_count.h"
namespace remoting::protocol {
class WebrtcDataStreamAdapter : public MessagePipe,
public webrtc::DataChannelObserver {
public:
explicit WebrtcDataStreamAdapter(
rtc::scoped_refptr<webrtc::DataChannelInterface> channel);
WebrtcDataStreamAdapter(const WebrtcDataStreamAdapter&) = delete;
WebrtcDataStreamAdapter& operator=(const WebrtcDataStreamAdapter&) = delete;
~WebrtcDataStreamAdapter() override;
std::string name() { return channel_->label(); }
void Start(EventHandler* event_handler) override;
void Send(google::protobuf::MessageLite* message,
base::OnceClosure done) override;
private:
enum class State { CONNECTING, OPEN, CLOSED };
struct PendingMessage {
PendingMessage(webrtc::DataBuffer buffer, base::OnceClosure done_callback);
PendingMessage(PendingMessage&&);
~PendingMessage();
PendingMessage& operator=(PendingMessage&&);
webrtc::DataBuffer buffer;
base::OnceClosure done_callback;
};
void SendMessagesIfReady();
void OnStateChange() override;
void OnMessage(const webrtc::DataBuffer& buffer) override;
void OnBufferedAmountChange(uint64_t previous_amount) override;
bool IsOkToCallOnTheNetworkThread() override;
void InvokeOpenEvent();
void InvokeClosedEvent();
void InvokeMessageEvent(std::unique_ptr<CompoundBuffer> buffer);
rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
raw_ptr<EventHandler> event_handler_ = nullptr;
State state_ = State::CONNECTING;
base::queue<PendingMessage> pending_messages_;
base::WeakPtrFactory<WebrtcDataStreamAdapter> weak_ptr_factory_{this};
};
}
#endif