mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #13507 from shenweip/savedata-2
Savedata:Improves the performances according to some tests.
This commit is contained in:
commit
f82754e8b4
4 changed files with 224 additions and 88 deletions
|
@ -136,9 +136,14 @@ int PSPSaveDialog::Init(int paramAddr)
|
|||
{
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LOAD:
|
||||
DEBUG_LOG(SCEUTILITY, "Loading. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetSaveName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if (param.GetFileInfo(0).size != 0)
|
||||
display = DS_LOAD_CONFIRM;
|
||||
else
|
||||
if (param.GetFileInfo(0).size != 0) {
|
||||
if (param.GetFileInfo(0).broken) {
|
||||
param.GetPspParam()->common.result = SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN;
|
||||
display = DS_LOAD_FAILED;
|
||||
} else {
|
||||
display = DS_LOAD_CONFIRM;
|
||||
}
|
||||
} else
|
||||
display = DS_LOAD_NODATA;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD:
|
||||
|
@ -174,7 +179,7 @@ int PSPSaveDialog::Init(int paramAddr)
|
|||
DEBUG_LOG(SCEUTILITY, "Saving. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
display = DS_SAVE_LIST_CHOICE;
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE:
|
||||
DEBUG_LOG(SCEUTILITY, "Delete. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if(param.GetFilenameCount() == 0)
|
||||
display = DS_DELETE_NODATA;
|
||||
|
@ -185,7 +190,6 @@ int PSPSaveDialog::Init(int paramAddr)
|
|||
case SCE_UTILITY_SAVEDATA_TYPE_LIST:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_FILES:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE:
|
||||
|
@ -196,8 +200,26 @@ int PSPSaveDialog::Init(int paramAddr)
|
|||
display = DS_NONE;
|
||||
break;
|
||||
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE: // When run on a PSP, displays a list of all saves on the PSP. Weird. (Not really, it's to let you free up space)
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE:
|
||||
DEBUG_LOG(SCEUTILITY, "Delete. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if (param.GetFileInfo(0).size != 0) {
|
||||
yesnoChoice = 0;
|
||||
display = DS_DELETE_CONFIRM;
|
||||
} else
|
||||
display = DS_DELETE_NODATA;
|
||||
break;
|
||||
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
DEBUG_LOG(SCEUTILITY, "Delete. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
display = DS_NONE;
|
||||
break;
|
||||
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE:
|
||||
DEBUG_LOG(SCEUTILITY, "Delete. Title: %s Save: %s File: %s", param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str());
|
||||
if (param.GetFilenameCount() == 0)
|
||||
display = DS_DELETE_NODATA;
|
||||
else
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
|
@ -261,6 +283,8 @@ const std::string PSPSaveDialog::GetSelectedSaveDirName() const
|
|||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SAVE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE:
|
||||
return param.GetSaveDirName(param.GetPspParam());
|
||||
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE:
|
||||
|
@ -274,8 +298,6 @@ const std::string PSPSaveDialog::GetSelectedSaveDirName() const
|
|||
case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA:
|
||||
return param.GetSaveDirName(param.GetPspParam());
|
||||
|
||||
// TODO: Maybe also SINGLEDELETE/etc?
|
||||
|
||||
// SIZES ignores saveName it seems.
|
||||
|
||||
default:
|
||||
|
@ -443,7 +465,11 @@ void PSPSaveDialog::DisplaySaveDataInfo1() {
|
|||
std::lock_guard<std::mutex> guard(paramLock);
|
||||
const SaveFileInfo &saveInfo = param.GetFileInfo(currentSelectedSave);
|
||||
|
||||
if (saveInfo.size == 0) {
|
||||
if (saveInfo.broken) {
|
||||
auto di = GetI18NCategory("Dialog");
|
||||
PPGeStyle textStyle = FadedStyle(PPGeAlign::BOX_VCENTER, 0.6f);
|
||||
PPGeDrawText(di->T("Corrupted Data"), 180, 136, textStyle);
|
||||
} else if (saveInfo.size == 0) {
|
||||
auto di = GetI18NCategory("Dialog");
|
||||
PPGeStyle textStyle = FadedStyle(PPGeAlign::BOX_VCENTER, 0.6f);
|
||||
PPGeDrawText(di->T("NEW DATA"), 180, 136, textStyle);
|
||||
|
@ -793,7 +819,7 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
DisplaySaveIcon(true);
|
||||
DisplaySaveDataInfo2();
|
||||
|
||||
DisplayMessage(di->T("LoadingFailed", "Unable to load data."));
|
||||
DisplayMessage(di->T("LoadingFailed", "Load failed\nThe data is corrupted."));
|
||||
|
||||
DisplayButtons(DS_BUTTON_CANCEL);
|
||||
DisplayBanner(DB_LOAD);
|
||||
|
@ -803,7 +829,6 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
if (param.GetPspParam()->mode != SCE_UTILITY_SAVEDATA_TYPE_LOAD) {
|
||||
display = DS_LOAD_LIST_CHOICE;
|
||||
} else {
|
||||
param.GetPspParam()->common.result = SCE_UTILITY_DIALOG_RESULT_CANCEL;
|
||||
StartFade(false);
|
||||
}
|
||||
}
|
||||
|
@ -882,15 +907,16 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
DisplayButtons(DS_BUTTON_OK | DS_BUTTON_CANCEL);
|
||||
DisplayBanner(DB_DELETE);
|
||||
|
||||
if (IsButtonPressed(cancelButtonFlag))
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
else if (IsButtonPressed(okButtonFlag)) {
|
||||
if (yesnoChoice == 0)
|
||||
if (IsButtonPressed(cancelButtonFlag) || (IsButtonPressed(okButtonFlag) && yesnoChoice == 0)) {
|
||||
if(param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE || param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE)
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
else {
|
||||
param.GetPspParam()->common.result = SCE_UTILITY_DIALOG_RESULT_CANCEL;
|
||||
StartFade(false);
|
||||
}
|
||||
} else if (IsButtonPressed(okButtonFlag)) {
|
||||
display = DS_DELETE_DELETING;
|
||||
StartIOThread();
|
||||
}
|
||||
}
|
||||
|
||||
EndDraw();
|
||||
|
@ -918,7 +944,10 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
DisplayBanner(DB_DELETE);
|
||||
|
||||
if (IsButtonPressed(cancelButtonFlag)) {
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
if (param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE || param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE)
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
else
|
||||
StartFade(false);
|
||||
}
|
||||
|
||||
EndDraw();
|
||||
|
@ -938,8 +967,14 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
if (IsButtonPressed(cancelButtonFlag)) {
|
||||
if (param.GetFilenameCount() == 0)
|
||||
display = DS_DELETE_NODATA;
|
||||
else
|
||||
else if (param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE || param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE) {
|
||||
if (currentSelectedSave > param.GetFilenameCount() - 1)
|
||||
currentSelectedSave = param.GetFilenameCount() - 1;
|
||||
display = DS_DELETE_LIST_CHOICE;
|
||||
} else {
|
||||
param.GetPspParam()->common.result = SCE_UTILITY_DIALOG_RESULT_SUCCESS;
|
||||
StartFade(false);
|
||||
}
|
||||
}
|
||||
|
||||
EndDraw();
|
||||
|
@ -986,10 +1021,12 @@ int PSPSaveDialog::Update(int animSpeed)
|
|||
}
|
||||
|
||||
void PSPSaveDialog::ExecuteIOAction() {
|
||||
auto &result = param.GetPspParam()->common.result;
|
||||
std::lock_guard<std::mutex> guard(paramLock);
|
||||
switch (display) {
|
||||
case DS_LOAD_LOADING:
|
||||
if (param.Load(param.GetPspParam(), GetSelectedSaveDirName(), currentSelectedSave) == 0) {
|
||||
result = param.Load(param.GetPspParam(), GetSelectedSaveDirName(), currentSelectedSave);
|
||||
if (result == 0) {
|
||||
display = DS_LOAD_DONE;
|
||||
} else {
|
||||
display = DS_LOAD_FAILED;
|
||||
|
@ -1003,9 +1040,11 @@ void PSPSaveDialog::ExecuteIOAction() {
|
|||
}
|
||||
break;
|
||||
case DS_DELETE_DELETING:
|
||||
if (param.Delete(param.GetPspParam(),currentSelectedSave)) {
|
||||
if (param.Delete(param.GetPspParam(), currentSelectedSave)) {
|
||||
result = 0;
|
||||
display = DS_DELETE_DONE;
|
||||
} else {
|
||||
//result = SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA;// What the result should be?
|
||||
display = DS_DELETE_FAILED;
|
||||
}
|
||||
break;
|
||||
|
@ -1058,10 +1097,14 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() {
|
|||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA:
|
||||
DEBUG_LOG(SCEUTILITY, "sceUtilitySavedata DELETEDATA: %s", param.GetPspParam()->saveName);
|
||||
result = param.DeleteData(param.GetPspParam());
|
||||
if (param.Delete(param.GetPspParam(), param.GetSelectedSave())) {
|
||||
result = 0;
|
||||
} else {
|
||||
result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
|
||||
}
|
||||
break;
|
||||
//case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE:
|
||||
if (param.Delete(param.GetPspParam(), param.GetSelectedSave())) {
|
||||
result = 0;
|
||||
} else {
|
||||
|
@ -1082,15 +1125,13 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() {
|
|||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE:
|
||||
if (!param.IsSaveDirectoryExist(param.GetPspParam())){
|
||||
result = param.Load(param.GetPspParam(), GetSelectedSaveDirName(), currentSelectedSave, param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE);
|
||||
if(result == SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA)
|
||||
result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
|
||||
} else if (!param.IsSfoFileExist(param.GetPspParam())) {
|
||||
result = SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN;
|
||||
} else if (param.Load(param.GetPspParam(), GetSelectedSaveDirName(), currentSelectedSave, param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE) == 0) {
|
||||
result = 0;
|
||||
} else {
|
||||
result = SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND;
|
||||
}
|
||||
break;
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_ERASE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_ERASESECURE:
|
||||
result = param.DeleteData(param.GetPspParam());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#define SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN (0x80110306)
|
||||
#define SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA (0x80110307)
|
||||
#define SCE_UTILITY_SAVEDATA_ERROR_LOAD_PARAM (0x80110308)
|
||||
#define SCE_UTILITY_SAVEDATA_ERROR_LOAD_FILE_NOT_FOUND (0x80110309)
|
||||
#define SCE_UTILITY_SAVEDATA_ERROR_LOAD_INTERNAL (0x8011030b)
|
||||
|
||||
#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_MEMSTICK (0x80110321)
|
||||
|
|
|
@ -322,12 +322,12 @@ bool SavedataParam::Delete(SceUtilitySavedataParam* param, int saveId) {
|
|||
}
|
||||
|
||||
// Sanity check, preventing full delete of savedata/ in MGS PW demo (!)
|
||||
if (!strlen(param->gameName)) {
|
||||
if (!strlen(param->gameName) && param->mode != SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE) {
|
||||
ERROR_LOG(SCEUTILITY, "Bad param with gameName empty - cannot delete save directory");
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string dirPath = GetSaveFilePath(param,saveId);
|
||||
std::string dirPath = GetSaveFilePath(param, GetSaveDir(saveId));
|
||||
if (dirPath.size() == 0) {
|
||||
ERROR_LOG(SCEUTILITY, "GetSaveFilePath returned empty - cannot delete save directory");
|
||||
return false;
|
||||
|
@ -341,25 +341,39 @@ bool SavedataParam::Delete(SceUtilitySavedataParam* param, int saveId) {
|
|||
return true;
|
||||
}
|
||||
|
||||
int SavedataParam::DeleteData(SceUtilitySavedataParam* param) {
|
||||
int SavedataParam::DeleteData(SceUtilitySavedataParam* param) {
|
||||
if (!param) {
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA;
|
||||
}
|
||||
if (param->fileName[0] == '\0') {
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA;
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
std::string subFolder = GetGameName(param) + GetSaveName(param);
|
||||
std::string filename = savePath + subFolder + "/" + GetFileName(param);
|
||||
if (!subFolder.size()) {
|
||||
ERROR_LOG(SCEUTILITY, "Bad subfolder, ignoring delete of %s", filename.c_str());
|
||||
std::string fileName = GetFileName(param);
|
||||
std::string dirPath = savePath + subFolder;
|
||||
std::string filePath = dirPath + "/" + fileName;
|
||||
std::string sfoPath = dirPath + "/" + SFO_FILENAME;
|
||||
|
||||
if (!pspFileSystem.GetFileInfo(dirPath).exists) {
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
|
||||
}
|
||||
|
||||
if (!pspFileSystem.GetFileInfo(sfoPath).exists)
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN;
|
||||
|
||||
if (fileName != "" && !pspFileSystem.GetFileInfo(filePath).exists) {
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (fileName == "") {
|
||||
return 0;
|
||||
}
|
||||
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(filename);
|
||||
if (info.exists) {
|
||||
pspFileSystem.RemoveFile(filename);
|
||||
if (!subFolder.size()) {
|
||||
ERROR_LOG(SCEUTILITY, "Bad subfolder, ignoring delete of %s", filePath.c_str());
|
||||
return 0;
|
||||
}
|
||||
|
||||
pspFileSystem.RemoveFile(filePath);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -505,7 +519,8 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD
|
|||
|
||||
if(param->dataBuf.IsValid()) // Can launch save without save data in mode 13
|
||||
{
|
||||
std::string filePath = dirPath+"/"+GetFileName(param);
|
||||
std::string fileName = GetFileName(param);
|
||||
std::string filePath = dirPath + "/" + fileName;
|
||||
u8 *data_ = 0;
|
||||
SceSize saveSize = 0;
|
||||
if(cryptedData == 0) // Save decrypted data
|
||||
|
@ -527,13 +542,16 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD
|
|||
// copy back save name in request
|
||||
strncpy(param->saveName, saveDirName.c_str(), 20);
|
||||
|
||||
if (!WritePSPFile(filePath, data_, saveSize))
|
||||
{
|
||||
ERROR_LOG(SCEUTILITY,"Error writing file %s",filePath.c_str());
|
||||
if (fileName == "") {
|
||||
delete[] cryptedData;
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE;
|
||||
}
|
||||
delete[] cryptedData;
|
||||
} else {
|
||||
if (!WritePSPFile(filePath, data_, saveSize)) {
|
||||
ERROR_LOG(SCEUTILITY, "Error writing file %s", filePath.c_str());
|
||||
delete[] cryptedData;
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE;
|
||||
}
|
||||
delete[] cryptedData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -571,15 +589,23 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD
|
|||
return SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA;
|
||||
}
|
||||
|
||||
bool isRWMode = param->mode == SCE_UTILITY_SAVEDATA_TYPE_READDATA || param->mode == SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE;
|
||||
|
||||
std::string dirPath = GetSaveFilePath(param, GetSaveDir(param, saveDirName));
|
||||
std::string filePath = dirPath + "/" + GetFileName(param);
|
||||
if (!pspFileSystem.GetFileInfo(filePath).exists) {
|
||||
return SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA;
|
||||
std::string fileName = GetFileName(param);
|
||||
std::string filePath = dirPath + "/" + fileName;
|
||||
std::string sfoPath = dirPath + "/" + SFO_FILENAME;
|
||||
|
||||
if (!pspFileSystem.GetFileInfo(dirPath).exists) {
|
||||
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA : SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA;
|
||||
}
|
||||
|
||||
int result = LoadSaveData(param, saveDirName, dirPath, secureMode);
|
||||
if (result != 0)
|
||||
return result;
|
||||
if (!pspFileSystem.GetFileInfo(sfoPath).exists)
|
||||
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN : SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN;
|
||||
|
||||
if (fileName != "" && !pspFileSystem.GetFileInfo(filePath).exists) {
|
||||
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND : SCE_UTILITY_SAVEDATA_ERROR_LOAD_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
LoadSFO(param, dirPath); // Load sfo
|
||||
|
||||
|
@ -597,6 +623,15 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD
|
|||
// Load SND0.AT3
|
||||
LoadFile(dirPath, SND0_FILENAME, ¶m->snd0FileData);
|
||||
|
||||
if (fileName == "") {
|
||||
// Don't load savedata but return success.
|
||||
return 0;
|
||||
}
|
||||
|
||||
int result = LoadSaveData(param, saveDirName, dirPath, secureMode);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1376,6 +1411,34 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (param->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE) {
|
||||
Clear();
|
||||
int realCount = 0;
|
||||
auto allSaves = pspFileSystem.GetDirListing(savePath);
|
||||
saveDataListCount = (int)allSaves.size();
|
||||
saveDataList = new SaveFileInfo[saveDataListCount];
|
||||
for (auto save : allSaves) {
|
||||
if (save.name == "." || save.name == "..")
|
||||
continue;
|
||||
std::string fileDataDir = savePath + save.name;
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataDir);
|
||||
auto allFiles = pspFileSystem.GetDirListing(fileDataDir);
|
||||
bool firstFile = true;
|
||||
for (auto file : allFiles) {
|
||||
if (firstFile) {
|
||||
// Use a file in save directory to determine the directory info.
|
||||
info = file;
|
||||
firstFile = false;
|
||||
} else
|
||||
info.size += file.size;
|
||||
}
|
||||
SetFileInfo(realCount, info, "", save.name);
|
||||
realCount++;
|
||||
}
|
||||
saveNameListDataCount = realCount;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool listEmptyFile = true;
|
||||
if (param->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD ||
|
||||
param->mode == SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE)
|
||||
|
@ -1441,19 +1504,25 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
const std::string thisSaveName = FixedToString(saveNameListData[i], ARRAY_SIZE(saveNameListData[i]));
|
||||
DEBUG_LOG(SCEUTILITY, "Name : %s", thisSaveName.c_str());
|
||||
|
||||
std::string fileDataPath = savePath + GetGameName(param) + thisSaveName + "/" + GetFileName(param);
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath);
|
||||
if (info.exists)
|
||||
{
|
||||
std::string fileDataDir = savePath + GetGameName(param) + thisSaveName;
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataDir);
|
||||
if (info.exists) {
|
||||
auto allFiles = pspFileSystem.GetDirListing(fileDataDir);
|
||||
bool firstFile = true;
|
||||
for (auto file : allFiles) {
|
||||
if (firstFile) {
|
||||
// Use a file in save directory to determine the directory info.
|
||||
info = file;
|
||||
firstFile = false;
|
||||
} else
|
||||
info.size += file.size;
|
||||
}
|
||||
SetFileInfo(realCount, info, thisSaveName);
|
||||
|
||||
DEBUG_LOG(SCEUTILITY,"%s Exist",fileDataPath.c_str());
|
||||
DEBUG_LOG(SCEUTILITY,"%s Exist",fileDataDir.c_str());
|
||||
realCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (listEmptyFile)
|
||||
{
|
||||
} else {
|
||||
if (listEmptyFile) {
|
||||
ClearFileInfo(saveDataList[realCount], thisSaveName);
|
||||
DEBUG_LOG(SCEUTILITY,"Don't Exist");
|
||||
realCount++;
|
||||
|
@ -1474,13 +1543,23 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
// get and stock file info for each file
|
||||
DEBUG_LOG(SCEUTILITY,"Name : %s",GetSaveName(param).c_str());
|
||||
|
||||
std::string fileDataPath = savePath + GetGameName(param) + GetSaveName(param) + "/" + GetFileName(param);
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath);
|
||||
std::string fileDataDir = savePath + GetGameName(param) + GetSaveName(param);
|
||||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataDir);
|
||||
if (info.exists)
|
||||
{
|
||||
auto allFiles = pspFileSystem.GetDirListing(fileDataDir);
|
||||
bool firstFile = true;
|
||||
for (auto file : allFiles) {
|
||||
if (firstFile) {
|
||||
// Use a file in save directory to determine the directory info.
|
||||
info = file;
|
||||
firstFile = false;
|
||||
} else
|
||||
info.size += file.size;
|
||||
}
|
||||
SetFileInfo(0, info, GetSaveName(param));
|
||||
|
||||
DEBUG_LOG(SCEUTILITY,"%s Exist",fileDataPath.c_str());
|
||||
DEBUG_LOG(SCEUTILITY,"%s Exist",fileDataDir.c_str());
|
||||
saveNameListDataCount = 1;
|
||||
}
|
||||
else
|
||||
|
@ -1497,13 +1576,16 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void SavedataParam::SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::string saveName)
|
||||
void SavedataParam::SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::string saveName, std::string savrDir)
|
||||
{
|
||||
saveInfo.size = info.size;
|
||||
saveInfo.saveName = saveName;
|
||||
saveInfo.idx = 0;
|
||||
saveInfo.modif_time = info.mtime;
|
||||
|
||||
std::string saveDir = savrDir == "" ? GetGameName(pspParam) + saveName : savrDir;
|
||||
saveInfo.saveDir = saveDir;
|
||||
|
||||
// Start with a blank slate.
|
||||
if (saveInfo.texture != NULL) {
|
||||
if (!noSaveIcon || saveInfo.texture != noSaveIcon->texture) {
|
||||
|
@ -1517,31 +1599,31 @@ void SavedataParam::SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::
|
|||
|
||||
// Search save image icon0
|
||||
// TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound
|
||||
std::string fileDataPath2 = savePath + GetGameName(pspParam) + saveName + "/" + ICON0_FILENAME;
|
||||
std::string fileDataPath2 = savePath + saveDir + "/" + ICON0_FILENAME;
|
||||
PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
saveInfo.texture = new PPGeImage(fileDataPath2);
|
||||
|
||||
// Load info in PARAM.SFO
|
||||
fileDataPath2 = savePath + GetGameName(pspParam) + saveName + "/" + SFO_FILENAME;
|
||||
fileDataPath2 = savePath + saveDir + "/" + SFO_FILENAME;
|
||||
info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
if (info2.exists) {
|
||||
std::vector<u8> sfoData;
|
||||
pspFileSystem.ReadEntireFile(fileDataPath2, sfoData);
|
||||
ParamSFOData sfoFile;
|
||||
if (sfoFile.ReadSFO(sfoData))
|
||||
{
|
||||
if (sfoFile.ReadSFO(sfoData)) {
|
||||
SetStringFromSFO(sfoFile, "TITLE", saveInfo.title, sizeof(saveInfo.title));
|
||||
SetStringFromSFO(sfoFile, "SAVEDATA_TITLE", saveInfo.saveTitle, sizeof(saveInfo.saveTitle));
|
||||
SetStringFromSFO(sfoFile, "SAVEDATA_DETAIL", saveInfo.saveDetail, sizeof(saveInfo.saveDetail));
|
||||
}
|
||||
} else {
|
||||
saveInfo.broken = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info, std::string saveName)
|
||||
void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info, std::string saveName, std::string saveDir)
|
||||
{
|
||||
SetFileInfo(saveDataList[idx], info, saveName);
|
||||
SetFileInfo(saveDataList[idx], info, saveName, saveDir);
|
||||
saveDataList[idx].idx = idx;
|
||||
}
|
||||
|
||||
|
@ -1549,6 +1631,7 @@ void SavedataParam::ClearFileInfo(SaveFileInfo &saveInfo, const std::string &sav
|
|||
saveInfo.size = 0;
|
||||
saveInfo.saveName = saveName;
|
||||
saveInfo.idx = 0;
|
||||
saveInfo.broken = false;
|
||||
if (saveInfo.texture != NULL) {
|
||||
if (!noSaveIcon || saveInfo.texture != noSaveIcon->texture) {
|
||||
delete saveInfo.texture;
|
||||
|
@ -1589,11 +1672,16 @@ const SaveFileInfo& SavedataParam::GetFileInfo(int idx)
|
|||
{
|
||||
return saveDataList[idx];
|
||||
}
|
||||
|
||||
std::string SavedataParam::GetFilename(int idx) const
|
||||
{
|
||||
return saveDataList[idx].saveName;
|
||||
}
|
||||
|
||||
std::string SavedataParam::GetSaveDir(int idx) const {
|
||||
return saveDataList[idx].saveDir;
|
||||
}
|
||||
|
||||
int SavedataParam::GetSelectedSave()
|
||||
{
|
||||
// The slot # of the same save on LOAD/SAVE lists can dismatch so this isn't right anyhow
|
||||
|
@ -1736,6 +1824,8 @@ bool SavedataParam::wouldHasMultiSaveName(SceUtilitySavedataParam* param) {
|
|||
case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_ERASESECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_ERASE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA:
|
||||
|
|
|
@ -39,11 +39,11 @@ enum SceUtilitySavedataType
|
|||
SCE_UTILITY_SAVEDATA_TYPE_SAVE = 3,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD = 4,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE = 5,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_DELETE = 6,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE = 7,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE = 6,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LISTALLDELETE = 7,// When run on a PSP, displays a list of all saves on the PSP. Weird. (Not really, it's to let you free up space)
|
||||
SCE_UTILITY_SAVEDATA_TYPE_SIZES = 8,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE = 9,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE = 10,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_DELETE = 10,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_LIST = 11,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_FILES = 12,
|
||||
SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE = 13,
|
||||
|
@ -65,11 +65,11 @@ static const char *const utilitySavedataTypeNames[] = {
|
|||
"SAVE",
|
||||
"LISTLOAD",
|
||||
"LISTSAVE",
|
||||
"DELETE",
|
||||
"LISTDELETE",
|
||||
"LISTALLDELETE",
|
||||
"SIZES",
|
||||
"AUTODELETE",
|
||||
"SINGLEDELETE",
|
||||
"DELETE",
|
||||
"LIST",
|
||||
"FILES",
|
||||
"MAKEDATASECURE",
|
||||
|
@ -273,17 +273,20 @@ struct SaveFileInfo
|
|||
{
|
||||
s64 size;
|
||||
std::string saveName;
|
||||
std::string saveDir;
|
||||
int idx;
|
||||
|
||||
char title[128];
|
||||
char saveTitle[128];
|
||||
char saveDetail[1024];
|
||||
|
||||
bool broken;
|
||||
|
||||
tm modif_time;
|
||||
|
||||
PPGeImage *texture;
|
||||
|
||||
SaveFileInfo() : size(0), saveName(""), idx(0), texture(NULL)
|
||||
SaveFileInfo() : size(0), saveName(""), idx(0), texture(NULL), broken(false)
|
||||
{
|
||||
memset(title, 0, 128);
|
||||
memset(saveTitle, 0, 128);
|
||||
|
@ -339,6 +342,7 @@ public:
|
|||
int GetFilenameCount();
|
||||
const SaveFileInfo& GetFileInfo(int idx);
|
||||
std::string GetFilename(int idx) const;
|
||||
std::string GetSaveDir(int idx) const;
|
||||
|
||||
int GetSelectedSave();
|
||||
void SetSelectedSave(int idx);
|
||||
|
@ -359,8 +363,8 @@ public:
|
|||
|
||||
private:
|
||||
void Clear();
|
||||
void SetFileInfo(int idx, PSPFileInfo &info, std::string saveName);
|
||||
void SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::string saveName);
|
||||
void SetFileInfo(int idx, PSPFileInfo &info, std::string saveName, std::string saveDir = "");
|
||||
void SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::string saveName, std::string saveDir = "");
|
||||
void ClearFileInfo(SaveFileInfo &saveInfo, const std::string &saveName);
|
||||
|
||||
int LoadSaveData(SceUtilitySavedataParam *param, const std::string &saveDirName, const std::string& dirPath, bool secureMode);
|
||||
|
|
Loading…
Add table
Reference in a new issue