- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / native_client / src / trusted / plugin / module_ppapi.cc
1 /*
2  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6
7 #include "native_client/src/shared/imc/nacl_imc_c.h"
8 #include "native_client/src/shared/platform/nacl_secure_random.h"
9 #include "native_client/src/shared/platform/nacl_time.h"
10 #include "native_client/src/trusted/desc/nrd_all_modules.h"
11
12 #include "ppapi/native_client/src/trusted/plugin/module_ppapi.h"
13 #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h"
14 #include "ppapi/native_client/src/trusted/plugin/plugin.h"
15
16 namespace plugin {
17
18 ModulePpapi::ModulePpapi() : pp::Module(),
19                              init_was_successful_(false),
20                              private_interface_(NULL) {
21   MODULE_PRINTF(("ModulePpapi::ModulePpapi (this=%p)\n",
22                  static_cast<void*>(this)));
23 }
24
25 ModulePpapi::~ModulePpapi() {
26   if (init_was_successful_) {
27     NaClSrpcModuleFini();
28     NaClNrdAllModulesFini();
29   }
30   MODULE_PRINTF(("ModulePpapi::~ModulePpapi (this=%p)\n",
31                  static_cast<void*>(this)));
32 }
33
34 bool ModulePpapi::Init() {
35   // Ask the browser for an interface which provides missing functions
36   private_interface_ = reinterpret_cast<const PPB_NaCl_Private*>(
37       GetBrowserInterface(PPB_NACL_PRIVATE_INTERFACE));
38
39   if (NULL == private_interface_) {
40     MODULE_PRINTF(("ModulePpapi::Init failed: "
41                    "GetBrowserInterface returned NULL\n"));
42     return false;
43   }
44
45   launch_nacl_process = reinterpret_cast<LaunchNaClProcessFunc>(
46       private_interface_->LaunchSelLdr);
47
48 #if NACL_LINUX || NACL_OSX
49   // Note that currently we do not need random numbers inside the
50   // NaCl trusted plugin on Unix, but NaClSecureRngModuleInit() is
51   // strict and will raise a fatal error unless we provide it with a
52   // /dev/urandom FD beforehand.
53   NaClSecureRngModuleSetUrandomFd(dup(private_interface_->UrandomFD()));
54 #endif
55
56   // In the plugin, we don't need high resolution time of day.
57   NaClAllowLowResolutionTimeOfDay();
58   NaClNrdAllModulesInit();
59   NaClSrpcModuleInit();
60
61 #if NACL_WINDOWS
62   NaClSetBrokerDuplicateHandleFunc(private_interface_->BrokerDuplicateHandle);
63 #endif
64
65   init_was_successful_ = true;
66   return true;
67 }
68
69 pp::Instance* ModulePpapi::CreateInstance(PP_Instance pp_instance) {
70   MODULE_PRINTF(("ModulePpapi::CreateInstance (pp_instance=%" NACL_PRId32
71                  ")\n",
72                  pp_instance));
73   Plugin* plugin = Plugin::New(pp_instance);
74   MODULE_PRINTF(("ModulePpapi::CreateInstance (return %p)\n",
75                  static_cast<void* >(plugin)));
76   return plugin;
77 }
78
79 }  // namespace plugin
80
81
82 namespace pp {
83
84 Module* CreateModule() {
85   MODULE_PRINTF(("CreateModule ()\n"));
86   return new plugin::ModulePpapi();
87 }
88
89 }  // namespace pp