mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #251 from unknownbrackets/save-fixes
sceUtility / savedata fixes
This commit is contained in:
commit
d9cd067f5a
13 changed files with 186 additions and 243 deletions
|
@ -53,14 +53,15 @@ void PSPDialog::DisplayMessage(std::string text)
|
|||
PPGeDrawText(text.c_str(), 480/2, 100, PPGE_ALIGN_CENTER, 0.5f, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
void PSPDialog::Shutdown()
|
||||
int PSPDialog::Shutdown()
|
||||
{
|
||||
status = SCE_UTILITY_STATUS_SHUTDOWN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PSPDialog::Update()
|
||||
int PSPDialog::Update()
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool PSPDialog::IsButtonPressed(int checkButton)
|
||||
|
|
|
@ -45,8 +45,8 @@ public:
|
|||
PSPDialog();
|
||||
virtual ~PSPDialog();
|
||||
|
||||
virtual void Update();
|
||||
virtual void Shutdown();
|
||||
virtual int Update();
|
||||
virtual int Shutdown();
|
||||
|
||||
enum DialogStatus
|
||||
{
|
||||
|
|
|
@ -29,18 +29,18 @@ PSPMsgDialog::PSPMsgDialog()
|
|||
PSPMsgDialog::~PSPMsgDialog() {
|
||||
}
|
||||
|
||||
void PSPMsgDialog::Init(unsigned int paramAddr)
|
||||
int PSPMsgDialog::Init(unsigned int paramAddr)
|
||||
{
|
||||
// Ignore if already running
|
||||
if (status != SCE_UTILITY_STATUS_NONE && status != SCE_UTILITY_STATUS_SHUTDOWN)
|
||||
{
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
messageDialogAddr = paramAddr;
|
||||
if (!Memory::IsValidAddress(messageDialogAddr))
|
||||
{
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
Memory::ReadStruct(messageDialogAddr, &messageDialog);
|
||||
|
||||
|
@ -63,7 +63,7 @@ void PSPMsgDialog::Init(unsigned int paramAddr)
|
|||
status = SCE_UTILITY_STATUS_INITIALIZE;
|
||||
|
||||
lastButtons = __CtrlPeekButtons();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PSPMsgDialog::DisplayBack()
|
||||
|
@ -95,7 +95,7 @@ void PSPMsgDialog::DisplayEnterBack()
|
|||
PPGeDrawText("Back", 320, 220, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
void PSPMsgDialog::Update()
|
||||
int PSPMsgDialog::Update()
|
||||
{
|
||||
switch (status) {
|
||||
case SCE_UTILITY_STATUS_FINISHED:
|
||||
|
@ -105,7 +105,7 @@ void PSPMsgDialog::Update()
|
|||
|
||||
if (status != SCE_UTILITY_STATUS_RUNNING)
|
||||
{
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *text;
|
||||
|
@ -191,17 +191,18 @@ void PSPMsgDialog::Update()
|
|||
break;
|
||||
default:
|
||||
status = SCE_UTILITY_STATUS_FINISHED;
|
||||
return;
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
lastButtons = buttons;
|
||||
|
||||
Memory::WriteStruct(messageDialogAddr, &messageDialog);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PSPMsgDialog::Shutdown()
|
||||
int PSPMsgDialog::Shutdown()
|
||||
{
|
||||
PSPDialog::Shutdown();
|
||||
return PSPDialog::Shutdown();
|
||||
}
|
||||
|
||||
|
|
|
@ -41,9 +41,9 @@ public:
|
|||
PSPMsgDialog();
|
||||
virtual ~PSPMsgDialog();
|
||||
|
||||
virtual void Init(unsigned int paramAddr);
|
||||
virtual void Update();
|
||||
void Shutdown();
|
||||
virtual int Init(unsigned int paramAddr);
|
||||
virtual int Update();
|
||||
int Shutdown();
|
||||
|
||||
private :
|
||||
void DisplayBack();
|
||||
|
|
|
@ -143,7 +143,7 @@ void PSPOskDialog::RenderKeyboard()
|
|||
|
||||
}
|
||||
|
||||
void PSPOskDialog::Update()
|
||||
int PSPOskDialog::Update()
|
||||
{
|
||||
buttons = __CtrlReadLatch();
|
||||
int selectedRow = selectedChar / KEYSPERROW;
|
||||
|
@ -230,4 +230,6 @@ void PSPOskDialog::Update()
|
|||
oskData.result = PSP_UTILITY_OSK_RESULT_CHANGED;
|
||||
Memory::WriteStruct(oskParams.SceUtilityOskDataPtr, &oskData);
|
||||
Memory::WriteStruct(oskParamsAddr, &oskParams);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -145,7 +145,7 @@ public:
|
|||
virtual ~PSPOskDialog();
|
||||
|
||||
virtual int Init(u32 oskPtr);
|
||||
virtual void Update();
|
||||
virtual int Update();
|
||||
private:
|
||||
void HackyGetStringWide(std::string& _string, const u32 em_address);
|
||||
void RenderKeyboard();
|
||||
|
|
|
@ -25,12 +25,13 @@ PSPPlaceholderDialog::~PSPPlaceholderDialog() {
|
|||
}
|
||||
|
||||
|
||||
void PSPPlaceholderDialog::Init()
|
||||
int PSPPlaceholderDialog::Init()
|
||||
{
|
||||
status = SCE_UTILITY_STATUS_INITIALIZE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PSPPlaceholderDialog::Update()
|
||||
int PSPPlaceholderDialog::Update()
|
||||
{
|
||||
//__UtilityUpdate();
|
||||
if (status == SCE_UTILITY_STATUS_INITIALIZE)
|
||||
|
@ -45,4 +46,5 @@ void PSPPlaceholderDialog::Update()
|
|||
{
|
||||
status = SCE_UTILITY_STATUS_SHUTDOWN;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ public:
|
|||
PSPPlaceholderDialog();
|
||||
virtual ~PSPPlaceholderDialog();
|
||||
|
||||
virtual void Init();
|
||||
virtual void Update();
|
||||
virtual int Init();
|
||||
virtual int Update();
|
||||
};
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ PSPSaveDialog::PSPSaveDialog()
|
|||
PSPSaveDialog::~PSPSaveDialog() {
|
||||
}
|
||||
|
||||
u32 PSPSaveDialog::Init(int paramAddr)
|
||||
int PSPSaveDialog::Init(int paramAddr)
|
||||
{
|
||||
// Ignore if already running
|
||||
if (status != SCE_UTILITY_STATUS_NONE && status != SCE_UTILITY_STATUS_SHUTDOWN)
|
||||
|
@ -238,7 +238,9 @@ void PSPSaveDialog::DisplaySaveDataInfo1()
|
|||
}
|
||||
else
|
||||
{
|
||||
char txt[1024];
|
||||
char txt[2048];
|
||||
_dbg_assert_msg_(HLE, sizeof(txt) > sizeof(SaveFileInfo), "Local buffer is too small.");
|
||||
|
||||
sprintf(txt,"%s\n%02d/%02d/%d %02d:%02d %lld KB\n%s\n%s"
|
||||
, param.GetFileInfo(currentSelectedSave).title
|
||||
, param.GetFileInfo(currentSelectedSave).modif_time.tm_mday
|
||||
|
@ -315,7 +317,7 @@ void PSPSaveDialog::DisplayBack()
|
|||
PPGeDrawText("Back", 270, 220, PPGE_ALIGN_LEFT, 0.5f, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
void PSPSaveDialog::Update()
|
||||
int PSPSaveDialog::Update()
|
||||
{
|
||||
switch (status) {
|
||||
case SCE_UTILITY_STATUS_FINISHED:
|
||||
|
@ -327,12 +329,12 @@ void PSPSaveDialog::Update()
|
|||
|
||||
if (status != SCE_UTILITY_STATUS_RUNNING)
|
||||
{
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!param.GetPspParam()) {
|
||||
status = SCE_UTILITY_STATUS_SHUTDOWN;
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
buttons = __CtrlPeekButtons();
|
||||
|
@ -684,11 +686,14 @@ void PSPSaveDialog::Update()
|
|||
Memory::Memcpy(requestAddr,&request,request.size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PSPSaveDialog::Shutdown()
|
||||
int PSPSaveDialog::Shutdown()
|
||||
{
|
||||
PSPDialog::Shutdown();
|
||||
param.SetPspParam(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,9 +62,9 @@ public:
|
|||
PSPSaveDialog();
|
||||
virtual ~PSPSaveDialog();
|
||||
|
||||
virtual u32 Init(int paramAddr);
|
||||
virtual void Update();
|
||||
void Shutdown();
|
||||
virtual int Init(int paramAddr);
|
||||
virtual int Update();
|
||||
int Shutdown();
|
||||
|
||||
private :
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#include "SavedataParam.h"
|
||||
#include "../System.h"
|
||||
#include "image/png_load.h"
|
||||
#include "../HLE/sceKernelMemory.h"
|
||||
#include "../ELF/ParamSFO.h"
|
||||
|
@ -35,9 +34,40 @@ namespace
|
|||
{
|
||||
int getSizeNormalized(int size)
|
||||
{
|
||||
int sizeCluster = MemoryStick_SectorSize();
|
||||
int sizeCluster = (int)MemoryStick_SectorSize();
|
||||
return ((int)((size + sizeCluster - 1) / sizeCluster)) * sizeCluster;
|
||||
}
|
||||
|
||||
void SetStringFromSFO(ParamSFOData &sfoFile, const char *name, char *str, int strLength)
|
||||
{
|
||||
std::string value = sfoFile.GetValueString(name);
|
||||
strncpy(str, value.c_str(), strLength - 1);
|
||||
str[strLength - 1] = 0;
|
||||
}
|
||||
|
||||
bool ReadPSPFile(std::string filename, u8 *data, s64 dataSize)
|
||||
{
|
||||
u32 handle = pspFileSystem.OpenFile(filename, FILEACCESS_READ);
|
||||
if (handle == 0)
|
||||
return false;
|
||||
|
||||
int result = pspFileSystem.ReadFile(handle, data, dataSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
|
||||
return result != 0;
|
||||
}
|
||||
|
||||
bool WritePSPFile(std::string filename, u8 *data, int dataSize)
|
||||
{
|
||||
u32 handle = pspFileSystem.OpenFile(filename, (FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle == 0)
|
||||
return false;
|
||||
|
||||
int result = pspFileSystem.WriteFile(handle, data, dataSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
|
||||
return result != 0;
|
||||
}
|
||||
}
|
||||
|
||||
SavedataParam::SavedataParam()
|
||||
|
@ -139,22 +169,13 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId)
|
|||
|
||||
std::string filePath = dirPath+"/"+GetFileName(param);
|
||||
INFO_LOG(HLE,"Saving file with size %u in %s",param->dataBufSize,filePath.c_str());
|
||||
unsigned int handle = pspFileSystem.OpenFile(filePath,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle == 0)
|
||||
if (!WritePSPFile(filePath, data_, param->dataBufSize))
|
||||
{
|
||||
ERROR_LOG(HLE,"Error opening file %s",filePath.c_str());
|
||||
return false;
|
||||
}
|
||||
if (!pspFileSystem.WriteFile(handle, data_, param->dataBufSize))
|
||||
{
|
||||
pspFileSystem.CloseFile(handle);
|
||||
ERROR_LOG(HLE,"Error writing file %s",filePath.c_str());
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
pspFileSystem.CloseFile(handle);
|
||||
|
||||
// SAVE PARAM.SFO
|
||||
ParamSFOData sfoFile;
|
||||
sfoFile.SetValue("TITLE",param->sfoParam.title,128);
|
||||
|
@ -169,12 +190,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId)
|
|||
size_t sfoSize;
|
||||
sfoFile.WriteSFO(&sfoData,&sfoSize);
|
||||
std::string sfopath = dirPath+"/"+sfoName;
|
||||
handle = pspFileSystem.OpenFile(sfopath,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle)
|
||||
{
|
||||
pspFileSystem.WriteFile(handle, sfoData, sfoSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
}
|
||||
WritePSPFile(sfopath, sfoData, sfoSize);
|
||||
delete[] sfoData;
|
||||
|
||||
// SAVE ICON0
|
||||
|
@ -182,36 +198,21 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId)
|
|||
{
|
||||
data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->icon0FileData.buf));
|
||||
std::string icon0path = dirPath+"/"+icon0Name;
|
||||
handle = pspFileSystem.OpenFile(icon0path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle)
|
||||
{
|
||||
pspFileSystem.WriteFile(handle, data_, param->icon0FileData.bufSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
}
|
||||
WritePSPFile(icon0path, data_, param->icon0FileData.bufSize);
|
||||
}
|
||||
// SAVE ICON1
|
||||
if (param->icon1FileData.buf)
|
||||
{
|
||||
data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->icon1FileData.buf));
|
||||
std::string icon1path = dirPath+"/"+icon1Name;
|
||||
handle = pspFileSystem.OpenFile(icon1path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle)
|
||||
{
|
||||
pspFileSystem.WriteFile(handle, data_, param->icon1FileData.bufSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
}
|
||||
WritePSPFile(icon1path, data_, param->icon1FileData.bufSize);
|
||||
}
|
||||
// SAVE PIC1
|
||||
if (param->pic1FileData.buf)
|
||||
{
|
||||
data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->pic1FileData.buf));
|
||||
std::string pic1path = dirPath+"/"+pic1Name;
|
||||
handle = pspFileSystem.OpenFile(pic1path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle)
|
||||
{
|
||||
pspFileSystem.WriteFile(handle, data_, param->pic1FileData.bufSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
}
|
||||
WritePSPFile(pic1path, data_, param->pic1FileData.bufSize);
|
||||
}
|
||||
|
||||
// Save SND
|
||||
|
@ -219,12 +220,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId)
|
|||
{
|
||||
data_ = (u8*)Memory::GetPointer(*((unsigned int*)¶m->snd0FileData.buf));
|
||||
std::string snd0path = dirPath+"/"+snd0Name;
|
||||
handle = pspFileSystem.OpenFile(snd0path,(FileAccess)(FILEACCESS_WRITE | FILEACCESS_CREATE));
|
||||
if (handle)
|
||||
{
|
||||
pspFileSystem.WriteFile(handle, data_, param->snd0FileData.bufSize);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
}
|
||||
WritePSPFile(snd0path, data_, param->snd0FileData.bufSize);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -249,19 +245,11 @@ bool SavedataParam::Load(SceUtilitySavedataParam *param, int saveId)
|
|||
|
||||
std::string filePath = dirPath+"/"+GetFileName(param);
|
||||
INFO_LOG(HLE,"Loading file with size %u in %s",param->dataBufSize,filePath.c_str());
|
||||
u32 handle = pspFileSystem.OpenFile(filePath,FILEACCESS_READ);
|
||||
if (!handle)
|
||||
if (!ReadPSPFile(filePath, data_, param->dataBufSize))
|
||||
{
|
||||
ERROR_LOG(HLE,"Error opening file %s",filePath.c_str());
|
||||
return false;
|
||||
}
|
||||
if (!pspFileSystem.ReadFile(handle, data_, param->dataBufSize))
|
||||
{
|
||||
pspFileSystem.CloseFile(handle);
|
||||
ERROR_LOG(HLE,"Error reading file %s",filePath.c_str());
|
||||
return false;
|
||||
}
|
||||
pspFileSystem.CloseFile(handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -310,7 +298,7 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param)
|
|||
Memory::Write_U32((u32)MemoryStick_SectorSize(),param->msFree); // cluster Size
|
||||
Memory::Write_U32((u32)(MemoryStick_FreeSpace() / MemoryStick_SectorSize()),param->msFree+4); // Free cluster
|
||||
Memory::Write_U32((u32)(MemoryStick_FreeSpace() / 0x400),param->msFree+8); // Free space (in KB)
|
||||
std::string spaceTxt = SavedataParam::GetSpaceText(MemoryStick_FreeSpace());
|
||||
std::string spaceTxt = SavedataParam::GetSpaceText((int)MemoryStick_FreeSpace());
|
||||
Memory::Memset(param->msFree+12,0,spaceTxt.size()+1);
|
||||
Memory::Memcpy(param->msFree+12,spaceTxt.c_str(),spaceTxt.size()); // Text representing free space
|
||||
}
|
||||
|
@ -347,7 +335,7 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param)
|
|||
total_size += getSizeNormalized(param->pic1FileData.size);
|
||||
total_size += getSizeNormalized(param->snd0FileData.size);
|
||||
|
||||
Memory::Write_U32(total_size / MemoryStick_SectorSize(),param->utilityData); // num cluster
|
||||
Memory::Write_U32(total_size / (u32)MemoryStick_SectorSize(),param->utilityData); // num cluster
|
||||
Memory::Write_U32(total_size / 0x400,param->utilityData+4); // save size in KB
|
||||
std::string spaceTxt = SavedataParam::GetSpaceText(total_size);
|
||||
Memory::Memset(param->utilityData+8,0,spaceTxt.size()+1);
|
||||
|
@ -390,7 +378,7 @@ void SavedataParam::Clear()
|
|||
}
|
||||
}
|
||||
|
||||
u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
||||
int SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
||||
{
|
||||
pspParam = param;
|
||||
if (!pspParam)
|
||||
|
@ -430,64 +418,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath);
|
||||
if (info.exists)
|
||||
{
|
||||
saveDataList[realCount].size = info.size;
|
||||
saveDataList[realCount].saveName = saveNameListData[i];
|
||||
saveDataList[realCount].idx = i;
|
||||
saveDataList[realCount].modif_time = info.mtime;
|
||||
|
||||
// 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(param)+saveNameListData[i]+"/"+icon0Name;
|
||||
PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *textureDataPNG = new u8[(size_t)info2.size];
|
||||
int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ);
|
||||
pspFileSystem.ReadFile(handle,textureDataPNG,info2.size);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
unsigned char* textureData;
|
||||
int w,h;
|
||||
pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false);
|
||||
delete[] textureDataPNG;
|
||||
u32 texSize = w*h*4;
|
||||
u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon");
|
||||
saveDataList[realCount].textureData = atlasPtr;
|
||||
Memory::Memcpy(atlasPtr, textureData, texSize);
|
||||
free(textureData);
|
||||
saveDataList[realCount].textureWidth = w;
|
||||
saveDataList[realCount].textureHeight = h;
|
||||
}
|
||||
else
|
||||
{
|
||||
saveDataList[realCount].textureData = 0;
|
||||
}
|
||||
|
||||
// Load info in PARAM.SFO
|
||||
fileDataPath2 = savePath+GetGameName(param)+saveNameListData[i]+"/"+sfoName;
|
||||
info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *sfoParam = new u8[(size_t)info2.size];
|
||||
int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ);
|
||||
pspFileSystem.ReadFile(handle,sfoParam,info2.size);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
ParamSFOData sfoFile;
|
||||
if (sfoFile.ReadSFO(sfoParam, (size_t)info2.size))
|
||||
{
|
||||
std::string title = sfoFile.GetValueString("TITLE");
|
||||
memcpy(saveDataList[realCount].title,title.c_str(),title.size());
|
||||
saveDataList[realCount].title[title.size()] = 0;
|
||||
|
||||
std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE");
|
||||
memcpy(saveDataList[realCount].saveTitle,savetitle.c_str(),savetitle.size());
|
||||
saveDataList[realCount].saveTitle[savetitle.size()] = 0;
|
||||
|
||||
std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL");
|
||||
memcpy(saveDataList[realCount].saveDetail,savedetail.c_str(),savedetail.size());
|
||||
saveDataList[realCount].saveDetail[savedetail.size()] = 0;
|
||||
}
|
||||
delete [] sfoParam;
|
||||
}
|
||||
SetFileInfo(realCount, info, saveNameListData[i]);
|
||||
|
||||
DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str());
|
||||
realCount++;
|
||||
|
@ -521,64 +452,7 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
PSPFileInfo info = pspFileSystem.GetFileInfo(fileDataPath);
|
||||
if (info.exists)
|
||||
{
|
||||
saveDataList[0].size = info.size;
|
||||
saveDataList[0].saveName = GetSaveName(param);
|
||||
saveDataList[0].idx = 0;
|
||||
saveDataList[0].modif_time = info.mtime;
|
||||
|
||||
// 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(param)+GetSaveName(param)+"/"+icon0Name;
|
||||
PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *textureDataPNG = new u8[(size_t)info2.size];
|
||||
int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ);
|
||||
pspFileSystem.ReadFile(handle,textureDataPNG,info2.size);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
unsigned char *textureData;
|
||||
int w,h;
|
||||
pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false);
|
||||
delete[] textureDataPNG;
|
||||
u32 texSize = w*h*4;
|
||||
u32 atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon");
|
||||
saveDataList[0].textureData = atlasPtr;
|
||||
Memory::Memcpy(atlasPtr, textureData, texSize);
|
||||
free(textureData);
|
||||
saveDataList[0].textureWidth = w;
|
||||
saveDataList[0].textureHeight = h;
|
||||
}
|
||||
else
|
||||
{
|
||||
saveDataList[0].textureData = 0;
|
||||
}
|
||||
|
||||
// Load info in PARAM.SFO
|
||||
fileDataPath2 = savePath+GetGameName(param)+GetSaveName(param)+"/"+sfoName;
|
||||
info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *sfoParam = new u8[(size_t)info2.size];
|
||||
int handle = pspFileSystem.OpenFile(fileDataPath2,FILEACCESS_READ);
|
||||
pspFileSystem.ReadFile(handle,sfoParam,info2.size);
|
||||
pspFileSystem.CloseFile(handle);
|
||||
ParamSFOData sfoFile;
|
||||
if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size))
|
||||
{
|
||||
std::string title = sfoFile.GetValueString("TITLE");
|
||||
memcpy(saveDataList[0].title,title.c_str(),title.size());
|
||||
saveDataList[0].title[title.size()] = 0;
|
||||
|
||||
std::string savetitle = sfoFile.GetValueString("SAVEDATA_TITLE");
|
||||
memcpy(saveDataList[0].saveTitle,savetitle.c_str(),savetitle.size());
|
||||
saveDataList[0].saveTitle[savetitle.size()] = 0;
|
||||
|
||||
std::string savedetail = sfoFile.GetValueString("SAVEDATA_DETAIL");
|
||||
memcpy(saveDataList[0].saveDetail,savedetail.c_str(),savedetail.size());
|
||||
saveDataList[0].saveDetail[savedetail.size()] = 0;
|
||||
}
|
||||
delete [] sfoParam;
|
||||
}
|
||||
SetFileInfo(0, info, GetSaveName(pspParam));
|
||||
|
||||
DEBUG_LOG(HLE,"%s Exist",fileDataPath.c_str());
|
||||
saveNameListDataCount = 1;
|
||||
|
@ -600,6 +474,67 @@ u32 SavedataParam::SetPspParam(SceUtilitySavedataParam *param)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info, std::string saveName)
|
||||
{
|
||||
saveDataList[idx].size = info.size;
|
||||
saveDataList[idx].saveName = saveName;
|
||||
saveDataList[idx].idx = 0;
|
||||
saveDataList[idx].modif_time = info.mtime;
|
||||
|
||||
// Start with a blank slate.
|
||||
saveDataList[idx].textureData = 0;
|
||||
saveDataList[idx].title[0] = 0;
|
||||
saveDataList[idx].saveTitle[0] = 0;
|
||||
saveDataList[idx].saveDetail[0] = 0;
|
||||
|
||||
// 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 + "/" + icon0Name;
|
||||
PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *textureDataPNG = new u8[(size_t)info2.size];
|
||||
ReadPSPFile(fileDataPath2, textureDataPNG, info2.size);
|
||||
unsigned char *textureData;
|
||||
int w,h;
|
||||
|
||||
int success = pngLoadPtr(textureDataPNG, (int)info2.size, &w, &h, &textureData, false);
|
||||
delete[] textureDataPNG;
|
||||
|
||||
u32 texSize = w*h*4;
|
||||
u32 atlasPtr;
|
||||
if (success)
|
||||
atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon");
|
||||
if (success && atlasPtr > 0)
|
||||
{
|
||||
saveDataList[idx].textureData = atlasPtr;
|
||||
Memory::Memcpy(atlasPtr, textureData, texSize);
|
||||
free(textureData);
|
||||
saveDataList[idx].textureWidth = w;
|
||||
saveDataList[idx].textureHeight = h;
|
||||
}
|
||||
else
|
||||
WARN_LOG(HLE, "Unable to load PNG data for savedata.");
|
||||
}
|
||||
|
||||
// Load info in PARAM.SFO
|
||||
fileDataPath2 = savePath + GetGameName(pspParam) + saveName + "/" + sfoName;
|
||||
info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
{
|
||||
u8 *sfoParam = new u8[(size_t)info2.size];
|
||||
ReadPSPFile(fileDataPath2, sfoParam, info2.size);
|
||||
ParamSFOData sfoFile;
|
||||
if (sfoFile.ReadSFO(sfoParam,(size_t)info2.size))
|
||||
{
|
||||
SetStringFromSFO(sfoFile, "TITLE", saveDataList[idx].title, sizeof(saveDataList[idx].title));
|
||||
SetStringFromSFO(sfoFile, "SAVEDATA_TITLE", saveDataList[idx].saveTitle, sizeof(saveDataList[idx].saveTitle));
|
||||
SetStringFromSFO(sfoFile, "SAVEDATA_DETAIL", saveDataList[idx].saveDetail, sizeof(saveDataList[idx].saveDetail));
|
||||
}
|
||||
delete [] sfoParam;
|
||||
}
|
||||
}
|
||||
|
||||
SceUtilitySavedataParam* SavedataParam::GetPspParam()
|
||||
{
|
||||
return pspParam;
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "../HLE/sceKernel.h"
|
||||
|
||||
#include "../System.h"
|
||||
|
||||
enum SceUtilitySavedataType
|
||||
{
|
||||
|
@ -156,7 +156,7 @@ public:
|
|||
|
||||
SavedataParam();
|
||||
|
||||
u32 SetPspParam(SceUtilitySavedataParam* param);
|
||||
int SetPspParam(SceUtilitySavedataParam* param);
|
||||
SceUtilitySavedataParam* GetPspParam();
|
||||
|
||||
int GetFilenameCount();
|
||||
|
@ -168,6 +168,7 @@ public:
|
|||
|
||||
private:
|
||||
void Clear();
|
||||
void SetFileInfo(int idx, PSPFileInfo &info, std::string saveName);
|
||||
|
||||
SceUtilitySavedataParam* pspParam;
|
||||
int selectedSave;
|
||||
|
|
|
@ -50,14 +50,13 @@ void __UtilityShutdown()
|
|||
int sceUtilitySavedataInitStart(u32 paramAddr)
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilitySavedataInitStart(%08x)", paramAddr);
|
||||
return (u32)saveDialog.Init(paramAddr);
|
||||
return saveDialog.Init(paramAddr);
|
||||
}
|
||||
|
||||
int sceUtilitySavedataShutdownStart()
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilitySavedataShutdownStart()");
|
||||
saveDialog.Shutdown();
|
||||
return 0;
|
||||
return saveDialog.Shutdown();
|
||||
}
|
||||
|
||||
int sceUtilitySavedataGetStatus()
|
||||
|
@ -65,13 +64,10 @@ int sceUtilitySavedataGetStatus()
|
|||
return saveDialog.GetStatus();
|
||||
}
|
||||
|
||||
void sceUtilitySavedataUpdate(u32 unknown)
|
||||
int sceUtilitySavedataUpdate(int animSpeed)
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilitySavedataUpdate()");
|
||||
|
||||
saveDialog.Update();
|
||||
|
||||
return;
|
||||
DEBUG_LOG(HLE,"sceUtilitySavedataUpdate(%d)", animSpeed);
|
||||
return saveDialog.Update();
|
||||
}
|
||||
|
||||
#define PSP_AV_MODULE_AVCODEC 0
|
||||
|
@ -99,26 +95,27 @@ void sceUtilityLoadModule(u32 module)
|
|||
__KernelReSchedule("utilityloadmodule");
|
||||
}
|
||||
|
||||
void sceUtilityMsgDialogInitStart(u32 structAddr)
|
||||
int sceUtilityMsgDialogInitStart(u32 structAddr)
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilityMsgDialogInitStart(%i)", structAddr);
|
||||
msgDialog.Init(structAddr);
|
||||
return msgDialog.Init(structAddr);
|
||||
}
|
||||
|
||||
void sceUtilityMsgDialogShutdownStart(u32 unknown)
|
||||
int sceUtilityMsgDialogShutdownStart(u32 unknown)
|
||||
{
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityMsgDialogShutdownStart(%i)", unknown);
|
||||
msgDialog.Shutdown();
|
||||
return msgDialog.Shutdown();
|
||||
}
|
||||
|
||||
void sceUtilityMsgDialogUpdate(int animSpeed)
|
||||
int sceUtilityMsgDialogUpdate(int animSpeed)
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilityMsgDialogUpdate(%i)", animSpeed);
|
||||
msgDialog.Update();
|
||||
return msgDialog.Update();
|
||||
}
|
||||
|
||||
u32 sceUtilityMsgDialogGetStatus()
|
||||
int sceUtilityMsgDialogGetStatus()
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilityMsgDialogGetStatus()");
|
||||
return msgDialog.GetStatus();
|
||||
}
|
||||
|
||||
|
@ -134,14 +131,13 @@ int sceUtilityOskInitStart(u32 oskPtr)
|
|||
int sceUtilityOskShutdownStart()
|
||||
{
|
||||
ERROR_LOG(HLE,"FAKE sceUtilityOskShutdownStart(%i)", PARAM(0));
|
||||
oskDialog.Shutdown();
|
||||
return 0;
|
||||
return oskDialog.Shutdown();
|
||||
}
|
||||
|
||||
void sceUtilityOskUpdate(unsigned int unknown)
|
||||
int sceUtilityOskUpdate(unsigned int unknown)
|
||||
{
|
||||
ERROR_LOG(HLE,"FAKE sceUtilityOskUpdate(%i)", unknown);
|
||||
oskDialog.Update();
|
||||
return oskDialog.Update();
|
||||
}
|
||||
|
||||
int sceUtilityOskGetStatus()
|
||||
|
@ -156,25 +152,25 @@ int sceUtilityOskGetStatus()
|
|||
}
|
||||
|
||||
|
||||
void sceUtilityNetconfInitStart(unsigned int unknown)
|
||||
int sceUtilityNetconfInitStart(u32 structAddr)
|
||||
{
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityNetconfInitStart(%i)", unknown);
|
||||
netDialog.Init();
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityNetconfInitStart(%08x)", structAddr);
|
||||
return netDialog.Init();
|
||||
}
|
||||
|
||||
void sceUtilityNetconfShutdownStart(unsigned int unknown)
|
||||
int sceUtilityNetconfShutdownStart(unsigned int unknown)
|
||||
{
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityNetconfShutdownStart(%i)", unknown);
|
||||
netDialog.Shutdown();
|
||||
return netDialog.Shutdown();
|
||||
}
|
||||
|
||||
void sceUtilityNetconfUpdate(int unknown)
|
||||
int sceUtilityNetconfUpdate(int animSpeed)
|
||||
{
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityNetconfUpdate(%i)", unknown);
|
||||
netDialog.Update();
|
||||
DEBUG_LOG(HLE,"FAKE sceUtilityNetconfUpdate(%i)", animSpeed);
|
||||
return netDialog.Update();
|
||||
}
|
||||
|
||||
unsigned int sceUtilityNetconfGetStatus()
|
||||
int sceUtilityNetconfGetStatus()
|
||||
{
|
||||
DEBUG_LOG(HLE,"sceUtilityNetconfGetStatus()");
|
||||
return netDialog.GetStatus();
|
||||
|
@ -356,28 +352,28 @@ const HLEFunction sceUtility[] =
|
|||
{0x64d50c56, &WrapU_U<sceUtilityUnloadNetModule>, "sceUtilityUnloadNetModule"},
|
||||
|
||||
|
||||
{0xf88155f6, &WrapV_U<sceUtilityNetconfShutdownStart>, "sceUtilityNetconfShutdownStart"},
|
||||
{0x4db1e739, &WrapV_U<sceUtilityNetconfInitStart>, "sceUtilityNetconfInitStart"},
|
||||
{0x91e70e35, &WrapV_I<sceUtilityNetconfUpdate>, "sceUtilityNetconfUpdate"},
|
||||
{0x6332aa39, &WrapU_V<sceUtilityNetconfGetStatus>, "sceUtilityNetconfGetStatus"},
|
||||
{0xf88155f6, &WrapI_U<sceUtilityNetconfShutdownStart>, "sceUtilityNetconfShutdownStart"},
|
||||
{0x4db1e739, &WrapI_U<sceUtilityNetconfInitStart>, "sceUtilityNetconfInitStart"},
|
||||
{0x91e70e35, &WrapI_I<sceUtilityNetconfUpdate>, "sceUtilityNetconfUpdate"},
|
||||
{0x6332aa39, &WrapI_V<sceUtilityNetconfGetStatus>, "sceUtilityNetconfGetStatus"},
|
||||
{0x5eee6548, 0, "sceUtilityCheckNetParam"},
|
||||
{0x434d4b3a, 0, "sceUtilityGetNetParam"},
|
||||
{0x4FED24D8, 0, "sceUtilityGetNetParamLatestID"},
|
||||
|
||||
{0x67af3428, &WrapV_U<sceUtilityMsgDialogShutdownStart>, "sceUtilityMsgDialogShutdownStart"},
|
||||
{0x2ad8e239, &WrapV_U<sceUtilityMsgDialogInitStart>, "sceUtilityMsgDialogInitStart"},
|
||||
{0x95fc253b, &WrapV_I<sceUtilityMsgDialogUpdate>, "sceUtilityMsgDialogUpdate"},
|
||||
{0x9a1c91d7, &WrapU_V<sceUtilityMsgDialogGetStatus>, "sceUtilityMsgDialogGetStatus"},
|
||||
{0x67af3428, &WrapI_U<sceUtilityMsgDialogShutdownStart>, "sceUtilityMsgDialogShutdownStart"},
|
||||
{0x2ad8e239, &WrapI_U<sceUtilityMsgDialogInitStart>, "sceUtilityMsgDialogInitStart"},
|
||||
{0x95fc253b, &WrapI_I<sceUtilityMsgDialogUpdate>, "sceUtilityMsgDialogUpdate"},
|
||||
{0x9a1c91d7, &WrapI_V<sceUtilityMsgDialogGetStatus>, "sceUtilityMsgDialogGetStatus"},
|
||||
{0x4928bd96, 0, "sceUtilityMsgDialogAbort"},
|
||||
|
||||
{0x9790b33c, &WrapI_V<sceUtilitySavedataShutdownStart>, "sceUtilitySavedataShutdownStart"},
|
||||
{0x50c4cd57, &WrapI_U<sceUtilitySavedataInitStart>, "sceUtilitySavedataInitStart"},
|
||||
{0xd4b95ffb, &WrapV_U<sceUtilitySavedataUpdate>, "sceUtilitySavedataUpdate"},
|
||||
{0xd4b95ffb, &WrapI_I<sceUtilitySavedataUpdate>, "sceUtilitySavedataUpdate"},
|
||||
{0x8874dbe0, &WrapI_V<sceUtilitySavedataGetStatus>, "sceUtilitySavedataGetStatus"},
|
||||
|
||||
{0x3dfaeba9, &WrapI_V<sceUtilityOskShutdownStart>, "sceUtilityOskShutdownStart"},
|
||||
{0xf6269b82, &WrapI_U<sceUtilityOskInitStart>, "sceUtilityOskInitStart"},
|
||||
{0x4b85c861, &WrapV_U<sceUtilityOskUpdate>, "sceUtilityOskUpdate"},
|
||||
{0x4b85c861, &WrapI_U<sceUtilityOskUpdate>, "sceUtilityOskUpdate"},
|
||||
{0xf3f76017, &WrapI_V<sceUtilityOskGetStatus>, "sceUtilityOskGetStatus"},
|
||||
|
||||
{0x41e30674, &WrapU_UU<sceUtilitySetSystemParamString>, "sceUtilitySetSystemParamString"},
|
||||
|
|
Loading…
Add table
Reference in a new issue