Index: remoting/protocol/webrtc_connection_to_client.cc |
diff --git a/remoting/protocol/webrtc_connection_to_client.cc b/remoting/protocol/webrtc_connection_to_client.cc |
index a625300f5e8e9965865fe0d30aa7e49e31618c3a..65df2fc4f4a82e4e47877a133b536a7571dbab59 100644 |
--- a/remoting/protocol/webrtc_connection_to_client.cc |
+++ b/remoting/protocol/webrtc_connection_to_client.cc |
@@ -18,6 +18,7 @@ |
#include "remoting/protocol/host_event_dispatcher.h" |
#include "remoting/protocol/host_stub.h" |
#include "remoting/protocol/input_stub.h" |
+#include "remoting/protocol/message_pipe.h" |
#include "remoting/protocol/transport_context.h" |
#include "remoting/protocol/webrtc_transport.h" |
#include "remoting/protocol/webrtc_video_stream.h" |
@@ -144,9 +145,9 @@ void WebrtcConnectionToClient::OnSessionStateChange(Session::State state) { |
case Session::CLOSED: |
case Session::FAILED: |
- transport_->Close(state == Session::CLOSED ? OK : session_->error()); |
control_dispatcher_.reset(); |
event_dispatcher_.reset(); |
+ transport_->Close(state == Session::CLOSED ? OK : session_->error()); |
event_handler_->OnConnectionClosed( |
this, state == Session::CLOSED ? OK : session_->error()); |
break; |
@@ -154,11 +155,10 @@ void WebrtcConnectionToClient::OnSessionStateChange(Session::State state) { |
} |
void WebrtcConnectionToClient::OnWebrtcTransportConnecting() { |
+ // Create outgoing control channel by initializing |control_dispatcher_|. |
+ // |event_dispatcher_| is initialized later because event channel is expected |
+ // to be created by the client. |
control_dispatcher_->Init(transport_->outgoing_channel_factory(), this); |
- |
- event_dispatcher_->Init(transport_->incoming_channel_factory(), this); |
- event_dispatcher_->set_on_input_event_callback(base::Bind( |
- &ConnectionToClient::OnInputEventReceived, base::Unretained(this))); |
} |
void WebrtcConnectionToClient::OnWebrtcTransportConnected() { |
@@ -170,6 +170,17 @@ void WebrtcConnectionToClient::OnWebrtcTransportError(ErrorCode error) { |
Disconnect(error); |
} |
+void WebrtcConnectionToClient::OnWebrtcTransportIncomingDataChannel( |
+ const std::string& name, |
+ std::unique_ptr<MessagePipe> pipe) { |
+ if (name == event_dispatcher_->channel_name() && |
+ !event_dispatcher_->is_connected()) { |
+ event_dispatcher_->set_on_input_event_callback(base::Bind( |
+ &ConnectionToClient::OnInputEventReceived, base::Unretained(this))); |
+ event_dispatcher_->Init(std::move(pipe), this); |
+ } |
+} |
+ |
void WebrtcConnectionToClient::OnWebrtcTransportMediaStreamAdded( |
scoped_refptr<webrtc::MediaStreamInterface> stream) { |
LOG(WARNING) << "The client created an unexpected media stream."; |
@@ -188,5 +199,14 @@ void WebrtcConnectionToClient::OnChannelInitialized( |
} |
} |
+void WebrtcConnectionToClient::OnChannelClosed( |
+ ChannelDispatcherBase* channel_dispatcher) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ LOG(ERROR) << "Channel " << channel_dispatcher->channel_name() |
+ << " was closed unexpectedly."; |
+ Disconnect(INCOMPATIBLE_PROTOCOL); |
+} |
+ |
} // namespace protocol |
} // namespace remoting |