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, serialization_context, | 8 {%- macro alloc_params(struct, params, message, serialization_context, |
9 description) %} | 9 description) %} |
10 ({{params}})->DecodePointers(); | 10 ({{params}})->DecodePointers(); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 | 218 |
219 {#--- ProxyToResponder definition #} | 219 {#--- ProxyToResponder definition #} |
220 {%- for method in interface.methods -%} | 220 {%- for method in interface.methods -%} |
221 {%- if method.response_parameters != None %} | 221 {%- if method.response_parameters != None %} |
222 {%- set message_name = | 222 {%- set message_name = |
223 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 223 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
224 {%- set response_params_struct = method.response_param_struct %} | 224 {%- set response_params_struct = method.response_param_struct %} |
225 {%- set params_description = | 225 {%- set params_description = |
226 "%s.%s response"|format(interface.name, method.name) %} | 226 "%s.%s response"|format(interface.name, method.name) %} |
227 class {{class_name}}_{{method.name}}_ProxyToResponder | 227 class {{class_name}}_{{method.name}}_ProxyToResponder |
228 : public {{class_name}}::{{method.name}}Callback::Runnable { | 228 : public base::RefCountedThreadSafe< |
| 229 {{class_name}}_{{method.name}}_ProxyToResponder> { |
229 public: | 230 public: |
230 ~{{class_name}}_{{method.name}}_ProxyToResponder() override { | 231 static {{class_name}}::{{method.name}}Callback CreateCallback( |
| 232 uint64_t request_id, |
| 233 bool is_sync, |
| 234 mojo::MessageReceiverWithStatus* responder, |
| 235 scoped_refptr<mojo::internal::MultiplexRouter> router) { |
| 236 scoped_refptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy |
| 237 = new {{class_name}}_{{method.name}}_ProxyToResponder( |
| 238 request_id, is_sync, responder, router); |
| 239 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, |
| 240 proxy); |
| 241 } |
| 242 |
| 243 private: |
| 244 friend class base::RefCountedThreadSafe< |
| 245 {{class_name}}_{{method.name}}_ProxyToResponder>; |
| 246 |
| 247 {{class_name}}_{{method.name}}_ProxyToResponder( |
| 248 uint64_t request_id, |
| 249 bool is_sync, |
| 250 mojo::MessageReceiverWithStatus* responder, |
| 251 scoped_refptr<mojo::internal::MultiplexRouter> router) |
| 252 : request_id_(request_id), |
| 253 is_sync_(is_sync), |
| 254 responder_(responder), |
| 255 serialization_context_(std::move(router)) { |
| 256 } |
| 257 |
| 258 ~{{class_name}}_{{method.name}}_ProxyToResponder() { |
231 #if DCHECK_IS_ON() | 259 #if DCHECK_IS_ON() |
232 if (responder_) { | 260 if (responder_) { |
233 // Is the Mojo application destroying the callback without running it | 261 // Is the Mojo application destroying the callback without running it |
234 // and without first closing the pipe? | 262 // and without first closing the pipe? |
235 responder_->DCheckInvalid("The callback passed to " | 263 responder_->DCheckInvalid("The callback passed to " |
236 "{{class_name}}::{{method.name}}({%- if method.parameters -%}{{pass_pa
rams(method.parameters)}}, {% endif -%}callback) " | 264 "{{class_name}}::{{method.name}}({%- if method.parameters -%}{{pass_pa
rams(method.parameters)}}, {% endif -%}callback) " |
237 "was never run."); | 265 "was never run."); |
238 } | 266 } |
239 #endif | 267 #endif |
240 // If the Callback was dropped then deleting the responder will close | 268 // If the Callback was dropped then deleting the responder will close |
241 // the pipe so the calling application knows to stop waiting for a reply. | 269 // the pipe so the calling application knows to stop waiting for a reply. |
242 delete responder_; | 270 delete responder_; |
243 } | 271 } |
244 | 272 |
245 {{class_name}}_{{method.name}}_ProxyToResponder( | 273 void Run( |
246 uint64_t request_id, | 274 {{interface_macros.declare_responder_params( |
247 bool is_sync, | 275 "in_", method.response_parameters, for_blink)}}); |
248 mojo::MessageReceiverWithStatus* responder, | |
249 scoped_refptr<mojo::internal::MultiplexRouter> router) | |
250 : request_id_(request_id), | |
251 is_sync_(is_sync), | |
252 responder_(responder), | |
253 serialization_context_(std::move(router)) { | |
254 } | |
255 | 276 |
256 void Run({{interface_macros.declare_params("in_", method.response_parameters)}
}) override; | |
257 | |
258 private: | |
259 uint64_t request_id_; | 277 uint64_t request_id_; |
260 bool is_sync_; | 278 bool is_sync_; |
261 mojo::MessageReceiverWithStatus* responder_; | 279 mojo::MessageReceiverWithStatus* responder_; |
262 // TODO(yzshen): maybe I should use a ref to the original one? | 280 // TODO(yzshen): maybe I should use a ref to the original one? |
263 mojo::internal::SerializationContext serialization_context_; | 281 mojo::internal::SerializationContext serialization_context_; |
| 282 |
264 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); | 283 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); |
265 }; | 284 }; |
| 285 |
266 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( | 286 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( |
267 {{interface_macros.declare_params("in_", method.response_parameters)}}) { | 287 {{interface_macros.declare_responder_params( |
| 288 "in_", method.response_parameters, for_blink)}}) { |
268 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", | 289 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", |
269 "&serialization_context_")}} | 290 "&serialization_context_")}} |
270 mojo::internal::ResponseMessageBuilder builder( | 291 mojo::internal::ResponseMessageBuilder builder( |
271 {{message_name}}, size, request_id_, | 292 {{message_name}}, size, request_id_, |
272 is_sync_ ? mojo::internal::kMessageIsSync : 0); | 293 is_sync_ ? mojo::internal::kMessageIsSync : 0); |
273 {{build_message(response_params_struct, "in_%s", params_description, | 294 {{build_message(response_params_struct, "in_%s", params_description, |
274 "&serialization_context_")}} | 295 "&serialization_context_")}} |
275 bool ok = responder_->Accept(builder.message()); | 296 bool ok = responder_->Accept(builder.message()); |
276 ALLOW_UNUSED_LOCAL(ok); | 297 ALLOW_UNUSED_LOCAL(ok); |
277 // TODO(darin): !ok returned here indicates a malformed message, and that may | 298 // TODO(darin): !ok returned here indicates a malformed message, and that may |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 {%- for method in interface.methods %} | 352 {%- for method in interface.methods %} |
332 case internal::k{{class_name}}_{{method.name}}_Name: { | 353 case internal::k{{class_name}}_{{method.name}}_Name: { |
333 {%- if method.response_parameters != None %} | 354 {%- if method.response_parameters != None %} |
334 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 355 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
335 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( | 356 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*
>( |
336 message->mutable_payload()); | 357 message->mutable_payload()); |
337 | 358 |
338 {{alloc_params(method.param_struct, "params", "message", | 359 {{alloc_params(method.param_struct, "params", "message", |
339 "&serialization_context_", "{{class_name}}::{{method.name}}")| | 360 "&serialization_context_", "{{class_name}}::{{method.name}}")| |
340 indent(4)}} | 361 indent(4)}} |
341 {{class_name}}::{{method.name}}Callback::Runnable* runnable = | 362 {{class_name}}::{{method.name}}Callback callback = |
342 new {{class_name}}_{{method.name}}_ProxyToResponder( | 363 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( |
343 message->request_id(), | 364 message->request_id(), |
344 message->has_flag(mojo::internal::kMessageIsSync), | 365 message->has_flag(mojo::internal::kMessageIsSync), |
345 responder, | 366 responder, |
346 serialization_context_.router); | 367 serialization_context_.router); |
347 {{class_name}}::{{method.name}}Callback callback(runnable); | |
348 // A null |sink_| means no implementation was bound. | 368 // A null |sink_| means no implementation was bound. |
349 assert(sink_); | 369 assert(sink_); |
350 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 370 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
351 sink_->{{method.name}}( | 371 sink_->{{method.name}}( |
352 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call
back); | 372 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call
back); |
353 return true; | 373 return true; |
354 {%- else %} | 374 {%- else %} |
355 break; | 375 break; |
356 {%- endif %} | 376 {%- endif %} |
357 } | 377 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 break; | 469 break; |
450 } | 470 } |
451 | 471 |
452 // Unrecognized message. | 472 // Unrecognized message. |
453 ReportValidationError( | 473 ReportValidationError( |
454 &validation_context, | 474 &validation_context, |
455 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); | 475 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); |
456 return false; | 476 return false; |
457 } | 477 } |
458 {%- endif -%} | 478 {%- endif -%} |
OLD | NEW |