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