2014-03-28 20:06:15 +01:00
# include "stdafx.h"
2014-06-02 19:27:24 +02:00
# include "Emu/Memory/Memory.h"
# include "Emu/System.h"
# include "Emu/SysCalls/Modules.h"
2014-09-11 21:18:19 +02:00
# include "Emu/SysCalls/Callback.h"
2014-08-23 22:40:04 +02:00
2014-08-26 01:55:37 +02:00
# include "Emu/FS/VFS.h"
2014-06-02 19:27:24 +02:00
# include "Emu/FS/vfsFile.h"
# include "Emu/FS/vfsDir.h"
2014-03-28 20:06:15 +01:00
# include "Loader/PSF.h"
2014-09-04 19:32:20 +02:00
# include "cellSaveData.h"
2014-03-28 20:06:15 +01:00
2014-05-02 08:30:32 +02:00
extern Module * cellSysutil ;
2014-03-28 20:06:15 +01:00
// Auxiliary Classes
class sortSaveDataEntry
{
u32 sortType ;
u32 sortOrder ;
public :
sortSaveDataEntry ( u32 type , u32 order ) : sortType ( type ) , sortOrder ( order ) { }
2014-04-09 18:23:14 +02:00
bool operator ( ) ( const SaveDataEntry & entry1 , const SaveDataEntry & entry2 ) const
2014-03-28 20:06:15 +01:00
{
if ( sortOrder = = CELL_SAVEDATA_SORTORDER_DESCENT )
{
if ( sortType = = CELL_SAVEDATA_SORTTYPE_MODIFIEDTIME )
2014-03-31 12:04:34 +02:00
return entry1 . st_mtime_ > = entry2 . st_mtime_ ;
if ( sortType = = CELL_SAVEDATA_SORTTYPE_SUBTITLE )
2014-03-28 20:06:15 +01:00
return entry1 . subtitle > = entry2 . subtitle ;
}
2014-03-31 12:04:34 +02:00
if ( sortOrder = = CELL_SAVEDATA_SORTORDER_ASCENT )
2014-03-28 20:06:15 +01:00
{
if ( sortType = = CELL_SAVEDATA_SORTTYPE_MODIFIEDTIME )
2014-03-31 12:04:34 +02:00
return entry1 . st_mtime_ < entry2 . st_mtime_ ;
if ( sortType = = CELL_SAVEDATA_SORTTYPE_SUBTITLE )
2014-03-28 20:06:15 +01:00
return entry1 . subtitle < entry2 . subtitle ;
}
2014-03-31 12:04:34 +02:00
return true ;
2014-03-28 20:06:15 +01:00
}
} ;
// Auxiliary Functions
u64 getSaveDataSize ( const std : : string & dirName )
{
vfsDir dir ( dirName ) ;
if ( ! dir . IsOpened ( ) )
return 0 ;
u64 totalSize = 0 ;
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) ) {
if ( entry - > flags & DirEntry_TypeFile ) {
vfsFile file ( dirName + " / " + entry - > name ) ;
totalSize + = file . GetSize ( ) ;
}
}
return totalSize ;
}
2014-04-09 18:23:14 +02:00
void addSaveDataEntry ( std : : vector < SaveDataEntry > & saveEntries , const std : : string & saveDir )
2014-03-28 20:06:15 +01:00
{
// PSF parameters
vfsFile f ( saveDir + " /PARAM.SFO " ) ;
PSFLoader psf ( f ) ;
if ( ! psf . Load ( false ) )
return ;
// PNG icon
2014-04-01 02:33:55 +02:00
std : : string localPath ;
2014-03-28 20:06:15 +01:00
Emu . GetVFS ( ) . GetDevice ( saveDir + " /ICON0.PNG " , localPath ) ;
2014-04-09 18:23:14 +02:00
SaveDataEntry saveEntry ;
2014-03-28 20:06:15 +01:00
saveEntry . dirName = psf . GetString ( " SAVEDATA_DIRECTORY " ) ;
saveEntry . listParam = psf . GetString ( " SAVEDATA_LIST_PARAM " ) ;
saveEntry . title = psf . GetString ( " TITLE " ) ;
saveEntry . subtitle = psf . GetString ( " SUB_TITLE " ) ;
saveEntry . details = psf . GetString ( " DETAIL " ) ;
2014-08-30 22:41:01 +02:00
saveEntry . sizeKB = ( u32 ) ( getSaveDataSize ( saveDir ) / 1024 ) ;
2014-03-31 12:04:34 +02:00
saveEntry . st_atime_ = 0 ; // TODO
saveEntry . st_mtime_ = 0 ; // TODO
saveEntry . st_ctime_ = 0 ; // TODO
2014-04-09 18:23:14 +02:00
saveEntry . iconBuf = NULL ; // TODO: Here should be the PNG buffer
saveEntry . iconBufSize = 0 ; // TODO: Size of the PNG file
2014-03-31 12:04:34 +02:00
saveEntry . isNew = false ;
2014-03-28 20:06:15 +01:00
saveEntries . push_back ( saveEntry ) ;
}
2014-09-02 03:05:13 +02:00
void addNewSaveDataEntry ( std : : vector < SaveDataEntry > & saveEntries , vm : : ptr < CellSaveDataListNewData > newData )
2014-03-31 12:04:34 +02:00
{
2014-04-09 18:23:14 +02:00
SaveDataEntry saveEntry ;
2014-09-04 19:32:20 +02:00
saveEntry . dirName = newData - > dirName . get_ptr ( ) ;
saveEntry . title = newData - > icon - > title . get_ptr ( ) ;
saveEntry . subtitle = newData - > icon - > title . get_ptr ( ) ;
saveEntry . iconBuf = newData - > icon - > iconBuf . get_ptr ( ) ;
2014-03-31 12:04:34 +02:00
saveEntry . iconBufSize = newData - > icon - > iconBufSize ;
saveEntry . isNew = true ;
// TODO: Add information stored in newData->iconPosition. (It's not very relevant)
saveEntries . push_back ( saveEntry ) ;
}
2014-04-09 18:23:14 +02:00
u32 focusSaveDataEntry ( const std : : vector < SaveDataEntry > & saveEntries , u32 focusPosition )
2014-03-31 12:04:34 +02:00
{
2014-03-31 20:30:07 +02:00
// TODO: Get the correct index. Right now, this returns the first element of the list.
2014-03-31 12:04:34 +02:00
return 0 ;
}
2014-09-02 03:05:13 +02:00
void setSaveDataList ( std : : vector < SaveDataEntry > & saveEntries , vm : : ptr < CellSaveDataDirList > fixedList , u32 fixedListNum )
2014-03-31 12:04:34 +02:00
{
2014-04-09 18:23:14 +02:00
std : : vector < SaveDataEntry > : : iterator entry = saveEntries . begin ( ) ;
2014-03-31 12:04:34 +02:00
while ( entry ! = saveEntries . end ( ) )
{
bool found = false ;
for ( u32 j = 0 ; j < fixedListNum ; j + + )
{
if ( entry - > dirName = = ( char * ) fixedList [ j ] . dirName )
{
found = true ;
break ;
}
}
if ( ! found )
entry = saveEntries . erase ( entry ) ;
else
entry + + ;
}
}
2014-09-02 03:05:13 +02:00
void setSaveDataFixed ( std : : vector < SaveDataEntry > & saveEntries , vm : : ptr < CellSaveDataFixedSet > fixedSet )
2014-04-09 18:23:14 +02:00
{
std : : vector < SaveDataEntry > : : iterator entry = saveEntries . begin ( ) ;
while ( entry ! = saveEntries . end ( ) )
{
2014-09-04 19:32:20 +02:00
if ( entry - > dirName = = fixedSet - > dirName . get_ptr ( ) )
2014-04-09 18:23:14 +02:00
entry = saveEntries . erase ( entry ) ;
else
entry + + ;
}
if ( saveEntries . size ( ) = = 0 )
{
SaveDataEntry entry ;
2014-09-04 19:32:20 +02:00
entry . dirName = fixedSet - > dirName . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
entry . isNew = true ;
saveEntries . push_back ( entry ) ;
}
2014-09-02 00:22:13 +02:00
if ( fixedSet - > newIcon )
2014-04-09 18:23:14 +02:00
{
2014-09-04 19:32:20 +02:00
saveEntries [ 0 ] . iconBuf = fixedSet - > newIcon - > iconBuf . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
saveEntries [ 0 ] . iconBufSize = fixedSet - > newIcon - > iconBufSize ;
2014-09-04 19:32:20 +02:00
saveEntries [ 0 ] . title = fixedSet - > newIcon - > title . get_ptr ( ) ;
saveEntries [ 0 ] . subtitle = fixedSet - > newIcon - > title . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
}
}
2014-09-02 03:05:13 +02:00
void getSaveDataStat ( SaveDataEntry entry , vm : : ptr < CellSaveDataStatGet > statGet )
2014-03-31 20:30:07 +02:00
{
if ( entry . isNew )
statGet - > isNewData = CELL_SAVEDATA_ISNEWDATA_YES ;
else
statGet - > isNewData = CELL_SAVEDATA_ISNEWDATA_NO ;
statGet - > bind = 0 ; // TODO ?
statGet - > sizeKB = entry . sizeKB ;
statGet - > hddFreeSizeKB = 40000000 ; // 40 GB. TODO ?
statGet - > sysSizeKB = 0 ; // TODO: This is the size of PARAM.SFO + PARAM.PDF
statGet - > dir . st_atime_ = 0 ; // TODO ?
statGet - > dir . st_mtime_ = 0 ; // TODO ?
statGet - > dir . st_ctime_ = 0 ; // TODO ?
2014-09-04 19:32:20 +02:00
strcpy_trunc ( statGet - > dir . dirName , entry . dirName ) ;
2014-03-31 20:30:07 +02:00
statGet - > getParam . attribute = 0 ; // TODO ?
2014-09-04 19:32:20 +02:00
strcpy_trunc ( statGet - > getParam . title , entry . title ) ;
strcpy_trunc ( statGet - > getParam . subTitle , entry . subtitle ) ;
strcpy_trunc ( statGet - > getParam . detail , entry . details ) ;
strcpy_trunc ( statGet - > getParam . listParam , entry . listParam ) ;
2014-03-31 20:30:07 +02:00
statGet - > fileNum = 0 ;
2014-10-01 15:18:38 +02:00
statGet - > fileList . set ( be_t < u32 > : : make ( 0 ) ) ;
2014-03-31 20:30:07 +02:00
statGet - > fileListNum = 0 ;
std : : string saveDir = " /dev_hdd0/home/00000001/savedata/ " + entry . dirName ; // TODO: Get the path of the current user
vfsDir dir ( saveDir ) ;
if ( ! dir . IsOpened ( ) )
return ;
std : : vector < CellSaveDataFileStat > fileEntries ;
for ( const DirEntryInfo * dirEntry = dir . Read ( ) ; dirEntry ; dirEntry = dir . Read ( ) ) {
if ( dirEntry - > flags & DirEntry_TypeFile ) {
if ( dirEntry - > name = = " PARAM.SFO " | | dirEntry - > name = = " PARAM.PFD " )
continue ;
statGet - > fileNum + + ;
statGet - > fileListNum + + ;
CellSaveDataFileStat fileEntry ;
vfsFile file ( saveDir + " / " + dirEntry - > name ) ;
if ( dirEntry - > name = = " ICON0.PNG " ) fileEntry . fileType = CELL_SAVEDATA_FILETYPE_CONTENT_ICON0 ;
if ( dirEntry - > name = = " ICON1.PAM " ) fileEntry . fileType = CELL_SAVEDATA_FILETYPE_CONTENT_ICON1 ;
if ( dirEntry - > name = = " PIC1.PNG " ) fileEntry . fileType = CELL_SAVEDATA_FILETYPE_CONTENT_PIC1 ;
if ( dirEntry - > name = = " SND0.AT3 " ) fileEntry . fileType = CELL_SAVEDATA_FILETYPE_CONTENT_SND0 ;
fileEntry . st_size = file . GetSize ( ) ;
fileEntry . st_atime_ = 0 ; // TODO ?
fileEntry . st_mtime_ = 0 ; // TODO ?
fileEntry . st_ctime_ = 0 ; // TODO ?
2014-09-04 19:32:20 +02:00
strcpy_trunc ( fileEntry . fileName , dirEntry - > name ) ;
2014-03-31 20:30:07 +02:00
fileEntries . push_back ( fileEntry ) ;
}
}
2014-09-20 01:16:11 +02:00
statGet - > fileList = vm : : bptr < CellSaveDataFileStat > : : make ( be_t < u32 > : : make ( ( u32 ) Memory . Alloc ( sizeof ( CellSaveDataFileStat ) * ( u32 ) fileEntries . size ( ) , sizeof ( CellSaveDataFileStat ) ) ) ) ;
2014-03-31 20:30:07 +02:00
for ( u32 i = 0 ; i < fileEntries . size ( ) ; i + + )
memcpy ( & statGet - > fileList [ i ] , & fileEntries [ i ] , sizeof ( CellSaveDataFileStat ) ) ;
}
2014-09-01 14:47:26 +02:00
s32 modifySaveDataFiles ( vm : : ptr < CellSaveDataFileCallback > funcFile , vm : : ptr < CellSaveDataCBResult > result , const std : : string & saveDataDir )
2014-03-31 20:30:07 +02:00
{
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataFileGet > fileGet ;
vm : : var < CellSaveDataFileSet > fileSet ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
if ( ! Emu . GetVFS ( ) . ExistsDir ( saveDataDir ) )
Emu . GetVFS ( ) . CreateDir ( saveDataDir ) ;
fileGet - > excSize = 0 ;
while ( true )
2014-04-09 18:23:14 +02:00
{
2014-09-01 14:47:26 +02:00
funcFile ( result , fileGet , fileSet ) ;
2014-04-19 18:50:06 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " modifySaveDataFiles: CellSaveDataFileCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-04-19 18:50:06 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
if ( result - > result = = CELL_SAVEDATA_CBRESULT_OK_LAST ) {
break ;
}
std : : string filepath = saveDataDir + ' / ' ;
vfsStream * file = NULL ;
2014-09-04 19:32:20 +02:00
void * buf = fileSet - > fileBuf . get_ptr ( ) ;
2014-04-19 18:50:06 +02:00
2014-04-25 18:57:00 +02:00
switch ( ( u32 ) fileSet - > fileType )
2014-04-19 18:50:06 +02:00
{
2014-09-04 19:32:20 +02:00
case CELL_SAVEDATA_FILETYPE_SECUREFILE : filepath + = fileSet - > fileName . get_ptr ( ) ; break ;
case CELL_SAVEDATA_FILETYPE_NORMALFILE : filepath + = fileSet - > fileName . get_ptr ( ) ; break ;
2014-04-19 18:50:06 +02:00
case CELL_SAVEDATA_FILETYPE_CONTENT_ICON0 : filepath + = " ICON0.PNG " ; break ;
case CELL_SAVEDATA_FILETYPE_CONTENT_ICON1 : filepath + = " ICON1.PAM " ; break ;
case CELL_SAVEDATA_FILETYPE_CONTENT_PIC1 : filepath + = " PIC1.PNG " ; break ;
case CELL_SAVEDATA_FILETYPE_CONTENT_SND0 : filepath + = " SND0.AT3 " ; break ;
default :
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " modifySaveDataFiles: Unknown fileType! Aborting... " ) ;
2014-04-19 18:50:06 +02:00
return CELL_SAVEDATA_ERROR_PARAM ;
}
2014-04-25 18:57:00 +02:00
switch ( ( u32 ) fileSet - > fileOperation )
2014-04-19 18:50:06 +02:00
{
case CELL_SAVEDATA_FILEOP_READ :
file = Emu . GetVFS ( ) . OpenFile ( filepath , vfsRead ) ;
2014-08-30 22:41:01 +02:00
fileGet - > excSize = ( u32 ) file - > Read ( buf , ( u32 ) std : : min ( fileSet - > fileSize , fileSet - > fileBufSize ) ) ; // TODO: This may fail for big files because of the dest pointer.
2014-04-19 18:50:06 +02:00
break ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
case CELL_SAVEDATA_FILEOP_WRITE :
Emu . GetVFS ( ) . CreateFile ( filepath ) ;
file = Emu . GetVFS ( ) . OpenFile ( filepath , vfsWrite ) ;
2014-08-30 22:41:01 +02:00
fileGet - > excSize = ( u32 ) file - > Write ( buf , ( u32 ) std : : min ( fileSet - > fileSize , fileSet - > fileBufSize ) ) ; // TODO: This may fail for big files because of the dest pointer.
2014-04-19 18:50:06 +02:00
break ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
case CELL_SAVEDATA_FILEOP_DELETE :
Emu . GetVFS ( ) . RemoveFile ( filepath ) ;
fileGet - > excSize = 0 ;
break ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
case CELL_SAVEDATA_FILEOP_WRITE_NOTRUNC :
2014-08-23 22:40:04 +02:00
cellSysutil - > Warning ( " modifySaveDataFiles: File operation CELL_SAVEDATA_FILEOP_WRITE_NOTRUNC not yet implemented " ) ;
2014-04-19 18:50:06 +02:00
break ;
2014-03-31 20:30:07 +02:00
2014-04-19 18:50:06 +02:00
default :
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " modifySaveDataFiles: Unknown fileOperation! Aborting... " ) ;
2014-04-19 18:50:06 +02:00
return CELL_SAVEDATA_ERROR_PARAM ;
}
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
if ( file & & file - > IsOpened ( ) )
file - > Close ( ) ;
}
return CELL_SAVEDATA_RET_OK ;
2014-03-31 20:30:07 +02:00
}
2014-03-28 20:06:15 +01:00
// Functions
2014-09-02 03:05:13 +02:00
int cellSaveDataListSave2 ( u32 version , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataListCallback > funcList , vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataListSave2(version=%d, setList_addr=0x%x, setBuf_addr=0x%x, funcList_addr=0x%x, funcStat_addr=0x%x, funcFile_addr=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , setList . addr ( ) , setBuf . addr ( ) , funcList . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-03-28 20:06:15 +01:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataListGet > listGet ;
vm : : var < CellSaveDataListSet > listSet ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-03-28 20:06:15 +01:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirNamePrefix = setList - > dirNamePrefix . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
std : : vector < SaveDataEntry > saveEntries ;
2014-08-22 21:34:43 +02:00
2014-03-28 20:06:15 +01:00
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
2014-04-09 18:23:14 +02:00
if ( entry - > flags & DirEntry_TypeDir & & entry - > name . substr ( 0 , dirNamePrefix . size ( ) ) = = dirNamePrefix )
2014-03-28 20:06:15 +01:00
{
// Count the amount of matches and the amount of listed directories
listGet - > dirListNum + + ;
if ( listGet - > dirListNum > setBuf - > dirListMax )
continue ;
listGet - > dirNum + + ;
2014-04-01 02:33:55 +02:00
std : : string saveDir = saveBaseDir + entry - > name ;
2014-03-31 12:04:34 +02:00
addSaveDataEntry ( saveEntries , saveDir ) ;
2014-03-28 20:06:15 +01:00
}
}
// Sort the entries and fill the listGet->dirList array
std : : sort ( saveEntries . begin ( ) , saveEntries . end ( ) , sortSaveDataEntry ( setList - > sortType , setList - > sortOrder ) ) ;
2014-09-04 19:32:20 +02:00
listGet - > dirList = vm : : bptr < CellSaveDataDirList > : : make ( setBuf - > buf . addr ( ) ) ;
2014-09-05 19:23:00 +02:00
auto dirList = vm : : get_ptr < CellSaveDataDirList > ( listGet - > dirList . addr ( ) ) ;
2014-08-22 21:34:43 +02:00
2014-03-28 20:06:15 +01:00
for ( u32 i = 0 ; i < saveEntries . size ( ) ; i + + ) {
2014-09-04 19:32:20 +02:00
strcpy_trunc ( dirList [ i ] . dirName , saveEntries [ i ] . dirName ) ;
strcpy_trunc ( dirList [ i ] . listParam , saveEntries [ i ] . listParam ) ;
* dirList [ i ] . reserved = { } ;
2014-03-28 20:06:15 +01:00
}
2014-09-01 14:47:26 +02:00
funcList ( result , listGet , listSet ) ;
2014-08-22 21:34:43 +02:00
2014-03-31 20:30:07 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataListSave2: CellSaveDataListCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-03-31 20:30:07 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:14:24 +02:00
setSaveDataList ( saveEntries , vm : : ptr < CellSaveDataDirList > : : make ( listSet - > fixedList . addr ( ) ) , listSet - > fixedListNum ) ;
2014-09-02 00:22:13 +02:00
if ( listSet - > newData )
2014-09-02 03:14:24 +02:00
addNewSaveDataEntry ( saveEntries , vm : : ptr < CellSaveDataListNewData > : : make ( listSet - > newData . addr ( ) ) ) ;
2014-03-31 20:30:07 +02:00
if ( saveEntries . size ( ) = = 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Warning ( " cellSaveDataListSave2: No save entries found! " ) ; // TODO: Find a better way to handle this error
2014-03-31 20:30:07 +02:00
return CELL_SAVEDATA_RET_OK ;
}
2014-03-28 20:06:15 +01:00
2014-03-31 20:30:07 +02:00
u32 focusIndex = focusSaveDataEntry ( saveEntries , listSet - > focusPosition ) ;
// TODO: Display the dialog here
u32 selectedIndex = focusIndex ; // TODO: Until the dialog is implemented, select always the focused entry
2014-09-02 03:05:13 +02:00
getSaveDataStat ( saveEntries [ selectedIndex ] , statGet ) ;
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-03-31 20:30:07 +02:00
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-03-31 20:30:07 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataListLoad2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-03-31 20:30:07 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-08-22 21:34:43 +02:00
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
addNewSaveDataEntry ( saveEntries , ( u32 ) listSet - > newData . addr ( ) ) ; // TODO: This *is* wrong
2014-04-09 18:23:14 +02:00
*/
2014-03-28 20:06:15 +01:00
2014-04-19 18:50:06 +02:00
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-03-28 20:06:15 +01:00
2014-04-19 18:50:06 +02:00
return ret ;
2014-03-28 20:06:15 +01:00
}
2014-09-02 03:05:13 +02:00
int cellSaveDataListLoad2 ( u32 version , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataListCallback > funcList , vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataListLoad2(version=%d, setList_addr=0x%x, setBuf_addr=0x%x, funcList_addr=0x%x, funcStat_addr=0x%x, funcFile_addr=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , setList . addr ( ) , setBuf . addr ( ) , funcList . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-03-28 20:06:15 +01:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataListGet > listGet ;
vm : : var < CellSaveDataListSet > listSet ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-03-28 20:06:15 +01:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
2014-08-22 21:34:43 +02:00
2014-03-28 20:06:15 +01:00
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirNamePrefix = setList - > dirNamePrefix . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
std : : vector < SaveDataEntry > saveEntries ;
2014-08-22 21:34:43 +02:00
2014-03-28 20:06:15 +01:00
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
2014-04-09 18:23:14 +02:00
if ( entry - > flags & DirEntry_TypeDir & & entry - > name . substr ( 0 , dirNamePrefix . size ( ) ) = = dirNamePrefix )
2014-03-28 20:06:15 +01:00
{
// Count the amount of matches and the amount of listed directories
listGet - > dirListNum + + ;
if ( listGet - > dirListNum > setBuf - > dirListMax )
continue ;
listGet - > dirNum + + ;
2014-04-01 02:33:55 +02:00
std : : string saveDir = saveBaseDir + entry - > name ;
2014-03-31 12:04:34 +02:00
addSaveDataEntry ( saveEntries , saveDir ) ;
2014-03-28 20:06:15 +01:00
}
}
// Sort the entries and fill the listGet->dirList array
std : : sort ( saveEntries . begin ( ) , saveEntries . end ( ) , sortSaveDataEntry ( setList - > sortType , setList - > sortOrder ) ) ;
2014-09-04 19:32:20 +02:00
listGet - > dirList = vm : : bptr < CellSaveDataDirList > : : make ( setBuf - > buf . addr ( ) ) ;
2014-09-05 19:23:00 +02:00
auto dirList = vm : : get_ptr < CellSaveDataDirList > ( listGet - > dirList . addr ( ) ) ;
2014-08-22 21:34:43 +02:00
2014-03-28 20:06:15 +01:00
for ( u32 i = 0 ; i < saveEntries . size ( ) ; i + + ) {
2014-09-04 19:32:20 +02:00
strcpy_trunc ( dirList [ i ] . dirName , saveEntries [ i ] . dirName ) ;
strcpy_trunc ( dirList [ i ] . listParam , saveEntries [ i ] . listParam ) ;
* dirList [ i ] . reserved = { } ;
2014-03-28 20:06:15 +01:00
}
2014-09-01 14:47:26 +02:00
funcList ( result , listGet , listSet ) ;
2014-08-22 21:34:43 +02:00
2014-03-31 12:04:34 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataListLoad2: CellSaveDataListCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-03-31 12:04:34 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-03-28 20:06:15 +01:00
2014-09-02 03:14:24 +02:00
setSaveDataList ( saveEntries , vm : : ptr < CellSaveDataDirList > : : make ( listSet - > fixedList . addr ( ) ) , listSet - > fixedListNum ) ;
2014-09-02 00:22:13 +02:00
if ( listSet - > newData )
2014-09-02 03:14:24 +02:00
addNewSaveDataEntry ( saveEntries , vm : : ptr < CellSaveDataListNewData > : : make ( listSet - > newData . addr ( ) ) ) ;
2014-03-31 20:30:07 +02:00
if ( saveEntries . size ( ) = = 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Warning ( " cellSaveDataListLoad2: No save entries found! " ) ; // TODO: Find a better way to handle this error
2014-03-31 20:30:07 +02:00
return CELL_SAVEDATA_RET_OK ;
}
2014-03-31 12:04:34 +02:00
2014-03-31 20:30:07 +02:00
u32 focusIndex = focusSaveDataEntry ( saveEntries , listSet - > focusPosition ) ;
2014-03-31 12:04:34 +02:00
// TODO: Display the dialog here
2014-03-31 20:30:07 +02:00
u32 selectedIndex = focusIndex ; // TODO: Until the dialog is implemented, select always the focused entry
2014-09-02 03:05:13 +02:00
getSaveDataStat ( saveEntries [ selectedIndex ] , statGet ) ;
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-03-31 12:04:34 +02:00
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-03-31 20:30:07 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataListLoad2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-03-31 20:30:07 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-08-22 21:34:43 +02:00
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
2014-04-09 18:23:14 +02:00
// TODO: Write PARAM.SFO file
*/
2014-03-28 20:06:15 +01:00
2014-04-19 18:50:06 +02:00
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-03-28 20:06:15 +01:00
2014-04-19 18:50:06 +02:00
return ret ;
2014-03-28 20:06:15 +01:00
}
2014-09-02 03:05:13 +02:00
int cellSaveDataFixedSave2 ( u32 version , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataFixedCallback > funcFixed , vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataFixedSave2(version=%d, setList_addr=0x%x, setBuf_addr=0x%x, funcFixed_addr=0x%x, funcStat_addr=0x%x, funcFile_addr=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataListGet > listGet ;
vm : : var < CellSaveDataFixedSet > fixedSet ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-04-09 18:23:14 +02:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirNamePrefix = setList - > dirNamePrefix . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
std : : vector < SaveDataEntry > saveEntries ;
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
if ( entry - > flags & DirEntry_TypeDir & & entry - > name . substr ( 0 , dirNamePrefix . size ( ) ) = = dirNamePrefix )
{
// Count the amount of matches and the amount of listed directories
listGet - > dirListNum + + ;
if ( listGet - > dirListNum > setBuf - > dirListMax )
continue ;
listGet - > dirNum + + ;
std : : string saveDir = saveBaseDir + entry - > name ;
addSaveDataEntry ( saveEntries , saveDir ) ;
}
}
// Sort the entries and fill the listGet->dirList array
std : : sort ( saveEntries . begin ( ) , saveEntries . end ( ) , sortSaveDataEntry ( setList - > sortType , setList - > sortOrder ) ) ;
2014-09-04 19:32:20 +02:00
listGet - > dirList = vm : : bptr < CellSaveDataDirList > : : make ( setBuf - > buf . addr ( ) ) ;
2014-09-05 19:23:00 +02:00
auto dirList = vm : : get_ptr < CellSaveDataDirList > ( listGet - > dirList . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
for ( u32 i = 0 ; i < saveEntries . size ( ) ; i + + ) {
2014-09-04 19:32:20 +02:00
strcpy_trunc ( dirList [ i ] . dirName , saveEntries [ i ] . dirName ) ;
strcpy_trunc ( dirList [ i ] . listParam , saveEntries [ i ] . listParam ) ;
* dirList [ i ] . reserved = { } ;
2014-04-09 18:23:14 +02:00
}
2014-09-01 14:47:26 +02:00
funcFixed ( result , listGet , fixedSet ) ;
2014-04-09 18:23:14 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataFixedSave2: CellSaveDataFixedCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-04-09 18:23:14 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
setSaveDataFixed ( saveEntries , fixedSet ) ;
getSaveDataStat ( saveEntries [ 0 ] , statGet ) ; // There should be only one element in this list
2014-04-09 18:23:14 +02:00
// TODO: Display the Yes|No dialog here
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-04-09 18:23:14 +02:00
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataFixedSave2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-04-09 18:23:14 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
2014-04-09 18:23:14 +02:00
// TODO: Write PARAM.SFO file
*/
2014-04-19 18:50:06 +02:00
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
return ret ;
2014-03-28 20:06:15 +01:00
}
2014-09-02 03:05:13 +02:00
int cellSaveDataFixedLoad2 ( u32 version , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataFixedCallback > funcFixed , vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataFixedLoad2(version=%d, setList_addr=0x%x, setBuf=0x%x, funcList=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataListGet > listGet ;
vm : : var < CellSaveDataFixedSet > fixedSet ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-04-09 18:23:14 +02:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirNamePrefix = setList - > dirNamePrefix . get_ptr ( ) ;
2014-04-09 18:23:14 +02:00
std : : vector < SaveDataEntry > saveEntries ;
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
if ( entry - > flags & DirEntry_TypeDir & & entry - > name . substr ( 0 , dirNamePrefix . size ( ) ) = = dirNamePrefix )
{
// Count the amount of matches and the amount of listed directories
listGet - > dirListNum + + ;
if ( listGet - > dirListNum > setBuf - > dirListMax )
continue ;
listGet - > dirNum + + ;
std : : string saveDir = saveBaseDir + entry - > name ;
addSaveDataEntry ( saveEntries , saveDir ) ;
}
}
// Sort the entries and fill the listGet->dirList array
std : : sort ( saveEntries . begin ( ) , saveEntries . end ( ) , sortSaveDataEntry ( setList - > sortType , setList - > sortOrder ) ) ;
2014-09-04 19:32:20 +02:00
listGet - > dirList = vm : : bptr < CellSaveDataDirList > : : make ( setBuf - > buf . addr ( ) ) ;
2014-09-05 19:23:00 +02:00
auto dirList = vm : : get_ptr < CellSaveDataDirList > ( listGet - > dirList . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
for ( u32 i = 0 ; i < saveEntries . size ( ) ; i + + ) {
2014-09-04 19:32:20 +02:00
strcpy_trunc ( dirList [ i ] . dirName , saveEntries [ i ] . dirName ) ;
strcpy_trunc ( dirList [ i ] . listParam , saveEntries [ i ] . listParam ) ;
* dirList [ i ] . reserved = { } ;
2014-04-09 18:23:14 +02:00
}
2014-09-01 14:47:26 +02:00
funcFixed ( result , listGet , fixedSet ) ;
2014-04-09 18:23:14 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataFixedLoad2: CellSaveDataFixedCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-04-09 18:23:14 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
setSaveDataFixed ( saveEntries , fixedSet ) ;
getSaveDataStat ( saveEntries [ 0 ] , statGet ) ; // There should be only one element in this list
2014-04-09 18:23:14 +02:00
// TODO: Display the Yes|No dialog here
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-04-09 18:23:14 +02:00
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-04-09 18:23:14 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataFixedLoad2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-04-09 18:23:14 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
2014-04-09 18:23:14 +02:00
// TODO: Write PARAM.SFO file
*/
2014-04-19 18:50:06 +02:00
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-04-09 18:23:14 +02:00
2014-04-19 18:50:06 +02:00
return ret ;
2014-03-28 20:06:15 +01:00
}
2014-09-04 19:32:20 +02:00
int cellSaveDataAutoSave2 ( u32 version , vm : : ptr < const char > dirName , u32 errDialog , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataAutoSave2(version=%d, dirName_addr=0x%x, errDialog=%d, setBuf=0x%x, funcList=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , dirName . addr ( ) , errDialog , setBuf . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-05-31 23:37:48 +02:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-05-31 23:37:48 +02:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirN = dirName . get_ptr ( ) ;
2014-05-31 23:37:48 +02:00
std : : vector < SaveDataEntry > saveEntries ;
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
2014-09-04 19:32:20 +02:00
if ( entry - > flags & DirEntry_TypeDir & & entry - > name = = dirN ) {
addSaveDataEntry ( saveEntries , saveBaseDir + dirN ) ;
2014-05-31 23:37:48 +02:00
}
}
// The target entry does not exist
if ( saveEntries . size ( ) = = 0 ) {
SaveDataEntry entry ;
2014-09-04 19:32:20 +02:00
entry . dirName = dirN ;
2014-05-31 23:37:48 +02:00
entry . sizeKB = 0 ;
entry . isNew = true ;
saveEntries . push_back ( entry ) ;
}
2014-09-02 03:05:13 +02:00
getSaveDataStat ( saveEntries [ 0 ] , statGet ) ; // There should be only one element in this list
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-05-31 23:37:48 +02:00
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-05-31 23:37:48 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataAutoSave2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-05-31 23:37:48 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
2014-05-31 23:37:48 +02:00
// TODO: Write PARAM.SFO file
*/
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-05-31 23:37:48 +02:00
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-04 19:32:20 +02:00
int cellSaveDataAutoLoad2 ( u32 version , vm : : ptr < const char > dirName , u32 errDialog , vm : : ptr < CellSaveDataSetBuf > setBuf ,
2014-09-01 14:47:26 +02:00
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile ,
2014-09-04 19:32:20 +02:00
u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-08-22 21:34:43 +02:00
cellSysutil - > Warning ( " cellSaveDataAutoLoad2(version=%d, dirName_addr=0x%x, errDialog=%d, setBuf=0x%x, funcList=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , dirName . addr ( ) , errDialog , setBuf . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-05-31 23:37:48 +02:00
2014-07-31 18:08:02 +02:00
vm : : var < CellSaveDataCBResult > result ;
vm : : var < CellSaveDataStatGet > statGet ;
vm : : var < CellSaveDataStatSet > statSet ;
2014-05-31 23:37:48 +02:00
std : : string saveBaseDir = " /dev_hdd0/home/00000001/savedata/ " ; // TODO: Get the path of the current user
vfsDir dir ( saveBaseDir ) ;
if ( ! dir . IsOpened ( ) )
return CELL_SAVEDATA_ERROR_INTERNAL ;
2014-09-04 19:32:20 +02:00
std : : string dirN = dirName . get_ptr ( ) ;
2014-05-31 23:37:48 +02:00
std : : vector < SaveDataEntry > saveEntries ;
for ( const DirEntryInfo * entry = dir . Read ( ) ; entry ; entry = dir . Read ( ) )
{
2014-09-04 19:32:20 +02:00
if ( entry - > flags & DirEntry_TypeDir & & entry - > name = = dirN ) {
addSaveDataEntry ( saveEntries , saveBaseDir + dirN ) ;
2014-05-31 23:37:48 +02:00
}
}
// The target entry does not exist
if ( saveEntries . size ( ) = = 0 ) {
2014-09-04 19:32:20 +02:00
cellSysutil - > Warning ( " cellSaveDataAutoLoad2: Couldn't find save entry (%s) " , dirN . c_str ( ) ) ;
2014-06-03 22:42:15 +02:00
return CELL_OK ; // TODO: Can anyone check the actual behaviour of a PS3 when saves are not found?
2014-05-31 23:37:48 +02:00
}
2014-09-02 03:05:13 +02:00
getSaveDataStat ( saveEntries [ 0 ] , statGet ) ; // There should be only one element in this list
2014-09-04 19:32:20 +02:00
result - > userdata = userdata ;
2014-09-01 14:47:26 +02:00
funcStat ( result , statGet , statSet ) ;
2014-05-31 23:37:48 +02:00
2014-09-02 00:22:13 +02:00
Memory . Free ( statGet - > fileList . addr ( ) ) ;
2014-05-31 23:37:48 +02:00
if ( result - > result < 0 ) {
2014-08-23 22:40:04 +02:00
cellSysutil - > Error ( " cellSaveDataAutoLoad2: CellSaveDataStatCallback failed. " ) ; // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
2014-05-31 23:37:48 +02:00
return CELL_SAVEDATA_ERROR_CBRESULT ;
}
2014-09-02 03:05:13 +02:00
/*if (statSet->setParam)
2014-05-31 23:37:48 +02:00
// TODO: Write PARAM.SFO file
*/
// Enter the loop where the save files are read/created/deleted.
2014-09-01 14:47:26 +02:00
s32 ret = modifySaveDataFiles ( funcFile , result , saveBaseDir + ( char * ) statGet - > dir . dirName ) ;
2014-05-31 23:37:48 +02:00
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 03:05:13 +02:00
int cellSaveDataListAutoSave ( u32 version , u32 errDialog , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
2014-09-04 19:32:20 +02:00
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-09-06 00:54:42 +02:00
cellSysutil - > Todo ( " cellSaveDataListAutoSave(version=%d, errDialog=%d, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , errDialog , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-08-22 21:34:43 +02:00
2014-09-06 00:54:42 +02:00
//vm::var<CellSaveDataCBResult> result;
//vm::var<CellSaveDataListGet> listGet;
//vm::var<CellSaveDataFixedSet> fixedSet;
//vm::var<CellSaveDataStatGet> statGet;
//vm::var<CellSaveDataStatSet> statSet;
//std::string saveBaseDir = "/dev_hdd0/home/00000001/savedata/"; // TODO: Get the path of the current user
//vfsDir dir(saveBaseDir);
//if (!dir.IsOpened())
// return CELL_SAVEDATA_ERROR_INTERNAL;
//std::string dirNamePrefix = setList->dirNamePrefix.get_ptr();
//std::vector<SaveDataEntry> saveEntries;
//for (const DirEntryInfo* entry = dir.Read(); entry; entry = dir.Read())
//{
// if (entry->flags & DirEntry_TypeDir && entry->name.substr(0, dirNamePrefix.size()) == dirNamePrefix)
// {
// // Count the amount of matches and the amount of listed directories
// listGet->dirListNum++;
// if (listGet->dirListNum > setBuf->dirListMax)
// continue;
// listGet->dirNum++;
// std::string saveDir = saveBaseDir + entry->name;
// addSaveDataEntry(saveEntries, saveDir);
// }
//}
//// Sort the entries and fill the listGet->dirList array
//std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder));
//listGet->dirList = vm::bptr<CellSaveDataDirList>::make(setBuf->buf.addr());
//auto dirList = vm::get_ptr<CellSaveDataDirList>(listGet->dirList.addr());
//for (u32 i = 0; i<saveEntries.size(); i++) {
// strcpy_trunc(dirList[i].dirName, saveEntries[i].dirName.c_str());
// strcpy_trunc(dirList[i].listParam, saveEntries[i].listParam.c_str());
// *dirList[i].reserved = {};
//}
//funcFixed(result, listGet, fixedSet);
//if (result->result < 0) {
// cellSysutil->Error("cellSaveDataListAutoSave: CellSaveDataListCallback failed."); // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
// return CELL_SAVEDATA_ERROR_CBRESULT;
//}
//setSaveDataList(saveEntries, (u32)listSet->fixedList.addr(), listSet->fixedListNum);
//if (listSet->newData)
// addNewSaveDataEntry(saveEntries, (u32)listSet->newData.addr());
//if (saveEntries.size() == 0) {
// cellSysutil->Warning("cellSaveDataListAutoSave: No save entries found!"); // TODO: Find a better way to handle this error
// return CELL_SAVEDATA_RET_OK;
//}
//u32 focusIndex = focusSaveDataEntry(saveEntries, listSet->focusPosition);
//// TODO: Display the dialog here
//u32 selectedIndex = focusIndex; // TODO: Until the dialog is implemented, select always the focused entry
//getSaveDataStat(saveEntries[selectedIndex], statGet.addr());
//result->userdata_addr = userdata_addr;
//funcStat(result, statGet, statSet);
//Memory.Free(statGet->fileList.addr());
//if (result->result < 0) {
// cellSysutil->Error("cellSaveDataListAutoSave: CellSaveDataStatCallback failed."); // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
// return CELL_SAVEDATA_ERROR_CBRESULT;
//}
///*if (statSet->setParam)
//addNewSaveDataEntry(saveEntries, (u32)listSet->newData.addr()); // TODO: This *is* wrong
//*/
//// Enter the loop where the save files are read/created/deleted.
//s32 ret = modifySaveDataFiles(funcFile, result, saveBaseDir + (char*)statGet->dir.dirName);
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 03:05:13 +02:00
int cellSaveDataListAutoLoad ( u32 version , u32 errDialog , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
2014-09-04 19:32:20 +02:00
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , vm : : ptr < void > userdata )
2014-03-28 20:06:15 +01:00
{
2014-09-06 00:54:42 +02:00
cellSysutil - > Todo ( " cellSaveDataListAutoLoad(version=%d, errDialog=%d, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
2014-09-04 19:32:20 +02:00
version , errDialog , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata . addr ( ) ) ;
2014-08-22 21:34:43 +02:00
2014-09-06 00:54:42 +02:00
//vm::var<CellSaveDataCBResult> result;
//vm::var<CellSaveDataListGet> listGet;
//vm::var<CellSaveDataFixedSet> fixedSet;
//vm::var<CellSaveDataStatGet> statGet;
//vm::var<CellSaveDataStatSet> statSet;
//std::string saveBaseDir = "/dev_hdd0/home/00000001/savedata/"; // TODO: Get the path of the current user
//vfsDir dir(saveBaseDir);
//if (!dir.IsOpened())
// return CELL_SAVEDATA_ERROR_INTERNAL;
//std::string dirNamePrefix = setList->dirNamePrefix.get_ptr();
//std::vector<SaveDataEntry> saveEntries;
//for (const DirEntryInfo* entry = dir.Read(); entry; entry = dir.Read())
//{
// if (entry->flags & DirEntry_TypeDir && entry->name.substr(0, dirNamePrefix.size()) == dirNamePrefix)
// {
// // Count the amount of matches and the amount of listed directories
// listGet->dirListNum++;
// if (listGet->dirListNum > setBuf->dirListMax)
// continue;
// listGet->dirNum++;
// std::string saveDir = saveBaseDir + entry->name;
// addSaveDataEntry(saveEntries, saveDir);
// }
//}
//// Sort the entries and fill the listGet->dirList array
//std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder));
//listGet->dirList = vm::bptr<CellSaveDataDirList>::make(setBuf->buf.addr());
//auto dirList = vm::get_ptr<CellSaveDataDirList>(listGet->dirList.addr());
//for (u32 i = 0; i<saveEntries.size(); i++) {
// strcpy_trunc(dirList[i].dirName, saveEntries[i].dirName);
// strcpy_trunc(dirList[i].listParam, saveEntries[i].listParam);
// *dirList[i].reserved = {};
//}
//funcFixed(result, listGet, fixedSet);
//if (result->result < 0) {
// cellSysutil->Error("cellSaveDataListAutoLoad: CellSaveDataListCallback failed."); // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
// return CELL_SAVEDATA_ERROR_CBRESULT;
//}
//setSaveDataList(saveEntries, (u32)listSet->fixedList.addr(), listSet->fixedListNum);
//if (listSet->newData)
// addNewSaveDataEntry(saveEntries, (u32)listSet->newData.addr());
//if (saveEntries.size() == 0) {
// cellSysutil->Warning("cellSaveDataListAutoLoad: No save entries found!"); // TODO: Find a better way to handle this error
// return CELL_SAVEDATA_RET_OK;
//}
//u32 focusIndex = focusSaveDataEntry(saveEntries, listSet->focusPosition);
//// TODO: Display the dialog here
//u32 selectedIndex = focusIndex; // TODO: Until the dialog is implemented, select always the focused entry
//getSaveDataStat(saveEntries[selectedIndex], statGet.addr());
//result->userdata_addr = userdata_addr;
//funcStat(result.addr(), statGet.addr(), statSet.addr());
//Memory.Free(statGet->fileList.addr());
//if (result->result < 0) {
// cellSysutil->Error("cellSaveDataListAutoLoad: CellSaveDataStatCallback failed."); // TODO: Once we verify that the entire SysCall is working, delete this debug error message.
// return CELL_SAVEDATA_ERROR_CBRESULT;
//}
///*if (statSet->setParam)
//// TODO: Write PARAM.SFO file
//*/
//// Enter the loop where the save files are read/created/deleted.
//s32 ret = modifySaveDataFiles(funcFile, result, saveBaseDir + (char*)statGet->dir.dirName);
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataDelete2 ( u32 container )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataDelete2(container=0x%x) " , container ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_CANCEL ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataFixedDelete ( vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed , vm : : ptr < CellSaveDataDoneCallback > funcDone ,
u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataFixedDelete(setList=0x%x, setBuf=0x%x, funcFixed=0x%x, funcDone=0x%x, container=0x%x, userdata_addr=0x%x) " , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) ,
funcDone . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserListSave ( u32 version , u32 userId , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataListCallback > funcList ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserListSave(version=%d, userId=%d, setList=0x%x, setBuf=0x%x, funcList=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , setList . addr ( ) , setBuf . addr ( ) , funcList . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserListLoad ( u32 version , u32 userId , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataListCallback > funcList ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserListLoad(version=%d, userId=%d, setList=0x%x, setBuf=0x%x, funcList=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , setList . addr ( ) , setBuf . addr ( ) , funcList . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserFixedSave ( u32 version , u32 userId , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserFixedSave(version=%d, userId=%d, setList=0x%x, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserFixedLoad ( u32 version , u32 userId , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserFixedLoad(version=%d, userId=%d, setList=0x%x, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserAutoSave ( u32 version , u32 userId , u32 dirName_addr , u32 errDialog , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataStatCallback > funcStat ,
vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserAutoSave(version=%d, userId=%d, dirName_addr=0x%x, errDialog=%d, setBuf=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , dirName_addr , errDialog , setBuf . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserAutoLoad ( u32 version , u32 userId , u32 dirName_addr , u32 errDialog , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataStatCallback > funcStat ,
vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserAutoLoad(version=%d, userId=%d, dirName_addr=0x%x, errDialog=%d, setBuf=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " , version ,
userId , dirName_addr , errDialog , setBuf . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserListAutoSave ( u32 version , u32 userId , u32 errDialog , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserListAutoSave(version=%d, userId=%d, errDialog=%d, setList=0x%x, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
version , userId , errDialog , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
2014-09-02 18:58:42 +02:00
int cellSaveDataUserListAutoLoad ( u32 version , u32 userId , u32 errDialog , vm : : ptr < CellSaveDataSetList > setList , vm : : ptr < CellSaveDataSetBuf > setBuf , vm : : ptr < CellSaveDataFixedCallback > funcFixed ,
vm : : ptr < CellSaveDataStatCallback > funcStat , vm : : ptr < CellSaveDataFileCallback > funcFile , u32 container , u32 userdata_addr )
2014-03-28 20:06:15 +01:00
{
2014-09-02 18:58:42 +02:00
cellSysutil - > Todo ( " cellSaveDataUserListAutoLoad(version=%d, userId=%d, errDialog=%D, setList=0x%x, setBuf=0x%x, funcFixed=0x%x, funcStat=0x%x, funcFile=0x%x, container=0x%x, userdata_addr=0x%x) " ,
version , userId , errDialog , setList . addr ( ) , setBuf . addr ( ) , funcFixed . addr ( ) , funcStat . addr ( ) , funcFile . addr ( ) , container , userdata_addr ) ;
2014-03-28 20:06:15 +01:00
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserFixedDelete ( ) //CellSysutilUserId userId, CellSaveDataSetList *setList, CellSaveDataSetBuf *setBuf, CellSaveDataFixedCallback funcFixed, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
//void cellSaveDataEnableOverlay(); //int enable
// Functions (Extensions)
int cellSaveDataListDelete ( ) //CellSaveDataSetList *setList, CellSaveDataSetBuf *setBuf, CellSaveDataListCallback funcList, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataListImport ( ) //CellSaveDataSetList *setList, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataListExport ( ) //CellSaveDataSetList *setList, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataFixedImport ( ) //const char *dirName, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataFixedExport ( ) //const char *dirName, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
2014-09-01 02:51:48 +02:00
int cellSaveDataGetListItem ( ) //const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr<be_t<u32>> bind, vm::ptr<be_t<u32>> sizeKB
2014-03-28 20:06:15 +01:00
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserListDelete ( ) //CellSysutilUserId userId, CellSaveDataSetList *setList, CellSaveDataSetBuf *setBuf, CellSaveDataListCallback funcList, CellSaveDataDoneCallback funcDone,sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserListImport ( ) //CellSysutilUserId userId, CellSaveDataSetList *setList, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserListExport ( ) //CellSysutilUserId userId, CellSaveDataSetList *setList, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserFixedImport ( ) //CellSysutilUserId userId, const char *dirName, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
int cellSaveDataUserFixedExport ( ) //CellSysutilUserId userId, const char *dirName, u32 maxSizeKB, CellSaveDataDoneCallback funcDone, sys_memory_container_t container, void *userdata
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}
2014-09-01 02:51:48 +02:00
int cellSaveDataUserGetListItem ( ) //CellSysutilUserId userId, const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr<be_t<u32>> bind, vm::ptr<be_t<u32>> sizeKB
2014-03-28 20:06:15 +01:00
{
UNIMPLEMENTED_FUNC ( cellSysutil ) ;
return CELL_SAVEDATA_RET_OK ;
}