Index: third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h b/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c65f6e38870c490c284fe9c7aabbbf09ef451f70 |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h |
@@ -0,0 +1,178 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_ |
+#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_ |
+ |
+#include "mojo/public/cpp/bindings/binding.h" |
+#include "mojo/public/cpp/bindings/interface_ptr_info.h" |
+#include "mojo/public/cpp/bindings/interface_request.h" |
+#include "mojo/public/cpp/environment/environment.h" |
+#include "mojo/public/cpp/system/macros.h" |
+ |
+namespace mojo { |
+ |
+// DEPRECATED! Please use mojo::Binding instead of InterfaceImpl<> in new code. |
+// |
+// InterfaceImpl<..> is designed to be the base class of an interface |
+// implementation. It may be bound to a pipe or a proxy, see BindToPipe and |
+// BindToProxy. |
+template <typename Interface> |
+class InterfaceImpl : public Interface, public ErrorHandler { |
+ public: |
+ using ImplementedInterface = Interface; |
+ |
+ InterfaceImpl() : binding_(this), error_handler_impl_(this) { |
+ binding_.set_error_handler(&error_handler_impl_); |
+ } |
+ virtual ~InterfaceImpl() {} |
+ |
+ void BindToHandle( |
+ ScopedMessagePipeHandle handle, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ binding_.Bind(handle.Pass(), waiter); |
+ } |
+ |
+ bool WaitForIncomingMethodCall() { |
+ return binding_.WaitForIncomingMethodCall(); |
+ } |
+ |
+ internal::Router* internal_router() { return binding_.internal_router(); } |
+ |
+ // Implements ErrorHandler. |
+ // |
+ // Called when the underlying pipe is closed. After this point no more |
+ // calls will be made on Interface and all responses will be silently ignored. |
+ void OnConnectionError() override {} |
+ |
+ void set_delete_on_error(bool delete_on_error) { |
+ error_handler_impl_.set_delete_on_error(delete_on_error); |
+ } |
+ |
+ private: |
+ class ErrorHandlerImpl : public ErrorHandler { |
+ public: |
+ explicit ErrorHandlerImpl(InterfaceImpl* impl) : impl_(impl) {} |
+ ~ErrorHandlerImpl() override {} |
+ |
+ // ErrorHandler implementation: |
+ void OnConnectionError() override { |
+ // If the the instance is not bound to the pipe, the instance might choose |
+ // to delete the binding in the OnConnectionError handler, which would in |
+ // turn delete |this|. Save the error behavior before invoking the error |
+ // handler so we can correctly decide what to do. |
+ bool delete_on_error = delete_on_error_; |
+ impl_->OnConnectionError(); |
+ if (delete_on_error) |
+ delete impl_; |
+ } |
+ |
+ void set_delete_on_error(bool delete_on_error) { |
+ delete_on_error_ = delete_on_error; |
+ } |
+ |
+ private: |
+ InterfaceImpl* impl_; |
+ bool delete_on_error_ = false; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ErrorHandlerImpl); |
+ }; |
+ |
+ Binding<Interface> binding_; |
+ ErrorHandlerImpl error_handler_impl_; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceImpl); |
+}; |
+ |
+// Takes an instance of an InterfaceImpl<..> subclass and binds it to the given |
+// MessagePipe. The instance is returned for convenience in member initializer |
+// lists, etc. |
+// |
+// If the pipe is closed, the instance's OnConnectionError method will be called |
+// and then the instance will be deleted. |
+// |
+// The instance is also bound to the current thread. Its methods will only be |
+// called on the current thread, and if the current thread exits, then the end |
+// point of the pipe will be closed and the error handler's OnConnectionError |
+// method will be called. |
+template <typename Impl> |
+Impl* BindToPipe( |
+ Impl* instance, |
+ ScopedMessagePipeHandle handle, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ instance->set_delete_on_error(true); |
+ instance->BindToHandle(handle.Pass(), waiter); |
+ return instance; |
+} |
+ |
+// Like BindToPipe but does not delete the instance after a channel error. |
+template <typename Impl> |
+Impl* WeakBindToPipe( |
+ Impl* instance, |
+ ScopedMessagePipeHandle handle, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ instance->BindToHandle(handle.Pass(), waiter); |
+ return instance; |
+} |
+ |
+// Takes an instance of an InterfaceImpl<..> subclass and binds it to the given |
+// InterfacePtr<..>. The instance is returned for convenience in member |
+// initializer lists, etc. If the pipe is closed, the instance's |
+// OnConnectionError method will be called and then the instance will be |
+// deleted. |
+// |
+// The instance is also bound to the current thread. Its methods will only be |
+// called on the current thread, and if the current thread exits, then it will |
+// also be deleted, and along with it, its end point of the pipe will be closed. |
+template <typename Impl, typename Interface> |
+Impl* BindToProxy( |
+ Impl* instance, |
+ InterfacePtr<Interface>* ptr, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ instance->set_delete_on_error(true); |
+ WeakBindToProxy(instance, ptr, waiter); |
+ return instance; |
+} |
+ |
+// Like BindToProxy but does not delete the instance after a channel error. |
+template <typename Impl, typename Interface> |
+Impl* WeakBindToProxy( |
+ Impl* instance, |
+ InterfacePtr<Interface>* ptr, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ MessagePipe pipe; |
+ ptr->Bind(InterfacePtrInfo<Interface>(pipe.handle0.Pass(), 0u), waiter); |
+ instance->BindToHandle(pipe.handle1.Pass(), waiter); |
+ return instance; |
+} |
+ |
+// Takes an instance of an InterfaceImpl<..> subclass and binds it to the given |
+// InterfaceRequest<..>. The instance is returned for convenience in member |
+// initializer lists, etc. If the pipe is closed, the instance's |
+// OnConnectionError method will be called and then the instance will be |
+// deleted. |
+// |
+// The instance is also bound to the current thread. Its methods will only be |
+// called on the current thread, and if the current thread exits, then it will |
+// also be deleted, and along with it, its end point of the pipe will be closed. |
+template <typename Impl, typename Interface> |
+Impl* BindToRequest( |
+ Impl* instance, |
+ InterfaceRequest<Interface>* request, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ return BindToPipe(instance, request->PassMessagePipe(), waiter); |
+} |
+ |
+// Like BindToRequest but does not delete the instance after a channel error. |
+template <typename Impl, typename Interface> |
+Impl* WeakBindToRequest( |
+ Impl* instance, |
+ InterfaceRequest<Interface>* request, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ return WeakBindToPipe(instance, request->PassMessagePipe(), waiter); |
+} |
+ |
+} // namespace mojo |
+ |
+#endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_ |