| Index: mojo/public/dart/mojo/lib/src/event_stream.dart
|
| diff --git a/mojo/public/dart/mojo/lib/src/event_stream.dart b/mojo/public/dart/mojo/lib/src/event_stream.dart
|
| deleted file mode 100644
|
| index ceb0e0ea0d5042b54cec6f03c9f05105caf56bec..0000000000000000000000000000000000000000
|
| --- a/mojo/public/dart/mojo/lib/src/event_stream.dart
|
| +++ /dev/null
|
| @@ -1,234 +0,0 @@
|
| -// 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 core;
|
| -
|
| -class MojoEventSubscription {
|
| - // The underlying Mojo handle.
|
| - MojoHandle _handle;
|
| -
|
| - // The send port that we give to the handle watcher to notify us of handle
|
| - // events.
|
| - SendPort _sendPort;
|
| -
|
| - // The receive port on which we listen and receive events from the handle
|
| - // watcher.
|
| - RawReceivePort _receivePort;
|
| -
|
| - // The signals on this handle that we're interested in.
|
| - MojoHandleSignals _signals;
|
| -
|
| - // Whether subscribe() has been called.
|
| - bool _isSubscribed;
|
| -
|
| - MojoEventSubscription(MojoHandle handle,
|
| - [MojoHandleSignals signals = MojoHandleSignals.PEER_CLOSED_READABLE])
|
| - : _handle = handle,
|
| - _signals = signals,
|
| - _isSubscribed = false {
|
| - MojoResult result = MojoHandle.registerFinalizer(this);
|
| - if (!result.isOk) {
|
| - throw new MojoInternalError(
|
| - "Failed to register the MojoHandle: $result.");
|
| - }
|
| - }
|
| -
|
| - Future close({bool immediate: false}) => _close(immediate: immediate);
|
| -
|
| - void subscribe(void handler(List<int> event)) {
|
| - if (_isSubscribed) {
|
| - throw new MojoApiError("subscribe() has already been called: $this.");
|
| - }
|
| - _receivePort = new RawReceivePort(handler);
|
| - _sendPort = _receivePort.sendPort;
|
| -
|
| - if (_signals != MojoHandleSignals.NONE) {
|
| - int res = MojoHandleWatcher.add(_handle.h, _sendPort, _signals.value);
|
| - if (res != MojoResult.kOk) {
|
| - throw new MojoInternalError("MojoHandleWatcher add failed: $res");
|
| - }
|
| - }
|
| -
|
| - _isSubscribed = true;
|
| - }
|
| -
|
| - bool enableSignals(MojoHandleSignals signals) {
|
| - _signals = signals;
|
| - if (_isSubscribed) {
|
| - return MojoHandleWatcher.add(_handle.h, _sendPort, signals.value) ==
|
| - MojoResult.kOk;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - bool enableReadEvents() =>
|
| - enableSignals(MojoHandleSignals.PEER_CLOSED_READABLE);
|
| - bool enableWriteEvents() => enableSignals(MojoHandleSignals.WRITABLE);
|
| - bool enableAllEvents() => enableSignals(MojoHandleSignals.READWRITE);
|
| -
|
| - Future _close({bool immediate: false, bool local: false}) {
|
| - if (_handle != null) {
|
| - if (_isSubscribed && !local) {
|
| - return _handleWatcherClose(immediate: immediate).then((result) {
|
| - // If the handle watcher is gone, then close the handle ourselves.
|
| - if (!result.isOk) {
|
| - _localClose();
|
| - }
|
| - });
|
| - } else {
|
| - _localClose();
|
| - }
|
| - }
|
| - return new Future.value(null);
|
| - }
|
| -
|
| - Future _handleWatcherClose({bool immediate: false}) {
|
| - assert(_handle != null);
|
| - MojoHandleNatives.removeOpenHandle(_handle.h);
|
| - return MojoHandleWatcher.close(_handle.h, wait: !immediate).then((r) {
|
| - if (_receivePort != null) {
|
| - _receivePort.close();
|
| - _receivePort = null;
|
| - }
|
| - return new MojoResult(r);
|
| - });
|
| - }
|
| -
|
| - void _localClose() {
|
| - _handle.close();
|
| - _handle = null;
|
| - if (_receivePort != null) {
|
| - _receivePort.close();
|
| - _receivePort = null;
|
| - }
|
| - }
|
| -
|
| - bool get readyRead => _handle.readyRead;
|
| - bool get readyWrite => _handle.readyWrite;
|
| - MojoHandleSignals get signals => _signals;
|
| -
|
| - String toString() => "$_handle";
|
| -}
|
| -
|
| -typedef void ErrorHandler(Object e);
|
| -
|
| -class MojoEventHandler {
|
| - ErrorHandler onError;
|
| -
|
| - MojoMessagePipeEndpoint _endpoint;
|
| - MojoEventSubscription _eventSubscription;
|
| - bool _isOpen = false;
|
| - bool _isInHandler = false;
|
| - bool _isPeerClosed = false;
|
| -
|
| - MojoEventHandler.fromEndpoint(MojoMessagePipeEndpoint endpoint)
|
| - : _endpoint = endpoint,
|
| - _eventSubscription = new MojoEventSubscription(endpoint.handle) {
|
| - beginHandlingEvents();
|
| - }
|
| -
|
| - MojoEventHandler.fromHandle(MojoHandle handle) {
|
| - _endpoint = new MojoMessagePipeEndpoint(handle);
|
| - _eventSubscription = new MojoEventSubscription(handle);
|
| - beginHandlingEvents();
|
| - }
|
| -
|
| - MojoEventHandler.unbound();
|
| -
|
| - void bind(MojoMessagePipeEndpoint endpoint) {
|
| - if (isBound) {
|
| - throw new MojoApiError("MojoEventStreamListener is already bound.");
|
| - }
|
| - _endpoint = endpoint;
|
| - _eventSubscription = new MojoEventSubscription(endpoint.handle);
|
| - _isOpen = false;
|
| - _isInHandler = false;
|
| - _isPeerClosed = false;
|
| - }
|
| -
|
| - void bindFromHandle(MojoHandle handle) {
|
| - if (isBound) {
|
| - throw new MojoApiError("MojoEventStreamListener is already bound.");
|
| - }
|
| - _endpoint = new MojoMessagePipeEndpoint(handle);
|
| - _eventSubscription = new MojoEventSubscription(handle);
|
| - _isOpen = false;
|
| - _isInHandler = false;
|
| - _isPeerClosed = false;
|
| - }
|
| -
|
| - void beginHandlingEvents() {
|
| - if (!isBound) {
|
| - throw new MojoApiError("MojoEventHandler is unbound.");
|
| - }
|
| - _isOpen = true;
|
| - _eventSubscription.subscribe((List<int> event) {
|
| - try {
|
| - _handleEvent(event);
|
| - } catch (e) {
|
| - close(immediate: true).then((_) {
|
| - if (onError != null) {
|
| - onError(e);
|
| - }
|
| - });
|
| - }
|
| - });
|
| - }
|
| -
|
| - Future close({bool immediate: false}) {
|
| - var result;
|
| - _isOpen = false;
|
| - _endpoint = null;
|
| - if (_eventSubscription != null) {
|
| - result = _eventSubscription
|
| - ._close(immediate: immediate, local: _isPeerClosed)
|
| - .then((_) {
|
| - _eventSubscription = null;
|
| - });
|
| - }
|
| - return result != null ? result : new Future.value(null);
|
| - }
|
| -
|
| - void _handleEvent(List<int> event) {
|
| - if (!_isOpen) {
|
| - // The actual close of the underlying stream happens asynchronously
|
| - // after the call to close. However, we start to ignore incoming events
|
| - // immediately.
|
| - return;
|
| - }
|
| - var signalsWatched = new MojoHandleSignals(event[0]);
|
| - var signalsReceived = new MojoHandleSignals(event[1]);
|
| - _isInHandler = true;
|
| - if (signalsReceived.isReadable) {
|
| - assert(_eventSubscription.readyRead);
|
| - handleRead();
|
| - }
|
| - if (signalsReceived.isWritable) {
|
| - assert(_eventSubscription.readyWrite);
|
| - handleWrite();
|
| - }
|
| - _isPeerClosed = signalsReceived.isPeerClosed ||
|
| - !_eventSubscription.enableSignals(signalsWatched);
|
| - _isInHandler = false;
|
| - if (_isPeerClosed) {
|
| - close().then((_) {
|
| - if (onError != null) {
|
| - onError(null);
|
| - }
|
| - });
|
| - }
|
| - }
|
| -
|
| - void handleRead() {}
|
| - void handleWrite() {}
|
| -
|
| - MojoMessagePipeEndpoint get endpoint => _endpoint;
|
| - bool get isOpen => _isOpen;
|
| - bool get isInHandler => _isInHandler;
|
| - bool get isBound => _endpoint != null;
|
| - bool get isPeerClosed => _isPeerClosed;
|
| -
|
| - String toString() => "MojoEventHandler("
|
| - "isOpen: $isOpen, isBound: $isBound, endpoint: $_endpoint)";
|
| -}
|
|
|