Index: mojo/public/cpp/bindings/binding.h |
diff --git a/mojo/public/cpp/bindings/binding.h b/mojo/public/cpp/bindings/binding.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2c4c9ceb05dc2ecc838b5b11d59252adafdd497f |
--- /dev/null |
+++ b/mojo/public/cpp/bindings/binding.h |
@@ -0,0 +1,136 @@ |
+// 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_BINDING_H_ |
+#define MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ |
+ |
+#include "mojo/public/c/environment/async_waiter.h" |
+#include "mojo/public/cpp/bindings/error_handler.h" |
+#include "mojo/public/cpp/bindings/interface_ptr.h" |
+#include "mojo/public/cpp/bindings/interface_request.h" |
+#include "mojo/public/cpp/bindings/lib/filter_chain.h" |
+#include "mojo/public/cpp/bindings/lib/message_header_validator.h" |
+#include "mojo/public/cpp/bindings/lib/router.h" |
+#include "mojo/public/cpp/environment/logging.h" |
+#include "mojo/public/cpp/system/core.h" |
+ |
+namespace mojo { |
+ |
+// This binds an interface implementation a pipe. Deleting the binding closes |
+// the pipe. |
+// |
+// Example: |
+// |
+// #include "foo.mojom.h" |
+// |
+// class FooImpl : public Foo { |
+// public: |
+// explicit FooImpl(ScopedMessagePipeHandle handle) |
+// : binding_(this, handle.Pass()) {} |
+// |
+// // Foo implementation here. |
+// |
+// private: |
+// Binding<Foo> binding_; |
+// }; |
+// |
+template <typename Interface> |
+class Binding : public ErrorHandler { |
+ public: |
+ using Client = typename Interface::Client; |
+ |
+ explicit Binding(Interface* impl) : impl_(impl) { stub_.set_sink(impl_); } |
+ |
+ Binding(Interface* impl, |
+ ScopedMessagePipeHandle handle, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) |
+ : Binding(impl) { |
+ Bind(handle.Pass(), waiter); |
+ } |
+ |
+ Binding(Interface* impl, |
+ InterfacePtr<Interface>* ptr, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) |
+ : Binding(impl) { |
+ Bind(ptr, waiter); |
+ } |
+ |
+ Binding(Interface* impl, |
+ InterfaceRequest<Interface> request, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) |
+ : Binding(impl) { |
+ Bind(request.PassMessagePipe(), waiter); |
+ } |
+ |
+ ~Binding() override { |
+ delete proxy_; |
+ if (internal_router_) { |
+ internal_router_->set_error_handler(nullptr); |
+ delete internal_router_; |
+ } |
+ } |
+ |
+ void Bind( |
+ ScopedMessagePipeHandle handle, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ internal::FilterChain filters; |
+ filters.Append<internal::MessageHeaderValidator>(); |
+ filters.Append<typename Interface::RequestValidator_>(); |
+ filters.Append<typename Client::ResponseValidator_>(); |
+ |
+ internal_router_ = |
+ new internal::Router(handle.Pass(), filters.Pass(), waiter); |
+ internal_router_->set_incoming_receiver(&stub_); |
+ internal_router_->set_error_handler(this); |
+ |
+ proxy_ = new typename Client::Proxy_(internal_router_); |
+ } |
+ |
+ void Bind( |
+ InterfacePtr<Interface>* ptr, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ MessagePipe pipe; |
+ ptr->Bind(pipe.handle0.Pass(), waiter); |
+ Bind(pipe.handle1.Pass(), waiter); |
+ } |
+ |
+ void Bind( |
+ InterfaceRequest<Interface> request, |
+ const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
+ Bind(request.PassMessagePipe(), waiter); |
+ } |
+ |
+ bool WaitForIncomingMethodCall() { |
+ MOJO_DCHECK(internal_router_); |
+ return internal_router_->WaitForIncomingMessage(); |
+ } |
+ |
+ void set_error_handler(ErrorHandler* error_handler) { |
+ error_handler_ = error_handler; |
+ } |
+ |
+ // ErrorHandler implementation |
+ void OnConnectionError() override { |
+ if (error_handler_) |
+ error_handler_->OnConnectionError(); |
+ } |
+ |
+ Interface* impl() { return impl_; } |
+ Client* client() { return proxy_; } |
+ // Exposed for testing, should not generally be used. |
+ internal::Router* internal_router() { return internal_router_; } |
+ |
+ private: |
+ internal::Router* internal_router_ = nullptr; |
+ typename Client::Proxy_* proxy_ = nullptr; |
+ typename Interface::Stub_ stub_; |
+ Interface* impl_; |
+ ErrorHandler* error_handler_ = nullptr; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(Binding); |
+}; |
+ |
+} // namespace mojo |
+ |
+#endif // MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_ |