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