diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 2849d3a592..99d4b1d62e 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -21,6 +21,7 @@ #include "../Core/MemMap.h" #include "../Config.h" #include "Core/Reporting.h" +#include "Core/HW/MemoryStick.h" PSPSaveDialog::PSPSaveDialog() : PSPDialog() @@ -91,6 +92,7 @@ int PSPSaveDialog::Init(int paramAddr) case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE: case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE: case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE: + case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA: display = DS_NONE; break; case SCE_UTILITY_SAVEDATA_TYPE_DELETE: // This run on PSP display a list of all save on the PSP. Weird. (Not really, it's to let you free up space) @@ -729,14 +731,23 @@ int PSPSaveDialog::Update() status = SCE_UTILITY_STATUS_FINISHED; break; case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE: - if(param.GetSize(param.GetPspParam())) { - param.GetPspParam()->result = 0; - } - else - { - param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA; + bool result = param.GetSize(param.GetPspParam()); + // TODO: According to JPCSP, should test/verify this part but seems edge casey. + if (MemoryStick_State() != PSP_MEMORYSTICK_STATE_DRIVER_READY) + param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_MEMSTICK; + else if (result) + param.GetPspParam()->result = 0; + else + param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA; + status = SCE_UTILITY_STATUS_FINISHED; } + break; + case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA: + // TODO: This should probably actually delete something. + // For now, since MAKEDATA doesn't work anyway, always say it couldn't be deleted. + WARN_LOG(HLE, "FAKE sceUtilitySavedata DELETEDATA: %s", param.GetPspParam()->saveName); + param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_STATUS; status = SCE_UTILITY_STATUS_FINISHED; break; case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE: diff --git a/Core/Dialog/PSPSaveDialog.h b/Core/Dialog/PSPSaveDialog.h index 1e9eaea054..a0bc202861 100644 --- a/Core/Dialog/PSPSaveDialog.h +++ b/Core/Dialog/PSPSaveDialog.h @@ -30,7 +30,9 @@ #define SCE_UTILITY_SAVEDATA_ERROR_LOAD_PARAM (0x80110308) #define SCE_UTILITY_SAVEDATA_ERROR_LOAD_INTERNAL (0x8011030b) +#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_MEMSTICK (0x80110321) #define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA (0x80110327) +#define SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_STATUS (0x8011032c) #define SCE_UTILITY_SAVEDATA_ERROR_SAVE_NO_MS (0x80110381) #define SCE_UTILITY_SAVEDATA_ERROR_SAVE_EJECT_MS (0x80110382) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index ce3b97089b..2e7e97bec6 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -905,9 +905,36 @@ bool SavedataParam::GetSize(SceUtilitySavedataParam *param) return false; } - // TODO code this + std::string saveDir = savePath + GetGameName(param) + GetSaveName(param); + PSPFileInfo info = pspFileSystem.GetFileInfo(saveDir); + bool exists = info.exists; - return false; + if (Memory::IsValidAddress(param->sizeAddr)) + { + PspUtilitySavedataSizeInfo sizeInfo; + Memory::ReadStruct(param->sizeAddr, &sizeInfo); + + // TODO: Read the entries and count up the size vs. existing size? + + sizeInfo.sectorSize = (int)MemoryStick_SectorSize(); + sizeInfo.freeSectors = (int)(MemoryStick_FreeSpace() / MemoryStick_SectorSize()); + + // TODO: Is this after the specified files? Before? + sizeInfo.freeKB = (int)(MemoryStick_FreeSpace() / 1024); + std::string spaceTxt = SavedataParam::GetSpaceText((int)MemoryStick_FreeSpace()); + strncpy(sizeInfo.freeString, spaceTxt.c_str(), 8); + sizeInfo.freeString[7] = '\0'; + + // TODO. + sizeInfo.neededKB = 0; + strcpy(sizeInfo.neededString, "0 KB"); + sizeInfo.overwriteKB = 0; + strcpy(sizeInfo.overwriteString, "0 KB"); + + Memory::WriteStruct(param->sizeAddr, &sizeInfo); + } + + return exists; } void SavedataParam::Clear() diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index a130708c7c..35256de670 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -22,23 +22,24 @@ enum SceUtilitySavedataType { - SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD = 0, - SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE = 1, - SCE_UTILITY_SAVEDATA_TYPE_LOAD = 2, - 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_SIZES = 8, - SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE = 10, - SCE_UTILITY_SAVEDATA_TYPE_LIST = 11, - SCE_UTILITY_SAVEDATA_TYPE_FILES = 12, - SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE = 13, - SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE = 15, - SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE = 17, - SCE_UTILITY_SAVEDATA_TYPE_GETSIZE = 22 -} ; + SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD = 0, + SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE = 1, + SCE_UTILITY_SAVEDATA_TYPE_LOAD = 2, + 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_SIZES = 8, + SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE = 10, + SCE_UTILITY_SAVEDATA_TYPE_LIST = 11, + SCE_UTILITY_SAVEDATA_TYPE_FILES = 12, + SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE = 13, + SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE = 15, + SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE = 17, + SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA = 21, + SCE_UTILITY_SAVEDATA_TYPE_GETSIZE = 22, +}; // title, savedataTitle, detail: parts of the unencrypted SFO // data, it contains what the VSH and standard load screen shows @@ -58,6 +59,28 @@ struct PspUtilitySavedataFileData { int unknown; }; +// TODO: According to JPCSP, should verify. +struct PspUtilitySavedataSizeEntry { + u64 size; + char name[16]; +}; + +// TODO: According to JPCSP, should verify. +struct PspUtilitySavedataSizeInfo { + int secureNumEntries; + int numEntries; + u32 secureEntriesPtr; + u32 entriesPtr; + int sectorSize; + int freeSectors; + int freeKB; + char freeString[8]; + int neededKB; + char neededString[8]; + int overwriteKB; + char overwriteString[8]; +}; + // Structure to hold the parameters for the sceUtilitySavedataInitStart function. struct SceUtilitySavedataParam { diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index 677b271fac..759a421be5 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -74,13 +74,15 @@ int sceUtilitySavedataShutdownStart() int sceUtilitySavedataGetStatus() { - return saveDialog.GetStatus(); + int status = saveDialog.GetStatus(); + DEBUG_LOG(HLE,"%08x=sceUtilitySavedataGetStatus()", status); + return status; } int sceUtilitySavedataUpdate(int animSpeed) { DEBUG_LOG(HLE,"sceUtilitySavedataUpdate(%d)", animSpeed); - return saveDialog.Update(); + return hleDelayResult(saveDialog.Update(), "savedata update", 300); } #define PSP_AV_MODULE_AVCODEC 0