OLD | NEW |
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 Loading... |
65 SerializationContext context; | 64 SerializationContext context; |
66 Deserialize<interface_control::RunResponseMessageParamsDataView>( | 65 Deserialize<interface_control::RunResponseMessageParamsDataView>( |
67 params, ¶ms_ptr, &context); | 66 params, ¶ms_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(), ¶ms, context); | 85 params_ptr, builder.buffer(), ¶ms, &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(), ¶ms, context); | 106 params_ptr, builder.buffer(), ¶ms, &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 Loading... |
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 |
OLD | NEW |