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