1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_ 6 #define CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_ 7 8 #include "base/memory/ref_counted.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "net/base/net_util.h" 11 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 12 #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" 13 14 namespace blink { 15 class WebFrame; 16 class WebURLLoader; 17 } // namespace blink 18 19 namespace content { 20 21 class P2PHostAddressRequest; 22 class P2PPortAllocatorSession; 23 class P2PSocketDispatcher; 24 25 // TODO(sergeyu): There is overlap between this class and HttpPortAllocator. 26 // Refactor this class to inherit from HttpPortAllocator to avoid code 27 // duplication. 28 class P2PPortAllocator : public cricket::BasicPortAllocator { 29 public: 30 struct Config { 31 Config(); 32 ~Config(); 33 34 struct RelayServerConfig { 35 RelayServerConfig(); 36 ~RelayServerConfig(); 37 38 std::string username; 39 std::string password; 40 std::string server_address; 41 int port; 42 std::string transport_type; 43 bool secure; 44 }; 45 46 std::set<rtc::SocketAddress> stun_servers; 47 48 std::vector<RelayServerConfig> relays; 49 50 bool legacy_relay; 51 // Disable TCP-based transport when set to true. 52 bool disable_tcp_transport; 53 }; 54 55 P2PPortAllocator(blink::WebFrame* web_frame, 56 P2PSocketDispatcher* socket_dispatcher, 57 rtc::NetworkManager* network_manager, 58 rtc::PacketSocketFactory* socket_factory, 59 const Config& config); 60 virtual ~P2PPortAllocator(); 61 62 virtual cricket::PortAllocatorSession* CreateSessionInternal( 63 const std::string& content_name, 64 int component, 65 const std::string& ice_username_fragment, 66 const std::string& ice_password) OVERRIDE; 67 68 private: 69 friend class P2PPortAllocatorSession; 70 71 blink::WebFrame* web_frame_; 72 P2PSocketDispatcher* socket_dispatcher_; 73 Config config_; 74 75 DISALLOW_COPY_AND_ASSIGN(P2PPortAllocator); 76 }; 77 78 class P2PPortAllocatorSession : public cricket::BasicPortAllocatorSession, 79 public blink::WebURLLoaderClient { 80 public: 81 P2PPortAllocatorSession( 82 P2PPortAllocator* allocator, 83 const std::string& content_name, 84 int component, 85 const std::string& ice_username_fragment, 86 const std::string& ice_password); 87 virtual ~P2PPortAllocatorSession(); 88 89 // blink::WebURLLoaderClient overrides. 90 virtual void didReceiveData(blink::WebURLLoader* loader, 91 const char* data, 92 int data_length, 93 int encoded_data_length) OVERRIDE; 94 virtual void didFinishLoading(blink::WebURLLoader* loader, 95 double finish_time, 96 int64_t total_encoded_data_length) OVERRIDE; 97 virtual void didFail(blink::WebURLLoader* loader, 98 const blink::WebURLError& error) OVERRIDE; 99 100 protected: 101 // Overrides for cricket::BasicPortAllocatorSession. 102 virtual void GetPortConfigurations() OVERRIDE; 103 104 private: 105 // This method allocates non-TURN relay sessions. 106 void AllocateLegacyRelaySession(); 107 void ParseRelayResponse(); 108 109 void AddConfig(); 110 111 P2PPortAllocator* allocator_; 112 113 scoped_ptr<blink::WebURLLoader> relay_session_request_; 114 int relay_session_attempts_; 115 std::string relay_session_response_; 116 rtc::SocketAddress relay_ip_; 117 int relay_udp_port_; 118 int relay_tcp_port_; 119 int relay_ssltcp_port_; 120 int pending_relay_requests_; 121 122 DISALLOW_COPY_AND_ASSIGN(P2PPortAllocatorSession); 123 }; 124 125 } // namespace content 126 127 #endif // CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_ 128