Index: components/devtools_bridge/session_dependency_factory.cc |
diff --git a/components/devtools_bridge/session_dependency_factory.cc b/components/devtools_bridge/session_dependency_factory.cc |
index ec8233020395b2b4383d6346875a92c0ea9101af..27a893d7c69154a5c9c5ba5c6c6d0ed3418f9b30 100644 |
--- a/components/devtools_bridge/session_dependency_factory.cc |
+++ b/components/devtools_bridge/session_dependency_factory.cc |
@@ -68,15 +68,89 @@ class MediaConstraints |
Constraints optional_; |
}; |
+class DataChannelObserverImpl : public webrtc::DataChannelObserver { |
+ public: |
+ DataChannelObserverImpl( |
+ webrtc::DataChannelInterface* data_channel, |
+ scoped_ptr<AbstractDataChannel::Observer> observer) |
+ : data_channel_(data_channel), |
+ observer_(observer.Pass()) { |
+ } |
+ |
+ void InitState() { |
+ open_ = data_channel_->state() == webrtc::DataChannelInterface::kOpen; |
+ } |
+ |
+ virtual void OnStateChange() override { |
+ bool open = data_channel_->state() == webrtc::DataChannelInterface::kOpen; |
+ |
+ if (open == open_) return; |
+ |
+ open_ = open; |
+ if (open) { |
+ observer_->OnOpen(); |
+ } else { |
+ observer_->OnClose(); |
+ } |
+ } |
+ |
+ virtual void OnMessage(const webrtc::DataBuffer& buffer) override { |
+ observer_->OnMessage(buffer.data.data(), buffer.size()); |
+ } |
+ |
+ private: |
+ webrtc::DataChannelInterface* const data_channel_; |
+ scoped_ptr<AbstractDataChannel::Observer> const observer_; |
+ bool open_; |
+}; |
+ |
class DataChannelImpl : public AbstractDataChannel { |
public: |
explicit DataChannelImpl( |
- rtc::scoped_refptr<webrtc::DataChannelInterface> impl) : impl_(impl) { |
+ rtc::Thread* const signaling_thread, |
+ rtc::scoped_refptr<webrtc::DataChannelInterface> impl) |
+ : signaling_thread_(signaling_thread), |
+ impl_(impl) { |
+ } |
+ |
+ virtual void RegisterObserver(scoped_ptr<Observer> observer) override { |
+ observer_.reset(new DataChannelObserverImpl(impl_.get(), observer.Pass())); |
+ signaling_thread_->Invoke<void>(rtc::Bind( |
+ &DataChannelImpl::RegisterObserverOnSignalingThread, this)); |
+ } |
+ |
+ virtual void UnregisterObserver() override { |
+ DCHECK(observer_.get() != NULL); |
+ impl_->UnregisterObserver(); |
+ observer_.reset(); |
+ } |
+ |
+ virtual void SendBinaryMessage(void* data, size_t length) override { |
+ SendMessage(data, length, true); |
} |
- // TODO(serya): Implement. |
+ virtual void SendTextMessage(void* data, size_t length) override { |
+ SendMessage(data, length, false); |
+ } |
+ |
+ void SendMessage(void* data, size_t length, bool is_binary) { |
+ impl_->Send(webrtc::DataBuffer(rtc::Buffer(data, length), is_binary)); |
+ } |
+ |
+ void Close() override { |
+ impl_->Close(); |
+ } |
private: |
+ void RegisterObserverOnSignalingThread() { |
+ // State initialization and observer registration happen atomically |
+ // if done on the signaling thread (see rtc::Thread::Send). |
+ observer_->InitState(); |
+ impl_->RegisterObserver(observer_.get()); |
+ } |
+ |
+ rtc::Thread* const signaling_thread_; |
+ scoped_ptr<DataChannelObserverImpl> observer_; |
const rtc::scoped_refptr<webrtc::DataChannelInterface> impl_; |
}; |
@@ -315,12 +389,12 @@ class PeerConnectionImpl : public AbstractPeerConnection { |
virtual scoped_ptr<AbstractDataChannel> CreateDataChannel( |
int channelId) override { |
webrtc::DataChannelInit init; |
- init.reliable = true; |
init.ordered = true; |
init.negotiated = true; |
init.id = channelId; |
return make_scoped_ptr(new DataChannelImpl( |
+ signaling_thread_, |
connection_->CreateDataChannel("", &init))); |
} |