| Index: runtime/bin/directory_impl.dart
|
| diff --git a/runtime/bin/directory_impl.dart b/runtime/bin/directory_impl.dart
|
| index e36a4182d2301a37e2f0ce69231f24a89c389915..d9330a1f22b2cec0fe5099c59e9c2685590a302c 100644
|
| --- a/runtime/bin/directory_impl.dart
|
| +++ b/runtime/bin/directory_impl.dart
|
| @@ -10,14 +10,18 @@ class _Directory implements Directory {
|
| static final kCreateTempRequest = 3;
|
| static final kListRequest = 4;
|
|
|
| + static final kSuccessResponse = 0;
|
| + static final kIllegalArgumentResponse = 1;
|
| + static final kOSErrorResponse = 2;
|
| +
|
| _Directory(String this._path);
|
| _Directory.current() : _path = _current();
|
|
|
| static String _current() native "Directory_Current";
|
| static _createTemp(String template) native "Directory_CreateTemp";
|
| static int _exists(String path) native "Directory_Exists";
|
| - static bool _create(String path) native "Directory_Create";
|
| - static bool _delete(String path, bool recursive) native "Directory_Delete";
|
| + static _create(String path) native "Directory_Create";
|
| + static _delete(String path, bool recursive) native "Directory_Delete";
|
| static SendPort _newServicePort() native "Directory_NewServicePort";
|
|
|
| void exists(void callback(bool exists)) {
|
| @@ -25,23 +29,24 @@ class _Directory implements Directory {
|
| List request = new List(2);
|
| request[0] = kExistsRequest;
|
| request[1] = _path;
|
| - _directoryService.call(request).then((result) {
|
| - if (result < 0) {
|
| - if (_onError != null) {
|
| - _onError("Diretory exists test failed: $_path");
|
| - }
|
| + _directoryService.call(request).then((response) {
|
| + if (_isErrorResponse(response)) {
|
| + _reportError(response, "Exists failed");
|
| } else {
|
| - callback(result == 1);
|
| + callback(response == 1);
|
| }
|
| });
|
| }
|
|
|
| bool existsSync() {
|
| - int exists = _exists(_path);
|
| - if (exists < 0) {
|
| - throw new DirectoryIOException("Diretory exists test failed: $_path");
|
| + if (_path is !String) {
|
| + throw new IllegalArgumentException();
|
| }
|
| - return (exists == 1);
|
| + var result = _exists(_path);
|
| + if (result is OSError) {
|
| + throw new DirectoryIOException("Exists failed", _path, result);
|
| + }
|
| + return (result == 1);
|
| }
|
|
|
| void create(void callback()) {
|
| @@ -49,18 +54,22 @@ class _Directory implements Directory {
|
| List request = new List(2);
|
| request[0] = kCreateRequest;
|
| request[1] = _path;
|
| - _directoryService.call(request).then((result) {
|
| - if (result) {
|
| + _directoryService.call(request).then((response) {
|
| + if (_isErrorResponse(response)) {
|
| + _reportError(response, "Creation failed");
|
| + } else {
|
| callback();
|
| - } else if (_onError != null) {
|
| - _onError("Directory creation failed: $_path");
|
| }
|
| });
|
| }
|
|
|
| void createSync() {
|
| - if (!_create(_path)) {
|
| - throw new DirectoryIOException("Directory creation failed: $_path");
|
| + if (_path is !String) {
|
| + throw new IllegalArgumentException();
|
| + }
|
| + var result = _create(_path);
|
| + if (result is OSError) {
|
| + throw new DirectoryIOException("Creation failed", _path, result);
|
| }
|
| }
|
|
|
| @@ -69,12 +78,12 @@ class _Directory implements Directory {
|
| List request = new List(2);
|
| request[0] = kCreateTempRequest;
|
| request[1] = _path;
|
| - _directoryService.call(request).then((result) {
|
| - if (result is !List) {
|
| - _path = result;
|
| + _directoryService.call(request).then((response) {
|
| + if (_isErrorResponse(response)) {
|
| + _reportError(response, "Creation of temporary directory failed");
|
| + } else {
|
| + _path = response;
|
| callback();
|
| - } else if (_onError != null) {
|
| - _onError("Could not create temporary directory [$_path]: ${result[1]}");
|
| }
|
| });
|
| }
|
| @@ -85,7 +94,8 @@ class _Directory implements Directory {
|
| }
|
| var result = _createTemp(path);
|
| if (result is OSError) {
|
| - throw new DirectoryIOException("Could not create temporary directory",
|
| + throw new DirectoryIOException("Creation of temporary directory failed",
|
| + _path,
|
| result);
|
| }
|
| _path = result;
|
| @@ -97,35 +107,40 @@ class _Directory implements Directory {
|
| request[0] = kDeleteRequest;
|
| request[1] = _path;
|
| request[2] = recursive;
|
| - _directoryService.call(request).then((result) {
|
| - if (result) {
|
| + _directoryService.call(request).then((response) {
|
| + if (_isErrorResponse(response)) {
|
| + _reportError(response, errorMsg);
|
| + } else {
|
| callback();
|
| - } else if (_onError != null) {
|
| - _onError("${errorMsg}: $_path");
|
| }
|
| });
|
| }
|
|
|
| void delete(void callback()) {
|
| - _deleteHelper(false, "Directory deletion failed", callback);
|
| + _deleteHelper(false, "Deletion failed", callback);
|
| }
|
|
|
| void deleteRecursively(void callback()) {
|
| - _deleteHelper(true, "Recursive directory deletion failed", callback);
|
| + _deleteHelper(true, "Deletion failed", callback);
|
| }
|
|
|
| void deleteSync() {
|
| - bool recursive = false;
|
| - if (!_delete(_path, recursive)) {
|
| - throw new DirectoryIOException("Directory deletion failed: $_path");
|
| + if (_path is !String) {
|
| + throw new IllegalArgumentException();
|
| + }
|
| + var result = _delete(_path, false);
|
| + if (result is OSError) {
|
| + throw new DirectoryIOException("Deletion failed", _path, result);
|
| }
|
| }
|
|
|
| void deleteRecursivelySync() {
|
| - bool recursive = true;
|
| - if (!_delete(_path, recursive)) {
|
| - throw new DirectoryIOException(
|
| - "Recursive directory deletion failed: $_path");
|
| + if (_path is !String) {
|
| + throw new IllegalArgumentException();
|
| + }
|
| + var result = _delete(_path, true);
|
| + if (result is OSError) {
|
| + throw new DirectoryIOException("Deletion failed", _path, result);
|
| }
|
| }
|
|
|
| @@ -135,6 +150,11 @@ class _Directory implements Directory {
|
| final int kListError = 2;
|
| final int kListDone = 3;
|
|
|
| + final int kResponseType = 0;
|
| + final int kResponsePath = 1;
|
| + final int kResponseComplete = 1;
|
| + final int kResponseError = 2;
|
| +
|
| List request = new List(3);
|
| request[0] = kListRequest;
|
| request[1] = _path;
|
| @@ -144,24 +164,41 @@ class _Directory implements Directory {
|
| // listing operations on the same directory can run in parallel.
|
| _newServicePort().send(request, responsePort.toSendPort());
|
| responsePort.receive((message, replyTo) {
|
| - if (message is !List || message[0] is !int) {
|
| + if (message is !List || message[kResponseType] is !int) {
|
| responsePort.close();
|
| - if (_onError != null) _onError("Internal error");
|
| + if (_onError != null) {
|
| + _onError(new DirectoryIOException("Internal error"));
|
| + }
|
| return;
|
| }
|
| - switch (message[0]) {
|
| + switch (message[kResponseType]) {
|
| case kListDirectory:
|
| - if (_onDir != null) _onDir(message[1]);
|
| + if (_onDir != null) _onDir(message[kResponsePath]);
|
| break;
|
| case kListFile:
|
| - if (_onFile != null) _onFile(message[1]);
|
| + if (_onFile != null) _onFile(message[kResponsePath]);
|
| break;
|
| case kListError:
|
| - if (_onError != null) _onError(message[1]);
|
| + if (_onError != null) {
|
| + var errorType =
|
| + message[kResponseError][_FileUtils.kErrorResponseErrorType];
|
| + if (errorType == _FileUtils.kIllegalArgumentResponse) {
|
| + _onError(new IllegalArgumentException());
|
| + } else if (errorType == _FileUtils.kOSErrorResponse) {
|
| + var err = new OSError(
|
| + message[kResponseError][_FileUtils.kOSErrorResponseErrorCode],
|
| + message[kResponseError][_FileUtils.kOSErrorResponseMessage]);
|
| + _onError(new DirectoryIOException("Directory listing failed",
|
| + message[kResponsePath],
|
| + err));
|
| + } else {
|
| + _onError(new DirectoryIOException("Internal error"));
|
| + }
|
| + }
|
| break;
|
| case kListDone:
|
| responsePort.close();
|
| - if (_onDone != null) _onDone(message[1]);
|
| + if (_onDone != null) _onDone(message[kResponseComplete]);
|
| break;
|
| }
|
| });
|
| @@ -179,7 +216,7 @@ class _Directory implements Directory {
|
| _onDone = onDone;
|
| }
|
|
|
| - void set onError(void onError(String error)) {
|
| + void set onError(void onError(Exception e)) {
|
| _onError = onError;
|
| }
|
|
|
| @@ -191,10 +228,33 @@ class _Directory implements Directory {
|
| }
|
| }
|
|
|
| - var _onDir;
|
| - var _onFile;
|
| - var _onDone;
|
| - var _onError;
|
| + bool _isErrorResponse(response) {
|
| + return response is List && response[0] != _FileUtils.kSuccessResponse;
|
| + }
|
| +
|
| + bool _reportError(response, String message) {
|
| + assert(_isErrorResponse(response));
|
| + if (_onError != null) {
|
| + switch (response[_FileUtils.kErrorResponseErrorType]) {
|
| + case _FileUtils.kIllegalArgumentResponse:
|
| + _onError(new IllegalArgumentException());
|
| + break;
|
| + case _FileUtils.kOSErrorResponse:
|
| + var err = new OSError(response[_FileUtils.kOSErrorResponseErrorCode],
|
| + response[_FileUtils.kOSErrorResponseMessage]);
|
| + _onError(new DirectoryIOException(message, _path, err));
|
| + break;
|
| + default:
|
| + _onError(new Exception("Unknown error"));
|
| + break;
|
| + }
|
| + }
|
| + }
|
| +
|
| + Function _onDir;
|
| + Function _onFile;
|
| + Function _onDone;
|
| + Function _onError;
|
|
|
| String _path;
|
| SendPort _directoryService;
|
|
|