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

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

Issue 814543006: Move //mojo/{public, edk} underneath //third_party (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 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
(Empty)
1 {%- import "interface_macros.tmpl" as interface_macros %}
2 {%- set class_name = interface.name %}
3 {%- set proxy_name = interface.name ~ "Proxy" %}
4 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
5
6 {%- macro alloc_params(parameters) %}
7 {%- for param in parameters %}
8 {%- if param.kind|is_object_kind %}
9 {{param.kind|cpp_result_type}} p{{loop.index}};
10 Deserialize_(params->{{param.name}}.ptr, &p{{loop.index}});
11 {% endif -%}
12 {%- endfor %}
13 {%- endmacro %}
14
15 {%- macro pass_params(parameters) %}
16 {%- for param in parameters %}
17 {%- if param.kind|is_string_kind -%}
18 p{{loop.index}}
19 {%- elif param.kind|is_object_kind -%}
20 p{{loop.index}}.Pass()
21 {%- elif param.kind|is_interface_kind -%}
22 mojo::MakeProxy<{{param.kind|get_name_for_kind}}>(mojo::MakeScopedHandle(mojo::i nternal::FetchAndReset(&params->{{param.name}})))
23 {%- elif param.kind|is_interface_request_kind -%}
24 mojo::MakeRequest<{{param.kind.kind|get_name_for_kind}}>(mojo::MakeScopedHandle( mojo::internal::FetchAndReset(&params->{{param.name}})))
25 {%- elif param.kind|is_any_handle_kind -%}
26 mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&params->{{param.name}}))
27 {%- elif param.kind|is_enum_kind -%}
28 static_cast<{{param.kind|cpp_wrapper_type}}>(params->{{param.name}})
29 {%- else -%}
30 params->{{param.name}}
31 {%- endif -%}
32 {%- if not loop.last %}, {% endif %}
33 {%- endfor %}
34 {%- endmacro %}
35
36 {%- macro compute_payload_size(params_name, parameters) -%}
37 size_t payload_size =
38 mojo::internal::Align(sizeof({{params_name}}));
39 {#--- Computes #}
40 {%- for param in parameters %}
41 {%- if param.kind|is_object_kind %}
42 payload_size += GetSerializedSize_(in_{{param.name}});
43 {%- endif %}
44 {%- endfor %}
45 {%- endmacro %}
46
47 {%- macro build_message(params_name, parameters, params_description) -%}
48 {# TODO(yzshen): Consider refactoring to share code with
49 struct_serialization_definition.tmpl #}
50 {{params_name}}* params =
51 {{params_name}}::New(builder.buffer());
52 {#--- Sets #}
53 {% for param in parameters %}
54 {%- if param.kind|is_object_kind %}
55 {%- if param.kind|is_array_kind %}
56 mojo::SerializeArray_<{{param.kind|get_array_validate_params|indent(24)}}>(
57 mojo::internal::Forward(in_{{param.name}}), builder.buffer(), &params->{{p aram.name}}.ptr);
58 {%- elif param.kind|is_map_kind %}
59 mojo::SerializeMap_<{{param.kind.value_kind|get_map_validate_params|indent(24) }}>(
60 mojo::internal::Forward(in_{{param.name}}), builder.buffer(), &params->{{p aram.name}}.ptr);
61 {%- else %}
62 Serialize_(mojo::internal::Forward(in_{{param.name}}), builder.buffer(), &para ms->{{param.name}}.ptr);
63 {%- endif %}
64 {%- if not param.kind|is_nullable_kind %}
65 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
66 !params->{{param.name}}.ptr,
67 mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
68 "null {{param.name}} argument in {{params_description}}");
69 {%- endif %}
70 {%- elif param.kind|is_any_handle_kind %}
71 {%- if param.kind|is_interface_kind or
72 param.kind|is_interface_request_kind %}
73 // Delegate handle.
74 params->{{param.name}} = in_{{param.name}}.PassMessagePipe().release();
75 {%- else %}
76 params->{{param.name}} = in_{{param.name}}.release();
77 {%- endif %}
78 {%- if not param.kind|is_nullable_kind %}
79 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
80 !params->{{param.name}}.is_valid(),
81 mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
82 "invalid {{param.name}} argument in {{params_description}}");
83 {%- endif %}
84 {%- else %}
85 params->{{param.name}} = in_{{param.name}};
86 {%- endif %}
87 {%- endfor %}
88 mojo::Message message;
89 params->EncodePointersAndHandles(message.mutable_handles());
90 builder.Finish(&message);
91 {%- endmacro %}
92
93 {#--- Begin #}
94 const char* {{class_name}}::Name_ = "{{namespace_as_string}}::{{class_name}}";
95 {#--- Constants #}
96 {% for constant in interface.constants %}
97 const {{constant.kind|cpp_pod_type}} {{interface.name}}::{{constant.name}} = {{c onstant|constant_value}};
98 {%- endfor %}
99
100 {#--- ForwardToCallback definition #}
101 {%- for method in interface.methods -%}
102 {%- if method.response_parameters != None %}
103 class {{class_name}}_{{method.name}}_ForwardToCallback
104 : public mojo::MessageReceiver {
105 public:
106 {{class_name}}_{{method.name}}_ForwardToCallback(
107 const {{interface_macros.declare_callback(method)}}& callback)
108 : callback_(callback) {
109 }
110 virtual bool Accept(mojo::Message* message) override;
111 private:
112 {{interface_macros.declare_callback(method)}} callback_;
113 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback );
114 };
115 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
116 mojo::Message* message) {
117 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
118 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
119 message->mutable_payload());
120
121 params->DecodePointersAndHandles(message->mutable_handles());
122 {{alloc_params(method.response_parameters)|indent(2)}}
123 callback_.Run({{pass_params(method.response_parameters)}});
124 return true;
125 }
126 {%- endif %}
127 {%- endfor %}
128
129 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
130 : receiver_(receiver) {
131 }
132
133 {#--- Proxy definitions #}
134
135 {%- for method in interface.methods %}
136 {%- set message_name =
137 "internal::k%s_%s_Name"|format(interface.name, method.name) %}
138 {%- set params_name =
139 "internal::%s_%s_Params_Data"|format(interface.name, method.name) %}
140 {%- set params_description =
141 "%s.%s request"|format(interface.name, method.name) %}
142 void {{proxy_name}}::{{method.name}}(
143 {{interface_macros.declare_request_params("in_", method)}}) {
144 {{compute_payload_size(params_name, method.parameters)}}
145
146 {%- if method.response_parameters != None %}
147 mojo::internal::RequestMessageBuilder builder({{message_name}}, payload_size);
148 {%- else %}
149 mojo::internal::MessageBuilder builder({{message_name}}, payload_size);
150 {%- endif %}
151
152 {{build_message(params_name, method.parameters, params_description)}}
153
154 {%- if method.response_parameters != None %}
155 mojo::MessageReceiver* responder =
156 new {{class_name}}_{{method.name}}_ForwardToCallback(callback);
157 if (!receiver_->AcceptWithResponder(&message, responder))
158 delete responder;
159 {%- else %}
160 bool ok = receiver_->Accept(&message);
161 // This return value may be ignored as !ok implies the Connector has
162 // encountered an error, which will be visible through other means.
163 MOJO_ALLOW_UNUSED_LOCAL(ok);
164 {%- endif %}
165 }
166 {%- endfor %}
167
168 {#--- ProxyToResponder definition #}
169 {%- for method in interface.methods -%}
170 {%- if method.response_parameters != None %}
171 {%- set message_name =
172 "internal::k%s_%s_Name"|format(interface.name, method.name) %}
173 {%- set params_name =
174 "internal::%s_%s_ResponseParams_Data"|format(interface.name, method. name) %}
175 {%- set params_description =
176 "%s.%s response"|format(interface.name, method.name) %}
177 class {{class_name}}_{{method.name}}_ProxyToResponder
178 : public {{interface_macros.declare_callback(method)}}::Runnable {
179 public:
180 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() {
181 delete responder_;
182 }
183
184 {{class_name}}_{{method.name}}_ProxyToResponder(
185 uint64_t request_id,
186 mojo::MessageReceiver* responder)
187 : request_id_(request_id),
188 responder_(responder) {
189 }
190
191 virtual void Run({{interface_macros.declare_params("in_", method.response_para meters)}}) const override;
192
193 private:
194 uint64_t request_id_;
195 mutable mojo::MessageReceiver* responder_;
196 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder) ;
197 };
198 void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
199 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons t {
200 {{compute_payload_size(params_name, method.response_parameters)}}
201 mojo::internal::ResponseMessageBuilder builder(
202 {{message_name}}, payload_size, request_id_);
203 {{build_message(params_name, method.response_parameters, params_description)}}
204 bool ok = responder_->Accept(&message);
205 MOJO_ALLOW_UNUSED_LOCAL(ok);
206 // TODO(darin): !ok returned here indicates a malformed message, and that may
207 // be good reason to close the connection. However, we don't have a way to do
208 // that from here. We should add a way.
209 delete responder_;
210 responder_ = nullptr;
211 }
212 {%- endif -%}
213 {%- endfor %}
214
215 {{class_name}}Stub::{{class_name}}Stub()
216 : sink_(nullptr) {
217 }
218
219 {#--- Stub definition #}
220
221 bool {{class_name}}Stub::Accept(mojo::Message* message) {
222 {%- if interface.methods %}
223 switch (message->header()->name) {
224 {%- for method in interface.methods %}
225 case internal::k{{class_name}}_{{method.name}}_Name: {
226 {%- if method.response_parameters == None %}
227 internal::{{class_name}}_{{method.name}}_Params_Data* params =
228 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
229 message->mutable_payload());
230
231 params->DecodePointersAndHandles(message->mutable_handles());
232 {{alloc_params(method.parameters)|indent(6)}}
233 // A null |sink_| typically means there is a missing call to
234 // InterfacePtr::set_client().
235 assert(sink_);
236 sink_->{{method.name}}({{pass_params(method.parameters)}});
237 return true;
238 {%- else %}
239 break;
240 {%- endif %}
241 }
242 {%- endfor %}
243 }
244 {%- endif %}
245 return false;
246 }
247
248 bool {{class_name}}Stub::AcceptWithResponder(
249 mojo::Message* message, mojo::MessageReceiver* responder) {
250 {%- if interface.methods %}
251 switch (message->header()->name) {
252 {%- for method in interface.methods %}
253 case internal::k{{class_name}}_{{method.name}}_Name: {
254 {%- if method.response_parameters != None %}
255 internal::{{class_name}}_{{method.name}}_Params_Data* params =
256 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
257 message->mutable_payload());
258
259 params->DecodePointersAndHandles(message->mutable_handles());
260 {{interface_macros.declare_callback(method)}}::Runnable* runnable =
261 new {{class_name}}_{{method.name}}_ProxyToResponder(
262 message->request_id(), responder);
263 {{interface_macros.declare_callback(method)}} callback(runnable);
264 {{alloc_params(method.parameters)|indent(6)}}
265 // A null |sink_| typically means there is a missing call to
266 // InterfacePtr::set_client().
267 assert(sink_);
268 sink_->{{method.name}}(
269 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call back);
270 return true;
271 {%- else %}
272 break;
273 {%- endif %}
274 }
275 {%- endfor %}
276 }
277 {%- endif %}
278 return false;
279 }
280
281 {#--- Request validator definitions #}
282
283 {{class_name}}RequestValidator::{{class_name}}RequestValidator(
284 mojo::MessageReceiver* sink) : MessageFilter(sink) {
285 }
286
287 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
288 {%- if interface.methods %}
289 switch (message->header()->name) {
290 {%- for method in interface.methods %}
291 case internal::k{{class_name}}_{{method.name}}_Name: {
292 {%- if method.response_parameters != None %}
293 if (!message->has_flag(mojo::internal::kMessageExpectsResponse))
294 break;
295 {%- else %}
296 if (message->has_flag(mojo::internal::kMessageExpectsResponse) ||
297 message->has_flag(mojo::internal::kMessageIsResponse)) {
298 break;
299 }
300 {%- endif %}
301 mojo::internal::BoundsChecker bounds_checker(
302 message->payload(), message->payload_num_bytes(),
303 message->handles()->size());
304 if (!internal::{{class_name}}_{{method.name}}_Params_Data::Validate(
305 message->payload(), &bounds_checker)) {
306 return false;
307 }
308 break;
309 }
310 {%- endfor %}
311 }
312 {%- endif %}
313
314 // A null |sink_| typically means there is a missing call to
315 // InterfacePtr::set_client().
316 assert(sink_);
317 return sink_->Accept(message);
318 }
319
320 {#--- Response validator definitions #}
321 {% if interface|has_callbacks %}
322 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator(
323 mojo::MessageReceiver* sink) : MessageFilter(sink) {
324 }
325
326 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
327 {%- if interface.methods %}
328 switch (message->header()->name) {
329 {%- for method in interface.methods if method.response_parameters != None %}
330 case internal::k{{class_name}}_{{method.name}}_Name: {
331 if (!message->has_flag(mojo::internal::kMessageIsResponse))
332 break;
333 mojo::internal::BoundsChecker bounds_checker(
334 message->payload(), message->payload_num_bytes(),
335 message->handles()->size());
336 if (!internal::{{class_name}}_{{method.name}}_ResponseParams_Data::Validat e(
337 message->payload(), &bounds_checker)) {
338 return false;
339 }
340 break;
341 }
342 {%- endfor %}
343 }
344 {%- endif %}
345
346 // A null |sink_| typically means there is a missing call to
347 // InterfacePtr::set_client().
348 assert(sink_);
349 return sink_->Accept(message);
350 }
351 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698