| OLD | NEW |
| 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 "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 #if defined(HOST_OS_WINDOWS) | 6 #if defined(HOST_OS_WINDOWS) |
| 7 | 7 |
| 8 #include "bin/directory.h" | 8 #include "bin/directory.h" |
| 9 #include "bin/file.h" | |
| 10 #include "bin/utils.h" | |
| 11 #include "bin/utils_win.h" | |
| 12 | 9 |
| 13 #include <errno.h> // NOLINT | 10 #include <errno.h> // NOLINT |
| 14 #include <sys/stat.h> // NOLINT | 11 #include <sys/stat.h> // NOLINT |
| 15 | 12 |
| 16 #include "bin/dartutils.h" | 13 #include "bin/dartutils.h" |
| 14 #include "bin/file.h" |
| 17 #include "bin/log.h" | 15 #include "bin/log.h" |
| 16 #include "bin/namespace.h" |
| 17 #include "bin/utils.h" |
| 18 #include "bin/utils_win.h" |
| 18 | 19 |
| 19 #undef DeleteFile | 20 #undef DeleteFile |
| 20 | 21 |
| 21 #define MAX_LONG_PATH 32767 | 22 #define MAX_LONG_PATH 32767 |
| 22 | 23 |
| 23 namespace dart { | 24 namespace dart { |
| 24 namespace bin { | 25 namespace bin { |
| 25 | 26 |
| 26 PathBuffer::PathBuffer() : length_(0) { | 27 PathBuffer::PathBuffer() : length_(0) { |
| 27 data_ = calloc(MAX_LONG_PATH + 1, sizeof(wchar_t)); // NOLINT | 28 data_ = calloc(MAX_LONG_PATH + 1, sizeof(wchar_t)); // NOLINT |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 // reasons such as lack of permissions. In that case we do | 338 // reasons such as lack of permissions. In that case we do |
| 338 // not know if the directory exists. | 339 // not know if the directory exists. |
| 339 return Directory::UNKNOWN; | 340 return Directory::UNKNOWN; |
| 340 } | 341 } |
| 341 } | 342 } |
| 342 bool exists = (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; | 343 bool exists = (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; |
| 343 exists = exists && !IsBrokenLink(dir_name); | 344 exists = exists && !IsBrokenLink(dir_name); |
| 344 return exists ? Directory::EXISTS : Directory::DOES_NOT_EXIST; | 345 return exists ? Directory::EXISTS : Directory::DOES_NOT_EXIST; |
| 345 } | 346 } |
| 346 | 347 |
| 347 Directory::ExistsResult Directory::Exists(const char* dir_name) { | 348 Directory::ExistsResult Directory::Exists(Namespace* namespc, const char* dir_na
me) { |
| 348 Utf8ToWideScope system_name(dir_name); | 349 Utf8ToWideScope system_name(dir_name); |
| 349 return ExistsHelper(system_name.wide()); | 350 return ExistsHelper(system_name.wide()); |
| 350 } | 351 } |
| 351 | 352 |
| 352 char* Directory::CurrentNoScope() { | 353 char* Directory::CurrentNoScope() { |
| 353 int length = GetCurrentDirectoryW(0, NULL); | 354 int length = GetCurrentDirectoryW(0, NULL); |
| 354 if (length == 0) { | 355 if (length == 0) { |
| 355 return NULL; | 356 return NULL; |
| 356 } | 357 } |
| 357 wchar_t* current = new wchar_t[length + 1]; | 358 wchar_t* current = new wchar_t[length + 1]; |
| 358 GetCurrentDirectoryW(length + 1, current); | 359 GetCurrentDirectoryW(length + 1, current); |
| 359 int utf8_len = | 360 int utf8_len = |
| 360 WideCharToMultiByte(CP_UTF8, 0, current, -1, NULL, 0, NULL, NULL); | 361 WideCharToMultiByte(CP_UTF8, 0, current, -1, NULL, 0, NULL, NULL); |
| 361 char* result = reinterpret_cast<char*>(malloc(utf8_len)); | 362 char* result = reinterpret_cast<char*>(malloc(utf8_len)); |
| 362 WideCharToMultiByte(CP_UTF8, 0, current, -1, result, utf8_len, NULL, NULL); | 363 WideCharToMultiByte(CP_UTF8, 0, current, -1, result, utf8_len, NULL, NULL); |
| 363 delete[] current; | 364 delete[] current; |
| 364 return result; | 365 return result; |
| 365 } | 366 } |
| 366 | 367 |
| 367 const char* Directory::Current() { | 368 bool Directory::Create(Namespace* namespc, const char* dir_name) { |
| 368 int length = GetCurrentDirectoryW(0, NULL); | |
| 369 if (length == 0) { | |
| 370 return NULL; | |
| 371 } | |
| 372 wchar_t* current; | |
| 373 current = reinterpret_cast<wchar_t*>( | |
| 374 Dart_ScopeAllocate((length + 1) * sizeof(*current))); | |
| 375 GetCurrentDirectoryW(length + 1, current); | |
| 376 return StringUtilsWin::WideToUtf8(current); | |
| 377 } | |
| 378 | |
| 379 bool Directory::SetCurrent(const char* path) { | |
| 380 Utf8ToWideScope system_path(path); | |
| 381 bool result = SetCurrentDirectoryW(system_path.wide()) != 0; | |
| 382 return result; | |
| 383 } | |
| 384 | |
| 385 bool Directory::Create(const char* dir_name) { | |
| 386 Utf8ToWideScope system_name(dir_name); | 369 Utf8ToWideScope system_name(dir_name); |
| 387 int create_status = CreateDirectoryW(system_name.wide(), NULL); | 370 int create_status = CreateDirectoryW(system_name.wide(), NULL); |
| 388 // If the directory already existed, treat it as a success. | 371 // If the directory already existed, treat it as a success. |
| 389 if ((create_status == 0) && (GetLastError() == ERROR_ALREADY_EXISTS) && | 372 if ((create_status == 0) && (GetLastError() == ERROR_ALREADY_EXISTS) && |
| 390 (ExistsHelper(system_name.wide()) == EXISTS)) { | 373 (ExistsHelper(system_name.wide()) == EXISTS)) { |
| 391 return true; | 374 return true; |
| 392 } | 375 } |
| 393 return (create_status != 0); | 376 return (create_status != 0); |
| 394 } | 377 } |
| 395 | 378 |
| 396 const char* Directory::SystemTemp() { | 379 const char* Directory::SystemTemp(Namespace* namespc) { |
| 397 PathBuffer path; | 380 PathBuffer path; |
| 398 // Remove \ at end. | 381 // Remove \ at end. |
| 399 path.Reset(GetTempPathW(MAX_LONG_PATH, path.AsStringW()) - 1); | 382 path.Reset(GetTempPathW(MAX_LONG_PATH, path.AsStringW()) - 1); |
| 400 return path.AsScopedString(); | 383 return path.AsScopedString(); |
| 401 } | 384 } |
| 402 | 385 |
| 403 const char* Directory::CreateTemp(const char* prefix) { | 386 const char* Directory::CreateTemp(Namespace* namespc, const char* prefix) { |
| 404 // Returns a new, unused directory name, adding characters to the | 387 // Returns a new, unused directory name, adding characters to the |
| 405 // end of prefix. | 388 // end of prefix. |
| 406 // Creates this directory, with a default security | 389 // Creates this directory, with a default security |
| 407 // descriptor inherited from its parent directory. | 390 // descriptor inherited from its parent directory. |
| 408 // The return value is Dart_ScopeAllocated. | 391 // The return value is Dart_ScopeAllocated. |
| 409 PathBuffer path; | 392 PathBuffer path; |
| 410 Utf8ToWideScope system_prefix(prefix); | 393 Utf8ToWideScope system_prefix(prefix); |
| 411 if (!path.AddW(system_prefix.wide())) { | 394 if (!path.AddW(system_prefix.wide())) { |
| 412 return NULL; | 395 return NULL; |
| 413 } | 396 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 432 if (!path.AddW(reinterpret_cast<wchar_t*>(uuid_string))) { | 415 if (!path.AddW(reinterpret_cast<wchar_t*>(uuid_string))) { |
| 433 return NULL; | 416 return NULL; |
| 434 } | 417 } |
| 435 RpcStringFreeW(&uuid_string); | 418 RpcStringFreeW(&uuid_string); |
| 436 if (!CreateDirectoryW(path.AsStringW(), NULL)) { | 419 if (!CreateDirectoryW(path.AsStringW(), NULL)) { |
| 437 return NULL; | 420 return NULL; |
| 438 } | 421 } |
| 439 return path.AsScopedString(); | 422 return path.AsScopedString(); |
| 440 } | 423 } |
| 441 | 424 |
| 442 bool Directory::Delete(const char* dir_name, bool recursive) { | 425 bool Directory::Delete(Namespace* namespc, const char* dir_name, bool recursive)
{ |
| 443 bool result = false; | 426 bool result = false; |
| 444 Utf8ToWideScope system_dir_name(dir_name); | 427 Utf8ToWideScope system_dir_name(dir_name); |
| 445 if (!recursive) { | 428 if (!recursive) { |
| 446 if (File::GetType(dir_name, true) == File::kIsDirectory) { | 429 if (File::GetType(namespc, dir_name, true) == File::kIsDirectory) { |
| 447 result = (RemoveDirectoryW(system_dir_name.wide()) != 0); | 430 result = (RemoveDirectoryW(system_dir_name.wide()) != 0); |
| 448 } else { | 431 } else { |
| 449 SetLastError(ERROR_FILE_NOT_FOUND); | 432 SetLastError(ERROR_FILE_NOT_FOUND); |
| 450 } | 433 } |
| 451 } else { | 434 } else { |
| 452 PathBuffer path; | 435 PathBuffer path; |
| 453 if (path.AddW(system_dir_name.wide())) { | 436 if (path.AddW(system_dir_name.wide())) { |
| 454 result = DeleteRecursively(&path); | 437 result = DeleteRecursively(&path); |
| 455 } | 438 } |
| 456 } | 439 } |
| 457 return result; | 440 return result; |
| 458 } | 441 } |
| 459 | 442 |
| 460 bool Directory::Rename(const char* path, const char* new_path) { | 443 bool Directory::Rename(Namespace* namespc, const char* path, const char* new_pat
h) { |
| 461 Utf8ToWideScope system_path(path); | 444 Utf8ToWideScope system_path(path); |
| 462 Utf8ToWideScope system_new_path(new_path); | 445 Utf8ToWideScope system_new_path(new_path); |
| 463 ExistsResult exists = ExistsHelper(system_path.wide()); | 446 ExistsResult exists = ExistsHelper(system_path.wide()); |
| 464 if (exists != EXISTS) { | 447 if (exists != EXISTS) { |
| 465 return false; | 448 return false; |
| 466 } | 449 } |
| 467 ExistsResult new_exists = ExistsHelper(system_new_path.wide()); | 450 ExistsResult new_exists = ExistsHelper(system_new_path.wide()); |
| 468 // MoveFile does not allow replacing existing directories. Therefore, | 451 // MoveFile does not allow replacing existing directories. Therefore, |
| 469 // if the new_path is currently a directory we need to delete it | 452 // if the new_path is currently a directory we need to delete it |
| 470 // first. | 453 // first. |
| 471 if (new_exists == EXISTS) { | 454 if (new_exists == EXISTS) { |
| 472 bool success = Delete(new_path, true); | 455 bool success = Delete(namespc, new_path, true); |
| 473 if (!success) { | 456 if (!success) { |
| 474 return false; | 457 return false; |
| 475 } | 458 } |
| 476 } | 459 } |
| 477 DWORD flags = MOVEFILE_WRITE_THROUGH; | 460 DWORD flags = MOVEFILE_WRITE_THROUGH; |
| 478 int move_status = | 461 int move_status = |
| 479 MoveFileExW(system_path.wide(), system_new_path.wide(), flags); | 462 MoveFileExW(system_path.wide(), system_new_path.wide(), flags); |
| 480 return (move_status != 0); | 463 return (move_status != 0); |
| 481 } | 464 } |
| 482 | 465 |
| 483 } // namespace bin | 466 } // namespace bin |
| 484 } // namespace dart | 467 } // namespace dart |
| 485 | 468 |
| 486 #endif // defined(HOST_OS_WINDOWS) | 469 #endif // defined(HOST_OS_WINDOWS) |
| OLD | NEW |