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