Index: runtime/bin/file_win.cc |
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc |
index d1e771948cfaefefbcee1834d455cc32c65270aa..fc72a78f3fdb62ffe521f994f75dcab216a4ec1a 100644 |
--- a/runtime/bin/file_win.cc |
+++ b/runtime/bin/file_win.cc |
@@ -233,21 +233,9 @@ File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) { |
} |
-File* File::ScopedOpen(const char* name, FileOpenMode mode) { |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- return FileOpenW(system_name, mode); |
-} |
- |
- |
File* File::Open(const char* path, FileOpenMode mode) { |
- int path_len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); |
- wchar_t* system_name = new wchar_t[path_len]; |
- if (system_name == NULL) { |
- return NULL; |
- } |
- MultiByteToWideChar(CP_UTF8, 0, path, -1, system_name, path_len); |
- File* file = FileOpenW(system_name, mode); |
- delete[] system_name; |
+ Utf8ToWideScope system_name(path); |
+ File* file = FileOpenW(system_name.wide(), mode); |
return file; |
} |
@@ -270,8 +258,8 @@ File* File::OpenStdio(int fd) { |
bool File::Exists(const char* name) { |
struct __stat64 st; |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- bool stat_status = _wstat64(system_name, &st); |
+ Utf8ToWideScope system_name(name); |
+ bool stat_status = _wstat64(system_name.wide(), &st); |
if (stat_status == 0) { |
return ((st.st_mode & S_IFMT) == S_IFREG); |
} else { |
@@ -281,8 +269,8 @@ bool File::Exists(const char* name) { |
bool File::Create(const char* name) { |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- int fd = _wopen(system_name, O_RDONLY | O_CREAT, 0666); |
+ Utf8ToWideScope system_name(name); |
+ int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666); |
if (fd < 0) { |
return false; |
} |
@@ -326,17 +314,17 @@ static const int kMountPointHeaderSize = 4 * sizeof USHORT; |
bool File::CreateLink(const char* utf8_name, const char* utf8_target) { |
- const wchar_t* name = StringUtilsWin::Utf8ToWide(utf8_name); |
- int create_status = CreateDirectoryW(name, NULL); |
+ Utf8ToWideScope name(utf8_name); |
+ int create_status = CreateDirectoryW(name.wide(), NULL); |
// If the directory already existed, treat it as a success. |
if ((create_status == 0) && |
((GetLastError() != ERROR_ALREADY_EXISTS) || |
- ((GetFileAttributesW(name) & FILE_ATTRIBUTE_DIRECTORY) != 0))) { |
+ ((GetFileAttributesW(name.wide()) & FILE_ATTRIBUTE_DIRECTORY) != 0))) { |
return false; |
} |
HANDLE dir_handle = CreateFileW( |
- name, |
+ name.wide(), |
GENERIC_READ | GENERIC_WRITE, |
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
NULL, |
@@ -347,8 +335,8 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) { |
return false; |
} |
- const wchar_t* target = StringUtilsWin::Utf8ToWide(utf8_target); |
- int target_len = wcslen(target); |
+ Utf8ToWideScope target(utf8_target); |
+ int target_len = wcslen(target.wide()); |
if (target_len > MAX_PATH - 1) { |
CloseHandle(dir_handle); |
return false; |
@@ -357,13 +345,13 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) { |
int reparse_data_buffer_size = |
sizeof REPARSE_DATA_BUFFER + 2 * MAX_PATH * sizeof WCHAR; |
REPARSE_DATA_BUFFER* reparse_data_buffer = |
- reinterpret_cast<REPARSE_DATA_BUFFER*>(Dart_ScopeAllocate( |
- reparse_data_buffer_size)); |
+ reinterpret_cast<REPARSE_DATA_BUFFER*>(malloc(reparse_data_buffer_size)); |
reparse_data_buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; |
- wcscpy(reparse_data_buffer->MountPointReparseBuffer.PathBuffer, target); |
+ wcscpy(reparse_data_buffer->MountPointReparseBuffer.PathBuffer, |
+ target.wide()); |
wcscpy( |
reparse_data_buffer->MountPointReparseBuffer.PathBuffer + target_len + 1, |
- target); |
+ target.wide()); |
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameOffset = 0; |
reparse_data_buffer->MountPointReparseBuffer.SubstituteNameLength = |
target_len * sizeof WCHAR; |
@@ -383,6 +371,7 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) { |
0, |
&dummy_received_bytes, |
NULL); |
+ free(reparse_data_buffer); |
if (CloseHandle(dir_handle) == 0) { |
return false; |
} |
@@ -391,20 +380,20 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) { |
bool File::Delete(const char* name) { |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- int status = _wremove(system_name); |
+ Utf8ToWideScope system_name(name); |
+ int status = _wremove(system_name.wide()); |
return status != -1; |
} |
bool File::DeleteLink(const char* name) { |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
+ Utf8ToWideScope system_name(name); |
bool result = false; |
- DWORD attributes = GetFileAttributesW(system_name); |
+ DWORD attributes = GetFileAttributesW(system_name.wide()); |
if ((attributes != INVALID_FILE_ATTRIBUTES) && |
(attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { |
// It's a junction(link), delete it. |
- result = (RemoveDirectoryW(system_name) != 0); |
+ result = (RemoveDirectoryW(system_name.wide()) != 0); |
} else { |
SetLastError(ERROR_NOT_A_REPARSE_POINT); |
} |
@@ -415,11 +404,11 @@ bool File::DeleteLink(const char* name) { |
bool File::Rename(const char* old_path, const char* new_path) { |
File::Type type = GetType(old_path, false); |
if (type == kIsFile) { |
- const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path); |
- const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path); |
+ Utf8ToWideScope system_old_path(old_path); |
+ Utf8ToWideScope system_new_path(new_path); |
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING; |
int move_status = |
- MoveFileExW(system_old_path, system_new_path, flags); |
+ MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags); |
return (move_status != 0); |
} else { |
SetLastError(ERROR_FILE_NOT_FOUND); |
@@ -431,11 +420,11 @@ bool File::Rename(const char* old_path, const char* new_path) { |
bool File::RenameLink(const char* old_path, const char* new_path) { |
File::Type type = GetType(old_path, false); |
if (type == kIsLink) { |
- const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path); |
- const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path); |
+ Utf8ToWideScope system_old_path(old_path); |
+ Utf8ToWideScope system_new_path(new_path); |
DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING; |
int move_status = |
- MoveFileExW(system_old_path, system_new_path, flags); |
+ MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags); |
return (move_status != 0); |
} else { |
SetLastError(ERROR_FILE_NOT_FOUND); |
@@ -447,10 +436,10 @@ bool File::RenameLink(const char* old_path, const char* new_path) { |
bool File::Copy(const char* old_path, const char* new_path) { |
File::Type type = GetType(old_path, false); |
if (type == kIsFile) { |
- const wchar_t* system_old_path = StringUtilsWin::Utf8ToWide(old_path); |
- const wchar_t* system_new_path = StringUtilsWin::Utf8ToWide(new_path); |
- bool success = CopyFileExW(system_old_path, |
- system_new_path, |
+ Utf8ToWideScope system_old_path(old_path); |
+ Utf8ToWideScope system_new_path(new_path); |
+ bool success = CopyFileExW(system_old_path.wide(), |
+ system_new_path.wide(), |
NULL, |
NULL, |
NULL, |
@@ -465,8 +454,8 @@ bool File::Copy(const char* old_path, const char* new_path) { |
int64_t File::LengthFromPath(const char* name) { |
struct __stat64 st; |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- int stat_status = _wstat64(system_name, &st); |
+ Utf8ToWideScope system_name(name); |
+ int stat_status = _wstat64(system_name.wide(), &st); |
if (stat_status == 0) { |
return st.st_size; |
} |
@@ -565,8 +554,8 @@ void File::Stat(const char* name, int64_t* data) { |
data[kType] = type; |
if (type != kDoesNotExist) { |
struct _stat64 st; |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- int stat_status = _wstat64(system_name, &st); |
+ Utf8ToWideScope system_name(name); |
+ int stat_status = _wstat64(system_name.wide(), &st); |
if (stat_status == 0) { |
data[kCreatedTime] = st.st_ctime * 1000; |
data[kModifiedTime] = st.st_mtime * 1000; |
@@ -582,8 +571,8 @@ void File::Stat(const char* name, int64_t* data) { |
time_t File::LastModified(const char* name) { |
struct __stat64 st; |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name); |
- int stat_status = _wstat64(system_name, &st); |
+ Utf8ToWideScope system_name(name); |
+ int stat_status = _wstat64(system_name.wide(), &st); |
if (stat_status == 0) { |
return st.st_mtime; |
} |
@@ -603,9 +592,9 @@ bool File::IsAbsolutePath(const char* pathname) { |
const char* File::GetCanonicalPath(const char* pathname) { |
- const wchar_t* system_name = StringUtilsWin::Utf8ToWide(pathname); |
+ Utf8ToWideScope system_name(pathname); |
HANDLE file_handle = CreateFileW( |
- system_name, |
+ system_name.wide(), |
0, |
FILE_SHARE_READ, |
NULL, |
@@ -639,7 +628,7 @@ const char* File::GetCanonicalPath(const char* pathname) { |
if ((result_size < MAX_PATH - 1 + 4) && |
(result_size > 4) && |
(wcsncmp(path, L"\\\\?\\", 4) == 0) && |
- (wcsncmp(system_name, L"\\\\?\\", 4) != 0)) { |
+ (wcsncmp(system_name.wide(), L"\\\\?\\", 4) != 0)) { |
result = StringUtilsWin::WideToUtf8(path + 4); |
} else { |
result = StringUtilsWin::WideToUtf8(path); |
@@ -670,19 +659,15 @@ File::StdioHandleType File::GetStdioHandleType(int fd) { |
File::Type File::GetType(const char* pathname, bool follow_links) { |
// Convert to wchar_t string. |
- int name_len = MultiByteToWideChar(CP_UTF8, 0, pathname, -1, NULL, 0); |
- wchar_t* name; |
- name = new wchar_t[name_len]; |
- MultiByteToWideChar(CP_UTF8, 0, pathname, -1, name, name_len); |
- |
- DWORD attributes = GetFileAttributesW(name); |
+ Utf8ToWideScope name(pathname); |
+ DWORD attributes = GetFileAttributesW(name.wide()); |
File::Type result = kIsFile; |
if (attributes == INVALID_FILE_ATTRIBUTES) { |
result = kDoesNotExist; |
} else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { |
if (follow_links) { |
HANDLE dir_handle = CreateFileW( |
- name, |
+ name.wide(), |
0, |
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
NULL, |
@@ -701,7 +686,6 @@ File::Type File::GetType(const char* pathname, bool follow_links) { |
} else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { |
result = kIsDirectory; |
} |
- delete[] name; |
return result; |
} |
@@ -710,9 +694,9 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) { |
BY_HANDLE_FILE_INFORMATION file_info[2]; |
const char* file_names[2] = { file_1, file_2 }; |
for (int i = 0; i < 2; ++i) { |
- const wchar_t* wide_name = StringUtilsWin::Utf8ToWide(file_names[i]); |
+ Utf8ToWideScope wide_name(file_names[i]); |
HANDLE file_handle = CreateFileW( |
- wide_name, |
+ wide_name.wide(), |
0, |
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
NULL, |