blob: 0d42d5369f09a8dc311b5566499d1a859e74a69d [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_PROTOCOL_WEBRTC_DATA_STREAM_ADAPTER_H_
#define REMOTING_PROTOCOL_WEBRTC_DATA_STREAM_ADAPTER_H_
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/containers/queue.h"
#include "base/macros.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 {
namespace protocol {
// WebrtcDataStreamAdapter implements MessagePipe for WebRTC data channels.
class WebrtcDataStreamAdapter : public MessagePipe,
public webrtc::DataChannelObserver {
public:
explicit WebrtcDataStreamAdapter(
rtc::scoped_refptr<webrtc::DataChannelInterface> channel);
~WebrtcDataStreamAdapter() override;
std::string name() { return channel_->label(); }
// MessagePipe interface.
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();
// webrtc::DataChannelObserver interface.
void OnStateChange() override;
void OnMessage(const webrtc::DataBuffer& buffer) override;
void OnBufferedAmountChange(uint64_t previous_amount) override;
rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
EventHandler* event_handler_ = nullptr;
State state_ = State::CONNECTING;
// The data and done callbacks for queued but not yet sent messages.
base::queue<PendingMessage> pending_messages_;
base::WeakPtrFactory<WebrtcDataStreamAdapter> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(WebrtcDataStreamAdapter);
};
} // namespace protocol
} // namespace remoting
#endif // REMOTING_PROTOCOL_WEBRTC_DATA_STREAM_ADAPTER_H_