Chromium Code Reviews| Index: native_client_sdk/src/getting_started/part1/hello_tutorial.cc |
| diff --git a/native_client_sdk/src/getting_started/part1/hello_tutorial.cc b/native_client_sdk/src/getting_started/part1/hello_tutorial.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..84531fdeb8bbae6cdd4e23e550e374af158eef4e |
| --- /dev/null |
| +++ b/native_client_sdk/src/getting_started/part1/hello_tutorial.cc |
| @@ -0,0 +1,91 @@ |
| +/// Copyright (c) 2012 The Native Client Authors. All rights reserved. |
|
eliben
2013/09/09 16:48:31
2013
binji
2013/09/09 18:43:46
Done.
|
| +/// Use of this source code is governed by a BSD-style license that can be |
| +/// found in the LICENSE file. |
| +/// |
| +/// @file hello_tutorial.cc |
| +/// This example demonstrates loading, running and scripting a very simple NaCl |
| +/// module. To load the NaCl module, the browser first looks for the |
| +/// CreateModule() factory method (at the end of this file). It calls |
| +/// CreateModule() once to load the module code from your .nexe. After the |
|
eliben
2013/09/09 16:48:31
Should we be talking about a .exe here? Maybe .pex
binji
2013/09/09 18:43:46
Done.
|
| +/// .nexe code is loaded, CreateModule() is not called again. |
| +/// |
| +/// Once the .nexe code is loaded, the browser than calls the CreateInstance() |
| +/// method on the object returned by CreateModule(). It calls CreateInstance() |
| +/// each time it encounters an <embed> tag that references your NaCl module. |
| +/// |
| +/// The browser can talk to your NaCl module via the postMessage() Javascript |
| +/// function. When you call postMessage() on your NaCl module from the browser, |
| +/// this becomes a call to the HandleMessage() method of your pp::Instance |
| +/// subclass. You can send messages back to the browser by calling the |
| +/// PostMessage() method on your pp::Instance. Note that these two methods |
| +/// (postMessage() in Javascript and PostMessage() in C++) are asynchronous. |
| +/// This means they return immediately - there is no waiting for the message |
| +/// to be handled. This has implications in your program design, particularly |
| +/// when mutating property values that are exposed to both the browser and the |
| +/// NaCl module. |
| + |
| +#include <cstdio> |
| +#include <string> |
|
eliben
2013/09/09 16:48:31
i don't think it's used?
maybe cstdio too?
binji
2013/09/09 18:43:46
Done.
|
| +#include "ppapi/cpp/instance.h" |
| +#include "ppapi/cpp/module.h" |
| +#include "ppapi/cpp/var.h" |
| + |
| +/// The Instance class. One of these exists for each instance of your NaCl |
| +/// module on the web page. The browser will ask the Module object to create |
| +/// a new Instance for each occurence of the <embed> tag that has these |
|
eliben
2013/09/09 16:48:31
occurrence
binji
2013/09/09 18:43:46
Done.
|
| +/// attributes: |
| +/// type="application/x-pnacl" |
| +/// src="hello_tutorial.nmf" |
| +/// To communicate with the browser, you must override HandleMessage() for |
| +/// receiving messages from the browser, and use PostMessage() to send messages |
|
noelallen1
2013/09/09 04:32:00
for receiving... for sending...
binji
2013/09/09 18:43:46
Done.
|
| +/// back to the browser. Note that this interface is asynchronous. |
| +class HelloTutorialInstance : public pp::Instance { |
| + public: |
| + /// The constructor creates the plugin-side instance. |
| + /// @param[in] instance the handle to the browser-side plugin instance. |
| + explicit HelloTutorialInstance(PP_Instance instance) : pp::Instance(instance) |
| + {} |
| + virtual ~HelloTutorialInstance() {} |
| + |
| + /// Handler for messages coming in from the browser via postMessage(). The |
| + /// @a var_message can contain anything: a JSON string; a string that encodes |
| + /// method names and arguments; etc. For example, you could use |
| + /// JSON.stringify in the browser to create a message that contains a method |
| + /// name and some parameters, something like this: |
| + /// var json_message = JSON.stringify({ "myMethod" : "3.14159" }); |
| + /// nacl_module.postMessage(json_message); |
| + /// On receipt of this message in @a var_message, you could parse the JSON to |
| + /// retrieve the method name, match it to a function call, and then call it |
| + /// with the parameter. |
| + /// @param[in] var_message The message posted by the browser. |
| + virtual void HandleMessage(const pp::Var& var_message) { |
| + // TODO(sdk_user): 1. Make this function handle the incoming message. |
| + } |
| +}; |
| + |
| +/// The Module class. The browser calls the CreateInstance() method to create |
| +/// an instance of your NaCl module on the web page. The browser creates a new |
| +/// instance for each <embed> tag with type="application/x-nacl". |
| +class HelloTutorialModule : public pp::Module { |
| + public: |
| + HelloTutorialModule() : pp::Module() {} |
| + virtual ~HelloTutorialModule() {} |
| + |
| + /// Create and return a HelloTutorialInstance object. |
| + /// @param[in] instance The browser-side instance. |
| + /// @return the plugin-side instance. |
| + virtual pp::Instance* CreateInstance(PP_Instance instance) { |
| + return new HelloTutorialInstance(instance); |
| + } |
| +}; |
| + |
| +namespace pp { |
| +/// Factory function called by the browser when the module is first loaded. |
| +/// The browser keeps a singleton of this module. It calls the |
| +/// CreateInstance() method on the object you return to make instances. There |
| +/// is one instance per <embed> tag on the page. This is the main binding |
| +/// point for your NaCl module with the browser. |
| +Module* CreateModule() { |
| + return new HelloTutorialModule(); |
| +} |
| +} // namespace pp |