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

Unified Diff: runtime/bin/directory.cc

Issue 16813006: Make Directory.list pull-based, making it possible to pause, resume and cancel directory listing. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Make the code more Windows-friendly. Created 7 years, 6 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.cc
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index 6ca4ac0b4b6bd169989b3b6d19a57cd59a1ccb57..ace5b866a7bf69af51fae672a0bbb8d916d2fd3d 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -150,11 +150,11 @@ void FUNCTION_NAME(Directory_List)(Dart_NativeArguments args) {
Dart_Null(),
0,
NULL);
- SyncDirectoryListing sync_listing(results);
- Directory::List(DartUtils::GetStringValue(path),
- DartUtils::GetBooleanValue(recursive),
- DartUtils::GetBooleanValue(follow_links),
- &sync_listing);
+ SyncDirectoryListing sync_listing(results,
+ DartUtils::GetStringValue(path),
+ DartUtils::GetBooleanValue(recursive),
+ DartUtils::GetBooleanValue(follow_links));
+ Directory::List(&sync_listing);
Dart_SetReturnValue(args, results);
Dart_ExitScope();
}
@@ -221,25 +221,44 @@ static CObject* DirectoryCreateTempRequest(const CObjectArray& request) {
}
-static CObject* DirectoryListRequest(const CObjectArray& request,
- Dart_Port response_port) {
+static CObject* DirectoryListStartRequest(const CObjectArray& request) {
if (request.Length() == 4 &&
request[1]->IsString() &&
request[2]->IsBool() &&
request[3]->IsBool()) {
- AsyncDirectoryListing* dir_listing =
- new AsyncDirectoryListing(response_port);
CObjectString path(request[1]);
CObjectBool recursive(request[2]);
CObjectBool follow_links(request[3]);
- bool completed = Directory::List(
- path.CString(), recursive.Value(), follow_links.Value(), dir_listing);
- delete dir_listing;
- CObjectArray* response = new CObjectArray(CObject::NewArray(2));
- response->SetAt(
- 0,
- new CObjectInt32(CObject::NewInt32(AsyncDirectoryListing::kListDone)));
- response->SetAt(1, CObject::Bool(completed));
+ AsyncDirectoryListing* dir_listing =
+ new AsyncDirectoryListing(path.CString(),
+ recursive.Value(),
+ follow_links.Value());
+ return new CObjectIntptr(CObject::NewIntptr(
+ reinterpret_cast<intptr_t>(dir_listing)));
+ }
+ // Respond with an illegal argument list error message.
+ CObjectArray* response = new CObjectArray(CObject::NewArray(3));
+ response->SetAt(0, new CObjectInt32(
+ CObject::NewInt32(AsyncDirectoryListing::kListError)));
+ response->SetAt(1, CObject::Null());
+ response->SetAt(2, CObject::IllegalArgumentError());
+ return response;
+}
+
+
+static CObject* DirectoryListNextRequest(const CObjectArray& request) {
+ if (request.Length() == 2 &&
+ request[1]->IsIntptr()) {
+ CObjectIntptr ptr(request[1]);
+ AsyncDirectoryListing* dir_listing =
+ reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
+ const int kArraySize = 128;
+ CObjectArray* response = new CObjectArray(CObject::NewArray(kArraySize));
+ dir_listing->set_array(response, kArraySize);
+ Directory::List(dir_listing);
Søren Gjesse 2013/06/12 12:52:41 You should just set the length of the response arr
Anders Johnsen 2013/06/13 08:38:24 Done.
+ for (intptr_t i = dir_listing->index(); i < kArraySize; i++) {
+ response->SetAt(i, CObject::Null());
+ }
return response;
}
// Respond with an illegal argument list error message.
@@ -248,12 +267,24 @@ static CObject* DirectoryListRequest(const CObjectArray& request,
CObject::NewInt32(AsyncDirectoryListing::kListError)));
response->SetAt(1, CObject::Null());
response->SetAt(2, CObject::IllegalArgumentError());
- Dart_PostCObject(response_port, response->AsApiCObject());
+ return response;
+}
- response = new CObjectArray(CObject::NewArray(2));
- response->SetAt(
- 0, new CObjectInt32(CObject::NewInt32(AsyncDirectoryListing::kListDone)));
- response->SetAt(1, CObject::False());
+
+static CObject* DirectoryListStopRequest(const CObjectArray& request) {
+ if (request.Length() == 2 && request[1]->IsIntptr()) {
+ CObjectIntptr ptr(request[1]);
+ AsyncDirectoryListing* dir_listing =
+ reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
+ delete dir_listing;
+ return new CObjectBool(CObject::Bool(true));
+ }
+ // Respond with an illegal argument list error message.
+ CObjectArray* response = new CObjectArray(CObject::NewArray(3));
+ response->SetAt(0, new CObjectInt32(
+ CObject::NewInt32(AsyncDirectoryListing::kListError)));
+ response->SetAt(1, CObject::Null());
+ response->SetAt(2, CObject::IllegalArgumentError());
return response;
}
@@ -294,8 +325,14 @@ static void DirectoryService(Dart_Port dest_port_id,
case Directory::kCreateTempRequest:
response = DirectoryCreateTempRequest(request);
break;
- case Directory::kListRequest:
- response = DirectoryListRequest(request, reply_port_id);
+ case Directory::kListStartRequest:
+ response = DirectoryListStartRequest(request);
+ break;
+ case Directory::kListNextRequest:
+ response = DirectoryListNextRequest(request);
+ break;
+ case Directory::kListStopRequest:
+ response = DirectoryListStopRequest(request);
break;
case Directory::kRenameRequest:
response = DirectoryRenameRequest(request, reply_port_id);
@@ -328,29 +365,35 @@ void FUNCTION_NAME(Directory_NewServicePort)(Dart_NativeArguments args) {
}
-CObjectArray* AsyncDirectoryListing::NewResponse(Response type, char* arg) {
+bool AsyncDirectoryListing::NewResponse(Response type, char* arg) {
Søren Gjesse 2013/06/12 12:52:41 This is no longer a single new response, but part
Anders Johnsen 2013/06/13 08:38:24 Done.
CObjectArray* response = new CObjectArray(CObject::NewArray(2));
response->SetAt(0, new CObjectInt32(CObject::NewInt32(type)));
- response->SetAt(1, new CObjectString(CObject::NewString(arg)));
- return response;
+ if (arg != NULL) {
+ response->SetAt(1, new CObjectString(CObject::NewString(arg)));
+ } else {
+ response->SetAt(1, CObject::Null());
+ }
+ array_->SetAt(index_++, response);
+ return index_ < length_;
}
bool AsyncDirectoryListing::HandleDirectory(char* dir_name) {
- CObjectArray* response = NewResponse(kListDirectory, dir_name);
- return Dart_PostCObject(response_port_, response->AsApiCObject());
+ return NewResponse(kListDirectory, dir_name);
}
bool AsyncDirectoryListing::HandleFile(char* file_name) {
- CObjectArray* response = NewResponse(kListFile, file_name);
- return Dart_PostCObject(response_port_, response->AsApiCObject());
+ return NewResponse(kListFile, file_name);
}
bool AsyncDirectoryListing::HandleLink(char* link_name) {
- CObjectArray* response = NewResponse(kListLink, link_name);
- return Dart_PostCObject(response_port_, response->AsApiCObject());
+ return NewResponse(kListLink, link_name);
+}
+
+void AsyncDirectoryListing::HandleDone() {
+ NewResponse(kListDone, NULL);
}
@@ -360,7 +403,8 @@ bool AsyncDirectoryListing::HandleError(const char* dir_name) {
response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError)));
response->SetAt(1, new CObjectString(CObject::NewString(dir_name)));
response->SetAt(2, err);
- return Dart_PostCObject(response_port_, response->AsApiCObject());
+ array_->SetAt(index_++, response);
+ return index_ < length_;
}
bool SyncDirectoryListing::HandleDirectory(char* dir_name) {

Powered by Google App Engine
This is Rietveld 408576698