Luis Hector Chavez | 645501c | 2016-12-28 10:56:26 -0800 | [diff] [blame] | 1 | {% 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 | |
| 22 | interface {{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 -%} |
| 45 | org.chromium.mojo.bindings.MessageHeader.NO_FLAG |
| 46 | {%- elif is_request: -%} |
| 47 | org.chromium.mojo.bindings.MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG |
| 48 | {%- else -%} |
| 49 | org.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) -%} |
| 58 | public 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) -%} |
| 85 | try { |
| 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 Abe | 0411add | 2017-12-13 19:00:02 +0900 | [diff] [blame] | 94 | case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_MESSAGE_ID: |
Luis Hector Chavez | 645501c | 2016-12-28 10:56:26 -0800 | [diff] [blame] | 95 | return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun( |
| 96 | getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver); |
| 97 | {% else %} |
Hidehiko Abe | 0411add | 2017-12-13 19:00:02 +0900 | [diff] [blame] | 98 | case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID: |
Luis Hector Chavez | 645501c | 2016-12-28 10:56:26 -0800 | [diff] [blame] | 99 | 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 Chavez | 3033949 | 2017-12-18 09:58:43 -0800 | [diff] [blame] | 116 | 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 Chavez | 645501c | 2016-12-28 10:56:26 -0800 | [diff] [blame] | 122 | 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) %} |
| 136 | public 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) %} |
| 161 | class {{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 Chavez | fd75f2c | 2017-08-18 09:34:16 -0700 | [diff] [blame] | 249 | 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 Chavez | 645501c | 2016-12-28 10:56:26 -0800 | [diff] [blame] | 255 | 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 %} |