| Index: runtime/bin/directory_impl.dart
|
| diff --git a/runtime/bin/directory_impl.dart b/runtime/bin/directory_impl.dart
|
| index b5329350664d5be433b47b42d569ceb0ac884dec..8262e592f5f526b5655c209539b7a863f3607107 100644
|
| --- a/runtime/bin/directory_impl.dart
|
| +++ b/runtime/bin/directory_impl.dart
|
| @@ -24,18 +24,21 @@ class _Directory implements Directory {
|
| static _delete(String path, bool recursive) native "Directory_Delete";
|
| static SendPort _newServicePort() native "Directory_NewServicePort";
|
|
|
| - void exists(void callback(bool exists)) {
|
| + Future<bool> exists() {
|
| _ensureDirectoryService();
|
| + Completer<bool> completer = new Completer<bool>();
|
| List request = new List(2);
|
| request[0] = kExistsRequest;
|
| request[1] = _path;
|
| _directoryService.call(request).then((response) {
|
| if (_isErrorResponse(response)) {
|
| - _handleErrorResponse(response, "Exists failed");
|
| + var e = _exceptionFromResponse(response, "Exists failed");
|
| + completer.completeException(e);
|
| } else {
|
| - callback(response == 1);
|
| + completer.complete(response == 1);
|
| }
|
| });
|
| + return completer.future;
|
| }
|
|
|
| bool existsSync() {
|
| @@ -49,18 +52,21 @@ class _Directory implements Directory {
|
| return (result == 1);
|
| }
|
|
|
| - void create(void callback()) {
|
| + Future<Directory> create() {
|
| _ensureDirectoryService();
|
| + Completer<Directory> completer = new Completer<Directory>();
|
| List request = new List(2);
|
| request[0] = kCreateRequest;
|
| request[1] = _path;
|
| _directoryService.call(request).then((response) {
|
| if (_isErrorResponse(response)) {
|
| - _handleErrorResponse(response, "Creation failed");
|
| + var e = _exceptionFromResponse(response, "Creation failed");
|
| + completer.completeException(e);
|
| } else {
|
| - callback();
|
| + completer.complete(this);
|
| }
|
| });
|
| + return completer.future;
|
| }
|
|
|
| void createSync() {
|
| @@ -73,19 +79,23 @@ class _Directory implements Directory {
|
| }
|
| }
|
|
|
| - void createTemp(void callback()) {
|
| + Future<Directory> createTemp() {
|
| _ensureDirectoryService();
|
| + Completer<Directory> completer = new Completer<Directory>();
|
| List request = new List(2);
|
| request[0] = kCreateTempRequest;
|
| request[1] = _path;
|
| _directoryService.call(request).then((response) {
|
| if (_isErrorResponse(response)) {
|
| - _handleErrorResponse(response, "Creation of temporary directory failed");
|
| + var e =
|
| + _exceptionFromResponse(response,
|
| + "Creation of temporary directory failed");
|
| + completer.completeException(e);
|
| } else {
|
| - _path = response;
|
| - callback();
|
| + completer.complete(new Directory(response));
|
| }
|
| });
|
| + return completer.future;
|
| }
|
|
|
| void createTempSync() {
|
| @@ -98,30 +108,33 @@ class _Directory implements Directory {
|
| _path,
|
| result);
|
| }
|
| - _path = result;
|
| + return new Directory(result);
|
| }
|
|
|
| - void _deleteHelper(bool recursive, String errorMsg, void callback()) {
|
| + Future<Directory> _deleteHelper(bool recursive, String errorMsg) {
|
| _ensureDirectoryService();
|
| + Completer<Directory> completer = new Completer<Directory>();
|
| List request = new List(3);
|
| request[0] = kDeleteRequest;
|
| request[1] = _path;
|
| request[2] = recursive;
|
| _directoryService.call(request).then((response) {
|
| if (_isErrorResponse(response)) {
|
| - _handleErrorResponse(response, errorMsg);
|
| + var e = _exceptionFromResponse(response, errorMsg);
|
| + completer.completeException(e);
|
| } else {
|
| - callback();
|
| + completer.complete(this);
|
| }
|
| });
|
| + return completer.future;
|
| }
|
|
|
| - void delete(void callback()) {
|
| - _deleteHelper(false, "Deletion failed", callback);
|
| + Future<Directory> delete() {
|
| + return _deleteHelper(false, "Deletion failed");
|
| }
|
|
|
| - void deleteRecursively(void callback()) {
|
| - _deleteHelper(true, "Deletion failed", callback);
|
| + Future<Directory> deleteRecursively() {
|
| + return _deleteHelper(true, "Deletion failed");
|
| }
|
|
|
| void deleteSync() {
|
| @@ -144,7 +157,42 @@ class _Directory implements Directory {
|
| }
|
| }
|
|
|
| - void list([bool recursive = false]) {
|
| + DirectoryLister list([bool recursive = false]) {
|
| + return new _DirectoryLister(_path, recursive);
|
| + }
|
| +
|
| + String get path() { return _path; }
|
| +
|
| + bool _isErrorResponse(response) {
|
| + return response is List && response[0] != _FileUtils.kSuccessResponse;
|
| + }
|
| +
|
| + Exception _exceptionFromResponse(response, String message) {
|
| + assert(_isErrorResponse(response));
|
| + switch (response[_FileUtils.kErrorResponseErrorType]) {
|
| + case _FileUtils.kIllegalArgumentResponse:
|
| + return new IllegalArgumentException();
|
| + case _FileUtils.kOSErrorResponse:
|
| + var err = new OSError(response[_FileUtils.kOSErrorResponseMessage],
|
| + response[_FileUtils.kOSErrorResponseErrorCode]);
|
| + 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) {
|
| final int kListDirectory = 0;
|
| final int kListFile = 1;
|
| final int kListError = 2;
|
| @@ -156,13 +204,13 @@ class _Directory implements Directory {
|
| final int kResponseError = 2;
|
|
|
| List request = new List(3);
|
| - request[0] = kListRequest;
|
| - request[1] = _path;
|
| + request[0] = _Directory.kListRequest;
|
| + request[1] = path;
|
| request[2] = 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.
|
| - _newServicePort().send(request, responsePort.toSendPort());
|
| + _Directory._newServicePort().send(request, responsePort.toSendPort());
|
| responsePort.receive((message, replyTo) {
|
| if (message is !List || message[kResponseType] is !int) {
|
| responsePort.close();
|
| @@ -216,14 +264,6 @@ class _Directory implements Directory {
|
| _onError = onError;
|
| }
|
|
|
| - String get path() { return _path; }
|
| -
|
| - void _ensureDirectoryService() {
|
| - if (_directoryService == null) {
|
| - _directoryService = _newServicePort();
|
| - }
|
| - }
|
| -
|
| void _reportError(e) {
|
| if (_onError != null) {
|
| _onError(e);
|
| @@ -232,32 +272,8 @@ class _Directory implements Directory {
|
| }
|
| }
|
|
|
| - bool _isErrorResponse(response) {
|
| - return response is List && response[0] != _FileUtils.kSuccessResponse;
|
| - }
|
| -
|
| - void _handleErrorResponse(response, String message) {
|
| - assert(_isErrorResponse(response));
|
| - switch (response[_FileUtils.kErrorResponseErrorType]) {
|
| - case _FileUtils.kIllegalArgumentResponse:
|
| - _reportError(new IllegalArgumentException());
|
| - break;
|
| - case _FileUtils.kOSErrorResponse:
|
| - var err = new OSError(response[_FileUtils.kOSErrorResponseMessage],
|
| - response[_FileUtils.kOSErrorResponseErrorCode]);
|
| - _reportError(new DirectoryIOException(message, _path, err));
|
| - break;
|
| - default:
|
| - _reportError(new Exception("Unknown error"));
|
| - break;
|
| - }
|
| - }
|
| -
|
| Function _onDir;
|
| Function _onFile;
|
| Function _onDone;
|
| Function _onError;
|
| -
|
| - String _path;
|
| - SendPort _directoryService;
|
| }
|
|
|