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

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

Issue 1531543003: Modify bindings to enforce that an error handler callback is only set after binding to a msg pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-binding-error-handler
Patch Set: Add error handler comment. Created 5 years 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
« no previous file with comments | « mojo/public/cpp/bindings/lib/binding_state.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 30 matching lines...) Expand all
41 // void Create(..., InterfaceRequest<Foo> request) override { 41 // void Create(..., InterfaceRequest<Foo> request) override {
42 // new StronglyBound(request.Pass()); // The binding now owns the 42 // new StronglyBound(request.Pass()); // The binding now owns the
43 // // instance of StronglyBound. 43 // // instance of StronglyBound.
44 // } 44 // }
45 // }; 45 // };
46 template <typename Interface> 46 template <typename Interface>
47 class StrongBinding { 47 class StrongBinding {
48 MOJO_MOVE_ONLY_TYPE(StrongBinding) 48 MOJO_MOVE_ONLY_TYPE(StrongBinding)
49 49
50 public: 50 public:
51 explicit StrongBinding(Interface* impl) : binding_(impl) { 51 explicit StrongBinding(Interface* impl) : binding_(impl) {}
52 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
53 }
54 52
55 StrongBinding( 53 StrongBinding(
56 Interface* impl, 54 Interface* impl,
57 ScopedMessagePipeHandle handle, 55 ScopedMessagePipeHandle handle,
58 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 56 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
59 : StrongBinding(impl) { 57 : StrongBinding(impl) {
60 binding_.Bind(handle.Pass(), waiter); 58 Bind(handle.Pass(), waiter);
61 } 59 }
62 60
63 StrongBinding( 61 StrongBinding(
64 Interface* impl, 62 Interface* impl,
65 InterfacePtr<Interface>* ptr, 63 InterfacePtr<Interface>* ptr,
66 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 64 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
67 : StrongBinding(impl) { 65 : StrongBinding(impl) {
68 binding_.Bind(ptr, waiter); 66 Bind(ptr, waiter);
69 } 67 }
70 68
71 StrongBinding( 69 StrongBinding(
72 Interface* impl, 70 Interface* impl,
73 InterfaceRequest<Interface> request, 71 InterfaceRequest<Interface> request,
74 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) 72 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter())
75 : StrongBinding(impl) { 73 : StrongBinding(impl) {
76 binding_.Bind(request.Pass(), waiter); 74 Bind(request.Pass(), waiter);
77 } 75 }
78 76
79 ~StrongBinding() {} 77 ~StrongBinding() {}
80 78
81 void Bind( 79 void Bind(
82 ScopedMessagePipeHandle handle, 80 ScopedMessagePipeHandle handle,
83 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 81 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
84 assert(!binding_.is_bound()); 82 assert(!binding_.is_bound());
85 binding_.Bind(handle.Pass(), waiter); 83 binding_.Bind(handle.Pass(), waiter);
84 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
86 } 85 }
87 86
88 void Bind( 87 void Bind(
89 InterfacePtr<Interface>* ptr, 88 InterfacePtr<Interface>* ptr,
90 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 89 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
91 assert(!binding_.is_bound()); 90 assert(!binding_.is_bound());
92 binding_.Bind(ptr, waiter); 91 binding_.Bind(ptr, waiter);
92 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
93 } 93 }
94 94
95 void Bind( 95 void Bind(
96 InterfaceRequest<Interface> request, 96 InterfaceRequest<Interface> request,
97 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 97 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
98 assert(!binding_.is_bound()); 98 assert(!binding_.is_bound());
99 binding_.Bind(request.Pass(), waiter); 99 binding_.Bind(request.Pass(), waiter);
100 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
100 } 101 }
101 102
102 bool WaitForIncomingMethodCall() { 103 bool WaitForIncomingMethodCall() {
103 return binding_.WaitForIncomingMethodCall(); 104 return binding_.WaitForIncomingMethodCall();
104 } 105 }
105 106
106 // Note: The error handler must not delete the interface implementation. 107 // Note: The error handler must not delete the interface implementation.
108 //
109 // This method may only be called after this StrongBinding has been bound to a
110 // message pipe.
107 void set_connection_error_handler(const Closure& error_handler) { 111 void set_connection_error_handler(const Closure& error_handler) {
112 assert(binding_.is_bound());
108 connection_error_handler_ = error_handler; 113 connection_error_handler_ = error_handler;
109 } 114 }
110 115
111 Interface* impl() { return binding_.impl(); } 116 Interface* impl() { return binding_.impl(); }
112 // Exposed for testing, should not generally be used. 117 // Exposed for testing, should not generally be used.
113 internal::Router* internal_router() { return binding_.internal_router(); } 118 internal::Router* internal_router() { return binding_.internal_router(); }
114 119
115 void OnConnectionError() { 120 void OnConnectionError() {
116 connection_error_handler_.Run(); 121 connection_error_handler_.Run();
117 delete binding_.impl(); 122 delete binding_.impl();
118 } 123 }
119 124
120 private: 125 private:
121 Closure connection_error_handler_; 126 Closure connection_error_handler_;
122 Binding<Interface> binding_; 127 Binding<Interface> binding_;
123 }; 128 };
124 129
125 } // namespace mojo 130 } // namespace mojo
126 131
127 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_ 132 #endif // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/lib/binding_state.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698