1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef PPAPI_NACL_IRT_PPAPI_DISPATCHER_H_ 6 #define PPAPI_NACL_IRT_PPAPI_DISPATCHER_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 12 #include "base/files/file.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/process/process_handle.h" 15 #include "ipc/ipc_listener.h" 16 #include "ipc/ipc_platform_file.h" 17 #include "ipc/ipc_sender.h" 18 #include "ppapi/c/pp_instance.h" 19 #include "ppapi/c/trusted/ppb_browser_font_trusted.h" 20 #include "ppapi/proxy/connection.h" 21 #include "ppapi/proxy/plugin_dispatcher.h" 22 #include "ppapi/proxy/plugin_proxy_delegate.h" 23 24 struct PP_BrowserFont_Trusted_Description; 25 26 namespace base { 27 class MessageLoopProxy; 28 class WaitableEvent; 29 } // namespace base 30 31 namespace IPC { 32 class Message; 33 class SyncChannel; 34 } // namespace IPC 35 36 namespace ppapi { 37 38 struct PpapiNaClPluginArgs; 39 struct Preferences; 40 41 // This class manages communication between the plugin and the browser, and 42 // manages the PluginDispatcher instances for communication between the plugin 43 // and the renderer. 44 class PpapiDispatcher : public proxy::PluginDispatcher::PluginDelegate, 45 public proxy::PluginProxyDelegate, 46 public IPC::Listener, 47 public IPC::Sender { 48 public: 49 PpapiDispatcher(scoped_refptr<base::MessageLoopProxy> io_loop, 50 base::WaitableEvent* shutdown_event, 51 int browser_ipc_fd, 52 int renderer_ipc_fd); 53 54 // PluginDispatcher::PluginDelegate implementation. 55 virtual base::MessageLoopProxy* GetIPCMessageLoop() OVERRIDE; 56 virtual base::WaitableEvent* GetShutdownEvent() OVERRIDE; 57 virtual IPC::PlatformFileForTransit ShareHandleWithRemote( 58 base::PlatformFile handle, 59 base::ProcessId peer_pid, 60 bool should_close_source) OVERRIDE; 61 virtual std::set<PP_Instance>* GetGloballySeenInstanceIDSet() OVERRIDE; 62 virtual uint32 Register( 63 proxy::PluginDispatcher* plugin_dispatcher) OVERRIDE; 64 virtual void Unregister(uint32 plugin_dispatcher_id) OVERRIDE; 65 66 // PluginProxyDelegate implementation. 67 virtual IPC::Sender* GetBrowserSender() OVERRIDE; 68 virtual std::string GetUILanguage() OVERRIDE; 69 virtual void PreCacheFont(const void* logfontw) OVERRIDE; 70 virtual void SetActiveURL(const std::string& url) OVERRIDE; 71 virtual PP_Resource CreateBrowserFont( 72 proxy::Connection connection, 73 PP_Instance instance, 74 const PP_BrowserFont_Trusted_Description& desc, 75 const Preferences& prefs) OVERRIDE; 76 77 // IPC::Listener implementation. 78 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 79 virtual void OnChannelError() OVERRIDE; 80 81 // IPC::Sender implementation 82 virtual bool Send(IPC::Message* message) OVERRIDE; 83 84 private: 85 void OnMsgInitializeNaClDispatcher(const PpapiNaClPluginArgs& args); 86 void OnPluginDispatcherMessageReceived(const IPC::Message& msg); 87 88 std::set<PP_Instance> instances_; 89 std::map<uint32, proxy::PluginDispatcher*> plugin_dispatchers_; 90 uint32 next_plugin_dispatcher_id_; 91 92 scoped_refptr<base::MessageLoopProxy> message_loop_; 93 base::WaitableEvent* shutdown_event_; 94 int renderer_ipc_fd_; 95 scoped_ptr<IPC::SyncChannel> channel_; 96 }; 97 98 } // namespace ppapi 99 100 #endif // PPAPI_NACL_IRT_PPAPI_DISPATCHER_H_ 101