summaryrefslogtreecommitdiffstats
path: root/remoting/client/plugin
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-17 04:36:00 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-17 04:36:00 +0000
commit0eff7727fd699c861273b13039b37e6bcbe92217 (patch)
treee05d933fe1215132f41a854ef63b707d58d1d6d7 /remoting/client/plugin
parentccc1179e33ec493230fd19fdbdba3c4084bc8b9a (diff)
downloadchromium_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.cc112
-rw-r--r--remoting/client/plugin/pepper_network_manager.h49
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_