| Index: native_client_sdk/src/examples/api/messaging/messaging.cc
|
| diff --git a/native_client_sdk/src/examples/api/messaging/messaging.cc b/native_client_sdk/src/examples/api/messaging/messaging.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a6415f0a37cb36acae3e908e8a6373beb6093985
|
| --- /dev/null
|
| +++ b/native_client_sdk/src/examples/api/messaging/messaging.cc
|
| @@ -0,0 +1,96 @@
|
| +// Copyright 2014 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 "ppapi/cpp/instance.h"
|
| +#include "ppapi/cpp/instance_handle.h"
|
| +#include "ppapi/cpp/message_handler.h"
|
| +#include "ppapi/cpp/module.h"
|
| +#include "ppapi/cpp/var.h"
|
| +#include "ppapi/cpp/var_array.h"
|
| +#include "ppapi/utility/threading/simple_thread.h"
|
| +
|
| +#ifdef WIN32
|
| +#undef PostMessage
|
| +// Allow 'this' in initializer list
|
| +#pragma warning(disable : 4355)
|
| +#endif
|
| +
|
| +class MessageHandler : public pp::MessageHandler {
|
| + public:
|
| + virtual void HandleMessage(pp::InstanceHandle instance,
|
| + const pp::Var& message_data) {
|
| + if (!message_data.is_array()) {
|
| + return;
|
| + }
|
| +
|
| + pp::VarArray array(message_data);
|
| + pp::Var response = SumArray(array);
|
| +
|
| + // Send the response back to JavaScript asynchronously.
|
| + pp::Instance(instance.pp_instance()).PostMessage(response);
|
| + }
|
| +
|
| + virtual pp::Var HandleBlockingMessage(pp::InstanceHandle instance,
|
| + const pp::Var& message_data) {
|
| + if (!message_data.is_array()) {
|
| + // Return an undefined value.
|
| + return pp::Var();
|
| + }
|
| +
|
| + pp::VarArray array(message_data);
|
| +
|
| + // Send the response back to JavaScript synchronously.
|
| + return SumArray(array);
|
| + }
|
| +
|
| + virtual void WasUnregistered(pp::InstanceHandle instance) {}
|
| +
|
| + pp::Var SumArray(const pp::VarArray& array) {
|
| + int32_t result = 0;
|
| + for (uint32_t i = 0, length = array.GetLength(); i < length; ++i) {
|
| + if (!array.Get(i).is_int()) {
|
| + continue;
|
| + }
|
| +
|
| + result += array.Get(i).AsInt();
|
| + }
|
| +
|
| + return pp::Var(result);
|
| + }
|
| +};
|
| +
|
| +class Instance : public pp::Instance {
|
| + public:
|
| + explicit Instance(PP_Instance instance)
|
| + : pp::Instance(instance), thread_(this) {}
|
| +
|
| + virtual bool Init(uint32_t /*argc*/,
|
| + const char* /*argn*/ [],
|
| + const char* /*argv*/ []) {
|
| + thread_.Start();
|
| +
|
| + // The message handler must be registered using a message loop that is not
|
| + // the main thread's messaging loop. This call will fail otherwise.
|
| + RegisterMessageHandler(&message_handler_, thread_.message_loop());
|
| + return true;
|
| + }
|
| +
|
| + private:
|
| + pp::SimpleThread thread_;
|
| + MessageHandler message_handler_;
|
| +};
|
| +
|
| +class Module : public pp::Module {
|
| + public:
|
| + Module() : pp::Module() {}
|
| + virtual ~Module() {}
|
| +
|
| + virtual pp::Instance* CreateInstance(PP_Instance instance) {
|
| + return new Instance(instance);
|
| + }
|
| +};
|
| +
|
| +namespace pp {
|
| +Module* CreateModule() { return new ::Module(); }
|
| +} // namespace pp
|
|
|