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) { |