Merge pull request #12922 from JosJuice/android-approved-list-crash
RetroAchievements: Delay calling LoadApprovedList
This commit is contained in:
commit
bb03fc04cc
|
@ -72,7 +72,7 @@ void AchievementManager::Init()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AchievementManager::LoadApprovedList()
|
picojson::value AchievementManager::LoadApprovedList()
|
||||||
{
|
{
|
||||||
picojson::value temp;
|
picojson::value temp;
|
||||||
std::string error;
|
std::string error;
|
||||||
|
@ -82,7 +82,7 @@ void AchievementManager::LoadApprovedList()
|
||||||
WARN_LOG_FMT(ACHIEVEMENTS, "Failed to load approved game settings list {}",
|
WARN_LOG_FMT(ACHIEVEMENTS, "Failed to load approved game settings list {}",
|
||||||
APPROVED_LIST_FILENAME);
|
APPROVED_LIST_FILENAME);
|
||||||
WARN_LOG_FMT(ACHIEVEMENTS, "Error: {}", error);
|
WARN_LOG_FMT(ACHIEVEMENTS, "Error: {}", error);
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
auto context = Common::SHA1::CreateContext();
|
auto context = Common::SHA1::CreateContext();
|
||||||
context->Update(temp.serialize());
|
context->Update(temp.serialize());
|
||||||
|
@ -94,10 +94,9 @@ void AchievementManager::LoadApprovedList()
|
||||||
WARN_LOG_FMT(ACHIEVEMENTS, "Expected hash {}, found hash {}",
|
WARN_LOG_FMT(ACHIEVEMENTS, "Expected hash {}, found hash {}",
|
||||||
Common::SHA1::DigestToString(APPROVED_LIST_HASH),
|
Common::SHA1::DigestToString(APPROVED_LIST_HASH),
|
||||||
Common::SHA1::DigestToString(digest));
|
Common::SHA1::DigestToString(digest));
|
||||||
return;
|
return {};
|
||||||
}
|
}
|
||||||
std::lock_guard lg{m_lock};
|
return temp;
|
||||||
m_ini_root = std::move(temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AchievementManager::SetUpdateCallback(UpdateCallback callback)
|
void AchievementManager::SetUpdateCallback(UpdateCallback callback)
|
||||||
|
@ -362,10 +361,18 @@ bool AchievementManager::IsHardcoreModeActive() const
|
||||||
void AchievementManager::FilterApprovedPatches(std::vector<PatchEngine::Patch>& patches,
|
void AchievementManager::FilterApprovedPatches(std::vector<PatchEngine::Patch>& patches,
|
||||||
const std::string& game_ini_id) const
|
const std::string& game_ini_id) const
|
||||||
{
|
{
|
||||||
|
if (patches.empty())
|
||||||
|
{
|
||||||
|
// There's nothing to verify, so let's save ourselves some work
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::lock_guard lg{m_lock};
|
||||||
|
|
||||||
if (!IsHardcoreModeActive())
|
if (!IsHardcoreModeActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_ini_root.contains(game_ini_id))
|
if (!m_ini_root->contains(game_ini_id))
|
||||||
patches.clear();
|
patches.clear();
|
||||||
auto patch_itr = patches.begin();
|
auto patch_itr = patches.begin();
|
||||||
while (patch_itr != patches.end())
|
while (patch_itr != patches.end())
|
||||||
|
@ -384,7 +391,7 @@ void AchievementManager::FilterApprovedPatches(std::vector<PatchEngine::Patch>&
|
||||||
}
|
}
|
||||||
auto digest = context->Finish();
|
auto digest = context->Finish();
|
||||||
|
|
||||||
bool verified = m_ini_root.get(game_ini_id).contains(Common::SHA1::DigestToString(digest));
|
bool verified = m_ini_root->get(game_ini_id).contains(Common::SHA1::DigestToString(digest));
|
||||||
if (!verified)
|
if (!verified)
|
||||||
{
|
{
|
||||||
patch_itr = patches.erase(patch_itr);
|
patch_itr = patches.erase(patch_itr);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "Common/Event.h"
|
#include "Common/Event.h"
|
||||||
#include "Common/HttpRequest.h"
|
#include "Common/HttpRequest.h"
|
||||||
#include "Common/JsonUtil.h"
|
#include "Common/JsonUtil.h"
|
||||||
|
#include "Common/Lazy.h"
|
||||||
#include "Common/WorkQueueThread.h"
|
#include "Common/WorkQueueThread.h"
|
||||||
#include "DiscIO/Volume.h"
|
#include "DiscIO/Volume.h"
|
||||||
#include "VideoCommon/Assets/CustomTextureData.h"
|
#include "VideoCommon/Assets/CustomTextureData.h"
|
||||||
|
@ -146,7 +147,7 @@ public:
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AchievementManager() { LoadApprovedList(); };
|
AchievementManager() = default;
|
||||||
|
|
||||||
struct FilereaderState
|
struct FilereaderState
|
||||||
{
|
{
|
||||||
|
@ -154,7 +155,7 @@ private:
|
||||||
std::unique_ptr<DiscIO::Volume> volume;
|
std::unique_ptr<DiscIO::Volume> volume;
|
||||||
};
|
};
|
||||||
|
|
||||||
void LoadApprovedList();
|
static picojson::value LoadApprovedList();
|
||||||
|
|
||||||
static void* FilereaderOpenByFilepath(const char* path_utf8);
|
static void* FilereaderOpenByFilepath(const char* path_utf8);
|
||||||
static void* FilereaderOpenByVolume(const char* path_utf8);
|
static void* FilereaderOpenByVolume(const char* path_utf8);
|
||||||
|
@ -227,7 +228,7 @@ private:
|
||||||
std::chrono::steady_clock::time_point m_last_rp_time = std::chrono::steady_clock::now();
|
std::chrono::steady_clock::time_point m_last_rp_time = std::chrono::steady_clock::now();
|
||||||
std::chrono::steady_clock::time_point m_last_progress_message = std::chrono::steady_clock::now();
|
std::chrono::steady_clock::time_point m_last_progress_message = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
picojson::value m_ini_root;
|
Common::Lazy<picojson::value> m_ini_root{LoadApprovedList};
|
||||||
std::string m_game_ini_id;
|
std::string m_game_ini_id;
|
||||||
|
|
||||||
std::unordered_map<AchievementId, LeaderboardStatus> m_leaderboard_map;
|
std::unordered_map<AchievementId, LeaderboardStatus> m_leaderboard_map;
|
||||||
|
|
Loading…
Reference in New Issue