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, 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 -%} |
OLD | NEW |