| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 IPC_IPC_CHANNEL_PROXY_H_ | 5 #ifndef IPC_IPC_CHANNEL_PROXY_H_ |
| 6 #define IPC_IPC_CHANNEL_PROXY_H_ | 6 #define IPC_IPC_CHANNEL_PROXY_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 template <typename Interface> | 182 template <typename Interface> |
| 183 void AddAssociatedInterface( | 183 void AddAssociatedInterface( |
| 184 const AssociatedInterfaceFactory<Interface>& factory) { | 184 const AssociatedInterfaceFactory<Interface>& factory) { |
| 185 AddGenericAssociatedInterface( | 185 AddGenericAssociatedInterface( |
| 186 Interface::Name_, | 186 Interface::Name_, |
| 187 base::Bind(&ChannelProxy::BindAssociatedInterfaceRequest<Interface>, | 187 base::Bind(&ChannelProxy::BindAssociatedInterfaceRequest<Interface>, |
| 188 factory)); | 188 factory)); |
| 189 } | 189 } |
| 190 | 190 |
| 191 // Gets the AssociatedGroup used to create new associated endpoints on this | 191 // Gets the AssociatedGroup used to create new associated endpoints on this |
| 192 // ChannelProxy. | 192 // ChannelProxy. This must only be called after the listener's |
| 193 // OnChannelConnected is called. |
| 193 mojo::AssociatedGroup* GetAssociatedGroup(); | 194 mojo::AssociatedGroup* GetAssociatedGroup(); |
| 194 | 195 |
| 195 // Requests an associated interface from the remote endpoint. | 196 // Requests an associated interface from the remote endpoint. |
| 196 void GetGenericRemoteAssociatedInterface( | 197 void GetGenericRemoteAssociatedInterface( |
| 197 const std::string& name, | 198 const std::string& name, |
| 198 mojo::ScopedInterfaceEndpointHandle handle); | 199 mojo::ScopedInterfaceEndpointHandle handle); |
| 199 | 200 |
| 200 // Template helper to request associated interfaces from the remote endpoint. | 201 // Template helper to request associated interfaces from the remote endpoint. |
| 202 // Must only be called after the listener's OnChannelConnected is called. |
| 201 template <typename Interface> | 203 template <typename Interface> |
| 202 void GetRemoteAssociatedInterface( | 204 void GetRemoteAssociatedInterface( |
| 203 mojo::AssociatedInterfacePtr<Interface>* proxy) { | 205 mojo::AssociatedInterfacePtr<Interface>* proxy) { |
| 204 mojo::AssociatedInterfaceRequest<Interface> request = | 206 mojo::AssociatedInterfaceRequest<Interface> request = |
| 205 mojo::GetProxy(proxy, GetAssociatedGroup()); | 207 mojo::GetProxy(proxy, GetAssociatedGroup()); |
| 206 GetGenericRemoteAssociatedInterface(Interface::Name_, request.PassHandle()); | 208 GetGenericRemoteAssociatedInterface(Interface::Name_, request.PassHandle()); |
| 207 } | 209 } |
| 208 | 210 |
| 209 #if defined(ENABLE_IPC_FUZZER) | 211 #if defined(ENABLE_IPC_FUZZER) |
| 210 void set_outgoing_message_filter(OutgoingMessageFilter* filter) { | 212 void set_outgoing_message_filter(OutgoingMessageFilter* filter) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 222 #if defined(OS_POSIX) && !defined(OS_NACL_SFI) | 224 #if defined(OS_POSIX) && !defined(OS_NACL_SFI) |
| 223 // Calls through to the underlying channel's methods. | 225 // Calls through to the underlying channel's methods. |
| 224 int GetClientFileDescriptor(); | 226 int GetClientFileDescriptor(); |
| 225 base::ScopedFD TakeClientFileDescriptor(); | 227 base::ScopedFD TakeClientFileDescriptor(); |
| 226 #endif | 228 #endif |
| 227 | 229 |
| 228 protected: | 230 protected: |
| 229 class Context; | 231 class Context; |
| 230 // A subclass uses this constructor if it needs to add more information | 232 // A subclass uses this constructor if it needs to add more information |
| 231 // to the internal state. | 233 // to the internal state. |
| 232 explicit ChannelProxy(Context* context); | 234 ChannelProxy(Context* context); |
| 233 | 235 |
| 234 | 236 |
| 235 // Used internally to hold state that is referenced on the IPC thread. | 237 // Used internally to hold state that is referenced on the IPC thread. |
| 236 class Context : public base::RefCountedThreadSafe<Context>, | 238 class Context : public base::RefCountedThreadSafe<Context>, |
| 237 public Listener { | 239 public Listener { |
| 238 public: | 240 public: |
| 239 Context(Listener* listener, | 241 Context(Listener* listener, |
| 240 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_thread); | 242 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_thread); |
| 241 void ClearIPCTaskRunner(); | 243 void ClearIPCTaskRunner(); |
| 242 base::SingleThreadTaskRunner* ipc_task_runner() const { | 244 base::SingleThreadTaskRunner* ipc_task_runner() const { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 | 305 |
| 304 // Methods called on the listener thread. | 306 // Methods called on the listener thread. |
| 305 void AddFilter(MessageFilter* filter); | 307 void AddFilter(MessageFilter* filter); |
| 306 void OnDispatchConnected(); | 308 void OnDispatchConnected(); |
| 307 void OnDispatchError(); | 309 void OnDispatchError(); |
| 308 void OnDispatchBadMessage(const Message& message); | 310 void OnDispatchBadMessage(const Message& message); |
| 309 | 311 |
| 310 void SendFromThisThread(Message* message); | 312 void SendFromThisThread(Message* message); |
| 311 void ClearChannel(); | 313 void ClearChannel(); |
| 312 | 314 |
| 313 mojo::AssociatedGroup* associated_group() { return &associated_group_; } | |
| 314 | |
| 315 void AddGenericAssociatedInterface( | |
| 316 const std::string& name, | |
| 317 const GenericAssociatedInterfaceFactory& factory); | |
| 318 void AddGenericAssociatedInterfaceForIOThread( | |
| 319 const std::string& name, | |
| 320 const GenericAssociatedInterfaceFactory& factory); | |
| 321 | |
| 322 scoped_refptr<base::SingleThreadTaskRunner> listener_task_runner_; | 315 scoped_refptr<base::SingleThreadTaskRunner> listener_task_runner_; |
| 323 Listener* listener_; | 316 Listener* listener_; |
| 324 | 317 |
| 325 // List of filters. This is only accessed on the IPC thread. | 318 // List of filters. This is only accessed on the IPC thread. |
| 326 std::vector<scoped_refptr<MessageFilter> > filters_; | 319 std::vector<scoped_refptr<MessageFilter> > filters_; |
| 327 scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_; | 320 scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_; |
| 328 | 321 |
| 329 // Note, channel_ may be set on the Listener thread or the IPC thread. | 322 // Note, channel_ may be set on the Listener thread or the IPC thread. |
| 330 // But once it has been set, it must only be read or cleared on the IPC | 323 // But once it has been set, it must only be read or cleared on the IPC |
| 331 // thread. | 324 // thread. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 353 | 346 |
| 354 // Cached copy of the peer process ID. Set on IPC but read on both IPC and | 347 // Cached copy of the peer process ID. Set on IPC but read on both IPC and |
| 355 // listener threads. | 348 // listener threads. |
| 356 base::ProcessId peer_pid_; | 349 base::ProcessId peer_pid_; |
| 357 base::Lock peer_pid_lock_; | 350 base::Lock peer_pid_lock_; |
| 358 | 351 |
| 359 // Whether this channel is used as an endpoint for sending and receiving | 352 // Whether this channel is used as an endpoint for sending and receiving |
| 360 // brokerable attachment messages to/from the broker process. | 353 // brokerable attachment messages to/from the broker process. |
| 361 bool attachment_broker_endpoint_; | 354 bool attachment_broker_endpoint_; |
| 362 | 355 |
| 363 mojo::AssociatedGroup associated_group_; | 356 // Modified only on the listener's thread before Init() is called. |
| 357 std::map<std::string, GenericAssociatedInterfaceFactory> |
| 358 io_thread_interfaces_; |
| 359 std::map<std::string, GenericAssociatedInterfaceFactory> |
| 360 proxy_thread_interfaces_; |
| 364 | 361 |
| 365 // Holds associated interface binders added by AddGenericAssociatedInterface | 362 // Valid and constant any time after the ChannelProxy's Listener receives |
| 366 // or AddGenericAssociatedInterfaceForIOThread until the underlying channel | 363 // OnChannelConnected on its own thread. |
| 367 // has been initialized. This is only accessed from the listener thread. | 364 std::unique_ptr<mojo::AssociatedGroup> channel_associated_group_; |
| 368 std::vector<std::pair<std::string, GenericAssociatedInterfaceFactory>> | |
| 369 pending_interfaces_; | |
| 370 }; | 365 }; |
| 371 | 366 |
| 372 Context* context() { return context_.get(); } | 367 Context* context() { return context_.get(); } |
| 373 | 368 |
| 374 #if defined(ENABLE_IPC_FUZZER) | 369 #if defined(ENABLE_IPC_FUZZER) |
| 375 OutgoingMessageFilter* outgoing_message_filter() const { | 370 OutgoingMessageFilter* outgoing_message_filter() const { |
| 376 return outgoing_message_filter_; | 371 return outgoing_message_filter_; |
| 377 } | 372 } |
| 378 #endif | 373 #endif |
| 379 | 374 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 404 bool did_init_; | 399 bool did_init_; |
| 405 | 400 |
| 406 #if defined(ENABLE_IPC_FUZZER) | 401 #if defined(ENABLE_IPC_FUZZER) |
| 407 OutgoingMessageFilter* outgoing_message_filter_; | 402 OutgoingMessageFilter* outgoing_message_filter_; |
| 408 #endif | 403 #endif |
| 409 }; | 404 }; |
| 410 | 405 |
| 411 } // namespace IPC | 406 } // namespace IPC |
| 412 | 407 |
| 413 #endif // IPC_IPC_CHANNEL_PROXY_H_ | 408 #endif // IPC_IPC_CHANNEL_PROXY_H_ |
| OLD | NEW |