| Index: mojo/public/dart/bindings/lib/src/client.dart
|
| diff --git a/mojo/public/dart/bindings/lib/src/client.dart b/mojo/public/dart/bindings/lib/src/client.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..88dd8e7297a44609995f1506f55ec402827bff03
|
| --- /dev/null
|
| +++ b/mojo/public/dart/bindings/lib/src/client.dart
|
| @@ -0,0 +1,84 @@
|
| +// 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.
|
| +
|
| +part of bindings;
|
| +
|
| +abstract class Client {
|
| + core.MojoMessagePipeEndpoint _endpoint;
|
| + core.MojoHandle _handle;
|
| + List _send_queue;
|
| + List _completer_queue;
|
| + var _subscription;
|
| +
|
| + void handleResponse(MessageReader reader);
|
| +
|
| + Client(this._endpoint) {
|
| + _send_queue = [];
|
| + _completer_queue = [];
|
| + _handle = new core.MojoHandle(_endpoint.handle);
|
| + _subscription = _handle.listen((int mojo_handle_signal) {
|
| + if (core.MojoHandleSignals.isReadable(mojo_handle_signal)) {
|
| + // Query how many bytes are available.
|
| + List result = _endpoint.query();
|
| + if ((result[0] != core.MojoResult.OK) &&
|
| + (result[0] != core.MojoResult.RESOURCE_EXHAUSTED)) {
|
| + // If something else happens, it means the handle wasn't really ready
|
| + // for reading, which indicates a bug in MojoHandle or the
|
| + // event listener.
|
| + throw new Exception("bytes query failed: ${result[0]}");
|
| + }
|
| + int size = result[1];
|
| +
|
| + // Read the data.
|
| + ByteData bytes = new ByteData(size);
|
| + _endpoint.read(bytes);
|
| + var message = new Message(bytes, null);
|
| + var reader = new MessageReader(message);
|
| +
|
| + // Complete _future_queue[0] with the received string.
|
| + handleResponse(reader);
|
| + }
|
| + if (core.MojoHandleSignals.isWritable(mojo_handle_signal)) {
|
| + if (_send_queue.length > 0) {
|
| + List message_completer = _send_queue.removeAt(0);
|
| + _endpoint.write(message_completer[0].buffer);
|
| + if (_endpoint.status != core.MojoResult.OK) {
|
| + throw new Exception("endpoint write failed");
|
| + }
|
| + _completer_queue.add(message_completer[1]);
|
| + }
|
| + if ((_send_queue.length == 0) && _handle.writeEnabled()) {
|
| + _handle.toggleWriteEvents();
|
| + }
|
| + }
|
| + }, onDone: () {
|
| + handle.close();
|
| + });
|
| + }
|
| +
|
| + void close() {
|
| + _subscription.cancel();
|
| + }
|
| +
|
| + Future enqueueMessage(Type t, int name, Object msg) {
|
| + var builder = new MessageBuilder(name, align(getEncodedSize(t)));
|
| + builder.encodeStruct(t, msg);
|
| + var message = builder.finish();
|
| +
|
| + var completer = new Completer();
|
| + send_queue.add([message, completer]);
|
| + if ((send_queue.length > 0) && !handle.writeEnabled()) {
|
| + handle.toggleWriteEvents();
|
| + }
|
| + return completer.future;
|
| + }
|
| +
|
| + // We need getters for these because they are abstract in the "Calls"
|
| + // mixin classes.
|
| + List get send_queue => _send_queue;
|
| + core.MojoHandle get handle => _handle;
|
| +
|
| + // Need a getter for this for access in subclasses.
|
| + List get completer_queue => _completer_queue;
|
| +}
|
|
|