mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-28 12:05:06 +00:00
main's canonical-header refactor (f38d29fd08) edited the old libSceSaveData and libSceSaveDataDialog sources this branch removes, and made EventFlag.cpp, libSceNpCommon's Runtime.cpp and GuestKernelErrors.cpp include the old SaveDataCore.hpp. Those three use nothing from it and build without it, so the include is dropped. SaveDataWriteReplacement.cpp takes main's canonical header and keeps only the native path.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
66 lines
2.3 KiB
C++
66 lines
2.3 KiB
C++
#include "prx/libSceSaveData/include/Api.hpp"
|
|
#include "SceTypes.hpp"
|
|
#include "prx/libc/include/general/VabiMacros.hpp"
|
|
|
|
#include <algorithm>
|
|
#include <chrono>
|
|
#include <cstddef>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <filesystem>
|
|
#include <fstream>
|
|
#include <iterator>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
static void Check(bool value, int line) {
|
|
if (!value) {
|
|
std::fprintf(stderr, "Save-data replacement check failed at line %d\n", line);
|
|
std::abort();
|
|
}
|
|
}
|
|
#define Require(value) Check((value), __LINE__)
|
|
|
|
int main() {
|
|
const auto originalDirectory = std::filesystem::current_path();
|
|
const auto root = std::filesystem::temp_directory_path() /
|
|
("anyps5-savedata-replacement-" +
|
|
std::to_string(std::chrono::steady_clock::now().time_since_epoch().count()));
|
|
Require(std::filesystem::create_directory(root));
|
|
std::filesystem::current_path(root);
|
|
|
|
constexpr std::int32_t userId = 7531;
|
|
const auto savePath = std::filesystem::path("_sd_mem") / ("u" + std::to_string(userId)) / "slot0.bin";
|
|
std::filesystem::create_directories(savePath.parent_path());
|
|
const std::vector<char> oldData{'o', 'l', 'd'};
|
|
{
|
|
std::ofstream file(savePath, std::ios::binary);
|
|
Require(file.is_open());
|
|
file.write(oldData.data(), static_cast<std::streamsize>(oldData.size()));
|
|
Require(static_cast<bool>(file));
|
|
}
|
|
|
|
Require(sceSaveDataInitialize3(nullptr) == 0);
|
|
SaveDataMemorySetup2 setup{};
|
|
setup.user_id = userId;
|
|
setup.memory_size = oldData.size() + 3;
|
|
SaveDataMemorySetupResult result{};
|
|
const int status = sceSaveDataSetupSaveDataMemory2(&setup, &result);
|
|
|
|
Require(result.existed_memory_size == oldData.size());
|
|
Require(status == 0);
|
|
std::vector<char> savedData;
|
|
{
|
|
std::ifstream savedFile(savePath, std::ios::binary);
|
|
savedData.assign(std::istreambuf_iterator<char>(savedFile), std::istreambuf_iterator<char>());
|
|
}
|
|
Require(savedData.size() == setup.memory_size);
|
|
Require(std::equal(oldData.begin(), oldData.end(), savedData.begin()));
|
|
Require(std::all_of(savedData.begin() + static_cast<std::ptrdiff_t>(oldData.size()),
|
|
savedData.end(), [](char byte) { return byte == 0; }));
|
|
|
|
Require(sceSaveDataTerminate() == 0);
|
|
std::filesystem::current_path(originalDirectory);
|
|
std::filesystem::remove_all(root);
|
|
}
|