| Index: native_client_sdk/src/examples/api/network_monitor/network_monitor.cc
|
| diff --git a/native_client_sdk/src/examples/api/network_monitor/network_monitor.cc b/native_client_sdk/src/examples/api/network_monitor/network_monitor.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b18226a38a5d37c829ecddd29af91ee704b949e2
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/examples/api/network_monitor/network_monitor.cc
|
| @@ -0,0 +1,155 @@
|
| +// Copyright (c) 2013 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 <stdio.h>
|
| +#include <string.h>
|
| +#include <sstream>
|
| +
|
| +#include "ppapi/cpp/instance.h"
|
| +#include "ppapi/cpp/module.h"
|
| +#include "ppapi/cpp/net_address.h"
|
| +#include "ppapi/cpp/network_list.h"
|
| +#include "ppapi/cpp/network_monitor.h"
|
| +#include "ppapi/cpp/var.h"
|
| +#include "ppapi/cpp/var_array.h"
|
| +#include "ppapi/cpp/var_dictionary.h"
|
| +#include "ppapi/utility/completion_callback_factory.h"
|
| +
|
| +#ifdef WIN32
|
| +#undef PostMessage
|
| +// Allow 'this' in initializer list
|
| +#pragma warning(disable : 4355)
|
| +#endif
|
| +
|
| +class NetworkMonitorInstance : public pp::Instance {
|
| + public:
|
| + explicit NetworkMonitorInstance(PP_Instance instance)
|
| + : pp::Instance(instance),
|
| + callback_factory_(this),
|
| + network_monitor_(this) {}
|
| +
|
| + virtual ~NetworkMonitorInstance() {}
|
| + virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
|
| +
|
| + private:
|
| + virtual void OnUpdateNetworkList(int32_t result,
|
| + pp::NetworkList network_list);
|
| + static std::string GetNetworkStateAsString(PP_NetworkList_State state);
|
| + static std::string GetNetworkTypeAsString(PP_NetworkList_Type type);
|
| + static std::string GetNetAddressAsString(pp::NetAddress address);
|
| +
|
| + pp::CompletionCallbackFactory<NetworkMonitorInstance> callback_factory_;
|
| + pp::NetworkMonitor network_monitor_;
|
| +};
|
| +
|
| +bool NetworkMonitorInstance::Init(uint32_t argc,
|
| + const char* argn[],
|
| + const char* argv[]) {
|
| + // Start listing for network updates.
|
| + int32_t result = network_monitor_.UpdateNetworkList(
|
| + callback_factory_.NewCallbackWithOutput(
|
| + &NetworkMonitorInstance::OnUpdateNetworkList));
|
| + if (result != PP_OK_COMPLETIONPENDING) {
|
| + std::ostringstream status;
|
| + status << "UpdateNetworkList failed: " << result;
|
| + PostMessage(status.str());
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void NetworkMonitorInstance::OnUpdateNetworkList(int32_t result,
|
| + pp::NetworkList network_list) {
|
| + // Send the new network list to JavaScript.
|
| + if (result < 0) {
|
| + std::ostringstream status;
|
| + status << "UpdateNetworkList failed: " << result;
|
| + PostMessage(status.str());
|
| + return;
|
| + }
|
| +
|
| + pp::VarArray var_network_list;
|
| + uint32_t count = network_list.GetCount();
|
| + for (uint32_t i = 0; i < count; ++i) {
|
| + pp::VarDictionary var_network;
|
| + var_network.Set("displayName", network_list.GetDisplayName(i));
|
| + var_network.Set("name", network_list.GetName(i));
|
| + var_network.Set("state", GetNetworkStateAsString(network_list.GetState(i)));
|
| + var_network.Set("type", GetNetworkTypeAsString(network_list.GetType(i)));
|
| + var_network.Set("MTU", static_cast<int32_t>(network_list.GetMTU(i)));
|
| +
|
| + pp::VarArray var_ip_addresses;
|
| + std::vector<pp::NetAddress> ip_addresses;
|
| + result = network_list.GetIpAddresses(i, &ip_addresses);
|
| + if (result == PP_OK) {
|
| + for (size_t i = 0; i < ip_addresses.size(); ++i) {
|
| + var_ip_addresses.Set(i, GetNetAddressAsString(ip_addresses[i]));
|
| + }
|
| + } else {
|
| + // Call to GetIpAddresses failed, just give an empty list.
|
| + }
|
| +
|
| + var_network.Set("ipAddresses", var_ip_addresses);
|
| + var_network_list.Set(i, var_network);
|
| + }
|
| +
|
| + PostMessage(var_network_list);
|
| +}
|
| +
|
| +// static
|
| +std::string NetworkMonitorInstance::GetNetworkStateAsString(
|
| + PP_NetworkList_State state) {
|
| + switch (state) {
|
| + case PP_NETWORKLIST_STATE_UP:
|
| + return "up";
|
| +
|
| + case PP_NETWORKLIST_STATE_DOWN:
|
| + return "down";
|
| +
|
| + default:
|
| + return "invalid";
|
| + }
|
| +}
|
| +
|
| +// static
|
| +std::string NetworkMonitorInstance::GetNetworkTypeAsString(
|
| + PP_NetworkList_Type type) {
|
| + switch (type) {
|
| + case PP_NETWORKLIST_TYPE_ETHERNET:
|
| + return "ethernet";
|
| +
|
| + case PP_NETWORKLIST_TYPE_WIFI:
|
| + return "wifi";
|
| +
|
| + case PP_NETWORKLIST_TYPE_CELLULAR:
|
| + return "cellular";
|
| +
|
| + case PP_NETWORKLIST_TYPE_UNKNOWN:
|
| + return "unknown";
|
| +
|
| + default:
|
| + return "invalid";
|
| + }
|
| +}
|
| +
|
| +// static
|
| +std::string NetworkMonitorInstance::GetNetAddressAsString(
|
| + pp::NetAddress address) {
|
| + bool include_port = true;
|
| + return address.DescribeAsString(include_port).AsString();
|
| +}
|
| +
|
| +class NetworkMonitorModule : public pp::Module {
|
| + public:
|
| + NetworkMonitorModule() : pp::Module() {}
|
| + virtual ~NetworkMonitorModule() {}
|
| +
|
| + virtual pp::Instance* CreateInstance(PP_Instance instance) {
|
| + return new NetworkMonitorInstance(instance);
|
| + }
|
| +};
|
| +
|
| +namespace pp {
|
| +Module* CreateModule() { return new NetworkMonitorModule(); }
|
| +} // namespace pp
|
|
|