Home | History | Annotate | Download | only in nacl_irt
      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