// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_ #define CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "net/base/net_util.h" #include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLLoaderClient.h" namespace WebKit { class WebFrame; class WebURLLoader; } // namespace WebKit namespace content { class P2PHostAddressRequest; class P2PPortAllocatorSession; class P2PSocketDispatcher; // TODO(sergeyu): There is overlap between this class and HttpPortAllocator. // Refactor this class to inherit from HttpPortAllocator to avoid code // duplication. class P2PPortAllocator : public cricket::BasicPortAllocator { public: struct Config { Config(); ~Config(); // STUN server address and port. std::string stun_server; int stun_server_port; // Relay server address and port. std::string relay_server; int relay_server_port; // Relay server username. std::string relay_username; // Relay server password. std::string relay_password; // When set to true relay is a legacy Google relay (not TURN compliant). bool legacy_relay; // Disable TCP-based transport when set to true. bool disable_tcp_transport; }; P2PPortAllocator(WebKit::WebFrame* web_frame, P2PSocketDispatcher* socket_dispatcher, talk_base::NetworkManager* network_manager, talk_base::PacketSocketFactory* socket_factory, const Config& config); virtual ~P2PPortAllocator(); virtual cricket::PortAllocatorSession* CreateSessionInternal( const std::string& content_name, int component, const std::string& ice_username_fragment, const std::string& ice_password) OVERRIDE; private: friend class P2PPortAllocatorSession; WebKit::WebFrame* web_frame_; P2PSocketDispatcher* socket_dispatcher_; Config config_; DISALLOW_COPY_AND_ASSIGN(P2PPortAllocator); }; class P2PPortAllocatorSession : public cricket::BasicPortAllocatorSession, public WebKit::WebURLLoaderClient { public: P2PPortAllocatorSession( P2PPortAllocator* allocator, const std::string& content_name, int component, const std::string& ice_username_fragment, const std::string& ice_password); virtual ~P2PPortAllocatorSession(); // WebKit::WebURLLoaderClient overrides. virtual void didReceiveData(WebKit::WebURLLoader* loader, const char* data, int data_length, int encoded_data_length) OVERRIDE; virtual void didFinishLoading(WebKit::WebURLLoader* loader, double finish_time) OVERRIDE; virtual void didFail(WebKit::WebURLLoader* loader, const WebKit::WebURLError& error) OVERRIDE; protected: // Overrides for cricket::BasicPortAllocatorSession. virtual void GetPortConfigurations() OVERRIDE; private: void ResolveStunServerAddress(); void OnStunServerAddress(const net::IPAddressNumber& address); void AllocateRelaySession(); void ParseRelayResponse(); void AddConfig(); P2PPortAllocator* allocator_; scoped_refptr stun_address_request_; talk_base::SocketAddress stun_server_address_; scoped_ptr relay_session_request_; int relay_session_attempts_; std::string relay_session_response_; talk_base::SocketAddress relay_ip_; int relay_udp_port_; int relay_tcp_port_; int relay_ssltcp_port_; DISALLOW_COPY_AND_ASSIGN(P2PPortAllocatorSession); }; } // namespace content #endif // CONTENT_RENDERER_P2P_PORT_ALLOCATOR_H_