File: Volume.h

package info (click to toggle)
dolphin-emu 5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 28,976 kB
  • ctags: 35,666
  • sloc: cpp: 213,139; java: 6,252; asm: 2,277; xml: 1,998; ansic: 1,514; python: 462; sh: 279; pascal: 247; makefile: 124; perl: 97
file content (142 lines) | stat: -rw-r--r-- 4,117 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <cstring>
#include <map>
#include <string>
#include <vector>

#include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h"
#include "Common/StringUtil.h"
#include "DiscIO/Blob.h"

namespace DiscIO
{
class IVolume
{
public:
	// Increment CACHE_REVISION if the enums below are modified (ISOFile.cpp & GameFile.cpp)
	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;
	virtual std::map<ELanguage, std::string> GetNames(bool prefer_long) const = 0;
	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 = 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);

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);
	}

	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;
};

// Generic Switch function for all volumes
IVolume::ECountry CountrySwitch(u8 country_code);
u8 GetSysMenuRegion(u16 _TitleVersion);
std::string GetCompanyFromID(const std::string& company_id);

} // namespace