diff options
| author | 2018-09-25 16:59:44 -0400 | |
|---|---|---|
| committer | 2018-09-25 16:59:44 -0400 | |
| commit | 7b81e1e52565ee867c285e2b0c2526f8d4b82581 (patch) | |
| tree | 718decad5aae4153d8acaa444058914a1c12f147 /src/core/file_sys/vfs.cpp | |
| parent | Merge pull request #1393 from tech4me/svc (diff) | |
| parent | fsmitm: Cleanup and modernize fsmitm port (diff) | |
| download | yuzu-7b81e1e52565ee867c285e2b0c2526f8d4b82581.tar.gz yuzu-7b81e1e52565ee867c285e2b0c2526f8d4b82581.tar.xz yuzu-7b81e1e52565ee867c285e2b0c2526f8d4b82581.zip | |
Merge pull request #1365 from DarkLordZach/lfs
file_sys: Add support for LayeredFS mods
Diffstat (limited to 'src/core/file_sys/vfs.cpp')
| -rw-r--r-- | src/core/file_sys/vfs.cpp | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/core/file_sys/vfs.cpp b/src/core/file_sys/vfs.cpp index d7b52abfd..5fbea1739 100644 --- a/src/core/file_sys/vfs.cpp +++ b/src/core/file_sys/vfs.cpp | |||
| @@ -399,6 +399,15 @@ bool VfsDirectory::Copy(std::string_view src, std::string_view dest) { | |||
| 399 | return f2->WriteBytes(f1->ReadAllBytes()) == f1->GetSize(); | 399 | return f2->WriteBytes(f1->ReadAllBytes()) == f1->GetSize(); |
| 400 | } | 400 | } |
| 401 | 401 | ||
| 402 | std::map<std::string, VfsEntryType, std::less<>> VfsDirectory::GetEntries() const { | ||
| 403 | std::map<std::string, VfsEntryType, std::less<>> out; | ||
| 404 | for (const auto& dir : GetSubdirectories()) | ||
| 405 | out.emplace(dir->GetName(), VfsEntryType::Directory); | ||
| 406 | for (const auto& file : GetFiles()) | ||
| 407 | out.emplace(file->GetName(), VfsEntryType::File); | ||
| 408 | return out; | ||
| 409 | } | ||
| 410 | |||
| 402 | std::string VfsDirectory::GetFullPath() const { | 411 | std::string VfsDirectory::GetFullPath() const { |
| 403 | if (IsRoot()) | 412 | if (IsRoot()) |
| 404 | return GetName(); | 413 | return GetName(); |
| @@ -454,13 +463,41 @@ bool DeepEquals(const VirtualFile& file1, const VirtualFile& file2, std::size_t | |||
| 454 | return true; | 463 | return true; |
| 455 | } | 464 | } |
| 456 | 465 | ||
| 457 | bool VfsRawCopy(VirtualFile src, VirtualFile dest) { | 466 | bool VfsRawCopy(const VirtualFile& src, const VirtualFile& dest, size_t block_size) { |
| 458 | if (src == nullptr || dest == nullptr) | 467 | if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) |
| 459 | return false; | 468 | return false; |
| 460 | if (!dest->Resize(src->GetSize())) | 469 | if (!dest->Resize(src->GetSize())) |
| 461 | return false; | 470 | return false; |
| 462 | std::vector<u8> data = src->ReadAllBytes(); | 471 | |
| 463 | 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; | ||
| 464 | } | 501 | } |
| 465 | 502 | ||
| 466 | VirtualDir GetOrCreateDirectoryRelative(const VirtualDir& rel, std::string_view path) { | 503 | VirtualDir GetOrCreateDirectoryRelative(const VirtualDir& rel, std::string_view path) { |