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) { |