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 c4b2def9c626aec1cc70ab3a55d157a48effa71b..58a997d1b95ed4f194fa78537819e4516e5b7df0 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,28 @@ 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::CLOSED: |
| + callback.Run(channel_id_, ChannelError::CONNECT_ERROR); |
| + break; |
| + default: |
| + NOTREACHED() << "Unknown ReadyState: " |
| + << ReadyStateToString(ready_state_); |
| + } |
| +} |
| + |
| +void CastSocketImpl::Connect() { |
| DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| VLOG_WITH_CONNECTION(1) << "Connect readyState = " |
| << ReadyStateToString(ready_state_); |
| @@ -248,12 +270,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_); |
|
imcheng
2017/06/24 01:29:36
Move the DCHECKs to the top of this method.
zhaobin
2017/06/26 19:04:09
Done.
|
| - connect_callback_ = callback; |
| SetReadyState(ReadyState::CONNECTING); |
| SetConnectState(ConnectionState::TCP_CONNECT); |
| @@ -532,7 +550,7 @@ int CastSocketImpl::DoAuthChallengeReplyComplete(int result) { |
| void CastSocketImpl::DoConnectCallback() { |
| VLOG(1) << "DoConnectCallback (error_state = " |
| << ChannelErrorToString(error_state_) << ")"; |
| - if (connect_callback_.is_null()) { |
| + if (connect_callbacks_.empty()) { |
| DLOG(FATAL) << "Connection callback invoked multiple times."; |
| return; |
| } |
| @@ -550,7 +568,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) { |