Home | History | Annotate | Download | only in p2p
      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