| Index: native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc
|
| diff --git a/native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc b/native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..88e5aaa3d70b6df1530aec8baf06e7b6423099ce
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc
|
| @@ -0,0 +1,137 @@
|
| +// Copyright 2016 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 <queue>
|
| +#include <sstream>
|
| +#include <string>
|
| +
|
| +#include "ppapi/cpp/instance.h"
|
| +#include "ppapi/cpp/module.h"
|
| +#include "ppapi/cpp/var.h"
|
| +#include "ppapi/cpp/var_dictionary.h"
|
| +
|
| +#include "vpn_provider_helper.h"
|
| +
|
| +class VpnProviderInstance : public pp::Instance {
|
| + public:
|
| + explicit VpnProviderInstance(PP_Instance instance)
|
| + : pp::Instance(instance), vpn_provider_helper_(this) {
|
| + vpn_provider_helper_.Init();
|
| + }
|
| +
|
| + virtual ~VpnProviderInstance() {}
|
| +
|
| + // Handles messages from Javascript
|
| + virtual void HandleMessage(const pp::Var& message) {
|
| + // Expecting only dictionary messages from JS.
|
| + if (!message.is_dictionary()) {
|
| + PostMessage(
|
| + "NaCl: VpnProviderInstance::HandleMessage: "
|
| + "Unexpected message. Not a dictionary.");
|
| + return;
|
| + }
|
| +
|
| + // Message type defined by 'cmd' key.
|
| + pp::VarDictionary dict(message);
|
| +
|
| + std::string command;
|
| + if (!GetStringFromMessage(dict, "cmd", &command)) {
|
| + return;
|
| + }
|
| + if (command == "bind") {
|
| + std::string name, id;
|
| + if (!GetStringFromMessage(dict, "name", &name) ||
|
| + !GetStringFromMessage(dict, "id", &id)) {
|
| + return;
|
| + }
|
| + PostMessage(
|
| + "NaCl: VpnProviderInstance::HandleMessage: "
|
| + "Bind request.");
|
| + vpn_provider_helper_.Bind(name, id);
|
| + return;
|
| + }
|
| +
|
| + if (command == "connected") {
|
| + PostMessage(
|
| + "NaCl: VpnProviderInstance::HandleMessage: "
|
| + "Connect request.");
|
| +
|
| + /* This is the place where the developer would establing the VPN
|
| + * connection. The response would usually contain configuration details
|
| + * for the tunnel obtained from the VPN implementation.
|
| + *
|
| + * Currently just signaling that is was executed succesfuly.
|
| + */
|
| +
|
| + pp::VarDictionary dict;
|
| + dict.Set("cmd", "setParameters");
|
| + PostMessage(dict);
|
| + return;
|
| + }
|
| +
|
| + if (command == "disconnected") {
|
| + PostMessage(
|
| + "NaCl: VpnProviderInstance::HandleMessage: "
|
| + "Disconnect request.");
|
| +
|
| + /* This is the place where the developer would disconnect from the VPN
|
| + * connection.
|
| + */
|
| +
|
| + return;
|
| + }
|
| +
|
| + PostMessage(
|
| + "NaCl: VpnProviderInstance::HandleMessage: "
|
| + "Unexpected command.");
|
| + }
|
| +
|
| + private:
|
| + // Helper function for HandleMessage
|
| + bool GetStringFromMessage(const pp::VarDictionary& dict,
|
| + const char* key,
|
| + std::string* value) {
|
| + if (!value)
|
| + return false;
|
| +
|
| + pp::Var val = dict.Get(key);
|
| + if (val.is_undefined()) {
|
| + std::stringstream ss;
|
| + ss << "NaCl: VpnProviderInstance::HandleMessage: Malformed message. No '"
|
| + << key << "' key.";
|
| + PostMessage(ss.str());
|
| + return false;
|
| + }
|
| + if (!val.is_string()) {
|
| + std::stringstream ss;
|
| + ss << "NaCl: VpnProviderInstance::HandleMessage: Malformed message. ";
|
| + ss << "Type for key '" << key << "' is not string";
|
| + PostMessage(ss.str());
|
| + return false;
|
| + }
|
| +
|
| + *value = val.AsString();
|
| + return true;
|
| + }
|
| +
|
| + VpnProviderHelper vpn_provider_helper_;
|
| +};
|
| +
|
| +class VpnProviderModule : public pp::Module {
|
| + public:
|
| + VpnProviderModule() : pp::Module() {}
|
| + virtual ~VpnProviderModule() {}
|
| +
|
| + virtual pp::Instance* CreateInstance(PP_Instance instance) {
|
| + return new VpnProviderInstance(instance);
|
| + }
|
| +};
|
| +
|
| +namespace pp {
|
| +
|
| +Module* CreateModule() {
|
| + return new VpnProviderModule();
|
| +}
|
| +
|
| +} // namespace pp
|
|
|