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

Side by Side Diff: mojo/public/cpp/bindings/lib/control_message_proxy.cc

Issue 2332353004: Mojo C++ bindings: support closing [Associated]InterfaceRequest with reason. (Closed)
Patch Set: Created 4 years, 3 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "mojo/public/cpp/bindings/lib/control_message_proxy.h" 5 #include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback_helpers.h" 12 #include "base/callback_helpers.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "mojo/public/cpp/bindings/lib/message_builder.h" 15 #include "mojo/public/cpp/bindings/lib/message_builder.h"
16 #include "mojo/public/cpp/bindings/lib/serialization.h" 16 #include "mojo/public/cpp/bindings/lib/serialization.h"
17 #include "mojo/public/cpp/bindings/lib/validation_util.h" 17 #include "mojo/public/cpp/bindings/lib/validation_util.h"
18 #include "mojo/public/cpp/bindings/message.h"
19 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" 18 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
20 19
21 namespace mojo { 20 namespace mojo {
22 namespace internal { 21 namespace internal {
23 22
24 namespace { 23 namespace {
25 24
26 bool ValidateControlResponse(Message* message) { 25 bool ValidateControlResponse(Message* message) {
27 ValidationContext validation_context( 26 ValidationContext validation_context(
28 message->data(), message->data_num_bytes(), message->handles()->size(), 27 message->data(), message->data_num_bytes(), message->handles()->size(),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 SerializationContext context; 64 SerializationContext context;
66 Deserialize<interface_control::RunResponseMessageParamsDataView>( 65 Deserialize<interface_control::RunResponseMessageParamsDataView>(
67 params, &params_ptr, &context); 66 params, &params_ptr, &context);
68 67
69 callback_.Run(std::move(params_ptr)); 68 callback_.Run(std::move(params_ptr));
70 return true; 69 return true;
71 } 70 }
72 71
73 void SendRunMessage(MessageReceiverWithResponder* receiver, 72 void SendRunMessage(MessageReceiverWithResponder* receiver,
74 interface_control::RunInputPtr input_ptr, 73 interface_control::RunInputPtr input_ptr,
75 const RunCallback& callback, 74 const RunCallback& callback) {
76 SerializationContext* context) { 75 SerializationContext context;
76
77 auto params_ptr = interface_control::RunMessageParams::New(); 77 auto params_ptr = interface_control::RunMessageParams::New();
78 params_ptr->input = std::move(input_ptr); 78 params_ptr->input = std::move(input_ptr);
79 size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>( 79 size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>(
80 params_ptr, context); 80 params_ptr, &context);
81 RequestMessageBuilder builder(interface_control::kRunMessageId, size); 81 RequestMessageBuilder builder(interface_control::kRunMessageId, size);
82 82
83 interface_control::internal::RunMessageParams_Data* params = nullptr; 83 interface_control::internal::RunMessageParams_Data* params = nullptr;
84 Serialize<interface_control::RunMessageParamsDataView>( 84 Serialize<interface_control::RunMessageParamsDataView>(
85 params_ptr, builder.buffer(), &params, context); 85 params_ptr, builder.buffer(), &params, &context);
86 MessageReceiver* responder = new RunResponseForwardToCallback(callback); 86 MessageReceiver* responder = new RunResponseForwardToCallback(callback);
87 if (!receiver->AcceptWithResponder(builder.message(), responder)) 87 if (!receiver->AcceptWithResponder(builder.message(), responder))
88 delete responder; 88 delete responder;
89 } 89 }
90 90
91 void SendRunOrClosePipeMessage( 91 Message ConstructRunOrClosePipeMessage(
92 MessageReceiverWithResponder* receiver, 92 interface_control::RunOrClosePipeInputPtr input_ptr) {
93 interface_control::RunOrClosePipeInputPtr input_ptr, 93 SerializationContext context;
94 SerializationContext* context) { 94
95 auto params_ptr = interface_control::RunOrClosePipeMessageParams::New(); 95 auto params_ptr = interface_control::RunOrClosePipeMessageParams::New();
96 params_ptr->input = std::move(input_ptr); 96 params_ptr->input = std::move(input_ptr);
97 97
98 size_t size = PrepareToSerialize< 98 size_t size = PrepareToSerialize<
99 interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr, 99 interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr,
100 context); 100 &context);
101 MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, size); 101 MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, size);
102 102
103 interface_control::internal::RunOrClosePipeMessageParams_Data* params = 103 interface_control::internal::RunOrClosePipeMessageParams_Data* params =
104 nullptr; 104 nullptr;
105 Serialize<interface_control::RunOrClosePipeMessageParamsDataView>( 105 Serialize<interface_control::RunOrClosePipeMessageParamsDataView>(
106 params_ptr, builder.buffer(), &params, context); 106 params_ptr, builder.buffer(), &params, &context);
107 bool ok = receiver->Accept(builder.message()); 107 return std::move(*builder.message());
108 }
109
110 void SendRunOrClosePipeMessage(
111 MessageReceiverWithResponder* receiver,
112 interface_control::RunOrClosePipeInputPtr input_ptr) {
113 Message message(ConstructRunOrClosePipeMessage(std::move(input_ptr)));
114
115 bool ok = receiver->Accept(&message);
108 ALLOW_UNUSED_LOCAL(ok); 116 ALLOW_UNUSED_LOCAL(ok);
109 } 117 }
110 118
111 void RunVersionCallback( 119 void RunVersionCallback(
112 const base::Callback<void(uint32_t)>& callback, 120 const base::Callback<void(uint32_t)>& callback,
113 interface_control::RunResponseMessageParamsPtr run_response) { 121 interface_control::RunResponseMessageParamsPtr run_response) {
114 uint32_t version = 0u; 122 uint32_t version = 0u;
115 if (run_response->output && run_response->output->is_query_version_result()) 123 if (run_response->output && run_response->output->is_query_version_result())
116 version = run_response->output->get_query_version_result()->version; 124 version = run_response->output->get_query_version_result()->version;
117 callback.Run(version); 125 callback.Run(version);
(...skipping 10 matching lines...) Expand all
128 : receiver_(receiver) { 136 : receiver_(receiver) {
129 } 137 }
130 138
131 ControlMessageProxy::~ControlMessageProxy() = default; 139 ControlMessageProxy::~ControlMessageProxy() = default;
132 140
133 void ControlMessageProxy::QueryVersion( 141 void ControlMessageProxy::QueryVersion(
134 const base::Callback<void(uint32_t)>& callback) { 142 const base::Callback<void(uint32_t)>& callback) {
135 auto input_ptr = interface_control::RunInput::New(); 143 auto input_ptr = interface_control::RunInput::New();
136 input_ptr->set_query_version(interface_control::QueryVersion::New()); 144 input_ptr->set_query_version(interface_control::QueryVersion::New());
137 SendRunMessage(receiver_, std::move(input_ptr), 145 SendRunMessage(receiver_, std::move(input_ptr),
138 base::Bind(&RunVersionCallback, callback), &context_); 146 base::Bind(&RunVersionCallback, callback));
139 } 147 }
140 148
141 void ControlMessageProxy::RequireVersion(uint32_t version) { 149 void ControlMessageProxy::RequireVersion(uint32_t version) {
142 auto require_version = interface_control::RequireVersion::New(); 150 auto require_version = interface_control::RequireVersion::New();
143 require_version->version = version; 151 require_version->version = version;
144 auto input_ptr = interface_control::RunOrClosePipeInput::New(); 152 auto input_ptr = interface_control::RunOrClosePipeInput::New();
145 input_ptr->set_require_version(std::move(require_version)); 153 input_ptr->set_require_version(std::move(require_version));
146 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr), &context_); 154 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr));
147 } 155 }
148 156
149 void ControlMessageProxy::FlushForTesting() { 157 void ControlMessageProxy::FlushForTesting() {
150 if (encountered_error_) 158 if (encountered_error_)
151 return; 159 return;
152 160
153 auto input_ptr = interface_control::RunInput::New(); 161 auto input_ptr = interface_control::RunInput::New();
154 input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New()); 162 input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New());
155 base::RunLoop run_loop; 163 base::RunLoop run_loop;
156 run_loop_quit_closure_ = run_loop.QuitClosure(); 164 run_loop_quit_closure_ = run_loop.QuitClosure();
157 SendRunMessage( 165 SendRunMessage(
158 receiver_, std::move(input_ptr), 166 receiver_, std::move(input_ptr),
159 base::Bind(&RunClosure, 167 base::Bind(&RunClosure,
160 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure, 168 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure,
161 base::Unretained(this))), 169 base::Unretained(this))));
162 &context_);
163 run_loop.Run(); 170 run_loop.Run();
164 } 171 }
165 172
166 void ControlMessageProxy::SendDisconnectReason(uint32_t custom_reason, 173 void ControlMessageProxy::SendDisconnectReason(uint32_t custom_reason,
167 const std::string& description) { 174 const std::string& description) {
168 auto send_disconnect_reason = interface_control::SendDisconnectReason::New(); 175 Message message =
169 send_disconnect_reason->custom_reason = custom_reason; 176 ConstructDisconnectReasonMessage(custom_reason, description);
170 send_disconnect_reason->description = description; 177 bool ok = receiver_->Accept(&message);
171 auto input_ptr = interface_control::RunOrClosePipeInput::New(); 178 ALLOW_UNUSED_LOCAL(ok);
172 input_ptr->set_send_disconnect_reason(std::move(send_disconnect_reason));
173 SendRunOrClosePipeMessage(receiver_, std::move(input_ptr), &context_);
174 } 179 }
175 180
176 void ControlMessageProxy::RunFlushForTestingClosure() { 181 void ControlMessageProxy::RunFlushForTestingClosure() {
177 DCHECK(!run_loop_quit_closure_.is_null()); 182 DCHECK(!run_loop_quit_closure_.is_null());
178 base::ResetAndReturn(&run_loop_quit_closure_).Run(); 183 base::ResetAndReturn(&run_loop_quit_closure_).Run();
179 } 184 }
180 185
181 void ControlMessageProxy::OnConnectionError() { 186 void ControlMessageProxy::OnConnectionError() {
182 encountered_error_ = true; 187 encountered_error_ = true;
183 if (!run_loop_quit_closure_.is_null()) 188 if (!run_loop_quit_closure_.is_null())
184 RunFlushForTestingClosure(); 189 RunFlushForTestingClosure();
185 } 190 }
186 191
192 // static
193 Message ControlMessageProxy::ConstructDisconnectReasonMessage(
194 uint32_t custom_reason,
195 const std::string& description) {
196 auto send_disconnect_reason = interface_control::SendDisconnectReason::New();
197 send_disconnect_reason->custom_reason = custom_reason;
198 send_disconnect_reason->description = description;
199 auto input_ptr = interface_control::RunOrClosePipeInput::New();
200 input_ptr->set_send_disconnect_reason(std::move(send_disconnect_reason));
201 return ConstructRunOrClosePipeMessage(std::move(input_ptr));
202 }
203
187 } // namespace internal 204 } // namespace internal
188 } // namespace mojo 205 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/lib/control_message_proxy.h ('k') | mojo/public/cpp/bindings/tests/associated_interface_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698