/*
 * 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 "components/nacl/renderer/plugin/module_ppapi.h"
#include "components/nacl/renderer/plugin/plugin.h"
#include "components/nacl/renderer/plugin/utility.h"
#include "native_client/src/shared/imc/nacl_imc_c.h"
#include "native_client/src/shared/platform/nacl_secure_random.h"
#include "native_client/src/shared/platform/nacl_time.h"
#include "native_client/src/trusted/desc/nrd_all_modules.h"

namespace plugin {

ModulePpapi::ModulePpapi() : pp::Module(),
                             init_was_successful_(false),
                             private_interface_(NULL) {
  MODULE_PRINTF(("ModulePpapi::ModulePpapi (this=%p)\n",
                 static_cast<void*>(this)));
}

ModulePpapi::~ModulePpapi() {
  if (init_was_successful_) {
    NaClSrpcModuleFini();
    NaClNrdAllModulesFini();
  }
  MODULE_PRINTF(("ModulePpapi::~ModulePpapi (this=%p)\n",
                 static_cast<void*>(this)));
}

bool ModulePpapi::Init() {
  // Ask the browser for an interface which provides missing functions
  private_interface_ = reinterpret_cast<const PPB_NaCl_Private*>(
      GetBrowserInterface(PPB_NACL_PRIVATE_INTERFACE));

  if (NULL == private_interface_) {
    MODULE_PRINTF(("ModulePpapi::Init failed: "
                   "GetBrowserInterface returned NULL\n"));
    return false;
  }
  SetNaClInterface(private_interface_);

#if NACL_LINUX || NACL_OSX
  // Note that currently we do not need random numbers inside the
  // NaCl trusted plugin on Unix, but NaClSecureRngModuleInit() is
  // strict and will raise a fatal error unless we provide it with a
  // /dev/urandom FD beforehand.
  NaClSecureRngModuleSetUrandomFd(dup(private_interface_->UrandomFD()));
#endif

  // In the plugin, we don't need high resolution time of day.
  NaClAllowLowResolutionTimeOfDay();
  NaClNrdAllModulesInit();
  NaClSrpcModuleInit();

#if NACL_WINDOWS
  NaClSetBrokerDuplicateHandleFunc(private_interface_->BrokerDuplicateHandle);
#endif

  init_was_successful_ = true;
  return true;
}

pp::Instance* ModulePpapi::CreateInstance(PP_Instance pp_instance) {
  MODULE_PRINTF(("ModulePpapi::CreateInstance (pp_instance=%" NACL_PRId32
                 ")\n",
                 pp_instance));
  Plugin* plugin = new Plugin(pp_instance);
  MODULE_PRINTF(("ModulePpapi::CreateInstance (return %p)\n",
                 static_cast<void* >(plugin)));
  return plugin;
}

}  // namespace plugin


namespace pp {

Module* CreateModule() {
  MODULE_PRINTF(("CreateModule ()\n"));
  return new plugin::ModulePpapi();
}

}  // namespace pp
