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..86adf570b84915e419ba27aa6c084d5c95168985 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,20 +241,36 @@ 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_); |
+ DCHECK_EQ(ReadyState::NONE, ready_state_); |
DCHECK_EQ(ConnectionState::START_CONNECT, connect_state_); |
delegate_ = base::MakeUnique<CastSocketMessageDelegate>(this); |
- if (ready_state_ != ReadyState::NONE) { |
- callback.Run(ChannelError::CONNECT_ERROR); |
- return; |
- } |
- |
- connect_callback_ = callback; |
SetReadyState(ReadyState::CONNECTING); |
SetConnectState(ConnectionState::TCP_CONNECT); |
@@ -532,7 +549,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 +567,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) { |