Chromium Code Reviews| Index: webrtc/p2p/stunprober/stunprober.h |
| diff --git a/webrtc/p2p/stunprober/stunprober.h b/webrtc/p2p/stunprober/stunprober.h |
| index d773d5760ea612c2d3bda3a4caaa6780d41bc29c..9eda755f2937de8c649fe2bd2121e3f5ce40e0f9 100644 |
| --- a/webrtc/p2p/stunprober/stunprober.h |
| +++ b/webrtc/p2p/stunprober/stunprober.h |
| @@ -15,20 +15,32 @@ |
| #include <string> |
| #include <vector> |
| +#include "webrtc/base/asyncinvoker.h" |
| #include "webrtc/base/basictypes.h" |
| #include "webrtc/base/bytebuffer.h" |
| #include "webrtc/base/callback.h" |
| #include "webrtc/base/ipaddress.h" |
| +#include "webrtc/base/network.h" |
| #include "webrtc/base/scoped_ptr.h" |
| #include "webrtc/base/socketaddress.h" |
| +#include "webrtc/base/thread.h" |
| #include "webrtc/base/thread_checker.h" |
| #include "webrtc/typedefs.h" |
| +namespace rtc { |
| +class AsyncPacketSocket; |
| +class PacketSocketFactory; |
| +class Thread; |
| +class NetworkManager; |
| +} // namespace rtc |
| + |
| namespace stunprober { |
| +class StunProber; |
| + |
| static const int kMaxUdpBufferSize = 1200; |
| -typedef rtc::Callback1<void, int> AsyncCallback; |
| +typedef rtc::Callback2<void, StunProber*, int> AsyncCallback; |
| enum NatType { |
| NATTYPE_INVALID, |
| @@ -38,104 +50,7 @@ enum NatType { |
| NATTYPE_NON_SYMMETRIC // Behind a non-symmetric NAT. |
| }; |
| -class HostNameResolverInterface { |
| - public: |
| - HostNameResolverInterface() {} |
| - |
| - // Resolve should allow re-entry as |callback| could trigger another |
| - // Resolve(). |
| - virtual void Resolve(const rtc::SocketAddress& addr, |
| - std::vector<rtc::SocketAddress>* addresses, |
| - AsyncCallback callback) = 0; |
| - |
| - virtual ~HostNameResolverInterface() {} |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(HostNameResolverInterface); |
| -}; |
| - |
| -// Chrome has client and server socket. Client socket supports Connect but not |
| -// Bind. Server is opposite. |
| -class SocketInterface { |
| - public: |
| - enum { |
| - IO_PENDING = -1, |
| - FAILED = -2, |
| - }; |
| - SocketInterface() {} |
| - virtual void Close() = 0; |
| - virtual ~SocketInterface() {} |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(SocketInterface); |
| -}; |
| - |
| -class ClientSocketInterface : public SocketInterface { |
| - public: |
| - ClientSocketInterface() {} |
| - // Even though we have SendTo and RecvFrom, if Connect is not called first, |
| - // getsockname will only return 0.0.0.0. |
| - virtual int Connect(const rtc::SocketAddress& addr) = 0; |
| - |
| - virtual int GetLocalAddress(rtc::SocketAddress* local_address) = 0; |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(ClientSocketInterface); |
| -}; |
| - |
| -class ServerSocketInterface : public SocketInterface { |
| - public: |
| - ServerSocketInterface() {} |
| - |
| - virtual int SendTo(const rtc::SocketAddress& addr, |
| - char* buf, |
| - size_t buf_len, |
| - AsyncCallback callback) = 0; |
| - |
| - // If the returned value is positive, it means that buf has been |
| - // sent. Otherwise, it should return IO_PENDING. Callback will be invoked |
| - // after the data is successfully read into buf. |
| - virtual int RecvFrom(char* buf, |
| - size_t buf_len, |
| - rtc::SocketAddress* addr, |
| - AsyncCallback callback) = 0; |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(ServerSocketInterface); |
| -}; |
| - |
| -class SocketFactoryInterface { |
| - public: |
| - SocketFactoryInterface() {} |
| - // To provide a chance to prepare the sockets that we need. This is |
| - // implemented for chrome renderer process as the socket needs to be ready to |
| - // use in browser process. |
| - virtual void Prepare(size_t total_client_socket, |
| - size_t total_server_socket, |
| - AsyncCallback callback) { |
| - callback(0); |
| - } |
| - virtual ClientSocketInterface* CreateClientSocket() = 0; |
| - virtual ServerSocketInterface* CreateServerSocket( |
| - size_t send_buffer_size, |
| - size_t receive_buffer_size) = 0; |
| - virtual ~SocketFactoryInterface() {} |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(SocketFactoryInterface); |
| -}; |
| - |
| -class TaskRunnerInterface { |
| - public: |
| - TaskRunnerInterface() {} |
| - virtual void PostTask(rtc::Callback0<void>, uint32_t delay_ms) = 0; |
| - virtual ~TaskRunnerInterface() {} |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(TaskRunnerInterface); |
| -}; |
| - |
| -class StunProber { |
| +class StunProber : public sigslot::has_slots<> { |
| public: |
| enum Status { // Used in UMA_HISTOGRAM_ENUMERATION. |
| SUCCESS, // Successfully received bytes from the server. |
| @@ -167,11 +82,9 @@ class StunProber { |
| std::set<std::string> srflx_addrs; |
| }; |
| - // StunProber is not thread safe. It's task_runner's responsibility to ensure |
| - // all calls happen sequentially. |
| - StunProber(HostNameResolverInterface* host_name_resolver, |
| - SocketFactoryInterface* socket_factory, |
| - TaskRunnerInterface* task_runner); |
| + StunProber(rtc::PacketSocketFactory* socket_factory, |
| + rtc::Thread* thread, |
| + const rtc::NetworkManager::NetworkList& networks); |
| virtual ~StunProber(); |
| // Begin performing the probe test against the |servers|. If |
| @@ -203,16 +116,19 @@ class StunProber { |
| // STUN servers. |
| class Requester; |
| - void OnServerResolved(int index, int result); |
| + bool ResolveServerName(const rtc::SocketAddress& addr); |
| + void OnServerResolved(rtc::AsyncResolverInterface* resolver); |
| + |
| + void OnSocketReady(rtc::AsyncPacketSocket* socket, |
| + const rtc::SocketAddress& addr); |
| bool Done() { |
| - return num_request_sent_ >= requests_per_ip_ * all_servers_ips_.size(); |
| + return num_request_sent_ >= requests_per_ip_ * all_servers_addrs_.size(); |
| } |
| - int GetTotalClientSockets() { return 1; } |
| - int GetTotalServerSockets() { |
| - return static_cast<int>( |
| - (shared_socket_mode_ ? 1 : all_servers_ips_.size()) * requests_per_ip_); |
| + size_t total_socket_required() { |
| + return (shared_socket_mode_ ? 1 : all_servers_addrs_.size()) * |
| + requests_per_ip_; |
| } |
| bool SendNextRequest(); |
| @@ -223,14 +139,7 @@ class StunProber { |
| // End the probe with the given |status|. Invokes |fininsh_callback|, which |
| // may destroy the class. |
| - void End(StunProber::Status status, int result); |
| - |
| - // Create a socket, connect to the first resolved server, and return the |
| - // result of getsockname(). All Requesters will bind to this name. We do this |
| - // because if a socket is not bound nor connected, getsockname will return |
| - // 0.0.0.0. We can't connect to a single STUN server IP either as that will |
| - // fail subsequent requests in shared mode. |
| - int GetLocalAddress(rtc::IPAddress* addr); |
| + void End(StunProber::Status status); |
| Requester* CreateRequester(); |
| @@ -256,19 +165,12 @@ class StunProber { |
| // STUN server name to be resolved. |
| std::vector<rtc::SocketAddress> servers_; |
| - // The local address that each probing socket will be bound to. |
| - rtc::IPAddress local_addr_; |
| + // Weak references. |
| + rtc::PacketSocketFactory* socket_factory_; |
| + rtc::Thread* thread_; |
| - // Owned pointers. |
| - rtc::scoped_ptr<SocketFactoryInterface> socket_factory_; |
| - rtc::scoped_ptr<HostNameResolverInterface> resolver_; |
| - rtc::scoped_ptr<TaskRunnerInterface> task_runner_; |
| - |
| - // Addresses filled out by HostNameResolver for a single server. |
| - std::vector<rtc::SocketAddress> resolved_ips_; |
| - |
| - // Accumulate all resolved IPs. |
| - std::vector<rtc::SocketAddress> all_servers_ips_; |
| + // Accumulate all resolved addresses. |
| + std::vector<rtc::SocketAddress> all_servers_addrs_; |
| // Caller-supplied callback executed when testing is completed, called by |
| // End(). |
| @@ -279,6 +181,14 @@ class StunProber { |
| rtc::ThreadChecker thread_checker_; |
| + // Keep track of ready sockets which will be used in creation of Requester. |
| + std::vector<rtc::AsyncPacketSocket*> sockets_; |
| + size_t total_ready_sockets_ = 0; |
|
pthatcher1
2015/06/18 20:26:59
How is total_ready_sockets_ different than sockets
guoweis_left_chromium
2015/06/18 20:39:38
total_ready_sockets always <= then sockets_.size()
|
| + |
| + rtc::AsyncInvoker invoker_; |
| + |
| + rtc::NetworkManager::NetworkList networks_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(StunProber); |
| }; |