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

Unified Diff: runtime/bin/directory_impl.dart

Issue 8244001: Clean up directory listing interface. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 9 years, 2 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
Index: runtime/bin/directory_impl.dart
diff --git a/runtime/bin/directory_impl.dart b/runtime/bin/directory_impl.dart
index 489242c367aafae0eeb09adc76ee1f1cbe590d2a..e334c0971b043388ee805c9ec7c15bcfcde8395b 100644
--- a/runtime/bin/directory_impl.dart
+++ b/runtime/bin/directory_impl.dart
@@ -16,142 +16,112 @@ class _DirectoryListingIsolate extends Isolate {
void main() {
port.receive((message, replyTo) {
_list(message['dir'],
- message['id'],
message['recursive'],
- message['dirHandler'],
- message['fileHandler'],
- message['doneHandler'],
- message['dirErrorHandler']);
+ message['dirPort'],
+ message['filePort'],
+ message['donePort'],
+ message['errorPort']);
+ replyTo.send(true);
});
}
void _list(String dir,
- int id,
bool recursive,
- SendPort dirHandler,
- SendPort fileHandler,
- SendPort doneHandler,
- SendPort dirErrorHandler) native "Directory_List";
+ SendPort dirPort,
+ SendPort filePort,
+ SendPort donePort,
+ SendPort errorPort) native "Directory_List";
}
class _Directory implements Directory {
- _Directory.open(String this._dir) {
- _id = 0;
- _closed = false;
- _listing = false;
- if (!_open(_dir)) {
- _closed = true;
- throw new DirectoryException("Error: could not open directory");
- }
- }
-
- bool close() {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_close(_id)) {
- _closePort(_dirHandler);
- _closePort(_fileHandler);
- _closePort(_doneHandler);
- _closePort(_dirErrorHandler);
- _closed = true;
- bool was_listing = _listing;
- _listing = false;
- if (was_listing && _doneHandler !== null) {
- _doneHandler(false);
- }
- return true;
- }
- return false;
- }
+ _Directory(String this._dir);
void list([bool recursive = false]) {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_listing) {
- throw new DirectoryException("Error: listing already in progress");
- }
- _listing = true;
new _DirectoryListingIsolate().spawn().then((port) {
+ // Build a map of parameters to the directory listing isolate.
+ Map listingParameters = new Map();
+ listingParameters['dir'] = _dir;
+ listingParameters['recursive'] = recursive;
+
+ // Setup ports to receive messages from listing.
// TODO(ager): Do not explicitly transform to send ports when
- // that is done automatically.
- port.send({ 'dir': _dir,
- 'id': _id,
- 'recursive': recursive,
- 'dirHandler': _dirHandler.toSendPort(),
- 'fileHandler': _fileHandler.toSendPort(),
- 'doneHandler': _doneHandler.toSendPort(),
- 'dirErrorHandler': _dirErrorHandler.toSendPort() });
+ // implicit conversions are implemented.
+ ReceivePort dirPort;
+ ReceivePort filePort;
+ ReceivePort donePort;
+ ReceivePort errorPort;
+ if (_dirHandler !== null) {
+ dirPort = new ReceivePort();
+ dirPort.receive((String dir, ignored) {
+ _dirHandler(dir);
+ });
+ listingParameters['dirPort'] = dirPort.toSendPort();
+ }
+ if (_fileHandler !== null) {
+ filePort = new ReceivePort();
+ filePort.receive((String file, ignored) {
+ _fileHandler(file);
+ });
+ listingParameters['filePort'] = filePort.toSendPort();
+ }
+ if (_doneHandler !== null) {
+ donePort = new ReceivePort();
+ donePort.receive((bool completed, ignored) {
+ _doneHandler(completed);
+ });
+ listingParameters['donePort'] = donePort.toSendPort();
+ }
+ if (_errorHandler !== null) {
+ errorPort = new ReceivePort();
+ errorPort.receive((String error, ignored) {
+ _errorHandler(error);
+ });
+ listingParameters['errorPort'] = errorPort.toSendPort();
+ }
+
+ // Close ports when listing is done.
+ ReceivePort closePortsPort = new ReceivePort();
+ closePortsPort.receive((message, replyTo) {
+ _closePort(dirPort);
+ _closePort(filePort);
+ _closePort(donePort);
+ _closePort(errorPort);
+ _closePort(closePortsPort);
+ });
+
+ // Send the listing parameters to the isolate.
+ port.send(listingParameters, closePortsPort.toSendPort());
});
}
- // TODO(ager): Implement setting of the handlers as in the process library.
void setDirHandler(void dirHandler(String dir)) {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_dirHandler === null) {
- _dirHandler = new ReceivePort();
- }
- _dirHandler.receive((String dir, ignored) => dirHandler(dir));
+ _dirHandler = dirHandler;
}
void setFileHandler(void fileHandler(String file)) {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_fileHandler === null) {
- _fileHandler = new ReceivePort();
- }
- _fileHandler.receive((String file, ignored) => fileHandler(file));
+ _fileHandler = fileHandler;
}
void setDoneHandler(void doneHandler(bool completed)) {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_doneHandler === null) {
- _doneHandler = new ReceivePort();
- }
- _doneHandler.receive((bool completed, ignored) {
- _listing = false;
- doneHandler(completed);
- });
+ _doneHandler = doneHandler;
}
- void setDirErrorHandler(void errorHandler(String dir)) {
- if (_closed) {
- throw new DirectoryException("Error: directory closed");
- }
- if (_dirErrorHandler === null) {
- _dirErrorHandler = new ReceivePort();
- }
- _dirErrorHandler.receive((String dir, ignored) {
- errorHandler(dir, completed);
- });
+ void setErrorHandler(void errorHandler(String error)) {
+ _errorHandler = errorHandler;
}
- // Utility methods.
void _closePort(ReceivePort port) {
if (port !== null) {
port.close();
}
}
- // Native code binding.
- bool _open(String dir) native "Directory_Open";
- bool _close(int id) native "Directory_Close";
-
- ReceivePort _dirHandler;
- ReceivePort _fileHandler;
- ReceivePort _doneHandler;
- ReceivePort _dirErrorHandler;
+ var _dirHandler;
+ var _fileHandler;
+ var _doneHandler;
+ var _errorHandler;
String _dir;
- int _id;
- bool _closed;
- bool _listing;
}

Powered by Google App Engine
This is Rietveld 408576698