mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-18 21:38:56 +02:00
[desktop, fs] main_window separation; fix Ryujinx save data link issues (#2929)
Some genius decided to put the entire MainWindow class into main.h and main.cpp, which is not only horrific practice but also completely destroys clangd beyond repair. Please, just don't do this. (this will probably merge conflict to hell and back) Also, fixes a bunch of issues with Ryujinx save data link: - Paths with spaces would cause mklink to fail - Add support for portable directories - Symlink detection was incorrect sometimes(????) - Some other stuff I'm forgetting Furthermore, when selecting "From Eden" and attempting to save in Ryujinx, Ryujinx would destroy the link for... some reason? So to get around this we just copy the Eden data to Ryujinx then treat it like a "From Ryujinx" op Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2929 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
parent
e13c7ef3f8
commit
08f3639c80
51 changed files with 5386 additions and 5283 deletions
|
|
@ -7,8 +7,6 @@
|
|||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <filesystem>
|
||||
#include <iostream>
|
||||
#include <random>
|
||||
|
||||
#include <boost/algorithm/string/case_conv.hpp>
|
||||
#include <boost/algorithm/string/find.hpp>
|
||||
|
|
@ -18,11 +16,11 @@
|
|||
#include "common/fs/fs.h"
|
||||
#include "common/fs/fs_types.h"
|
||||
#include "common/fs/path_util.h"
|
||||
#include "common/fs/symlink.h"
|
||||
#include "common/settings.h"
|
||||
#include "common/string_util.h"
|
||||
#include "core/file_sys/savedata_factory.h"
|
||||
#include "core/hle/service/acc/profile_manager.h"
|
||||
#include <ranges>
|
||||
|
||||
namespace Service::Account {
|
||||
|
||||
|
|
@ -492,6 +490,32 @@ void ProfileManager::ResetUserSaveFile()
|
|||
ParseUserSaveFile();
|
||||
}
|
||||
|
||||
std::vector<UUID> ProfileManager::FindExistingProfileUUIDs()
|
||||
{
|
||||
std::vector<UUID> uuids;
|
||||
for (const ProfileInfo& p : profiles) {
|
||||
auto uuid = p.user_uuid;
|
||||
if (!uuid.IsInvalid()) {
|
||||
uuids.emplace_back(uuid);
|
||||
}
|
||||
}
|
||||
|
||||
return uuids;
|
||||
}
|
||||
|
||||
std::vector<std::string> ProfileManager::FindExistingProfileStrings()
|
||||
{
|
||||
std::vector<UUID> uuids = FindExistingProfileUUIDs();
|
||||
std::vector<std::string> uuid_strings;
|
||||
|
||||
for (const UUID &uuid : uuids) {
|
||||
auto user_id = uuid.AsU128();
|
||||
uuid_strings.emplace_back(fmt::format("{:016X}{:016X}", user_id[1], user_id[0]));
|
||||
}
|
||||
|
||||
return uuid_strings;
|
||||
}
|
||||
|
||||
std::vector<std::string> ProfileManager::FindGoodProfiles()
|
||||
{
|
||||
namespace fs = std::filesystem;
|
||||
|
|
@ -501,31 +525,17 @@ std::vector<std::string> ProfileManager::FindGoodProfiles()
|
|||
const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir)
|
||||
/ "user/save/0000000000000000";
|
||||
|
||||
// some exceptions because certain games just LOVE TO CAUSE ISSUES
|
||||
static constexpr const std::array<const char* const, 2> EXCEPTION_UUIDS
|
||||
= {"5755CC2A545A87128500000000000000", "00000000000000000000000000000000"};
|
||||
// some exceptions, e.g. the "system" profile
|
||||
static constexpr const std::array<const char* const, 1> EXCEPTION_UUIDS
|
||||
= {"00000000000000000000000000000000"};
|
||||
|
||||
for (const char *const uuid : EXCEPTION_UUIDS) {
|
||||
if (fs::exists(path / uuid))
|
||||
good_uuids.emplace_back(uuid);
|
||||
}
|
||||
|
||||
for (const ProfileInfo& p : profiles) {
|
||||
std::string uuid_string = [p]() -> std::string {
|
||||
auto uuid = p.user_uuid;
|
||||
|
||||
// "ignore" invalid uuids
|
||||
if (uuid.IsInvalid()) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
auto user_id = uuid.AsU128();
|
||||
|
||||
return fmt::format("{:016X}{:016X}", user_id[1], user_id[0]);
|
||||
}();
|
||||
|
||||
if (uuid_string != "0") good_uuids.emplace_back(uuid_string);
|
||||
}
|
||||
auto existing = FindExistingProfileStrings();
|
||||
good_uuids.insert(good_uuids.end(), existing.begin(), existing.end());
|
||||
|
||||
return good_uuids;
|
||||
}
|
||||
|
|
@ -562,7 +572,8 @@ std::vector<std::string> ProfileManager::FindOrphanedProfiles()
|
|||
override = true;
|
||||
|
||||
// if there are any regular files (NOT directories) there, do NOT delete it :p
|
||||
if (file.is_regular_file())
|
||||
// Also: check for symlinks
|
||||
if (file.is_regular_file() || Common::FS::IsSymlink(file.path()))
|
||||
return false;
|
||||
}
|
||||
} catch (const fs::filesystem_error& e) {
|
||||
|
|
|
|||
|
|
@ -105,6 +105,8 @@ public:
|
|||
|
||||
void ResetUserSaveFile();
|
||||
|
||||
std::vector<Common::UUID> FindExistingProfileUUIDs();
|
||||
std::vector<std::string> FindExistingProfileStrings();
|
||||
std::vector<std::string> FindGoodProfiles();
|
||||
std::vector<std::string> FindOrphanedProfiles();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue