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 3 // found in the LICENSE file. 4 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_IMPL_INTERNAL_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_IMPL_INTERNAL_H_ 7 8 #include "mojo/public/cpp/bindings/error_handler.h" 9 #include "mojo/public/cpp/bindings/interface_ptr.h" 10 #include "mojo/public/cpp/bindings/lib/filter_chain.h" 11 #include "mojo/public/cpp/bindings/lib/message_header_validator.h" 12 #include "mojo/public/cpp/environment/environment.h" 13 #include "mojo/public/cpp/system/macros.h" 14 15 namespace mojo { 16 namespace internal { 17 18 template <typename Interface> 19 class InterfaceImplBase : public Interface { 20 public: ~InterfaceImplBase()21 virtual ~InterfaceImplBase() {} 22 virtual void OnConnectionEstablished() = 0; 23 virtual void OnConnectionError() = 0; 24 }; 25 26 template <typename Interface> 27 class InterfaceImplState : public ErrorHandler { 28 public: 29 typedef typename Interface::Client Client; 30 InterfaceImplState(InterfaceImplBase<Interface> * instance)31 explicit InterfaceImplState(InterfaceImplBase<Interface>* instance) 32 : router_(NULL), 33 proxy_(NULL) { 34 assert(instance); 35 stub_.set_sink(instance); 36 } 37 ~InterfaceImplState()38 virtual ~InterfaceImplState() { 39 delete proxy_; 40 if (router_) { 41 router_->set_error_handler(NULL); 42 delete router_; 43 } 44 } 45 46 void BindProxy( 47 InterfacePtr<Interface>* ptr, 48 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 49 MessagePipe pipe; 50 ptr->Bind(pipe.handle0.Pass(), waiter); 51 Bind(pipe.handle1.Pass(), waiter); 52 } 53 Bind(ScopedMessagePipeHandle handle,const MojoAsyncWaiter * waiter)54 void Bind(ScopedMessagePipeHandle handle, 55 const MojoAsyncWaiter* waiter) { 56 assert(!router_); 57 58 FilterChain filters; 59 filters.Append<MessageHeaderValidator>(); 60 filters.Append<typename Interface::RequestValidator_>(); 61 filters.Append<typename Interface::Client::ResponseValidator_>(); 62 63 router_ = new Router(handle.Pass(), filters.Pass(), waiter); 64 router_->set_incoming_receiver(&stub_); 65 router_->set_error_handler(this); 66 67 proxy_ = new typename Client::Proxy_(router_); 68 69 instance()->OnConnectionEstablished(); 70 } 71 router()72 Router* router() { return router_; } client()73 Client* client() { return proxy_; } 74 75 private: instance()76 InterfaceImplBase<Interface>* instance() { 77 return static_cast<InterfaceImplBase<Interface>*>(stub_.sink()); 78 } 79 OnConnectionError()80 virtual void OnConnectionError() MOJO_OVERRIDE { 81 instance()->OnConnectionError(); 82 } 83 84 Router* router_; 85 typename Client::Proxy_* proxy_; 86 typename Interface::Stub_ stub_; 87 88 MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceImplState); 89 }; 90 91 } // namespace internal 92 } // namespace mojo 93 94 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_IMPL_INTERNAL_H_ 95