1 // Copyright 2008 Dolphin Emulator Project 2 // Licensed under GPLv2+ 3 // Refer to the license.txt file included. 4 5 #pragma once 6 7 #include <array> 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "Common/CommonTypes.h" 13 #include "Core/SyncIdentifier.h" 14 #include "DiscIO/Blob.h" 15 #include "DiscIO/Enums.h" 16 17 class PointerWrap; 18 19 namespace Core 20 { 21 class TitleDatabase; 22 } 23 24 namespace UICommon 25 { 26 struct GameBanner 27 { 28 std::vector<u32> buffer; 29 u32 width{}; 30 u32 height{}; emptyGameBanner31 bool empty() const { return buffer.empty(); } 32 void DoState(PointerWrap& p); 33 }; 34 35 struct GameCover 36 { 37 std::vector<u8> buffer; emptyGameCover38 bool empty() const { return buffer.empty(); } 39 void DoState(PointerWrap& p); 40 }; 41 42 bool operator==(const GameBanner& lhs, const GameBanner& rhs); 43 bool operator!=(const GameBanner& lhs, const GameBanner& rhs); 44 45 // This class caches the metadata of a DiscIO::Volume (or a DOL/ELF file). 46 class GameFile final 47 { 48 public: 49 enum class Variant 50 { 51 LongAndPossiblyCustom, 52 LongAndNotCustom, 53 ShortAndNotCustom, 54 }; 55 56 GameFile(); 57 explicit GameFile(std::string path); 58 ~GameFile(); 59 60 bool IsValid() const; GetFilePath()61 const std::string& GetFilePath() const { return m_file_path; } GetFileName()62 const std::string& GetFileName() const { return m_file_name; } 63 const std::string& GetName(const Core::TitleDatabase& title_database) const; 64 const std::string& GetName(Variant variant) const; 65 const std::string& GetMaker(Variant variant) const; GetShortName(DiscIO::Language l)66 const std::string& GetShortName(DiscIO::Language l) const { return Lookup(l, m_short_names); } GetShortName()67 const std::string& GetShortName() const { return LookupUsingConfigLanguage(m_short_names); } GetLongName(DiscIO::Language l)68 const std::string& GetLongName(DiscIO::Language l) const { return Lookup(l, m_long_names); } GetLongName()69 const std::string& GetLongName() const { return LookupUsingConfigLanguage(m_long_names); } GetShortMaker(DiscIO::Language l)70 const std::string& GetShortMaker(DiscIO::Language l) const { return Lookup(l, m_short_makers); } GetShortMaker()71 const std::string& GetShortMaker() const { return LookupUsingConfigLanguage(m_short_makers); } GetLongMaker(DiscIO::Language l)72 const std::string& GetLongMaker(DiscIO::Language l) const { return Lookup(l, m_long_makers); } GetLongMaker()73 const std::string& GetLongMaker() const { return LookupUsingConfigLanguage(m_long_makers); } GetDescription(DiscIO::Language l)74 const std::string& GetDescription(DiscIO::Language l) const { return Lookup(l, m_descriptions); } 75 const std::string& GetDescription(Variant variant) const; 76 std::vector<DiscIO::Language> GetLanguages() const; GetInternalName()77 const std::string& GetInternalName() const { return m_internal_name; } GetGameID()78 const std::string& GetGameID() const { return m_game_id; } GetGameTDBID()79 const std::string& GetGameTDBID() const { return m_gametdb_id; } GetTitleID()80 u64 GetTitleID() const { return m_title_id; } GetMakerID()81 const std::string& GetMakerID() const { return m_maker_id; } GetRevision()82 u16 GetRevision() const { return m_revision; } 83 // 0 is the first disc, 1 is the second disc GetDiscNumber()84 u8 GetDiscNumber() const { return m_disc_number; } 85 std::string GetNetPlayName(const Core::TitleDatabase& title_database) const; 86 87 // This function is slow 88 std::array<u8, 20> GetSyncHash() const; 89 // This function is slow 90 NetPlay::SyncIdentifier GetSyncIdentifier() const; 91 // This function is slow if all of game_id, revision, disc_number, is_datel are identical 92 NetPlay::SyncIdentifierComparison 93 CompareSyncIdentifier(const NetPlay::SyncIdentifier& sync_identifier) const; 94 95 std::string GetWiiFSPath() const; GetRegion()96 DiscIO::Region GetRegion() const { return m_region; } GetCountry()97 DiscIO::Country GetCountry() const { return m_country; } GetPlatform()98 DiscIO::Platform GetPlatform() const { return m_platform; } GetBlobType()99 DiscIO::BlobType GetBlobType() const { return m_blob_type; } GetBlockSize()100 u64 GetBlockSize() const { return m_block_size; } GetCompressionMethod()101 const std::string& GetCompressionMethod() const { return m_compression_method; } 102 bool ShouldShowFileFormatDetails() const; 103 std::string GetFileFormatName() const; 104 bool ShouldAllowConversion() const; GetApploaderDate()105 const std::string& GetApploaderDate() const { return m_apploader_date; } GetFileSize()106 u64 GetFileSize() const { return m_file_size; } GetVolumeSize()107 u64 GetVolumeSize() const { return m_volume_size; } IsVolumeSizeAccurate()108 bool IsVolumeSizeAccurate() const { return m_volume_size_is_accurate; } IsDatelDisc()109 bool IsDatelDisc() const { return m_is_datel_disc; } 110 const GameBanner& GetBannerImage() const; 111 const GameCover& GetCoverImage() const; 112 void DoState(PointerWrap& p); 113 bool XMLMetadataChanged(); 114 void XMLMetadataCommit(); 115 bool WiiBannerChanged(); 116 void WiiBannerCommit(); 117 bool CustomBannerChanged(); 118 void CustomBannerCommit(); 119 void DownloadDefaultCover(); 120 bool DefaultCoverChanged(); 121 void DefaultCoverCommit(); 122 bool CustomCoverChanged(); 123 void CustomCoverCommit(); 124 125 private: 126 DiscIO::Language GetConfigLanguage() const; 127 static const std::string& Lookup(DiscIO::Language language, 128 const std::map<DiscIO::Language, std::string>& strings); 129 const std::string& 130 LookupUsingConfigLanguage(const std::map<DiscIO::Language, std::string>& strings) const; 131 std::string GetExtension() const; 132 bool IsElfOrDol() const; 133 bool ReadXMLMetadata(const std::string& path); 134 bool ReadPNGBanner(const std::string& path); 135 136 // IMPORTANT: Nearly all data members must be save/restored in DoState. 137 // If anything is changed, make sure DoState handles it properly and 138 // CACHE_REVISION in GameFileCache.cpp is incremented. 139 140 bool m_valid{}; 141 std::string m_file_path; 142 std::string m_file_name; 143 144 u64 m_file_size{}; 145 u64 m_volume_size{}; 146 bool m_volume_size_is_accurate{}; 147 bool m_is_datel_disc{}; 148 149 std::map<DiscIO::Language, std::string> m_short_names; 150 std::map<DiscIO::Language, std::string> m_long_names; 151 std::map<DiscIO::Language, std::string> m_short_makers; 152 std::map<DiscIO::Language, std::string> m_long_makers; 153 std::map<DiscIO::Language, std::string> m_descriptions; 154 std::string m_internal_name; 155 std::string m_game_id; 156 std::string m_gametdb_id; 157 u64 m_title_id{}; 158 std::string m_maker_id; 159 160 DiscIO::Region m_region{DiscIO::Region::Unknown}; 161 DiscIO::Country m_country{DiscIO::Country::Unknown}; 162 DiscIO::Platform m_platform{}; 163 DiscIO::BlobType m_blob_type{}; 164 u64 m_block_size{}; 165 std::string m_compression_method{}; 166 u16 m_revision{}; 167 u8 m_disc_number{}; 168 std::string m_apploader_date; 169 170 std::string m_custom_name; 171 std::string m_custom_description; 172 std::string m_custom_maker; 173 GameBanner m_volume_banner{}; 174 GameBanner m_custom_banner{}; 175 GameCover m_default_cover{}; 176 GameCover m_custom_cover{}; 177 178 // The following data members allow GameFileCache to construct updated versions 179 // of GameFiles in a threadsafe way. They should not be handled in DoState. 180 struct 181 { 182 std::string custom_name; 183 std::string custom_description; 184 std::string custom_maker; 185 GameBanner volume_banner; 186 GameBanner custom_banner; 187 GameCover default_cover; 188 GameCover custom_cover; 189 } m_pending{}; 190 }; 191 192 } // namespace UICommon 193