Chromium Code Reviews| 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..76acc1fadb64a7a81afaf47b2611bd134dfecf4d |
| --- /dev/null |
| +++ b/mojo/public/cpp/bindings/binding.h |
| @@ -0,0 +1,123 @@ |
| +// 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/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) { |
| + MessagePipe pipe; |
| + ptr->Bind(pipe.handle0.Pass(), waiter); |
| + Bind(pipe.handle1.Pass(), waiter); |
| + } |
| + |
| + virtual ~Binding() { |
| + delete proxy_; |
| + if (router_) { |
| + router_->set_error_handler(nullptr); |
| + delete 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_>(); |
| + |
| + router_ = new internal::Router(handle.Pass(), filters.Pass(), waiter); |
| + router_->set_incoming_receiver(&stub_); |
| + router_->set_error_handler(this); |
| + |
| + proxy_ = new typename Client::Proxy_(router_); |
| + } |
| + |
| + void Bind( |
| + InterfacePtr<Interface>* ptr, |
| + const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
| + MessagePipe pipe; |
| + ptr->Bind(pipe.handle0.Pass(), waiter); |
| + Bind(pipe.handle1.Pass(), waiter); |
| + } |
|
DaveMoore
2014/11/11 21:16:41
Maybe add
void Bind(InterfaceRequest<Interface>*
|
| + |
| + bool WaitForIncomingMethodCall() { |
| + MOJO_DCHECK(router_); |
| + return 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* router() { return router_; } |
| + |
| + private: |
| + internal::Router* 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_ |