OLD | NEW |
1 {%- import "interface_macros.tmpl" as interface_macros %} | 1 {%- import "interface_macros.tmpl" as interface_macros %} |
2 {%- import "struct_macros.tmpl" as struct_macros %} | 2 {%- import "struct_macros.tmpl" as struct_macros %} |
3 | 3 |
4 {%- set class_name = interface.name %} | 4 {%- set class_name = interface.name %} |
5 {%- set proxy_name = interface.name ~ "Proxy" %} | 5 {%- set proxy_name = interface.name ~ "Proxy" %} |
6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} | 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} |
7 | 7 |
8 {%- macro alloc_params(struct, params, message, description) %} | 8 {%- macro alloc_params(struct, params, message, description) %} |
9 mojo::internal::SerializationContext serialization_context; | 9 mojo::internal::SerializationContext serialization_context; |
10 serialization_context.handles.Swap(({{message}})->mutable_handles()); | 10 serialization_context.handles.Swap(({{message}})->mutable_handles()); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 | 162 |
163 mojo::internal::MessageBuilder builder( | 163 mojo::internal::MessageBuilder builder( |
164 {{message_name}}, | 164 {{message_name}}, |
165 mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse, | 165 mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse, |
166 size, serialization_context.associated_endpoint_count); | 166 size, serialization_context.associated_endpoint_count); |
167 | 167 |
168 {{build_message(params_struct, "param_%s", params_description, | 168 {{build_message(params_struct, "param_%s", params_description, |
169 "&serialization_context")}} | 169 "&serialization_context")}} |
170 | 170 |
171 bool result = false; | 171 bool result = false; |
172 mojo::MessageReceiver* responder = | 172 std::unique_ptr<mojo::MessageReceiver> responder( |
173 new {{class_name}}_{{method.name}}_HandleSyncResponse( | 173 new {{class_name}}_{{method.name}}_HandleSyncResponse( |
174 &result | 174 &result |
175 {%- for param in method.response_parameters -%} | 175 {%- for param in method.response_parameters -%} |
176 , param_{{param.name}} | 176 , param_{{param.name}} |
177 {%- endfor %}); | 177 {%- endfor %})); |
178 if (!receiver_->AcceptWithResponder(builder.message(), responder)) | 178 ignore_result(receiver_->AcceptWithResponder(builder.message(), |
179 delete responder; | 179 std::move(responder))); |
180 return result; | 180 return result; |
181 } | 181 } |
182 {%- endif %} | 182 {%- endif %} |
183 | 183 |
184 void {{proxy_name}}::{{method.name}}( | 184 void {{proxy_name}}::{{method.name}}( |
185 {{interface_macros.declare_request_params("in_", method, use_once_callback)}
}) { | 185 {{interface_macros.declare_request_params("in_", method, use_once_callback)}
}) { |
186 mojo::internal::SerializationContext serialization_context; | 186 mojo::internal::SerializationContext serialization_context; |
187 {{struct_macros.get_serialized_size(params_struct, "in_%s", | 187 {{struct_macros.get_serialized_size(params_struct, "in_%s", |
188 "&serialization_context")}} | 188 "&serialization_context")}} |
189 | 189 |
190 {%- if method.response_parameters != None %} | 190 {%- if method.response_parameters != None %} |
191 constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse; | 191 constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse; |
192 {%- else %} | 192 {%- else %} |
193 constexpr uint32_t kFlags = 0; | 193 constexpr uint32_t kFlags = 0; |
194 {%- endif %} | 194 {%- endif %} |
195 mojo::internal::MessageBuilder builder( | 195 mojo::internal::MessageBuilder builder( |
196 {{message_name}}, kFlags, size, | 196 {{message_name}}, kFlags, size, |
197 serialization_context.associated_endpoint_count); | 197 serialization_context.associated_endpoint_count); |
198 | 198 |
199 {{build_message(params_struct, "in_%s", params_description, | 199 {{build_message(params_struct, "in_%s", params_description, |
200 "&serialization_context")}} | 200 "&serialization_context")}} |
201 | 201 |
202 {%- if method.response_parameters != None %} | 202 {%- if method.response_parameters != None %} |
203 mojo::MessageReceiver* responder = | 203 std::unique_ptr<mojo::MessageReceiver> responder( |
204 new {{class_name}}_{{method.name}}_ForwardToCallback(std::move(callback)); | 204 new {{class_name}}_{{method.name}}_ForwardToCallback( |
205 if (!receiver_->AcceptWithResponder(builder.message(), responder)) | 205 std::move(callback))); |
206 delete responder; | 206 ignore_result(receiver_->AcceptWithResponder(builder.message(), |
| 207 std::move(responder))); |
207 {%- else %} | 208 {%- else %} |
208 bool ok = receiver_->Accept(builder.message()); | 209 // This return value may be ignored as false implies the Connector has |
209 // This return value may be ignored as !ok implies the Connector has | |
210 // encountered an error, which will be visible through other means. | 210 // encountered an error, which will be visible through other means. |
211 ALLOW_UNUSED_LOCAL(ok); | 211 ignore_result(receiver_->Accept(builder.message())); |
212 {%- endif %} | 212 {%- endif %} |
213 } | 213 } |
214 {%- endfor %} | 214 {%- endfor %} |
215 | 215 |
216 {#--- ProxyToResponder definition #} | 216 {#--- ProxyToResponder definition #} |
217 {%- for method in interface.methods -%} | 217 {%- for method in interface.methods -%} |
218 {%- if method.response_parameters != None %} | 218 {%- if method.response_parameters != None %} |
219 {%- set message_name = | 219 {%- set message_name = |
220 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 220 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
221 {%- set response_params_struct = method.response_param_struct %} | 221 {%- set response_params_struct = method.response_param_struct %} |
222 {%- set params_description = | 222 {%- set params_description = |
223 "%s.%s response"|format(interface.name, method.name) %} | 223 "%s.%s response"|format(interface.name, method.name) %} |
224 class {{class_name}}_{{method.name}}_ProxyToResponder { | 224 class {{class_name}}_{{method.name}}_ProxyToResponder { |
225 public: | 225 public: |
226 static {{class_name}}::{{method.name}}Callback CreateCallback( | 226 static {{class_name}}::{{method.name}}Callback CreateCallback( |
227 uint64_t request_id, | 227 uint64_t request_id, |
228 bool is_sync, | 228 bool is_sync, |
229 mojo::MessageReceiverWithStatus* responder) { | 229 std::unique_ptr<mojo::MessageReceiverWithStatus> responder) { |
230 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( | 230 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( |
231 new {{class_name}}_{{method.name}}_ProxyToResponder( | 231 new {{class_name}}_{{method.name}}_ProxyToResponder( |
232 request_id, is_sync, responder)); | 232 request_id, is_sync, std::move(responder))); |
233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, | 233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, |
234 base::Passed(&proxy)); | 234 base::Passed(&proxy)); |
235 } | 235 } |
236 | 236 |
237 ~{{class_name}}_{{method.name}}_ProxyToResponder() { | 237 ~{{class_name}}_{{method.name}}_ProxyToResponder() { |
238 #if DCHECK_IS_ON() | 238 #if DCHECK_IS_ON() |
239 if (responder_) { | 239 if (responder_) { |
240 // Is the Service destroying the callback without running it | 240 // Is the Service destroying the callback without running it |
241 // and without first closing the pipe? | 241 // and without first closing the pipe? |
242 responder_->DCheckInvalid("The callback passed to " | 242 responder_->DCheckInvalid("The callback passed to " |
243 "{{class_name}}::{{method.name}}() was never run."); | 243 "{{class_name}}::{{method.name}}() was never run."); |
244 } | 244 } |
245 #endif | 245 #endif |
246 // If the Callback was dropped then deleting the responder will close | 246 // If the Callback was dropped then deleting the responder will close |
247 // the pipe so the calling application knows to stop waiting for a reply. | 247 // the pipe so the calling application knows to stop waiting for a reply. |
248 delete responder_; | 248 responder_ = nullptr; |
249 } | 249 } |
250 | 250 |
251 private: | 251 private: |
252 {{class_name}}_{{method.name}}_ProxyToResponder( | 252 {{class_name}}_{{method.name}}_ProxyToResponder( |
253 uint64_t request_id, | 253 uint64_t request_id, |
254 bool is_sync, | 254 bool is_sync, |
255 mojo::MessageReceiverWithStatus* responder) | 255 std::unique_ptr<mojo::MessageReceiverWithStatus> responder) |
256 : request_id_(request_id), | 256 : request_id_(request_id), |
257 is_sync_(is_sync), | 257 is_sync_(is_sync), |
258 responder_(responder) { | 258 responder_(std::move(responder)) { |
259 } | 259 } |
260 | 260 |
261 void Run( | 261 void Run( |
262 {{interface_macros.declare_responder_params( | 262 {{interface_macros.declare_responder_params( |
263 "in_", method.response_parameters, for_blink)}}); | 263 "in_", method.response_parameters, for_blink)}}); |
264 | 264 |
265 uint64_t request_id_; | 265 uint64_t request_id_; |
266 bool is_sync_; | 266 bool is_sync_; |
267 mojo::MessageReceiverWithStatus* responder_; | 267 std::unique_ptr<mojo::MessageReceiverWithStatus> responder_; |
268 | 268 |
269 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); | 269 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); |
270 }; | 270 }; |
271 | 271 |
272 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( | 272 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( |
273 {{interface_macros.declare_responder_params( | 273 {{interface_macros.declare_responder_params( |
274 "in_", method.response_parameters, for_blink)}}) { | 274 "in_", method.response_parameters, for_blink)}}) { |
275 mojo::internal::SerializationContext serialization_context; | 275 mojo::internal::SerializationContext serialization_context; |
276 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", | 276 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", |
277 "&serialization_context")}} | 277 "&serialization_context")}} |
278 | 278 |
279 uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) | | 279 uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) | |
280 mojo::Message::kFlagIsResponse; | 280 mojo::Message::kFlagIsResponse; |
281 mojo::internal::MessageBuilder builder( | 281 mojo::internal::MessageBuilder builder( |
282 {{message_name}}, flags, size, | 282 {{message_name}}, flags, size, |
283 serialization_context.associated_endpoint_count); | 283 serialization_context.associated_endpoint_count); |
284 builder.message()->set_request_id(request_id_); | 284 builder.message()->set_request_id(request_id_); |
285 | 285 |
286 {{build_message(response_params_struct, "in_%s", params_description, | 286 {{build_message(response_params_struct, "in_%s", params_description, |
287 "&serialization_context")}} | 287 "&serialization_context")}} |
288 bool ok = responder_->Accept(builder.message()); | 288 ignore_result(responder_->Accept(builder.message())); |
289 ALLOW_UNUSED_LOCAL(ok); | 289 // TODO(darin): Accept() returning false indicates a malformed message, and |
290 // TODO(darin): !ok returned here indicates a malformed message, and that may | 290 // that may be good reason to close the connection. However, we don't have a |
291 // be good reason to close the connection. However, we don't have a way to do | 291 // way to do that from here. We should add a way. |
292 // that from here. We should add a way. | |
293 delete responder_; | |
294 responder_ = nullptr; | 292 responder_ = nullptr; |
295 } | 293 } |
296 {%- endif -%} | 294 {%- endif -%} |
297 {%- endfor %} | 295 {%- endfor %} |
298 | 296 |
299 {#--- StubDispatch definition #} | 297 {#--- StubDispatch definition #} |
300 | 298 |
301 // static | 299 // static |
302 bool {{class_name}}StubDispatch::Accept( | 300 bool {{class_name}}StubDispatch::Accept( |
303 {{interface.name}}* impl, | 301 {{interface.name}}* impl, |
(...skipping 23 matching lines...) Expand all Loading... |
327 {%- endfor %} | 325 {%- endfor %} |
328 } | 326 } |
329 {%- endif %} | 327 {%- endif %} |
330 return false; | 328 return false; |
331 } | 329 } |
332 | 330 |
333 // static | 331 // static |
334 bool {{class_name}}StubDispatch::AcceptWithResponder( | 332 bool {{class_name}}StubDispatch::AcceptWithResponder( |
335 {{interface.name}}* impl, | 333 {{interface.name}}* impl, |
336 mojo::Message* message, | 334 mojo::Message* message, |
337 mojo::MessageReceiverWithStatus* responder) { | 335 std::unique_ptr<mojo::MessageReceiverWithStatus> responder) { |
338 {%- if interface.methods %} | 336 {%- if interface.methods %} |
339 switch (message->header()->name) { | 337 switch (message->header()->name) { |
340 {%- for method in interface.methods %} | 338 {%- for method in interface.methods %} |
341 case internal::k{{class_name}}_{{method.name}}_Name: { | 339 case internal::k{{class_name}}_{{method.name}}_Name: { |
342 {%- if method.response_parameters != None %} | 340 {%- if method.response_parameters != None %} |
343 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 341 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
344 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | 342 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( |
345 message->mutable_payload()); | 343 message->mutable_payload()); |
346 | 344 |
347 {%- set desc = class_name~"::"~method.name %} | 345 {%- set desc = class_name~"::"~method.name %} |
348 {{alloc_params(method.param_struct, "params", "message", desc)| | 346 {{alloc_params(method.param_struct, "params", "message", desc)| |
349 indent(4)}} | 347 indent(4)}} |
350 {{class_name}}::{{method.name}}Callback callback = | 348 {{class_name}}::{{method.name}}Callback callback = |
351 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( | 349 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( |
352 message->request_id(), | 350 message->request_id(), |
353 message->has_flag(mojo::Message::kFlagIsSync), responder); | 351 message->has_flag(mojo::Message::kFlagIsSync), |
| 352 std::move(responder)); |
354 // A null |impl| means no implementation was bound. | 353 // A null |impl| means no implementation was bound. |
355 assert(impl); | 354 assert(impl); |
356 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 355 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
357 mojo::internal::MessageDispatchContext context(message); | 356 mojo::internal::MessageDispatchContext context(message); |
358 impl->{{method.name}}( | 357 impl->{{method.name}}( |
359 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std:
:move(callback)); | 358 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std:
:move(callback)); |
360 return true; | 359 return true; |
361 {%- else %} | 360 {%- else %} |
362 break; | 361 break; |
363 {%- endif %} | 362 {%- endif %} |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 break; | 439 break; |
441 } | 440 } |
442 | 441 |
443 // Unrecognized message. | 442 // Unrecognized message. |
444 ReportValidationError( | 443 ReportValidationError( |
445 &validation_context, | 444 &validation_context, |
446 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); | 445 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); |
447 return false; | 446 return false; |
448 } | 447 } |
449 {%- endif -%} | 448 {%- endif -%} |
OLD | NEW |