blob: a723f8c3932aa8a8733e278062ad274ed2cb67d7 [file] [log] [blame]
Luis Hector Chavez645501c2016-12-28 10:56:26 -08001{% from "constant_definition.tmpl" import constant_def %}
2{% from "enum_definition.tmpl" import enum_def %}
3{% from "data_types_definition.tmpl" import struct_def %}
4
5{%- macro declare_params(parameters, boxed=false) %}
6{%- for param in parameters -%}
7{{param.kind|java_type(boxed)}} {{param|name}}
8{%- if not loop.last %}, {% endif %}
9{%- endfor %}
10{%- endmacro %}
11
12{% macro declare_request_params(method) %}
13{{declare_params(method.parameters)}}
14{%- if method.response_parameters != None -%}
15{%- if method.parameters %}, {% endif %}
16{{method|interface_response_name}} callback
17{%- endif -%}
18{% endmacro %}
19
20{%- macro declare_callback(method) -%}
21
22interface {{method|interface_response_name}} extends org.chromium.mojo.bindings.Callbacks.Callback{{method.response_parameters|length}}{% if method.response_parameters %}<
23{%- for param in method.response_parameters -%}
24{{param.kind|java_type(True)}}
25{%- if not loop.last %}, {% endif %}
26{%- endfor -%}
27>{% endif %} { }
28{%- endmacro -%}
29
30{%- macro run_callback(variable, parameters) -%}
31{%- if parameters -%}
32{%- for param in parameters -%}
33{{variable}}.{{param|name}}
34{%- if not loop.last %}, {% endif %}
35{%- endfor -%}
36{%- endif -%}
37{%- endmacro -%}
38
39{%- macro flags_for_method(method, is_request) -%}
40{{flags(method.response_parameters != None, is_request)}}
41{%- endmacro -%}
42
43{%- macro flags(use_response_flag, is_request) -%}
44{%- if not use_response_flag -%}
45org.chromium.mojo.bindings.MessageHeader.NO_FLAG
46{%- elif is_request: -%}
47org.chromium.mojo.bindings.MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG
48{%- else -%}
49org.chromium.mojo.bindings.MessageHeader.MESSAGE_IS_RESPONSE_FLAG
50{%- endif -%}
51{%- endmacro -%}
52
53{%- macro manager_class(interface, fully_qualified=False) -%}
54{% if fully_qualified %}org.chromium.mojo.bindings.Interface.{% endif %}Manager<{{interface|name}}, {{interface|name}}.Proxy>
55{%- endmacro -%}
56
57{%- macro manager_def(interface) -%}
58public static final {{manager_class(interface, True)}} MANAGER =
59 new {{manager_class(interface, True)}}() {
60
61 public String getName() {
62 return "{{namespace|replace(".","::")}}::{{interface.name}}";
63 }
64
65 public int getVersion() {
66 return {{interface.version}};
67 }
68
69 public Proxy buildProxy(org.chromium.mojo.system.Core core,
70 org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
71 return new Proxy(core, messageReceiver);
72 }
73
74 public Stub buildStub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
75 return new Stub(core, impl);
76 }
77
78 public {{interface|name}}[] buildArray(int size) {
79 return new {{interface|name}}[size];
80 }
81};
82{%- endmacro -%}
83
84{%- macro accept_body(interface, with_response) -%}
85try {
86 org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
87 message.asServiceMessage();
88 org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
89 if (!header.validateHeader({{flags(with_response, True)}})) {
90 return false;
91 }
92 switch(header.getType()) {
93{% if with_response %}
Hidehiko Abe0411add2017-12-13 19:00:02 +090094 case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_MESSAGE_ID:
Luis Hector Chavez645501c2016-12-28 10:56:26 -080095 return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun(
96 getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver);
97{% else %}
Hidehiko Abe0411add2017-12-13 19:00:02 +090098 case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID:
Luis Hector Chavez645501c2016-12-28 10:56:26 -080099 return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe(
100 {{interface|name}}_Internal.MANAGER, messageWithHeader);
101{% endif %}
102{% for method in interface.methods %}
103{% if (with_response and method.response_parameters != None) or
104 (not with_response and method.response_parameters == None) %}
105{% set request_struct = method.param_struct %}
106{% if with_response %}
107{% set response_struct = method.response_param_struct %}
108{% endif %}
109 case {{method|method_ordinal_name}}: {
110{% if method.parameters %}
111 {{request_struct|name}} data =
112 {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
113{% else %}
114 {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
115{% endif %}
Luis Hector Chavez30339492017-12-18 09:58:43 -0800116 try {
117 getImpl().{{method|name}}({{run_callback('data', method.parameters)}}{% if with_response %}{% if method.parameters %}, {% endif %}new {{response_struct|name}}ProxyToResponder(getCore(), receiver, header.getRequestId()){% endif %});
118 } catch (RuntimeException e) {
119 // TODO(lhchavez): Remove this hack. See b/28814913 for details.
120 android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
121 }
Luis Hector Chavez645501c2016-12-28 10:56:26 -0800122 return true;
123 }
124{% endif %}
125{% endfor %}
126 default:
127 return false;
128 }
129} catch (org.chromium.mojo.bindings.DeserializationException e) {
130 System.err.println(e.toString());
131 return false;
132}
133{%- endmacro -%}
134
135{% macro interface_def(interface) %}
136public interface {{interface|name}} extends org.chromium.mojo.bindings.Interface {
137{% for constant in interface.constants %}
138
139 {{constant_def(constant)|indent(4)}}
140{% endfor %}
141{% for enum in interface.enums %}
142
143 {{enum_def(enum, false)|indent(4)}}
144{% endfor %}
145
146 public interface Proxy extends {{interface|name}}, org.chromium.mojo.bindings.Interface.Proxy {
147 }
148
149 {{manager_class(interface)}} MANAGER = {{interface|name}}_Internal.MANAGER;
150{% for method in interface.methods %}
151
152 void {{method|name}}({{declare_request_params(method)}});
153{% if method.response_parameters != None %}
154 {{declare_callback(method)|indent(4)}}
155{% endif %}
156{% endfor %}
157}
158{% endmacro %}
159
160{% macro interface_internal_def(interface) %}
161class {{interface|name}}_Internal {
162
163 {{manager_def(interface)|indent(4)}}
164
165{% for method in interface.methods %}
166 private static final int {{method|method_ordinal_name}} = {{method.ordinal}};
167{% endfor %}
168
169 static final class Proxy extends org.chromium.mojo.bindings.Interface.AbstractProxy implements {{interface|name}}.Proxy {
170
171 Proxy(org.chromium.mojo.system.Core core,
172 org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
173 super(core, messageReceiver);
174 }
175{% for method in interface.methods %}
176
177 @Override
178 public void {{method|name}}({{declare_request_params(method)}}) {
179{% set request_struct = method.param_struct %}
180 {{request_struct|name}} _message = new {{request_struct|name}}();
181{% for param in method.parameters %}
182 _message.{{param|name}} = {{param|name}};
183{% endfor %}
184{% if method.response_parameters != None %}
185 getProxyHandler().getMessageReceiver().acceptWithResponder(
186 _message.serializeWithHeader(
187 getProxyHandler().getCore(),
188 new org.chromium.mojo.bindings.MessageHeader(
189 {{method|method_ordinal_name}},
190 {{flags_for_method(method, True)}},
191 0)),
192 new {{method.response_param_struct|name}}ForwardToCallback(callback));
193{% else %}
194 getProxyHandler().getMessageReceiver().accept(
195 _message.serializeWithHeader(
196 getProxyHandler().getCore(),
197 new org.chromium.mojo.bindings.MessageHeader({{method|method_ordinal_name}})));
198{% endif %}
199 }
200{% endfor %}
201
202 }
203
204 static final class Stub extends org.chromium.mojo.bindings.Interface.Stub<{{interface|name}}> {
205
206 Stub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
207 super(core, impl);
208 }
209
210 @Override
211 public boolean accept(org.chromium.mojo.bindings.Message message) {
212 {{accept_body(interface, False)|indent(12)}}
213 }
214
215 @Override
216 public boolean acceptWithResponder(org.chromium.mojo.bindings.Message message, org.chromium.mojo.bindings.MessageReceiver receiver) {
217 {{accept_body(interface, True)|indent(12)}}
218 }
219 }
220{% for method in interface.methods %}
221
222 {{ struct_def(method.param_struct, True)|indent(4) }}
223{% if method.response_parameters != None %}
224{% set response_struct = method.response_param_struct %}
225
226 {{ struct_def(response_struct, True)|indent(4) }}
227
228 static class {{response_struct|name}}ForwardToCallback extends org.chromium.mojo.bindings.SideEffectFreeCloseable
229 implements org.chromium.mojo.bindings.MessageReceiver {
230 private final {{interface|name}}.{{method|interface_response_name}} mCallback;
231
232 {{response_struct|name}}ForwardToCallback({{interface|name}}.{{method|interface_response_name}} callback) {
233 this.mCallback = callback;
234 }
235
236 @Override
237 public boolean accept(org.chromium.mojo.bindings.Message message) {
238 try {
239 org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
240 message.asServiceMessage();
241 org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
242 if (!header.validateHeader({{method|method_ordinal_name}},
243 {{flags_for_method(method, False)}})) {
244 return false;
245 }
246{% if method.response_parameters|length %}
247 {{response_struct|name}} response = {{response_struct|name}}.deserialize(messageWithHeader.getPayload());
248{% endif %}
Luis Hector Chavezfd75f2c2017-08-18 09:34:16 -0700249 try {
250 mCallback.call({{run_callback('response', method.response_parameters)}});
251 } catch (RuntimeException e) {
252 // TODO(lhchavez): Remove this hack. See b/28814913 for details.
253 android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
254 }
Luis Hector Chavez645501c2016-12-28 10:56:26 -0800255 return true;
256 } catch (org.chromium.mojo.bindings.DeserializationException e) {
257 return false;
258 }
259 }
260 }
261
262 static class {{response_struct|name}}ProxyToResponder implements {{interface|name}}.{{method|interface_response_name}} {
263
264 private final org.chromium.mojo.system.Core mCore;
265 private final org.chromium.mojo.bindings.MessageReceiver mMessageReceiver;
266 private final long mRequestId;
267
268 {{response_struct|name}}ProxyToResponder(
269 org.chromium.mojo.system.Core core,
270 org.chromium.mojo.bindings.MessageReceiver messageReceiver,
271 long requestId) {
272 mCore = core;
273 mMessageReceiver = messageReceiver;
274 mRequestId = requestId;
275 }
276
277 @Override
278 public void call({{declare_params(method.response_parameters, true)}}) {
279 {{response_struct|name}} _response = new {{response_struct|name}}();
280{% for param in method.response_parameters %}
281 _response.{{param|name}} = {{param|name}};
282{% endfor %}
283 org.chromium.mojo.bindings.ServiceMessage _message =
284 _response.serializeWithHeader(
285 mCore,
286 new org.chromium.mojo.bindings.MessageHeader(
287 {{method|method_ordinal_name}},
288 {{flags_for_method(method, False)}},
289 mRequestId));
290 mMessageReceiver.accept(_message);
291 }
292 }
293{% endif %}
294{% endfor %}
295
296}
297{% endmacro %}