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

Unified Diff: sdk/lib/io/secure_socket.dart

Issue 11280162: Add onError to dart:io SecureSocket. Allow onConnect and outputStream to coexist on Socket and Sec… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix typo. Created 8 years, 1 month 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 | « runtime/bin/socket_patch.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/secure_socket.dart
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 9efbacb2e5d4f2c675ebca054ee976ef79a84ccf..b76efcae3987180a3cb664fd0370a64614fbe8a9 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -78,6 +78,7 @@ class _SecureSocket implements SecureSocket {
_socket.onConnect = _secureConnectHandler;
_socket.onData = _secureDataHandler;
_socket.onClosed = _secureCloseHandler;
+ _socket.onError = _secureErrorHandler;
_secureFilter.init();
_secureFilter.registerHandshakeCompleteCallback(_secureHandshakeCompleteHandler);
}
@@ -89,7 +90,7 @@ class _SecureSocket implements SecureSocket {
int get remotePort => _socket.remotePort;
void set onClosed(void callback()) {
- if (_inputStream != null) {
+ if (_inputStream != null && callback != null) {
throw new StreamException(
"Cannot set close handler when input stream is used");
}
@@ -101,10 +102,6 @@ class _SecureSocket implements SecureSocket {
}
void set onConnect(void callback()) {
- if (_outputStream != null) {
- throw new StreamException(
- "Cannot set connect handler when output stream is used");
- }
if (_status == CONNECTED || _status == CLOSED) {
throw new StreamException(
"Cannot set connect handler when already connected");
@@ -117,7 +114,7 @@ class _SecureSocket implements SecureSocket {
}
void set onData(void callback()) {
- if (_outputStream != null) {
+ if (_outputStream != null && callback != null) {
throw new StreamException(
"Cannot set data handler when input stream is used");
}
@@ -128,8 +125,12 @@ class _SecureSocket implements SecureSocket {
_socketDataHandler = callback;
}
+ void set onError(void callback(e)) {
+ _socketErrorHandler = callback;
+ }
+
void set onWrite(void callback()) {
- if (_outputStream != null) {
+ if (_outputStream != null && callback != null) {
throw new StreamException(
"Cannot set write handler when output stream is used");
}
@@ -155,9 +156,9 @@ class _SecureSocket implements SecureSocket {
OutputStream get outputStream {
if (_outputStream == null) {
- if (_socketConnectHandler != null || _socketWriteHandler != null) {
+ if (_socketWriteHandler != null) {
throw new StreamException(
- "Cannot get output stream when socket handlers are used");
+ "Cannot get output stream when socket write handler is used");
}
_outputStream = new _SocketOutputStream(this);
}
@@ -314,6 +315,35 @@ class _SecureSocket implements SecureSocket {
}
}
+ void _secureErrorHandler(e) {
+ _reportError(e, 'Error on underlying Socket');
+ }
+
+ void _reportError(error, String message) {
+ // TODO(whesse): Call _reportError from all internal functions that throw.
+ var e;
+ if (error is SocketIOException) {
+ e = new SocketIOException('$message (${error.message})', error.osError);
+ } else if (error is OSError) {
+ e = new SocketIOException(message, error);
+ } else {
+ e = new SocketIOException('$message (${error.toString()})', null);
+ }
+ bool reported = false;
+ if (_socketErrorHandler != null) {
+ reported = true;
+ _socketErrorHandler(e);
+ }
+ if (_inputStream != null) {
+ reported = reported || _inputStream._onSocketError(e);
+ }
+ if (_outputStream != null) {
+ reported = reported || _outputStream._onSocketError(e);
+ }
+
+ if (!reported) throw e;
+ }
+
void _secureCloseHandler() {
_socketClosedRead = true;
if (_filterReadEmpty) {
@@ -494,6 +524,7 @@ class _SecureSocket implements SecureSocket {
Function _socketConnectHandler;
Function _socketWriteHandler;
Function _socketDataHandler;
+ Function _socketErrorHandler;
Function _socketCloseHandler;
Timer scheduledDataEvent;
« no previous file with comments | « runtime/bin/socket_patch.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698