pepper_network_manager.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright (c) 2012 The Chromium Authors. All rights reserved. 279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Use of this source code is governed by a BSD-style license that can be 30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// found in the LICENSE file. 40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "remoting/client/plugin/pepper_network_manager.h" 60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/bind.h" 80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/location.h" 90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/single_thread_task_runner.h" 100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "base/thread_task_runner_handle.h" 110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ppapi/cpp/module.h" 120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ppapi/cpp/net_address.h" 130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "ppapi/cpp/network_list.h" 140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "remoting/client/plugin/pepper_util.h" 150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "third_party/libjingle/source/talk/base/socketaddress.h" 160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace remoting { 180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongPepperNetworkManager::PepperNetworkManager(const pp::InstanceHandle& instance) 200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : monitor_(instance), 210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong start_count_(0), 220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong network_list_received_(false), 230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong callback_factory_(this), 240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong weak_factory_(this) { 250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pp::CompletionCallbackWithOutput<pp::NetworkList> callback = 260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong callback_factory_.NewCallbackWithOutput( 270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &PepperNetworkManager::OnNetworkList); 280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong monitor_.UpdateNetworkList(callback); 291d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling} 301d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 3179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos HernandezPepperNetworkManager::~PepperNetworkManager() { 3279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez DCHECK(!start_count_); 3379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 3479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 3579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezvoid PepperNetworkManager::StartUpdating() { 3679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez if (network_list_received_) { 3779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez // Post a task to avoid reentrancy. 3879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez base::ThreadTaskRunnerHandle::Get()->PostTask( 3979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez FROM_HERE, base::Bind(&PepperNetworkManager::SendNetworksChangedSignal, 4079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez weak_factory_.GetWeakPtr())); 4179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez } 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++start_count_; 4379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 4479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PepperNetworkManager::StopUpdating() { 4679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez DCHECK_GT(start_count_, 0); 4779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez --start_count_; 4879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez} 4979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PepperNetworkManager::OnNetworkList(int32_t result, 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const pp::NetworkList& list) { 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result != PP_OK) { 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SignalError(); 5479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez return; 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DCHECK(!list.is_null()); 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong network_list_received_ = true; 5979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 60 // Request for the next update. 61 pp::CompletionCallbackWithOutput<pp::NetworkList> callback = 62 callback_factory_.NewCallbackWithOutput( 63 &PepperNetworkManager::OnNetworkList); 64 monitor_.UpdateNetworkList(callback); 65 66 // Convert the networks to talk_base::Network. 67 std::vector<talk_base::Network*> networks; 68 size_t count = list.GetCount(); 69 for (size_t i = 0; i < count; i++) { 70 std::vector<pp::NetAddress> addresses; 71 list.GetIpAddresses(i, &addresses); 72 73 if (addresses.size() == 0) 74 continue; 75 76 for (size_t i = 0; i < addresses.size(); ++i) { 77 talk_base::SocketAddress address; 78 PpNetAddressToSocketAddress(addresses[i], &address); 79 talk_base::Network* network = new talk_base::Network( 80 list.GetName(i), list.GetDisplayName(i), address.ipaddr(), 0); 81 network->AddIP(address.ipaddr()); 82 networks.push_back(network); 83 } 84 } 85 86 bool changed = false; 87 MergeNetworkList(networks, &changed); 88 if (changed) 89 SignalNetworksChanged(); 90} 91 92void PepperNetworkManager::SendNetworksChangedSignal() { 93 SignalNetworksChanged(); 94} 95 96} // namespace remoting 97