Index: remoting/protocol/libjingle_transport_factory.cc |
diff --git a/remoting/protocol/libjingle_transport_factory.cc b/remoting/protocol/libjingle_transport_factory.cc |
index 17195bdba0c5b1f6ecdeabd69d3dba648fb7c261..c2665da3daac9d03fd2a444622dc737b6b3f03a6 100644 |
--- a/remoting/protocol/libjingle_transport_factory.cc |
+++ b/remoting/protocol/libjingle_transport_factory.cc |
@@ -6,6 +6,7 @@ |
#include "jingle/glue/channel_socket_adapter.h" |
#include "jingle/glue/pseudotcp_adapter.h" |
+#include "jingle/glue/utils.h" |
#include "net/base/net_errors.h" |
#include "remoting/protocol/channel_authenticator.h" |
#include "remoting/protocol/transport_config.h" |
@@ -51,6 +52,8 @@ class LibjingleStreamTransport : public StreamTransport, |
void OnRequestSignaling(); |
void OnCandidateReady(cricket::TransportChannelImpl* channel, |
const cricket::Candidate& candidate); |
+ void OnRouteChange(cricket::TransportChannel* channel, |
+ const cricket::Candidate& candidate); |
void OnTcpConnected(int result); |
void OnAuthenticationDone(net::Error error, |
@@ -149,6 +152,8 @@ void LibjingleStreamTransport::Connect( |
this, &LibjingleStreamTransport::OnRequestSignaling); |
channel_->SignalCandidateReady.connect( |
this, &LibjingleStreamTransport::OnCandidateReady); |
+ channel_->SignalRouteChange.connect( |
+ this, &LibjingleStreamTransport::OnRouteChange); |
channel_->Connect(); |
@@ -201,6 +206,38 @@ void LibjingleStreamTransport::OnCandidateReady( |
event_handler_->OnTransportCandidate(this, candidate); |
} |
+void LibjingleStreamTransport::OnRouteChange( |
+ cricket::TransportChannel* channel, |
+ const cricket::Candidate& candidate) { |
+ TransportRoute route; |
+ |
+ if (candidate.type() == "local") { |
+ route.type = TransportRoute::DIRECT; |
+ } else if (candidate.type() == "stun") { |
+ route.type = TransportRoute::STUN; |
+ } else if (candidate.type() == "relay") { |
+ route.type = TransportRoute::RELAY; |
+ } else { |
+ LOG(FATAL) << "Unknown candidate type: " << candidate.type(); |
+ } |
+ |
+ if (!jingle_glue::SocketAddressToIPEndPoint( |
+ candidate.address(), &route.remote_address)) { |
+ LOG(FATAL) << "Failed to convert peer IP address."; |
+ } |
+ |
+ DCHECK(channel->GetP2PChannel()); |
+ DCHECK(channel->GetP2PChannel()->best_connection()); |
+ const cricket::Candidate& local_candidate = |
+ channel->GetP2PChannel()->best_connection()->local_candidate(); |
+ if (!jingle_glue::SocketAddressToIPEndPoint( |
+ local_candidate.address(), &route.local_address)) { |
+ LOG(FATAL) << "Failed to convert local IP address."; |
+ } |
+ |
+ event_handler_->OnTransportRouteChange(this, route); |
+} |
+ |
void LibjingleStreamTransport::OnTcpConnected(int result) { |
DCHECK(CalledOnValidThread()); |