blob: 8d8b48f1fa8657762cc8b60708649a31500f1235 [file]
{%- for method in interface.methods %}
const int _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name = {{method.ordinal}};
{%- endfor %}
{#--- Interface Enums #}
{%- from "enum_definition.tmpl" import enum_def -%}
{%- for enum in interface.enums %}
{{ enum_def(enum, typepkg, package) }}
{%- endfor %}
class _{{interface|name}}ServiceDescription implements {{descpkg}}ServiceDescription {
{%- if should_gen_mojom_types and interface.service_name %}
dynamic getTopLevelInterface([Function responseFactory]){
var interfaceTypeKey = getRuntimeTypeInfo().services["{{interface.service_name}}"];
var userDefinedType = getAllMojomTypeDefinitions()[interfaceTypeKey];
return responseFactory(userDefinedType.interfaceType);
}
dynamic getTypeDefinition(String typeKey, [Function responseFactory]) =>
responseFactory(getAllMojomTypeDefinitions()[typeKey]);
dynamic getAllTypeDefinitions([Function responseFactory]) =>
responseFactory(getAllMojomTypeDefinitions());
{%- else %}
dynamic getTopLevelInterface([Function responseFactory]) =>
responseFactory(null);
dynamic getTypeDefinition(String typeKey, [Function responseFactory]) =>
responseFactory(null);
dynamic getAllTypeDefinitions([Function responseFactory]) =>
responseFactory(null);
{%- endif %}
}
abstract class {{interface|name}} {
{%- if interface.service_name %}
static const String serviceName = "{{interface.service_name}}";
{%- else %}
static const String serviceName = null;
{%- endif %}
static {{descpkg}}ServiceDescription _cachedServiceDescription;
static {{descpkg}}ServiceDescription get serviceDescription {
if (_cachedServiceDescription == null) {
_cachedServiceDescription = new _{{interface|name}}ServiceDescription();
}
return _cachedServiceDescription;
}
static {{interface|name}}Proxy connectToService(
bindings.ServiceConnector s, String url, [String serviceName]) {
{{interface|name}}Proxy p = new {{interface|name}}Proxy.unbound();
String name = serviceName ?? {{interface|name}}.serviceName;
if ((name == null) || name.isEmpty) {
throw new core.MojoApiError(
"If an interface has no ServiceName, then one must be provided.");
}
s.connectToService(url, p, name);
return p;
}
{%- for method in interface.methods %}
{%- if method.response_parameters == None %}
void {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
);
{%- else %}
dynamic {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}},
{%- endfor -%}
[Function responseFactory = null]);
{%- endif %}
{%- endfor %}
{#--- Interface Constants #}
{%- for constant in interface.constants %}
static const {{constant.kind|dart_type}} {{constant|name}} = {{constant.resolved_value}};
{%- endfor %}
}
abstract class {{interface|name}}Interface
implements bindings.MojoInterface<{{interface|name}}>,
{{interface|name}} {
factory {{interface|name}}Interface([{{interface|name}} impl]) =>
new {{interface|name}}Stub.unbound(impl);
factory {{interface|name}}Interface.fromEndpoint(
core.MojoMessagePipeEndpoint endpoint,
[{{interface|name}} impl]) =>
new {{interface|name}}Stub.fromEndpoint(endpoint, impl);
}
abstract class {{interface|name}}InterfaceRequest
implements bindings.MojoInterface<{{interface|name}}>,
{{interface|name}} {
factory {{interface|name}}InterfaceRequest() =>
new {{interface|name}}Proxy.unbound();
}
class _{{interface|name}}ProxyControl
extends bindings.ProxyMessageHandler
implements bindings.ProxyControl<{{interface|name}}> {
_{{interface|name}}ProxyControl.fromEndpoint(
core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
_{{interface|name}}ProxyControl.fromHandle(
core.MojoHandle handle) : super.fromHandle(handle);
_{{interface|name}}ProxyControl.unbound() : super.unbound();
String get serviceName => {{interface|name}}.serviceName;
void handleResponse(bindings.ServiceMessage message) {
switch (message.header.type) {
{%- for method in interface.methods %}
{%- if method.response_parameters != None %}
{%- set response_struct = method.response_param_struct %}
case _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name:
var r = {{response_struct|name}}.deserialize(
message.payload);
if (!message.header.hasRequestId) {
proxyError("Expected a message with a valid request Id.");
return;
}
Completer c = completerMap[message.header.requestId];
if (c == null) {
proxyError(
"Message had unknown request Id: ${message.header.requestId}");
return;
}
completerMap.remove(message.header.requestId);
if (c.isCompleted) {
proxyError("Response completer already completed");
return;
}
c.complete(r);
break;
{%- endif %}
{%- endfor %}
default:
proxyError("Unexpected message type: ${message.header.type}");
close(immediate: true);
break;
}
}
{{interface|name}} get impl => null;
set impl({{interface|name}} _) {
throw new core.MojoApiError("The impl of a Proxy cannot be set.");
}
@override
String toString() {
var superString = super.toString();
return "_{{interface|name}}ProxyControl($superString)";
}
}
class {{interface|name}}Proxy
extends bindings.Proxy<{{interface|name}}>
implements {{interface|name}},
{{interface|name}}Interface,
{{interface|name}}InterfaceRequest {
{{interface|name}}Proxy.fromEndpoint(
core.MojoMessagePipeEndpoint endpoint)
: super(new _{{interface|name}}ProxyControl.fromEndpoint(endpoint));
{{interface|name}}Proxy.fromHandle(core.MojoHandle handle)
: super(new _{{interface|name}}ProxyControl.fromHandle(handle));
{{interface|name}}Proxy.unbound()
: super(new _{{interface|name}}ProxyControl.unbound());
static {{interface|name}}Proxy newFromEndpoint(
core.MojoMessagePipeEndpoint endpoint) {
assert(endpoint.setDescription("For {{interface|name}}Proxy"));
return new {{interface|name}}Proxy.fromEndpoint(endpoint);
}
{% for method in interface.methods %}
{%- if method.response_parameters == None %}
void {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
{%- set request_struct = method.param_struct -%}
) {
if (!ctrl.isBound) {
ctrl.proxyError("The Proxy is closed.");
return;
}
var params = new {{request_struct|name}}();
{%- for parameter in method.parameters %}
params.{{parameter|name}} = {{parameter|name}};
{%- endfor %}
ctrl.sendMessage(params,
_{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name);
}
{%- else %}
{%- set request_struct = method.param_struct %}
dynamic {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}},
{%- endfor -%}
[Function responseFactory = null]) {
var params = new {{request_struct|name}}();
{%- for parameter in method.parameters %}
params.{{parameter|name}} = {{parameter|name}};
{%- endfor %}
return ctrl.sendMessageWithRequestId(
params,
_{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name,
-1,
bindings.MessageHeader.kMessageExpectsResponse);
}
{%- endif %}
{%- endfor %}
}
class _{{interface|name}}StubControl
extends bindings.StubMessageHandler
implements bindings.StubControl<{{interface|name}}> {
{{interface|name}} _impl;
_{{interface|name}}StubControl.fromEndpoint(
core.MojoMessagePipeEndpoint endpoint, [{{interface|name}} impl])
: super.fromEndpoint(endpoint, autoBegin: impl != null) {
_impl = impl;
}
_{{interface|name}}StubControl.fromHandle(
core.MojoHandle handle, [{{interface|name}} impl])
: super.fromHandle(handle, autoBegin: impl != null) {
_impl = impl;
}
_{{interface|name}}StubControl.unbound([this._impl]) : super.unbound();
String get serviceName => {{interface|name}}.serviceName;
{% for method in interface.methods %}
{%- if method.response_parameters != None %}
{%- set response_struct = method.response_param_struct %}
{{response_struct|name}} _{{response_struct|name|lower_camel}}Factory(
{%- for param in method.response_parameters -%}
{{param.kind|dart_type}} {{param|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {
var result = new {{response_struct|name}}();
{%- for param in method.response_parameters %}
result.{{param|name}} = {{param|name}};
{%- endfor %}
return result;
}
{%- endif %}
{%- endfor %}
dynamic handleMessage(bindings.ServiceMessage message) {
if (bindings.ControlMessageHandler.isControlMessage(message)) {
return bindings.ControlMessageHandler.handleMessage(this,
{{interface.version}},
message);
}
if (_impl == null) {
throw new core.MojoApiError("$this has no implementation set");
}
switch (message.header.type) {
{%- for method in interface.methods %}
{%- set request_struct = method.param_struct %}
case _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name:
{%- if method.parameters %}
var params = {{request_struct|name}}.deserialize(
message.payload);
{%- endif %}
{%- if method.response_parameters == None %}
_impl.{{method|name}}(
{%- for parameter in method.parameters -%}
params.{{parameter|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
);
{%- else %}
{%- set response_struct = method.response_param_struct %}
var response = _impl.{{method|name}}(
{%- for parameter in method.parameters -%}
params.{{parameter|name}},
{%- endfor -%}
_{{response_struct|name|lower_camel}}Factory);
if (response is Future) {
return response.then((response) {
if (response != null) {
return buildResponseWithId(
response,
_{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name,
message.header.requestId,
bindings.MessageHeader.kMessageIsResponse);
}
});
} else if (response != null) {
return buildResponseWithId(
response,
_{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name,
message.header.requestId,
bindings.MessageHeader.kMessageIsResponse);
}
{%- endif %}
break;
{%- endfor %}
default:
throw new bindings.MojoCodecError("Unexpected message name");
break;
}
return null;
}
{{interface|name}} get impl => _impl;
set impl({{interface|name}} d) {
if (d == null) {
throw new core.MojoApiError("$this: Cannot set a null implementation");
}
if (isBound && (_impl == null)) {
beginHandlingEvents();
}
_impl = d;
}
@override
void bind(core.MojoMessagePipeEndpoint endpoint) {
super.bind(endpoint);
if (!isOpen && (_impl != null)) {
beginHandlingEvents();
}
}
@override
String toString() {
var superString = super.toString();
return "_{{interface|name}}StubControl($superString)";
}
int get version => {{interface.version}};
}
class {{interface|name}}Stub
extends bindings.Stub<{{interface|name}}>
implements {{interface|name}},
{{interface|name}}Interface,
{{interface|name}}InterfaceRequest {
{{interface|name}}Stub.unbound([{{interface|name}} impl])
: super(new _{{interface|name}}StubControl.unbound(impl));
{{interface|name}}Stub.fromEndpoint(
core.MojoMessagePipeEndpoint endpoint, [{{interface|name}} impl])
: super(new _{{interface|name}}StubControl.fromEndpoint(endpoint, impl));
{{interface|name}}Stub.fromHandle(
core.MojoHandle handle, [{{interface|name}} impl])
: super(new _{{interface|name}}StubControl.fromHandle(handle, impl));
static {{interface|name}}Stub newFromEndpoint(
core.MojoMessagePipeEndpoint endpoint) {
assert(endpoint.setDescription("For {{interface|name}}Stub"));
return new {{interface|name}}Stub.fromEndpoint(endpoint);
}
{% for method in interface.methods %}
{%- if method.response_parameters == None %}
void {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {
return impl.{{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter|name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
);
}
{%- else %}
dynamic {{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter.kind|dart_type}} {{parameter|name}},
{%- endfor -%}
[Function responseFactory = null]) {
return impl.{{method|name}}(
{%- for parameter in method.parameters -%}
{{parameter|name}},
{%- endfor -%}
responseFactory);
}
{%- endif %}
{%- endfor %}
}