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

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

Issue 12316036: Merge IO v2 branch to bleeding edge (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased to r18818 Created 7 years, 10 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 | « sdk/lib/io/directory.dart ('k') | sdk/lib/io/file.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/directory_impl.dart
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index 59911ed87f7808a79f8aa5db39673e41b0963c9b..5963d8390af08d1886e1df67d758de47d3d4afef 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -226,65 +226,20 @@ class _Directory implements Directory {
return new Directory(newPath);
}
- DirectoryLister list({bool recursive: false}) {
- return new _DirectoryLister(_path, recursive);
- }
-
- List listSync({bool recursive: false}) {
- if (_path is! String || recursive is! bool) {
- throw new ArgumentError();
- }
- return _list(_path, recursive);
- }
-
- String get path => _path;
-
- String toString() => "Directory: '$path'";
-
- bool _isErrorResponse(response) {
- return response is List && response[0] != _SUCCESS_RESPONSE;
- }
-
- _exceptionOrErrorFromResponse(response, String message) {
- assert(_isErrorResponse(response));
- switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
- case _ILLEGAL_ARGUMENT_RESPONSE:
- return new ArgumentError();
- case _OSERROR_RESPONSE:
- var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
- response[_OSERROR_RESPONSE_ERROR_CODE]);
- return new DirectoryIOException(message, _path, err);
- default:
- return new Exception("Unknown error");
- }
- }
-
- void _ensureDirectoryService() {
- if (_directoryService == null) {
- _directoryService = _newServicePort();
- }
- }
-
- final String _path;
- SendPort _directoryService;
-}
-
-class _DirectoryLister implements DirectoryLister {
- _DirectoryLister(String path, bool recursive) {
- const int LIST_DIRECTORY = 0;
- const int LIST_FILE = 1;
+ Stream<FileSystemEntity> list({bool recursive: false}) {
+ const int LIST_FILE = 0;
+ const int LIST_DIRECTORY = 1;
const int LIST_ERROR = 2;
const int LIST_DONE = 3;
- final int RESPONSE_TYPE = 0;
- final int RESPONSE_PATH = 1;
- final int RESPONSE_COMPLETE = 1;
- final int RESPONSE_ERROR = 2;
+ const int RESPONSE_TYPE = 0;
+ const int RESPONSE_PATH = 1;
+ const int RESPONSE_COMPLETE = 1;
+ const int RESPONSE_ERROR = 2;
- List request = new List.fixedLength(3);
- request[0] = _Directory.LIST_REQUEST;
- request[1] = path;
- request[2] = recursive;
+ var controller = new StreamController<FileSystemEntity>();
+
+ List request = [ _Directory.LIST_REQUEST, path, recursive ];
ReceivePort responsePort = new ReceivePort();
// Use a separate directory service port for each listing as
// listing operations on the same directory can run in parallel.
@@ -292,21 +247,21 @@ class _DirectoryLister implements DirectoryLister {
responsePort.receive((message, replyTo) {
if (message is !List || message[RESPONSE_TYPE] is !int) {
responsePort.close();
- _reportError(new DirectoryIOException("Internal error"));
+ controller.signalError(new DirectoryIOException("Internal error"));
return;
}
switch (message[RESPONSE_TYPE]) {
- case LIST_DIRECTORY:
- if (_onDir != null) _onDir(message[RESPONSE_PATH]);
- break;
case LIST_FILE:
- if (_onFile != null) _onFile(message[RESPONSE_PATH]);
+ controller.add(new File(message[RESPONSE_PATH]));
+ break;
+ case LIST_DIRECTORY:
+ controller.add(new Directory(message[RESPONSE_PATH]));
break;
case LIST_ERROR:
var errorType =
message[RESPONSE_ERROR][_ERROR_RESPONSE_ERROR_TYPE];
if (errorType == _ILLEGAL_ARGUMENT_RESPONSE) {
- _reportError(new ArgumentError());
+ controller.signalError(new ArgumentError());
} else if (errorType == _OSERROR_RESPONSE) {
var responseError = message[RESPONSE_ERROR];
var err = new OSError(
@@ -314,47 +269,59 @@ class _DirectoryLister implements DirectoryLister {
responseError[_OSERROR_RESPONSE_ERROR_CODE]);
var errorPath = message[RESPONSE_PATH];
if (errorPath == null) errorPath = path;
- _reportError(new DirectoryIOException("Directory listing failed",
- errorPath,
- err));
+ controller.signalError(
+ new DirectoryIOException("Directory listing failed",
+ errorPath,
+ err));
} else {
- _reportError(new DirectoryIOException("Internal error"));
+ controller.signalError(new DirectoryIOException("Internal error"));
}
break;
case LIST_DONE:
responsePort.close();
- if (_onDone != null) _onDone(message[RESPONSE_COMPLETE]);
+ controller.close();
break;
}
});
- }
- void set onDir(void onDir(String dir)) {
- _onDir = onDir;
+ return controller.stream;
}
- void set onFile(void onFile(String file)) {
- _onFile = onFile;
+ List listSync({bool recursive: false}) {
+ if (_path is! String || recursive is! bool) {
+ throw new ArgumentError();
+ }
+ return _list(_path, recursive);
}
- void set onDone(void onDone(bool completed)) {
- _onDone = onDone;
+ String get path => _path;
+
+ String toString() => "Directory: '$path'";
+
+ bool _isErrorResponse(response) {
+ return response is List && response[0] != _SUCCESS_RESPONSE;
}
- void set onError(void onError(e)) {
- _onError = onError;
+ _exceptionOrErrorFromResponse(response, String message) {
+ assert(_isErrorResponse(response));
+ switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
+ case _ILLEGAL_ARGUMENT_RESPONSE:
+ return new ArgumentError();
+ case _OSERROR_RESPONSE:
+ var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
+ response[_OSERROR_RESPONSE_ERROR_CODE]);
+ return new DirectoryIOException(message, _path, err);
+ default:
+ return new Exception("Unknown error");
+ }
}
- void _reportError(e) {
- if (_onError != null) {
- _onError(e);
- } else {
- throw e;
+ void _ensureDirectoryService() {
+ if (_directoryService == null) {
+ _directoryService = _newServicePort();
}
}
- Function _onDir;
- Function _onFile;
- Function _onDone;
- Function _onError;
+ final String _path;
+ SendPort _directoryService;
}
« no previous file with comments | « sdk/lib/io/directory.dart ('k') | sdk/lib/io/file.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698