Index: remoting/protocol/connection_to_client.cc |
diff --git a/remoting/protocol/connection_to_client.cc b/remoting/protocol/connection_to_client.cc |
index f5cf592e444f42b5e4ca99ff805cffcf4eba562e..433098453b57a068506795c573238a73fa9c4910 100644 |
--- a/remoting/protocol/connection_to_client.cc |
+++ b/remoting/protocol/connection_to_client.cc |
@@ -4,6 +4,7 @@ |
#include "remoting/protocol/connection_to_client.h" |
+#include "base/bind.h" |
#include "google/protobuf/message.h" |
#include "net/base/io_buffer.h" |
#include "remoting/protocol/client_control_sender.h" |
@@ -26,7 +27,10 @@ ConnectionToClient::ConnectionToClient(MessageLoop* message_loop, |
: loop_(message_loop), |
handler_(handler), |
host_stub_(NULL), |
- input_stub_(NULL) { |
+ input_stub_(NULL), |
+ control_connected_(false), |
+ input_connected_(false), |
+ video_connected_(false) { |
DCHECK(loop_); |
DCHECK(handler_); |
} |
@@ -90,33 +94,63 @@ void ConnectionToClient::OnSessionStateChange(protocol::Session::State state) { |
DCHECK(handler_); |
switch(state) { |
case protocol::Session::CONNECTING: |
+ // Don't care about this message. |
break; |
- // Don't care about this message. |
+ |
case protocol::Session::CONNECTED: |
- client_control_sender_.reset( |
- new ClientControlSender(session_->control_channel())); |
video_writer_.reset(VideoWriter::Create(session_->config())); |
- video_writer_->Init(session_.get()); |
+ video_writer_->Init( |
+ session_.get(), base::Bind(&ConnectionToClient::OnVideoInitialized, |
+ base::Unretained(this))); |
+ break; |
+ case protocol::Session::CONNECTED_CHANNELS: |
+ client_control_sender_.reset( |
+ new ClientControlSender(session_->control_channel())); |
dispatcher_.reset(new HostMessageDispatcher()); |
dispatcher_->Initialize(this, host_stub_, input_stub_); |
- handler_->OnConnectionOpened(this); |
+ control_connected_ = true; |
+ input_connected_ = true; |
+ NotifyIfChannelsReady(); |
break; |
+ |
case protocol::Session::CLOSED: |
CloseChannels(); |
handler_->OnConnectionClosed(this); |
break; |
+ |
case protocol::Session::FAILED: |
- CloseChannels(); |
- handler_->OnConnectionFailed(this); |
+ CloseOnError(); |
break; |
+ |
default: |
// We shouldn't receive other states. |
NOTREACHED(); |
} |
} |
+void ConnectionToClient::OnVideoInitialized(bool successful) { |
+ if (!successful) { |
+ LOG(ERROR) << "Failed to connect video channel"; |
+ CloseOnError(); |
+ return; |
+ } |
+ |
+ video_connected_ = true; |
+ NotifyIfChannelsReady(); |
+} |
+ |
+void ConnectionToClient::NotifyIfChannelsReady() { |
+ if (control_connected_ && input_connected_ && video_connected_) |
+ handler_->OnConnectionOpened(this); |
+} |
+ |
+void ConnectionToClient::CloseOnError() { |
+ CloseChannels(); |
+ handler_->OnConnectionFailed(this); |
+} |
+ |
void ConnectionToClient::CloseChannels() { |
if (video_writer_.get()) |
video_writer_->Close(); |