NANDContentLoader.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright 2009 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <cstddef>
  6. #include <map>
  7. #include <string>
  8. #include <vector>
  9. #include "Common/CommonTypes.h"
  10. #include "DiscIO/Volume.h"
  11. namespace DiscIO
  12. {
  13. bool Add_Ticket(u64 TitleID, const u8 *p_tik, u32 tikSize);
  14. struct SNANDContent
  15. {
  16. u32 m_ContentID;
  17. u16 m_Index;
  18. u16 m_Type;
  19. u32 m_Size;
  20. u8 m_SHA1Hash[20];
  21. u8 m_Header[36]; //all of the above
  22. std::string m_Filename;
  23. u8* m_pData;
  24. };
  25. // pure virtual interface so just the NANDContentManager can create these files only
  26. class INANDContentLoader
  27. {
  28. public:
  29. INANDContentLoader() {}
  30. virtual ~INANDContentLoader() {}
  31. virtual bool IsValid() const = 0;
  32. virtual void RemoveTitle() const = 0;
  33. virtual u64 GetTitleID() const = 0;
  34. virtual u16 GetIosVersion() const = 0;
  35. virtual u32 GetBootIndex() const = 0;
  36. virtual size_t GetContentSize() const = 0;
  37. virtual const SNANDContent* GetContentByIndex(int _Index) const = 0;
  38. virtual const u8* GetTMDView() const = 0;
  39. virtual const u8* GetTMDHeader() const = 0;
  40. virtual u32 GetTIKSize() const = 0;
  41. virtual const u8* GetTIK() const = 0;
  42. virtual const std::vector<SNANDContent>& GetContent() const = 0;
  43. virtual u16 GetTitleVersion() const = 0;
  44. virtual u16 GetNumEntries() const = 0;
  45. virtual DiscIO::IVolume::ECountry GetCountry() const = 0;
  46. virtual u8 GetCountryChar() const = 0;
  47. enum
  48. {
  49. TMD_VIEW_SIZE = 0x58,
  50. TMD_HEADER_SIZE = 0x1E4,
  51. CONTENT_HEADER_SIZE = 0x24,
  52. TICKET_SIZE = 0x2A4
  53. };
  54. };
  55. // we open the NAND Content files too often... let's cache them
  56. class CNANDContentManager
  57. {
  58. public:
  59. static CNANDContentManager& Access() { static CNANDContentManager instance; return instance; }
  60. u64 Install_WiiWAD(const std::string& fileName);
  61. const INANDContentLoader& GetNANDLoader(const std::string& _rName, bool forceReload = false);
  62. const INANDContentLoader& GetNANDLoader(u64 _titleId, bool forceReload = false);
  63. bool RemoveTitle(u64 _titleID);
  64. private:
  65. CNANDContentManager() {}
  66. ~CNANDContentManager();
  67. CNANDContentManager(CNANDContentManager const&) = delete;
  68. void operator=(CNANDContentManager const&) = delete;
  69. typedef std::map<std::string, INANDContentLoader*> CNANDContentMap;
  70. CNANDContentMap m_Map;
  71. };
  72. class CSharedContent
  73. {
  74. public:
  75. static CSharedContent& AccessInstance() { static CSharedContent instance; return instance; }
  76. std::string GetFilenameFromSHA1(const u8* _pHash);
  77. std::string AddSharedContent(const u8* _pHash);
  78. void UpdateLocation();
  79. private:
  80. CSharedContent();
  81. virtual ~CSharedContent();
  82. CSharedContent(CSharedContent const&) = delete;
  83. void operator=(CSharedContent const&) = delete;
  84. #pragma pack(push,1)
  85. struct SElement
  86. {
  87. u8 FileName[8];
  88. u8 SHA1Hash[20];
  89. };
  90. #pragma pack(pop)
  91. u32 m_lastID;
  92. std::string m_contentMap;
  93. std::vector<SElement> m_Elements;
  94. };
  95. class cUIDsys
  96. {
  97. public:
  98. static cUIDsys& AccessInstance() { static cUIDsys instance; return instance; }
  99. u32 GetUIDFromTitle(u64 _Title);
  100. void AddTitle(u64 _Title);
  101. void GetTitleIDs(std::vector<u64>& _TitleIDs, bool _owned = false);
  102. void UpdateLocation();
  103. private:
  104. cUIDsys();
  105. virtual ~cUIDsys();
  106. cUIDsys(cUIDsys const&) = delete;
  107. void operator=(cUIDsys const&) = delete;
  108. #pragma pack(push,1)
  109. struct SElement
  110. {
  111. u8 titleID[8];
  112. u8 UID[4];
  113. };
  114. #pragma pack(pop)
  115. u32 m_lastUID;
  116. std::string m_uidSys;
  117. std::vector<SElement> m_Elements;
  118. };
  119. }