15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Need to include this before most other files because it defines 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_LOG_ENABLED. We need to use it to define 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC_MESSAGE_MACROS_LOG_ENABLED so ppapi_messages.h will generate the 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ViewMsgLog et al. functions. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/tracing/child_trace_message_filter.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_handle.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_logging.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/srpc/nacl_srpc.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt_ppapi.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/native_client/src/shared/ppapi_proxy/ppruntime.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_proxy_delegate.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_audio_shared.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_MESSAGE_LOG_ENABLED) 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LogFunctionMap g_log_function_mapping; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_MESSAGE_MACROS_LOG_ENABLED 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_LOG_TABLE_ADD_ENTRY(msg_id, logger) \ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_log_function_mapping[msg_id] = logger 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This must match up with NACL_CHROME_INITIAL_IPC_DESC, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined in sel_main_chrome.h 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NACL_IPC_FD 6 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::proxy::PluginDispatcher; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::proxy::PluginGlobals; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::proxy::PluginProxyDelegate; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::proxy::ProxyChannel; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::proxy::SerializedHandle; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages communication between the plugin and the browser, and 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// manages the PluginDispatcher instances for communication between the plugin 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and the renderer. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PpapiDispatcher : public ProxyChannel, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public PluginDispatcher::PluginDelegate, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public PluginProxyDelegate { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PpapiDispatcher(scoped_refptr<base::MessageLoopProxy> io_loop); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginDispatcher::PluginDelegate implementation. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::MessageLoopProxy* GetIPCMessageLoop() OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::WaitableEvent* GetShutdownEvent() OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual IPC::PlatformFileForTransit ShareHandleWithRemote( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile handle, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId peer_pid, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_close_source) OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::set<PP_Instance>* GetGloballySeenInstanceIDSet() OVERRIDE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual uint32 Register(PluginDispatcher* plugin_dispatcher) OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Unregister(uint32 plugin_dispatcher_id) OVERRIDE; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginProxyDelegate implementation. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual IPC::Sender* GetBrowserSender() OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetUILanguage() OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreCacheFont(const void* logfontw) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetActiveURL(const std::string& url) OVERRIDE; 8158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch virtual PP_Resource CreateBrowserFont( 8258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ppapi::proxy::Connection connection, 8358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 8458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_BrowserFont_Trusted_Description& desc, 8558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const ppapi::Preferences& prefs) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMsgCreateNaClChannel(int renderer_id, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ppapi::PpapiNaClChannelArgs& args, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedHandle handle); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnMsgResourceReply( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ppapi::proxy::ResourceMessageReplyParams& reply_params, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& nested_msg); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPluginDispatcherMessageReceived(const IPC::Message& msg); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<PP_Instance> instances_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<uint32, PluginDispatcher*> plugin_dispatchers_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 next_plugin_dispatcher_id_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> message_loop_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent shutdown_event_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PpapiDispatcher::PpapiDispatcher(scoped_refptr<base::MessageLoopProxy> io_loop) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : next_plugin_dispatcher_id_(0), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_(io_loop), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutdown_event_(true, false) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::ChannelHandle channel_handle( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NaCl IPC", base::FileDescriptor(NACL_IPC_FD, false)); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We don't have/need a PID since handle sharing happens outside of the 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NaCl sandbox. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitWithChannel(this, base::kNullProcessId, channel_handle, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); // Channel is server. 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch channel()->AddFilter( 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new tracing::ChildTraceMessageFilter(message_loop_.get())); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::MessageLoopProxy* PpapiDispatcher::GetIPCMessageLoop() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_loop_.get(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WaitableEvent* PpapiDispatcher::GetShutdownEvent() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &shutdown_event_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::PlatformFileForTransit PpapiDispatcher::ShareHandleWithRemote( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile handle, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ProcessId peer_pid, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_close_source) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IPC::InvalidPlatformFileForTransit(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::set<PP_Instance>* PpapiDispatcher::GetGloballySeenInstanceIDSet() { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &instances_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PpapiDispatcher::Register(PluginDispatcher* plugin_dispatcher) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_dispatcher || 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatchers_.size() >= std::numeric_limits<uint32>::max()) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 id = 0; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Although it is unlikely, make sure that we won't cause any trouble 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the counter overflows. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = next_plugin_dispatcher_id_++; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (id == 0 || 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatchers_.find(id) != plugin_dispatchers_.end()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatchers_[id] = plugin_dispatcher; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiDispatcher::Unregister(uint32 plugin_dispatcher_id) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatchers_.erase(plugin_dispatcher_id); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::Sender* PpapiDispatcher::GetBrowserSender() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string PpapiDispatcher::GetUILanguage() { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiDispatcher::PreCacheFont(const void* logfontw) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiDispatcher::SetActiveURL(const std::string& url) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Resource PpapiDispatcher::CreateBrowserFont( 17858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ppapi::proxy::Connection connection, 17958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 18058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_BrowserFont_Trusted_Description& desc, 18158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const ppapi::Preferences& prefs) { 18258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch NOTIMPLEMENTED(); 18358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return 0; 18458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 18558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PpapiDispatcher::OnMessageReceived(const IPC::Message& msg) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PpapiDispatcher, msg) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_CreateNaClChannel, OnMsgCreateNaClChannel) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiPluginMsg_ResourceReply, OnMsgResourceReply) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All other messages are simply forwarded to a PluginDispatcher. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(OnPluginDispatcherMessageReceived(msg)) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiDispatcher::OnMsgCreateNaClChannel( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int renderer_id, 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ppapi::PpapiNaClChannelArgs& args, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedHandle handle) { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool command_line_and_logging_initialized = false; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!command_line_and_logging_initialized) { 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine::Init(0, NULL); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < args.switch_names.size(); ++i) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(i < args.switch_values.size()); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitchASCII( 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) args.switch_names[i], args.switch_values[i]); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch logging::LoggingSettings settings; 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch logging::InitLogging(settings); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line_and_logging_initialized = true; 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the process-global GetInterface which interfaces it can return to the 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::proxy::InterfaceList::SetProcessGlobalPermissions( 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) args.permissions); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginDispatcher* dispatcher = 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new PluginDispatcher(::PPP_GetInterface, args.permissions, 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) args.off_the_record); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The channel handle's true name is not revealed here. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::ChannelHandle channel_handle("nacl", handle.descriptor()); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dispatcher->InitPluginWithChannel(this, base::kNullProcessId, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_handle, false)) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete dispatcher; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // From here, the dispatcher will manage its own lifetime according to the 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lifetime of the attached channel. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PpapiDispatcher::OnMsgResourceReply( 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ppapi::proxy::ResourceMessageReplyParams& reply_params, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& nested_msg) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::PluginDispatcher::DispatchResourceReply(reply_params, 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nested_msg); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiDispatcher::OnPluginDispatcherMessageReceived( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& msg) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first parameter should be a plugin dispatcher ID. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickleIterator iter(msg); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 id = 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!msg.ReadUInt32(&iter, &id)) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<uint32, ppapi::proxy::PluginDispatcher*>::iterator dispatcher = 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dispatchers_.find(id); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher != plugin_dispatchers_.end()) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->second->OnMessageReceived(msg); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PpapiPluginRegisterThreadCreator( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct PP_ThreadFunctions* thread_functions) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize all classes that need to create threads that call back into 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user code. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PPB_Audio_Shared::SetThreadFunctions(thread_functions); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PpapiPluginMain() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Though it isn't referenced here, we must instantiate an AtExitManager. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AtExitManager exit_manager; 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop loop; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Logging::set_log_function_map(&g_log_function_mapping); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::proxy::PluginGlobals plugin_globals; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread io_thread("Chrome_NaClIOThread"); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options options; 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) options.message_loop_type = base::MessageLoop::TYPE_IO; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread.StartWithOptions(options); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start up the SRPC server on another thread. Otherwise, when it blocks 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on an RPC, the PPAPI proxy will hang. Do this before we initialize the 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // module and start the PPAPI proxy so that the NaCl plugin can continue 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading the app. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static struct NaClSrpcHandlerDesc srpc_methods[] = { { NULL, NULL } }; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!NaClSrpcAcceptClientOnThread(srpc_methods)) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t error = ::PPP_InitializeModule( 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /* module */, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ppapi::proxy::PluginDispatcher::GetBrowserInterface); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmichael): Handle other error conditions, like failure to connect? 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiDispatcher ppapi_dispatcher(io_thread.message_loop_proxy()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_globals.set_plugin_proxy_delegate(&ppapi_dispatcher); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop.Run(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 297