Add generation of rcheevos hash to DolphinTool
Fixed coding standards issue CalculateHash return string instead of using char array param
This commit is contained in:
parent
f85c4413bd
commit
a74b2a4dde
|
@ -234,7 +234,7 @@ Options:
|
||||||
Path to disc image FILE.
|
Path to disc image FILE.
|
||||||
-a ALGORITHM, --algorithm=ALGORITHM
|
-a ALGORITHM, --algorithm=ALGORITHM
|
||||||
Optional. Compute and print the digest using the
|
Optional. Compute and print the digest using the
|
||||||
selected algorithm, then exit. [crc32|md5|sha1]
|
selected algorithm, then exit. [crc32|md5|sha1|rchash]
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -204,6 +204,22 @@ void AchievementManager::SetBackgroundExecutionAllowed(bool allowed)
|
||||||
DoIdle();
|
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()
|
void AchievementManager::FetchPlayerBadge()
|
||||||
{
|
{
|
||||||
FetchBadge(&m_player_badge, RC_IMAGE_TYPE_USER,
|
FetchBadge(&m_player_badge, RC_IMAGE_TYPE_USER,
|
||||||
|
|
|
@ -110,6 +110,8 @@ public:
|
||||||
bool IsGameLoaded() const;
|
bool IsGameLoaded() const;
|
||||||
void SetBackgroundExecutionAllowed(bool allowed);
|
void SetBackgroundExecutionAllowed(bool allowed);
|
||||||
|
|
||||||
|
static std::string CalculateHash(const std::string& file_path);
|
||||||
|
|
||||||
void FetchPlayerBadge();
|
void FetchPlayerBadge();
|
||||||
void FetchGameBadges();
|
void FetchGameBadges();
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
<Import Project="$(ExternalsDir)liblzma\exports.props" />
|
<Import Project="$(ExternalsDir)liblzma\exports.props" />
|
||||||
<Import Project="$(ExternalsDir)mbedtls\exports.props" />
|
<Import Project="$(ExternalsDir)mbedtls\exports.props" />
|
||||||
<Import Project="$(ExternalsDir)picojson\exports.props" />
|
<Import Project="$(ExternalsDir)picojson\exports.props" />
|
||||||
|
<Import Project="$(ExternalsDir)rcheevos\exports.props" />
|
||||||
<Import Project="$(ExternalsDir)zstd\exports.props" />
|
<Import Project="$(ExternalsDir)zstd\exports.props" />
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <fmt/ostream.h>
|
#include <fmt/ostream.h>
|
||||||
|
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
|
#include "Core/AchievementManager.h"
|
||||||
#include "DiscIO/Volume.h"
|
#include "DiscIO/Volume.h"
|
||||||
#include "DiscIO/VolumeVerifier.h"
|
#include "DiscIO/VolumeVerifier.h"
|
||||||
#include "UICommon/UICommon.h"
|
#include "UICommon/UICommon.h"
|
||||||
|
@ -97,7 +98,7 @@ int VerifyCommand(const std::vector<std::string>& args)
|
||||||
.action("store")
|
.action("store")
|
||||||
.help("Optional. Compute and print the digest using the selected algorithm, then exit. "
|
.help("Optional. Compute and print the digest using the selected algorithm, then exit. "
|
||||||
"[%choices]")
|
"[%choices]")
|
||||||
.choices({"crc32", "md5", "sha1"});
|
.choices({"crc32", "md5", "sha1", "rchash"});
|
||||||
|
|
||||||
const optparse::Values& options = parser.parse_args(args);
|
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"];
|
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{};
|
DiscIO::Hashes<bool> hashes_to_calculate{};
|
||||||
const bool algorithm_is_set = options.is_set("algorithm");
|
const bool algorithm_is_set = options.is_set("algorithm");
|
||||||
if (!algorithm_is_set)
|
if (!algorithm_is_set)
|
||||||
|
@ -129,9 +133,12 @@ int VerifyCommand(const std::vector<std::string>& args)
|
||||||
hashes_to_calculate.md5 = true;
|
hashes_to_calculate.md5 = true;
|
||||||
else if (algorithm == "sha1")
|
else if (algorithm == "sha1")
|
||||||
hashes_to_calculate.sha1 = true;
|
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
|
// optparse should protect from this
|
||||||
fmt::print(std::cerr, "Error: No algorithms selected for the operation\n");
|
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();
|
verifier.Finish();
|
||||||
const DiscIO::VolumeVerifier::Result& result = verifier.GetResult();
|
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
|
// Print the report
|
||||||
if (!algorithm_is_set)
|
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));
|
fmt::print(std::cout, "{}\n", HashToHexString(result.hashes.md5));
|
||||||
else if (hashes_to_calculate.sha1 && !result.hashes.sha1.empty())
|
else if (hashes_to_calculate.sha1 && !result.hashes.sha1.empty())
|
||||||
fmt::print(std::cout, "{}\n", HashToHexString(result.hashes.sha1));
|
fmt::print(std::cout, "{}\n", HashToHexString(result.hashes.sha1));
|
||||||
|
else if (rc_hash_calculate)
|
||||||
|
fmt::print(std::cout, "{}\n", rc_hash_result);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fmt::print(std::cerr, "Error: No hash computed\n");
|
fmt::print(std::cerr, "Error: No hash computed\n");
|
||||||
|
|
Loading…
Reference in New Issue