diff options
| author | 2015-07-10 00:55:23 +0300 | |
|---|---|---|
| committer | 2015-07-13 19:57:12 -0300 | |
| commit | c385b7767d32eccabbfeaa12764310cfc3d113b9 (patch) | |
| tree | 1868679b3e7c30c05eb76d5e1f09fd01c86e3e65 /src/core/loader/ncch.cpp | |
| parent | Merge pull request #927 from yuriks/getopt-fix (diff) | |
| download | yuzu-c385b7767d32eccabbfeaa12764310cfc3d113b9.tar.gz yuzu-c385b7767d32eccabbfeaa12764310cfc3d113b9.tar.xz yuzu-c385b7767d32eccabbfeaa12764310cfc3d113b9.zip | |
FS: Stream RomFS from file instead of loading all of it to memory
Diffstat (limited to 'src/core/loader/ncch.cpp')
| -rw-r--r-- | src/core/loader/ncch.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 87603d198..2bf1a6a26 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp | |||
| @@ -299,7 +299,7 @@ ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) const { | |||
| 299 | return LoadSectionExeFS("logo", buffer); | 299 | return LoadSectionExeFS("logo", buffer); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | ResultStatus AppLoader_NCCH::ReadRomFS(std::vector<u8>& buffer) const { | 302 | ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) const { |
| 303 | if (!file->IsOpen()) | 303 | if (!file->IsOpen()) |
| 304 | return ResultStatus::Error; | 304 | return ResultStatus::Error; |
| 305 | 305 | ||
| @@ -311,12 +311,17 @@ ResultStatus AppLoader_NCCH::ReadRomFS(std::vector<u8>& buffer) const { | |||
| 311 | LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset); | 311 | LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset); |
| 312 | LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size); | 312 | LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size); |
| 313 | 313 | ||
| 314 | buffer.resize(romfs_size); | 314 | if (file->GetSize () < romfs_offset + romfs_size) |
| 315 | return ResultStatus::Error; | ||
| 315 | 316 | ||
| 316 | file->Seek(romfs_offset, SEEK_SET); | 317 | // We reopen the file, to allow its position to be independent from file's |
| 317 | if (file->ReadBytes(&buffer[0], romfs_size) != romfs_size) | 318 | romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb"); |
| 319 | if (!romfs_file->IsOpen()) | ||
| 318 | return ResultStatus::Error; | 320 | return ResultStatus::Error; |
| 319 | 321 | ||
| 322 | offset = romfs_offset; | ||
| 323 | size = romfs_size; | ||
| 324 | |||
| 320 | return ResultStatus::Success; | 325 | return ResultStatus::Success; |
| 321 | } | 326 | } |
| 322 | LOG_DEBUG(Loader, "NCCH has no RomFS"); | 327 | LOG_DEBUG(Loader, "NCCH has no RomFS"); |