diff options
| author | fires.gc <fires.gc@gmail.com> | 2009-03-13 16:15:15 +0000 |
|---|---|---|
| committer | fires.gc <fires.gc@gmail.com> | 2009-03-13 16:15:15 +0000 |
| commit | 0b76db1c0406cb59d9934d002f06516cff717429 (patch) | |
| tree | c899b96a59ddb9619e4bc3a6ece4d6b74b734435 /Source/Core/DiscIO | |
| parent | b3a6208fccab9cdfb264fb123aeff2d82b0865ee (diff) | |
fixed some ES problems and added cached for NANDContentLoader (we open this content files ways to often at the moment)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2651 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DiscIO')
| -rw-r--r-- | Source/Core/DiscIO/Src/NANDContentLoader.cpp | 144 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Src/NANDContentLoader.h | 64 |
2 files changed, 145 insertions, 63 deletions
diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.cpp b/Source/Core/DiscIO/Src/NANDContentLoader.cpp index 3e29a2f799..1de5423397 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/Src/NANDContentLoader.cpp @@ -18,6 +18,8 @@ #include "stdafx.h" #include "NANDContentLoader.h" +#include <algorithm> +#include <cctype> #include "AES/aes.h" #include "MathUtil.h" #include "FileUtil.h" @@ -110,6 +112,53 @@ private: }; +// this classes must be created by the CNANDContentManager +class CNANDContentLoader : public INANDContentLoader +{ +public: + + CNANDContentLoader(const std::string& _rName); + + virtual ~CNANDContentLoader(); + + bool IsValid() const { return m_Valid; } + u64 GetTitleID() const { return m_TitleID; } + u32 GetBootIndex() const { return m_BootIndex; } + size_t GetContentSize() const { return m_Content.size(); } + const SNANDContent* GetContentByIndex(int _Index) const; + const u8* GetTicket() const { return m_TicketView; } + + const std::vector<SNANDContent>& GetContent() const { return m_Content; } + + const u16 GetTitleVersion() const {return m_TileVersion;} + const u16 GetNumEntries() const {return m_numEntries;} + +private: + + bool m_Valid; + u64 m_TitleID; + u32 m_BootIndex; + u16 m_numEntries; + u16 m_TileVersion; + u8 m_TicketView[TICKET_VIEW_SIZE]; + + std::vector<SNANDContent> m_Content; + + bool CreateFromDirectory(const std::string& _rPath); + bool CreateFromWAD(const std::string& _rName); + + bool ParseWAD(DiscIO::IBlobReader& _rReader); + + void AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest); + + u8* CreateWADEntry(DiscIO::IBlobReader& _rReader, u32 _Size, u64 _Offset); + + void GetKeyFromTicket(u8* pTicket, u8* pTicketKey); + + bool ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u8* pTMD); +}; + + CNANDContentLoader::CNANDContentLoader(const std::string& _rName) @@ -140,7 +189,7 @@ CNANDContentLoader::~CNANDContentLoader() m_Content.clear(); } -SNANDContent* CNANDContentLoader::GetContentByIndex(int _Index) +const SNANDContent* CNANDContentLoader::GetContentByIndex(int _Index) const { for (size_t i=0; i<m_Content.size(); i++) { @@ -232,35 +281,6 @@ bool CNANDContentLoader::CreateFromDirectory(const std::string& _rPath) return true; } - -bool CNANDContentLoader::IsWiiWAD(const std::string& _rName) -{ - DiscIO::IBlobReader* pReader = DiscIO::CreateBlobReader(_rName.c_str()); - if (pReader == NULL) - return false; - - CBlobBigEndianReader Reader(*pReader); - bool Result = false; - - // check for wii wad - if (Reader.Read32(0x00) == 0x20) - { - u32 WADTYpe = Reader.Read32(0x04); - switch(WADTYpe) - { - case 0x49730000: - case 0x69620000: - Result = true; - } - } - - delete pReader; - - return Result; -} - - - void CNANDContentLoader::AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest) { AES_KEY AESKey; @@ -371,6 +391,70 @@ bool CNANDContentLoader::ParseWAD(DiscIO::IBlobReader& _rReader) return Result; } +/////////////////// + + +CNANDContentManager CNANDContentManager::m_Instance; + + +CNANDContentManager::~CNANDContentManager() +{ + CNANDContentMap::iterator itr = m_Map.begin(); + while (itr != m_Map.end()) + { + delete itr->second; + itr++; + } + m_Map.clear(); +} + +const INANDContentLoader& CNANDContentManager::GetNANDLoader(const std::string& _rName) +{ + std::string KeyString(_rName); + + std::transform(KeyString.begin(), KeyString.end(), KeyString.begin(), + (int(*)(int)) std::toupper); + + + CNANDContentMap::iterator itr = m_Map.find(KeyString); + if (itr != m_Map.end()) + return *itr->second; + + m_Map[KeyString] = new CNANDContentLoader(KeyString); + return *m_Map[KeyString]; +} + + +bool CNANDContentManager::IsWiiWAD(const std::string& _rName) +{ + DiscIO::IBlobReader* pReader = DiscIO::CreateBlobReader(_rName.c_str()); + if (pReader == NULL) + return false; + + CBlobBigEndianReader Reader(*pReader); + bool Result = false; + + // check for wii wad + if (Reader.Read32(0x00) == 0x20) + { + u32 WADTYpe = Reader.Read32(0x04); + switch(WADTYpe) + { + case 0x49730000: + case 0x69620000: + Result = true; + } + } + + delete pReader; + + return Result; +} + + + + + } // namespace end diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.h b/Source/Core/DiscIO/Src/NANDContentLoader.h index 7757f7440c..c65efbe0ff 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.h +++ b/Source/Core/DiscIO/Src/NANDContentLoader.h @@ -20,6 +20,8 @@ #include <string>
#include <vector>
+#include <map>
+
#include "Common.h"
#include "Blob.h"
@@ -36,58 +38,54 @@ struct SNANDContent u8* m_pData;
};
-class CNANDContentLoader
+// pure virtual interface so just the NANDContentManager can create these files only
+class INANDContentLoader
{
public:
- CNANDContentLoader(const std::string& _rName);
-
- virtual ~CNANDContentLoader();
+ INANDContentLoader() {}
- bool IsValid() const { return m_Valid; }
- u64 GetTitleID() const { return m_TitleID; }
- u32 GetBootIndex() const { return m_BootIndex; }
- size_t GetContentSize() const { return m_Content.size(); }
- SNANDContent* GetContentByIndex(int _Index);
- const u8* GetTicket() const { return m_TicketView; }
+ virtual ~INANDContentLoader() {}
- const std::vector<SNANDContent>& GetContent() const { return m_Content; }
-
- static bool IsWiiWAD(const std::string& _rName);
-
- const u16 GetTitleVersion() const {return m_TileVersion;}
- const u16 GetNumEntries() const {return m_numEntries;}
-
+ virtual bool IsValid() const = NULL;
+ virtual u64 GetTitleID() const = NULL;
+ virtual u32 GetBootIndex() const = NULL;
+ virtual size_t GetContentSize() const = NULL;
+ virtual const SNANDContent* GetContentByIndex(int _Index) const = NULL;;
+ virtual const u8* GetTicket() const = NULL;
+ virtual const std::vector<SNANDContent>& GetContent() const = NULL;
+ virtual const u16 GetTitleVersion() const = NULL;
+ virtual const u16 GetNumEntries() const = NULL;
enum
{
TICKET_VIEW_SIZE = 0x58
};
+};
-private:
- bool m_Valid;
- u64 m_TitleID;
- u32 m_BootIndex;
- u16 m_numEntries;
- u16 m_TileVersion;
- u8 m_TicketView[TICKET_VIEW_SIZE];
+// we open the NAND Content files to often... lets cache them
+class CNANDContentManager
+{
+public:
+
+ static CNANDContentManager& Access() { return m_Instance; }
- std::vector<SNANDContent> m_Content;
+ const INANDContentLoader& GetNANDLoader(const std::string& _rName);
- bool CreateFromDirectory(const std::string& _rPath);
- bool CreateFromWAD(const std::string& _rName);
+ static bool IsWiiWAD(const std::string& _rName);
+
+private:
- bool ParseWAD(DiscIO::IBlobReader& _rReader);
+ CNANDContentManager() {};
- void AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest);
+ ~CNANDContentManager();
- u8* CreateWADEntry(DiscIO::IBlobReader& _rReader, u32 _Size, u64 _Offset);
+ static CNANDContentManager m_Instance;
- void GetKeyFromTicket(u8* pTicket, u8* pTicketKey);
-
+ typedef std::map<std::string, INANDContentLoader*> CNANDContentMap;
+ CNANDContentMap m_Map;
- bool ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u8* pTMD);
};
}
|
