Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 2064903002: Mojo: Report bindings validation errors via MojoNotifyBadMessage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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, error, create_error,
9 method_name, serialization_context) %}
9 ({{params}})->DecodePointers(); 10 ({{params}})->DecodePointers();
10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); 11 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
11 bool success = true; 12 bool success = true;
12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} 13 {%- for param in struct.packed.packed_fields_in_ordinal_order %}
13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; 14 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{};
14 {%- endfor %} 15 {%- endfor %}
15 {{struct.name}}DataView input_data_view({{params}}, 16 {{struct.name}}DataView input_data_view({{params}},
16 {{serialization_context}}); 17 {{serialization_context}});
17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} 18 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
18 if (!success) 19 if (!success) {
20 *{{error}} = {{create_error}}("{{class_name}}", "{{method_name}}",
21 {{message}});
19 return false; 22 return false;
23 }
20 {%- endmacro %} 24 {%- endmacro %}
21 25
22 {%- macro pass_params(parameters) %} 26 {%- macro pass_params(parameters) %}
23 {%- for param in parameters %} 27 {%- for param in parameters %}
24 {%- if param.kind|is_move_only_kind -%} 28 {%- if param.kind|is_move_only_kind -%}
25 std::move(p_{{param.name}}) 29 std::move(p_{{param.name}})
26 {%- else -%} 30 {%- else -%}
27 p_{{param.name}} 31 p_{{param.name}}
28 {%- endif -%} 32 {%- endif -%}
29 {%- if not loop.last %}, {% endif %} 33 {%- if not loop.last %}, {% endif %}
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 scoped_refptr<mojo::internal::MultiplexRouter> router, bool* result 79 scoped_refptr<mojo::internal::MultiplexRouter> router, bool* result
76 {%- for param in method.response_parameters -%} 80 {%- for param in method.response_parameters -%}
77 , {{param.kind|cpp_wrapper_type}}* out_{{param.name}} 81 , {{param.kind|cpp_wrapper_type}}* out_{{param.name}}
78 {%- endfor %}) 82 {%- endfor %})
79 : serialization_context_(std::move(router)), result_(result) 83 : serialization_context_(std::move(router)), result_(result)
80 {%- for param in method.response_parameters -%} 84 {%- for param in method.response_parameters -%}
81 , out_{{param.name}}_(out_{{param.name}}) 85 , out_{{param.name}}_(out_{{param.name}})
82 {%- endfor %} { 86 {%- endfor %} {
83 DCHECK(!*result_); 87 DCHECK(!*result_);
84 } 88 }
85 bool Accept(mojo::Message* message) override; 89 bool Accept(mojo::Message* message, mojo::Error* error) override;
86 private: 90 private:
87 mojo::internal::SerializationContext serialization_context_; 91 mojo::internal::SerializationContext serialization_context_;
88 bool* result_; 92 bool* result_;
89 {%- for param in method.response_parameters %} 93 {%- for param in method.response_parameters %}
90 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; 94 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_;
91 {%- endfor -%} 95 {%- endfor -%}
92 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); 96 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
93 }; 97 };
94 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( 98 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
95 mojo::Message* message) { 99 mojo::Message* message, mojo::Error* error) {
96 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 100 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
97 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 101 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
98 message->mutable_payload()); 102 message->mutable_payload());
99 103
100 {{alloc_params(method.response_param_struct, "params", "message", 104 {{alloc_params(method.response_param_struct, "params", "message", "error",
105 "mojo::Error::ForBadResponse", method.name,
101 "&serialization_context_")}} 106 "&serialization_context_")}}
102 107
103 {%- for param in method.response_parameters %} 108 {%- for param in method.response_parameters %}
104 {%- if param.kind|is_move_only_kind %} 109 {%- if param.kind|is_move_only_kind %}
105 *out_{{param.name}}_ = std::move(p_{{param.name}}); 110 *out_{{param.name}}_ = std::move(p_{{param.name}});
106 {%- else %} 111 {%- else %}
107 *out_{{param.name}}_ = p_{{param.name}}; 112 *out_{{param.name}}_ = p_{{param.name}};
108 {%- endif %} 113 {%- endif %}
109 {%- endfor %} 114 {%- endfor %}
110 *result_ = true; 115 *result_ = true;
111 return true; 116 return true;
112 } 117 }
113 {%- endif %} 118 {%- endif %}
114 119
115 class {{class_name}}_{{method.name}}_ForwardToCallback 120 class {{class_name}}_{{method.name}}_ForwardToCallback
116 : public mojo::MessageReceiver { 121 : public mojo::MessageReceiver {
117 public: 122 public:
118 {{class_name}}_{{method.name}}_ForwardToCallback( 123 {{class_name}}_{{method.name}}_ForwardToCallback(
119 const {{class_name}}::{{method.name}}Callback& callback, 124 const {{class_name}}::{{method.name}}Callback& callback,
120 scoped_refptr<mojo::internal::MultiplexRouter> router) 125 scoped_refptr<mojo::internal::MultiplexRouter> router)
121 : callback_(callback), serialization_context_(std::move(router)) { 126 : callback_(callback), serialization_context_(std::move(router)) {
122 } 127 }
123 bool Accept(mojo::Message* message) override; 128 bool Accept(mojo::Message* message, mojo::Error* error) override;
124 private: 129 private:
125 {{class_name}}::{{method.name}}Callback callback_; 130 {{class_name}}::{{method.name}}Callback callback_;
126 mojo::internal::SerializationContext serialization_context_; 131 mojo::internal::SerializationContext serialization_context_;
127 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); 132 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
128 }; 133 };
129 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( 134 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
130 mojo::Message* message) { 135 mojo::Message* message, mojo::Error* error) {
131 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 136 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
132 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 137 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
133 message->mutable_payload()); 138 message->mutable_payload());
134 139
135 {{alloc_params(method.response_param_struct, "params", "message", 140 {{alloc_params(method.response_param_struct, "params", "message", "error",
141 "mojo::Error::ForBadResponse", method.name,
136 "&serialization_context_")}} 142 "&serialization_context_")}}
137 callback_.Run({{pass_params(method.response_parameters)}}); 143 callback_.Run({{pass_params(method.response_parameters)}});
138 return true; 144 return true;
139 } 145 }
140 {%- endif %} 146 {%- endif %}
141 {%- endfor %} 147 {%- endfor %}
142 148
143 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) 149 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
144 : ControlMessageProxy(receiver) { 150 : ControlMessageProxy(receiver) {
145 } 151 }
(...skipping 18 matching lines...) Expand all
164 {{build_message(params_struct, "param_%s", params_description, 170 {{build_message(params_struct, "param_%s", params_description,
165 "&serialization_context_")}} 171 "&serialization_context_")}}
166 172
167 bool result = false; 173 bool result = false;
168 mojo::MessageReceiver* responder = 174 mojo::MessageReceiver* responder =
169 new {{class_name}}_{{method.name}}_HandleSyncResponse( 175 new {{class_name}}_{{method.name}}_HandleSyncResponse(
170 serialization_context_.router, &result 176 serialization_context_.router, &result
171 {%- for param in method.response_parameters -%} 177 {%- for param in method.response_parameters -%}
172 , param_{{param.name}} 178 , param_{{param.name}}
173 {%- endfor %}); 179 {%- endfor %});
174 if (!receiver_->AcceptWithResponder(builder.message(), responder)) 180 mojo::Error send_error;
181 if (!receiver_->AcceptWithResponder(builder.message(), responder,
182 &send_error)) {
175 delete responder; 183 delete responder;
184 }
176 return result; 185 return result;
177 } 186 }
178 {%- endif %} 187 {%- endif %}
179 188
180 void {{proxy_name}}::{{method.name}}( 189 void {{proxy_name}}::{{method.name}}(
181 {{interface_macros.declare_request_params("in_", method)}}) { 190 {{interface_macros.declare_request_params("in_", method)}}) {
182 {{struct_macros.get_serialized_size(params_struct, "in_%s", 191 {{struct_macros.get_serialized_size(params_struct, "in_%s",
183 "&serialization_context_")}} 192 "&serialization_context_")}}
184 193
185 {%- if method.response_parameters != None %} 194 {%- if method.response_parameters != None %}
186 mojo::internal::RequestMessageBuilder builder({{message_name}}, size); 195 mojo::internal::RequestMessageBuilder builder({{message_name}}, size);
187 {%- else %} 196 {%- else %}
188 mojo::internal::MessageBuilder builder({{message_name}}, size); 197 mojo::internal::MessageBuilder builder({{message_name}}, size);
189 {%- endif %} 198 {%- endif %}
190 199
191 {{build_message(params_struct, "in_%s", params_description, 200 {{build_message(params_struct, "in_%s", params_description,
192 "&serialization_context_")}} 201 "&serialization_context_")}}
193 202
194 {%- if method.response_parameters != None %} 203 {%- if method.response_parameters != None %}
195 mojo::MessageReceiver* responder = 204 mojo::MessageReceiver* responder =
196 new {{class_name}}_{{method.name}}_ForwardToCallback(callback, serializati on_context_.router); 205 new {{class_name}}_{{method.name}}_ForwardToCallback(
197 if (!receiver_->AcceptWithResponder(builder.message(), responder)) 206 callback, serialization_context_.router);
207 mojo::Error send_error;
208 if (!receiver_->AcceptWithResponder(builder.message(), responder,
209 &send_error)) {
198 delete responder; 210 delete responder;
211 }
199 {%- else %} 212 {%- else %}
200 bool ok = receiver_->Accept(builder.message()); 213 mojo::Error send_response_error;
214 bool ok = receiver_->Accept(builder.message(), &send_response_error);
201 // This return value may be ignored as !ok implies the Connector has 215 // This return value may be ignored as !ok implies the Connector has
202 // encountered an error, which will be visible through other means. 216 // encountered an error, which will be visible through other means.
203 ALLOW_UNUSED_LOCAL(ok); 217 ALLOW_UNUSED_LOCAL(ok);
204 {%- endif %} 218 {%- endif %}
205 } 219 }
206 {%- endfor %} 220 {%- endfor %}
207 221
208 {#--- ProxyToResponder definition #} 222 {#--- ProxyToResponder definition #}
209 {%- for method in interface.methods -%} 223 {%- for method in interface.methods -%}
210 {%- if method.response_parameters != None %} 224 {%- if method.response_parameters != None %}
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 }; 268 };
255 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( 269 void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
256 {{interface_macros.declare_params("in_", method.response_parameters)}}) { 270 {{interface_macros.declare_params("in_", method.response_parameters)}}) {
257 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", 271 {{struct_macros.get_serialized_size(response_params_struct, "in_%s",
258 "&serialization_context_")}} 272 "&serialization_context_")}}
259 mojo::internal::ResponseMessageBuilder builder( 273 mojo::internal::ResponseMessageBuilder builder(
260 {{message_name}}, size, request_id_, 274 {{message_name}}, size, request_id_,
261 is_sync_ ? mojo::internal::kMessageIsSync : 0); 275 is_sync_ ? mojo::internal::kMessageIsSync : 0);
262 {{build_message(response_params_struct, "in_%s", params_description, 276 {{build_message(response_params_struct, "in_%s", params_description,
263 "&serialization_context_")}} 277 "&serialization_context_")}}
264 bool ok = responder_->Accept(builder.message()); 278 mojo::Error send_response_error;
279 bool ok = responder_->Accept(builder.message(), &send_response_error);
265 ALLOW_UNUSED_LOCAL(ok); 280 ALLOW_UNUSED_LOCAL(ok);
266 // TODO(darin): !ok returned here indicates a malformed message, and that may 281 // TODO(darin): !ok returned here indicates a malformed message, and that may
267 // be good reason to close the connection. However, we don't have a way to do 282 // be good reason to close the connection. However, we don't have a way to do
268 // that from here. We should add a way. 283 // that from here. We should add a way.
269 delete responder_; 284 delete responder_;
270 responder_ = nullptr; 285 responder_ = nullptr;
271 } 286 }
272 {%- endif -%} 287 {%- endif -%}
273 {%- endfor %} 288 {%- endfor %}
274 289
275 {{class_name}}Stub::{{class_name}}Stub() 290 {{class_name}}Stub::{{class_name}}Stub()
276 : sink_(nullptr), 291 : sink_(nullptr),
277 control_message_handler_({{interface.name}}::Version_) { 292 control_message_handler_({{interface.name}}::Version_) {
278 } 293 }
279 294
280 {{class_name}}Stub::~{{interface.name}}Stub() {} 295 {{class_name}}Stub::~{{interface.name}}Stub() {}
281 296
282 {#--- Stub definition #} 297 {#--- Stub definition #}
283 298
284 bool {{class_name}}Stub::Accept(mojo::Message* message) { 299 bool {{class_name}}Stub::Accept(mojo::Message* message, mojo::Error* error) {
285 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) 300 if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
286 return control_message_handler_.Accept(message); 301 return control_message_handler_.Accept(message, error);
287 {%- if interface.methods %} 302 {%- if interface.methods %}
288 switch (message->header()->name) { 303 switch (message->header()->name) {
289 {%- for method in interface.methods %} 304 {%- for method in interface.methods %}
290 case internal::k{{class_name}}_{{method.name}}_Name: { 305 case internal::k{{class_name}}_{{method.name}}_Name: {
291 {%- if method.response_parameters == None %} 306 {%- if method.response_parameters == None %}
292 internal::{{class_name}}_{{method.name}}_Params_Data* params = 307 internal::{{class_name}}_{{method.name}}_Params_Data* params =
293 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 308 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
294 message->mutable_payload()); 309 message->mutable_payload());
295 310
296 {{alloc_params(method.param_struct, "params", "message", 311 {{alloc_params(method.param_struct, "params", "message", "error",
312 "mojo::Error::ForBadRequest", method.name,
297 "&serialization_context_")|indent(4)}} 313 "&serialization_context_")|indent(4)}}
298 // A null |sink_| means no implementation was bound. 314 // A null |sink_| means no implementation was bound.
299 assert(sink_); 315 assert(sink_);
300 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 316 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
301 sink_->{{method.name}}({{pass_params(method.parameters)}}); 317 sink_->{{method.name}}({{pass_params(method.parameters)}});
302 return true; 318 return true;
303 {%- else %} 319 {%- else %}
304 break; 320 break;
305 {%- endif %} 321 {%- endif %}
306 } 322 }
307 {%- endfor %} 323 {%- endfor %}
308 } 324 }
309 {%- endif %} 325 {%- endif %}
310 return false; 326 return false;
311 } 327 }
312 328
313 bool {{class_name}}Stub::AcceptWithResponder( 329 bool {{class_name}}Stub::AcceptWithResponder(
314 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) { 330 mojo::Message* message,
315 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) 331 mojo::MessageReceiverWithStatus* responder,
316 return control_message_handler_.AcceptWithResponder(message, responder); 332 mojo::Error* error) {
333 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
334 return control_message_handler_.AcceptWithResponder(message, responder,
335 error);
336 }
317 {%- if interface.methods %} 337 {%- if interface.methods %}
318 switch (message->header()->name) { 338 switch (message->header()->name) {
319 {%- for method in interface.methods %} 339 {%- for method in interface.methods %}
320 case internal::k{{class_name}}_{{method.name}}_Name: { 340 case internal::k{{class_name}}_{{method.name}}_Name: {
321 {%- if method.response_parameters != None %} 341 {%- if method.response_parameters != None %}
322 internal::{{class_name}}_{{method.name}}_Params_Data* params = 342 internal::{{class_name}}_{{method.name}}_Params_Data* params =
323 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 343 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
324 message->mutable_payload()); 344 message->mutable_payload());
325 345
326 {{alloc_params(method.param_struct, "params", "message", 346 {{alloc_params(method.param_struct, "params", "message", "error",
347 "mojo::Error::ForBadRequest", method.name,
327 "&serialization_context_")|indent(4)}} 348 "&serialization_context_")|indent(4)}}
328 {{class_name}}::{{method.name}}Callback::Runnable* runnable = 349 {{class_name}}::{{method.name}}Callback::Runnable* runnable =
329 new {{class_name}}_{{method.name}}_ProxyToResponder( 350 new {{class_name}}_{{method.name}}_ProxyToResponder(
330 message->request_id(), 351 message->request_id(),
331 message->has_flag(mojo::internal::kMessageIsSync), 352 message->has_flag(mojo::internal::kMessageIsSync),
332 responder, 353 responder,
333 serialization_context_.router); 354 serialization_context_.router);
334 {{class_name}}::{{method.name}}Callback callback(runnable); 355 {{class_name}}::{{method.name}}Callback callback(runnable);
335 // A null |sink_| means no implementation was bound. 356 // A null |sink_| means no implementation was bound.
336 assert(sink_); 357 assert(sink_);
(...skipping 10 matching lines...) Expand all
347 {%- endif %} 368 {%- endif %}
348 return false; 369 return false;
349 } 370 }
350 371
351 {#--- Request validator definitions #} 372 {#--- Request validator definitions #}
352 373
353 {{class_name}}RequestValidator::{{class_name}}RequestValidator( 374 {{class_name}}RequestValidator::{{class_name}}RequestValidator(
354 mojo::MessageReceiver* sink) : MessageFilter(sink) { 375 mojo::MessageReceiver* sink) : MessageFilter(sink) {
355 } 376 }
356 377
357 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) { 378 bool {{class_name}}RequestValidator::Accept(mojo::Message* message,
379 mojo::Error* error) {
358 assert(sink_); 380 assert(sink_);
359 381
360 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { 382 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
361 if (!mojo::internal::ValidateControlRequest(message)) 383 if (!mojo::internal::ValidateControlRequest(message)) {
384 *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
362 return false; 385 return false;
363 return sink_->Accept(message); 386 }
387 return sink_->Accept(message, error);
364 } 388 }
365 389
366 switch (message->header()->name) { 390 switch (message->header()->name) {
367 {%- for method in interface.methods %} 391 {%- for method in interface.methods %}
368 case internal::k{{class_name}}_{{method.name}}_Name: { 392 case internal::k{{class_name}}_{{method.name}}_Name: {
369 {%- if method.response_parameters != None %} 393 {%- if method.response_parameters != None %}
370 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) 394 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) {
395 *error = mojo::Error::ForBadRequest(
396 "{{class_name}}", "{{method.name}}", message);
371 return false; 397 return false;
398 }
372 {%- else %} 399 {%- else %}
373 if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) 400 if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) {
401 *error = mojo::Error::ForBadRequest(
402 "{{class_name}}", "{{method.name}}", message);
374 return false; 403 return false;
404 }
375 {%- endif %} 405 {%- endif %}
376 if (!mojo::internal::ValidateMessagePayload< 406 if (!mojo::internal::ValidateMessagePayload<
377 internal::{{class_name}}_{{method.name}}_Params_Data>(message)) { 407 internal::{{class_name}}_{{method.name}}_Params_Data>(message)) {
408 *error = mojo::Error::ForBadRequest(
409 "{{class_name}}", "{{method.name}}", message);
378 return false; 410 return false;
379 } 411 }
380 return sink_->Accept(message); 412 return sink_->Accept(message, error);
381 } 413 }
382 {%- endfor %} 414 {%- endfor %}
383 default: 415 default:
384 break; 416 break;
385 } 417 }
386 418
387 // Unrecognized message. 419 // Unrecognized message.
388 ReportValidationError( 420 ReportValidationError(
389 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 421 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
390 return false; 422 return false;
391 } 423 }
392 424
393 {#--- Response validator definitions #} 425 {#--- Response validator definitions #}
394 {% if interface|has_callbacks %} 426 {% if interface|has_callbacks %}
395 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator( 427 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator(
396 mojo::MessageReceiver* sink) : MessageFilter(sink) { 428 mojo::MessageReceiver* sink) : MessageFilter(sink) {
397 } 429 }
398 430
399 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) { 431 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message,
432 mojo::Error* error) {
400 assert(sink_); 433 assert(sink_);
401 434
402 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { 435 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
403 if (!mojo::internal::ValidateControlResponse(message)) 436 if (!mojo::internal::ValidateControlResponse(message)) {
437 *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
404 return false; 438 return false;
405 return sink_->Accept(message); 439 }
440 return sink_->Accept(message, error);
406 } 441 }
407 442
408 if (!mojo::internal::ValidateMessageIsResponse(message)) 443 if (!mojo::internal::ValidateMessageIsResponse(message)) {
444 *error = mojo::Error::ForUnexpectedRequest("{{class_name}}", message);
409 return false; 445 return false;
446 }
410 switch (message->header()->name) { 447 switch (message->header()->name) {
411 {%- for method in interface.methods if method.response_parameters != None %} 448 {%- for method in interface.methods if method.response_parameters != None %}
412 case internal::k{{class_name}}_{{method.name}}_Name: { 449 case internal::k{{class_name}}_{{method.name}}_Name: {
413 if (!mojo::internal::ValidateMessagePayload< 450 if (!mojo::internal::ValidateMessagePayload<
414 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(mes sage)) { 451 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
452 message)) {
453 *error = mojo::Error::ForBadResponse(
454 "{{class_name}}", "{{method.name}}", message);
415 return false; 455 return false;
416 } 456 }
417 return sink_->Accept(message); 457 return sink_->Accept(message, error);
418 } 458 }
419 {%- endfor %} 459 {%- endfor %}
420 default: 460 default:
421 break; 461 break;
422 } 462 }
423 463
424 // Unrecognized message. 464 // Unrecognized message.
425 ReportValidationError( 465 ReportValidationError(
426 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 466 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
467 *error = mojo::Error::ForUnexpectedResponse("{{class_name}}", message);
427 return false; 468 return false;
428 } 469 }
429 {%- endif -%} 470 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698