15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <cstdio> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/instance.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/message_loop.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/module.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/var.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Instance : public pp::Instance { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit Instance(PP_Instance instance) : 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::Instance(instance), 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_factory_(this), 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delay_milliseconds_(10), 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) active_(true) { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DoSomething(PP_OK); 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~Instance() {} 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void HandleMessage(const pp::Var& message_var) { 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string message_string = message_var.AsString(); 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (message_string == "be idle") { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) active_ = false; 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostMessage("Unhandled control message."); 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DoSomething(int32_t result) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (active_) { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::MessageLoop loop = pp::MessageLoop::GetCurrent(); 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallback c = callback_factory_.NewCallback( 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &Instance::DoSomething); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) loop.PostWork(c, delay_milliseconds_); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pp::CompletionCallbackFactory<Instance> callback_factory_; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int delay_milliseconds_; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool active_; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Module : public pp::Module { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Module() : pp::Module() {} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~Module() {} 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual pp::Instance* CreateInstance(PP_Instance instance) { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new Instance(instance); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace pp { 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Module* CreateModule() { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new ::Module(); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace pp 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 64