| Index: runtime/bin/directory_win.cc
|
| diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
|
| index f8af2133edbcf42b088e2a88ae00acc5962aea1b..4e5086fec3318f0c4d9735321946909ad677fdd6 100644
|
| --- a/runtime/bin/directory_win.cc
|
| +++ b/runtime/bin/directory_win.cc
|
| @@ -4,21 +4,44 @@
|
|
|
| #include "bin/directory.h"
|
|
|
| -static void HandleDir(char* dir_name,
|
| +// Forward declaration.
|
| +static bool ListRecursively(const char* dir_name,
|
| + bool recursive,
|
| + Dart_Port dir_port,
|
| + Dart_Port file_port,
|
| + Dart_Port done_port,
|
| + Dart_Port error_port);
|
| +
|
| +
|
| +static bool HandleDir(char* dir_name,
|
| char* path,
|
| int path_length,
|
| - Dart_Port dir_port) {
|
| - if (dir_port != 0 &&
|
| - strcmp(dir_name, ".") != 0 &&
|
| + bool recursive,
|
| + Dart_Port dir_port,
|
| + Dart_Port file_port,
|
| + Dart_Port done_port,
|
| + Dart_Port error_port) {
|
| + if (strcmp(dir_name, ".") != 0 &&
|
| strcmp(dir_name, "..") != 0) {
|
| size_t written = snprintf(path + path_length,
|
| MAX_PATH - path_length,
|
| "%s",
|
| dir_name);
|
| ASSERT(written == strlen(dir_name));
|
| - Dart_Handle name = Dart_NewString(path);
|
| - Dart_Post(dir_port, name);
|
| + if (dir_port != 0) {
|
| + Dart_Handle name = Dart_NewString(path);
|
| + Dart_Post(dir_port, name);
|
| + }
|
| + if (recursive) {
|
| + return ListRecursively(path,
|
| + recursive,
|
| + dir_port,
|
| + file_port,
|
| + done_port,
|
| + error_port);
|
| + }
|
| }
|
| + return true;
|
| }
|
|
|
|
|
| @@ -38,16 +61,27 @@ static void HandleFile(char* file_name,
|
| }
|
|
|
|
|
| -static void HandleEntry(LPWIN32_FIND_DATA find_file_data,
|
| +static bool HandleEntry(LPWIN32_FIND_DATA find_file_data,
|
| char* path,
|
| int path_length,
|
| + bool recursive,
|
| + Dart_Port dir_port,
|
| Dart_Port file_port,
|
| - Dart_Port dir_port) {
|
| + Dart_Port done_port,
|
| + Dart_Port error_port) {
|
| DWORD attributes = find_file_data->dwFileAttributes;
|
| if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
|
| - HandleDir(find_file_data->cFileName, path, path_length, dir_port);
|
| + return HandleDir(find_file_data->cFileName,
|
| + path,
|
| + path_length,
|
| + recursive,
|
| + dir_port,
|
| + file_port,
|
| + done_port,
|
| + error_port);
|
| } else {
|
| HandleFile(find_file_data->cFileName, path, path_length, file_port);
|
| + return true;
|
| }
|
| }
|
|
|
| @@ -69,15 +103,13 @@ static void ComputeFullSearchPath(const char* dir_name,
|
| *path_length += written;
|
| }
|
|
|
| -
|
| -void Directory::List(const char* dir_name,
|
| - bool recursive,
|
| - Dart_Port dir_port,
|
| - Dart_Port file_port,
|
| - Dart_Port done_port,
|
| - Dart_Port error_port) {
|
| - // TODO(ager): Handle recursive listing.
|
| - char path[MAX_PATH];
|
| +static bool ListRecursively(const char* dir_name,
|
| + bool recursive,
|
| + Dart_Port dir_port,
|
| + Dart_Port file_port,
|
| + Dart_Port done_port,
|
| + Dart_Port error_port) {
|
| + char* path = static_cast<char*>(malloc(MAX_PATH));
|
| int path_length = 0;
|
| ComputeFullSearchPath(dir_name, path, &path_length);
|
|
|
| @@ -90,20 +122,53 @@ void Directory::List(const char* dir_name,
|
|
|
| if (find_handle == INVALID_HANDLE_VALUE) {
|
| // TODO(ager): Post on error port.
|
| - Dart_Handle value = Dart_NewBoolean(false);
|
| - Dart_Post(done_port, value);
|
| - return;
|
| + free(path);
|
| + return false;
|
| }
|
|
|
| - HandleEntry(&find_file_data, path, path_length, file_port, dir_port);
|
| + bool completed = HandleEntry(&find_file_data,
|
| + path,
|
| + path_length,
|
| + recursive,
|
| + dir_port,
|
| + file_port,
|
| + done_port,
|
| + error_port);
|
| +
|
| while (FindNextFile(find_handle, &find_file_data) != 0) {
|
| - HandleEntry(&find_file_data, path, path_length, file_port, dir_port);
|
| + completed = completed && HandleEntry(&find_file_data,
|
| + path,
|
| + path_length,
|
| + recursive,
|
| + dir_port,
|
| + file_port,
|
| + done_port,
|
| + error_port);
|
| }
|
|
|
| - bool result = GetLastError() == ERROR_NO_MORE_FILES;
|
| - Dart_Handle value = Dart_NewBoolean(result);
|
| - Dart_Post(done_port, value);
|
| + completed = completed && (GetLastError() == ERROR_NO_MORE_FILES);
|
|
|
| - // TODO(ager): Post on error port.
|
| + // TODO(ager): Post on error port if close fails.
|
| FindClose(find_handle);
|
| + free(path);
|
| +
|
| + return completed;
|
| +}
|
| +
|
| +void Directory::List(const char* dir_name,
|
| + bool recursive,
|
| + Dart_Port dir_port,
|
| + Dart_Port file_port,
|
| + Dart_Port done_port,
|
| + Dart_Port error_port) {
|
| + bool result = ListRecursively(dir_name,
|
| + recursive,
|
| + dir_port,
|
| + file_port,
|
| + done_port,
|
| + error_port);
|
| + if (done_port != 0) {
|
| + Dart_Handle value = Dart_NewBoolean(result);
|
| + Dart_Post(done_port, value);
|
| + }
|
| }
|
|
|