15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P2PSocketDispatcher is a per-renderer object that dispatchers all 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P2P messages received from the browser and relays all P2P messages 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sent to the browser. P2PSocketClient instances register themselves 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the dispatcher using RegisterClient() and UnregisterClient(). 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Relationship of classes. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P2PSocketHost P2PSocketClient 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ^ ^ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | | 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// v IPC v 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P2PSocketDispatcherHost <---------> P2PSocketDispatcher 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P2PSocketDispatcher receives and dispatches messages on the 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IO thread. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_RENDERER_P2P_SOCKET_DISPATCHER_H_ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_P2P_SOCKET_DISPATCHER_H_ 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list_threadsafe.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/common/p2p_socket_type.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_proxy.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPEndPoint; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass NetworkListObserver; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewImpl; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class P2PHostAddressRequest; 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class P2PSocketClientImpl; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT P2PSocketDispatcher 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public IPC::ChannelProxy::MessageFilter { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2PSocketDispatcher(base::MessageLoopProxy* ipc_message_loop); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a new network list observer. Each observer is called 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immidiately after it is registered and then later whenever 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network configuration changes. Can be called on any thread. The 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer is always called on the thread it was added. 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void AddNetworkListObserver(NetworkListObserver* network_list_observer); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes network list observer. Must be called on the thread on 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which the observer was added. 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void RemoveNetworkListObserver(NetworkListObserver* network_list_observer); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~P2PSocketDispatcher(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class P2PHostAddressRequest; 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) friend class P2PSocketClientImpl; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a message asynchronously. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Send(IPC::Message* message); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::ChannelProxy::MessageFilter override. Called on IO thread. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFilterRemoved() OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelClosing() OVERRIDE; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the IO message loop. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy* message_loop(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by P2PSocketClient. 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int RegisterClient(P2PSocketClientImpl* client); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnregisterClient(int id); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendP2PMessage(IPC::Message* msg); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by DnsRequest. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int RegisterHostAddressRequest(P2PHostAddressRequest* request); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnregisterHostAddressRequest(int id); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incoming message handlers. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNetworkListChanged(const net::NetworkInterfaceList& networks); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGetHostAddressResult(int32 request_id, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::IPAddressNumber& address); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSocketCreated(int socket_id, const net::IPEndPoint& address); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnIncomingTcpConnection(int socket_id, const net::IPEndPoint& address); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnSendComplete(int socket_id); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnError(int socket_id); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDataReceived(int socket_id, const net::IPEndPoint& address, 103d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const std::vector<char>& data, 104d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const base::TimeTicks& timestamp); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) P2PSocketClientImpl* GetClient(int socket_id); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> message_loop_; 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IDMap<P2PSocketClientImpl> clients_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDMap<P2PHostAddressRequest> host_address_requests_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool network_notifications_started_; 114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_refptr<ObserverListThreadSafe<NetworkListObserver> > 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_list_observers_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Channel* channel_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(P2PSocketDispatcher); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_RENDERER_P2P_SOCKET_DISPATCHER_H_ 125