summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorretroNUC <retronuc@gmail.com>2024-09-15 15:52:04 +0100
committerretroNUC <retronuc@gmail.com>2024-09-15 15:52:04 +0100
commita74b2a4dde2ef99dacd1ff918c9a32bd1e32ffdb (patch)
tree02d443ace13f73d4dd0fa9e49586a9fc2d6a32e3 /Source
parentf85c4413bdebc6379537b0ded4536fd433c56acf (diff)
Add generation of rcheevos hash to DolphinTool
Fixed coding standards issue CalculateHash return string instead of using char array param
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/AchievementManager.cpp16
-rw-r--r--Source/Core/Core/AchievementManager.h2
-rw-r--r--Source/Core/DolphinTool/DolphinTool.vcxproj1
-rw-r--r--Source/Core/DolphinTool/VerifyCommand.cpp19
4 files changed, 36 insertions, 2 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp
index a1288a2b70..dc127f599e 100644
--- a/Source/Core/Core/AchievementManager.cpp
+++ b/Source/Core/Core/AchievementManager.cpp
@@ -204,6 +204,22 @@ void AchievementManager::SetBackgroundExecutionAllowed(bool allowed)
DoIdle();
}
+std::string AchievementManager::CalculateHash(const std::string& file_path)
+{
+ char hash_result[33] = "0";
+ rc_hash_filereader volume_reader{
+ .open = &AchievementManager::FilereaderOpenByFilepath,
+ .seek = &AchievementManager::FilereaderSeek,
+ .tell = &AchievementManager::FilereaderTell,
+ .read = &AchievementManager::FilereaderRead,
+ .close = &AchievementManager::FilereaderClose,
+ };
+ rc_hash_init_custom_filereader(&volume_reader);
+ rc_hash_generate_from_file(hash_result, RC_CONSOLE_GAMECUBE, file_path.c_str());
+
+ return std::string(hash_result);
+}
+
void AchievementManager::FetchPlayerBadge()
{
FetchBadge(&m_player_badge, RC_IMAGE_TYPE_USER,
diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h
index 2ec4a6dea7..0571370c7a 100644
--- a/Source/Core/Core/AchievementManager.h
+++ b/Source/Core/Core/AchievementManager.h
@@ -110,6 +110,8 @@ public:
bool IsGameLoaded() const;
void SetBackgroundExecutionAllowed(bool allowed);
+ static std::string CalculateHash(const std::string& file_path);
+
void FetchPlayerBadge();
void FetchGameBadges();
diff --git a/Source/Core/DolphinTool/DolphinTool.vcxproj b/Source/Core/DolphinTool/DolphinTool.vcxproj
index 8bfc2ee295..94173a8971 100644
--- a/Source/Core/DolphinTool/DolphinTool.vcxproj
+++ b/Source/Core/DolphinTool/DolphinTool.vcxproj
@@ -41,6 +41,7 @@
<Import Project="$(ExternalsDir)liblzma\exports.props" />
<Import Project="$(ExternalsDir)mbedtls\exports.props" />
<Import Project="$(ExternalsDir)picojson\exports.props" />
+ <Import Project="$(ExternalsDir)rcheevos\exports.props" />
<Import Project="$(ExternalsDir)zstd\exports.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
diff --git a/Source/Core/DolphinTool/VerifyCommand.cpp b/Source/Core/DolphinTool/VerifyCommand.cpp
index 13a041274d..b80f00a273 100644
--- a/Source/Core/DolphinTool/VerifyCommand.cpp
+++ b/Source/Core/DolphinTool/VerifyCommand.cpp
@@ -12,6 +12,7 @@
#include <fmt/ostream.h>
#include "Common/StringUtil.h"
+#include "Core/AchievementManager.h"
#include "DiscIO/Volume.h"
#include "DiscIO/VolumeVerifier.h"
#include "UICommon/UICommon.h"
@@ -97,7 +98,7 @@ int VerifyCommand(const std::vector<std::string>& args)
.action("store")
.help("Optional. Compute and print the digest using the selected algorithm, then exit. "
"[%choices]")
- .choices({"crc32", "md5", "sha1"});
+ .choices({"crc32", "md5", "sha1", "rchash"});
const optparse::Values& options = parser.parse_args(args);
@@ -114,6 +115,9 @@ int VerifyCommand(const std::vector<std::string>& args)
}
const std::string& input_file_path = options["input"];
+ bool rc_hash_calculate = false;
+ std::string rc_hash_result = "0";
+
DiscIO::Hashes<bool> hashes_to_calculate{};
const bool algorithm_is_set = options.is_set("algorithm");
if (!algorithm_is_set)
@@ -129,9 +133,12 @@ int VerifyCommand(const std::vector<std::string>& args)
hashes_to_calculate.md5 = true;
else if (algorithm == "sha1")
hashes_to_calculate.sha1 = true;
+ else if (algorithm == "rchash")
+ rc_hash_calculate = true;
}
- if (!hashes_to_calculate.crc32 && !hashes_to_calculate.md5 && !hashes_to_calculate.sha1)
+ if (!hashes_to_calculate.crc32 && !hashes_to_calculate.md5 && !hashes_to_calculate.sha1 &&
+ !rc_hash_calculate)
{
// optparse should protect from this
fmt::print(std::cerr, "Error: No algorithms selected for the operation\n");
@@ -156,6 +163,12 @@ int VerifyCommand(const std::vector<std::string>& args)
verifier.Finish();
const DiscIO::VolumeVerifier::Result& result = verifier.GetResult();
+ // Calculate rcheevos hash
+ if (rc_hash_calculate)
+ {
+ rc_hash_result = AchievementManager::CalculateHash(input_file_path);
+ }
+
// Print the report
if (!algorithm_is_set)
{
@@ -169,6 +182,8 @@ int VerifyCommand(const std::vector<std::string>& args)
fmt::print(std::cout, "{}\n", HashToHexString(result.hashes.md5));
else if (hashes_to_calculate.sha1 && !result.hashes.sha1.empty())
fmt::print(std::cout, "{}\n", HashToHexString(result.hashes.sha1));
+ else if (rc_hash_calculate)
+ fmt::print(std::cout, "{}\n", rc_hash_result);
else
{
fmt::print(std::cerr, "Error: No hash computed\n");