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

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: Respond to reviews. Created 4 years, 5 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..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

Powered by Google App Engine
This is Rietveld 408576698