Get rid of a singleton for NAND shared contents

This also allows shared contents to be installed to the configured root
when installing a WAD.
This commit is contained in:
Léo Lam 2017-02-10 22:46:38 +01:00
parent 8f81051df3
commit 850802ea88
3 changed files with 15 additions and 34 deletions

View File

@ -25,7 +25,6 @@
#include "Core/Movie.h" #include "Core/Movie.h"
#include "Core/State.h" #include "Core/State.h"
#include "Core/WiiRoot.h" #include "Core/WiiRoot.h"
#include "DiscIO/NANDContentLoader.h"
namespace HW namespace HW
{ {
@ -52,7 +51,6 @@ void Init()
if (SConfig::GetInstance().bWii) if (SConfig::GetInstance().bWii)
{ {
Core::InitializeWiiRoot(Core::g_want_determinism); Core::InitializeWiiRoot(Core::g_want_determinism);
DiscIO::CSharedContent::AccessInstance().UpdateLocation();
IOS::Init(); IOS::Init();
IOS::HLE::Init(); // Depends on Memory IOS::HLE::Init(); // Depends on Memory
} }

View File

@ -75,17 +75,11 @@ std::vector<u8> AESDecode(const u8* key, u8* iv, const u8* src, u32 size)
CNANDContentData::~CNANDContentData() = default; CNANDContentData::~CNANDContentData() = default;
CSharedContent::CSharedContent() CSharedContent::CSharedContent(Common::FromWhichRoot root) : m_root(root)
{
UpdateLocation();
}
void CSharedContent::UpdateLocation()
{ {
m_Elements.clear(); m_Elements.clear();
m_LastID = 0; m_LastID = 0;
m_ContentMap = m_ContentMap = Common::RootUserPath(root) + "/shared1/content.map";
StringFromFormat("%s/shared1/content.map", File::GetUserPath(D_WIIROOT_IDX).c_str());
File::IOFile pFile(m_ContentMap, "rb"); File::IOFile pFile(m_ContentMap, "rb");
SElement Element; SElement Element;
@ -96,18 +90,14 @@ void CSharedContent::UpdateLocation()
} }
} }
CSharedContent::~CSharedContent() std::string CSharedContent::GetFilenameFromSHA1(const u8* hash) const
{ {
} for (const auto& Element : m_Elements)
std::string CSharedContent::GetFilenameFromSHA1(const u8* hash)
{
for (auto& Element : m_Elements)
{ {
if (memcmp(hash, Element.SHA1Hash, 20) == 0) if (memcmp(hash, Element.SHA1Hash, 20) == 0)
{ {
return StringFromFormat( return StringFromFormat(
"%s/shared1/%c%c%c%c%c%c%c%c.app", File::GetUserPath(D_WIIROOT_IDX).c_str(), "%s/shared1/%c%c%c%c%c%c%c%c.app", Common::RootUserPath(m_root).c_str(),
Element.FileName[0], Element.FileName[1], Element.FileName[2], Element.FileName[3], Element.FileName[0], Element.FileName[1], Element.FileName[2], Element.FileName[3],
Element.FileName[4], Element.FileName[5], Element.FileName[6], Element.FileName[7]); Element.FileName[4], Element.FileName[5], Element.FileName[6], Element.FileName[7]);
} }
@ -133,7 +123,7 @@ std::string CSharedContent::AddSharedContent(const u8* hash)
pFile.WriteArray(&Element, 1); pFile.WriteArray(&Element, 1);
filename = filename =
StringFromFormat("%s/shared1/%s.app", File::GetUserPath(D_WIIROOT_IDX).c_str(), id.c_str()); StringFromFormat("%s/shared1/%s.app", Common::RootUserPath(m_root).c_str(), id.c_str());
m_LastID++; m_LastID++;
} }
@ -288,6 +278,8 @@ void CNANDContentLoader::InitializeContentEntries(const std::vector<u8>& tmd,
std::array<u8, 16> iv; std::array<u8, 16> iv;
u32 data_app_offset = 0; u32 data_app_offset = 0;
CSharedContent shared_content{Common::FromWhichRoot::FROM_SESSION_ROOT};
for (u32 i = 0; i < m_NumEntries; i++) for (u32 i = 0; i < m_NumEntries; i++)
{ {
const u32 entry_offset = 0x24 * i; const u32 entry_offset = 0x24 * i;
@ -322,7 +314,7 @@ void CNANDContentLoader::InitializeContentEntries(const std::vector<u8>& tmd,
std::string filename; std::string filename;
if (content.m_Type & 0x8000) // shared app if (content.m_Type & 0x8000) // shared app
filename = CSharedContent::AccessInstance().GetFilenameFromSHA1(content.m_SHA1Hash); filename = shared_content.GetFilenameFromSHA1(content.m_SHA1Hash);
else else
filename = StringFromFormat("%s/%08x.app", m_Path.c_str(), content.m_ContentID); filename = StringFromFormat("%s/%08x.app", m_Path.c_str(), content.m_ContentID);
@ -495,6 +487,7 @@ u64 CNANDContentManager::Install_WiiWAD(const std::string& filename)
tmd_file.WriteBytes(content_loader.GetTMDHeader(), CNANDContentLoader::TMD_HEADER_SIZE); tmd_file.WriteBytes(content_loader.GetTMDHeader(), CNANDContentLoader::TMD_HEADER_SIZE);
CSharedContent shared_content{Common::FromWhichRoot::FROM_CONFIGURED_ROOT};
for (u32 i = 0; i < content_loader.GetContentSize(); i++) for (u32 i = 0; i < content_loader.GetContentSize(); i++)
{ {
const SNANDContent& content = content_loader.GetContent()[i]; const SNANDContent& content = content_loader.GetContent()[i];
@ -503,7 +496,7 @@ u64 CNANDContentManager::Install_WiiWAD(const std::string& filename)
std::string app_filename; std::string app_filename;
if (content.m_Type & 0x8000) // shared if (content.m_Type & 0x8000) // shared
app_filename = CSharedContent::AccessInstance().AddSharedContent(content.m_SHA1Hash); app_filename = shared_content.AddSharedContent(content.m_SHA1Hash);
else else
app_filename = StringFromFormat("%s%08x.app", content_path.c_str(), content.m_ContentID); app_filename = StringFromFormat("%s%08x.app", content_path.c_str(), content.m_ContentID);

View File

@ -155,26 +155,15 @@ private:
std::unordered_map<std::string, std::unique_ptr<CNANDContentLoader>> m_map; std::unordered_map<std::string, std::unique_ptr<CNANDContentLoader>> m_map;
}; };
class CSharedContent class CSharedContent final
{ {
public: public:
static CSharedContent& AccessInstance() explicit CSharedContent(Common::FromWhichRoot root);
{
static CSharedContent instance;
return instance;
}
std::string GetFilenameFromSHA1(const u8* hash); std::string GetFilenameFromSHA1(const u8* hash) const;
std::string AddSharedContent(const u8* hash); std::string AddSharedContent(const u8* hash);
void UpdateLocation();
private: private:
CSharedContent();
virtual ~CSharedContent();
CSharedContent(CSharedContent const&) = delete;
void operator=(CSharedContent const&) = delete;
#pragma pack(push, 1) #pragma pack(push, 1)
struct SElement struct SElement
{ {
@ -183,6 +172,7 @@ private:
}; };
#pragma pack(pop) #pragma pack(pop)
Common::FromWhichRoot m_root;
u32 m_LastID; u32 m_LastID;
std::string m_ContentMap; std::string m_ContentMap;
std::vector<SElement> m_Elements; std::vector<SElement> m_Elements;