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

Unified Diff: runtime/bin/directory_win.cc

Issue 8244004: Directory: implement recursive listing on Windows. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Use malloc instead of new[] 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698