Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Unified Diff: native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc

Issue 1731273002: ppapi: PPB_VpnProvider: Add a simple NaCl SDK example. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@vpn-ppapi
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..bcf786ee3ec9bafc5285c45fab27e6e9ffb6816d
--- /dev/null
+++ b/native_client_sdk/src/examples/api/vpn_provider/vpn_provider.cc
@@ -0,0 +1,246 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
binji 2016/02/24 19:23:09 2016, remove (c)
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <time.h>
binji 2016/02/24 19:23:09 nit: sort alphabetically, and separate libc includ
+#include <iostream>
+#include "ppapi/cpp/instance.h"
+#include "ppapi/cpp/module.h"
+#include "ppapi/cpp/var.h"
+#include "ppapi/cpp/var_dictionary.h"
+#include "ppapi/cpp/vpn_provider.h"
+#include "ppapi/utility/completion_callback_factory.h"
+
+namespace {
+
+// The expected string sent by the browser.
+const char* const kHelloString = "hello";
+const char* const kByeString = "bye";
+// The string sent back to the browser upon receipt of a message
+// containing "hello".
+const char* const kHelloReplyString = "hello from NaCl";
+const char* const kByeReplyString = "bye from NaCl";
+
+} // namespace
+
+class HelloTutorialInstance : public pp::Instance {
+ public:
+ explicit HelloTutorialInstance(PP_Instance instance)
+ : pp::Instance(instance), factory_(this) {
+ vpn_ = new pp::VpnProvider(this);
+
+ std::cerr << "VPN Provider NaCL: "
binji 2016/02/24 19:23:09 nit: NaCl (lowercase l) here and elsewhere
+ << "HelloTutorialInstance::HelloTutorialInstance ()" << std::endl;
+
+ // Initial Callaback registration
binji 2016/02/24 19:23:09 sp: callback
+ vpn_->GetPlatformMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetPlatformMessageCompletionCallback));
binji 2016/02/24 19:23:09 These names are a bit verbose, maybe just "OnGetPl
+
+ vpn_->GetPacket(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetPacketCompletionCallback));
+
+ vpn_->GetConfigMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetConfigMessageCompletionCallback));
+
+ vpn_->GetUIMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetUIMessageCompletionCallback));
+ }
+
+ virtual ~HelloTutorialInstance() {
+ std::cerr << "VPN Provider NaCL: "
binji 2016/02/24 19:23:09 It's nicer if these messages are sent to the page.
+ << "HelloTutorialInstance::~HelloTutorialInstance ()"
+ << std::endl;
+ delete vpn_;
+ vpn_ = nullptr;
binji 2016/02/24 19:23:09 prefer NULL, one of our compilers is quite old (~2
+ }
+
+ // Handles On Click messages from Javascript
+ virtual void HandleMessage(const pp::Var& var_message) {
+ // Ignore the message if it is not a string.
+ if (!var_message.is_string())
+ return;
+
+ // Get the string message and compare it to "hello".
+ std::string message = var_message.AsString();
+ if (message == kHelloString) {
+ config = "Adrian";
+ AppendServiceIDTimeStamp(config);
+ vpn_->CreateConfig(
+ config, factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::CreateConfigCompletionCallback));
+
+ // If it matches, send our response back to JavaScript.
+ pp::Var var_reply(kHelloReplyString);
+ PostMessage(var_reply);
+ }
+
+ if (message == kByeString) {
+ vpn_->DestroyConfig(
+ config, factory_.NewCallback(
+ &HelloTutorialInstance::DestroyConfigCompletionCallback));
+
+ // If it matches, send our response back to JavaScript.
+ pp::Var var_reply(kByeReplyString);
+ PostMessage(var_reply);
+ }
+ }
+
+ void AppendServiceIDTimeStamp(std::string& service_id) {
+ char time_string[20] = "YYYYMMDDhhmmss";
+ time_t t = time(NULL);
+ strftime(time_string, sizeof(time_string), "%Y%m%d%H%M%S", localtime(&t));
+ time_string[sizeof(time_string) - 1] = '\0';
+ service_id.append(time_string);
+ }
+
+ void CreateConfigCompletionCallback(int32_t result, pp::Var id) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::CreateConfigCompletionCallback ("
+ << result << ", " << id.AsString() << ")" << std::endl;
+ }
+
+ void DestroyConfigCompletionCallback(int32_t result) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::DestroyConfigCompletionCallback ("
+ << result << ")" << std::endl;
+ }
+ void SendStateChangeNotificationCallback(int32_t result) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::SendStateChangeNotificationCallback ("
+ << result << ")" << std::endl;
+ }
+
+ void GetPlatformMessageCompletionCallback(int32_t result,
+ const pp::Var& message) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::GetPlatformMessageCompletionCallback ("
+ << result << ")" << std::endl;
+
+ pp::VarDictionary dict(message);
+ std::cerr << "VPN Provider NaCL: "
+ << "Received OnPlatformMessage ("
+ << dict.Get(pp::Var("id")).AsString() << ", "
binji 2016/02/24 19:23:09 you can just write dict.Get("id").AsString(), ther
+ << dict.Get(pp::Var("message")).AsInt() << ", "
+ << dict.Get(pp::Var("error")).AsString() << ", "
+ << ")" << std::endl;
+
+ if (dict.Get(pp::Var("message")).AsInt() ==
+ PP_VPN_PROVIDER_PLATFORM_MESSAGE_CONNECTED) {
+ std::vector<std::string> exclusionList;
+ exclusionList.push_back(std::string("63.145.213.129/32"));
binji 2016/02/24 19:23:09 same here, use implicit conversion to std::string
+ exclusionList.push_back(std::string("63.145.212.0/24"));
+
+ std::vector<std::string> inclusionList;
+ inclusionList.push_back("0.0.0.0/0");
+ inclusionList.push_back("63.145.212.128/25");
binji 2016/02/24 19:23:09 what do these IP addresses point to? Is this usabl
+
+ std::vector<std::string> domainSearch;
+ domainSearch.push_back("foo:bar");
+
+ std::vector<std::string> dnsServers;
+ dnsServers.push_back("8.8.8.8");
+
+ std::cerr
+ << "VPN Provider NaCL: SetParameters: "
+ << vpn_->SetParameters(
+ "10.10.10.10/24", "10.10.10.255", 1600, exclusionList,
+ inclusionList, domainSearch, dnsServers,
+ factory_.NewCallback(
+ &HelloTutorialInstance::SetParametersCompletionCallback))
+ << std::endl;
+ }
+
+ // Re-register callback
+ if (result == PP_OK) {
+ vpn_->GetPlatformMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetPlatformMessageCompletionCallback));
+ }
+ }
+
+ void SetParametersCompletionCallback(int32_t result) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::SetParametersCompletionCallback ("
+ << result << ")" << std::endl;
+
+ vpn_->NotifyConnectionStateChanged(
+ PP_VPN_PROVIDER_CONNECTION_STATE_CONNECTED,
+ factory_.NewCallback(
+ &HelloTutorialInstance::SendStateChangeNotificationCallback));
+ }
+
+ void GetPacketCompletionCallback(int32_t result, const pp::Var packet) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::GetPacketCompletionCallback ("
+ << result << ")" << std::endl;
+
+ // "Null Proxy" implementation
+ vpn_->SendPacket(packet);
+
+ // Re-register callback
+ if (result == PP_OK) {
+ vpn_->GetPacket(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetPacketCompletionCallback));
+ }
+ }
+
+ void GetConfigMessageCompletionCallback(int32_t result,
+ const pp::Var& message) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::GetConfigMessageCompletionCallback ("
+ << result << ")" << std::endl;
+
+ pp::VarDictionary dict(message);
+ std::cerr << "VPN Provider NaCL: "
+ << "Received OnConfigMessage ("
+ << dict.Get(pp::Var("id")).AsString() << ", "
+ << dict.Get(pp::Var("message")).AsInt() << ", "
+ << dict.Get(pp::Var("name")).AsString() << ", "
+ << dict.Get(pp::Var("data")).AsString() << ")" << std::endl;
+
+ // Re-register callback
+ if (result == PP_OK) {
+ vpn_->GetConfigMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetConfigMessageCompletionCallback));
+ }
+ }
+
+ void GetUIMessageCompletionCallback(int32_t result, const pp::Var& message) {
+ std::cerr << "VPN Provider NaCL: "
+ << "HelloTutorialInstance::GetUIMessageCompletionCallback ("
+ << result << ")" << std::endl;
+
+ pp::VarDictionary dict(message);
+ std::cerr << "VPN Provider NaCL: "
+ << "Received OnUIMessage ("
+ << dict.Get(pp::Var("message")).AsInt() << ", "
+ << dict.Get(pp::Var("id")).AsString() << ")" << std::endl;
+
+ // Re-register callback
+ if (result == PP_OK) {
+ vpn_->GetUIMessage(factory_.NewCallbackWithOutput(
+ &HelloTutorialInstance::GetUIMessageCompletionCallback));
+ }
+ }
+
+ std::string config;
+ pp::VpnProvider* vpn_;
+ pp::CompletionCallbackFactory<HelloTutorialInstance> factory_;
+};
+
+class HelloTutorialModule : public pp::Module {
+ public:
+ HelloTutorialModule() : pp::Module() {}
+ virtual ~HelloTutorialModule() {}
+
+ virtual pp::Instance* CreateInstance(PP_Instance instance) {
+ return new HelloTutorialInstance(instance);
+ }
+};
+
+namespace pp {
+
+Module* CreateModule() {
+ return new HelloTutorialModule();
Sam Clegg 2016/02/24 18:16:28 Rename the module and instance to match the name o
+}
+
+} // namespace pp

Powered by Google App Engine
This is Rietveld 408576698