OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/file.h" | 5 #include "bin/file.h" |
6 | 6 |
7 #include "bin/builtin.h" | 7 #include "bin/builtin.h" |
8 #include "bin/dartutils.h" | 8 #include "bin/dartutils.h" |
9 #include "bin/embedded_dart_io.h" | 9 #include "bin/embedded_dart_io.h" |
10 #include "bin/io_buffer.h" | 10 #include "bin/io_buffer.h" |
| 11 #include "bin/namespace.h" |
11 #include "bin/utils.h" | 12 #include "bin/utils.h" |
12 #include "include/dart_api.h" | 13 #include "include/dart_api.h" |
13 #include "include/dart_tools_api.h" | 14 #include "include/dart_tools_api.h" |
14 #include "platform/globals.h" | 15 #include "platform/globals.h" |
15 | 16 |
16 namespace dart { | 17 namespace dart { |
17 namespace bin { | 18 namespace bin { |
18 | 19 |
19 static const int kFileNativeFieldIndex = 0; | 20 static const int kFileNativeFieldIndex = 0; |
20 | 21 |
21 // The file pointer has been passed into Dart as an intptr_t and it is safe | 22 // The file pointer has been passed into Dart as an intptr_t and it is safe |
22 // to pull it out of Dart as a 64-bit integer, cast it to an intptr_t and | 23 // to pull it out of Dart as a 64-bit integer, cast it to an intptr_t and |
23 // from there to a File pointer. | 24 // from there to a File pointer. |
24 static File* GetFile(Dart_NativeArguments args) { | 25 static File* GetFile(Dart_NativeArguments args) { |
25 File* file; | 26 File* file; |
26 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); | 27 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); |
27 ASSERT(Dart_IsInstance(dart_this)); | 28 ASSERT(Dart_IsInstance(dart_this)); |
28 ThrowIfError(Dart_GetNativeInstanceField(dart_this, kFileNativeFieldIndex, | 29 Dart_Handle result = Dart_GetNativeInstanceField( |
29 reinterpret_cast<intptr_t*>(&file))); | 30 dart_this, kFileNativeFieldIndex, reinterpret_cast<intptr_t*>(&file)); |
| 31 ASSERT(!Dart_IsError(result)); |
30 return file; | 32 return file; |
31 } | 33 } |
32 | 34 |
33 static void SetFile(Dart_Handle dart_this, intptr_t file_pointer) { | 35 static void SetFile(Dart_Handle dart_this, intptr_t file_pointer) { |
34 Dart_Handle result = Dart_SetNativeInstanceField( | 36 Dart_Handle result = Dart_SetNativeInstanceField( |
35 dart_this, kFileNativeFieldIndex, file_pointer); | 37 dart_this, kFileNativeFieldIndex, file_pointer); |
36 if (Dart_IsError(result)) { | 38 if (Dart_IsError(result)) { |
37 Log::PrintErr("SetNativeInstanceField in SetFile() failed\n"); | 39 Log::PrintErr("SetNativeInstanceField in SetFile() failed\n"); |
38 Dart_PropagateError(result); | 40 Dart_PropagateError(result); |
39 } | 41 } |
(...skipping 23 matching lines...) Expand all Loading... |
63 intptr_t file_pointer = | 65 intptr_t file_pointer = |
64 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); | 66 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1)); |
65 File* file = reinterpret_cast<File*>(file_pointer); | 67 File* file = reinterpret_cast<File*>(file_pointer); |
66 Dart_WeakPersistentHandle handle = Dart_NewWeakPersistentHandle( | 68 Dart_WeakPersistentHandle handle = Dart_NewWeakPersistentHandle( |
67 dart_this, reinterpret_cast<void*>(file), sizeof(*file), ReleaseFile); | 69 dart_this, reinterpret_cast<void*>(file), sizeof(*file), ReleaseFile); |
68 file->SetWeakHandle(handle); | 70 file->SetWeakHandle(handle); |
69 SetFile(dart_this, file_pointer); | 71 SetFile(dart_this, file_pointer); |
70 } | 72 } |
71 | 73 |
72 void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) { | 74 void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) { |
| 75 Namespace* namespc = Namespace::GetNamespace(args, 0); |
73 const char* filename = | 76 const char* filename = |
74 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 77 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
75 int64_t mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); | 78 int64_t mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2)); |
76 File::DartFileOpenMode dart_file_mode = | 79 File::DartFileOpenMode dart_file_mode = |
77 static_cast<File::DartFileOpenMode>(mode); | 80 static_cast<File::DartFileOpenMode>(mode); |
78 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); | 81 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); |
79 // Check that the file exists before opening it only for | 82 // Check that the file exists before opening it only for |
80 // reading. This is to prevent the opening of directories as | 83 // reading. This is to prevent the opening of directories as |
81 // files. Directories can be opened for reading using the posix | 84 // files. Directories can be opened for reading using the posix |
82 // 'open' call. | 85 // 'open' call. |
83 File* file = File::Open(filename, file_mode); | 86 File* file = File::Open(namespc, filename, file_mode); |
84 if (file != NULL) { | 87 if (file != NULL) { |
85 Dart_SetReturnValue(args, | 88 Dart_SetReturnValue(args, |
86 Dart_NewInteger(reinterpret_cast<intptr_t>(file))); | 89 Dart_NewInteger(reinterpret_cast<intptr_t>(file))); |
87 } else { | 90 } else { |
88 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 91 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
89 } | 92 } |
90 } | 93 } |
91 | 94 |
92 void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) { | 95 void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) { |
| 96 Namespace* namespc = Namespace::GetNamespace(args, 0); |
93 const char* filename = | 97 const char* filename = |
94 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 98 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
95 bool exists = File::Exists(filename); | 99 bool exists = File::Exists(namespc, filename); |
96 Dart_SetReturnValue(args, Dart_NewBoolean(exists)); | 100 Dart_SetReturnValue(args, Dart_NewBoolean(exists)); |
97 } | 101 } |
98 | 102 |
99 void FUNCTION_NAME(File_Close)(Dart_NativeArguments args) { | 103 void FUNCTION_NAME(File_Close)(Dart_NativeArguments args) { |
100 File* file = GetFile(args); | 104 File* file = GetFile(args); |
101 ASSERT(file != NULL); | 105 ASSERT(file != NULL); |
102 file->Close(); | 106 file->Close(); |
103 file->DeleteWeakHandle(Dart_CurrentIsolate()); | 107 file->DeleteWeakHandle(Dart_CurrentIsolate()); |
104 file->Release(); | 108 file->Release(); |
105 | 109 |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 ASSERT(file != NULL); | 309 ASSERT(file != NULL); |
306 int64_t return_value = file->Length(); | 310 int64_t return_value = file->Length(); |
307 if (return_value >= 0) { | 311 if (return_value >= 0) { |
308 Dart_SetReturnValue(args, Dart_NewInteger(return_value)); | 312 Dart_SetReturnValue(args, Dart_NewInteger(return_value)); |
309 } else { | 313 } else { |
310 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 314 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
311 } | 315 } |
312 } | 316 } |
313 | 317 |
314 void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) { | 318 void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) { |
315 const char* path = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 319 Namespace* namespc = Namespace::GetNamespace(args, 0); |
316 int64_t return_value = File::LengthFromPath(path); | 320 const char* path = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 321 int64_t return_value = File::LengthFromPath(namespc, path); |
317 if (return_value >= 0) { | 322 if (return_value >= 0) { |
318 Dart_SetReturnValue(args, Dart_NewInteger(return_value)); | 323 Dart_SetReturnValue(args, Dart_NewInteger(return_value)); |
319 } else { | 324 } else { |
320 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 325 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
321 } | 326 } |
322 } | 327 } |
323 | 328 |
324 void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) { | 329 void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) { |
325 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 330 Namespace* namespc = Namespace::GetNamespace(args, 0); |
326 int64_t return_value = File::LastModified(name); | 331 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 332 int64_t return_value = File::LastModified(namespc, name); |
327 if (return_value >= 0) { | 333 if (return_value >= 0) { |
328 Dart_SetReturnValue(args, | 334 Dart_SetReturnValue(args, |
329 Dart_NewInteger(return_value * kMillisecondsPerSecond)); | 335 Dart_NewInteger(return_value * kMillisecondsPerSecond)); |
330 } else { | 336 } else { |
331 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 337 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
332 } | 338 } |
333 } | 339 } |
334 | 340 |
335 void FUNCTION_NAME(File_SetLastModified)(Dart_NativeArguments args) { | 341 void FUNCTION_NAME(File_SetLastModified)(Dart_NativeArguments args) { |
336 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 342 Namespace* namespc = Namespace::GetNamespace(args, 0); |
| 343 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
337 int64_t millis; | 344 int64_t millis; |
338 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &millis)) { | 345 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &millis)) { |
339 Dart_ThrowException(DartUtils::NewDartArgumentError( | 346 Dart_ThrowException(DartUtils::NewDartArgumentError( |
340 "The second argument must be a 64-bit int.")); | 347 "The second argument must be a 64-bit int.")); |
341 } | 348 } |
342 if (!File::SetLastModified(name, millis)) { | 349 if (!File::SetLastModified(namespc, name, millis)) { |
343 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 350 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
344 } | 351 } |
345 } | 352 } |
346 | 353 |
347 void FUNCTION_NAME(File_LastAccessed)(Dart_NativeArguments args) { | 354 void FUNCTION_NAME(File_LastAccessed)(Dart_NativeArguments args) { |
348 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 355 Namespace* namespc = Namespace::GetNamespace(args, 0); |
349 int64_t return_value = File::LastAccessed(name); | 356 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 357 int64_t return_value = File::LastAccessed(namespc, name); |
350 if (return_value >= 0) { | 358 if (return_value >= 0) { |
351 Dart_SetReturnValue(args, | 359 Dart_SetReturnValue(args, |
352 Dart_NewInteger(return_value * kMillisecondsPerSecond)); | 360 Dart_NewInteger(return_value * kMillisecondsPerSecond)); |
353 } else { | 361 } else { |
354 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 362 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
355 } | 363 } |
356 } | 364 } |
357 | 365 |
358 void FUNCTION_NAME(File_SetLastAccessed)(Dart_NativeArguments args) { | 366 void FUNCTION_NAME(File_SetLastAccessed)(Dart_NativeArguments args) { |
359 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 367 Namespace* namespc = Namespace::GetNamespace(args, 0); |
| 368 const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
360 int64_t millis; | 369 int64_t millis; |
361 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &millis)) { | 370 if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &millis)) { |
362 Dart_ThrowException(DartUtils::NewDartArgumentError( | 371 Dart_ThrowException(DartUtils::NewDartArgumentError( |
363 "The second argument must be a 64-bit int.")); | 372 "The second argument must be a 64-bit int.")); |
364 } | 373 } |
365 if (!File::SetLastAccessed(name, millis)) { | 374 if (!File::SetLastAccessed(namespc, name, millis)) { |
366 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 375 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
367 } | 376 } |
368 } | 377 } |
369 | 378 |
370 void FUNCTION_NAME(File_Flush)(Dart_NativeArguments args) { | 379 void FUNCTION_NAME(File_Flush)(Dart_NativeArguments args) { |
371 File* file = GetFile(args); | 380 File* file = GetFile(args); |
372 ASSERT(file != NULL); | 381 ASSERT(file != NULL); |
373 if (file->Flush()) { | 382 if (file->Flush()) { |
374 Dart_SetReturnValue(args, Dart_True()); | 383 Dart_SetReturnValue(args, Dart_True()); |
375 } else { | 384 } else { |
(...skipping 18 matching lines...) Expand all Loading... |
394 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 403 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
395 } | 404 } |
396 return; | 405 return; |
397 } | 406 } |
398 } | 407 } |
399 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 408 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
400 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 409 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
401 } | 410 } |
402 | 411 |
403 void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) { | 412 void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) { |
404 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 413 Namespace* namespc = Namespace::GetNamespace(args, 0); |
405 bool result = File::Create(str); | 414 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 415 bool result = File::Create(namespc, str); |
406 if (result) { | 416 if (result) { |
407 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 417 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
408 } else { | 418 } else { |
409 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 419 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
410 } | 420 } |
411 } | 421 } |
412 | 422 |
413 void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) { | 423 void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) { |
414 if (Dart_IsString(Dart_GetNativeArgument(args, 0)) && | 424 Namespace* namespc = Namespace::GetNamespace(args, 0); |
415 Dart_IsString(Dart_GetNativeArgument(args, 1))) { | 425 if (Dart_IsString(Dart_GetNativeArgument(args, 1)) && |
| 426 Dart_IsString(Dart_GetNativeArgument(args, 2))) { |
416 const char* name = | 427 const char* name = |
417 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 428 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
418 const char* target = | 429 const char* target = |
419 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 430 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2)); |
420 if (!File::CreateLink(name, target)) { | 431 if (!File::CreateLink(namespc, name, target)) { |
421 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 432 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
422 } | 433 } |
423 } else { | 434 } else { |
424 Dart_Handle err = | 435 Dart_Handle err = |
425 DartUtils::NewDartArgumentError("Non-string argument to Link.create"); | 436 DartUtils::NewDartArgumentError("Non-string argument to Link.create"); |
426 Dart_SetReturnValue(args, err); | 437 Dart_SetReturnValue(args, err); |
427 } | 438 } |
428 } | 439 } |
429 | 440 |
430 void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) { | 441 void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) { |
431 if (Dart_IsString(Dart_GetNativeArgument(args, 0))) { | 442 Namespace* namespc = Namespace::GetNamespace(args, 0); |
| 443 if (Dart_IsString(Dart_GetNativeArgument(args, 1))) { |
432 const char* name = | 444 const char* name = |
433 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 445 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
434 const char* target = File::LinkTarget(name); | 446 const char* target = File::LinkTarget(namespc, name); |
435 if (target == NULL) { | 447 if (target == NULL) { |
436 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 448 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
437 } else { | 449 } else { |
438 Dart_SetReturnValue(args, DartUtils::NewString(target)); | 450 Dart_SetReturnValue(args, DartUtils::NewString(target)); |
439 } | 451 } |
440 } else { | 452 } else { |
441 Dart_Handle err = | 453 Dart_Handle err = |
442 DartUtils::NewDartArgumentError("Non-string argument to Link.target"); | 454 DartUtils::NewDartArgumentError("Non-string argument to Link.target"); |
443 Dart_SetReturnValue(args, err); | 455 Dart_SetReturnValue(args, err); |
444 } | 456 } |
445 } | 457 } |
446 | 458 |
447 void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) { | 459 void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) { |
448 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 460 Namespace* namespc = Namespace::GetNamespace(args, 0); |
449 bool result = File::Delete(str); | 461 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 462 bool result = File::Delete(namespc, str); |
450 if (result) { | 463 if (result) { |
451 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 464 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
452 } else { | 465 } else { |
453 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 466 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
454 } | 467 } |
455 } | 468 } |
456 | 469 |
457 void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) { | 470 void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) { |
458 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 471 Namespace* namespc = Namespace::GetNamespace(args, 0); |
459 bool result = File::DeleteLink(str); | 472 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 473 bool result = File::DeleteLink(namespc, str); |
460 if (result) { | 474 if (result) { |
461 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 475 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
462 } else { | 476 } else { |
463 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 477 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
464 } | 478 } |
465 } | 479 } |
466 | 480 |
467 void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) { | 481 void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) { |
| 482 Namespace* namespc = Namespace::GetNamespace(args, 0); |
468 const char* old_path = | 483 const char* old_path = |
469 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 484 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
470 const char* new_path = | 485 const char* new_path = |
471 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 486 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2)); |
472 bool result = File::Rename(old_path, new_path); | 487 bool result = File::Rename(namespc, old_path, new_path); |
473 if (result) { | 488 if (result) { |
474 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 489 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
475 } else { | 490 } else { |
476 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 491 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
477 } | 492 } |
478 } | 493 } |
479 | 494 |
480 void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) { | 495 void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) { |
| 496 Namespace* namespc = Namespace::GetNamespace(args, 0); |
481 const char* old_path = | 497 const char* old_path = |
482 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 498 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
483 const char* new_path = | 499 const char* new_path = |
484 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 500 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2)); |
485 bool result = File::RenameLink(old_path, new_path); | 501 bool result = File::RenameLink(namespc, old_path, new_path); |
486 if (result) { | 502 if (result) { |
487 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 503 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
488 } else { | 504 } else { |
489 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 505 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
490 } | 506 } |
491 } | 507 } |
492 | 508 |
493 void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) { | 509 void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) { |
| 510 Namespace* namespc = Namespace::GetNamespace(args, 0); |
494 const char* old_path = | 511 const char* old_path = |
495 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 512 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
496 const char* new_path = | 513 const char* new_path = |
497 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 514 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2)); |
498 bool result = File::Copy(old_path, new_path); | 515 bool result = File::Copy(namespc, old_path, new_path); |
499 if (result) { | 516 if (result) { |
500 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 517 Dart_SetReturnValue(args, Dart_NewBoolean(result)); |
501 } else { | 518 } else { |
502 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 519 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
503 } | 520 } |
504 } | 521 } |
505 | 522 |
506 void FUNCTION_NAME(File_ResolveSymbolicLinks)(Dart_NativeArguments args) { | 523 void FUNCTION_NAME(File_ResolveSymbolicLinks)(Dart_NativeArguments args) { |
507 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 524 Namespace* namespc = Namespace::GetNamespace(args, 0); |
508 const char* path = File::GetCanonicalPath(str); | 525 const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| 526 const char* path = File::GetCanonicalPath(namespc, str); |
509 if (path != NULL) { | 527 if (path != NULL) { |
510 Dart_SetReturnValue(args, DartUtils::NewString(path)); | 528 Dart_SetReturnValue(args, DartUtils::NewString(path)); |
511 } else { | 529 } else { |
512 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 530 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
513 } | 531 } |
514 } | 532 } |
515 | 533 |
516 void FUNCTION_NAME(File_OpenStdio)(Dart_NativeArguments args) { | 534 void FUNCTION_NAME(File_OpenStdio)(Dart_NativeArguments args) { |
517 int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0)); | 535 int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0)); |
518 ASSERT((fd == STDIN_FILENO) || (fd == STDOUT_FILENO) || | 536 ASSERT((fd == STDIN_FILENO) || (fd == STDOUT_FILENO) || |
519 (fd == STDERR_FILENO)); | 537 (fd == STDERR_FILENO)); |
520 File* file = File::OpenStdio(static_cast<int>(fd)); | 538 File* file = File::OpenStdio(static_cast<int>(fd)); |
521 Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file))); | 539 Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file))); |
522 } | 540 } |
523 | 541 |
524 void FUNCTION_NAME(File_GetStdioHandleType)(Dart_NativeArguments args) { | 542 void FUNCTION_NAME(File_GetStdioHandleType)(Dart_NativeArguments args) { |
525 int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0)); | 543 int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0)); |
526 ASSERT((fd == STDIN_FILENO) || (fd == STDOUT_FILENO) || | 544 ASSERT((fd == STDIN_FILENO) || (fd == STDOUT_FILENO) || |
527 (fd == STDERR_FILENO)); | 545 (fd == STDERR_FILENO)); |
528 File::StdioHandleType type = File::GetStdioHandleType(static_cast<int>(fd)); | 546 File::StdioHandleType type = File::GetStdioHandleType(static_cast<int>(fd)); |
529 Dart_SetReturnValue(args, Dart_NewInteger(type)); | 547 Dart_SetReturnValue(args, Dart_NewInteger(type)); |
530 } | 548 } |
531 | 549 |
532 void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) { | 550 void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) { |
533 if (Dart_IsString(Dart_GetNativeArgument(args, 0)) && | 551 Namespace* namespc = Namespace::GetNamespace(args, 0); |
534 Dart_IsBoolean(Dart_GetNativeArgument(args, 1))) { | 552 if (Dart_IsString(Dart_GetNativeArgument(args, 1)) && |
| 553 Dart_IsBoolean(Dart_GetNativeArgument(args, 2))) { |
535 const char* str = | 554 const char* str = |
536 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 555 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
537 bool follow_links = | 556 bool follow_links = |
538 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1)); | 557 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2)); |
539 File::Type type = File::GetType(str, follow_links); | 558 File::Type type = File::GetType(namespc, str, follow_links); |
540 Dart_SetReturnValue(args, Dart_NewInteger(static_cast<int>(type))); | 559 Dart_SetReturnValue(args, Dart_NewInteger(static_cast<int>(type))); |
541 } else { | 560 } else { |
542 Dart_Handle err = DartUtils::NewDartArgumentError( | 561 Dart_Handle err = DartUtils::NewDartArgumentError( |
543 "Non-string argument to FileSystemEntity.type"); | 562 "Non-string argument to FileSystemEntity.type"); |
544 Dart_SetReturnValue(args, err); | 563 Dart_SetReturnValue(args, err); |
545 } | 564 } |
546 } | 565 } |
547 | 566 |
548 void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) { | 567 void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) { |
549 if (Dart_IsString(Dart_GetNativeArgument(args, 0))) { | 568 Namespace* namespc = Namespace::GetNamespace(args, 0); |
| 569 if (Dart_IsString(Dart_GetNativeArgument(args, 1))) { |
550 const char* path = | 570 const char* path = |
551 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 571 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
552 | 572 |
553 int64_t stat_data[File::kStatSize]; | 573 int64_t stat_data[File::kStatSize]; |
554 File::Stat(path, stat_data); | 574 File::Stat(namespc, path, stat_data); |
555 if (stat_data[File::kType] == File::kDoesNotExist) { | 575 if (stat_data[File::kType] == File::kDoesNotExist) { |
556 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 576 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
557 } else { | 577 } else { |
558 Dart_Handle returned_data = | 578 Dart_Handle returned_data = |
559 Dart_NewTypedData(Dart_TypedData_kInt64, File::kStatSize); | 579 Dart_NewTypedData(Dart_TypedData_kInt64, File::kStatSize); |
560 if (Dart_IsError(returned_data)) { | 580 if (Dart_IsError(returned_data)) { |
561 Dart_PropagateError(returned_data); | 581 Dart_PropagateError(returned_data); |
562 } | 582 } |
563 Dart_TypedData_Type data_type_unused; | 583 Dart_TypedData_Type data_type_unused; |
564 void* data_location; | 584 void* data_location; |
(...skipping 12 matching lines...) Expand all Loading... |
577 Dart_SetReturnValue(args, returned_data); | 597 Dart_SetReturnValue(args, returned_data); |
578 } | 598 } |
579 } else { | 599 } else { |
580 Dart_Handle err = DartUtils::NewDartArgumentError( | 600 Dart_Handle err = DartUtils::NewDartArgumentError( |
581 "Non-string argument to FileSystemEntity.stat"); | 601 "Non-string argument to FileSystemEntity.stat"); |
582 Dart_SetReturnValue(args, err); | 602 Dart_SetReturnValue(args, err); |
583 } | 603 } |
584 } | 604 } |
585 | 605 |
586 void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) { | 606 void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) { |
587 if (Dart_IsString(Dart_GetNativeArgument(args, 0)) && | 607 Namespace* namespc = Namespace::GetNamespace(args, 0); |
588 Dart_IsString(Dart_GetNativeArgument(args, 1))) { | 608 if (Dart_IsString(Dart_GetNativeArgument(args, 1)) && |
| 609 Dart_IsString(Dart_GetNativeArgument(args, 2))) { |
589 const char* path_1 = | 610 const char* path_1 = |
590 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); | 611 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
591 const char* path_2 = | 612 const char* path_2 = |
592 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); | 613 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2)); |
593 File::Identical result = File::AreIdentical(path_1, path_2); | 614 File::Identical result = File::AreIdentical(namespc, path_1, path_2); |
594 if (result == File::kError) { | 615 if (result == File::kError) { |
595 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 616 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
596 } else { | 617 } else { |
597 Dart_SetReturnValue(args, Dart_NewBoolean(result == File::kIdentical)); | 618 Dart_SetReturnValue(args, Dart_NewBoolean(result == File::kIdentical)); |
598 } | 619 } |
599 } else { | 620 } else { |
600 Dart_Handle err = DartUtils::NewDartArgumentError( | 621 Dart_Handle err = DartUtils::NewDartArgumentError( |
601 "Non-string argument to FileSystemEntity.identical"); | 622 "Non-string argument to FileSystemEntity.identical"); |
602 Dart_SetReturnValue(args, err); | 623 Dart_SetReturnValue(args, err); |
603 } | 624 } |
604 } | 625 } |
605 | 626 |
606 static int64_t CObjectInt32OrInt64ToInt64(CObject* cobject) { | 627 static int64_t CObjectInt32OrInt64ToInt64(CObject* cobject) { |
607 ASSERT(cobject->IsInt32OrInt64()); | 628 ASSERT(cobject->IsInt32OrInt64()); |
608 int64_t result; | 629 int64_t result; |
609 if (cobject->IsInt32()) { | 630 if (cobject->IsInt32()) { |
610 CObjectInt32 value(cobject); | 631 CObjectInt32 value(cobject); |
611 result = value.Value(); | 632 result = value.Value(); |
612 } else { | 633 } else { |
613 CObjectInt64 value(cobject); | 634 CObjectInt64 value(cobject); |
614 result = value.Value(); | 635 result = value.Value(); |
615 } | 636 } |
616 return result; | 637 return result; |
617 } | 638 } |
618 | 639 |
619 File* CObjectToFilePointer(CObject* cobject) { | 640 static File* CObjectToFilePointer(CObject* cobject) { |
620 CObjectIntptr value(cobject); | 641 CObjectIntptr value(cobject); |
621 return reinterpret_cast<File*>(value.Value()); | 642 return reinterpret_cast<File*>(value.Value()); |
622 } | 643 } |
623 | 644 |
| 645 static Namespace* CObjectToNamespacePointer(CObject* cobject) { |
| 646 CObjectIntptr value(cobject); |
| 647 return reinterpret_cast<Namespace*>(value.Value()); |
| 648 } |
| 649 |
624 CObject* File::ExistsRequest(const CObjectArray& request) { | 650 CObject* File::ExistsRequest(const CObjectArray& request) { |
625 if ((request.Length() == 1) && request[0]->IsString()) { | 651 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
626 CObjectString filename(request[0]); | 652 return CObject::IllegalArgumentError(); |
627 bool result = File::Exists(filename.CString()); | 653 } |
628 return CObject::Bool(result); | 654 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
629 } | 655 RefCntReleaseScope<Namespace> rs(namespc); |
630 return CObject::IllegalArgumentError(); | 656 if ((request.Length() != 2) || !request[1]->IsString()) { |
| 657 return CObject::IllegalArgumentError(); |
| 658 } |
| 659 CObjectString filename(request[1]); |
| 660 return CObject::Bool(File::Exists(namespc, filename.CString())); |
631 } | 661 } |
632 | 662 |
633 CObject* File::CreateRequest(const CObjectArray& request) { | 663 CObject* File::CreateRequest(const CObjectArray& request) { |
634 if ((request.Length() == 1) && request[0]->IsString()) { | 664 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
635 CObjectString filename(request[0]); | 665 return CObject::IllegalArgumentError(); |
636 bool result = File::Create(filename.CString()); | 666 } |
637 if (result) { | 667 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
638 return CObject::True(); | 668 RefCntReleaseScope<Namespace> rs(namespc); |
639 } else { | 669 if ((request.Length() != 2) || !request[1]->IsString()) { |
640 return CObject::NewOSError(); | 670 return CObject::IllegalArgumentError(); |
641 } | 671 } |
642 } | 672 CObjectString filename(request[1]); |
643 return CObject::IllegalArgumentError(); | 673 return File::Create(namespc, filename.CString()) ? CObject::True() |
| 674 : CObject::NewOSError(); |
644 } | 675 } |
645 | 676 |
646 CObject* File::OpenRequest(const CObjectArray& request) { | 677 CObject* File::OpenRequest(const CObjectArray& request) { |
647 File* file = NULL; | 678 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
648 if ((request.Length() == 2) && request[0]->IsString() && | 679 return CObject::IllegalArgumentError(); |
649 request[1]->IsInt32()) { | 680 } |
650 CObjectString filename(request[0]); | 681 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
651 CObjectInt32 mode(request[1]); | 682 RefCntReleaseScope<Namespace> rs(namespc); |
652 File::DartFileOpenMode dart_file_mode = | 683 if ((request.Length() != 3) || !request[1]->IsString() || |
653 static_cast<File::DartFileOpenMode>(mode.Value()); | 684 !request[2]->IsInt32()) { |
654 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); | 685 return CObject::IllegalArgumentError(); |
655 file = File::Open(filename.CString(), file_mode); | 686 } |
656 if (file != NULL) { | 687 CObjectString filename(request[1]); |
657 return new CObjectIntptr( | 688 CObjectInt32 mode(request[2]); |
658 CObject::NewIntptr(reinterpret_cast<intptr_t>(file))); | 689 File::DartFileOpenMode dart_file_mode = |
659 } else { | 690 static_cast<File::DartFileOpenMode>(mode.Value()); |
660 return CObject::NewOSError(); | 691 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); |
661 } | 692 File* file = File::Open(namespc, filename.CString(), file_mode); |
662 } | 693 if (file == NULL) { |
663 return CObject::IllegalArgumentError(); | 694 return CObject::NewOSError(); |
| 695 } |
| 696 return new CObjectIntptr( |
| 697 CObject::NewIntptr(reinterpret_cast<intptr_t>(file))); |
664 } | 698 } |
665 | 699 |
666 CObject* File::DeleteRequest(const CObjectArray& request) { | 700 CObject* File::DeleteRequest(const CObjectArray& request) { |
667 if ((request.Length() == 1) && request[0]->IsString()) { | 701 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
668 CObjectString filename(request[0]); | 702 return CObject::False(); |
669 bool result = File::Delete(filename.CString()); | 703 } |
670 if (result) { | 704 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
671 return CObject::True(); | 705 RefCntReleaseScope<Namespace> rs(namespc); |
672 } else { | 706 if ((request.Length() != 2) || !request[1]->IsString()) { |
673 return CObject::NewOSError(); | 707 return CObject::False(); |
674 } | 708 } |
675 } | 709 CObjectString filename(request[1]); |
676 return CObject::False(); | 710 return File::Delete(namespc, filename.CString()) ? CObject::True() |
| 711 : CObject::NewOSError(); |
677 } | 712 } |
678 | 713 |
679 CObject* File::RenameRequest(const CObjectArray& request) { | 714 CObject* File::RenameRequest(const CObjectArray& request) { |
680 if ((request.Length() == 2) && request[0]->IsString() && | 715 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
681 request[1]->IsString()) { | 716 return CObject::IllegalArgumentError(); |
682 CObjectString old_path(request[0]); | 717 } |
683 CObjectString new_path(request[1]); | 718 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
684 bool completed = File::Rename(old_path.CString(), new_path.CString()); | 719 RefCntReleaseScope<Namespace> rs(namespc); |
685 if (completed) { | 720 if ((request.Length() != 3) || !request[1]->IsString() || |
686 return CObject::True(); | 721 !request[2]->IsString()) { |
687 } | 722 return CObject::IllegalArgumentError(); |
688 return CObject::NewOSError(); | 723 } |
689 } | 724 CObjectString old_path(request[1]); |
690 return CObject::IllegalArgumentError(); | 725 CObjectString new_path(request[2]); |
| 726 return File::Rename(namespc, old_path.CString(), new_path.CString()) |
| 727 ? CObject::True() |
| 728 : CObject::NewOSError(); |
691 } | 729 } |
692 | 730 |
693 CObject* File::CopyRequest(const CObjectArray& request) { | 731 CObject* File::CopyRequest(const CObjectArray& request) { |
694 if ((request.Length() == 2) && request[0]->IsString() && | 732 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
695 request[1]->IsString()) { | 733 return CObject::IllegalArgumentError(); |
696 CObjectString old_path(request[0]); | 734 } |
697 CObjectString new_path(request[1]); | 735 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
698 bool completed = File::Copy(old_path.CString(), new_path.CString()); | 736 RefCntReleaseScope<Namespace> rs(namespc); |
699 if (completed) { | 737 if ((request.Length() != 3) || !request[1]->IsString() || |
700 return CObject::True(); | 738 !request[2]->IsString()) { |
701 } | 739 return CObject::IllegalArgumentError(); |
702 return CObject::NewOSError(); | 740 } |
703 } | 741 CObjectString old_path(request[1]); |
704 return CObject::IllegalArgumentError(); | 742 CObjectString new_path(request[2]); |
| 743 return File::Copy(namespc, old_path.CString(), new_path.CString()) |
| 744 ? CObject::True() |
| 745 : CObject::NewOSError(); |
705 } | 746 } |
706 | 747 |
707 CObject* File::ResolveSymbolicLinksRequest(const CObjectArray& request) { | 748 CObject* File::ResolveSymbolicLinksRequest(const CObjectArray& request) { |
708 if ((request.Length() == 1) && request[0]->IsString()) { | 749 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
709 CObjectString filename(request[0]); | 750 return CObject::IllegalArgumentError(); |
710 const char* result = File::GetCanonicalPath(filename.CString()); | 751 } |
711 if (result != NULL) { | 752 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
712 CObject* path = new CObjectString(CObject::NewString(result)); | 753 RefCntReleaseScope<Namespace> rs(namespc); |
713 return path; | 754 if ((request.Length() != 2) || !request[1]->IsString()) { |
714 } else { | 755 return CObject::IllegalArgumentError(); |
715 return CObject::NewOSError(); | 756 } |
716 } | 757 CObjectString filename(request[1]); |
717 } | 758 const char* result = File::GetCanonicalPath(namespc, filename.CString()); |
718 return CObject::IllegalArgumentError(); | 759 if (result == NULL) { |
| 760 return CObject::NewOSError(); |
| 761 } |
| 762 return new CObjectString(CObject::NewString(result)); |
719 } | 763 } |
720 | 764 |
721 CObject* File::CloseRequest(const CObjectArray& request) { | 765 CObject* File::CloseRequest(const CObjectArray& request) { |
722 intptr_t return_value = -1; | 766 if ((request.Length() != 1) || !request[0]->IsIntptr()) { |
723 if ((request.Length() == 1) && request[0]->IsIntptr()) { | 767 return new CObjectIntptr(CObject::NewIntptr(-1)); |
724 File* file = CObjectToFilePointer(request[0]); | 768 } |
725 RefCntReleaseScope<File> rs(file); | 769 File* file = CObjectToFilePointer(request[0]); |
726 return_value = 0; | 770 RefCntReleaseScope<File> rs(file); |
727 // We have retained a reference to the file here. Therefore the file's | 771 // We have retained a reference to the file here. Therefore the file's |
728 // destructor can't be running. Since no further requests are dispatched by | 772 // destructor can't be running. Since no further requests are dispatched by |
729 // the Dart code after an async close call, this Close() can't be racing | 773 // the Dart code after an async close call, this Close() can't be racing |
730 // with any other call on the file. We don't do an extra Release(), and we | 774 // with any other call on the file. We don't do an extra Release(), and we |
731 // don't delete the weak persistent handle. The file is closed here, but the | 775 // don't delete the weak persistent handle. The file is closed here, but the |
732 // memory will be cleaned up when the finalizer runs. | 776 // memory will be cleaned up when the finalizer runs. |
733 ASSERT(!file->IsClosed()); | 777 ASSERT(!file->IsClosed()); |
734 file->Close(); | 778 file->Close(); |
| 779 return new CObjectIntptr(CObject::NewIntptr(0)); |
| 780 } |
| 781 |
| 782 CObject* File::PositionRequest(const CObjectArray& request) { |
| 783 if ((request.Length() != 1) || !request[0]->IsIntptr()) { |
| 784 return CObject::IllegalArgumentError(); |
| 785 } |
| 786 File* file = CObjectToFilePointer(request[0]); |
| 787 RefCntReleaseScope<File> rs(file); |
| 788 if (file->IsClosed()) { |
| 789 return CObject::FileClosedError(); |
| 790 } |
| 791 const intptr_t return_value = file->Position(); |
| 792 if (return_value < 0) { |
| 793 return CObject::NewOSError(); |
735 } | 794 } |
736 return new CObjectIntptr(CObject::NewIntptr(return_value)); | 795 return new CObjectIntptr(CObject::NewIntptr(return_value)); |
737 } | 796 } |
738 | 797 |
739 CObject* File::PositionRequest(const CObjectArray& request) { | |
740 if ((request.Length() == 1) && request[0]->IsIntptr()) { | |
741 File* file = CObjectToFilePointer(request[0]); | |
742 RefCntReleaseScope<File> rs(file); | |
743 if (!file->IsClosed()) { | |
744 intptr_t return_value = file->Position(); | |
745 if (return_value >= 0) { | |
746 return new CObjectIntptr(CObject::NewIntptr(return_value)); | |
747 } else { | |
748 return CObject::NewOSError(); | |
749 } | |
750 } else { | |
751 return CObject::FileClosedError(); | |
752 } | |
753 } | |
754 return CObject::IllegalArgumentError(); | |
755 } | |
756 | |
757 CObject* File::SetPositionRequest(const CObjectArray& request) { | 798 CObject* File::SetPositionRequest(const CObjectArray& request) { |
758 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 799 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
759 File* file = CObjectToFilePointer(request[0]); | 800 return CObject::IllegalArgumentError(); |
760 RefCntReleaseScope<File> rs(file); | 801 } |
761 if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) { | 802 File* file = CObjectToFilePointer(request[0]); |
762 if (!file->IsClosed()) { | 803 RefCntReleaseScope<File> rs(file); |
763 int64_t position = CObjectInt32OrInt64ToInt64(request[1]); | 804 if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) { |
764 if (file->SetPosition(position)) { | 805 return CObject::IllegalArgumentError(); |
765 return CObject::True(); | 806 } |
766 } else { | 807 if (file->IsClosed()) { |
767 return CObject::NewOSError(); | 808 return CObject::FileClosedError(); |
768 } | 809 } |
769 } else { | 810 const int64_t position = CObjectInt32OrInt64ToInt64(request[1]); |
770 return CObject::FileClosedError(); | 811 return file->SetPosition(position) ? CObject::True() : CObject::NewOSError(); |
771 } | |
772 } else { | |
773 return CObject::IllegalArgumentError(); | |
774 } | |
775 } | |
776 return CObject::IllegalArgumentError(); | |
777 } | 812 } |
778 | 813 |
779 CObject* File::TruncateRequest(const CObjectArray& request) { | 814 CObject* File::TruncateRequest(const CObjectArray& request) { |
780 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 815 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
781 File* file = CObjectToFilePointer(request[0]); | 816 return CObject::IllegalArgumentError(); |
782 RefCntReleaseScope<File> rs(file); | 817 } |
783 if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) { | 818 File* file = CObjectToFilePointer(request[0]); |
784 if (!file->IsClosed()) { | 819 RefCntReleaseScope<File> rs(file); |
785 int64_t length = CObjectInt32OrInt64ToInt64(request[1]); | 820 if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) { |
786 if (file->Truncate(length)) { | 821 return CObject::IllegalArgumentError(); |
787 return CObject::True(); | 822 } |
788 } else { | 823 if (file->IsClosed()) { |
789 return CObject::NewOSError(); | 824 return CObject::FileClosedError(); |
790 } | 825 } |
791 } else { | 826 const int64_t length = CObjectInt32OrInt64ToInt64(request[1]); |
792 return CObject::FileClosedError(); | 827 if (file->Truncate(length)) { |
793 } | 828 return CObject::True(); |
794 } else { | 829 } |
795 return CObject::IllegalArgumentError(); | 830 return CObject::NewOSError(); |
796 } | |
797 } | |
798 return CObject::IllegalArgumentError(); | |
799 } | 831 } |
800 | 832 |
801 CObject* File::LengthRequest(const CObjectArray& request) { | 833 CObject* File::LengthRequest(const CObjectArray& request) { |
802 if ((request.Length() == 1) && request[0]->IsIntptr()) { | 834 if ((request.Length() != 1) || !request[0]->IsIntptr()) { |
803 File* file = CObjectToFilePointer(request[0]); | 835 return CObject::IllegalArgumentError(); |
804 RefCntReleaseScope<File> rs(file); | 836 } |
805 if (!file->IsClosed()) { | 837 File* file = CObjectToFilePointer(request[0]); |
806 int64_t return_value = file->Length(); | 838 RefCntReleaseScope<File> rs(file); |
807 if (return_value >= 0) { | 839 if (file->IsClosed()) { |
808 return new CObjectInt64(CObject::NewInt64(return_value)); | 840 return CObject::FileClosedError(); |
809 } else { | 841 } |
810 return CObject::NewOSError(); | 842 const int64_t return_value = file->Length(); |
811 } | 843 if (return_value < 0) { |
812 } else { | 844 return CObject::NewOSError(); |
813 return CObject::FileClosedError(); | 845 } |
814 } | 846 return new CObjectInt64(CObject::NewInt64(return_value)); |
815 } | |
816 return CObject::IllegalArgumentError(); | |
817 } | 847 } |
818 | 848 |
819 CObject* File::LengthFromPathRequest(const CObjectArray& request) { | 849 CObject* File::LengthFromPathRequest(const CObjectArray& request) { |
820 if ((request.Length() == 1) && request[0]->IsString()) { | 850 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
821 CObjectString filepath(request[0]); | 851 return CObject::IllegalArgumentError(); |
822 int64_t return_value = File::LengthFromPath(filepath.CString()); | 852 } |
823 if (return_value >= 0) { | 853 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
824 return new CObjectInt64(CObject::NewInt64(return_value)); | 854 RefCntReleaseScope<Namespace> rs(namespc); |
825 } else { | 855 if ((request.Length() != 2) || !request[1]->IsString()) { |
826 return CObject::NewOSError(); | 856 return CObject::IllegalArgumentError(); |
827 } | 857 } |
828 } | 858 CObjectString filepath(request[1]); |
829 return CObject::IllegalArgumentError(); | 859 const int64_t return_value = |
| 860 File::LengthFromPath(namespc, filepath.CString()); |
| 861 if (return_value < 0) { |
| 862 return CObject::NewOSError(); |
| 863 } |
| 864 return new CObjectInt64(CObject::NewInt64(return_value)); |
830 } | 865 } |
831 | 866 |
832 CObject* File::LastAccessedRequest(const CObjectArray& request) { | 867 CObject* File::LastAccessedRequest(const CObjectArray& request) { |
833 if ((request.Length() == 1) && request[0]->IsString()) { | 868 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
834 CObjectString filepath(request[0]); | 869 return CObject::IllegalArgumentError(); |
835 int64_t return_value = File::LastAccessed(filepath.CString()); | 870 } |
836 if (return_value >= 0) { | 871 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
837 return new CObjectIntptr( | 872 RefCntReleaseScope<Namespace> rs(namespc); |
838 CObject::NewInt64(return_value * kMillisecondsPerSecond)); | 873 if ((request.Length() != 2) || !request[1]->IsString()) { |
839 } else { | 874 return CObject::IllegalArgumentError(); |
840 return CObject::NewOSError(); | 875 } |
841 } | 876 CObjectString filepath(request[1]); |
842 } | 877 const int64_t return_value = File::LastAccessed(namespc, filepath.CString()); |
843 return CObject::IllegalArgumentError(); | 878 if (return_value < 0) { |
| 879 return CObject::NewOSError(); |
| 880 } |
| 881 return new CObjectIntptr( |
| 882 CObject::NewInt64(return_value * kMillisecondsPerSecond)); |
844 } | 883 } |
845 | 884 |
846 CObject* File::SetLastAccessedRequest(const CObjectArray& request) { | 885 CObject* File::SetLastAccessedRequest(const CObjectArray& request) { |
847 if ((request.Length() == 2) && request[0]->IsString() && | 886 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
848 request[1]->IsInt32OrInt64()) { | 887 return CObject::IllegalArgumentError(); |
849 CObjectString filepath(request[0]); | 888 } |
850 const int64_t millis = CObjectInt32OrInt64ToInt64(request[1]); | 889 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
851 if (File::SetLastAccessed(filepath.CString(), millis)) { | 890 RefCntReleaseScope<Namespace> rs(namespc); |
852 return CObject::Null(); | 891 if ((request.Length() != 3) || !request[1]->IsString() || |
853 } else { | 892 !request[2]->IsInt32OrInt64()) { |
854 return CObject::NewOSError(); | 893 return CObject::IllegalArgumentError(); |
855 } | 894 } |
856 } | 895 CObjectString filepath(request[1]); |
857 return CObject::IllegalArgumentError(); | 896 const int64_t millis = CObjectInt32OrInt64ToInt64(request[2]); |
| 897 return File::SetLastAccessed(namespc, filepath.CString(), millis) |
| 898 ? CObject::Null() |
| 899 : CObject::NewOSError(); |
858 } | 900 } |
859 | 901 |
860 CObject* File::LastModifiedRequest(const CObjectArray& request) { | 902 CObject* File::LastModifiedRequest(const CObjectArray& request) { |
861 if ((request.Length() == 1) && request[0]->IsString()) { | 903 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
862 CObjectString filepath(request[0]); | 904 return CObject::IllegalArgumentError(); |
863 int64_t return_value = File::LastModified(filepath.CString()); | 905 } |
864 if (return_value >= 0) { | 906 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
865 return new CObjectIntptr( | 907 RefCntReleaseScope<Namespace> rs(namespc); |
866 CObject::NewInt64(return_value * kMillisecondsPerSecond)); | 908 if ((request.Length() != 2) || !request[1]->IsString()) { |
867 } else { | 909 return CObject::IllegalArgumentError(); |
868 return CObject::NewOSError(); | 910 } |
869 } | 911 CObjectString filepath(request[1]); |
870 } | 912 const int64_t return_value = File::LastModified(namespc, filepath.CString()); |
871 return CObject::IllegalArgumentError(); | 913 if (return_value < 0) { |
| 914 return CObject::NewOSError(); |
| 915 } |
| 916 return new CObjectIntptr( |
| 917 CObject::NewInt64(return_value * kMillisecondsPerSecond)); |
872 } | 918 } |
873 | 919 |
874 CObject* File::SetLastModifiedRequest(const CObjectArray& request) { | 920 CObject* File::SetLastModifiedRequest(const CObjectArray& request) { |
875 if ((request.Length() == 2) && request[0]->IsString() && | 921 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
876 request[1]->IsInt32OrInt64()) { | 922 return CObject::IllegalArgumentError(); |
877 CObjectString filepath(request[0]); | 923 } |
878 const int64_t millis = CObjectInt32OrInt64ToInt64(request[1]); | 924 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
879 if (File::SetLastModified(filepath.CString(), millis)) { | 925 RefCntReleaseScope<Namespace> rs(namespc); |
880 return CObject::Null(); | 926 if ((request.Length() != 3) || !request[1]->IsString() || |
881 } else { | 927 !request[2]->IsInt32OrInt64()) { |
882 return CObject::NewOSError(); | 928 return CObject::IllegalArgumentError(); |
883 } | 929 } |
884 } | 930 CObjectString filepath(request[1]); |
885 return CObject::IllegalArgumentError(); | 931 const int64_t millis = CObjectInt32OrInt64ToInt64(request[2]); |
| 932 return File::SetLastModified(namespc, filepath.CString(), millis) |
| 933 ? CObject::Null() |
| 934 : CObject::NewOSError(); |
886 } | 935 } |
887 | 936 |
888 CObject* File::FlushRequest(const CObjectArray& request) { | 937 CObject* File::FlushRequest(const CObjectArray& request) { |
889 if ((request.Length() == 1) && request[0]->IsIntptr()) { | 938 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
890 File* file = CObjectToFilePointer(request[0]); | 939 return CObject::IllegalArgumentError(); |
891 RefCntReleaseScope<File> rs(file); | 940 } |
892 if (!file->IsClosed()) { | 941 File* file = CObjectToFilePointer(request[0]); |
893 if (file->Flush()) { | 942 RefCntReleaseScope<File> rs(file); |
894 return CObject::True(); | 943 if (file->IsClosed()) { |
895 } else { | 944 return CObject::FileClosedError(); |
896 return CObject::NewOSError(); | 945 } |
897 } | 946 return file->Flush() ? CObject::True() : CObject::NewOSError(); |
898 } else { | |
899 return CObject::FileClosedError(); | |
900 } | |
901 } | |
902 return CObject::IllegalArgumentError(); | |
903 } | 947 } |
904 | 948 |
905 CObject* File::ReadByteRequest(const CObjectArray& request) { | 949 CObject* File::ReadByteRequest(const CObjectArray& request) { |
906 if ((request.Length() == 1) && request[0]->IsIntptr()) { | 950 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
907 File* file = CObjectToFilePointer(request[0]); | 951 return CObject::IllegalArgumentError(); |
908 RefCntReleaseScope<File> rs(file); | 952 } |
909 if (!file->IsClosed()) { | 953 File* file = CObjectToFilePointer(request[0]); |
910 uint8_t buffer; | 954 RefCntReleaseScope<File> rs(file); |
911 int64_t bytes_read = file->Read(reinterpret_cast<void*>(&buffer), 1); | 955 if (file->IsClosed()) { |
912 if (bytes_read > 0) { | 956 return CObject::FileClosedError(); |
913 return new CObjectIntptr(CObject::NewIntptr(buffer)); | 957 } |
914 } else if (bytes_read == 0) { | 958 uint8_t buffer; |
915 return new CObjectIntptr(CObject::NewIntptr(-1)); | 959 const int64_t bytes_read = file->Read(reinterpret_cast<void*>(&buffer), 1); |
916 } else { | 960 if (bytes_read < 0) { |
917 return CObject::NewOSError(); | 961 return CObject::NewOSError(); |
918 } | 962 } |
919 } else { | 963 if (bytes_read == 0) { |
920 return CObject::FileClosedError(); | 964 return new CObjectIntptr(CObject::NewIntptr(-1)); |
921 } | 965 } |
922 } | 966 return new CObjectIntptr(CObject::NewIntptr(buffer)); |
923 return CObject::IllegalArgumentError(); | |
924 } | 967 } |
925 | 968 |
926 CObject* File::WriteByteRequest(const CObjectArray& request) { | 969 CObject* File::WriteByteRequest(const CObjectArray& request) { |
927 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 970 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
928 File* file = CObjectToFilePointer(request[0]); | 971 return CObject::IllegalArgumentError(); |
929 RefCntReleaseScope<File> rs(file); | 972 } |
930 if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) { | 973 File* file = CObjectToFilePointer(request[0]); |
931 if (!file->IsClosed()) { | 974 RefCntReleaseScope<File> rs(file); |
932 int64_t byte = CObjectInt32OrInt64ToInt64(request[1]); | 975 if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) { |
933 uint8_t buffer = static_cast<uint8_t>(byte & 0xff); | 976 return CObject::IllegalArgumentError(); |
934 bool success = file->WriteFully(reinterpret_cast<void*>(&buffer), 1); | 977 } |
935 if (success) { | 978 if (file->IsClosed()) { |
936 return new CObjectInt64(CObject::NewInt64(1)); | 979 return CObject::FileClosedError(); |
937 } else { | 980 } |
938 return CObject::NewOSError(); | 981 const int64_t byte = CObjectInt32OrInt64ToInt64(request[1]); |
939 } | 982 uint8_t buffer = static_cast<uint8_t>(byte & 0xff); |
940 } else { | 983 return file->WriteFully(reinterpret_cast<void*>(&buffer), 1) |
941 return CObject::FileClosedError(); | 984 ? new CObjectInt64(CObject::NewInt64(1)) |
942 } | 985 : CObject::NewOSError(); |
943 } else { | |
944 return CObject::IllegalArgumentError(); | |
945 } | |
946 } | |
947 return CObject::IllegalArgumentError(); | |
948 } | 986 } |
949 | 987 |
950 CObject* File::ReadRequest(const CObjectArray& request) { | 988 CObject* File::ReadRequest(const CObjectArray& request) { |
951 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 989 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
952 File* file = CObjectToFilePointer(request[0]); | 990 return CObject::IllegalArgumentError(); |
953 RefCntReleaseScope<File> rs(file); | 991 } |
954 if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) { | 992 File* file = CObjectToFilePointer(request[0]); |
955 if (!file->IsClosed()) { | 993 RefCntReleaseScope<File> rs(file); |
956 int64_t length = CObjectInt32OrInt64ToInt64(request[1]); | 994 if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) { |
957 Dart_CObject* io_buffer = CObject::NewIOBuffer(length); | 995 return CObject::IllegalArgumentError(); |
958 ASSERT(io_buffer != NULL); | 996 } |
959 uint8_t* data = io_buffer->value.as_external_typed_data.data; | 997 if (file->IsClosed()) { |
960 int64_t bytes_read = file->Read(data, length); | 998 return CObject::FileClosedError(); |
961 if (bytes_read >= 0) { | 999 } |
962 CObjectExternalUint8Array* external_array = | 1000 const int64_t length = CObjectInt32OrInt64ToInt64(request[1]); |
963 new CObjectExternalUint8Array(io_buffer); | 1001 Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
964 external_array->SetLength(bytes_read); | 1002 ASSERT(io_buffer != NULL); |
965 CObjectArray* result = new CObjectArray(CObject::NewArray(2)); | 1003 uint8_t* data = io_buffer->value.as_external_typed_data.data; |
966 result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0))); | 1004 const int64_t bytes_read = file->Read(data, length); |
967 result->SetAt(1, external_array); | 1005 if (bytes_read < 0) { |
968 return result; | 1006 CObject::FreeIOBufferData(io_buffer); |
969 } else { | 1007 return CObject::NewOSError(); |
970 CObject::FreeIOBufferData(io_buffer); | 1008 } |
971 return CObject::NewOSError(); | 1009 CObjectExternalUint8Array* external_array = |
972 } | 1010 new CObjectExternalUint8Array(io_buffer); |
973 } else { | 1011 external_array->SetLength(bytes_read); |
974 return CObject::FileClosedError(); | 1012 CObjectArray* result = new CObjectArray(CObject::NewArray(2)); |
975 } | 1013 result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0))); |
976 } else { | 1014 result->SetAt(1, external_array); |
977 return CObject::IllegalArgumentError(); | 1015 return result; |
978 } | |
979 } | |
980 return CObject::IllegalArgumentError(); | |
981 } | 1016 } |
982 | 1017 |
983 CObject* File::ReadIntoRequest(const CObjectArray& request) { | 1018 CObject* File::ReadIntoRequest(const CObjectArray& request) { |
984 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 1019 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
985 File* file = CObjectToFilePointer(request[0]); | 1020 return CObject::IllegalArgumentError(); |
986 RefCntReleaseScope<File> rs(file); | 1021 } |
987 if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) { | 1022 File* file = CObjectToFilePointer(request[0]); |
988 if (!file->IsClosed()) { | 1023 RefCntReleaseScope<File> rs(file); |
989 int64_t length = CObjectInt32OrInt64ToInt64(request[1]); | 1024 if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) { |
990 Dart_CObject* io_buffer = CObject::NewIOBuffer(length); | 1025 return CObject::IllegalArgumentError(); |
991 ASSERT(io_buffer != NULL); | 1026 } |
992 uint8_t* data = io_buffer->value.as_external_typed_data.data; | 1027 if (file->IsClosed()) { |
993 int64_t bytes_read = file->Read(data, length); | 1028 return CObject::FileClosedError(); |
994 if (bytes_read >= 0) { | 1029 } |
995 CObjectExternalUint8Array* external_array = | 1030 const int64_t length = CObjectInt32OrInt64ToInt64(request[1]); |
996 new CObjectExternalUint8Array(io_buffer); | 1031 Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
997 external_array->SetLength(bytes_read); | 1032 ASSERT(io_buffer != NULL); |
998 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); | 1033 uint8_t* data = io_buffer->value.as_external_typed_data.data; |
999 result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0))); | 1034 const int64_t bytes_read = file->Read(data, length); |
1000 result->SetAt(1, new CObjectInt64(CObject::NewInt64(bytes_read))); | 1035 if (bytes_read < 0) { |
1001 result->SetAt(2, external_array); | 1036 CObject::FreeIOBufferData(io_buffer); |
1002 return result; | 1037 return CObject::NewOSError(); |
1003 } else { | 1038 } |
1004 CObject::FreeIOBufferData(io_buffer); | 1039 CObjectExternalUint8Array* external_array = |
1005 return CObject::NewOSError(); | 1040 new CObjectExternalUint8Array(io_buffer); |
1006 } | 1041 external_array->SetLength(bytes_read); |
1007 } else { | 1042 CObjectArray* result = new CObjectArray(CObject::NewArray(3)); |
1008 return CObject::FileClosedError(); | 1043 result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0))); |
1009 } | 1044 result->SetAt(1, new CObjectInt64(CObject::NewInt64(bytes_read))); |
1010 } else { | 1045 result->SetAt(2, external_array); |
1011 return CObject::IllegalArgumentError(); | 1046 return result; |
1012 } | |
1013 } | |
1014 return CObject::IllegalArgumentError(); | |
1015 } | 1047 } |
1016 | 1048 |
1017 static int SizeInBytes(Dart_TypedData_Type type) { | 1049 static int SizeInBytes(Dart_TypedData_Type type) { |
1018 switch (type) { | 1050 switch (type) { |
1019 case Dart_TypedData_kInt8: | 1051 case Dart_TypedData_kInt8: |
1020 case Dart_TypedData_kUint8: | 1052 case Dart_TypedData_kUint8: |
1021 case Dart_TypedData_kUint8Clamped: | 1053 case Dart_TypedData_kUint8Clamped: |
1022 return 1; | 1054 return 1; |
1023 case Dart_TypedData_kInt16: | 1055 case Dart_TypedData_kInt16: |
1024 case Dart_TypedData_kUint16: | 1056 case Dart_TypedData_kUint16: |
1025 return 2; | 1057 return 2; |
1026 case Dart_TypedData_kInt32: | 1058 case Dart_TypedData_kInt32: |
1027 case Dart_TypedData_kUint32: | 1059 case Dart_TypedData_kUint32: |
1028 case Dart_TypedData_kFloat32: | 1060 case Dart_TypedData_kFloat32: |
1029 return 4; | 1061 return 4; |
1030 case Dart_TypedData_kInt64: | 1062 case Dart_TypedData_kInt64: |
1031 case Dart_TypedData_kUint64: | 1063 case Dart_TypedData_kUint64: |
1032 case Dart_TypedData_kFloat64: | 1064 case Dart_TypedData_kFloat64: |
1033 return 8; | 1065 return 8; |
1034 default: | 1066 default: |
1035 break; | 1067 break; |
1036 } | 1068 } |
1037 UNREACHABLE(); | 1069 UNREACHABLE(); |
1038 return -1; | 1070 return -1; |
1039 } | 1071 } |
1040 | 1072 |
1041 CObject* File::WriteFromRequest(const CObjectArray& request) { | 1073 CObject* File::WriteFromRequest(const CObjectArray& request) { |
1042 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 1074 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
1043 File* file = CObjectToFilePointer(request[0]); | 1075 return CObject::IllegalArgumentError(); |
1044 RefCntReleaseScope<File> rs(file); | 1076 } |
1045 if ((request.Length() == 4) && | 1077 File* file = CObjectToFilePointer(request[0]); |
1046 (request[1]->IsTypedData() || request[1]->IsArray()) && | 1078 RefCntReleaseScope<File> rs(file); |
1047 request[2]->IsInt32OrInt64() && request[3]->IsInt32OrInt64()) { | 1079 if ((request.Length() != 4) || |
1048 if (!file->IsClosed()) { | 1080 (!request[1]->IsTypedData() && !request[1]->IsArray()) || |
1049 int64_t start = CObjectInt32OrInt64ToInt64(request[2]); | 1081 !request[2]->IsInt32OrInt64() || !request[3]->IsInt32OrInt64()) { |
1050 int64_t end = CObjectInt32OrInt64ToInt64(request[3]); | 1082 return CObject::IllegalArgumentError(); |
1051 int64_t length = end - start; | 1083 } |
1052 uint8_t* buffer_start; | 1084 if (file->IsClosed()) { |
1053 if (request[1]->IsTypedData()) { | 1085 return CObject::FileClosedError(); |
1054 CObjectTypedData typed_data(request[1]); | 1086 } |
1055 start = start * SizeInBytes(typed_data.Type()); | 1087 int64_t start = CObjectInt32OrInt64ToInt64(request[2]); |
1056 length = length * SizeInBytes(typed_data.Type()); | 1088 int64_t end = CObjectInt32OrInt64ToInt64(request[3]); |
1057 buffer_start = typed_data.Buffer() + start; | 1089 int64_t length = end - start; |
1058 } else { | 1090 uint8_t* buffer_start; |
1059 CObjectArray array(request[1]); | 1091 if (request[1]->IsTypedData()) { |
1060 buffer_start = Dart_ScopeAllocate(length); | 1092 CObjectTypedData typed_data(request[1]); |
1061 for (int i = 0; i < length; i++) { | 1093 start = start * SizeInBytes(typed_data.Type()); |
1062 if (array[i + start]->IsInt32OrInt64()) { | 1094 length = length * SizeInBytes(typed_data.Type()); |
1063 int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]); | 1095 buffer_start = typed_data.Buffer() + start; |
1064 buffer_start[i] = static_cast<uint8_t>(value & 0xFF); | 1096 } else { |
1065 } else { | 1097 CObjectArray array(request[1]); |
1066 // Unsupported type. | 1098 buffer_start = Dart_ScopeAllocate(length); |
1067 return CObject::IllegalArgumentError(); | 1099 for (int i = 0; i < length; i++) { |
1068 } | 1100 if (array[i + start]->IsInt32OrInt64()) { |
1069 } | 1101 int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]); |
1070 start = 0; | 1102 buffer_start[i] = static_cast<uint8_t>(value & 0xFF); |
1071 } | |
1072 bool success = | |
1073 file->WriteFully(reinterpret_cast<void*>(buffer_start), length); | |
1074 if (success) { | |
1075 return new CObjectInt64(CObject::NewInt64(length)); | |
1076 } else { | |
1077 return CObject::NewOSError(); | |
1078 } | |
1079 } else { | 1103 } else { |
1080 return CObject::FileClosedError(); | 1104 // Unsupported type. |
| 1105 return CObject::IllegalArgumentError(); |
1081 } | 1106 } |
1082 } else { | |
1083 return CObject::IllegalArgumentError(); | |
1084 } | 1107 } |
| 1108 start = 0; |
1085 } | 1109 } |
1086 return CObject::IllegalArgumentError(); | 1110 return file->WriteFully(reinterpret_cast<void*>(buffer_start), length) |
| 1111 ? new CObjectInt64(CObject::NewInt64(length)) |
| 1112 : CObject::NewOSError(); |
1087 } | 1113 } |
1088 | 1114 |
1089 CObject* File::CreateLinkRequest(const CObjectArray& request) { | 1115 CObject* File::CreateLinkRequest(const CObjectArray& request) { |
1090 if ((request.Length() != 2) || !request[0]->IsString() || | 1116 if ((request.Length() != 3) || !request[0]->IsIntptr()) { |
1091 !request[1]->IsString()) { | |
1092 return CObject::IllegalArgumentError(); | 1117 return CObject::IllegalArgumentError(); |
1093 } | 1118 } |
1094 CObjectString link_name(request[0]); | 1119 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
1095 CObjectString target_name(request[1]); | 1120 RefCntReleaseScope<Namespace> rs(namespc); |
1096 if (File::CreateLink(link_name.CString(), target_name.CString())) { | 1121 if (!request[1]->IsString() || !request[2]->IsString()) { |
1097 return CObject::True(); | 1122 return CObject::IllegalArgumentError(); |
1098 } else { | |
1099 return CObject::NewOSError(); | |
1100 } | 1123 } |
| 1124 CObjectString link_name(request[1]); |
| 1125 CObjectString target_name(request[2]); |
| 1126 return File::CreateLink(namespc, link_name.CString(), target_name.CString()) |
| 1127 ? CObject::True() |
| 1128 : CObject::NewOSError(); |
1101 } | 1129 } |
1102 | 1130 |
1103 CObject* File::DeleteLinkRequest(const CObjectArray& request) { | 1131 CObject* File::DeleteLinkRequest(const CObjectArray& request) { |
1104 if ((request.Length() == 1) && request[0]->IsString()) { | 1132 if ((request.Length() != 2) || !request[0]->IsIntptr()) { |
1105 CObjectString link_path(request[0]); | 1133 return CObject::IllegalArgumentError(); |
1106 bool result = File::DeleteLink(link_path.CString()); | |
1107 if (result) { | |
1108 return CObject::True(); | |
1109 } else { | |
1110 return CObject::NewOSError(); | |
1111 } | |
1112 } | 1134 } |
1113 return CObject::IllegalArgumentError(); | 1135 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1136 RefCntReleaseScope<Namespace> rs(namespc); |
| 1137 if (!request[1]->IsString()) { |
| 1138 return CObject::IllegalArgumentError(); |
| 1139 } |
| 1140 CObjectString link_path(request[1]); |
| 1141 return File::DeleteLink(namespc, link_path.CString()) ? CObject::True() |
| 1142 : CObject::NewOSError(); |
1114 } | 1143 } |
1115 | 1144 |
1116 CObject* File::RenameLinkRequest(const CObjectArray& request) { | 1145 CObject* File::RenameLinkRequest(const CObjectArray& request) { |
1117 if ((request.Length() == 2) && request[0]->IsString() && | 1146 if ((request.Length() != 3) || !request[0]->IsIntptr()) { |
1118 request[1]->IsString()) { | 1147 return CObject::IllegalArgumentError(); |
1119 CObjectString old_path(request[0]); | |
1120 CObjectString new_path(request[1]); | |
1121 bool completed = File::RenameLink(old_path.CString(), new_path.CString()); | |
1122 if (completed) { | |
1123 return CObject::True(); | |
1124 } | |
1125 return CObject::NewOSError(); | |
1126 } | 1148 } |
1127 return CObject::IllegalArgumentError(); | 1149 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1150 RefCntReleaseScope<Namespace> rs(namespc); |
| 1151 if (!request[1]->IsString() || !request[2]->IsString()) { |
| 1152 return CObject::IllegalArgumentError(); |
| 1153 } |
| 1154 CObjectString old_path(request[1]); |
| 1155 CObjectString new_path(request[2]); |
| 1156 return File::RenameLink(namespc, old_path.CString(), new_path.CString()) |
| 1157 ? CObject::True() |
| 1158 : CObject::NewOSError(); |
1128 } | 1159 } |
1129 | 1160 |
1130 CObject* File::LinkTargetRequest(const CObjectArray& request) { | 1161 CObject* File::LinkTargetRequest(const CObjectArray& request) { |
1131 if ((request.Length() == 1) && request[0]->IsString()) { | 1162 if ((request.Length() != 2) || !request[0]->IsIntptr()) { |
1132 CObjectString link_path(request[0]); | 1163 return CObject::IllegalArgumentError(); |
1133 const char* target = File::LinkTarget(link_path.CString()); | |
1134 if (target != NULL) { | |
1135 CObject* result = new CObjectString(CObject::NewString(target)); | |
1136 return result; | |
1137 } else { | |
1138 return CObject::NewOSError(); | |
1139 } | |
1140 } | 1164 } |
1141 return CObject::IllegalArgumentError(); | 1165 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1166 RefCntReleaseScope<Namespace> rs(namespc); |
| 1167 if (!request[1]->IsString()) { |
| 1168 return CObject::IllegalArgumentError(); |
| 1169 } |
| 1170 CObjectString link_path(request[1]); |
| 1171 const char* target = File::LinkTarget(namespc, link_path.CString()); |
| 1172 if (target == NULL) { |
| 1173 return CObject::NewOSError(); |
| 1174 } |
| 1175 return new CObjectString(CObject::NewString(target)); |
1142 } | 1176 } |
1143 | 1177 |
1144 CObject* File::TypeRequest(const CObjectArray& request) { | 1178 CObject* File::TypeRequest(const CObjectArray& request) { |
1145 if ((request.Length() == 2) && request[0]->IsString() && | 1179 if ((request.Length() != 3) || !request[0]->IsIntptr()) { |
1146 request[1]->IsBool()) { | 1180 return CObject::IllegalArgumentError(); |
1147 CObjectString path(request[0]); | |
1148 CObjectBool follow_links(request[1]); | |
1149 File::Type type = File::GetType(path.CString(), follow_links.Value()); | |
1150 return new CObjectInt32(CObject::NewInt32(type)); | |
1151 } | 1181 } |
1152 return CObject::IllegalArgumentError(); | 1182 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1183 RefCntReleaseScope<Namespace> rs(namespc); |
| 1184 if (!request[1]->IsString() || !request[2]->IsBool()) { |
| 1185 return CObject::IllegalArgumentError(); |
| 1186 } |
| 1187 CObjectString path(request[1]); |
| 1188 CObjectBool follow_links(request[2]); |
| 1189 File::Type type = |
| 1190 File::GetType(namespc, path.CString(), follow_links.Value()); |
| 1191 return new CObjectInt32(CObject::NewInt32(type)); |
1153 } | 1192 } |
1154 | 1193 |
1155 CObject* File::IdenticalRequest(const CObjectArray& request) { | 1194 CObject* File::IdenticalRequest(const CObjectArray& request) { |
1156 if ((request.Length() == 2) && request[0]->IsString() && | 1195 if ((request.Length() != 3) || !request[0]->IsIntptr()) { |
1157 request[1]->IsString()) { | 1196 return CObject::IllegalArgumentError(); |
1158 CObjectString path1(request[0]); | |
1159 CObjectString path2(request[1]); | |
1160 File::Identical result = | |
1161 File::AreIdentical(path1.CString(), path2.CString()); | |
1162 if (result == File::kError) { | |
1163 return CObject::NewOSError(); | |
1164 } else if (result == File::kIdentical) { | |
1165 return CObject::True(); | |
1166 } else { | |
1167 return CObject::False(); | |
1168 } | |
1169 } | 1197 } |
1170 return CObject::IllegalArgumentError(); | 1198 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1199 RefCntReleaseScope<Namespace> rs(namespc); |
| 1200 if (!request[1]->IsString() || !request[2]->IsString()) { |
| 1201 return CObject::IllegalArgumentError(); |
| 1202 } |
| 1203 CObjectString path1(request[1]); |
| 1204 CObjectString path2(request[2]); |
| 1205 File::Identical result = |
| 1206 File::AreIdentical(namespc, path1.CString(), path2.CString()); |
| 1207 if (result == File::kError) { |
| 1208 return CObject::NewOSError(); |
| 1209 } |
| 1210 return (result == File::kIdentical) ? CObject::True() : CObject::False(); |
1171 } | 1211 } |
1172 | 1212 |
1173 CObject* File::StatRequest(const CObjectArray& request) { | 1213 CObject* File::StatRequest(const CObjectArray& request) { |
1174 if ((request.Length() == 1) && request[0]->IsString()) { | 1214 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
1175 int64_t data[File::kStatSize]; | 1215 return CObject::IllegalArgumentError(); |
1176 CObjectString path(request[0]); | |
1177 File::Stat(path.CString(), data); | |
1178 if (data[File::kType] == File::kDoesNotExist) { | |
1179 return CObject::NewOSError(); | |
1180 } | |
1181 CObjectArray* result = new CObjectArray(CObject::NewArray(File::kStatSize)); | |
1182 for (int i = 0; i < File::kStatSize; ++i) { | |
1183 result->SetAt(i, new CObjectInt64(CObject::NewInt64(data[i]))); | |
1184 } | |
1185 CObjectArray* wrapper = new CObjectArray(CObject::NewArray(2)); | |
1186 wrapper->SetAt(0, new CObjectInt32(CObject::NewInt32(CObject::kSuccess))); | |
1187 wrapper->SetAt(1, result); | |
1188 return wrapper; | |
1189 } | 1216 } |
1190 return CObject::IllegalArgumentError(); | 1217 Namespace* namespc = CObjectToNamespacePointer(request[0]); |
| 1218 RefCntReleaseScope<Namespace> rs(namespc); |
| 1219 if ((request.Length() != 2) || !request[1]->IsString()) { |
| 1220 return CObject::IllegalArgumentError(); |
| 1221 } |
| 1222 int64_t data[File::kStatSize]; |
| 1223 CObjectString path(request[1]); |
| 1224 File::Stat(namespc, path.CString(), data); |
| 1225 if (data[File::kType] == File::kDoesNotExist) { |
| 1226 return CObject::NewOSError(); |
| 1227 } |
| 1228 CObjectArray* result = new CObjectArray(CObject::NewArray(File::kStatSize)); |
| 1229 for (int i = 0; i < File::kStatSize; ++i) { |
| 1230 result->SetAt(i, new CObjectInt64(CObject::NewInt64(data[i]))); |
| 1231 } |
| 1232 CObjectArray* wrapper = new CObjectArray(CObject::NewArray(2)); |
| 1233 wrapper->SetAt(0, new CObjectInt32(CObject::NewInt32(CObject::kSuccess))); |
| 1234 wrapper->SetAt(1, result); |
| 1235 return wrapper; |
1191 } | 1236 } |
1192 | 1237 |
1193 CObject* File::LockRequest(const CObjectArray& request) { | 1238 CObject* File::LockRequest(const CObjectArray& request) { |
1194 if ((request.Length() >= 1) && request[0]->IsIntptr()) { | 1239 if ((request.Length() < 1) || !request[0]->IsIntptr()) { |
1195 File* file = CObjectToFilePointer(request[0]); | 1240 return CObject::IllegalArgumentError(); |
1196 RefCntReleaseScope<File> rs(file); | |
1197 if ((request.Length() == 4) && request[1]->IsInt32OrInt64() && | |
1198 request[2]->IsInt32OrInt64() && request[3]->IsInt32OrInt64()) { | |
1199 if (!file->IsClosed()) { | |
1200 int64_t lock = CObjectInt32OrInt64ToInt64(request[1]); | |
1201 int64_t start = CObjectInt32OrInt64ToInt64(request[2]); | |
1202 int64_t end = CObjectInt32OrInt64ToInt64(request[3]); | |
1203 if (file->Lock(static_cast<File::LockType>(lock), start, end)) { | |
1204 return CObject::True(); | |
1205 } else { | |
1206 return CObject::NewOSError(); | |
1207 } | |
1208 } else { | |
1209 return CObject::FileClosedError(); | |
1210 } | |
1211 } else { | |
1212 return CObject::IllegalArgumentError(); | |
1213 } | |
1214 } | 1241 } |
1215 return CObject::IllegalArgumentError(); | 1242 File* file = CObjectToFilePointer(request[0]); |
| 1243 RefCntReleaseScope<File> rs(file); |
| 1244 if ((request.Length() != 4) || !request[1]->IsInt32OrInt64() || |
| 1245 !request[2]->IsInt32OrInt64() || !request[3]->IsInt32OrInt64()) { |
| 1246 return CObject::IllegalArgumentError(); |
| 1247 } |
| 1248 if (file->IsClosed()) { |
| 1249 return CObject::FileClosedError(); |
| 1250 } |
| 1251 const int64_t lock = CObjectInt32OrInt64ToInt64(request[1]); |
| 1252 const int64_t start = CObjectInt32OrInt64ToInt64(request[2]); |
| 1253 const int64_t end = CObjectInt32OrInt64ToInt64(request[3]); |
| 1254 return file->Lock(static_cast<File::LockType>(lock), start, end) |
| 1255 ? CObject::True() |
| 1256 : CObject::NewOSError(); |
1216 } | 1257 } |
1217 | 1258 |
1218 } // namespace bin | 1259 } // namespace bin |
1219 } // namespace dart | 1260 } // namespace dart |
OLD | NEW |