Chromium Code Reviews| Index: components/cast_channel/cast_socket.cc |
| diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc |
| index e87c392565a666350d4f83803569f460f78d5041..1b194968fb652904f81fdbb8761dd8aee7bfad5f 100644 |
| --- a/components/cast_channel/cast_socket.cc |
| +++ b/components/cast_channel/cast_socket.cc |
| @@ -136,8 +136,9 @@ CastSocketImpl::~CastSocketImpl() { |
| // would result in re-entrancy. |
| CloseInternal(); |
| - if (!connect_callback_.is_null()) |
| - base::ResetAndReturn(&connect_callback_).Run(ChannelError::UNKNOWN); |
| + for (auto& connect_callback : connect_callbacks_) |
| + connect_callback.Run(channel_id_, ChannelError::UNKNOWN); |
| + connect_callbacks_.clear(); |
| } |
| ReadyState CastSocketImpl::ready_state() const { |
| @@ -240,7 +241,30 @@ void CastSocketImpl::SetTransportForTesting( |
| transport_ = std::move(transport); |
| } |
| -void CastSocketImpl::Connect(base::Callback<void(ChannelError)> callback) { |
| +void CastSocketImpl::Connect(const OnOpenCallback& callback) { |
| + switch (ready_state_) { |
| + case ReadyState::NONE: |
| + connect_callbacks_.push_back(callback); |
| + Connect(); |
| + break; |
| + case ReadyState::CONNECTING: |
| + connect_callbacks_.push_back(callback); |
| + break; |
| + case ReadyState::OPEN: |
| + callback.Run(channel_id_, ChannelError::NONE); |
| + break; |
| + case ReadyState::CLOSING: |
|
mark a. foltz
2017/06/21 17:41:42
It sounds like this can be removed as it's unused?
zhaobin
2017/06/21 21:58:25
Done.
|
| + NOTREACHED(); |
| + break; |
| + case ReadyState::CLOSED: |
| + callback.Run(channel_id_, ChannelError::CONNECT_ERROR); |
| + break; |
| + default: |
| + NOTREACHED(); |
|
mark a. foltz
2017/06/21 17:41:42
nit: << "Unknown ReadyState: " << ready_state_;
zhaobin
2017/06/21 21:58:25
Done.
|
| + } |
| +} |
| + |
| +void CastSocketImpl::Connect() { |
| DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| VLOG_WITH_CONNECTION(1) << "Connect readyState = " |
| << ::cast_channel::ReadyStateToString(ready_state_); |
| @@ -248,12 +272,8 @@ void CastSocketImpl::Connect(base::Callback<void(ChannelError)> callback) { |
| delegate_ = base::MakeUnique<CastSocketMessageDelegate>(this); |
| - if (ready_state_ != ReadyState::NONE) { |
| - callback.Run(ChannelError::CONNECT_ERROR); |
| - return; |
| - } |
| + DCHECK_EQ(ReadyState::NONE, ready_state_); |
| - connect_callback_ = callback; |
| SetReadyState(ReadyState::CONNECTING); |
| SetConnectState(ConnectionState::TCP_CONNECT); |
| @@ -532,7 +552,7 @@ int CastSocketImpl::DoAuthChallengeReplyComplete(int result) { |
| void CastSocketImpl::DoConnectCallback() { |
| VLOG(1) << "DoConnectCallback (error_state = " |
| << ::cast_channel::ChannelErrorToString(error_state_) << ")"; |
| - if (connect_callback_.is_null()) { |
| + if (connect_callbacks_.empty()) { |
| DLOG(FATAL) << "Connection callback invoked multiple times."; |
| return; |
| } |
| @@ -550,7 +570,9 @@ void CastSocketImpl::DoConnectCallback() { |
| CloseInternal(); |
| } |
| - base::ResetAndReturn(&connect_callback_).Run(error_state_); |
| + for (auto& connect_callback : connect_callbacks_) |
| + connect_callback.Run(channel_id_, error_state_); |
| + connect_callbacks_.clear(); |
| } |
| void CastSocketImpl::Close(const net::CompletionCallback& callback) { |