• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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