diff options
| author | 2018-09-19 21:55:47 -0400 | |
|---|---|---|
| committer | 2018-09-21 19:53:05 -0400 | |
| commit | f68e324672ba93cf932e64a05cbdad871cb6e235 (patch) | |
| tree | e7944cc071d4655c8dfd48050b262620812a90f3 /src/core/file_sys/vfs.cpp | |
| parent | vfs: Add GetEntries method (diff) | |
| download | yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.gz yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.tar.xz yuzu-f68e324672ba93cf932e64a05cbdad871cb6e235.zip | |
vfs: Add and rewite VfsRawCopy functions
Diffstat (limited to 'src/core/file_sys/vfs.cpp')
| -rw-r--r-- | src/core/file_sys/vfs.cpp | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/src/core/file_sys/vfs.cpp b/src/core/file_sys/vfs.cpp index 1ddfb7600..218cfde66 100644 --- a/src/core/file_sys/vfs.cpp +++ b/src/core/file_sys/vfs.cpp | |||
| @@ -463,13 +463,41 @@ bool DeepEquals(const VirtualFile& file1, const VirtualFile& file2, std::size_t | |||
| 463 | return true; | 463 | return true; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | bool VfsRawCopy(VirtualFile src, VirtualFile dest) { | 466 | bool VfsRawCopy(const VirtualFile& src, const VirtualFile& dest, size_t block_size) { |
| 467 | if (src == nullptr || dest == nullptr) | 467 | if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) |
| 468 | return false; | 468 | return false; |
| 469 | if (!dest->Resize(src->GetSize())) | 469 | if (!dest->Resize(src->GetSize())) |
| 470 | return false; | 470 | return false; |
| 471 | std::vector<u8> data = src->ReadAllBytes(); | 471 | |
| 472 | return dest->WriteBytes(data, 0) == data.size(); | 472 | std::vector<u8> temp(std::min(block_size, src->GetSize())); |
| 473 | for (size_t i = 0; i < src->GetSize(); i += block_size) { | ||
| 474 | const auto read = std::min(block_size, src->GetSize() - i); | ||
| 475 | const auto block = src->Read(temp.data(), read, i); | ||
| 476 | |||
| 477 | if (dest->Write(temp.data(), read, i) != read) | ||
| 478 | return false; | ||
| 479 | } | ||
| 480 | |||
| 481 | return true; | ||
| 482 | } | ||
| 483 | |||
| 484 | bool VfsRawCopyD(const VirtualDir& src, const VirtualDir& dest, size_t block_size) { | ||
| 485 | if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) | ||
| 486 | return false; | ||
| 487 | |||
| 488 | for (const auto& file : src->GetFiles()) { | ||
| 489 | const auto out = dest->CreateFile(file->GetName()); | ||
| 490 | if (!VfsRawCopy(file, out, block_size)) | ||
| 491 | return false; | ||
| 492 | } | ||
| 493 | |||
| 494 | for (const auto& dir : src->GetSubdirectories()) { | ||
| 495 | const auto out = dest->CreateSubdirectory(dir->GetName()); | ||
| 496 | if (!VfsRawCopyD(dir, out, block_size)) | ||
| 497 | return false; | ||
| 498 | } | ||
| 499 | |||
| 500 | return true; | ||
| 473 | } | 501 | } |
| 474 | 502 | ||
| 475 | VirtualDir GetOrCreateDirectoryRelative(const VirtualDir& rel, std::string_view path) { | 503 | VirtualDir GetOrCreateDirectoryRelative(const VirtualDir& rel, std::string_view path) { |