| Index: mojo/public/dart/src/interface.dart
|
| diff --git a/mojo/public/dart/src/interface.dart b/mojo/public/dart/src/interface.dart
|
| index 76807ed7fe4bc888a85a94a7591f667b9c73c53c..8d8970a0d4b3a28ad2cea1da0b9ce7afc8ecf416 100644
|
| --- a/mojo/public/dart/src/interface.dart
|
| +++ b/mojo/public/dart/src/interface.dart
|
| @@ -8,15 +8,18 @@ abstract class Interface {
|
| core.MojoMessagePipeEndpoint _endpoint;
|
| core.MojoHandle _handle;
|
| List _sendQueue;
|
| + bool _isOpen;
|
|
|
| - Message handleMessage(MessageReader reader, Function messageHandler);
|
| + Message handleMessage(MessageReader reader);
|
|
|
| Interface(this._endpoint) {
|
| _sendQueue = [];
|
| _handle = new core.MojoHandle(_endpoint.handle);
|
| + _isOpen = false;
|
| }
|
|
|
| - StreamSubscription<int> listen(Function messageHandler) {
|
| + StreamSubscription<int> listen() {
|
| + _isOpen = true;
|
| return _handle.listen((int mojoSignal) {
|
| if (core.MojoHandleSignals.isReadable(mojoSignal)) {
|
| // Query how many bytes are available.
|
| @@ -42,10 +45,10 @@ abstract class Interface {
|
| var reader = new MessageReader(message);
|
|
|
| // Prepare the response.
|
| - var response_message = handleMessage(reader, messageHandler);
|
| + var responseMessage = handleMessage(reader);
|
| // If there's a response, queue it up for sending.
|
| - if (response_message != null) {
|
| - _sendQueue.add(response_message);
|
| + if (responseMessage != null) {
|
| + _sendQueue.add(responseMessage);
|
| if ((_sendQueue.length > 0) && !_handle.writeEnabled()) {
|
| _handle.enableWriteEvents();
|
| }
|
| @@ -53,8 +56,10 @@ abstract class Interface {
|
| }
|
| if (core.MojoHandleSignals.isWritable(mojoSignal)) {
|
| if (_sendQueue.length > 0) {
|
| - var response_message = _sendQueue.removeAt(0);
|
| - _endpoint.write(response_message.buffer);
|
| + var responseMessage = _sendQueue.removeAt(0);
|
| + _endpoint.write(responseMessage.buffer,
|
| + responseMessage.buffer.lengthInBytes,
|
| + responseMessage.handles);
|
| if (!_endpoint.status.isOk) {
|
| throw new Exception("message pipe write failed");
|
| }
|
| @@ -77,10 +82,27 @@ abstract class Interface {
|
| return builder.finish();
|
| }
|
|
|
| - Message buildResponseWithID(Type t, int name, int id, Object response) {
|
| + Message buildResponseWithID(
|
| + Type t, int name, int id, int flags, Object response) {
|
| var builder = new MessageWithRequestIDBuilder(
|
| - name, align(getEncodedSize(t)), id);
|
| + name, align(getEncodedSize(t)), id, flags);
|
| builder.encodeStruct(t, response);
|
| return builder.finish();
|
| }
|
| +
|
| + void enqueueMessage(Type t, int name, Object msg) {
|
| + var builder = new MessageBuilder(name, align(getEncodedSize(t)));
|
| + builder.encodeStruct(t, msg);
|
| + var message = builder.finish();
|
| + _sendQueue.add(message);
|
| + if (!_handle.writeEnabled()) {
|
| + _handle.enableWriteEvents();
|
| + }
|
| + }
|
| +
|
| + Future enqueueMessageWithRequestID(Type t, int name, int id, Object msg) {
|
| + throw new Exception("The client Mixin should not expect a response");
|
| + }
|
| +
|
| + bool get isOpen => _isOpen;
|
| }
|
|
|