blob: 17aaf5e1a93ebc24dbe95e3f40830d469bdd2f92 [file] [log] [blame]
// 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 "native_client/src/shared/platform/nacl_check.h"
#include "native_client/src/shared/ppapi_proxy/plugin_globals.h"
#include "native_client/src/shared/ppapi_proxy/plugin_ppb_core.h"
#include "native_client/src/shared/ppapi_proxy/plugin_ppb_var.h"
#include "native_client/src/shared/ppapi_proxy/ppruntime.h"
#include "native_client/src/shared/ppapi_proxy/untrusted/srpcgen/ppp_rpc.h"
#include "native_client/src/shared/ppapi_proxy/utility.h"
#include "native_client/src/shared/srpc/nacl_srpc.h"
#define NACL_SEND_FD 6
namespace {
NaClSrpcChannel* main_srpc_channel;
NaClSrpcChannel* upcall_srpc_channel;
PP_Module module_id_for_plugin;
struct PP_ThreadFunctions thread_funcs;
} // namespace
namespace ppapi_proxy {
const PP_Resource kInvalidResourceId = 0;
NaClSrpcChannel* GetMainSrpcChannel() {
return main_srpc_channel;
}
void SetMainSrpcChannel(NaClSrpcChannel* channel) {
main_srpc_channel = channel;
}
NaClSrpcChannel* GetUpcallSrpcChannel() {
return upcall_srpc_channel;
}
void SetUpcallSrpcChannel(NaClSrpcChannel* channel) {
upcall_srpc_channel = channel;
}
void SetModuleIdForSrpcChannel(NaClSrpcChannel* channel, PP_Module module_id) {
module_id_for_plugin = module_id;
}
void UnsetModuleIdForSrpcChannel(NaClSrpcChannel* channel) {
const PP_Module kInvalidModuleId = 0;
module_id_for_plugin = kInvalidModuleId;
}
PP_Module LookupModuleIdForSrpcChannel(NaClSrpcChannel* channel) {
return module_id_for_plugin;
}
const struct PP_ThreadFunctions* GetThreadCreator() {
return &thread_funcs;
}
// Browser interface helpers
const void* GetBrowserInterfaceSafe(const char* interface_name) {
const void* ppb_interface = GetBrowserInterface(interface_name);
if (ppb_interface == NULL)
DebugPrintf("PPB_GetInterface: %s not found\n", interface_name);
CHECK(ppb_interface != NULL);
return ppb_interface;
}
const PPB_Core* PPBCoreInterface() {
return static_cast<const PPB_Core*>(
GetBrowserInterfaceSafe(PPB_CORE_INTERFACE));
}
const PPB_Memory_Dev* PPBMemoryInterface() {
return static_cast<const PPB_Memory_Dev*>(
GetBrowserInterfaceSafe(PPB_MEMORY_DEV_INTERFACE));
}
const PPB_Var* PPBVarInterface() {
return static_cast<const PPB_Var*>(
GetBrowserInterfaceSafe(PPB_VAR_INTERFACE));
}
const PPB_VarArrayBuffer* PPBVarArrayBufferInterface() {
return static_cast<const PPB_VarArrayBuffer*>(
GetBrowserInterfaceSafe(PPB_VAR_ARRAY_BUFFER_INTERFACE));
}
const PPB_WebSocket* PPBWebSocketInterface() {
return static_cast<const PPB_WebSocket*>(
GetBrowserInterfaceSafe(PPB_WEBSOCKET_INTERFACE));
}
// Plugin interface helpers
const void* GetPluginInterface(const char* interface_name) {
return ::PPP_GetInterface(interface_name);
}
const void* GetPluginInterfaceSafe(const char* interface_name) {
const void* ppp_interface = GetPluginInterface(interface_name);
if (ppp_interface == NULL)
DebugPrintf("PPP_GetInterface: %s not found\n", interface_name);
CHECK(ppp_interface != NULL);
return ppp_interface;
}
const PPP_Find_Dev* PPPFindInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_FIND_DEV_INTERFACE);
return static_cast<const PPP_Find_Dev*>(ppp);
}
const PPP_InputEvent* PPPInputEventInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_INPUT_EVENT_INTERFACE);
return static_cast<const PPP_InputEvent*>(ppp);
}
PPP_Instance_Combined* PPPInstanceInterface() {
static PPP_Instance_Combined combined;
if (!combined.initialized()) {
// Note: don't use "safe" version since that will assert if 1.1 isn't
// supported, which isn't required.
const void* instance1_1 = GetPluginInterface(
PPP_INSTANCE_INTERFACE_1_1);
if (instance1_1) {
combined.Init1_1(static_cast<const PPP_Instance_1_1*>(instance1_1));
} else {
combined.Init1_0(static_cast<const PPP_Instance_1_0*>(
GetPluginInterfaceSafe(PPP_INSTANCE_INTERFACE_1_0)));
}
}
return &combined;
}
const PPP_Messaging* PPPMessagingInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_MESSAGING_INTERFACE);
return static_cast<const PPP_Messaging*>(ppp);
}
const PPP_MouseLock* PPPMouseLockInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_MOUSELOCK_INTERFACE);
return static_cast<const PPP_MouseLock*>(ppp);
}
const PPP_Printing_Dev* PPPPrintingInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_PRINTING_DEV_INTERFACE);
return static_cast<const PPP_Printing_Dev*>(ppp);
}
const PPP_Selection_Dev* PPPSelectionInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_SELECTION_DEV_INTERFACE);
return static_cast<const PPP_Selection_Dev*>(ppp);
}
const PPP_Zoom_Dev* PPPZoomInterface() {
static const void* ppp = GetPluginInterfaceSafe(PPP_ZOOM_DEV_INTERFACE);
return static_cast<const PPP_Zoom_Dev*>(ppp);
}
} // namespace ppapi_proxy
void PpapiPluginRegisterThreadCreator(
const struct PP_ThreadFunctions* new_funcs) {
thread_funcs = *new_funcs;
}
int IrtInit() {
// TODO(halyavin): this is needed for tests without IRT. They do not start
// in irt_entry.c where IrtInit is called.
static int initialized = 0;
if (initialized) {
return 0;
}
if (!NaClSrpcModuleInit()) {
return 1;
}
NaClLogModuleInit(); // Enable NaClLog'ing used by CHECK().
initialized = 1;
return 0;
}
int PpapiPluginMain() {
IrtInit();
// Designate this as the main thread for PPB_Core::IsMainThread().
ppapi_proxy::PluginCore::MarkMainThread();
if (!NaClSrpcAcceptClientConnection(PppRpcs::srpc_methods)) {
return 1;
}
NaClSrpcModuleFini();
return 0;
}