blob: 83b265fc97c84b34f23e4d90b0c1d42411893963 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:typed_data';
import 'package:mojom/dart_to_cpp/dart_to_cpp.mojom.dart';
import 'package:mojo/bindings.dart' as bindings;
import 'package:mojo/core.dart' as core;
class DartSideImpl implements DartSide {
static const int BAD_VALUE = 13;
static const int ELEMENT_BYTES = 1;
static const int CAPACITY_BYTES = 64;
DartSideStub _stub;
CppSideProxy cppSide;
Uint8List _sampleData;
Uint8List _sampleMessage;
Completer _completer;
DartSideImpl(core.MojoMessagePipeEndpoint endpoint) {
_stub = new DartSideStub.fromEndpoint(endpoint, this);
_sampleData = new Uint8List(CAPACITY_BYTES);
for (int i = 0; i < _sampleData.length; ++i) {
_sampleData[i] = i;
}
_sampleMessage = new Uint8List(CAPACITY_BYTES);
for (int i = 0; i < _sampleMessage.length; ++i) {
_sampleMessage[i] = 255 - i;
}
_completer = new Completer();
}
EchoArgsList createEchoArgsList(List<EchoArgs> list) {
return list.fold(null, (result, arg) {
var element = new EchoArgsList();
element.item = arg;
element.next = result;
return element;
});
}
void setClient(bindings.ProxyBase proxy) {
assert(cppSide == null);
cppSide = proxy;
cppSide.ptr.startTest();
}
void ping() {
cppSide.ptr.pingResponse();
_completer.complete(null);
cppSide.close();
}
void echo(int numIterations, EchoArgs arg) {
if (arg.si64 > 0) {
arg.si64 = BAD_VALUE;
}
if (arg.si32 > 0) {
arg.si32 = BAD_VALUE;
}
if (arg.si16 > 0) {
arg.si16 = BAD_VALUE;
}
if (arg.si8 > 0) {
arg.si8 = BAD_VALUE;
}
for (int i = 0; i < numIterations; ++i) {
var dataPipe1 = new core.MojoDataPipe(ELEMENT_BYTES, CAPACITY_BYTES);
var dataPipe2 = new core.MojoDataPipe(ELEMENT_BYTES, CAPACITY_BYTES);
var messagePipe1 = new core.MojoMessagePipe();
var messagePipe2 = new core.MojoMessagePipe();
arg.dataHandle = dataPipe1.consumer;
arg.messageHandle = messagePipe1.endpoints[0];
var specialArg = new EchoArgs();
specialArg.si64 = -1;
specialArg.si32 = -1;
specialArg.si16 = -1;
specialArg.si8 = -1;
specialArg.name = 'going';
specialArg.dataHandle = dataPipe2.consumer;
specialArg.messageHandle = messagePipe2.endpoints[0];
dataPipe1.producer.write(_sampleData.buffer.asByteData());
dataPipe2.producer.write(_sampleData.buffer.asByteData());
messagePipe1.endpoints[1].write(_sampleMessage.buffer.asByteData());
messagePipe2.endpoints[1].write(_sampleMessage.buffer.asByteData());
cppSide.ptr.echoResponse(createEchoArgsList([arg, specialArg]));
dataPipe1.producer.handle.close();
dataPipe2.producer.handle.close();
messagePipe1.endpoints[1].handle.close();
messagePipe2.endpoints[1].handle.close();
}
cppSide.ptr.testFinished();
_completer.complete(null);
cppSide.close();
}
Future<bool> get future => _completer.future;
}
main(List args) {
assert(args.length == 3);
int mojoHandle = args[0];
var rawHandle = new core.MojoHandle(mojoHandle);
var endpoint = new core.MojoMessagePipeEndpoint(rawHandle);
var dartSide = new DartSideImpl(endpoint);
dartSide.future.then((_) {
print('Success');
});
}