From ecad6cd1a70d6b79846a00eb038e7d8b701e70b6 Mon Sep 17 00:00:00 2001 From: raziel1000 Date: Wed, 10 Jul 2024 23:57:58 -0600 Subject: [PATCH] - sceSaveDataDirNameSearch wip, needs testing and more work. --- src/core/libraries/save_data/savedata.cpp | 37 ++++++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/core/libraries/save_data/savedata.cpp b/src/core/libraries/save_data/savedata.cpp index 7d12ed81..7fa6c7c0 100644 --- a/src/core/libraries/save_data/savedata.cpp +++ b/src/core/libraries/save_data/savedata.cpp @@ -177,12 +177,39 @@ int PS4_SYSV_ABI sceSaveDataDeleteUser() { int PS4_SYSV_ABI sceSaveDataDirNameSearch(const OrbisSaveDataDirNameSearchCond* cond, OrbisSaveDataDirNameSearchResult* result) { - if (cond == nullptr || cond->dirName == nullptr) + if (cond == nullptr) return ORBIS_SAVE_DATA_ERROR_PARAMETER; - LOG_ERROR(Lib_SaveData, - "TODO sceSaveDataDirNameSearch: search_dir_name = {}, key = {}, result = {}", - cond->dirName->data, (int)cond->key, (result->infos == nullptr)); - + LOG_ERROR(Lib_SaveData, "TODO sceSaveDataDirNameSearch: Add params"); + const auto& mount_dir = Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / + std::to_string(cond->userId) / game_serial; + if (!mount_dir.empty() && std::filesystem::exists(mount_dir)) { + if (cond->dirName == nullptr) { // look for all dirs if no dir is provided. + for (int i = 0; const auto& entry : std::filesystem::directory_iterator(mount_dir)) { + if (std::filesystem::is_directory(entry.path())) { + i++; + result->dirNamesNum = 0; // why is it 1024? is it max? + // copy dir name to be used by sceSaveDataMount in read mode. + strncpy(result->dirNames[i].data, entry.path().filename().string().c_str(), 32); + result->hitNum = i + 1; + result->dirNamesNum = i + 1; // to confirm + result->setNum = i + 1; // to confirm + } + } + } else { // Need a game to test. + strncpy(result->dirNames[0].data, cond->dirName->data, 32); + result->hitNum = 1; + result->dirNamesNum = 1; // to confirm + result->setNum = 1; // to confirm + } + } else { + result->hitNum = 0; + result->dirNamesNum = 0; + result->setNum = 0; + } + if (result->infos != nullptr) { + result->infos->blocks = ORBIS_SAVE_DATA_BLOCK_SIZE; + result->infos->freeBlocks = ORBIS_SAVE_DATA_BLOCK_SIZE; + } return ORBIS_OK; }