• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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