Files
sdk/runtime/bin/directory_impl.dart
T
dgrove@google.com 4c0f559d23 Initial checkin.
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@15 260f80e4-7a28-3924-810f-c04153c831b5
2011-10-05 05:20:07 +00:00

131 lines
3.3 KiB
Dart

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
class DirectoryException {
const DirectoryException(String this.message);
final String message;
}
class DirectoryImpl implements Directory {
DirectoryImpl.open(String 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;
}
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;
_list(_id,
recursive,
_dirHandler,
_fileHandler,
_doneHandler,
_dirErrorHandler);
}
// 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));
}
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));
}
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);
});
}
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);
});
}
// 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";
void _list(int id,
bool recursive,
ReceivePort dirHandler,
ReceivePort fileHandler,
ReceivePort doneHandler,
ReceivePort dirErrorHandler) native "Directory_List";
ReceivePort _dirHandler;
ReceivePort _fileHandler;
ReceivePort _doneHandler;
ReceivePort _dirErrorHandler;
int _id;
bool _closed;
bool _listing;
}