Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: mojo/public/cpp/bindings/strong_binding.h

Issue 1174073002: C++ bindings: support using a callback as connection error handler. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_ 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
7 7
8 #include <assert.h> 8 #include <assert.h>
9 9
10 #include "mojo/public/c/environment/async_waiter.h" 10 #include "mojo/public/c/environment/async_waiter.h"
11 #include "mojo/public/cpp/bindings/binding.h" 11 #include "mojo/public/cpp/bindings/binding.h"
12 #include "mojo/public/cpp/bindings/callback.h"
12 #include "mojo/public/cpp/bindings/error_handler.h" 13 #include "mojo/public/cpp/bindings/error_handler.h"
13 #include "mojo/public/cpp/bindings/interface_ptr.h" 14 #include "mojo/public/cpp/bindings/interface_ptr.h"
14 #include "mojo/public/cpp/bindings/interface_request.h" 15 #include "mojo/public/cpp/bindings/interface_request.h"
15 #include "mojo/public/cpp/bindings/lib/filter_chain.h" 16 #include "mojo/public/cpp/bindings/lib/filter_chain.h"
16 #include "mojo/public/cpp/bindings/lib/message_header_validator.h" 17 #include "mojo/public/cpp/bindings/lib/message_header_validator.h"
17 #include "mojo/public/cpp/bindings/lib/router.h" 18 #include "mojo/public/cpp/bindings/lib/router.h"
18 #include "mojo/public/cpp/system/core.h" 19 #include "mojo/public/cpp/system/core.h"
19 20
20 namespace mojo { 21 namespace mojo {
21 22
(...skipping 15 matching lines...) Expand all
37 // }; 38 // };
38 // 39 //
39 // class MyFooFactory : public InterfaceFactory<Foo> { 40 // class MyFooFactory : public InterfaceFactory<Foo> {
40 // public: 41 // public:
41 // void Create(..., InterfaceRequest<Foo> request) override { 42 // void Create(..., InterfaceRequest<Foo> request) override {
42 // new StronglyBound(request.Pass()); // The binding now owns the 43 // new StronglyBound(request.Pass()); // The binding now owns the
43 // // instance of StronglyBound. 44 // // instance of StronglyBound.
44 // } 45 // }
45 // }; 46 // };
46 template <typename Interface> 47 template <typename Interface>
47 class StrongBinding : public ErrorHandler { 48 class StrongBinding {
48 MOJO_MOVE_ONLY_TYPE(StrongBinding) 49 MOJO_MOVE_ONLY_TYPE(StrongBinding)
49 50
50 public: 51 public:
51 explicit StrongBinding(Interface* impl) : binding_(impl) { 52 explicit StrongBinding(Interface* impl) : binding_(impl) {
52 binding_.set_error_handler(this); 53 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
53 } 54 }
54 55
55 StrongBinding( 56 StrongBinding(
56 Interface* impl, 57 Interface* impl,
57 ScopedMessagePipeHandle handle, 58 ScopedMessagePipeHandle handle,
58 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 59 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
59 : StrongBinding(impl) { 60 : StrongBinding(impl) {
60 binding_.Bind(handle.Pass(), waiter); 61 binding_.Bind(handle.Pass(), waiter);
61 } 62 }
62 63
63 StrongBinding( 64 StrongBinding(
64 Interface* impl, 65 Interface* impl,
65 InterfacePtr<Interface>* ptr, 66 InterfacePtr<Interface>* ptr,
66 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 67 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
67 : StrongBinding(impl) { 68 : StrongBinding(impl) {
68 binding_.Bind(ptr, waiter); 69 binding_.Bind(ptr, waiter);
69 } 70 }
70 71
71 StrongBinding( 72 StrongBinding(
72 Interface* impl, 73 Interface* impl,
73 InterfaceRequest<Interface> request, 74 InterfaceRequest<Interface> request,
74 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 75 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
75 : StrongBinding(impl) { 76 : StrongBinding(impl) {
76 binding_.Bind(request.Pass(), waiter); 77 binding_.Bind(request.Pass(), waiter);
77 } 78 }
78 79
79 ~StrongBinding() override {} 80 ~StrongBinding() {}
80 81
81 void Bind( 82 void Bind(
82 ScopedMessagePipeHandle handle, 83 ScopedMessagePipeHandle handle,
83 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 84 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
84 assert(!binding_.is_bound()); 85 assert(!binding_.is_bound());
85 binding_.Bind(handle.Pass(), waiter); 86 binding_.Bind(handle.Pass(), waiter);
86 } 87 }
87 88
88 void Bind( 89 void Bind(
89 InterfacePtr<Interface>* ptr, 90 InterfacePtr<Interface>* ptr,
90 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 91 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
91 assert(!binding_.is_bound()); 92 assert(!binding_.is_bound());
92 binding_.Bind(ptr, waiter); 93 binding_.Bind(ptr, waiter);
93 } 94 }
94 95
95 void Bind( 96 void Bind(
96 InterfaceRequest<Interface> request, 97 InterfaceRequest<Interface> request,
97 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 98 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
98 assert(!binding_.is_bound()); 99 assert(!binding_.is_bound());
99 binding_.Bind(request.Pass(), waiter); 100 binding_.Bind(request.Pass(), waiter);
100 } 101 }
101 102
102 bool WaitForIncomingMethodCall() { 103 bool WaitForIncomingMethodCall() {
103 return binding_.WaitForIncomingMethodCall(); 104 return binding_.WaitForIncomingMethodCall();
104 } 105 }
105 106
107 void set_connection_error_handler(const Closure& error_handler) {
108 connection_error_handler_ = error_handler;
109 }
110
111 // NOTE: Deprecated. Please use the method above.
112 // TODO(yzshen): Remove this method once all callsites are converted.
106 void set_error_handler(ErrorHandler* error_handler) { 113 void set_error_handler(ErrorHandler* error_handler) {
107 error_handler_ = error_handler; 114 set_connection_error_handler(
115 [error_handler]() { error_handler->OnConnectionError(); });
108 } 116 }
109 117
110 Interface* impl() { return binding_.impl(); } 118 Interface* impl() { return binding_.impl(); }
111 // Exposed for testing, should not generally be used. 119 // Exposed for testing, should not generally be used.
112 internal::Router* internal_router() { return binding_.internal_router(); } 120 internal::Router* internal_router() { return binding_.internal_router(); }
113 121
114 // ErrorHandler implementation 122 void OnConnectionError() {
115 void OnConnectionError() override { 123 connection_error_handler_.Run();
116 if (error_handler_)
117 error_handler_->OnConnectionError();
118 delete binding_.impl(); 124 delete binding_.impl();
119 } 125 }
120 126
121 private: 127 private:
122 ErrorHandler* error_handler_ = nullptr; 128 Closure connection_error_handler_;
123 Binding<Interface> binding_; 129 Binding<Interface> binding_;
124 }; 130 };
125 131
126 } // namespace mojo 132 } // namespace mojo
127 133
128 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_ 134 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698