Index: remoting/protocol/connection_to_host.cc |
diff --git a/remoting/protocol/connection_to_host.cc b/remoting/protocol/connection_to_host.cc |
index 26dca8b2a63e799a33156fd2d6c5beecf58d3ac6..83964e401090943a57e133823b0b44e0114df338 100644 |
--- a/remoting/protocol/connection_to_host.cc |
+++ b/remoting/protocol/connection_to_host.cc |
@@ -38,11 +38,13 @@ ConnectionToHost::ConnectionToHost( |
host_resolver_factory_(host_resolver_factory), |
port_allocator_session_factory_(session_factory), |
allow_nat_traversal_(allow_nat_traversal), |
- state_(STATE_EMPTY), |
event_callback_(NULL), |
- dispatcher_(new ClientMessageDispatcher()), |
client_stub_(NULL), |
- video_stub_(NULL) { |
+ video_stub_(NULL), |
+ state_(STATE_EMPTY), |
+ control_connected_(false), |
+ input_connected_(false), |
+ video_connected_(false) { |
} |
ConnectionToHost::~ConnectionToHost() { |
@@ -176,8 +178,7 @@ void ConnectionToHost::OnSessionStateChange( |
switch (state) { |
case Session::FAILED: |
state_ = STATE_FAILED; |
- CloseChannels(); |
- event_callback_->OnConnectionFailed(this); |
+ CloseOnError(); |
break; |
case Session::CLOSED: |
@@ -187,14 +188,25 @@ void ConnectionToHost::OnSessionStateChange( |
break; |
case Session::CONNECTED: |
- state_ = STATE_CONNECTED; |
// Initialize reader and writer. |
video_reader_.reset(VideoReader::Create(session_->config())); |
- video_reader_->Init(session_.get(), video_stub_); |
+ video_reader_->Init( |
+ session_.get(), video_stub_, |
+ base::Bind(&ConnectionToHost::OnVideoChannelInitialized, |
+ base::Unretained(this))); |
+ break; |
+ |
+ case Session::CONNECTED_CHANNELS: |
+ state_ = STATE_CONNECTED; |
host_control_sender_.reset( |
new HostControlSender(session_->control_channel())); |
+ dispatcher_.reset(new ClientMessageDispatcher()); |
dispatcher_->Initialize(session_.get(), client_stub_); |
- event_callback_->OnConnectionOpened(this); |
+ |
+ control_connected_ = true; |
+ input_connected_ = true; |
+ if (video_connected_) |
+ event_callback_->OnConnectionOpened(this); |
break; |
default: |
@@ -203,12 +215,32 @@ void ConnectionToHost::OnSessionStateChange( |
} |
} |
+void ConnectionToHost::OnVideoChannelInitialized(bool successful) { |
+ if (!successful) { |
+ LOG(ERROR) << "Failed to connect video channel"; |
+ CloseOnError(); |
+ return; |
+ } |
+ |
+ video_connected_ = true; |
+ if (control_connected_ && input_connected_) |
+ event_callback_->OnConnectionOpened(this); |
Wez
2011/08/10 23:36:52
Move this into a separate NotifyIfChannelsReady()
Sergey Ulanov
2011/08/11 00:33:47
Done.
|
+} |
+ |
+void ConnectionToHost::CloseOnError() { |
+ state_ = STATE_FAILED; |
+ CloseChannels(); |
+ event_callback_->OnConnectionFailed(this); |
+} |
+ |
void ConnectionToHost::CloseChannels() { |
if (input_sender_.get()) |
input_sender_->Close(); |
if (host_control_sender_.get()) |
host_control_sender_->Close(); |
+ |
+ video_reader_.reset(); |
} |
void ConnectionToHost::OnClientAuthenticated() { |