// Copyright (c) 2012 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 <stdint.h>

#include "ppapi/c/pp_errors.h"
#include "ppapi/cpp/input_event.h"
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/utility/completion_callback_factory.h"
#include "ppapi/utility/threading/simple_thread.h"

class MyInstance : public pp::Instance {
 public:
  MyInstance(PP_Instance instance) : pp::Instance(instance) {
    thread_ = new pp::SimpleThread(this);
    factory_.Initialize(this);
  }

  virtual ~MyInstance() {
    delete thread_;
  }

  virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
    thread_->Start();
    thread_->message_loop().PostWork(
        factory_.NewCallback(&MyInstance::CallOnBackground));
    return true;
  }

  virtual void DidChangeView(const pp::View& view) {
  }

 private:
  void CallOnBackground(int32_t result) {
  }

  pp::CompletionCallbackFactory<MyInstance> factory_;

  pp::SimpleThread* thread_;
};


class MyModule : public pp::Module {
 public:
  MyModule() : pp::Module() {}
  virtual ~MyModule() {}

  virtual pp::Instance* CreateInstance(PP_Instance instance) {
    return new MyInstance(instance);
  }
};

namespace pp {

// Factory function for your specialization of the Module object.
Module* CreateModule() {
  return new MyModule();
}

}  // namespace pp
