| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 16:49:48 -06:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2015-04-09 17:44:53 +02:00
										 |  |  | #include <map>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-20 21:10:31 -04:00
										 |  |  | #include "Common/CommonFuncs.h"
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:10:49 +02:00
										 |  |  | #include "Common/StringUtil.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-27 14:01:12 +02:00
										 |  |  | #include "DiscIO/Blob.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | class IVolume | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-31 22:42:10 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-25 18:07:10 +02:00
										 |  |  |   // Increment CACHE_REVISION if the enums below are modified (ISOFile.cpp & GameFile.cpp)
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   enum EPlatform | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     GAMECUBE_DISC = 0, | 
					
						
							|  |  |  |     WII_DISC, | 
					
						
							|  |  |  |     WII_WAD, | 
					
						
							|  |  |  |     ELF_DOL, | 
					
						
							|  |  |  |     NUMBER_OF_PLATFORMS | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum ECountry | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     COUNTRY_EUROPE = 0, | 
					
						
							|  |  |  |     COUNTRY_JAPAN, | 
					
						
							|  |  |  |     COUNTRY_USA, | 
					
						
							|  |  |  |     COUNTRY_AUSTRALIA, | 
					
						
							|  |  |  |     COUNTRY_FRANCE, | 
					
						
							|  |  |  |     COUNTRY_GERMANY, | 
					
						
							|  |  |  |     COUNTRY_ITALY, | 
					
						
							|  |  |  |     COUNTRY_KOREA, | 
					
						
							|  |  |  |     COUNTRY_NETHERLANDS, | 
					
						
							|  |  |  |     COUNTRY_RUSSIA, | 
					
						
							|  |  |  |     COUNTRY_SPAIN, | 
					
						
							|  |  |  |     COUNTRY_TAIWAN, | 
					
						
							|  |  |  |     COUNTRY_WORLD, | 
					
						
							|  |  |  |     COUNTRY_UNKNOWN, | 
					
						
							|  |  |  |     NUMBER_OF_COUNTRIES | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Languages 0 - 9 match the official Wii language numbering.
 | 
					
						
							|  |  |  |   // Languages 1 - 6 match the official GC PAL languages 0 - 5.
 | 
					
						
							|  |  |  |   enum ELanguage | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     LANGUAGE_JAPANESE = 0, | 
					
						
							|  |  |  |     LANGUAGE_ENGLISH = 1, | 
					
						
							|  |  |  |     LANGUAGE_GERMAN = 2, | 
					
						
							|  |  |  |     LANGUAGE_FRENCH = 3, | 
					
						
							|  |  |  |     LANGUAGE_SPANISH = 4, | 
					
						
							|  |  |  |     LANGUAGE_ITALIAN = 5, | 
					
						
							|  |  |  |     LANGUAGE_DUTCH = 6, | 
					
						
							|  |  |  |     LANGUAGE_SIMPLIFIED_CHINESE = 7, | 
					
						
							|  |  |  |     LANGUAGE_TRADITIONAL_CHINESE = 8, | 
					
						
							|  |  |  |     LANGUAGE_KOREAN = 9, | 
					
						
							|  |  |  |     LANGUAGE_UNKNOWN | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   IVolume() {} | 
					
						
							|  |  |  |   virtual ~IVolume() {} | 
					
						
							|  |  |  |   // decrypt parameter must be false if not reading a Wii disc
 | 
					
						
							|  |  |  |   virtual bool Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt) const = 0; | 
					
						
							|  |  |  |   template <typename T> | 
					
						
							|  |  |  |   bool ReadSwapped(u64 offset, T* buffer, bool decrypt) const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     T temp; | 
					
						
							|  |  |  |     if (!Read(offset, sizeof(T), reinterpret_cast<u8*>(&temp), decrypt)) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     *buffer = Common::FromBigEndian(temp); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   virtual bool GetTitleID(u64*) const { return false; } | 
					
						
							|  |  |  |   virtual std::vector<u8> GetTMD() const { return {}; } | 
					
						
							|  |  |  |   virtual std::string GetUniqueID() const = 0; | 
					
						
							|  |  |  |   virtual std::string GetMakerID() const = 0; | 
					
						
							|  |  |  |   virtual u16 GetRevision() const = 0; | 
					
						
							|  |  |  |   virtual std::string GetInternalName() const = 0; | 
					
						
							| 
									
										
										
										
											2016-02-29 19:52:15 +11:00
										 |  |  |   virtual std::map<ELanguage, std::string> GetShortNames() const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::map<ELanguage, std::string>(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   virtual std::map<ELanguage, std::string> GetLongNames() const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::map<ELanguage, std::string>(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   virtual std::map<ELanguage, std::string> GetShortMakers() const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::map<ELanguage, std::string>(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   virtual std::map<ELanguage, std::string> GetLongMakers() const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::map<ELanguage, std::string>(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual std::map<ELanguage, std::string> GetDescriptions() const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::map<ELanguage, std::string>(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   virtual std::vector<u32> GetBanner(int* width, int* height) const = 0; | 
					
						
							|  |  |  |   virtual u64 GetFSTSize() const = 0; | 
					
						
							|  |  |  |   virtual std::string GetApploaderDate() const = 0; | 
					
						
							|  |  |  |   // 0 is the first disc, 1 is the second disc
 | 
					
						
							|  |  |  |   virtual u8 GetDiscNumber() const { return 0; } | 
					
						
							|  |  |  |   virtual EPlatform GetVolumeType() const = 0; | 
					
						
							|  |  |  |   virtual bool SupportsIntegrityCheck() const { return false; } | 
					
						
							|  |  |  |   virtual bool CheckIntegrity() const { return false; } | 
					
						
							|  |  |  |   virtual bool ChangePartition(u64 offset) { return false; } | 
					
						
							|  |  |  |   virtual ECountry GetCountry() const = 0; | 
					
						
							|  |  |  |   virtual BlobType GetBlobType() const = 0; | 
					
						
							|  |  |  |   // Size of virtual disc (not always accurate)
 | 
					
						
							|  |  |  |   virtual u64 GetSize() const = 0; | 
					
						
							|  |  |  |   // Size on disc (compressed size)
 | 
					
						
							|  |  |  |   virtual u64 GetRawSize() const = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static std::vector<u32> GetWiiBanner(int* width, int* height, u64 title_id); | 
					
						
							| 
									
										
										
										
											2015-12-03 17:29:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-10 22:10:49 +02:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   template <u32 N> | 
					
						
							|  |  |  |   std::string DecodeString(const char (&data)[N]) const | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     // strnlen to trim NULLs
 | 
					
						
							|  |  |  |     std::string string(data, strnlen(data, sizeof(data))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-29 19:52:15 +11:00
										 |  |  |     // There doesn't seem to be any GC discs with the country set to Taiwan...
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     // But maybe they would use Shift_JIS if they existed? Not sure
 | 
					
						
							|  |  |  |     bool use_shift_jis = (COUNTRY_JAPAN == GetCountry() || COUNTRY_TAIWAN == GetCountry()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (use_shift_jis) | 
					
						
							|  |  |  |       return SHIFTJISToUTF8(string); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       return CP1252ToUTF8(string); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static std::map<IVolume::ELanguage, std::string> ReadWiiNames(const std::vector<u8>& data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static const size_t NUMBER_OF_LANGUAGES = 10; | 
					
						
							|  |  |  |   static const size_t NAME_STRING_LENGTH = 42; | 
					
						
							|  |  |  |   static const size_t NAME_BYTES_LENGTH = NAME_STRING_LENGTH * sizeof(u16); | 
					
						
							|  |  |  |   static const size_t NAMES_TOTAL_BYTES = NAME_BYTES_LENGTH * NUMBER_OF_LANGUAGES; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-07-03 22:34:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Generic Switch function for all volumes
 | 
					
						
							| 
									
										
										
										
											2015-02-23 20:43:29 -05:00
										 |  |  | IVolume::ECountry CountrySwitch(u8 country_code); | 
					
						
							| 
									
										
										
										
											2010-12-16 07:36:26 +00:00
										 |  |  | u8 GetSysMenuRegion(u16 _TitleVersion); | 
					
						
							| 
									
										
										
										
											2015-05-24 17:41:53 +02:00
										 |  |  | std::string GetCompanyFromID(const std::string& company_id); | 
					
						
							| 
									
										
										
										
											2009-07-03 22:34:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | }  // namespace
 |