summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2017-06-09 12:45:34 +0200
committerJosJuice <josjuice@gmail.com>2017-08-01 11:36:40 +0200
commita6bbf7e21b7ae1c0d11feb3acb88875b7b6e30ca (patch)
treead8e495503bfa49ebe7c93973189e003b6330708 /Source/Core
parent4cc8d3091cab23c8d76646099266209f45c872bb (diff)
DirectoryBlob: Don't keep DOL in memory
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/DiscIO/Blob.cpp2
-rw-r--r--Source/Core/DiscIO/DirectoryBlob.cpp22
-rw-r--r--Source/Core/DiscIO/DirectoryBlob.h7
3 files changed, 13 insertions, 18 deletions
diff --git a/Source/Core/DiscIO/Blob.cpp b/Source/Core/DiscIO/Blob.cpp
index a27f6861e1..7f4eeccb1c 100644
--- a/Source/Core/DiscIO/Blob.cpp
+++ b/Source/Core/DiscIO/Blob.cpp
@@ -204,7 +204,7 @@ std::unique_ptr<BlobReader> CreateBlobReader(const std::string& filename)
return WbfsFileReader::Create(std::move(file), filename);
default:
if (DirectoryBlobReader::IsValidDirectoryBlob(filename))
- return DirectoryBlobReader::Create(std::move(file), filename);
+ return DirectoryBlobReader::Create(filename);
return PlainFileReader::Create(std::move(file));
}
diff --git a/Source/Core/DiscIO/DirectoryBlob.cpp b/Source/Core/DiscIO/DirectoryBlob.cpp
index 49c0210be9..04c6d352b0 100644
--- a/Source/Core/DiscIO/DirectoryBlob.cpp
+++ b/Source/Core/DiscIO/DirectoryBlob.cpp
@@ -155,18 +155,16 @@ bool DirectoryBlobReader::IsValidDirectoryBlob(const std::string& dol_path)
return IsValidDirectoryBlob(dol_path, &root_directory);
}
-std::unique_ptr<DirectoryBlobReader> DirectoryBlobReader::Create(File::IOFile dol,
- const std::string& dol_path)
+std::unique_ptr<DirectoryBlobReader> DirectoryBlobReader::Create(const std::string& dol_path)
{
std::string root_directory;
- if (!dol || !IsValidDirectoryBlob(dol_path, &root_directory))
+ if (!IsValidDirectoryBlob(dol_path, &root_directory))
return nullptr;
- return std::unique_ptr<DirectoryBlobReader>(
- new DirectoryBlobReader(std::move(dol), root_directory));
+ return std::unique_ptr<DirectoryBlobReader>(new DirectoryBlobReader(root_directory));
}
-DirectoryBlobReader::DirectoryBlobReader(File::IOFile dol_file, const std::string& root_directory)
+DirectoryBlobReader::DirectoryBlobReader(const std::string& root_directory)
: m_root_directory(root_directory), m_data_start_address(UINT64_MAX),
m_disk_header(DISKHEADERINFO_ADDRESS),
m_disk_header_info(std::make_unique<SDiskHeaderInfo>()), m_fst_address(0), m_dol_address(0)
@@ -175,7 +173,7 @@ DirectoryBlobReader::DirectoryBlobReader(File::IOFile dol_file, const std::strin
// Setting the DOL relies on m_dol_address, which is set by SetApploader
if (SetApploader(m_root_directory + "sys/apploader.img"))
- SetDOL(std::move(dol_file));
+ SetDOL();
BuildFST();
@@ -183,7 +181,6 @@ DirectoryBlobReader::DirectoryBlobReader(File::IOFile dol_file, const std::strin
m_virtual_disc.emplace(DISKHEADERINFO_ADDRESS, sizeof(m_disk_header_info),
reinterpret_cast<const u8*>(m_disk_header_info.get()));
m_virtual_disc.emplace(APPLOADER_ADDRESS, m_apploader.size(), m_apploader.data());
- m_virtual_disc.emplace(m_dol_address, m_dol.size(), m_dol.data());
m_virtual_disc.emplace(m_fst_address, m_fst_data.size(), m_fst_data.data());
if (m_is_wii)
@@ -354,16 +351,15 @@ bool DirectoryBlobReader::SetApploader(const std::string& apploader)
}
}
-void DirectoryBlobReader::SetDOL(File::IOFile dol_file)
+void DirectoryBlobReader::SetDOL()
{
- m_dol.resize(dol_file.GetSize());
- dol_file.Seek(0, SEEK_SET);
- dol_file.ReadBytes(m_dol.data(), m_dol.size());
+ const DiscContent& dol =
+ AddFileToContents(&m_virtual_disc, m_root_directory + "sys/main.dol", m_dol_address);
Write32((u32)(m_dol_address >> m_address_shift), 0x0420, &m_disk_header);
// 32byte aligned (plus 0x20 padding)
- m_fst_address = Common::AlignUp(m_dol_address + m_dol.size() + 0x20, 0x20ull);
+ m_fst_address = Common::AlignUp(m_dol_address + dol.GetSize() + 0x20, 0x20ull);
}
void DirectoryBlobReader::BuildFST()
diff --git a/Source/Core/DiscIO/DirectoryBlob.h b/Source/Core/DiscIO/DirectoryBlob.h
index 8f9e17a225..ab42bd159b 100644
--- a/Source/Core/DiscIO/DirectoryBlob.h
+++ b/Source/Core/DiscIO/DirectoryBlob.h
@@ -57,7 +57,7 @@ class DirectoryBlobReader : public BlobReader
public:
static bool IsValidDirectoryBlob(const std::string& dol_path, std::string* root_directory);
static bool IsValidDirectoryBlob(const std::string& dol_path);
- static std::unique_ptr<DirectoryBlobReader> Create(File::IOFile dol, const std::string& dol_path);
+ static std::unique_ptr<DirectoryBlobReader> Create(const std::string& dol_path);
// We do not allow copying, because it might mess up the pointers inside DiscContents
DirectoryBlobReader(const DirectoryBlobReader&) = delete;
@@ -74,13 +74,13 @@ public:
u64 GetDataSize() const override;
private:
- DirectoryBlobReader(File::IOFile dol_file, const std::string& root_directory);
+ explicit DirectoryBlobReader(const std::string& root_directory);
bool ReadInternal(u64 offset, u64 length, u8* buffer, const std::set<DiscContent>& contents);
void SetDiscHeaderAndDiscType();
bool SetApploader(const std::string& apploader);
- void SetDOL(File::IOFile dol_file);
+ void SetDOL();
void BuildFST();
@@ -153,7 +153,6 @@ private:
std::unique_ptr<SDiskHeaderInfo> m_disk_header_info;
std::vector<u8> m_apploader;
- std::vector<u8> m_dol;
u64 m_fst_address;
u64 m_dol_address;