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 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); | 10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); |
11 bool success = true; | 11 bool success = true; |
12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} | 12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} |
13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; | 13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; |
14 {%- endfor %} | 14 {%- endfor %} |
15 {{struct.name}}DataView input_data_view({{params}}, | 15 {{struct.name}}DataView input_data_view({{params}}, |
16 {{serialization_context}}); | 16 {{serialization_context}}); |
17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} | 17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} |
18 if (!success) { | 18 if (!success) { |
19 mojo::internal::ValidationContext validation_context( | 19 ReportValidationErrorForMessage( |
20 {{message}}->data(), {{message}}->data_num_bytes(), | 20 {{message}}, |
21 {{message}}->handles()->size(), {{message}}, | 21 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED, |
22 "{{description}} deserializer"); | 22 "{{description}} deserializer"); |
23 ReportValidationError( | |
24 &validation_context, | |
25 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED); | |
26 return false; | 23 return false; |
27 } | 24 } |
28 {%- endmacro %} | 25 {%- endmacro %} |
29 | 26 |
30 {%- macro pass_params(parameters) %} | 27 {%- macro pass_params(parameters) %} |
31 {%- for param in parameters %} | 28 {%- for param in parameters %} |
32 std::move(p_{{param.name}}) | 29 std::move(p_{{param.name}}) |
33 {%- if not loop.last %}, {% endif %} | 30 {%- if not loop.last %}, {% endif %} |
34 {%- endfor %} | 31 {%- endfor %} |
35 {%- endmacro %} | 32 {%- endmacro %} |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; | 90 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; |
94 {%- endfor -%} | 91 {%- endfor -%} |
95 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); | 92 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); |
96 }; | 93 }; |
97 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( | 94 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( |
98 mojo::Message* message) { | 95 mojo::Message* message) { |
99 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = | 96 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = |
100 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( | 97 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( |
101 message->mutable_payload()); | 98 message->mutable_payload()); |
102 | 99 |
100 {%- set desc = class_name~"::"~method.name~" response" %} | |
yzshen1
2016/07/31 07:16:32
:D good catch.
One thing may be worth considering
tibell
2016/07/31 23:50:29
Agreed. It's on my list.
| |
103 {{alloc_params(method.response_param_struct, "params", "message", | 101 {{alloc_params(method.response_param_struct, "params", "message", |
104 "&serialization_context_", | 102 "&serialization_context_", desc)}} |
105 "{{class_name}}::{{method.name}} response")}} | |
106 | 103 |
107 {%- for param in method.response_parameters %} | 104 {%- for param in method.response_parameters %} |
108 *out_{{param.name}}_ = std::move(p_{{param.name}}); | 105 *out_{{param.name}}_ = std::move(p_{{param.name}}); |
109 {%- endfor %} | 106 {%- endfor %} |
110 *result_ = true; | 107 *result_ = true; |
111 return true; | 108 return true; |
112 } | 109 } |
113 {%- endif %} | 110 {%- endif %} |
114 | 111 |
115 class {{class_name}}_{{method.name}}_ForwardToCallback | 112 class {{class_name}}_{{method.name}}_ForwardToCallback |
(...skipping 10 matching lines...) Expand all Loading... | |
126 {{class_name}}::{{method.name}}Callback callback_; | 123 {{class_name}}::{{method.name}}Callback callback_; |
127 mojo::internal::SerializationContext serialization_context_; | 124 mojo::internal::SerializationContext serialization_context_; |
128 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); | 125 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); |
129 }; | 126 }; |
130 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( | 127 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( |
131 mojo::Message* message) { | 128 mojo::Message* message) { |
132 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = | 129 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = |
133 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( | 130 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( |
134 message->mutable_payload()); | 131 message->mutable_payload()); |
135 | 132 |
133 {%- set desc = class_name~"::"~method.name~" response" %} | |
136 {{alloc_params(method.response_param_struct, "params", "message", | 134 {{alloc_params(method.response_param_struct, "params", "message", |
137 "&serialization_context_", | 135 "&serialization_context_", desc)}} |
138 "{{class_name}}_{{method.name}} response")}} | |
139 if (!callback_.is_null()) | 136 if (!callback_.is_null()) |
140 callback_.Run({{pass_params(method.response_parameters)}}); | 137 callback_.Run({{pass_params(method.response_parameters)}}); |
141 return true; | 138 return true; |
142 } | 139 } |
143 {%- endif %} | 140 {%- endif %} |
144 {%- endfor %} | 141 {%- endfor %} |
145 | 142 |
146 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) | 143 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) |
147 : ControlMessageProxy(receiver) { | 144 : ControlMessageProxy(receiver) { |
148 } | 145 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
210 {%- endfor %} | 207 {%- endfor %} |
211 | 208 |
212 {#--- ProxyToResponder definition #} | 209 {#--- ProxyToResponder definition #} |
213 {%- for method in interface.methods -%} | 210 {%- for method in interface.methods -%} |
214 {%- if method.response_parameters != None %} | 211 {%- if method.response_parameters != None %} |
215 {%- set message_name = | 212 {%- set message_name = |
216 "internal::k%s_%s_Name"|format(interface.name, method.name) %} | 213 "internal::k%s_%s_Name"|format(interface.name, method.name) %} |
217 {%- set response_params_struct = method.response_param_struct %} | 214 {%- set response_params_struct = method.response_param_struct %} |
218 {%- set params_description = | 215 {%- set params_description = |
219 "%s.%s response"|format(interface.name, method.name) %} | 216 "%s.%s response"|format(interface.name, method.name) %} |
220 class {{class_name}}_{{method.name}}_ProxyToResponder | 217 class {{class_name}}_{{method.name}}_ProxyToResponder { |
221 : public base::RefCountedThreadSafe< | |
222 {{class_name}}_{{method.name}}_ProxyToResponder> { | |
223 public: | 218 public: |
224 static {{class_name}}::{{method.name}}Callback CreateCallback( | 219 static {{class_name}}::{{method.name}}Callback CreateCallback( |
225 uint64_t request_id, | 220 uint64_t request_id, |
226 bool is_sync, | 221 bool is_sync, |
227 mojo::MessageReceiverWithStatus* responder, | 222 mojo::MessageReceiverWithStatus* responder, |
228 scoped_refptr<mojo::AssociatedGroupController> | 223 scoped_refptr<mojo::AssociatedGroupController> |
229 group_controller) { | 224 group_controller) { |
230 scoped_refptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy | 225 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( |
231 = new {{class_name}}_{{method.name}}_ProxyToResponder( | 226 new {{class_name}}_{{method.name}}_ProxyToResponder( |
232 request_id, is_sync, responder, group_controller); | 227 request_id, is_sync, responder, group_controller)); |
233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, | 228 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, |
234 proxy); | 229 base::Passed(&proxy)); |
235 } | |
236 | |
237 private: | |
238 friend class base::RefCountedThreadSafe< | |
239 {{class_name}}_{{method.name}}_ProxyToResponder>; | |
240 | |
241 {{class_name}}_{{method.name}}_ProxyToResponder( | |
242 uint64_t request_id, | |
243 bool is_sync, | |
244 mojo::MessageReceiverWithStatus* responder, | |
245 scoped_refptr<mojo::AssociatedGroupController> group_controller) | |
246 : request_id_(request_id), | |
247 is_sync_(is_sync), | |
248 responder_(responder), | |
249 serialization_context_(std::move(group_controller)) { | |
250 } | 230 } |
251 | 231 |
252 ~{{class_name}}_{{method.name}}_ProxyToResponder() { | 232 ~{{class_name}}_{{method.name}}_ProxyToResponder() { |
253 #if DCHECK_IS_ON() | 233 #if DCHECK_IS_ON() |
254 if (responder_) { | 234 if (responder_) { |
255 // Is the Mojo application destroying the callback without running it | 235 // Is the Mojo application destroying the callback without running it |
256 // and without first closing the pipe? | 236 // and without first closing the pipe? |
257 responder_->DCheckInvalid("The callback passed to " | 237 responder_->DCheckInvalid("The callback passed to " |
258 "{{class_name}}::{{method.name}}() was never run."); | 238 "{{class_name}}::{{method.name}}() was never run."); |
259 } | 239 } |
260 #endif | 240 #endif |
261 // If the Callback was dropped then deleting the responder will close | 241 // If the Callback was dropped then deleting the responder will close |
262 // the pipe so the calling application knows to stop waiting for a reply. | 242 // the pipe so the calling application knows to stop waiting for a reply. |
263 delete responder_; | 243 delete responder_; |
264 } | 244 } |
265 | 245 |
246 private: | |
247 {{class_name}}_{{method.name}}_ProxyToResponder( | |
248 uint64_t request_id, | |
249 bool is_sync, | |
250 mojo::MessageReceiverWithStatus* responder, | |
251 scoped_refptr<mojo::AssociatedGroupController> group_controller) | |
252 : request_id_(request_id), | |
253 is_sync_(is_sync), | |
254 responder_(responder), | |
255 serialization_context_(std::move(group_controller)) { | |
256 } | |
257 | |
266 void Run( | 258 void Run( |
267 {{interface_macros.declare_responder_params( | 259 {{interface_macros.declare_responder_params( |
268 "in_", method.response_parameters, for_blink, | 260 "in_", method.response_parameters, for_blink, |
269 use_new_wrapper_types)}}); | 261 use_new_wrapper_types)}}); |
270 | 262 |
271 uint64_t request_id_; | 263 uint64_t request_id_; |
272 bool is_sync_; | 264 bool is_sync_; |
273 mojo::MessageReceiverWithStatus* responder_; | 265 mojo::MessageReceiverWithStatus* responder_; |
274 // TODO(yzshen): maybe I should use a ref to the original one? | 266 // TODO(yzshen): maybe I should use a ref to the original one? |
275 mojo::internal::SerializationContext serialization_context_; | 267 mojo::internal::SerializationContext serialization_context_; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
313 return control_message_handler_.Accept(message); | 305 return control_message_handler_.Accept(message); |
314 {%- if interface.methods %} | 306 {%- if interface.methods %} |
315 switch (message->header()->name) { | 307 switch (message->header()->name) { |
316 {%- for method in interface.methods %} | 308 {%- for method in interface.methods %} |
317 case internal::k{{class_name}}_{{method.name}}_Name: { | 309 case internal::k{{class_name}}_{{method.name}}_Name: { |
318 {%- if method.response_parameters == None %} | 310 {%- if method.response_parameters == None %} |
319 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 311 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
320 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( | 312 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( |
321 message->mutable_payload()); | 313 message->mutable_payload()); |
322 | 314 |
315 {%- set desc = class_name~"::"~method.name %} | |
323 {{alloc_params(method.param_struct, "params", "message", | 316 {{alloc_params(method.param_struct, "params", "message", |
324 "&serialization_context_", "{{class_name}}::{{method.name}}") | 317 "&serialization_context_", desc) |
325 |indent(4)}} | 318 |indent(4)}} |
yzshen1
2016/07/31 07:16:32
nit: now this line could be merged with the one ab
tibell
2016/07/31 23:50:29
Done.
| |
326 // A null |sink_| means no implementation was bound. | 319 // A null |sink_| means no implementation was bound. |
327 assert(sink_); | 320 assert(sink_); |
328 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 321 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
329 sink_->{{method.name}}({{pass_params(method.parameters)}}); | 322 sink_->{{method.name}}({{pass_params(method.parameters)}}); |
330 return true; | 323 return true; |
331 {%- else %} | 324 {%- else %} |
332 break; | 325 break; |
333 {%- endif %} | 326 {%- endif %} |
334 } | 327 } |
335 {%- endfor %} | 328 {%- endfor %} |
336 } | 329 } |
337 {%- endif %} | 330 {%- endif %} |
338 return false; | 331 return false; |
339 } | 332 } |
340 | 333 |
341 bool {{class_name}}Stub::AcceptWithResponder( | 334 bool {{class_name}}Stub::AcceptWithResponder( |
342 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) { | 335 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) { |
343 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) | 336 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) |
344 return control_message_handler_.AcceptWithResponder(message, responder); | 337 return control_message_handler_.AcceptWithResponder(message, responder); |
345 {%- if interface.methods %} | 338 {%- if interface.methods %} |
346 switch (message->header()->name) { | 339 switch (message->header()->name) { |
347 {%- for method in interface.methods %} | 340 {%- for method in interface.methods %} |
348 case internal::k{{class_name}}_{{method.name}}_Name: { | 341 case internal::k{{class_name}}_{{method.name}}_Name: { |
349 {%- if method.response_parameters != None %} | 342 {%- if method.response_parameters != None %} |
350 internal::{{class_name}}_{{method.name}}_Params_Data* params = | 343 internal::{{class_name}}_{{method.name}}_Params_Data* params = |
351 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( | 344 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( |
352 message->mutable_payload()); | 345 message->mutable_payload()); |
353 | 346 |
347 {%- set desc = class_name~"::"~method.name %} | |
354 {{alloc_params(method.param_struct, "params", "message", | 348 {{alloc_params(method.param_struct, "params", "message", |
355 "&serialization_context_", "{{class_name}}::{{method.name}}")| | 349 "&serialization_context_", desc)| |
356 indent(4)}} | 350 indent(4)}} |
357 {{class_name}}::{{method.name}}Callback callback = | 351 {{class_name}}::{{method.name}}Callback callback = |
358 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( | 352 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( |
359 message->request_id(), | 353 message->request_id(), |
360 message->has_flag(mojo::Message::kFlagIsSync), | 354 message->has_flag(mojo::Message::kFlagIsSync), |
361 responder, | 355 responder, |
362 serialization_context_.group_controller); | 356 serialization_context_.group_controller); |
363 // A null |sink_| means no implementation was bound. | 357 // A null |sink_| means no implementation was bound. |
364 assert(sink_); | 358 assert(sink_); |
365 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); | 359 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
464 break; | 458 break; |
465 } | 459 } |
466 | 460 |
467 // Unrecognized message. | 461 // Unrecognized message. |
468 ReportValidationError( | 462 ReportValidationError( |
469 &validation_context, | 463 &validation_context, |
470 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); | 464 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); |
471 return false; | 465 return false; |
472 } | 466 } |
473 {%- endif -%} | 467 {%- endif -%} |
OLD | NEW |