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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/directory.h" 5 #include "bin/directory.h"
6 6
7 #include "bin/dartutils.h" 7 #include "bin/dartutils.h"
8 #include "bin/thread.h" 8 #include "bin/thread.h"
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "platform/assert.h" 10 #include "platform/assert.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 // Create the list to hold the directory listing here, and pass it to the 143 // Create the list to hold the directory listing here, and pass it to the
144 // SyncDirectoryListing object, which adds elements to it. 144 // SyncDirectoryListing object, which adds elements to it.
145 Dart_Handle follow_links = Dart_GetNativeArgument(args, 2); 145 Dart_Handle follow_links = Dart_GetNativeArgument(args, 2);
146 // Create the list to hold the directory listing here, and pass it to the 146 // Create the list to hold the directory listing here, and pass it to the
147 // SyncDirectoryListing object, which adds elements to it. 147 // SyncDirectoryListing object, which adds elements to it.
148 Dart_Handle results = 148 Dart_Handle results =
149 Dart_New(DartUtils::GetDartClass(DartUtils::kCoreLibURL, "List"), 149 Dart_New(DartUtils::GetDartClass(DartUtils::kCoreLibURL, "List"),
150 Dart_Null(), 150 Dart_Null(),
151 0, 151 0,
152 NULL); 152 NULL);
153 SyncDirectoryListing sync_listing(results); 153 SyncDirectoryListing sync_listing(results,
154 Directory::List(DartUtils::GetStringValue(path), 154 DartUtils::GetStringValue(path),
155 DartUtils::GetBooleanValue(recursive), 155 DartUtils::GetBooleanValue(recursive),
156 DartUtils::GetBooleanValue(follow_links), 156 DartUtils::GetBooleanValue(follow_links));
157 &sync_listing); 157 Directory::List(&sync_listing);
158 Dart_SetReturnValue(args, results); 158 Dart_SetReturnValue(args, results);
159 Dart_ExitScope(); 159 Dart_ExitScope();
160 } 160 }
161 161
162 162
163 static CObject* DirectoryCreateRequest(const CObjectArray& request) { 163 static CObject* DirectoryCreateRequest(const CObjectArray& request) {
164 if (request.Length() == 2 && request[1]->IsString()) { 164 if (request.Length() == 2 && request[1]->IsString()) {
165 CObjectString path(request[1]); 165 CObjectString path(request[1]);
166 if (Directory::Create(path.CString())) { 166 if (Directory::Create(path.CString())) {
167 return CObject::True(); 167 return CObject::True();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 free(result); 214 free(result);
215 return temp_dir; 215 return temp_dir;
216 } else { 216 } else {
217 return CObject::NewOSError(); 217 return CObject::NewOSError();
218 } 218 }
219 } 219 }
220 return CObject::IllegalArgumentError(); 220 return CObject::IllegalArgumentError();
221 } 221 }
222 222
223 223
224 static CObject* DirectoryListRequest(const CObjectArray& request, 224 static CObject* DirectoryListStartRequest(const CObjectArray& request) {
225 Dart_Port response_port) {
226 if (request.Length() == 4 && 225 if (request.Length() == 4 &&
227 request[1]->IsString() && 226 request[1]->IsString() &&
228 request[2]->IsBool() && 227 request[2]->IsBool() &&
229 request[3]->IsBool()) { 228 request[3]->IsBool()) {
230 AsyncDirectoryListing* dir_listing =
231 new AsyncDirectoryListing(response_port);
232 CObjectString path(request[1]); 229 CObjectString path(request[1]);
233 CObjectBool recursive(request[2]); 230 CObjectBool recursive(request[2]);
234 CObjectBool follow_links(request[3]); 231 CObjectBool follow_links(request[3]);
235 bool completed = Directory::List( 232 AsyncDirectoryListing* dir_listing =
236 path.CString(), recursive.Value(), follow_links.Value(), dir_listing); 233 new AsyncDirectoryListing(path.CString(),
237 delete dir_listing; 234 recursive.Value(),
238 CObjectArray* response = new CObjectArray(CObject::NewArray(2)); 235 follow_links.Value());
239 response->SetAt( 236 return new CObjectIntptr(CObject::NewIntptr(
240 0, 237 reinterpret_cast<intptr_t>(dir_listing)));
241 new CObjectInt32(CObject::NewInt32(AsyncDirectoryListing::kListDone))); 238 }
242 response->SetAt(1, CObject::Bool(completed)); 239 // Respond with an illegal argument list error message.
240 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
241 response->SetAt(0, new CObjectInt32(
242 CObject::NewInt32(AsyncDirectoryListing::kListError)));
243 response->SetAt(1, CObject::Null());
244 response->SetAt(2, CObject::IllegalArgumentError());
245 return response;
246 }
247
248
249 static CObject* DirectoryListNextRequest(const CObjectArray& request) {
250 if (request.Length() == 2 &&
251 request[1]->IsIntptr()) {
252 CObjectIntptr ptr(request[1]);
253 AsyncDirectoryListing* dir_listing =
254 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
255 const int kArraySize = 128;
256 CObjectArray* response = new CObjectArray(CObject::NewArray(kArraySize));
257 dir_listing->set_array(response, kArraySize);
258 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.
259 for (intptr_t i = dir_listing->index(); i < kArraySize; i++) {
260 response->SetAt(i, CObject::Null());
261 }
243 return response; 262 return response;
244 } 263 }
245 // Respond with an illegal argument list error message. 264 // Respond with an illegal argument list error message.
246 CObjectArray* response = new CObjectArray(CObject::NewArray(3)); 265 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
247 response->SetAt(0, new CObjectInt32( 266 response->SetAt(0, new CObjectInt32(
248 CObject::NewInt32(AsyncDirectoryListing::kListError))); 267 CObject::NewInt32(AsyncDirectoryListing::kListError)));
249 response->SetAt(1, CObject::Null()); 268 response->SetAt(1, CObject::Null());
250 response->SetAt(2, CObject::IllegalArgumentError()); 269 response->SetAt(2, CObject::IllegalArgumentError());
251 Dart_PostCObject(response_port, response->AsApiCObject());
252
253 response = new CObjectArray(CObject::NewArray(2));
254 response->SetAt(
255 0, new CObjectInt32(CObject::NewInt32(AsyncDirectoryListing::kListDone)));
256 response->SetAt(1, CObject::False());
257 return response; 270 return response;
258 } 271 }
259 272
273
274 static CObject* DirectoryListStopRequest(const CObjectArray& request) {
275 if (request.Length() == 2 && request[1]->IsIntptr()) {
276 CObjectIntptr ptr(request[1]);
277 AsyncDirectoryListing* dir_listing =
278 reinterpret_cast<AsyncDirectoryListing*>(ptr.Value());
279 delete dir_listing;
280 return new CObjectBool(CObject::Bool(true));
281 }
282 // Respond with an illegal argument list error message.
283 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
284 response->SetAt(0, new CObjectInt32(
285 CObject::NewInt32(AsyncDirectoryListing::kListError)));
286 response->SetAt(1, CObject::Null());
287 response->SetAt(2, CObject::IllegalArgumentError());
288 return response;
289 }
290
260 291
261 static CObject* DirectoryRenameRequest(const CObjectArray& request, 292 static CObject* DirectoryRenameRequest(const CObjectArray& request,
262 Dart_Port response_port) { 293 Dart_Port response_port) {
263 if (request.Length() == 3 && 294 if (request.Length() == 3 &&
264 request[1]->IsString() && 295 request[1]->IsString() &&
265 request[2]->IsString()) { 296 request[2]->IsString()) {
266 CObjectString path(request[1]); 297 CObjectString path(request[1]);
267 CObjectString new_path(request[2]); 298 CObjectString new_path(request[2]);
268 bool completed = Directory::Rename(path.CString(), new_path.CString()); 299 bool completed = Directory::Rename(path.CString(), new_path.CString());
269 if (completed) return CObject::True(); 300 if (completed) return CObject::True();
(...skipping 17 matching lines...) Expand all
287 break; 318 break;
288 case Directory::kDeleteRequest: 319 case Directory::kDeleteRequest:
289 response = DirectoryDeleteRequest(request); 320 response = DirectoryDeleteRequest(request);
290 break; 321 break;
291 case Directory::kExistsRequest: 322 case Directory::kExistsRequest:
292 response = DirectoryExistsRequest(request); 323 response = DirectoryExistsRequest(request);
293 break; 324 break;
294 case Directory::kCreateTempRequest: 325 case Directory::kCreateTempRequest:
295 response = DirectoryCreateTempRequest(request); 326 response = DirectoryCreateTempRequest(request);
296 break; 327 break;
297 case Directory::kListRequest: 328 case Directory::kListStartRequest:
298 response = DirectoryListRequest(request, reply_port_id); 329 response = DirectoryListStartRequest(request);
330 break;
331 case Directory::kListNextRequest:
332 response = DirectoryListNextRequest(request);
333 break;
334 case Directory::kListStopRequest:
335 response = DirectoryListStopRequest(request);
299 break; 336 break;
300 case Directory::kRenameRequest: 337 case Directory::kRenameRequest:
301 response = DirectoryRenameRequest(request, reply_port_id); 338 response = DirectoryRenameRequest(request, reply_port_id);
302 break; 339 break;
303 default: 340 default:
304 UNREACHABLE(); 341 UNREACHABLE();
305 } 342 }
306 } 343 }
307 } 344 }
308 345
(...skipping 12 matching lines...) Expand all
321 Dart_Port service_port = Directory::GetServicePort(); 358 Dart_Port service_port = Directory::GetServicePort();
322 if (service_port != ILLEGAL_PORT) { 359 if (service_port != ILLEGAL_PORT) {
323 // Return a send port for the service port. 360 // Return a send port for the service port.
324 Dart_Handle send_port = Dart_NewSendPort(service_port); 361 Dart_Handle send_port = Dart_NewSendPort(service_port);
325 Dart_SetReturnValue(args, send_port); 362 Dart_SetReturnValue(args, send_port);
326 } 363 }
327 Dart_ExitScope(); 364 Dart_ExitScope();
328 } 365 }
329 366
330 367
331 CObjectArray* AsyncDirectoryListing::NewResponse(Response type, char* arg) { 368 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.
332 CObjectArray* response = new CObjectArray(CObject::NewArray(2)); 369 CObjectArray* response = new CObjectArray(CObject::NewArray(2));
333 response->SetAt(0, new CObjectInt32(CObject::NewInt32(type))); 370 response->SetAt(0, new CObjectInt32(CObject::NewInt32(type)));
334 response->SetAt(1, new CObjectString(CObject::NewString(arg))); 371 if (arg != NULL) {
335 return response; 372 response->SetAt(1, new CObjectString(CObject::NewString(arg)));
373 } else {
374 response->SetAt(1, CObject::Null());
375 }
376 array_->SetAt(index_++, response);
377 return index_ < length_;
336 } 378 }
337 379
338 380
339 bool AsyncDirectoryListing::HandleDirectory(char* dir_name) { 381 bool AsyncDirectoryListing::HandleDirectory(char* dir_name) {
340 CObjectArray* response = NewResponse(kListDirectory, dir_name); 382 return NewResponse(kListDirectory, dir_name);
341 return Dart_PostCObject(response_port_, response->AsApiCObject());
342 } 383 }
343 384
344 385
345 bool AsyncDirectoryListing::HandleFile(char* file_name) { 386 bool AsyncDirectoryListing::HandleFile(char* file_name) {
346 CObjectArray* response = NewResponse(kListFile, file_name); 387 return NewResponse(kListFile, file_name);
347 return Dart_PostCObject(response_port_, response->AsApiCObject());
348 } 388 }
349 389
350 390
351 bool AsyncDirectoryListing::HandleLink(char* link_name) { 391 bool AsyncDirectoryListing::HandleLink(char* link_name) {
352 CObjectArray* response = NewResponse(kListLink, link_name); 392 return NewResponse(kListLink, link_name);
353 return Dart_PostCObject(response_port_, response->AsApiCObject()); 393 }
394
395 void AsyncDirectoryListing::HandleDone() {
396 NewResponse(kListDone, NULL);
354 } 397 }
355 398
356 399
357 bool AsyncDirectoryListing::HandleError(const char* dir_name) { 400 bool AsyncDirectoryListing::HandleError(const char* dir_name) {
358 CObject* err = CObject::NewOSError(); 401 CObject* err = CObject::NewOSError();
359 CObjectArray* response = new CObjectArray(CObject::NewArray(3)); 402 CObjectArray* response = new CObjectArray(CObject::NewArray(3));
360 response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError))); 403 response->SetAt(0, new CObjectInt32(CObject::NewInt32(kListError)));
361 response->SetAt(1, new CObjectString(CObject::NewString(dir_name))); 404 response->SetAt(1, new CObjectString(CObject::NewString(dir_name)));
362 response->SetAt(2, err); 405 response->SetAt(2, err);
363 return Dart_PostCObject(response_port_, response->AsApiCObject()); 406 array_->SetAt(index_++, response);
407 return index_ < length_;
364 } 408 }
365 409
366 bool SyncDirectoryListing::HandleDirectory(char* dir_name) { 410 bool SyncDirectoryListing::HandleDirectory(char* dir_name) {
367 Dart_Handle dir_name_dart = DartUtils::NewString(dir_name); 411 Dart_Handle dir_name_dart = DartUtils::NewString(dir_name);
368 Dart_Handle dir = 412 Dart_Handle dir =
369 Dart_New(directory_class_, Dart_Null(), 1, &dir_name_dart); 413 Dart_New(directory_class_, Dart_Null(), 1, &dir_name_dart);
370 Dart_Invoke(results_, add_string_, 1, &dir); 414 Dart_Invoke(results_, add_string_, 1, &dir);
371 return true; 415 return true;
372 } 416 }
373 417
(...skipping 22 matching lines...) Expand all
396 Dart_ThrowException(Dart_New( 440 Dart_ThrowException(Dart_New(
397 DartUtils::GetDartClass(DartUtils::kIOLibURL, "DirectoryException"), 441 DartUtils::GetDartClass(DartUtils::kIOLibURL, "DirectoryException"),
398 Dart_Null(), 442 Dart_Null(),
399 3, 443 3,
400 args)); 444 args));
401 return true; 445 return true;
402 } 446 }
403 447
404 } // namespace bin 448 } // namespace bin
405 } // namespace dart 449 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698