| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef PPAPI_PROXY_DISPATCHER_H_ | 5 #ifndef PPAPI_PROXY_DISPATCHER_H_ |
| 6 #define PPAPI_PROXY_DISPATCHER_H_ | 6 #define PPAPI_PROXY_DISPATCHER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 // "Target" | "Source" | 52 // "Target" | "Source" |
| 53 // InterfaceProxy <---------------------- InterfaceProxy | 53 // InterfaceProxy <---------------------- InterfaceProxy |
| 54 // | | 54 // | |
| 55 class Dispatcher : public IPC::Channel::Listener, | 55 class Dispatcher : public IPC::Channel::Listener, |
| 56 public IPC::Message::Sender { | 56 public IPC::Message::Sender { |
| 57 public: | 57 public: |
| 58 typedef const void* (*GetInterfaceFunc)(const char*); | 58 typedef const void* (*GetInterfaceFunc)(const char*); |
| 59 typedef int32_t (*InitModuleFunc)(PP_Module, GetInterfaceFunc); | 59 typedef int32_t (*InitModuleFunc)(PP_Module, GetInterfaceFunc); |
| 60 typedef void (*ShutdownModuleFunc)(); | 60 typedef void (*ShutdownModuleFunc)(); |
| 61 | 61 |
| 62 ~Dispatcher(); | 62 virtual ~Dispatcher(); |
| 63 | 63 |
| 64 // You must call this function before anything else. Returns true on success. | 64 // You must call this function before anything else. Returns true on success. |
| 65 bool InitWithChannel(MessageLoop* ipc_message_loop, | 65 bool InitWithChannel(MessageLoop* ipc_message_loop, |
| 66 const IPC::ChannelHandle& channel_handle, | 66 const IPC::ChannelHandle& channel_handle, |
| 67 bool is_client, | 67 bool is_client, |
| 68 base::WaitableEvent* shutdown_event); | 68 base::WaitableEvent* shutdown_event); |
| 69 | 69 |
| 70 // Alternative to InitWithChannel() for unit tests that want to send all | 70 // Alternative to InitWithChannel() for unit tests that want to send all |
| 71 // messages sent via this dispatcher to the given test sink. The test sink | 71 // messages sent via this dispatcher to the given test sink. The test sink |
| 72 // must outlive this class. | 72 // must outlive this class. |
| 73 void InitWithTestSink(IPC::TestSink* test_sink); | 73 void InitWithTestSink(IPC::TestSink* test_sink); |
| 74 | 74 |
| 75 // Returns true if the dispatcher is on the plugin side, or false if it's the | 75 // Returns true if the dispatcher is on the plugin side, or false if it's the |
| 76 // browser side. | 76 // browser side. |
| 77 virtual bool IsPlugin() const = 0; | 77 virtual bool IsPlugin() const = 0; |
| 78 | 78 |
| 79 VarSerializationRules* serialization_rules() const { | 79 VarSerializationRules* serialization_rules() const { |
| 80 return serialization_rules_.get(); | 80 return serialization_rules_.get(); |
| 81 } | 81 } |
| 82 PP_Module pp_module() const { | |
| 83 return pp_module_; | |
| 84 } | |
| 85 | 82 |
| 86 // Wrapper for calling the local GetInterface function. | 83 // Wrapper for calling the local GetInterface function. |
| 87 const void* GetLocalInterface(const char* interface); | 84 const void* GetLocalInterface(const char* interface); |
| 88 | 85 |
| 89 // Returns the remote process' handle. For the host dispatcher, this will be | 86 // Returns the remote process' handle. For the host dispatcher, this will be |
| 90 // the plugin process, and for the plugin dispatcher, this will be the | 87 // the plugin process, and for the plugin dispatcher, this will be the |
| 91 // renderer process. This is used for sharing memory and such and is | 88 // renderer process. This is used for sharing memory and such and is |
| 92 // guaranteed valid (unless the remote process has suddenly died). | 89 // guaranteed valid (unless the remote process has suddenly died). |
| 93 base::ProcessHandle remote_process_handle() const { | 90 base::ProcessHandle remote_process_handle() const { |
| 94 return remote_process_handle_; | 91 return remote_process_handle_; |
| 95 } | 92 } |
| 96 | 93 |
| 97 // Called if the remote side is declaring to us which interfaces it supports | 94 // Called if the remote side is declaring to us which interfaces it supports |
| 98 // so we don't have to query for each one. We'll pre-create proxies for | 95 // so we don't have to query for each one. We'll pre-create proxies for |
| 99 // each of the given interfaces. | 96 // each of the given interfaces. |
| 100 | 97 |
| 101 // IPC::Message::Sender implementation. | 98 // IPC::Message::Sender implementation. |
| 102 virtual bool Send(IPC::Message* msg); | 99 virtual bool Send(IPC::Message* msg); |
| 103 | 100 |
| 104 // IPC::Channel::Listener implementation. | 101 // IPC::Channel::Listener implementation. |
| 105 virtual bool OnMessageReceived(const IPC::Message& msg); | 102 virtual bool OnMessageReceived(const IPC::Message& msg); |
| 103 virtual void OnChannelError(); |
| 106 | 104 |
| 107 // Will be NULL in some unit tests. | 105 // Will be NULL in some unit tests and if the remote side has crashed. |
| 108 IPC::SyncChannel* channel() const { | 106 IPC::SyncChannel* channel() const { |
| 109 return channel_.get(); | 107 return channel_.get(); |
| 110 } | 108 } |
| 111 | 109 |
| 112 CallbackTracker& callback_tracker() { | 110 CallbackTracker& callback_tracker() { |
| 113 return callback_tracker_; | 111 return callback_tracker_; |
| 114 } | 112 } |
| 115 | 113 |
| 116 // Retrieves the information associated with the given interface, identified | 114 // Retrieves the information associated with the given interface, identified |
| 117 // either by name or ID. Each function searches either PPP or PPB interfaces. | 115 // either by name or ID. Each function searches either PPP or PPB interfaces. |
| 118 static const InterfaceProxy::Info* GetPPBInterfaceInfo( | 116 static const InterfaceProxy::Info* GetPPBInterfaceInfo( |
| 119 const std::string& name); | 117 const std::string& name); |
| 120 static const InterfaceProxy::Info* GetPPBInterfaceInfo( | 118 static const InterfaceProxy::Info* GetPPBInterfaceInfo( |
| 121 InterfaceID id); | 119 InterfaceID id); |
| 122 static const InterfaceProxy::Info* GetPPPInterfaceInfo( | 120 static const InterfaceProxy::Info* GetPPPInterfaceInfo( |
| 123 const std::string& name); | 121 const std::string& name); |
| 124 static const InterfaceProxy::Info* GetPPPInterfaceInfo( | 122 static const InterfaceProxy::Info* GetPPPInterfaceInfo( |
| 125 InterfaceID id); | 123 InterfaceID id); |
| 126 | 124 |
| 127 protected: | 125 protected: |
| 128 Dispatcher(base::ProcessHandle remote_process_handle, | 126 Dispatcher(base::ProcessHandle remote_process_handle, |
| 129 GetInterfaceFunc local_get_interface); | 127 GetInterfaceFunc local_get_interface); |
| 130 | 128 |
| 131 // Setter for the derived classes to set the appropriate var serialization. | 129 // Setter for the derived classes to set the appropriate var serialization. |
| 132 // Takes ownership of the given pointer, which must be on the heap. | 130 // Takes ownership of the given pointer, which must be on the heap. |
| 133 void SetSerializationRules(VarSerializationRules* var_serialization_rules); | 131 void SetSerializationRules(VarSerializationRules* var_serialization_rules); |
| 134 | 132 |
| 135 void set_pp_module(PP_Module module) { | |
| 136 pp_module_ = module; | |
| 137 } | |
| 138 | |
| 139 bool disallow_trusted_interfaces() const { | 133 bool disallow_trusted_interfaces() const { |
| 140 return disallow_trusted_interfaces_; | 134 return disallow_trusted_interfaces_; |
| 141 } | 135 } |
| 142 | 136 |
| 143 private: | 137 private: |
| 144 // Set by the derived classed to indicate the module ID corresponding to | |
| 145 // this dispatcher. | |
| 146 PP_Module pp_module_; | |
| 147 | |
| 148 base::ProcessHandle remote_process_handle_; // See getter above. | 138 base::ProcessHandle remote_process_handle_; // See getter above. |
| 149 | 139 |
| 150 // When we're unit testing, this will indicate the sink for the messages to | 140 // When we're unit testing, this will indicate the sink for the messages to |
| 151 // be deposited so they can be inspected by the test. When non-NULL, this | 141 // be deposited so they can be inspected by the test. When non-NULL, this |
| 152 // indicates that the channel should not be used. | 142 // indicates that the channel should not be used. |
| 153 IPC::TestSink* test_sink_; | 143 IPC::TestSink* test_sink_; |
| 154 | 144 |
| 155 // Will be null for some tests when there is a test_sink_. | 145 // Will be null for some tests when there is a test_sink_, and if the |
| 146 // remote side has crashed. |
| 156 scoped_ptr<IPC::SyncChannel> channel_; | 147 scoped_ptr<IPC::SyncChannel> channel_; |
| 157 | 148 |
| 158 bool disallow_trusted_interfaces_; | 149 bool disallow_trusted_interfaces_; |
| 159 | 150 |
| 160 GetInterfaceFunc local_get_interface_; | 151 GetInterfaceFunc local_get_interface_; |
| 161 | 152 |
| 162 CallbackTracker callback_tracker_; | 153 CallbackTracker callback_tracker_; |
| 163 | 154 |
| 164 scoped_ptr<VarSerializationRules> serialization_rules_; | 155 scoped_ptr<VarSerializationRules> serialization_rules_; |
| 165 | 156 |
| 166 DISALLOW_COPY_AND_ASSIGN(Dispatcher); | 157 DISALLOW_COPY_AND_ASSIGN(Dispatcher); |
| 167 }; | 158 }; |
| 168 | 159 |
| 169 } // namespace proxy | 160 } // namespace proxy |
| 170 } // namespace pp | 161 } // namespace pp |
| 171 | 162 |
| 172 #endif // PPAPI_PROXY_DISPATCHER_H_ | 163 #endif // PPAPI_PROXY_DISPATCHER_H_ |
| OLD | NEW |