Index: runtime/bin/directory_posix.cc |
diff --git a/runtime/bin/directory_posix.cc b/runtime/bin/directory_posix.cc |
index 9cad78824f6228ea1da59b8b4c55e40000db396b..81cfc372760cd20f10c3d7a30f1ded7d8c292982 100644 |
--- a/runtime/bin/directory_posix.cc |
+++ b/runtime/bin/directory_posix.cc |
@@ -30,10 +30,7 @@ static void SetOsErrorMessage(char* os_error_message, |
// Forward declarations. |
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); |
+ DirectoryListing* listing); |
static bool DeleteRecursively(const char* dir_name); |
@@ -64,10 +61,7 @@ static bool HandleDir(char* dir_name, |
char* path, |
int path_length, |
bool recursive, |
- Dart_Port dir_port, |
- Dart_Port file_port, |
- Dart_Port done_port, |
- Dart_Port error_port) { |
+ DirectoryListing *listing) { |
if (strcmp(dir_name, ".") != 0 && |
strcmp(dir_name, "..") != 0) { |
size_t written = snprintf(path + path_length, |
@@ -77,17 +71,10 @@ static bool HandleDir(char* dir_name, |
if (written != strlen(dir_name)) { |
return false; |
} |
- if (dir_port != 0) { |
- Dart_Handle name = Dart_NewString(path); |
- Dart_Post(dir_port, name); |
- } |
+ bool ok = listing->HandleDirectory(dir_name); |
+ if (!ok) return ok; |
if (recursive) { |
- return ListRecursively(path, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
+ return ListRecursively(path, recursive, listing); |
} |
} |
return true; |
@@ -97,57 +84,52 @@ static bool HandleDir(char* dir_name, |
static bool HandleFile(char* file_name, |
char* path, |
int path_length, |
- Dart_Port file_port) { |
- if (file_port != 0) { |
- size_t written = snprintf(path + path_length, |
- PATH_MAX - path_length, |
- "%s", |
- file_name); |
- if (written != strlen(file_name)) { |
- return false; |
- } |
- Dart_Handle name = Dart_NewString(path); |
- Dart_Post(file_port, name); |
+ DirectoryListing *listing) { |
+ // TODO(sgjesse): Pass flags to indicate whether file responses are |
+ // needed. |
+ size_t written = snprintf(path + path_length, |
+ PATH_MAX - path_length, |
+ "%s", |
+ file_name); |
+ if (written != strlen(file_name)) { |
+ return false; |
} |
- return true; |
+ return listing->HandleFile(path); |
} |
-static void PostError(Dart_Port error_port, |
+static void PostError(DirectoryListing *listing, |
const char* prefix, |
const char* suffix, |
int error_code) { |
- if (error_port != 0) { |
- char* error_str = Platform::StrError(error_code); |
- int error_message_size = |
- strlen(prefix) + strlen(suffix) + strlen(error_str) + 3; |
- char* message = static_cast<char*>(malloc(error_message_size + 1)); |
- int written = snprintf(message, |
- error_message_size + 1, |
- "%s%s (%s)", |
- prefix, |
- suffix, |
- error_str); |
- ASSERT(written == error_message_size); |
- free(error_str); |
- Dart_Post(error_port, Dart_NewString(message)); |
- free(message); |
- } |
+ // TODO(sgjesse): Pass flags to indicate whether error response is |
+ // needed. |
+ char* error_str = Platform::StrError(error_code); |
+ int error_message_size = |
+ strlen(prefix) + strlen(suffix) + strlen(error_str) + 3; |
+ char* message = static_cast<char*>(malloc(error_message_size + 1)); |
+ int written = snprintf(message, |
+ error_message_size + 1, |
+ "%s%s (%s)", |
+ prefix, |
+ suffix, |
+ error_str); |
+ ASSERT(written == error_message_size); |
+ free(error_str); |
+ listing->HandleError(message); |
+ free(message); |
} |
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) { |
+ DirectoryListing *listing) { |
DIR* dir_pointer; |
do { |
dir_pointer = opendir(dir_name); |
} while (dir_pointer == NULL && errno == EINTR); |
if (dir_pointer == NULL) { |
- PostError(error_port, "Directory listing failed for: ", dir_name, errno); |
+ PostError(listing, "Directory listing failed for: ", dir_name, errno); |
return false; |
} |
@@ -162,7 +144,7 @@ static bool ListRecursively(const char* dir_name, |
bool valid = ComputeFullPath(dir_name, path, &path_length); |
if (!valid) { |
free(path); |
- PostError(error_port, "Directory listing failed for: ", dir_name, errno); |
+ PostError(listing, "Directory listing failed for: ", dir_name, errno); |
return false; |
} |
@@ -183,16 +165,13 @@ static bool ListRecursively(const char* dir_name, |
path, |
path_length, |
recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
+ listing); |
break; |
case DT_REG: |
success = success && HandleFile(entry.d_name, |
path, |
path_length, |
- file_port); |
+ listing); |
break; |
case DT_UNKNOWN: { |
// On some file systems the entry type is not determined by |
@@ -210,7 +189,7 @@ static bool ListRecursively(const char* dir_name, |
int lstat_success = TEMP_FAILURE_RETRY(lstat(path, &entry_info)); |
if (lstat_success == -1) { |
success = false; |
- PostError(error_port, "Directory listing failed for: ", path, errno); |
+ PostError(listing, "Directory listing failed for: ", path, errno); |
break; |
} |
if ((entry_info.st_mode & S_IFMT) == S_IFDIR) { |
@@ -218,15 +197,12 @@ static bool ListRecursively(const char* dir_name, |
path, |
path_length, |
recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
+ listing); |
} else if ((entry_info.st_mode & S_IFMT) == S_IFREG) { |
success = success && HandleFile(entry.d_name, |
path, |
path_length, |
- file_port); |
+ listing); |
} |
break; |
} |
@@ -237,11 +213,11 @@ static bool ListRecursively(const char* dir_name, |
if (read != 0) { |
success = false; |
- PostError(error_port, "Directory listing failed", "", read); |
+ PostError(listing, "Directory listing failed", "", read); |
} |
if (closedir(dir_pointer) == -1) { |
- PostError(error_port, "Failed to close directory", "", errno); |
+ PostError(listing, "Failed to close directory", "", errno); |
} |
free(path); |
@@ -364,22 +340,11 @@ static bool DeleteRecursively(const char* dir_name) { |
} |
-void Directory::List(const char* dir_name, |
+bool 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 completed = ListRecursively(dir_name, |
- recursive, |
- dir_port, |
- file_port, |
- done_port, |
- error_port); |
- if (done_port != 0) { |
- Dart_Handle value = Dart_NewBoolean(completed); |
- Dart_Post(done_port, value); |
- } |
+ DirectoryListing *listing) { |
+ bool completed = ListRecursively(dir_name, recursive, listing); |
+ return completed; |
} |