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 #include "content/renderer/p2p/ipc_network_manager.h" 6 7 #include "base/bind.h" 8 #include "base/sys_byteorder.h" 9 #include "net/base/net_util.h" 10 11 namespace content { 12 13 IpcNetworkManager::IpcNetworkManager(P2PSocketDispatcher* socket_dispatcher) 14 : socket_dispatcher_(socket_dispatcher), 15 start_count_(0), 16 network_list_received_(false), 17 weak_factory_(this) { 18 socket_dispatcher_->AddNetworkListObserver(this); 19 } 20 21 IpcNetworkManager::~IpcNetworkManager() { 22 DCHECK(!start_count_); 23 socket_dispatcher_->RemoveNetworkListObserver(this); 24 } 25 26 void IpcNetworkManager::StartUpdating() { 27 if (network_list_received_) { 28 // Post a task to avoid reentrancy. 29 base::MessageLoop::current()->PostTask( 30 FROM_HERE, 31 base::Bind(&IpcNetworkManager::SendNetworksChangedSignal, 32 weak_factory_.GetWeakPtr())); 33 } 34 ++start_count_; 35 } 36 37 void IpcNetworkManager::StopUpdating() { 38 DCHECK_GT(start_count_, 0); 39 --start_count_; 40 } 41 42 void IpcNetworkManager::OnNetworkListChanged( 43 const net::NetworkInterfaceList& list) { 44 45 // Update flag if network list received for the first time. 46 if (!network_list_received_) 47 network_list_received_ = true; 48 49 std::vector<talk_base::Network*> networks; 50 for (net::NetworkInterfaceList::const_iterator it = list.begin(); 51 it != list.end(); it++) { 52 uint32 address; 53 if (it->address.size() != net::kIPv4AddressSize) 54 continue; 55 memcpy(&address, &it->address[0], sizeof(uint32)); 56 address = talk_base::NetworkToHost32(address); 57 talk_base::Network* network = new talk_base::Network( 58 it->name, it->name, talk_base::IPAddress(address), 32); 59 network->AddIP(talk_base::IPAddress(address)); 60 networks.push_back(network); 61 } 62 63 bool changed = false; 64 MergeNetworkList(networks, &changed); 65 if (changed) 66 SignalNetworksChanged(); 67 } 68 69 void IpcNetworkManager::SendNetworksChangedSignal() { 70 SignalNetworksChanged(); 71 } 72 73 } // namespace content 74