[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 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_PROXY_DISPATCHER_H_ | ||||
6 | #define PPAPI_PROXY_DISPATCHER_H_ | ||||
7 | |||||
[email protected] | 2cc06224 | 2011-03-10 21:16:34 | [diff] [blame] | 8 | #include <set> |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 9 | #include <string> |
10 | #include <vector> | ||||
11 | |||||
[email protected] | 7a1f7c6f | 2011-05-10 21:17:48 | [diff] [blame] | 12 | #include "base/callback.h" |
13 | #include "base/tracked_objects.h" | ||||
[email protected] | 1609d0d | 2011-04-15 22:06:21 | [diff] [blame] | 14 | #include "ipc/ipc_channel_proxy.h" |
[email protected] | 2cc06224 | 2011-03-10 21:16:34 | [diff] [blame] | 15 | #include "ppapi/c/pp_instance.h" |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 16 | #include "ppapi/c/pp_module.h" |
[email protected] | e2614c6 | 2011-04-16 22:12:45 | [diff] [blame] | 17 | #include "ppapi/proxy/proxy_channel.h" |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 18 | #include "ppapi/proxy/interface_list.h" |
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 19 | #include "ppapi/proxy/interface_proxy.h" |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 20 | #include "ppapi/proxy/plugin_var_tracker.h" |
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 21 | #include "ppapi/shared_impl/api_id.h" |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 22 | |
[email protected] | 55cdf605 | 2011-05-13 19:22:53 | [diff] [blame] | 23 | namespace ppapi { |
[email protected] | 7a1f7c6f | 2011-05-10 21:17:48 | [diff] [blame] | 24 | |
[email protected] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 25 | class WebKitForwarding; |
26 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 27 | namespace proxy { |
28 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 29 | class VarSerializationRules; |
30 | |||||
31 | // An interface proxy can represent either end of a cross-process interface | ||||
32 | // call. The "source" side is where the call is invoked, and the "target" side | ||||
33 | // is where the call ends up being executed. | ||||
34 | // | ||||
35 | // Plugin side | Browser side | ||||
36 | // -------------------------------------|-------------------------------------- | ||||
37 | // | | ||||
38 | // "Source" | "Target" | ||||
39 | // InterfaceProxy ----------------------> InterfaceProxy | ||||
40 | // | | ||||
41 | // | | ||||
42 | // "Target" | "Source" | ||||
43 | // InterfaceProxy <---------------------- InterfaceProxy | ||||
44 | // | | ||||
[email protected] | f0a04c4 | 2011-08-26 22:43:20 | [diff] [blame] | 45 | class PPAPI_PROXY_EXPORT Dispatcher : public ProxyChannel { |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 46 | public: |
47 | typedef const void* (*GetInterfaceFunc)(const char*); | ||||
[email protected] | 9c7baaef | 2010-11-10 05:42:46 | [diff] [blame] | 48 | typedef int32_t (*InitModuleFunc)(PP_Module, GetInterfaceFunc); |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 49 | |
[email protected] | 4f15d284 | 2011-02-15 17:36:33 | [diff] [blame] | 50 | virtual ~Dispatcher(); |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 51 | |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 52 | // Returns true if the dispatcher is on the plugin side, or false if it's the |
53 | // browser side. | ||||
54 | virtual bool IsPlugin() const = 0; | ||||
55 | |||||
56 | VarSerializationRules* serialization_rules() const { | ||||
57 | return serialization_rules_.get(); | ||||
58 | } | ||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 59 | |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 60 | // Returns a non-owning pointer to the interface proxy for the given ID, or |
61 | // NULL if the ID isn't found. This will create the proxy if it hasn't been | ||||
62 | // created so far. | ||||
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 63 | InterfaceProxy* GetInterfaceProxy(ApiID id); |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 64 | |
[email protected] | 1609d0d | 2011-04-15 22:06:21 | [diff] [blame] | 65 | // Returns the pointer to the IO thread for processing IPC messages. |
66 | // TODO(brettw) remove this. It's a hack to support the Flash | ||||
67 | // ModuleLocalThreadAdapter. When the thread stuff is sorted out, this | ||||
68 | // implementation detail should be hidden. | ||||
[email protected] | 92bf906 | 2011-05-02 18:00:49 | [diff] [blame] | 69 | base::MessageLoopProxy* GetIPCMessageLoop(); |
[email protected] | 1609d0d | 2011-04-15 22:06:21 | [diff] [blame] | 70 | |
71 | // Adds the given filter to the IO thread. Takes ownership of the pointer. | ||||
72 | // TODO(brettw) remove this. It's a hack to support the Flash | ||||
73 | // ModuleLocalThreadAdapter. When the thread stuff is sorted out, this | ||||
74 | // implementation detail should be hidden. | ||||
75 | void AddIOThreadMessageFilter(IPC::ChannelProxy::MessageFilter* filter); | ||||
76 | |||||
[email protected] | e2614c6 | 2011-04-16 22:12:45 | [diff] [blame] | 77 | // TODO(brettw): What is this comment referring to? |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 78 | // Called if the remote side is declaring to us which interfaces it supports |
79 | // so we don't have to query for each one. We'll pre-create proxies for | ||||
80 | // each of the given interfaces. | ||||
81 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 82 | // IPC::Channel::Listener implementation. |
[email protected] | a95986a8 | 2010-12-24 06:19:28 | [diff] [blame] | 83 | virtual bool OnMessageReceived(const IPC::Message& msg); |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 84 | |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 85 | GetInterfaceFunc local_get_interface() const { return local_get_interface_; } |
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 86 | |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 87 | protected: |
[email protected] | 5d84d01 | 2010-12-02 17:17:21 | [diff] [blame] | 88 | Dispatcher(base::ProcessHandle remote_process_handle, |
89 | GetInterfaceFunc local_get_interface); | ||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 90 | |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 91 | // Setter for the derived classes to set the appropriate var serialization. |
92 | // Takes ownership of the given pointer, which must be on the heap. | ||||
93 | void SetSerializationRules(VarSerializationRules* var_serialization_rules); | ||||
94 | |||||
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 95 | // Called when an invalid message is received from the remote site. The |
96 | // default implementation does nothing, derived classes can override. | ||||
97 | virtual void OnInvalidMessageReceived(); | ||||
98 | |||||
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 99 | bool disallow_trusted_interfaces() const { |
100 | return disallow_trusted_interfaces_; | ||||
101 | } | ||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 102 | |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 103 | private: |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 104 | friend class HostDispatcherTest; |
105 | friend class PluginDispatcherTest; | ||||
106 | |||||
107 | // Lists all lazily-created interface proxies. | ||||
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 108 | scoped_ptr<InterfaceProxy> proxies_[API_ID_COUNT]; |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 109 | |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 110 | bool disallow_trusted_interfaces_; |
111 | |||||
112 | GetInterfaceFunc local_get_interface_; | ||||
113 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 114 | scoped_ptr<VarSerializationRules> serialization_rules_; |
115 | |||||
116 | DISALLOW_COPY_AND_ASSIGN(Dispatcher); | ||||
117 | }; | ||||
118 | |||||
119 | } // namespace proxy | ||||
[email protected] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 120 | } // namespace ppapi |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 121 | |
122 | #endif // PPAPI_PROXY_DISPATCHER_H_ |