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

Unified Diff: runtime/bin/file.cc

Issue 3001963002: [dart:io] Namespaces for file IO (Closed)
Patch Set: Fuchsia fix Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/file.h ('k') | runtime/bin/file_android.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/file.cc
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index a4721cc63b5e3c8bc8ae4e7a32b4eda1e812f0fe..24e910bc1293eccb01455a4834f2a03077c5cd43 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -8,6 +8,7 @@
#include "bin/dartutils.h"
#include "bin/embedded_dart_io.h"
#include "bin/io_buffer.h"
+#include "bin/namespace.h"
#include "bin/utils.h"
#include "include/dart_api.h"
#include "include/dart_tools_api.h"
@@ -25,8 +26,9 @@ static File* GetFile(Dart_NativeArguments args) {
File* file;
Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
ASSERT(Dart_IsInstance(dart_this));
- ThrowIfError(Dart_GetNativeInstanceField(dart_this, kFileNativeFieldIndex,
- reinterpret_cast<intptr_t*>(&file)));
+ Dart_Handle result = Dart_GetNativeInstanceField(dart_this, kFileNativeFieldIndex,
+ reinterpret_cast<intptr_t*>(&file));
+ ASSERT(!Dart_IsError(result));
return file;
}
@@ -70,9 +72,10 @@ void FUNCTION_NAME(File_SetPointer)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* filename =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- int64_t mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ int64_t mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
File::DartFileOpenMode dart_file_mode =
static_cast<File::DartFileOpenMode>(mode);
File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
@@ -80,7 +83,7 @@ void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
// reading. This is to prevent the opening of directories as
// files. Directories can be opened for reading using the posix
// 'open' call.
- File* file = File::Open(filename, file_mode);
+ File* file = File::Open(namespc, filename, file_mode);
if (file != NULL) {
Dart_SetReturnValue(args,
Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
@@ -90,9 +93,10 @@ void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* filename =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- bool exists = File::Exists(filename);
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ bool exists = File::Exists(namespc, filename);
Dart_SetReturnValue(args, Dart_NewBoolean(exists));
}
@@ -312,8 +316,9 @@ void FUNCTION_NAME(File_Length)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) {
- const char* path = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- int64_t return_value = File::LengthFromPath(path);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* path = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ int64_t return_value = File::LengthFromPath(namespc, path);
if (return_value >= 0) {
Dart_SetReturnValue(args, Dart_NewInteger(return_value));
} else {
@@ -322,8 +327,9 @@ void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) {
- const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- int64_t return_value = File::LastModified(name);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ int64_t return_value = File::LastModified(namespc, name);
if (return_value >= 0) {
Dart_SetReturnValue(args,
Dart_NewInteger(return_value * kMillisecondsPerSecond));
@@ -333,20 +339,22 @@ void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_SetLastModified)(Dart_NativeArguments args) {
- const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
int64_t millis;
- if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &millis)) {
+ if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &millis)) {
Dart_ThrowException(DartUtils::NewDartArgumentError(
"The second argument must be a 64-bit int."));
}
- if (!File::SetLastModified(name, millis)) {
+ if (!File::SetLastModified(namespc, name, millis)) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
}
}
void FUNCTION_NAME(File_LastAccessed)(Dart_NativeArguments args) {
- const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- int64_t return_value = File::LastAccessed(name);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ int64_t return_value = File::LastAccessed(namespc, name);
if (return_value >= 0) {
Dart_SetReturnValue(args,
Dart_NewInteger(return_value * kMillisecondsPerSecond));
@@ -356,13 +364,14 @@ void FUNCTION_NAME(File_LastAccessed)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_SetLastAccessed)(Dart_NativeArguments args) {
- const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* name = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
int64_t millis;
- if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &millis)) {
+ if (!DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &millis)) {
Dart_ThrowException(DartUtils::NewDartArgumentError(
"The second argument must be a 64-bit int."));
}
- if (!File::SetLastAccessed(name, millis)) {
+ if (!File::SetLastAccessed(namespc, name, millis)) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
}
}
@@ -401,8 +410,9 @@ void FUNCTION_NAME(File_Lock)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
- const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- bool result = File::Create(str);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ bool result = File::Create(namespc, str);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -411,13 +421,14 @@ void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) {
- if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
- Dart_IsString(Dart_GetNativeArgument(args, 1))) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ if (Dart_IsString(Dart_GetNativeArgument(args, 1)) &&
+ Dart_IsString(Dart_GetNativeArgument(args, 2))) {
const char* name =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* target =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
- if (!File::CreateLink(name, target)) {
+ const char* target =
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2));
+ if (!File::CreateLink(namespc, name, target)) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
}
} else {
@@ -428,10 +439,11 @@ void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) {
- if (Dart_IsString(Dart_GetNativeArgument(args, 0))) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ if (Dart_IsString(Dart_GetNativeArgument(args, 1))) {
const char* name =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* target = File::LinkTarget(name);
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ const char* target = File::LinkTarget(namespc, name);
if (target == NULL) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
} else {
@@ -445,8 +457,9 @@ void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) {
- const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- bool result = File::Delete(str);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ bool result = File::Delete(namespc, str);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -455,8 +468,9 @@ void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) {
- const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- bool result = File::DeleteLink(str);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ bool result = File::DeleteLink(namespc, str);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -465,11 +479,12 @@ void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* old_path =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* new_path =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
- bool result = File::Rename(old_path, new_path);
+ const char* new_path =
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2));
+ bool result = File::Rename(namespc, old_path, new_path);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -478,11 +493,12 @@ void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* old_path =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* new_path =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
- bool result = File::RenameLink(old_path, new_path);
+ const char* new_path =
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2));
+ bool result = File::RenameLink(namespc, old_path, new_path);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -491,11 +507,12 @@ void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
const char* old_path =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* new_path =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
- bool result = File::Copy(old_path, new_path);
+ const char* new_path =
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2));
+ bool result = File::Copy(namespc, old_path, new_path);
if (result) {
Dart_SetReturnValue(args, Dart_NewBoolean(result));
} else {
@@ -504,8 +521,9 @@ void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_ResolveSymbolicLinks)(Dart_NativeArguments args) {
- const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* path = File::GetCanonicalPath(str);
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ const char* str = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
+ const char* path = File::GetCanonicalPath(namespc, str);
if (path != NULL) {
Dart_SetReturnValue(args, DartUtils::NewString(path));
} else {
@@ -530,13 +548,14 @@ void FUNCTION_NAME(File_GetStdioHandleType)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) {
- if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
- Dart_IsBoolean(Dart_GetNativeArgument(args, 1))) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ if (Dart_IsString(Dart_GetNativeArgument(args, 1)) &&
+ Dart_IsBoolean(Dart_GetNativeArgument(args, 2))) {
const char* str =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
bool follow_links =
- DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
- File::Type type = File::GetType(str, follow_links);
+ DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2));
+ File::Type type = File::GetType(namespc, str, follow_links);
Dart_SetReturnValue(args, Dart_NewInteger(static_cast<int>(type)));
} else {
Dart_Handle err = DartUtils::NewDartArgumentError(
@@ -546,12 +565,13 @@ void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) {
- if (Dart_IsString(Dart_GetNativeArgument(args, 0))) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ if (Dart_IsString(Dart_GetNativeArgument(args, 1))) {
const char* path =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
int64_t stat_data[File::kStatSize];
- File::Stat(path, stat_data);
+ File::Stat(namespc, path, stat_data);
if (stat_data[File::kType] == File::kDoesNotExist) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
} else {
@@ -584,13 +604,14 @@ void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) {
}
void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) {
- if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
- Dart_IsString(Dart_GetNativeArgument(args, 1))) {
+ Namespace* namespc = Namespace::GetNamespace(args, 0);
+ if (Dart_IsString(Dart_GetNativeArgument(args, 1)) &&
+ Dart_IsString(Dart_GetNativeArgument(args, 2))) {
const char* path_1 =
- DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
- const char* path_2 =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
- File::Identical result = File::AreIdentical(path_1, path_2);
+ const char* path_2 =
+ DartUtils::GetStringValue(Dart_GetNativeArgument(args, 2));
+ File::Identical result = File::AreIdentical(namespc, path_1, path_2);
if (result == File::kError) {
Dart_SetReturnValue(args, DartUtils::NewDartOSError());
} else {
@@ -616,402 +637,419 @@ static int64_t CObjectInt32OrInt64ToInt64(CObject* cobject) {
return result;
}
-File* CObjectToFilePointer(CObject* cobject) {
+static File* CObjectToFilePointer(CObject* cobject) {
CObjectIntptr value(cobject);
return reinterpret_cast<File*>(value.Value());
}
+static Namespace* CObjectToNamespacePointer(CObject* cobject) {
+ CObjectIntptr value(cobject);
+ return reinterpret_cast<Namespace*>(value.Value());
+}
+
CObject* File::ExistsRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filename(request[0]);
- bool result = File::Exists(filename.CString());
- return CObject::Bool(result);
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filename(request[1]);
+ return CObject::Bool(File::Exists(namespc, filename.CString()));
}
CObject* File::CreateRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filename(request[0]);
- bool result = File::Create(filename.CString());
- if (result) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ CObjectString filename(request[1]);
+ return File::Create(namespc, filename.CString()) ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::OpenRequest(const CObjectArray& request) {
- File* file = NULL;
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsInt32()) {
- CObjectString filename(request[0]);
- CObjectInt32 mode(request[1]);
- File::DartFileOpenMode dart_file_mode =
- static_cast<File::DartFileOpenMode>(mode.Value());
- File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
- file = File::Open(filename.CString(), file_mode);
- if (file != NULL) {
- return new CObjectIntptr(
- CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 3) ||
+ !request[1]->IsString() ||
+ !request[2]->IsInt32()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filename(request[1]);
+ CObjectInt32 mode(request[2]);
+ File::DartFileOpenMode dart_file_mode =
+ static_cast<File::DartFileOpenMode>(mode.Value());
+ File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
+ File* file = File::Open(namespc, filename.CString(), file_mode);
+ if (file == NULL) {
+ return CObject::NewOSError();
+ }
+ return new CObjectIntptr(
+ CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
}
CObject* File::DeleteRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filename(request[0]);
- bool result = File::Delete(filename.CString());
- if (result) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::False();
}
- return CObject::False();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::False();
+ }
+ CObjectString filename(request[1]);
+ return File::Delete(namespc, filename.CString()) ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::RenameRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsString()) {
- CObjectString old_path(request[0]);
- CObjectString new_path(request[1]);
- bool completed = File::Rename(old_path.CString(), new_path.CString());
- if (completed) {
- return CObject::True();
- }
- return CObject::NewOSError();
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 3) ||
+ !request[1]->IsString() ||
+ !request[2]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString old_path(request[1]);
+ CObjectString new_path(request[2]);
+ return File::Rename(namespc, old_path.CString(), new_path.CString())
+ ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::CopyRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsString()) {
- CObjectString old_path(request[0]);
- CObjectString new_path(request[1]);
- bool completed = File::Copy(old_path.CString(), new_path.CString());
- if (completed) {
- return CObject::True();
- }
- return CObject::NewOSError();
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 3) ||
+ !request[1]->IsString() ||
+ !request[2]->IsString()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ CObjectString old_path(request[1]);
+ CObjectString new_path(request[2]);
+ return File::Copy(namespc, old_path.CString(), new_path.CString())
+ ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::ResolveSymbolicLinksRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filename(request[0]);
- const char* result = File::GetCanonicalPath(filename.CString());
- if (result != NULL) {
- CObject* path = new CObjectString(CObject::NewString(result));
- return path;
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filename(request[1]);
+ const char* result = File::GetCanonicalPath(namespc, filename.CString());
+ if (result == NULL) {
+ return CObject::NewOSError();
+ }
+ return new CObjectString(CObject::NewString(result));
}
CObject* File::CloseRequest(const CObjectArray& request) {
- intptr_t return_value = -1;
- if ((request.Length() == 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- return_value = 0;
- // We have retained a reference to the file here. Therefore the file's
- // destructor can't be running. Since no further requests are dispatched by
- // the Dart code after an async close call, this Close() can't be racing
- // with any other call on the file. We don't do an extra Release(), and we
- // don't delete the weak persistent handle. The file is closed here, but the
- // memory will be cleaned up when the finalizer runs.
- ASSERT(!file->IsClosed());
- file->Close();
- }
- return new CObjectIntptr(CObject::NewIntptr(return_value));
+ if ((request.Length() != 1) || !request[0]->IsIntptr()) {
+ return new CObjectIntptr(CObject::NewIntptr(-1));
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ // We have retained a reference to the file here. Therefore the file's
+ // destructor can't be running. Since no further requests are dispatched by
+ // the Dart code after an async close call, this Close() can't be racing
+ // with any other call on the file. We don't do an extra Release(), and we
+ // don't delete the weak persistent handle. The file is closed here, but the
+ // memory will be cleaned up when the finalizer runs.
+ ASSERT(!file->IsClosed());
+ file->Close();
+ return new CObjectIntptr(CObject::NewIntptr(0));
}
CObject* File::PositionRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if (!file->IsClosed()) {
- intptr_t return_value = file->Position();
- if (return_value >= 0) {
- return new CObjectIntptr(CObject::NewIntptr(return_value));
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
+ if ((request.Length() != 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ const intptr_t return_value = file->Position();
+ if (return_value < 0) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectIntptr(CObject::NewIntptr(return_value));
}
CObject* File::SetPositionRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t position = CObjectInt32OrInt64ToInt64(request[1]);
- if (file->SetPosition(position)) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ const int64_t position = CObjectInt32OrInt64ToInt64(request[1]);
+ return file->SetPosition(position) ? CObject::True() : CObject::NewOSError();
}
CObject* File::TruncateRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
- if (file->Truncate(length)) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ const int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
+ if (file->Truncate(length)) {
+ return CObject::True();
}
- return CObject::IllegalArgumentError();
+ return CObject::NewOSError();
}
CObject* File::LengthRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if (!file->IsClosed()) {
- int64_t return_value = file->Length();
- if (return_value >= 0) {
- return new CObjectInt64(CObject::NewInt64(return_value));
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
+ if ((request.Length() != 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ const int64_t return_value = file->Length();
+ if (return_value < 0) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectInt64(CObject::NewInt64(return_value));
}
CObject* File::LengthFromPathRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filepath(request[0]);
- int64_t return_value = File::LengthFromPath(filepath.CString());
- if (return_value >= 0) {
- return new CObjectInt64(CObject::NewInt64(return_value));
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filepath(request[1]);
+ const int64_t return_value = File::LengthFromPath(
+ namespc, filepath.CString());
+ if (return_value < 0) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectInt64(CObject::NewInt64(return_value));
}
CObject* File::LastAccessedRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filepath(request[0]);
- int64_t return_value = File::LastAccessed(filepath.CString());
- if (return_value >= 0) {
- return new CObjectIntptr(
- CObject::NewInt64(return_value * kMillisecondsPerSecond));
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filepath(request[1]);
+ const int64_t return_value = File::LastAccessed(namespc, filepath.CString());
+ if (return_value < 0) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectIntptr(
+ CObject::NewInt64(return_value * kMillisecondsPerSecond));
}
CObject* File::SetLastAccessedRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsInt32OrInt64()) {
- CObjectString filepath(request[0]);
- const int64_t millis = CObjectInt32OrInt64ToInt64(request[1]);
- if (File::SetLastAccessed(filepath.CString(), millis)) {
- return CObject::Null();
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 3) ||
+ !request[1]->IsString() ||
+ !request[2]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filepath(request[1]);
+ const int64_t millis = CObjectInt32OrInt64ToInt64(request[2]);
+ return File::SetLastAccessed(namespc, filepath.CString(), millis)
+ ? CObject::Null()
+ : CObject::NewOSError();
}
CObject* File::LastModifiedRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString filepath(request[0]);
- int64_t return_value = File::LastModified(filepath.CString());
- if (return_value >= 0) {
- return new CObjectIntptr(
- CObject::NewInt64(return_value * kMillisecondsPerSecond));
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filepath(request[1]);
+ const int64_t return_value = File::LastModified(namespc, filepath.CString());
+ if (return_value < 0) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectIntptr(
+ CObject::NewInt64(return_value * kMillisecondsPerSecond));
}
CObject* File::SetLastModifiedRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsInt32OrInt64()) {
- CObjectString filepath(request[0]);
- const int64_t millis = CObjectInt32OrInt64ToInt64(request[1]);
- if (File::SetLastModified(filepath.CString(), millis)) {
- return CObject::Null();
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 3) ||
+ !request[1]->IsString() ||
+ !request[2]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString filepath(request[1]);
+ const int64_t millis = CObjectInt32OrInt64ToInt64(request[2]);
+ return File::SetLastModified(namespc, filepath.CString(), millis)
+ ? CObject::Null()
+ : CObject::NewOSError();
}
CObject* File::FlushRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if (!file->IsClosed()) {
- if (file->Flush()) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ return file->Flush() ? CObject::True() : CObject::NewOSError();
}
CObject* File::ReadByteRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if (!file->IsClosed()) {
- uint8_t buffer;
- int64_t bytes_read = file->Read(reinterpret_cast<void*>(&buffer), 1);
- if (bytes_read > 0) {
- return new CObjectIntptr(CObject::NewIntptr(buffer));
- } else if (bytes_read == 0) {
- return new CObjectIntptr(CObject::NewIntptr(-1));
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
}
- return CObject::IllegalArgumentError();
+ uint8_t buffer;
+ const int64_t bytes_read = file->Read(
+ reinterpret_cast<void*>(&buffer), 1);
+ if (bytes_read < 0) {
+ return CObject::NewOSError();
+ }
+ if (bytes_read == 0) {
+ return new CObjectIntptr(CObject::NewIntptr(-1));
+ }
+ return new CObjectIntptr(CObject::NewIntptr(buffer));
}
CObject* File::WriteByteRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t byte = CObjectInt32OrInt64ToInt64(request[1]);
- uint8_t buffer = static_cast<uint8_t>(byte & 0xff);
- bool success = file->WriteFully(reinterpret_cast<void*>(&buffer), 1);
- if (success) {
- return new CObjectInt64(CObject::NewInt64(1));
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
}
- return CObject::IllegalArgumentError();
+ const int64_t byte = CObjectInt32OrInt64ToInt64(request[1]);
+ uint8_t buffer = static_cast<uint8_t>(byte & 0xff);
+ return file->WriteFully(reinterpret_cast<void*>(&buffer), 1)
+ ? new CObjectInt64(CObject::NewInt64(1))
+ : CObject::NewOSError();
}
CObject* File::ReadRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
- Dart_CObject* io_buffer = CObject::NewIOBuffer(length);
- ASSERT(io_buffer != NULL);
- uint8_t* data = io_buffer->value.as_external_typed_data.data;
- int64_t bytes_read = file->Read(data, length);
- if (bytes_read >= 0) {
- CObjectExternalUint8Array* external_array =
- new CObjectExternalUint8Array(io_buffer);
- external_array->SetLength(bytes_read);
- CObjectArray* result = new CObjectArray(CObject::NewArray(2));
- result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0)));
- result->SetAt(1, external_array);
- return result;
- } else {
- CObject::FreeIOBufferData(io_buffer);
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
}
- return CObject::IllegalArgumentError();
+ const int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
+ Dart_CObject* io_buffer = CObject::NewIOBuffer(length);
+ ASSERT(io_buffer != NULL);
+ uint8_t* data = io_buffer->value.as_external_typed_data.data;
+ const int64_t bytes_read = file->Read(data, length);
+ if (bytes_read < 0) {
+ CObject::FreeIOBufferData(io_buffer);
+ return CObject::NewOSError();
+ }
+ CObjectExternalUint8Array* external_array =
+ new CObjectExternalUint8Array(io_buffer);
+ external_array->SetLength(bytes_read);
+ CObjectArray* result = new CObjectArray(CObject::NewArray(2));
+ result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0)));
+ result->SetAt(1, external_array);
+ return result;
}
CObject* File::ReadIntoRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 2) && request[1]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
- Dart_CObject* io_buffer = CObject::NewIOBuffer(length);
- ASSERT(io_buffer != NULL);
- uint8_t* data = io_buffer->value.as_external_typed_data.data;
- int64_t bytes_read = file->Read(data, length);
- if (bytes_read >= 0) {
- CObjectExternalUint8Array* external_array =
- new CObjectExternalUint8Array(io_buffer);
- external_array->SetLength(bytes_read);
- CObjectArray* result = new CObjectArray(CObject::NewArray(3));
- result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0)));
- result->SetAt(1, new CObjectInt64(CObject::NewInt64(bytes_read)));
- result->SetAt(2, external_array);
- return result;
- } else {
- CObject::FreeIOBufferData(io_buffer);
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 2) || !request[1]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ const int64_t length = CObjectInt32OrInt64ToInt64(request[1]);
+ Dart_CObject* io_buffer = CObject::NewIOBuffer(length);
+ ASSERT(io_buffer != NULL);
+ uint8_t* data = io_buffer->value.as_external_typed_data.data;
+ const int64_t bytes_read = file->Read(data, length);
+ if (bytes_read < 0) {
+ CObject::FreeIOBufferData(io_buffer);
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ CObjectExternalUint8Array* external_array =
+ new CObjectExternalUint8Array(io_buffer);
+ external_array->SetLength(bytes_read);
+ CObjectArray* result = new CObjectArray(CObject::NewArray(3));
+ result->SetAt(0, new CObjectIntptr(CObject::NewInt32(0)));
+ result->SetAt(1, new CObjectInt64(CObject::NewInt64(bytes_read)));
+ result->SetAt(2, external_array);
+ return result;
}
static int SizeInBytes(Dart_TypedData_Type type) {
@@ -1039,180 +1077,189 @@ static int SizeInBytes(Dart_TypedData_Type type) {
}
CObject* File::WriteFromRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 4) &&
- (request[1]->IsTypedData() || request[1]->IsArray()) &&
- request[2]->IsInt32OrInt64() && request[3]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
- int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
- int64_t length = end - start;
- uint8_t* buffer_start;
- if (request[1]->IsTypedData()) {
- CObjectTypedData typed_data(request[1]);
- start = start * SizeInBytes(typed_data.Type());
- length = length * SizeInBytes(typed_data.Type());
- buffer_start = typed_data.Buffer() + start;
- } else {
- CObjectArray array(request[1]);
- buffer_start = Dart_ScopeAllocate(length);
- for (int i = 0; i < length; i++) {
- if (array[i + start]->IsInt32OrInt64()) {
- int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]);
- buffer_start[i] = static_cast<uint8_t>(value & 0xFF);
- } else {
- // Unsupported type.
- return CObject::IllegalArgumentError();
- }
- }
- start = 0;
- }
- bool success =
- file->WriteFully(reinterpret_cast<void*>(buffer_start), length);
- if (success) {
- return new CObjectInt64(CObject::NewInt64(length));
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 4) ||
+ (!request[1]->IsTypedData() && !request[1]->IsArray()) ||
+ !request[2]->IsInt32OrInt64() || !request[3]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
+ }
+ int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
+ int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
+ int64_t length = end - start;
+ uint8_t* buffer_start;
+ if (request[1]->IsTypedData()) {
+ CObjectTypedData typed_data(request[1]);
+ start = start * SizeInBytes(typed_data.Type());
+ length = length * SizeInBytes(typed_data.Type());
+ buffer_start = typed_data.Buffer() + start;
+ } else {
+ CObjectArray array(request[1]);
+ buffer_start = Dart_ScopeAllocate(length);
+ for (int i = 0; i < length; i++) {
+ if (array[i + start]->IsInt32OrInt64()) {
+ int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]);
+ buffer_start[i] = static_cast<uint8_t>(value & 0xFF);
} else {
- return CObject::FileClosedError();
+ // Unsupported type.
+ return CObject::IllegalArgumentError();
}
- } else {
- return CObject::IllegalArgumentError();
}
+ start = 0;
}
- return CObject::IllegalArgumentError();
+ return file->WriteFully(reinterpret_cast<void*>(buffer_start), length)
+ ? new CObjectInt64(CObject::NewInt64(length))
+ : CObject::NewOSError();
}
CObject* File::CreateLinkRequest(const CObjectArray& request) {
- if ((request.Length() != 2) || !request[0]->IsString() ||
- !request[1]->IsString()) {
+ if ((request.Length() != 3) || !request[0]->IsIntptr()) {
return CObject::IllegalArgumentError();
}
- CObjectString link_name(request[0]);
- CObjectString target_name(request[1]);
- if (File::CreateLink(link_name.CString(), target_name.CString())) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString() || !request[2]->IsString()) {
+ return CObject::IllegalArgumentError();
}
+ CObjectString link_name(request[1]);
+ CObjectString target_name(request[2]);
+ return File::CreateLink(namespc, link_name.CString(), target_name.CString())
+ ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::DeleteLinkRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString link_path(request[0]);
- bool result = File::DeleteLink(link_path.CString());
- if (result) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() != 2) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ CObjectString link_path(request[1]);
+ return File::DeleteLink(namespc, link_path.CString()) ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::RenameLinkRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsString()) {
- CObjectString old_path(request[0]);
- CObjectString new_path(request[1]);
- bool completed = File::RenameLink(old_path.CString(), new_path.CString());
- if (completed) {
- return CObject::True();
- }
- return CObject::NewOSError();
+ if ((request.Length() != 3) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString() || !request[2]->IsString()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ CObjectString old_path(request[1]);
+ CObjectString new_path(request[2]);
+ return File::RenameLink(namespc, old_path.CString(), new_path.CString())
+ ? CObject::True()
+ : CObject::NewOSError();
}
CObject* File::LinkTargetRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- CObjectString link_path(request[0]);
- const char* target = File::LinkTarget(link_path.CString());
- if (target != NULL) {
- CObject* result = new CObjectString(CObject::NewString(target));
- return result;
- } else {
- return CObject::NewOSError();
- }
+ if ((request.Length() != 2) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString link_path(request[1]);
+ const char* target = File::LinkTarget(namespc, link_path.CString());
+ if (target == NULL) {
+ return CObject::NewOSError();
}
- return CObject::IllegalArgumentError();
+ return new CObjectString(CObject::NewString(target));
}
CObject* File::TypeRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsBool()) {
- CObjectString path(request[0]);
- CObjectBool follow_links(request[1]);
- File::Type type = File::GetType(path.CString(), follow_links.Value());
- return new CObjectInt32(CObject::NewInt32(type));
+ if ((request.Length() != 3) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString() || !request[2]->IsBool()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ CObjectString path(request[1]);
+ CObjectBool follow_links(request[2]);
+ File::Type type = File::GetType(
+ namespc, path.CString(), follow_links.Value());
+ return new CObjectInt32(CObject::NewInt32(type));
}
CObject* File::IdenticalRequest(const CObjectArray& request) {
- if ((request.Length() == 2) && request[0]->IsString() &&
- request[1]->IsString()) {
- CObjectString path1(request[0]);
- CObjectString path2(request[1]);
- File::Identical result =
- File::AreIdentical(path1.CString(), path2.CString());
- if (result == File::kError) {
- return CObject::NewOSError();
- } else if (result == File::kIdentical) {
- return CObject::True();
- } else {
- return CObject::False();
- }
+ if ((request.Length() != 3) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if (!request[1]->IsString() || !request[2]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ CObjectString path1(request[1]);
+ CObjectString path2(request[2]);
+ File::Identical result = File::AreIdentical(
+ namespc, path1.CString(), path2.CString());
+ if (result == File::kError) {
+ return CObject::NewOSError();
+ }
+ return (result == File::kIdentical) ? CObject::True() : CObject::False();
}
CObject* File::StatRequest(const CObjectArray& request) {
- if ((request.Length() == 1) && request[0]->IsString()) {
- int64_t data[File::kStatSize];
- CObjectString path(request[0]);
- File::Stat(path.CString(), data);
- if (data[File::kType] == File::kDoesNotExist) {
- return CObject::NewOSError();
- }
- CObjectArray* result = new CObjectArray(CObject::NewArray(File::kStatSize));
- for (int i = 0; i < File::kStatSize; ++i) {
- result->SetAt(i, new CObjectInt64(CObject::NewInt64(data[i])));
- }
- CObjectArray* wrapper = new CObjectArray(CObject::NewArray(2));
- wrapper->SetAt(0, new CObjectInt32(CObject::NewInt32(CObject::kSuccess)));
- wrapper->SetAt(1, result);
- return wrapper;
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
}
- return CObject::IllegalArgumentError();
+ Namespace* namespc = CObjectToNamespacePointer(request[0]);
+ RefCntReleaseScope<Namespace> rs(namespc);
+ if ((request.Length() != 2) || !request[1]->IsString()) {
+ return CObject::IllegalArgumentError();
+ }
+ int64_t data[File::kStatSize];
+ CObjectString path(request[1]);
+ File::Stat(namespc, path.CString(), data);
+ if (data[File::kType] == File::kDoesNotExist) {
+ return CObject::NewOSError();
+ }
+ CObjectArray* result = new CObjectArray(CObject::NewArray(File::kStatSize));
+ for (int i = 0; i < File::kStatSize; ++i) {
+ result->SetAt(i, new CObjectInt64(CObject::NewInt64(data[i])));
+ }
+ CObjectArray* wrapper = new CObjectArray(CObject::NewArray(2));
+ wrapper->SetAt(0, new CObjectInt32(CObject::NewInt32(CObject::kSuccess)));
+ wrapper->SetAt(1, result);
+ return wrapper;
}
CObject* File::LockRequest(const CObjectArray& request) {
- if ((request.Length() >= 1) && request[0]->IsIntptr()) {
- File* file = CObjectToFilePointer(request[0]);
- RefCntReleaseScope<File> rs(file);
- if ((request.Length() == 4) && request[1]->IsInt32OrInt64() &&
- request[2]->IsInt32OrInt64() && request[3]->IsInt32OrInt64()) {
- if (!file->IsClosed()) {
- int64_t lock = CObjectInt32OrInt64ToInt64(request[1]);
- int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
- int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
- if (file->Lock(static_cast<File::LockType>(lock), start, end)) {
- return CObject::True();
- } else {
- return CObject::NewOSError();
- }
- } else {
- return CObject::FileClosedError();
- }
- } else {
- return CObject::IllegalArgumentError();
- }
+ if ((request.Length() < 1) || !request[0]->IsIntptr()) {
+ return CObject::IllegalArgumentError();
+ }
+ File* file = CObjectToFilePointer(request[0]);
+ RefCntReleaseScope<File> rs(file);
+ if ((request.Length() != 4) || !request[1]->IsInt32OrInt64() ||
+ !request[2]->IsInt32OrInt64() || !request[3]->IsInt32OrInt64()) {
+ return CObject::IllegalArgumentError();
+ }
+ if (file->IsClosed()) {
+ return CObject::FileClosedError();
}
- return CObject::IllegalArgumentError();
+ const int64_t lock = CObjectInt32OrInt64ToInt64(request[1]);
+ const int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
+ const int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
+ return file->Lock(static_cast<File::LockType>(lock), start, end)
+ ? CObject::True()
+ : CObject::NewOSError();
}
} // namespace bin
« no previous file with comments | « runtime/bin/file.h ('k') | runtime/bin/file_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698