| Index: examples/dart/netcat/lib/main.dart
|
| diff --git a/examples/dart/netcat/lib/main.dart b/examples/dart/netcat/lib/main.dart
|
| index 9ae28454abe3f276698423be7beb47b5c83ad6d9..60d5637cd8c851e92cda86ea3bd27bb694dc41c0 100644
|
| --- a/examples/dart/netcat/lib/main.dart
|
| +++ b/examples/dart/netcat/lib/main.dart
|
| @@ -33,7 +33,7 @@ NetAddress makeIPv4NetAddress(List<int> addr, int port) {
|
| }
|
|
|
| void fputs(files.File f, String s) {
|
| - ignoreFuture(f.write((s + '\n').codeUnits, 0, files.Whence.fromCurrent));
|
| + f.write((s + '\n').codeUnits, 0, files.Whence.fromCurrent, (e, n) {});
|
| }
|
|
|
| // Connects the terminal |File| and the socket.
|
| @@ -65,7 +65,11 @@ class Connector {
|
|
|
| NetAddress local_address = makeIPv4NetAddress([0, 0, 0, 0], 0);
|
| var boundSocket = new TcpBoundSocketProxy.unbound();
|
| - await networkService.createTcpBoundSocket(local_address, boundSocket);
|
| + var c = new Completer();
|
| + networkService.createTcpBoundSocket(local_address, boundSocket, (_) {
|
| + c.complete(null);
|
| + });
|
| + await networkService.responseOrError(c.future);
|
| await networkService.close();
|
|
|
| var sendDataPipe = new MojoDataPipe();
|
| @@ -73,8 +77,12 @@ class Connector {
|
| var receiveDataPipe = new MojoDataPipe();
|
| _socketReceiver = receiveDataPipe.consumer;
|
| _socket = new TcpConnectedSocketProxy.unbound();
|
| - await boundSocket.connect(remote_address, sendDataPipe.consumer,
|
| - receiveDataPipe.producer, _socket);
|
| + c = new Completer();
|
| + boundSocket.connect(remote_address, sendDataPipe.consumer,
|
| + receiveDataPipe.producer, _socket, (_) {
|
| + c.complete(null);
|
| + });
|
| + await boundSocket.responseOrError(c.future);
|
| await boundSocket.close();
|
|
|
| // Set up reading from the terminal.
|
| @@ -91,34 +99,38 @@ class Connector {
|
|
|
| void _startReadingFromTerminal() {
|
| // TODO(vtl): Do we have to do something on error?
|
| - _terminal
|
| - .read(_writeBuffer.lengthInBytes, 0, files.Whence.fromCurrent)
|
| - .then(_onReadFromTerminal)
|
| - .catchError((e) {
|
| + var c = new Completer();
|
| + _terminal.read(
|
| + _writeBuffer.lengthInBytes, 0,
|
| + files.Whence.fromCurrent, (error, bytes) {
|
| + _onReadFromTerminal(error, bytes);
|
| + c.complete(null);
|
| + });
|
| + _terminal.responseOrError(c.future).catchError((_) {
|
| _shutDown();
|
| });
|
| }
|
|
|
| - void _onReadFromTerminal(files.FileReadResponseParams p) {
|
| - if (p.error != files.Error.ok) {
|
| + void _onReadFromTerminal(files.Error error, List<int> bytesRead) {
|
| + if (error != files.Error.ok) {
|
| // TODO(vtl): Do terminal errors.
|
| return;
|
| }
|
|
|
| // TODO(vtl): Verify that |bytesRead.length| is within the expected range.
|
| - for (var i = 0, j = 0; i < p.bytesRead.length; i++, j++) {
|
| + for (var i = 0, j = 0; i < bytesRead.length; i++, j++) {
|
| // TODO(vtl): Temporary hack: Translate \r to \n, since we don't have
|
| // built-in support for that.
|
| - if (p.bytesRead[i] == 13) {
|
| + if (bytesRead[i] == 13) {
|
| _writeBuffer.setUint8(i, 10);
|
| } else {
|
| - _writeBuffer.setUint8(i, p.bytesRead[i]);
|
| + _writeBuffer.setUint8(i, bytesRead[i]);
|
| }
|
| }
|
|
|
| // TODO(vtl): Handle the send data pipe being full (or closed).
|
| _socketSender
|
| - .write(new ByteData.view(_writeBuffer.buffer, 0, p.bytesRead.length));
|
| + .write(new ByteData.view(_writeBuffer.buffer, 0, bytesRead.length));
|
|
|
| _startReadingFromTerminal();
|
| }
|
| @@ -129,10 +141,12 @@ class Connector {
|
| var numBytesRead = _socketReceiver.read(_readBuffer);
|
| if (_socketReceiver.status == MojoResult.kOk) {
|
| assert(numBytesRead > 0);
|
| - _terminal
|
| - .write(_readBuffer.buffer.asUint8List(0, numBytesRead), 0,
|
| - files.Whence.fromCurrent)
|
| - .catchError((e) {
|
| + var c = new Completer();
|
| + _terminal.write(_readBuffer.buffer.asUint8List(0, numBytesRead), 0,
|
| + files.Whence.fromCurrent, (e, n) {
|
| + c.complete(null);
|
| + });
|
| + _terminal.responseOrError(c.future).catchError((_) {
|
| _shutDown();
|
| });
|
| _socketReceiverEventSubscription.enableReadEvents();
|
|
|