summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/VolumeDisc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DiscIO/VolumeDisc.cpp')
-rw-r--r--Source/Core/DiscIO/VolumeDisc.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/VolumeDisc.cpp b/Source/Core/DiscIO/VolumeDisc.cpp
new file mode 100644
index 0000000000..bf622bb8fb
--- /dev/null
+++ b/Source/Core/DiscIO/VolumeDisc.cpp
@@ -0,0 +1,87 @@
+// Copyright 2020 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "DiscIO/VolumeDisc.h"
+
+#include <optional>
+#include <string>
+
+#include "Common/CommonTypes.h"
+#include "DiscIO/Enums.h"
+
+namespace DiscIO
+{
+std::string VolumeDisc::GetGameID(const Partition& partition) const
+{
+ char id[6];
+
+ if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id), partition))
+ return std::string();
+
+ return DecodeString(id);
+}
+
+Country VolumeDisc::GetCountry(const Partition& partition) const
+{
+ // The 0 that we use as a default value is mapped to Country::Unknown and Region::Unknown
+ const u8 country_byte = ReadSwapped<u8>(3, partition).value_or(0);
+ const Region region = GetRegion();
+ const std::optional<u16> revision = GetRevision();
+
+ if (CountryCodeToRegion(country_byte, GetVolumeType(), region, revision) != region)
+ return TypicalCountryForRegion(region);
+
+ return CountryCodeToCountry(country_byte, GetVolumeType(), region, revision);
+}
+
+Region VolumeDisc::RegionCodeToRegion(std::optional<u32> region_code) const
+{
+ if (!region_code)
+ return Region::Unknown;
+
+ const Region region = static_cast<Region>(*region_code);
+ return region <= Region::NTSC_K ? region : Region::Unknown;
+}
+
+std::string VolumeDisc::GetMakerID(const Partition& partition) const
+{
+ char maker_id[2];
+
+ if (!Read(0x4, sizeof(maker_id), reinterpret_cast<u8*>(&maker_id), partition))
+ return std::string();
+
+ return DecodeString(maker_id);
+}
+
+std::optional<u16> VolumeDisc::GetRevision(const Partition& partition) const
+{
+ std::optional<u8> revision = ReadSwapped<u8>(7, partition);
+ return revision ? *revision : std::optional<u16>();
+}
+
+std::string VolumeDisc::GetInternalName(const Partition& partition) const
+{
+ char name[0x60];
+ if (!Read(0x20, sizeof(name), reinterpret_cast<u8*>(&name), partition))
+ return std::string();
+
+ return DecodeString(name);
+}
+
+std::string VolumeDisc::GetApploaderDate(const Partition& partition) const
+{
+ char date[16];
+
+ if (!Read(0x2440, sizeof(date), reinterpret_cast<u8*>(&date), partition))
+ return std::string();
+
+ return DecodeString(date);
+}
+
+std::optional<u8> VolumeDisc::GetDiscNumber(const Partition& partition) const
+{
+ return ReadSwapped<u8>(6, partition);
+}
+
+} // namespace DiscIO