| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/callback_forward.h" | 11 #include "base/callback_forward.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "mojo/public/cpp/bindings/connection_error_callback.h" | 16 #include "mojo/public/cpp/bindings/connection_error_callback.h" |
| 17 #include "mojo/public/cpp/bindings/interface_ptr.h" | 17 #include "mojo/public/cpp/bindings/interface_ptr.h" |
| 18 #include "mojo/public/cpp/bindings/interface_ptr_info.h" | 18 #include "mojo/public/cpp/bindings/interface_ptr_info.h" |
| 19 #include "mojo/public/cpp/bindings/interface_request.h" | 19 #include "mojo/public/cpp/bindings/interface_request.h" |
| 20 #include "mojo/public/cpp/bindings/lib/binding_state.h" | 20 #include "mojo/public/cpp/bindings/lib/binding_state.h" |
| 21 #include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h" |
| 21 #include "mojo/public/cpp/system/core.h" | 22 #include "mojo/public/cpp/system/core.h" |
| 22 | 23 |
| 23 namespace mojo { | 24 namespace mojo { |
| 24 | 25 |
| 25 class AssociatedGroup; | 26 class AssociatedGroup; |
| 26 class MessageReceiver; | 27 class MessageReceiver; |
| 27 | 28 |
| 28 // Represents the binding of an interface implementation to a message pipe. | 29 // Represents the binding of an interface implementation to a message pipe. |
| 29 // When the |Binding| object is destroyed, the binding between the message pipe | 30 // When the |Binding| object is destroyed, the binding between the message pipe |
| 30 // and the interface is torn down and the message pipe is closed, leaving the | 31 // and the interface is torn down and the message pipe is closed, leaving the |
| (...skipping 28 matching lines...) Expand all Loading... |
| 59 // methods will be called from the thread that bound this. If a Binding is not | 60 // methods will be called from the thread that bound this. If a Binding is not |
| 60 // bound to a message pipe, it may be bound or destroyed on any thread. | 61 // bound to a message pipe, it may be bound or destroyed on any thread. |
| 61 // | 62 // |
| 62 // When you bind this class to a message pipe, optionally you can specify a | 63 // When you bind this class to a message pipe, optionally you can specify a |
| 63 // base::SingleThreadTaskRunner. This task runner must belong to the same | 64 // base::SingleThreadTaskRunner. This task runner must belong to the same |
| 64 // thread. It will be used to dispatch incoming method calls and connection | 65 // thread. It will be used to dispatch incoming method calls and connection |
| 65 // error notification. It is useful when you attach multiple task runners to a | 66 // error notification. It is useful when you attach multiple task runners to a |
| 66 // single thread for the purposes of task scheduling. Please note that incoming | 67 // single thread for the purposes of task scheduling. Please note that incoming |
| 67 // synchrounous method calls may not be run from this task runner, when they | 68 // synchrounous method calls may not be run from this task runner, when they |
| 68 // reenter outgoing synchrounous calls on the same thread. | 69 // reenter outgoing synchrounous calls on the same thread. |
| 69 template <typename Interface> | 70 template <typename Interface, |
| 71 typename ImplRefTraits = RawPtrImplRefTraits<Interface>> |
| 70 class Binding { | 72 class Binding { |
| 71 public: | 73 public: |
| 74 using ImplPointerType = typename ImplRefTraits::PointerType; |
| 75 |
| 72 // Constructs an incomplete binding that will use the implementation |impl|. | 76 // Constructs an incomplete binding that will use the implementation |impl|. |
| 73 // The binding may be completed with a subsequent call to the |Bind| method. | 77 // The binding may be completed with a subsequent call to the |Bind| method. |
| 74 // Does not take ownership of |impl|, which must outlive the binding. | 78 // Does not take ownership of |impl|, which must outlive the binding. |
| 75 explicit Binding(Interface* impl) : internal_state_(impl) {} | 79 explicit Binding(ImplPointerType impl) : internal_state_(std::move(impl)) {} |
| 76 | 80 |
| 77 // Constructs a completed binding of message pipe |handle| to implementation | 81 // Constructs a completed binding of message pipe |handle| to implementation |
| 78 // |impl|. Does not take ownership of |impl|, which must outlive the binding. | 82 // |impl|. Does not take ownership of |impl|, which must outlive the binding. |
| 79 Binding(Interface* impl, | 83 Binding(ImplPointerType impl, |
| 80 ScopedMessagePipeHandle handle, | 84 ScopedMessagePipeHandle handle, |
| 81 scoped_refptr<base::SingleThreadTaskRunner> runner = | 85 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 82 base::ThreadTaskRunnerHandle::Get()) | 86 base::ThreadTaskRunnerHandle::Get()) |
| 83 : Binding(impl) { | 87 : Binding(std::move(impl)) { |
| 84 Bind(std::move(handle), std::move(runner)); | 88 Bind(std::move(handle), std::move(runner)); |
| 85 } | 89 } |
| 86 | 90 |
| 87 // Constructs a completed binding of |impl| to a new message pipe, passing the | 91 // Constructs a completed binding of |impl| to a new message pipe, passing the |
| 88 // client end to |ptr|, which takes ownership of it. The caller is expected to | 92 // client end to |ptr|, which takes ownership of it. The caller is expected to |
| 89 // pass |ptr| on to the client of the service. Does not take ownership of any | 93 // pass |ptr| on to the client of the service. Does not take ownership of any |
| 90 // of the parameters. |impl| must outlive the binding. |ptr| only needs to | 94 // of the parameters. |impl| must outlive the binding. |ptr| only needs to |
| 91 // last until the constructor returns. | 95 // last until the constructor returns. |
| 92 Binding(Interface* impl, | 96 Binding(ImplPointerType impl, |
| 93 InterfacePtr<Interface>* ptr, | 97 InterfacePtr<Interface>* ptr, |
| 94 scoped_refptr<base::SingleThreadTaskRunner> runner = | 98 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 95 base::ThreadTaskRunnerHandle::Get()) | 99 base::ThreadTaskRunnerHandle::Get()) |
| 96 : Binding(impl) { | 100 : Binding(std::move(impl)) { |
| 97 Bind(ptr, std::move(runner)); | 101 Bind(ptr, std::move(runner)); |
| 98 } | 102 } |
| 99 | 103 |
| 100 // Constructs a completed binding of |impl| to the message pipe endpoint in | 104 // Constructs a completed binding of |impl| to the message pipe endpoint in |
| 101 // |request|, taking ownership of the endpoint. Does not take ownership of | 105 // |request|, taking ownership of the endpoint. Does not take ownership of |
| 102 // |impl|, which must outlive the binding. | 106 // |impl|, which must outlive the binding. |
| 103 Binding(Interface* impl, | 107 Binding(ImplPointerType impl, |
| 104 InterfaceRequest<Interface> request, | 108 InterfaceRequest<Interface> request, |
| 105 scoped_refptr<base::SingleThreadTaskRunner> runner = | 109 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 106 base::ThreadTaskRunnerHandle::Get()) | 110 base::ThreadTaskRunnerHandle::Get()) |
| 107 : Binding(impl) { | 111 : Binding(std::move(impl)) { |
| 108 Bind(request.PassMessagePipe(), std::move(runner)); | 112 Bind(request.PassMessagePipe(), std::move(runner)); |
| 109 } | 113 } |
| 110 | 114 |
| 111 // Tears down the binding, closing the message pipe and leaving the interface | 115 // Tears down the binding, closing the message pipe and leaving the interface |
| 112 // implementation unbound. | 116 // implementation unbound. |
| 113 ~Binding() {} | 117 ~Binding() {} |
| 114 | 118 |
| 115 // Returns an InterfacePtr bound to one end of a pipe whose other end is | 119 // Returns an InterfacePtr bound to one end of a pipe whose other end is |
| 116 // bound to |this|. | 120 // bound to |this|. |
| 117 InterfacePtr<Interface> CreateInterfacePtrAndBind( | 121 InterfacePtr<Interface> CreateInterfacePtrAndBind( |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 // Sends a no-op message on the underlying message pipe and runs the current | 268 // Sends a no-op message on the underlying message pipe and runs the current |
| 265 // message loop until its response is received. This can be used in tests to | 269 // message loop until its response is received. This can be used in tests to |
| 266 // verify that no message was sent on a message pipe in response to some | 270 // verify that no message was sent on a message pipe in response to some |
| 267 // stimulus. | 271 // stimulus. |
| 268 void FlushForTesting() { internal_state_.FlushForTesting(); } | 272 void FlushForTesting() { internal_state_.FlushForTesting(); } |
| 269 | 273 |
| 270 // Exposed for testing, should not generally be used. | 274 // Exposed for testing, should not generally be used. |
| 271 void EnableTestingMode() { internal_state_.EnableTestingMode(); } | 275 void EnableTestingMode() { internal_state_.EnableTestingMode(); } |
| 272 | 276 |
| 273 private: | 277 private: |
| 274 internal::BindingState<Interface, true> internal_state_; | 278 internal::BindingState<Interface, true, ImplRefTraits> internal_state_; |
| 275 | 279 |
| 276 DISALLOW_COPY_AND_ASSIGN(Binding); | 280 DISALLOW_COPY_AND_ASSIGN(Binding); |
| 277 }; | 281 }; |
| 278 | 282 |
| 279 } // namespace mojo | 283 } // namespace mojo |
| 280 | 284 |
| 281 #endif // MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ | 285 #endif // MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ |
| OLD | NEW |