Index: components/cast_channel/cast_socket.cc |
diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc |
index e60004ed228f1e5c1a2f6ce9ebd0e2150cc12fbe..27119e18ff6adc4c2704a64ac6732855d5cde7a3 100644 |
--- a/components/cast_channel/cast_socket.cc |
+++ b/components/cast_channel/cast_socket.cc |
@@ -240,14 +240,13 @@ void CastSocketImpl::SetTransportForTesting( |
transport_ = std::move(transport); |
} |
-void CastSocketImpl::Connect(std::unique_ptr<CastTransport::Delegate> delegate, |
- base::Callback<void(ChannelError)> callback) { |
+void CastSocketImpl::Connect(base::Callback<void(ChannelError)> callback) { |
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
VLOG_WITH_CONNECTION(1) << "Connect readyState = " |
<< ::cast_channel::ReadyStateToString(ready_state_); |
DCHECK_EQ(ConnectionState::START_CONNECT, connect_state_); |
- delegate_ = std::move(delegate); |
+ delegate_ = base::MakeUnique<CastSocketMessageDelegate>(this); |
if (ready_state_ != ReadyState::NONE) { |
callback.Run(ChannelError::CONNECT_ERROR); |
@@ -274,6 +273,16 @@ CastTransport* CastSocketImpl::transport() const { |
return transport_.get(); |
} |
+bool CastSocketImpl::HasObserver(const std::string& id) { |
+ return base::ContainsKey(observer_map_, id); |
+} |
+ |
+void CastSocketImpl::AddObserver(const std::string& id, |
+ std::unique_ptr<Observer> observer) { |
+ DCHECK(!base::ContainsKey(observer_map_, id)); |
+ observer_map_.insert(std::make_pair(id, std::move(observer))); |
+} |
+ |
void CastSocketImpl::OnConnectTimeout() { |
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
// Stop all pending connection setup tasks and report back to the client. |
@@ -569,6 +578,7 @@ void CastSocketImpl::CloseInternal() { |
tcp_socket_.reset(); |
socket_.reset(); |
transport_security_state_.reset(); |
+ observer_map_.clear(); |
if (GetTimer()) { |
GetTimer()->Stop(); |
} |
@@ -603,5 +613,28 @@ void CastSocketImpl::SetErrorState(ChannelError error_state) { |
delegate_->OnError(error_state_); |
} |
+CastSocketImpl::CastSocketMessageDelegate::CastSocketMessageDelegate( |
+ cast_channel::CastSocketImpl* socket) |
+ : socket_(socket) { |
+ DCHECK(socket_); |
+} |
+ |
+CastSocketImpl::CastSocketMessageDelegate::~CastSocketMessageDelegate() {} |
+ |
+// CastTransport::Delegate implementation. |
+void CastSocketImpl::CastSocketMessageDelegate::OnError( |
+ cast_channel::ChannelError error_state) { |
+ for (auto& it : socket_->observer_map_) |
+ it.second->OnError(*socket_, error_state); |
+} |
+ |
+void CastSocketImpl::CastSocketMessageDelegate::OnMessage( |
+ const cast_channel::CastMessage& message) { |
+ for (auto& it : socket_->observer_map_) |
+ it.second->OnMessage(*socket_, message); |
+} |
+ |
+void CastSocketImpl::CastSocketMessageDelegate::Start() {} |
+ |
} // namespace cast_channel |
#undef VLOG_WITH_CONNECTION |