15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Copyright 2011 Google Inc. All Rights Reserved. 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <map> 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/network.h" 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/basictypes.h" 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/messagehandler.h" 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/proxyinfo.h" 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/scoped_ptr.h" 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h" 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/socketaddress.h" 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/basicpacketsocketfactory.h" 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/client/httpportallocator.h" 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass AsyncHttpRequest; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass AutoDetectProxy; 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BasicPacketSocketFactory; 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NetworkManager; 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PacketSocketFactory; 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass SignalThread; 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestHttpPortAllocatorSession; 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Thread; 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket { 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass HttpPortAllocator; 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Port; 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PortAllocatorSession; 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct PortConfiguration; 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass RelayPort; 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass StunPort; 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains details about a discovered firewall that are of interest 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// when debugging call failures. 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct FirewallInfo { 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string brand; 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string model; 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO: List of current port mappings. 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains details about a specific connect attempt. 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct ConnectInfo { 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo() 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : rtt(-1), error(0) {} 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Time when the connection was initiated. Needed for calculating 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the round trip time. 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 start_time_ms; 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Round trip time in milliseconds or -1 for failed connection. 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int32 rtt; 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Error code representing low level errors like socket errors. 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int error; 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Identifier for a network interface and proxy address pair. 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct NicId { 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org NicId(const talk_base::IPAddress& ip, 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const talk_base::SocketAddress& proxy_address) 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : ip(ip), 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org proxy_address(proxy_address) { 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::IPAddress ip; 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress proxy_address; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Comparator implementation identifying unique network interface and 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// proxy address pairs. 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NicIdComparator { 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int compare(const NicId &first, const NicId &second) const { 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (first.ip == second.ip) { 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Compare proxy address. 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (first.proxy_address == second.proxy_address) { 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return 0; 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return first.proxy_address < second.proxy_address? -1 : 1; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return first.ip < second.ip ? -1 : 1; 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool operator()(const NicId &first, const NicId &second) const { 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return (compare(first, second) < 0); 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Contains information of a network interface and proxy address pair. 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct NicInfo { 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org NicInfo() {} 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::IPAddress ip; 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::ProxyInfo proxy_info; 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress external_address; 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress stun_server_address; 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress media_server_address; 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo stun; 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo http; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo https; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo udp; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo tcp; 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectInfo ssltcp; 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FirewallInfo firewall; 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Holds the result of the connectivity check. 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass NicMap : public std::map<NicId, NicInfo, NicIdComparator> { 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestHttpPortAllocatorSession : public HttpPortAllocatorSession { 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestHttpPortAllocatorSession( 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HttpPortAllocator* allocator, 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& content_name, 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int component, 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& ice_ufrag, 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& ice_pwd, 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::vector<talk_base::SocketAddress>& stun_hosts, 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::vector<std::string>& relay_hosts, 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& relay_token, 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& user_agent) 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : HttpPortAllocatorSession( 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org allocator, content_name, component, ice_ufrag, ice_pwd, stun_hosts, 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org relay_hosts, relay_token, user_agent) { 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_proxy(const talk_base::ProxyInfo& proxy) { 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org proxy_ = proxy; 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void ConfigReady(PortConfiguration* config); 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRequestDone(talk_base::SignalThread* data); 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal4<const std::string&, const std::string&, 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const PortConfiguration*, 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const talk_base::ProxyInfo&> SignalConfigReady; 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal1<talk_base::AsyncHttpRequest*> SignalRequestDone; 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::ProxyInfo proxy_; 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Runs a request/response check on all network interface and proxy 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// address combinations. The check is considered done either when all 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// checks has been successful or when the check times out. 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ConnectivityChecker 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : public talk_base::MessageHandler, public sigslot::has_slots<> { 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ConnectivityChecker(talk_base::Thread* worker, 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& jid, 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& session_id, 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& user_agent, 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& relay_token, 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& connection); 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~ConnectivityChecker(); 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Virtual for gMock. 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool Initialize(); 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void Start(); 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // MessageHandler implementation. 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void OnMessage(talk_base::Message *msg); 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Instruct checker to stop and wait until that's done. 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Virtual for gMock. 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void Stop() { 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org worker_->Stop(); 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const NicMap& GetResults() const { 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return nics_; 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_timeout_ms(uint32 timeout) { 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_ms_ = timeout; 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_stun_address(const talk_base::SocketAddress& stun_address) { 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stun_address_ = stun_address; 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& connection() const { 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return connection_; 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& jid() const { 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return jid_; 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& session_id() const { 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return session_id_; 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Context: Main Thread. Signalled when the connectivity check is complete. 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal1<ConnectivityChecker*> SignalCheckDone; 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Can be overridden for test. 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual talk_base::NetworkManager* CreateNetworkManager() { 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return new talk_base::BasicNetworkManager(); 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual talk_base::BasicPacketSocketFactory* CreateSocketFactory( 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* thread) { 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return new talk_base::BasicPacketSocketFactory(thread); 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual HttpPortAllocator* CreatePortAllocator( 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::NetworkManager* network_manager, 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& user_agent, 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& relay_token); 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual StunPort* CreateStunPort( 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& username, const std::string& password, 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const PortConfiguration* config, talk_base::Network* network); 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual RelayPort* CreateRelayPort( 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& username, const std::string& password, 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const PortConfiguration* config, talk_base::Network* network); 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void InitiateProxyDetection(); 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SetProxyInfo(const talk_base::ProxyInfo& info); 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual talk_base::ProxyInfo GetProxyInfo() const; 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* worker() { 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return worker_; 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool AddNic(const talk_base::IPAddress& ip, 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const talk_base::SocketAddress& proxy_address); 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AllocatePorts(); 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AllocateRelayPorts(); 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CheckNetworks(); 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CreateRelayPorts( 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& username, const std::string& password, 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const PortConfiguration* config, const talk_base::ProxyInfo& proxy_info); 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Must be called by the worker thread. 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void CleanUp(); 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRequestDone(talk_base::AsyncHttpRequest* request); 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRelayPortComplete(Port* port); 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnStunPortComplete(Port* port); 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRelayPortError(Port* port); 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnStunPortError(Port* port); 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnNetworksChanged(); 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnProxyDetect(talk_base::SignalThread* thread); 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnConfigReady( 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& username, const std::string& password, 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const PortConfiguration* config, const talk_base::ProxyInfo& proxy); 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnConfigWithProxyReady(const PortConfiguration*); 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void RegisterHttpStart(int port); 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* worker_; 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string jid_; 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string session_id_; 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string user_agent_; 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string relay_token_; 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string connection_; 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::AutoDetectProxy* proxy_detect_; 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::NetworkManager> network_manager_; 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<talk_base::BasicPacketSocketFactory> socket_factory_; 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<HttpPortAllocator> port_allocator_; 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org NicMap nics_; 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<Port*> ports_; 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<PortAllocatorSession*> sessions_; 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uint32 timeout_ms_; 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketAddress stun_address_; 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* main_; 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool started_; 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace cricket 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_P2P_CLIENT_CONNECTIVITYCHECKER_H_ 275