From 8a6d9e1e0b2fe407dd986b4982ca77e91f0604c3 Mon Sep 17 00:00:00 2001 From: BhaaL Date: Wed, 16 Mar 2016 20:08:37 +0100 Subject: hide the distinction between WAD and File from ES instead, leave all the management with the NANDContentLoader. for file data (directly on the NAND), this opens the file on-demand and returns the requested chunk when asked for it. for on-the-fly decrypted WAD data, we just keep the decoded buffer in memory, like we've done before - except that we don't give away any objects we don't want to. --- Source/Core/DiscIO/NANDContentLoader.cpp | 55 ++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'Source/Core/DiscIO/NANDContentLoader.cpp') diff --git a/Source/Core/DiscIO/NANDContentLoader.cpp b/Source/Core/DiscIO/NANDContentLoader.cpp index 0ab9383802..6a9fc29bdf 100644 --- a/Source/Core/DiscIO/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/NANDContentLoader.cpp @@ -92,6 +92,46 @@ std::string CSharedContent::AddSharedContent(const u8* hash) } +const std::vector CNANDContentDataFile::Get() +{ + std::vector result; + File::IOFile file(m_filename, "rb"); + if (!file.IsGood()) + return result; + + u64 size = file.GetSize(); + if (size == 0) + return result; + + result.resize(size); + file.ReadBytes(result.data(), result.size()); + + return result; +} + +bool CNANDContentDataFile::GetRange(u32 start, u32 size, u8* buffer) +{ + File::IOFile file(m_filename, "rb"); + if (!file.IsGood()) + return false; + + if (!file.Seek(start, SEEK_SET)) + return false; + + return file.ReadBytes(buffer, static_cast(size)); +} + + +bool CNANDContentDataBuffer::GetRange(u32 start, u32 size, u8* buffer) +{ + if (start + size > m_buffer.size()) + return false; + + std::copy(&m_buffer[start], &m_buffer[start + size], buffer); + return true; +} + + CNANDContentLoader::CNANDContentLoader(const std::string& content_name) : m_Valid(false) , m_IsWAD(false) @@ -207,20 +247,23 @@ void CNANDContentLoader::InitializeContentEntries(const std::vector& tmd, co iv.fill(0); std::copy(&tmd[entry_offset + 0x01E8], &tmd[entry_offset + 0x01E8 + 2], iv.begin()); - content.m_data = AESDecode(decrypted_title_key.data(), iv.data(), &data_app[data_app_offset], rounded_size); + content.m_Data = std::make_unique(AESDecode(decrypted_title_key.data(), iv.data(), &data_app[data_app_offset], rounded_size)); data_app_offset += rounded_size; continue; } + std::string filename; if (content.m_Type & 0x8000) // shared app - content.m_Filename = CSharedContent::AccessInstance().GetFilenameFromSHA1(content.m_SHA1Hash); + filename = CSharedContent::AccessInstance().GetFilenameFromSHA1(content.m_SHA1Hash); else - content.m_Filename = StringFromFormat("%s/%08x.app", m_Path.c_str(), content.m_ContentID); + filename = StringFromFormat("%s/%08x.app", m_Path.c_str(), content.m_ContentID); + + content.m_Data = std::make_unique(filename); // Be graceful about incorrect TMDs. - if (File::Exists(content.m_Filename)) - content.m_Size = static_cast(File::GetSize(content.m_Filename)); + if (File::Exists(filename)) + content.m_Size = static_cast(File::GetSize(filename)); } } @@ -429,7 +472,7 @@ u64 CNANDContentManager::Install_WiiWAD(const std::string& filename) return 0; } - app_file.WriteBytes(content.m_data.data(), content.m_Size); + app_file.WriteBytes(content.m_Data->Get().data(), content.m_Size); } else { -- cgit v1.2.3