1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/plugin_module.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string>
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/files/file_path.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "build/build_config.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/interface_list.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/examples/pepper_container_app/plugin_instance.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/c/pp_errors.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/shared_impl/callback_tracker.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace mojo {
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace examples {
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst void* GetInterface(const char* name) {
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const void* interface =
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InterfaceList::GetInstance()->GetBrowserInterface(name);
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!interface)
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "Interface requested " << name;
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return interface;
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPluginModule::EntryPoints::EntryPoints() : get_interface(NULL),
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                           initialize_module(NULL),
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                           shutdown_module(NULL) {}
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPluginModule::PluginModule() : callback_tracker_(new ppapi::CallbackTracker) {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Initialize();
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
42effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPluginModule::~PluginModule() {
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  callback_tracker_->AbortAll();
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (entry_points_.shutdown_module)
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    entry_points_.shutdown_module();
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_ptr<PluginInstance> PluginModule::CreateInstance() {
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return make_scoped_ptr(new PluginInstance(this));
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst void* PluginModule::GetPluginInterface(const char* name) const {
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (entry_points_.get_interface)
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return entry_points_.get_interface(name);
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return NULL;
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PluginModule::Initialize() {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Platform-specific filename.
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TODO(yzshen): Don't hard-code it.
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN)
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static const wchar_t plugin_name[] = L"ppapi_example_gles2_spinning_cube.dll";
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#elif defined(OS_MACOSX)
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static const char plugin_name[] = "ppapi_example_gles2_spinning_cube.plugin";
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#elif defined(OS_POSIX)
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static const char plugin_name[] = "libppapi_example_gles2_spinning_cube.so";
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FilePath plugin_path(plugin_name);
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::NativeLibraryLoadError error;
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  plugin_module_.Reset(base::LoadNativeLibrary(plugin_path, &error));
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!plugin_module_.is_valid()) {
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "Cannot load " << plugin_path.AsUTF8Unsafe()
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 << ". Error: " << error.ToString();
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  entry_points_.get_interface =
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reinterpret_cast<PP_GetInterface_Func>(
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          plugin_module_.GetFunctionPointer("PPP_GetInterface"));
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!entry_points_.get_interface) {
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "No PPP_GetInterface in plugin library";
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  entry_points_.initialize_module =
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reinterpret_cast<PP_InitializeModule_Func>(
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          plugin_module_.GetFunctionPointer("PPP_InitializeModule"));
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!entry_points_.initialize_module) {
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "No PPP_InitializeModule in plugin library";
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // It's okay for PPP_ShutdownModule to not be defined and |shutdown_module| to
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // be NULL.
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  entry_points_.shutdown_module =
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reinterpret_cast<PP_ShutdownModule_Func>(
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          plugin_module_.GetFunctionPointer("PPP_ShutdownModule"));
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32_t result = entry_points_.initialize_module(pp_module(),
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                   &GetInterface);
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (result != PP_OK)
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "Initializing module failed with error " << result;
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace examples
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace mojo
111