Index: talk/app/webrtc/peerconnection.cc |
diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc |
index fecc19ba0ebce95bd9a911eac9ef280fa80302ee..ea28bf67cb1ff0642a4ff27c98b6b4661ae024bc 100644 |
--- a/talk/app/webrtc/peerconnection.cc |
+++ b/talk/app/webrtc/peerconnection.cc |
@@ -330,6 +330,40 @@ bool ParseIceServerUrl(const PeerConnectionInterface::IceServer& server, |
return true; |
} |
+void ConvertToCricketIceServers( |
+ const std::vector<StunConfiguration>& stuns, |
+ const std::vector<TurnConfiguration>& turns, |
+ cricket::ServerAddresses* cricket_stuns, |
+ std::vector<cricket::RelayServerConfig>* cricket_turns) { |
+ RTC_DCHECK(cricket_stuns && cricket_turns); |
+ for (const StunConfiguration& stun : stuns) { |
+ cricket_stuns->insert(stun.server); |
+ } |
+ |
+ int priority = static_cast<int>(turns.size() - 1); |
+ for (const TurnConfiguration& turn : turns) { |
+ cricket::RelayCredentials credentials(turn.username, turn.password); |
+ cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); |
+ cricket::ProtocolType protocol; |
+ // Using VERIFY because ParseIceServers should have already caught an |
+ // invalid transport type. |
+ if (!VERIFY( |
+ cricket::StringToProto(turn.transport_type.c_str(), &protocol))) { |
+ LOG(LS_WARNING) << "Ignoring TURN server " << turn.server << ". " |
+ << "Reason= Incorrect " << turn.transport_type |
+ << " transport parameter."; |
+ } else { |
+ relay_server.ports.push_back( |
+ cricket::ProtocolAddress(turn.server, protocol, turn.secure)); |
+ relay_server.credentials = credentials; |
+ relay_server.priority = priority; |
+ cricket_turns->push_back(relay_server); |
+ } |
+ // First in the list gets highest priority. |
+ --priority; |
+ } |
+} |
+ |
// Check if we can send |new_stream| on a PeerConnection. |
bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams, |
webrtc::MediaStreamInterface* new_stream) { |
@@ -589,15 +623,45 @@ bool PeerConnection::Initialize( |
if (!observer) { |
return false; |
} |
- observer_ = observer; |
+ // This Initialize function parses ICE servers an extra time, but it will |
+ // be removed once all PortAllocaotrs support SetIceServers. |
std::vector<PortAllocatorFactoryInterface::StunConfiguration> stun_config; |
std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turn_config; |
if (!ParseIceServers(configuration.servers, &stun_config, &turn_config)) { |
return false; |
} |
- port_allocator_.reset( |
+ rtc::scoped_ptr<cricket::PortAllocator> allocator( |
allocator_factory->CreatePortAllocator(stun_config, turn_config)); |
+ return Initialize(configuration, constraints, allocator.Pass(), |
+ dtls_identity_store.Pass(), observer); |
+} |
+ |
+bool PeerConnection::Initialize( |
+ const PeerConnectionInterface::RTCConfiguration& configuration, |
+ const MediaConstraintsInterface* constraints, |
+ rtc::scoped_ptr<cricket::PortAllocator> allocator, |
+ rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, |
+ PeerConnectionObserver* observer) { |
+ RTC_DCHECK(observer != nullptr); |
+ if (!observer) { |
+ return false; |
+ } |
+ observer_ = observer; |
+ |
+ port_allocator_ = allocator.Pass(); |
+ |
+ std::vector<PortAllocatorFactoryInterface::StunConfiguration> stun_config; |
+ std::vector<PortAllocatorFactoryInterface::TurnConfiguration> turn_config; |
+ if (!ParseIceServers(configuration.servers, &stun_config, &turn_config)) { |
+ return false; |
+ } |
+ |
+ cricket::ServerAddresses cricket_stuns; |
+ std::vector<cricket::RelayServerConfig> cricket_turns; |
+ ConvertToCricketIceServers(stun_config, turn_config, &cricket_stuns, |
+ &cricket_turns); |
+ port_allocator_->SetIceServers(cricket_stuns, cricket_turns); |
// To handle both internal and externally created port allocator, we will |
// enable BUNDLE here. |
@@ -1086,36 +1150,10 @@ bool PeerConnection::SetConfiguration(const RTCConfiguration& config) { |
return false; |
} |
- std::vector<rtc::SocketAddress> stun_hosts; |
- typedef std::vector<StunConfiguration>::const_iterator StunIt; |
- for (StunIt stun_it = stuns.begin(); stun_it != stuns.end(); ++stun_it) { |
- stun_hosts.push_back(stun_it->server); |
- } |
- |
- rtc::SocketAddress stun_addr; |
- if (!stun_hosts.empty()) { |
- stun_addr = stun_hosts.front(); |
- LOG(LS_INFO) << "SetConfiguration: StunServer Address: " |
- << stun_addr.ToString(); |
- } |
- |
- for (size_t i = 0; i < turns.size(); ++i) { |
- cricket::RelayCredentials credentials(turns[i].username, |
- turns[i].password); |
- cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); |
- cricket::ProtocolType protocol; |
- if (cricket::StringToProto(turns[i].transport_type.c_str(), &protocol)) { |
- relay_server.ports.push_back(cricket::ProtocolAddress( |
- turns[i].server, protocol, turns[i].secure)); |
- relay_server.credentials = credentials; |
- LOG(LS_INFO) << "SetConfiguration: TurnServer Address: " |
- << turns[i].server.ToString(); |
- } else { |
- LOG(LS_WARNING) << "Ignoring TURN server " << turns[i].server << ". " |
- << "Reason= Incorrect " << turns[i].transport_type |
- << " transport parameter."; |
- } |
- } |
+ cricket::ServerAddresses cricket_stuns; |
+ std::vector<cricket::RelayServerConfig> cricket_turns; |
+ ConvertToCricketIceServers(stuns, turns, &cricket_stuns, &cricket_turns); |
+ port_allocator_->SetIceServers(cricket_stuns, cricket_turns); |
} |
session_->SetIceConfig(session_->ParseIceConfig(config)); |
return session_->SetIceTransports(config.type); |