Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(728)

Unified Diff: mojo/dart/packages/mojo/lib/src/event_handler.dart

Issue 1964193002: Dart: Refactors Proxies (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Address comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/dart/packages/mojo/lib/src/codec.dart ('k') | mojo/dart/packages/mojo/lib/src/event_stream.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/dart/packages/mojo/lib/src/event_handler.dart
diff --git a/mojo/dart/packages/mojo/lib/src/event_stream.dart b/mojo/dart/packages/mojo/lib/src/event_handler.dart
similarity index 61%
rename from mojo/dart/packages/mojo/lib/src/event_stream.dart
rename to mojo/dart/packages/mojo/lib/src/event_handler.dart
index ea3e5f513319dc1e91491e538736f8f29edf688f..cbdefa3c62088d44d6f1f13468ef9e64f75852ec 100644
--- a/mojo/dart/packages/mojo/lib/src/event_stream.dart
+++ b/mojo/dart/packages/mojo/lib/src/event_handler.dart
@@ -1,148 +1,24 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// Copyright 2016 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.
- int _signals;
-
- // Whether subscribe() has been called.
- bool _isSubscribed;
-
- MojoEventSubscription(MojoHandle handle,
- [int signals = MojoHandleSignals.kPeerClosedReadable])
- : _handle = handle,
- _signals = signals,
- _isSubscribed = false {
- if (!MojoHandle.registerFinalizer(this)) {
- throw new MojoInternalError("Failed to register the MojoHandle.");
- }
- }
-
- Future close({bool immediate: false}) => _close(immediate: immediate);
-
- void subscribe(void handler(int event)) {
- if (_isSubscribed) {
- throw new MojoApiError("Already subscribed: $this.");
- }
- _receivePort = new RawReceivePort(handler);
- _sendPort = _receivePort.sendPort;
-
- if (_signals != MojoHandleSignals.kNone) {
- int res = MojoHandleWatcher.add(_handle.h, _sendPort, _signals);
- if (res != MojoResult.kOk) {
- throw new MojoInternalError("MojoHandleWatcher add failed: $res");
- }
- }
- _isSubscribed = true;
- }
-
- bool enableSignals([int signals]) {
- if (signals != null) {
- _signals = signals;
- }
- if (_isSubscribed) {
- return MojoHandleWatcher.add(_handle.h, _sendPort, _signals) ==
- MojoResult.kOk;
- }
- return false;
- }
-
- bool enableReadEvents() =>
- enableSignals(MojoHandleSignals.kPeerClosedReadable);
- bool enableWriteEvents() => enableSignals(MojoHandleSignals.kWritable);
- bool enableAllEvents() => enableSignals(MojoHandleSignals.kReadWrite);
-
- /// End the subscription by removing the handle from the handle watcher and
- /// closing the Dart port, but do not close the underlying handle. The handle
- /// can then be reused, or closed at a later time.
- void unsubscribe({bool immediate: false}) {
- if ((_handle == null) || !_isSubscribed || (_receivePort == null)) {
- throw new MojoApiError("Cannont unsubscribe from a MojoEventSubscription "
- "that has not been subscribed to");
- }
- MojoHandleWatcher.remove(_handle.h);
- _receivePort.close();
- _receivePort = null;
- _sendPort = null;
- _isSubscribed = false;
- }
-
- 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 != MojoResult.kOk) {
- _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 r;
- });
- }
-
- void _localClose() {
- if (_handle != null) {
- _handle.close();
- _handle = null;
- }
- if (_receivePort != null) {
- _receivePort.close();
- _receivePort = null;
- }
- }
-
- bool get readyRead => _handle.readyRead;
- bool get readyWrite => _handle.readyWrite;
- int get signals => _signals;
-
- String toString() => "$_handle";
-}
-
-/// Object returned to pipe's error handlers containing both the thrown error
-/// and the associated stack trace.
-class MojoHandlerError {
+/// The object passed to the handler's error handling function containing both
+/// the thrown error and the associated stack trace.
+class MojoEventHandlerError {
final Object error;
final StackTrace stacktrace;
- MojoHandlerError(this.error, this.stacktrace);
+ MojoEventHandlerError(this.error, this.stacktrace);
+ @override
String toString() => error.toString();
}
-typedef void ErrorHandler(MojoHandlerError e);
+typedef void ErrorHandler(MojoEventHandlerError e);
class MojoEventHandler {
- ErrorHandler onError;
-
MojoMessagePipeEndpoint _endpoint;
MojoEventSubscription _eventSubscription;
bool _isOpen = false;
@@ -168,6 +44,29 @@ class MojoEventHandler {
MojoEventHandler.unbound();
+ /// The event handler calls the [handleRead] method when the underlying Mojo
+ /// message pipe endpoint has a message available to be read. Implementers
+ /// should read, decode, and handle the message. If [handleRead] throws
+ /// an exception derived from [Error], the exception will be thrown into the
+ /// root zone, and the application will end. Otherwise, the exception object
+ /// will be passed to [onError] if it has been set, and the exception will
+ /// not be propagated to the root zone.
+ void handleRead() {}
+
+ /// Like [handleRead] but indicating that the underlying message pipe endpoint
+ /// is ready for writing.
+ void handleWrite() {}
+
+ /// Called when [handleRead] or [handleWrite] throw an exception generated by
+ /// Mojo library code. Other exceptions will be re-thrown.
+ ErrorHandler onError;
+
+ MojoMessagePipeEndpoint get endpoint => _endpoint;
+ bool get isOpen => _isOpen;
+ bool get isInHandler => _isInHandler;
+ bool get isBound => _endpoint != null;
+ bool get isPeerClosed => _isPeerClosed;
+
void bind(MojoMessagePipeEndpoint endpoint) {
if (isBound) {
throw new MojoApiError("MojoEventHandler is already bound.");
@@ -252,6 +151,10 @@ class MojoEventHandler {
return result != null ? result : new Future.value(null);
}
+ @override
+ String toString() => "MojoEventHandler("
+ "isOpen: $_isOpen, isBound: $isBound, endpoint: $_endpoint)";
+
void _tryHandleEvent(int event) {
// This callback is running in the handler for a RawReceivePort. All
// exceptions rethrown or not caught here will be unhandled exceptions in
@@ -271,7 +174,7 @@ class MojoEventHandler {
} catch (e, s) {
close(immediate: true).then((_) {
if (onError != null) {
- onError(new MojoHandlerError(e, s));
+ onError(new MojoEventHandlerError(e, s));
}
});
}
@@ -302,26 +205,4 @@ class MojoEventHandler {
});
}
}
-
- /// The event handler calls the [handleRead] method when the underlying Mojo
- /// message pipe endpoint has a message available to be read. Implementers
- /// should read, decode, and handle the message. If [handleRead] throws
- /// an exception derived from [Error], the exception will be thrown into the
- /// root zone, and the application will end. Otherwise, the exception object
- /// will be passed to [onError] if it has been set, and the exception will
- /// not be propagated to the root zone.
- void handleRead() {}
-
- /// Like [handleRead] but indicating that the underlying message pipe endpoint
- /// is ready for writing.
- 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)";
}
« no previous file with comments | « mojo/dart/packages/mojo/lib/src/codec.dart ('k') | mojo/dart/packages/mojo/lib/src/event_stream.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698