diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-17 04:36:00 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-17 04:36:00 +0000 |
commit | 0eff7727fd699c861273b13039b37e6bcbe92217 (patch) | |
tree | e05d933fe1215132f41a854ef63b707d58d1d6d7 /remoting/client/plugin | |
parent | ccc1179e33ec493230fd19fdbdba3c4084bc8b9a (diff) | |
download | chromium_src-0eff7727fd699c861273b13039b37e6bcbe92217.zip chromium_src-0eff7727fd699c861273b13039b37e6bcbe92217.tar.gz chromium_src-0eff7727fd699c861273b13039b37e6bcbe92217.tar.bz2 |
Move PepperNetworkManager to client/plugin
Review URL: http://codereview.chromium.org/10103016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132533 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/client/plugin')
-rw-r--r-- | remoting/client/plugin/pepper_network_manager.cc | 112 | ||||
-rw-r--r-- | remoting/client/plugin/pepper_network_manager.h | 49 |
2 files changed, 161 insertions, 0 deletions
diff --git a/remoting/client/plugin/pepper_network_manager.cc b/remoting/client/plugin/pepper_network_manager.cc new file mode 100644 index 0000000..20dbd43 --- /dev/null +++ b/remoting/client/plugin/pepper_network_manager.cc @@ -0,0 +1,112 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "remoting/client/plugin/pepper_network_manager.h" + +#include "base/bind.h" +#include "base/message_loop.h" +#include "ppapi/cpp/module.h" +#include "ppapi/cpp/private/network_list_private.h" +#include "ppapi/cpp/private/net_address_private.h" + +namespace remoting { + +PepperNetworkManager::PepperNetworkManager(const pp::InstanceHandle& instance) + : monitor_(instance, &PepperNetworkManager::OnNetworkListCallbackHandler, + this), + start_count_(0), + network_list_received_(false), + ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { +} + +PepperNetworkManager::~PepperNetworkManager() { + DCHECK(!start_count_); +} + +void PepperNetworkManager::StartUpdating() { + if (network_list_received_) { + // Post a task to avoid reentrancy. + MessageLoop::current()->PostTask( + FROM_HERE, base::Bind(&PepperNetworkManager::SendNetworksChangedSignal, + weak_factory_.GetWeakPtr())); + } + ++start_count_; +} + +void PepperNetworkManager::StopUpdating() { + DCHECK_GT(start_count_, 0); + --start_count_; +} + +// static +void PepperNetworkManager::OnNetworkListCallbackHandler( + void* user_data, + PP_Resource list_resource) { + PepperNetworkManager* object = static_cast<PepperNetworkManager*>(user_data); + pp::NetworkListPrivate list(list_resource); + object->OnNetworkList(list); + pp::Module::Get()->core()->ReleaseResource(list_resource); +} + +void PepperNetworkManager::OnNetworkList(const pp::NetworkListPrivate& list) { + network_list_received_ = true; + + std::vector<talk_base::Network*> networks; + size_t count = list.GetCount(); + for (size_t i = 0; i < count; i++) { + std::vector<PP_NetAddress_Private> addresses; + list.GetIpAddresses(i, &addresses); + + if (addresses.size() == 0) + continue; + + char address_bytes[sizeof(in6_addr)]; + if (!pp::NetAddressPrivate::GetAddress( + addresses[0], &address_bytes, sizeof(address_bytes))) { + LOG(ERROR) << "Failed to get address for network interface."; + continue; + } + + int prefix_length; + + // TODO(sergeyu): Copy all addresses, not only the first one. + talk_base::IPAddress address; + switch (pp::NetAddressPrivate::GetFamily(addresses[0])) { + case PP_NETADDRESSFAMILY_IPV4: { + in_addr* address_ipv4 = reinterpret_cast<in_addr*>(address_bytes); + address = talk_base::IPAddress(*address_ipv4); + prefix_length = sizeof(in_addr) * 8; + break; + } + + case PP_NETADDRESSFAMILY_IPV6: { + in6_addr* address_ipv6 = reinterpret_cast<in6_addr*>(address_bytes); + address = talk_base::IPAddress(*address_ipv6); + prefix_length = sizeof(in6_addr) * 8; + break; + } + + default: + LOG(WARNING) << "Skipping address with unknown family: " + << pp::NetAddressPrivate::GetFamily(addresses[0]); + continue; + } + + talk_base::Network* network = new talk_base::Network( + list.GetName(i), list.GetDisplayName(i), address, prefix_length); + network->AddIP(address); + networks.push_back(network); + } + + bool changed = false; + MergeNetworkList(networks, &changed); + if (changed) + SignalNetworksChanged(); +} + +void PepperNetworkManager::SendNetworksChangedSignal() { + SignalNetworksChanged(); +} + +} // namespace remoting diff --git a/remoting/client/plugin/pepper_network_manager.h b/remoting/client/plugin/pepper_network_manager.h new file mode 100644 index 0000000..d992358 --- /dev/null +++ b/remoting/client/plugin/pepper_network_manager.h @@ -0,0 +1,49 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_CLIENT_PLUGIN_PEPPER_NETWORK_MANAGER_H_ +#define REMOTING_CLIENT_PLUGIN_PEPPER_NETWORK_MANAGER_H_ + +#include "base/compiler_specific.h" +#include "base/memory/weak_ptr.h" +#include "ppapi/cpp/instance_handle.h" +#include "ppapi/cpp/private/network_monitor_private.h" +#include "third_party/libjingle/source/talk/base/network.h" + +namespace pp { +class NetworkListPrivate; +} // namespace pp + +namespace remoting { + +// PepperNetworkManager uses the PPB_NetworkMonitor_Private API to +// implement the NetworkManager interface that libjingle uses to +// monitor the host system's network interfaces. +class PepperNetworkManager : public talk_base::NetworkManagerBase { + public: + PepperNetworkManager(const pp::InstanceHandle& instance); + virtual ~PepperNetworkManager(); + + // NetworkManager interface. + virtual void StartUpdating() OVERRIDE; + virtual void StopUpdating() OVERRIDE; + + private: + static void OnNetworkListCallbackHandler(void* user_data, + PP_Resource list_resource); + + void OnNetworkList(const pp::NetworkListPrivate& list); + + void SendNetworksChangedSignal(); + + pp::NetworkMonitorPrivate monitor_; + int start_count_; + bool network_list_received_; + + base::WeakPtrFactory<PepperNetworkManager> weak_factory_; +}; + +} // namespace remoting + +#endif // REMOTING_CLIENT_PLUGIN_PEPPER_NETWORK_MANAGER_H_ |