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

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

Powered by Google App Engine
This is Rietveld 408576698