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

Unified Diff: runtime/bin/directory_macos.cc

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_macos.cc
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index f1f23dbd0025f85478bd9b273641ffeb56abe566..ab007b45532f3b8582a523347f98be08703dac26 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -15,23 +15,6 @@
#include "bin/file.h"
-bool Directory::Open(const char* path, intptr_t* dir) {
- DIR* dir_pointer = opendir(path);
- if (dir_pointer == NULL) {
- return false;
- }
- *dir = reinterpret_cast<intptr_t>(dir_pointer);
- return true;
-}
-
-
-bool Directory::Close(intptr_t dir) {
- DIR* dir_pointer = reinterpret_cast<DIR*>(dir);
- int result = closedir(dir_pointer);
- return result == 0;
-}
-
-
static void ComputeFullPath(const char* dir_name,
char* path,
int* path_length) {
@@ -78,8 +61,8 @@ static void ComputeFullPath(const char* dir_name,
static void HandleDir(char* dir_name,
char* path,
int path_length,
- Dart_Port dir_handler) {
- if (dir_handler != 0 &&
+ Dart_Port dir_port) {
+ if (dir_port != 0 &&
strcmp(dir_name, ".") != 0 &&
strcmp(dir_name, "..") != 0) {
size_t written = snprintf(path + path_length,
@@ -88,7 +71,7 @@ static void HandleDir(char* dir_name,
dir_name);
ASSERT(written == strlen(dir_name));
Dart_Handle name = Dart_NewString(path);
- Dart_Post(dir_handler, name);
+ Dart_Post(dir_port, name);
}
}
@@ -96,36 +79,42 @@ static void HandleDir(char* dir_name,
static void HandleFile(char* file_name,
char* path,
int path_length,
- Dart_Port file_handler) {
- if (file_handler != 0) {
+ Dart_Port file_port) {
+ if (file_port != 0) {
size_t written = snprintf(path + path_length,
PATH_MAX - path_length,
"%s",
file_name);
ASSERT(written == strlen(file_name));
Dart_Handle name = Dart_NewString(path);
- Dart_Post(file_handler, name);
+ Dart_Post(file_port, name);
}
}
void Directory::List(const char* dir_name,
- intptr_t dir_handle,
bool recursive,
- Dart_Port dir_handler,
- Dart_Port file_handler,
- Dart_Port done_handler,
- Dart_Port dir_error_handler) {
+ Dart_Port dir_port,
+ Dart_Port file_port,
+ Dart_Port done_port,
+ Dart_Port dir_error_port) {
+ DIR* dir_pointer = opendir(dir_name);
+ if (dir_pointer == NULL) {
+ // TODO(ager): post something on the error port.
+ Dart_Handle value = Dart_NewBoolean(false);
+ Dart_Post(done_port, value);
+ return;
+ }
+
// Compute full path for the directory currently being listed.
char path[PATH_MAX];
int path_length = 0;
ComputeFullPath(dir_name, path, &path_length);
// Iterated the directory and post the directories and files to the
- // handlers.
+ // ports.
//
// TODO(ager): Handle recursion and errors caused by recursion.
- DIR* dir_pointer = reinterpret_cast<DIR*>(dir_handle);
int success = 0;
bool lstat_error = false;
dirent entry;
@@ -134,12 +123,15 @@ void Directory::List(const char* dir_name,
result != NULL) {
switch (entry.d_type) {
case DT_DIR:
- HandleDir(entry.d_name, path, path_length, dir_handler);
+ HandleDir(entry.d_name, path, path_length, dir_port);
break;
case DT_REG:
- HandleFile(entry.d_name, path, path_length, file_handler);
+ HandleFile(entry.d_name, path, path_length, file_port);
break;
case DT_UNKNOWN: {
+ // On some file systems the entry type is not determined by
+ // readdir_r. For those we use lstat to determine the entry
+ // type.
struct stat entry_info;
size_t written = snprintf(path + path_length,
PATH_MAX - path_length,
@@ -152,9 +144,9 @@ void Directory::List(const char* dir_name,
break;
}
if ((entry_info.st_mode & S_IFMT) == S_IFDIR) {
- HandleDir(entry.d_name, path, path_length, dir_handler);
+ HandleDir(entry.d_name, path, path_length, dir_port);
} else if ((entry_info.st_mode & S_IFMT) == S_IFREG) {
- HandleFile(entry.d_name, path, path_length, file_handler);
+ HandleFile(entry.d_name, path, path_length, file_port);
}
break;
}
@@ -162,13 +154,16 @@ void Directory::List(const char* dir_name,
break;
}
}
- if (done_handler != 0) {
+ if (done_port != 0) {
if (success != 0 || lstat_error) {
Dart_Handle value = Dart_NewBoolean(false);
- Dart_Post(done_handler, value);
+ Dart_Post(done_port, value);
} else {
Dart_Handle value = Dart_NewBoolean(true);
- Dart_Post(done_handler, value);
+ Dart_Post(done_port, value);
}
}
+
+ // TODO(ager): Post on error port.
+ closedir(dir_pointer);
}

Powered by Google App Engine
This is Rietveld 408576698