2015-05-23 22:55:12 -06:00
|
|
|
// Copyright 2008 Dolphin Emulator Project
|
2015-05-17 17:08:10 -06:00
|
|
|
// Licensed under GPLv2+
|
2013-04-17 21:09:55 -06:00
|
|
|
// Refer to the license.txt file included.
|
2008-12-07 21:46:09 -07:00
|
|
|
|
2014-02-10 11:54:46 -07:00
|
|
|
#pragma once
|
2008-12-07 21:46:09 -07:00
|
|
|
|
2015-04-09 09:44:53 -06:00
|
|
|
#include <map>
|
2014-06-15 22:27:23 -06:00
|
|
|
#include <memory>
|
2008-12-07 21:46:09 -07:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2015-04-20 19:10:31 -06:00
|
|
|
#include "Common/CommonFuncs.h"
|
2014-09-07 19:06:58 -06:00
|
|
|
#include "Common/CommonTypes.h"
|
2015-04-10 14:10:49 -06:00
|
|
|
#include "Common/StringUtil.h"
|
2008-12-07 21:46:09 -07:00
|
|
|
|
|
|
|
namespace DiscIO
|
|
|
|
{
|
|
|
|
class IVolume
|
|
|
|
{
|
2009-08-31 16:42:10 -06:00
|
|
|
public:
|
2015-04-09 09:44:53 -06:00
|
|
|
// Increment CACHE_REVISION if the enums below are modified (ISOFile.cpp & GameFile.cpp)
|
2015-06-04 08:26:36 -06:00
|
|
|
enum EPlatform
|
|
|
|
{
|
|
|
|
GAMECUBE_DISC = 0,
|
|
|
|
WII_DISC,
|
|
|
|
WII_WAD,
|
|
|
|
NUMBER_OF_PLATFORMS
|
|
|
|
};
|
|
|
|
|
2015-04-09 09:44:53 -06:00
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2009-08-31 16:42:10 -06:00
|
|
|
IVolume() {}
|
|
|
|
virtual ~IVolume() {}
|
|
|
|
|
2014-12-28 02:35:48 -07:00
|
|
|
// decrypt parameter must be false if not reading a Wii disc
|
|
|
|
virtual bool Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt) const = 0;
|
2015-04-05 02:09:48 -06:00
|
|
|
virtual u32 Read32(u64 _Offset, bool decrypt) const
|
|
|
|
{
|
|
|
|
u32 temp;
|
|
|
|
Read(_Offset, sizeof(u32), (u8*)&temp, decrypt);
|
|
|
|
return Common::swap32(temp);
|
|
|
|
}
|
2014-12-28 02:35:48 -07:00
|
|
|
|
2009-08-31 16:42:10 -06:00
|
|
|
virtual bool GetTitleID(u8*) const { return false; }
|
2014-06-15 22:27:23 -06:00
|
|
|
virtual std::unique_ptr<u8[]> GetTMD(u32 *_sz) const
|
|
|
|
{
|
|
|
|
*_sz = 0;
|
|
|
|
return std::unique_ptr<u8[]>();
|
|
|
|
}
|
2009-08-31 16:42:10 -06:00
|
|
|
virtual std::string GetUniqueID() const = 0;
|
|
|
|
virtual std::string GetMakerID() const = 0;
|
2015-05-29 13:14:02 -06:00
|
|
|
virtual u16 GetRevision() const = 0;
|
2015-05-11 03:19:30 -06:00
|
|
|
virtual std::string GetInternalName() const = 0;
|
2015-04-09 09:44:53 -06:00
|
|
|
virtual std::map<ELanguage, std::string> GetNames() const = 0;
|
2015-04-10 14:10:49 -06:00
|
|
|
virtual std::map<ELanguage, std::string> GetDescriptions() const { return std::map<ELanguage, std::string>(); }
|
|
|
|
virtual std::string GetCompany() const { return std::string(); }
|
|
|
|
virtual std::vector<u32> GetBanner(int* width, int* height) const;
|
2009-08-31 16:42:10 -06:00
|
|
|
virtual u32 GetFSTSize() const = 0;
|
|
|
|
virtual std::string GetApploaderDate() const = 0;
|
2015-05-29 13:14:02 -06:00
|
|
|
// 0 is the first disc, 1 is the second disc
|
|
|
|
virtual u8 GetDiscNumber() const { return 0; }
|
2015-02-23 22:03:59 -07:00
|
|
|
|
2015-06-04 08:26:36 -06:00
|
|
|
virtual EPlatform GetVolumeType() const = 0;
|
2012-05-04 04:49:10 -06:00
|
|
|
virtual bool SupportsIntegrityCheck() const { return false; }
|
|
|
|
virtual bool CheckIntegrity() const { return false; }
|
2014-05-29 04:38:39 -06:00
|
|
|
virtual bool ChangePartition(u64 offset) { return false; }
|
|
|
|
|
2009-08-31 16:42:10 -06:00
|
|
|
virtual ECountry GetCountry() const = 0;
|
|
|
|
virtual u64 GetSize() const = 0;
|
2013-10-28 23:23:17 -06:00
|
|
|
|
2013-04-09 11:58:56 -06:00
|
|
|
// Size on disc (compressed size)
|
|
|
|
virtual u64 GetRawSize() const = 0;
|
2015-04-10 14:10:49 -06:00
|
|
|
|
|
|
|
protected:
|
|
|
|
template <u32 N>
|
|
|
|
std::string DecodeString(const char(&data)[N]) const
|
|
|
|
{
|
|
|
|
// strnlen to trim NULLs
|
|
|
|
std::string string(data, strnlen(data, sizeof(data)));
|
|
|
|
|
|
|
|
// There don't seem to be any GC discs with the country set to Taiwan...
|
|
|
|
// 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);
|
|
|
|
}
|
2015-04-10 15:18:41 -06:00
|
|
|
|
2015-05-29 12:19:11 -06:00
|
|
|
static std::map<IVolume::ELanguage, std::string> ReadWiiNames(const std::vector<u8>& data);
|
2015-04-10 15:18:41 -06:00
|
|
|
|
|
|
|
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-07 21:46:09 -07:00
|
|
|
};
|
2009-07-03 16:34:51 -06:00
|
|
|
|
|
|
|
// Generic Switch function for all volumes
|
2015-02-23 18:43:29 -07:00
|
|
|
IVolume::ECountry CountrySwitch(u8 country_code);
|
2010-12-16 00:36:26 -07:00
|
|
|
u8 GetSysMenuRegion(u16 _TitleVersion);
|
2015-05-24 09:41:53 -06:00
|
|
|
std::string GetCompanyFromID(const std::string& company_id);
|
2009-07-03 16:34:51 -06:00
|
|
|
|
2008-12-07 21:46:09 -07:00
|
|
|
} // namespace
|