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

Side by Side Diff: runtime/bin/file.cc

Issue 9630012: Error reporting on File in dart:io (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 9 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/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/thread.h" 9 #include "bin/thread.h"
10 10
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); 65 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
66 int mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1)); 66 int mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
67 File::DartFileOpenMode dart_file_mode = 67 File::DartFileOpenMode dart_file_mode =
68 static_cast<File::DartFileOpenMode>(mode); 68 static_cast<File::DartFileOpenMode>(mode);
69 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); 69 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
70 // Check that the file exists before opening it only for 70 // Check that the file exists before opening it only for
71 // reading. This is to prevent the opening of directories as 71 // reading. This is to prevent the opening of directories as
72 // files. Directories can be opened for reading using the posix 72 // files. Directories can be opened for reading using the posix
73 // 'open' call. 73 // 'open' call.
74 File* file = NULL; 74 File* file = NULL;
75 if (((file_mode & File::kWrite) != 0) || File::Exists(filename)) { 75 OSError os_error;
76 file = File::Open(filename, file_mode); 76 file = File::Open(filename, file_mode, &os_error);
77 if (file == NULL) {
78 Dart_Handle os_error_handle = Dart_GetNativeArgument(args, 2);
79 DartUtils::SetIntegerInstanceField(
80 os_error_handle, "errorCode", os_error.errno_);
81 DartUtils::SetStringInstanceField(
82 os_error_handle, "message", os_error.strerror_);
77 } 83 }
78 Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file))); 84 Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
79 Dart_ExitScope(); 85 Dart_ExitScope();
80 } 86 }
81 87
82 88
83 void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) { 89 void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) {
84 Dart_EnterScope(); 90 Dart_EnterScope();
85 const char* filename = 91 const char* filename =
86 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0)); 92 DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 412
407 static CObject* FileCreateRequest(const CObjectArray& request) { 413 static CObject* FileCreateRequest(const CObjectArray& request) {
408 if (request.Length() == 2 && request[1]->IsString()) { 414 if (request.Length() == 2 && request[1]->IsString()) {
409 CObjectString filename(request[1]); 415 CObjectString filename(request[1]);
410 bool result = File::Create(filename.CString()); 416 bool result = File::Create(filename.CString());
411 return CObject::Bool(result); 417 return CObject::Bool(result);
412 } 418 }
413 return CObject::False(); 419 return CObject::False();
414 } 420 }
415 421
422 static CObject* MakeOsError(OSError os_error) {
423 CObject* error_message =
424 new CObjectString(CObject::NewString(os_error.strerror_));
425 CObjectArray* result = new CObjectArray(CObject::NewArray(2));
426 result->SetAt(0, new CObjectInt32(CObject::NewInt32(os_error.errno_)));
427 result->SetAt(1, error_message);
428 return result;
429 }
416 430
417 static CObject* FileOpenRequest(const CObjectArray& request) { 431 static CObject* FileOpenRequest(const CObjectArray& request) {
418 File* file = NULL; 432 File* file = NULL;
433 OSError os_error;
419 if (request.Length() == 3 && 434 if (request.Length() == 3 &&
420 request[1]->IsString() && 435 request[1]->IsString() &&
421 request[2]->IsInt32()) { 436 request[2]->IsInt32()) {
422 CObjectString filename(request[1]); 437 CObjectString filename(request[1]);
423 CObjectInt32 mode(request[2]); 438 CObjectInt32 mode(request[2]);
424 File::DartFileOpenMode dart_file_mode = 439 File::DartFileOpenMode dart_file_mode =
425 static_cast<File::DartFileOpenMode>(mode.Value()); 440 static_cast<File::DartFileOpenMode>(mode.Value());
426 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode); 441 File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
427 if (((file_mode & File::kWrite) != 0) || File::Exists(filename.CString())) { 442 file = File::Open(filename.CString(), file_mode, &os_error);
428 file = File::Open(filename.CString(), file_mode);
429 }
430 } 443 }
431 return new CObjectIntptr( 444 if (file != NULL) {
432 CObject::NewIntptr(reinterpret_cast<intptr_t>(file))); 445 return new CObjectIntptr(
446 CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
447 } else {
448 return MakeOsError(os_error);
449 }
433 } 450 }
434 451
435 452
436 static CObject* FileDeleteRequest(const CObjectArray& request) { 453 static CObject* FileDeleteRequest(const CObjectArray& request) {
437 if (request.Length() == 2 && request[1]->IsString()) { 454 if (request.Length() == 2 && request[1]->IsString()) {
438 CObjectString filename(request[1]); 455 CObjectString filename(request[1]);
439 bool result = File::Delete(filename.CString()); 456 bool result = File::Delete(filename.CString());
440 return CObject::Bool(result); 457 return CObject::Bool(result);
441 } 458 }
442 return CObject::False(); 459 return CObject::False();
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 Dart_EnterScope(); 776 Dart_EnterScope();
760 Dart_SetReturnValue(args, Dart_Null()); 777 Dart_SetReturnValue(args, Dart_Null());
761 Dart_Port service_port = File::GetServicePort(); 778 Dart_Port service_port = File::GetServicePort();
762 if (service_port != kIllegalPort) { 779 if (service_port != kIllegalPort) {
763 // Return a send port for the service port. 780 // Return a send port for the service port.
764 Dart_Handle send_port = Dart_NewSendPort(service_port); 781 Dart_Handle send_port = Dart_NewSendPort(service_port);
765 Dart_SetReturnValue(args, send_port); 782 Dart_SetReturnValue(args, send_port);
766 } 783 }
767 Dart_ExitScope(); 784 Dart_ExitScope();
768 } 785 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698