diff options
Diffstat (limited to 'remoting/client/plugin/pepper_entrypoints.cc')
-rw-r--r-- | remoting/client/plugin/pepper_entrypoints.cc | 235 |
1 files changed, 29 insertions, 206 deletions
diff --git a/remoting/client/plugin/pepper_entrypoints.cc b/remoting/client/plugin/pepper_entrypoints.cc index ad21956..1613c1d 100644 --- a/remoting/client/plugin/pepper_entrypoints.cc +++ b/remoting/client/plugin/pepper_entrypoints.cc @@ -4,236 +4,59 @@ #include "remoting/client/plugin/pepper_entrypoints.h" +#include "base/message_loop.h" #include "remoting/client/plugin/chromoting_plugin.h" +#include "third_party/ppapi/c/pp_errors.h" #include "third_party/ppapi/c/pp_instance.h" #include "third_party/ppapi/c/pp_module.h" -#include "third_party/ppapi/c/ppp_instance.h" +#include "third_party/ppapi/c/ppb_instance.h" #include "third_party/ppapi/cpp/instance.h" #include "third_party/ppapi/cpp/module.h" -static const int kModuleInitSuccess = 0; -static const int kModuleInitFailure = 1; +static pp::Module* g_module_singleton = NULL; -namespace remoting { - -// Fork of ppapi::Module -// -// TODO(ajwong): Generalize this into something that other internal plugins can -// use. Either that, or attempt to refactor the external ppapi C++ wrapper to -// make it friendly for multiple Modules in one process. I think we can do this -// by: -// 1) Moving the singleton Module instance + C-bindings into another class -// (eg., ModuleExporter) under a different gyp targe. -// 2) Extracting the idea of a "Browser" out of the module that returns -// PPB_Core, etc. This can be a singleton per process regardless of -// module. -// 3) Migrate all PPB related objects to get data out of Browser interface -// instead of Module::Get(). -class ChromotingModule { - public: - ChromotingModule() {} - - // This function will be automatically called after the object is created. - // This is where you can put functions that rely on other parts of the API, - // now that the module has been created. - virtual bool Init() { return true; } - - PP_Module pp_module() const { return pp_module_; } - const PPB_Core& core() const { return *core_; } - - // Implements GetInterface for the browser to get plugin interfaces. Override - // if you need to implement your own interface types that this wrapper - // doesn't support. - virtual const void* GetInstanceInterface(const char* interface_name) { - if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) - return &instance_interface_; - - return NULL; - } - - // Returns an interface in the browser. - const void* GetBrowserInterface(const char* interface_name) { - return get_browser_interface_(interface_name); - } - - // Returns the object associated with this PP_Instance, or NULL if one is - // not found. - ChromotingPlugin* InstanceForPPInstance(PP_Instance instance) { - InstanceMap::iterator found = current_instances_.find(instance); - if (found == current_instances_.end()) - return NULL; - return found->second; - } +namespace pp { - // Sets the browser interface and calls the regular init function that - // can be overridden by the base classes. - // - // TODO(brettw) make this private when I can figure out how to make the - // initialize function a friend. - bool InternalInit(PP_Module mod, - PPB_GetInterface get_browser_interface) { - pp_module_ = mod; - get_browser_interface_ = get_browser_interface; - core_ = reinterpret_cast<const PPB_Core*>(GetBrowserInterface( - PPB_CORE_INTERFACE)); - if (!core_) - return false; // Can't run without the core interface. - - return Init(); - } - - // Implementation of Global PPP functions --------------------------------- - static int PPP_InitializeModule(PP_Module module_id, - PPB_GetInterface get_browser_interface) { - ChromotingModule* module = new ChromotingModule(); - if (!module) - return kModuleInitFailure; - - if (!module->InternalInit(module_id, get_browser_interface)) { - delete module; - return kModuleInitFailure; - } - - module_singleton_ = module; - return kModuleInitSuccess; - } +Module* Module::Get() { + return g_module_singleton; +} - static void PPP_ShutdownModule() { - delete module_singleton_; - module_singleton_ = NULL; - } +} // namespace pp - static const void* PPP_GetInterface(const char* interface_name) { - if (!module_singleton_) - return NULL; - return module_singleton_->GetInstanceInterface(interface_name); - } +namespace remoting { +class ChromotingModule : public pp::Module { protected: virtual ChromotingPlugin* CreateInstance(PP_Instance instance) { - const PPB_Instance* ppb_instance_funcs = - reinterpret_cast<const PPB_Instance *>( - module_singleton_->GetBrowserInterface(PPB_INSTANCE_INTERFACE)); - return new ChromotingPlugin(instance, ppb_instance_funcs); - } - - private: - static bool Instance_New(PP_Instance instance) { - if (!module_singleton_) - return false; - ChromotingPlugin* obj = module_singleton_->CreateInstance(instance); - if (obj) { - module_singleton_->current_instances_[instance] = obj; - return true; - } - return false; - } - - static void Instance_Delete(PP_Instance instance) { - if (!module_singleton_) - return; - ChromotingModule::InstanceMap::iterator found = - module_singleton_->current_instances_.find(instance); - if (found == module_singleton_->current_instances_.end()) - return; - - // Remove it from the map before deleting to try to catch reentrancy. - ChromotingPlugin* obj = found->second; - module_singleton_->current_instances_.erase(found); - delete obj; - } - - static bool Instance_Initialize(PP_Instance pp_instance, - uint32_t argc, - const char* argn[], - const char* argv[]) { - if (!module_singleton_) - return false; - ChromotingPlugin* instance = - module_singleton_->InstanceForPPInstance(pp_instance); - if (!instance) - return false; - return instance->Init(argc, argn, argv); - } - - static bool Instance_HandleDocumentLoad(PP_Instance pp_instance, - PP_Resource url_loader) { - return false; - } - - static bool Instance_HandleEvent(PP_Instance pp_instance, - const PP_Event* event) { - if (!module_singleton_) - return false; - ChromotingPlugin* instance = - module_singleton_->InstanceForPPInstance(pp_instance); - if (!instance) - return false; - return instance->HandleEvent(*event); - } - - static PP_Var Instance_GetInstanceObject(PP_Instance pp_instance) { - PP_Var var; - var.type = PP_VARTYPE_VOID; - return var; + return new ChromotingPlugin(instance); } - - static void Instance_ViewChanged(PP_Instance pp_instance, - const PP_Rect* position, - const PP_Rect* clip) { - if (!module_singleton_) - return; - ChromotingPlugin* instance = - module_singleton_->InstanceForPPInstance(pp_instance); - if (!instance) - return; - instance->ViewChanged(*position, *clip); - } - - // Bindings and identifiers to and from the browser. - PP_Module pp_module_; - PPB_GetInterface get_browser_interface_; - PPB_Core const* core_; - - // Instance tracking. - typedef std::map<PP_Instance, ChromotingPlugin*> InstanceMap; - InstanceMap current_instances_; - - // Static members for the ppapi C-bridge. - static PPP_Instance instance_interface_; - static ChromotingModule* module_singleton_; - - DISALLOW_COPY_AND_ASSIGN(ChromotingModule); }; -ChromotingModule* ChromotingModule::module_singleton_ = NULL; +// Implementation of Global PPP functions --------------------------------- +int32_t PPP_InitializeModule(PP_Module module_id, + PPB_GetInterface get_browser_interface) { + ChromotingModule* module = new ChromotingModule(); + if (!module) + return PP_ERROR_FAILED; -PPP_Instance ChromotingModule::instance_interface_ = { - &ChromotingModule::Instance_New, - &ChromotingModule::Instance_Delete, - &ChromotingModule::Instance_Initialize, - &ChromotingModule::Instance_HandleDocumentLoad, - &ChromotingModule::Instance_HandleEvent, - &ChromotingModule::Instance_GetInstanceObject, - &ChromotingModule::Instance_ViewChanged, -}; + if (!module->InternalInit(module_id, get_browser_interface)) { + delete module; + return PP_ERROR_FAILED; + } -// Implementation of Global PPP functions --------------------------------- -// -// TODO(ajwong): This is to get around friending issues. Fix it after we decide -// whether or not ChromotingModule should be generalized. -int PPP_InitializeModule(PP_Module module_id, - PPB_GetInterface get_browser_interface) { - return ChromotingModule::PPP_InitializeModule(module_id, - get_browser_interface); + g_module_singleton = module; + return PP_OK; } void PPP_ShutdownModule() { - return ChromotingModule::PPP_ShutdownModule(); + delete pp::Module::Get(); + g_module_singleton = NULL; } const void* PPP_GetInterface(const char* interface_name) { - return ChromotingModule::PPP_GetInterface(interface_name); + if (!pp::Module::Get()) + return NULL; + return pp::Module::Get()->GetInstanceInterface(interface_name); } } // namespace remoting |