1 /* 2 * libjingle 3 * Copyright 2004--2011, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "talk/app/webrtc/portallocatorfactory.h" 29 30 #include "talk/base/logging.h" 31 #include "talk/base/network.h" 32 #include "talk/base/thread.h" 33 #include "talk/p2p/base/basicpacketsocketfactory.h" 34 #include "talk/p2p/client/basicportallocator.h" 35 36 static const char kUserAgent[] = "PeerConnection User Agent"; 37 38 namespace webrtc { 39 40 using talk_base::scoped_ptr; 41 42 talk_base::scoped_refptr<PortAllocatorFactoryInterface> 43 PortAllocatorFactory::Create( 44 talk_base::Thread* worker_thread) { 45 talk_base::RefCountedObject<PortAllocatorFactory>* allocator = 46 new talk_base::RefCountedObject<PortAllocatorFactory>(worker_thread); 47 return allocator; 48 } 49 50 PortAllocatorFactory::PortAllocatorFactory(talk_base::Thread* worker_thread) 51 : network_manager_(new talk_base::BasicNetworkManager()), 52 socket_factory_(new talk_base::BasicPacketSocketFactory(worker_thread)) { 53 } 54 55 PortAllocatorFactory::~PortAllocatorFactory() {} 56 57 cricket::PortAllocator* PortAllocatorFactory::CreatePortAllocator( 58 const std::vector<StunConfiguration>& stun, 59 const std::vector<TurnConfiguration>& turn) { 60 std::vector<talk_base::SocketAddress> stun_hosts; 61 typedef std::vector<StunConfiguration>::const_iterator StunIt; 62 for (StunIt stun_it = stun.begin(); stun_it != stun.end(); ++stun_it) { 63 stun_hosts.push_back(stun_it->server); 64 } 65 66 talk_base::SocketAddress stun_addr; 67 if (!stun_hosts.empty()) { 68 stun_addr = stun_hosts.front(); 69 } 70 scoped_ptr<cricket::BasicPortAllocator> allocator( 71 new cricket::BasicPortAllocator( 72 network_manager_.get(), socket_factory_.get(), stun_addr)); 73 74 for (size_t i = 0; i < turn.size(); ++i) { 75 cricket::RelayCredentials credentials(turn[i].username, turn[i].password); 76 cricket::RelayServerConfig relay_server(cricket::RELAY_TURN); 77 cricket::ProtocolType protocol; 78 if (cricket::StringToProto(turn[i].transport_type.c_str(), &protocol)) { 79 relay_server.ports.push_back(cricket::ProtocolAddress( 80 turn[i].server, protocol, turn[i].secure)); 81 relay_server.credentials = credentials; 82 allocator->AddRelay(relay_server); 83 } else { 84 LOG(LS_WARNING) << "Ignoring TURN server " << turn[i].server << ". " 85 << "Reason= Incorrect " << turn[i].transport_type 86 << " transport parameter."; 87 } 88 } 89 return allocator.release(); 90 } 91 92 } // namespace webrtc 93