OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/devtools_bridge/session_dependency_factory.h" | 5 #include "components/devtools_bridge/session_dependency_factory.h" |
6 | 6 |
7 #include "components/devtools_bridge/abstract_data_channel.h" | 7 #include "components/devtools_bridge/abstract_data_channel.h" |
8 #include "components/devtools_bridge/abstract_peer_connection.h" | 8 #include "components/devtools_bridge/abstract_peer_connection.h" |
9 #include "components/devtools_bridge/rtc_configuration.h" | 9 #include "components/devtools_bridge/rtc_configuration.h" |
10 #include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface
.h" | 10 #include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface
.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 | 61 |
62 void AddMandatory(const std::string& key, const std::string& value) { | 62 void AddMandatory(const std::string& key, const std::string& value) { |
63 mandatory_.push_back(Constraint(key, value)); | 63 mandatory_.push_back(Constraint(key, value)); |
64 } | 64 } |
65 | 65 |
66 private: | 66 private: |
67 Constraints mandatory_; | 67 Constraints mandatory_; |
68 Constraints optional_; | 68 Constraints optional_; |
69 }; | 69 }; |
70 | 70 |
| 71 class DataChannelObserverImpl : public webrtc::DataChannelObserver { |
| 72 public: |
| 73 DataChannelObserverImpl( |
| 74 webrtc::DataChannelInterface* data_channel, |
| 75 scoped_ptr<AbstractDataChannel::Observer> observer) |
| 76 : data_channel_(data_channel), |
| 77 observer_(observer.Pass()) { |
| 78 } |
| 79 |
| 80 void InitState() { |
| 81 open_ = data_channel_->state() == webrtc::DataChannelInterface::kOpen; |
| 82 } |
| 83 |
| 84 virtual void OnStateChange() override { |
| 85 bool open = data_channel_->state() == webrtc::DataChannelInterface::kOpen; |
| 86 |
| 87 if (open == open_) return; |
| 88 |
| 89 open_ = open; |
| 90 if (open) { |
| 91 observer_->OnOpen(); |
| 92 } else { |
| 93 observer_->OnClose(); |
| 94 } |
| 95 } |
| 96 |
| 97 virtual void OnMessage(const webrtc::DataBuffer& buffer) override { |
| 98 observer_->OnMessage(buffer.data.data(), buffer.size()); |
| 99 } |
| 100 |
| 101 private: |
| 102 webrtc::DataChannelInterface* const data_channel_; |
| 103 scoped_ptr<AbstractDataChannel::Observer> const observer_; |
| 104 bool open_; |
| 105 }; |
| 106 |
71 class DataChannelImpl : public AbstractDataChannel { | 107 class DataChannelImpl : public AbstractDataChannel { |
72 public: | 108 public: |
73 explicit DataChannelImpl( | 109 explicit DataChannelImpl( |
74 rtc::scoped_refptr<webrtc::DataChannelInterface> impl) : impl_(impl) { | 110 rtc::Thread* const signaling_thread, |
| 111 rtc::scoped_refptr<webrtc::DataChannelInterface> impl) |
| 112 : signaling_thread_(signaling_thread), |
| 113 impl_(impl) { |
75 } | 114 } |
76 | 115 |
77 // TODO(serya): Implement. | 116 virtual void RegisterObserver(scoped_ptr<Observer> observer) override { |
| 117 observer_.reset(new DataChannelObserverImpl(impl_.get(), observer.Pass())); |
| 118 signaling_thread_->Invoke<void>(rtc::Bind( |
| 119 &DataChannelImpl::RegisterObserverOnSignalingThread, this)); |
| 120 } |
| 121 |
| 122 virtual void UnregisterObserver() override { |
| 123 DCHECK(observer_.get() != NULL); |
| 124 impl_->UnregisterObserver(); |
| 125 observer_.reset(); |
| 126 } |
| 127 |
| 128 virtual void SendBinaryMessage(void* data, size_t length) override { |
| 129 SendMessage(data, length, true); |
| 130 } |
| 131 |
| 132 virtual void SendTextMessage(void* data, size_t length) override { |
| 133 SendMessage(data, length, false); |
| 134 } |
| 135 |
| 136 void SendMessage(void* data, size_t length, bool is_binary) { |
| 137 impl_->Send(webrtc::DataBuffer(rtc::Buffer(data, length), is_binary)); |
| 138 } |
| 139 |
| 140 void Close() override { |
| 141 impl_->Close(); |
| 142 } |
78 | 143 |
79 private: | 144 private: |
| 145 void RegisterObserverOnSignalingThread() { |
| 146 // State initialization and observer registration happen atomically |
| 147 // if done on the signaling thread (see rtc::Thread::Send). |
| 148 observer_->InitState(); |
| 149 impl_->RegisterObserver(observer_.get()); |
| 150 } |
| 151 |
| 152 rtc::Thread* const signaling_thread_; |
| 153 scoped_ptr<DataChannelObserverImpl> observer_; |
80 const rtc::scoped_refptr<webrtc::DataChannelInterface> impl_; | 154 const rtc::scoped_refptr<webrtc::DataChannelInterface> impl_; |
81 }; | 155 }; |
82 | 156 |
83 class PeerConnectionObserverImpl | 157 class PeerConnectionObserverImpl |
84 : public webrtc::PeerConnectionObserver { | 158 : public webrtc::PeerConnectionObserver { |
85 public: | 159 public: |
86 PeerConnectionObserverImpl(AbstractPeerConnection::Delegate* delegate) | 160 PeerConnectionObserverImpl(AbstractPeerConnection::Delegate* delegate) |
87 : delegate_(delegate), | 161 : delegate_(delegate), |
88 connected_(false) { | 162 connected_(false) { |
89 } | 163 } |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 return; | 382 return; |
309 } | 383 } |
310 // Doesn't takes ownership. | 384 // Doesn't takes ownership. |
311 connection_->AddIceCandidate(candidate); | 385 connection_->AddIceCandidate(candidate); |
312 delete candidate; | 386 delete candidate; |
313 } | 387 } |
314 | 388 |
315 virtual scoped_ptr<AbstractDataChannel> CreateDataChannel( | 389 virtual scoped_ptr<AbstractDataChannel> CreateDataChannel( |
316 int channelId) override { | 390 int channelId) override { |
317 webrtc::DataChannelInit init; | 391 webrtc::DataChannelInit init; |
318 init.reliable = true; | |
319 init.ordered = true; | 392 init.ordered = true; |
320 init.negotiated = true; | 393 init.negotiated = true; |
321 init.id = channelId; | 394 init.id = channelId; |
322 | 395 |
323 return make_scoped_ptr(new DataChannelImpl( | 396 return make_scoped_ptr(new DataChannelImpl( |
| 397 signaling_thread_, |
324 connection_->CreateDataChannel("", &init))); | 398 connection_->CreateDataChannel("", &init))); |
325 } | 399 } |
326 | 400 |
327 private: | 401 private: |
328 webrtc::CreateSessionDescriptionObserver* MakeCreateAndSetHandler() { | 402 webrtc::CreateSessionDescriptionObserver* MakeCreateAndSetHandler() { |
329 return new rtc::RefCountedObject<CreateAndSetHandler>(holder_); | 403 return new rtc::RefCountedObject<CreateAndSetHandler>(holder_); |
330 } | 404 } |
331 | 405 |
332 void DisposeOnSignalingThread() { | 406 void DisposeOnSignalingThread() { |
333 DCHECK(signaling_thread_->IsCurrent()); | 407 DCHECK(signaling_thread_->IsCurrent()); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 } | 494 } |
421 | 495 |
422 // static | 496 // static |
423 scoped_ptr<SessionDependencyFactory> SessionDependencyFactory::CreateInstance( | 497 scoped_ptr<SessionDependencyFactory> SessionDependencyFactory::CreateInstance( |
424 const base::Closure& cleanup_on_signaling_thread) { | 498 const base::Closure& cleanup_on_signaling_thread) { |
425 return make_scoped_ptr(new SessionDependencyFactoryImpl( | 499 return make_scoped_ptr(new SessionDependencyFactoryImpl( |
426 cleanup_on_signaling_thread)); | 500 cleanup_on_signaling_thread)); |
427 } | 501 } |
428 | 502 |
429 } // namespace devtools_bridge | 503 } // namespace devtools_bridge |
OLD | NEW |