2012-12-10 13:08:54 +01:00
// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
# include "PSPSaveDialog.h"
# include "../Util/PPGeDraw.h"
# include "../HLE/sceCtrl.h"
# include "../Core/MemMap.h"
2013-01-21 21:35:31 +08:00
# include "../Config.h"
2013-03-03 23:50:39 -08:00
# include "Core/Reporting.h"
2013-03-17 17:47:37 -07:00
# include "Core/HW/MemoryStick.h"
2013-04-21 04:36:50 +09:00
# include "i18n/i18n.h"
2012-12-10 13:08:54 +01:00
PSPSaveDialog : : PSPSaveDialog ( )
: PSPDialog ( )
, display ( DS_NONE )
2013-01-02 21:11:24 +01:00
, currentSelectedSave ( 0 )
2012-12-10 13:08:54 +01:00
{
param . SetPspParam ( 0 ) ;
}
PSPSaveDialog : : ~ PSPSaveDialog ( ) {
}
2012-12-24 18:37:28 -08:00
int PSPSaveDialog : : Init ( int paramAddr )
2012-12-10 13:08:54 +01:00
{
2012-12-19 01:05:45 +01:00
// Ignore if already running
if ( status ! = SCE_UTILITY_STATUS_NONE & & status ! = SCE_UTILITY_STATUS_SHUTDOWN )
{
2013-01-06 01:29:14 +01:00
ERROR_LOG ( HLE , " A save request is already running ! " ) ;
2013-03-17 19:01:58 -07:00
return SCE_ERROR_UTILITY_INVALID_STATUS ;
2012-12-19 01:05:45 +01:00
}
2012-12-24 01:22:28 +01:00
int size = Memory : : Read_U32 ( paramAddr ) ;
memset ( & request , 0 , sizeof ( request ) ) ;
// Only copy the right size to support different save request format
Memory : : Memcpy ( & request , paramAddr , size ) ;
requestAddr = paramAddr ;
u32 retval = param . SetPspParam ( & request ) ;
2012-12-24 22:28:10 +01:00
INFO_LOG ( HLE , " sceUtilitySavedataInitStart(%08x) " , paramAddr ) ;
INFO_LOG ( HLE , " Mode: %i " , param . GetPspParam ( ) - > mode ) ;
2012-12-10 13:08:54 +01:00
2012-12-24 01:22:28 +01:00
switch ( param . GetPspParam ( ) - > mode )
2012-12-10 13:08:54 +01:00
{
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD :
case SCE_UTILITY_SAVEDATA_TYPE_LOAD :
2012-12-11 03:09:52 +01:00
DEBUG_LOG ( HLE , " Loading. Title: %s Save: %s File: %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetSaveName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-10 13:08:54 +01:00
display = DS_NONE ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD :
2012-12-11 03:09:52 +01:00
DEBUG_LOG ( HLE , " Loading. Title: %s Save: %s File: %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-10 13:08:54 +01:00
if ( param . GetFilenameCount ( ) = = 0 )
display = DS_LOAD_NODATA ;
else
display = DS_LOAD_LIST_CHOICE ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE :
case SCE_UTILITY_SAVEDATA_TYPE_SAVE :
2012-12-11 03:09:52 +01:00
DEBUG_LOG ( HLE , " Saving. Title: %s Save: %s File: %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-10 13:08:54 +01:00
display = DS_NONE ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE :
2012-12-11 03:09:52 +01:00
DEBUG_LOG ( HLE , " Saving. Title: %s Save: %s File: %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-10 13:08:54 +01:00
display = DS_SAVE_LIST_CHOICE ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE :
2012-12-11 03:09:52 +01:00
DEBUG_LOG ( HLE , " Delete. Title: %s Save: %s File: %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-10 13:08:54 +01:00
if ( param . GetFilenameCount ( ) = = 0 )
display = DS_DELETE_NODATA ;
else
display = DS_DELETE_LIST_CHOICE ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_SIZES :
2012-12-11 03:09:52 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_LIST :
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_FILES :
2013-01-10 14:33:05 +08:00
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE :
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE :
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE :
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA:
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE :
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
2013-01-29 00:11:02 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE :
2013-03-17 17:47:37 -07:00
case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA :
2012-12-11 03:09:52 +01:00
display = DS_NONE ;
break ;
2012-12-17 18:05:10 +01:00
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)
2013-01-06 20:41:49 +08:00
display = DS_DELETE_LIST_CHOICE ;
break ;
2012-12-10 13:08:54 +01:00
default :
{
2013-03-26 00:54:00 -07:00
ERROR_LOG_REPORT ( HLE , " Load/Save function %d not coded. Title: %s Save: %s File: %s " , param . GetPspParam ( ) - > mode , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) , param . GetFileName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
2012-12-11 03:09:52 +01:00
param . GetPspParam ( ) - > result = 0 ;
2012-12-26 17:33:56 -08:00
status = SCE_UTILITY_STATUS_INITIALIZE ;
2012-12-10 13:08:54 +01:00
display = DS_NONE ;
2012-12-19 21:23:52 +01:00
return 0 ; // Return 0 should allow the game to continue, but missing function must be implemented and returning the right value or the game can block.
2012-12-10 13:08:54 +01:00
}
break ;
}
2012-12-19 21:23:52 +01:00
status = ( int ) retval < 0 ? SCE_UTILITY_STATUS_SHUTDOWN : SCE_UTILITY_STATUS_INITIALIZE ;
2012-12-10 13:08:54 +01:00
currentSelectedSave = 0 ;
lastButtons = __CtrlPeekButtons ( ) ;
2013-01-19 00:45:00 +01:00
StartFade ( true ) ;
2012-12-10 13:08:54 +01:00
/*INFO_LOG(HLE,"Dump Param :");
2012-12-11 03:09:52 +01:00
INFO_LOG ( HLE , " size : %d " , param . GetPspParam ( ) - > size ) ;
INFO_LOG ( HLE , " language : %d " , param . GetPspParam ( ) - > language ) ;
INFO_LOG ( HLE , " buttonSwap : %d " , param . GetPspParam ( ) - > buttonSwap ) ;
INFO_LOG ( HLE , " result : %d " , param . GetPspParam ( ) - > result ) ;
INFO_LOG ( HLE , " mode : %d " , param . GetPspParam ( ) - > mode ) ;
INFO_LOG ( HLE , " bind : %d " , param . GetPspParam ( ) - > bind ) ;
INFO_LOG ( HLE , " overwriteMode : %d " , param . GetPspParam ( ) - > overwriteMode ) ;
INFO_LOG ( HLE , " gameName : %s " , param . GetGameName ( param . GetPspParam ( ) ) . c_str ( ) ) ;
INFO_LOG ( HLE , " saveName : %s " , param . GetPspParam ( ) - > saveName ) ;
INFO_LOG ( HLE , " saveNameList : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > saveNameList ) ) ;
INFO_LOG ( HLE , " fileName : %s " , param . GetPspParam ( ) - > fileName ) ;
INFO_LOG ( HLE , " dataBuf : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > dataBuf ) ) ;
INFO_LOG ( HLE , " dataBufSize : %u " , param . GetPspParam ( ) - > dataBufSize ) ;
INFO_LOG ( HLE , " dataSize : %u " , param . GetPspParam ( ) - > dataSize ) ;
INFO_LOG ( HLE , " sfo title : %s " , param . GetPspParam ( ) - > sfoParam . title ) ;
INFO_LOG ( HLE , " sfo savedataTitle : %s " , param . GetPspParam ( ) - > sfoParam . savedataTitle ) ;
INFO_LOG ( HLE , " sfo detail : %s " , param . GetPspParam ( ) - > sfoParam . detail ) ;
INFO_LOG ( HLE , " icon0 data : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > icon0FileData . buf ) ) ;
INFO_LOG ( HLE , " icon0 size : %u " , param . GetPspParam ( ) - > icon0FileData . bufSize ) ;
INFO_LOG ( HLE , " icon1 data : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > icon1FileData . buf ) ) ;
INFO_LOG ( HLE , " icon1 size : %u " , param . GetPspParam ( ) - > icon1FileData . bufSize ) ;
INFO_LOG ( HLE , " pic1 data : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > pic1FileData . buf ) ) ;
INFO_LOG ( HLE , " pic1 size : %u " , param . GetPspParam ( ) - > pic1FileData . bufSize ) ;
INFO_LOG ( HLE , " snd0 data : %08x " , * ( ( unsigned int * ) & param . GetPspParam ( ) - > snd0FileData . buf ) ) ;
INFO_LOG ( HLE , " snd0 size : %u " , param . GetPspParam ( ) - > snd0FileData . bufSize ) ; */
2012-12-19 21:23:52 +01:00
return retval ;
2012-12-10 13:08:54 +01:00
}
void PSPSaveDialog : : DisplaySaveList ( bool canMove )
{
int displayCount = 0 ;
for ( int i = 0 ; i < param . GetFilenameCount ( ) ; i + + )
{
2013-01-19 00:45:00 +01:00
int textureColor = CalcFadedColor ( 0xFFFFFFFF ) ;
2012-12-10 13:08:54 +01:00
2013-01-18 22:24:13 +01:00
if ( param . GetFileInfo ( i ) . size = = 0 & & param . GetFileInfo ( i ) . textureData = = 0 )
2012-12-10 13:08:54 +01:00
{
2013-01-19 00:45:00 +01:00
textureColor = CalcFadedColor ( 0xFF777777 ) ;
2012-12-10 13:08:54 +01:00
}
// Calc save image position on screen
2012-12-19 21:23:52 +01:00
float w = 150 ;
float h = 80 ;
float x = 20 ;
2012-12-10 13:08:54 +01:00
if ( displayCount ! = currentSelectedSave )
{
w = 80 ;
h = 40 ;
2013-01-15 08:12:52 +08:00
x = 55 ;
2012-12-10 13:08:54 +01:00
}
2013-01-16 08:39:31 +08:00
float y = 96 ;
2012-12-10 13:08:54 +01:00
if ( displayCount < currentSelectedSave )
2013-01-15 08:12:52 +08:00
y - = 10 + 40 * ( currentSelectedSave - displayCount ) ;
2012-12-10 13:08:54 +01:00
else if ( displayCount > currentSelectedSave )
{
2013-01-16 08:39:31 +08:00
y + = 91 + 40 * ( displayCount - currentSelectedSave - 1 ) ;
2012-12-10 13:08:54 +01:00
}
2012-12-13 22:06:45 +01:00
int tw = 256 ;
int th = 256 ;
if ( param . GetFileInfo ( i ) . textureData ! = 0 )
{
tw = param . GetFileInfo ( i ) . textureWidth ;
th = param . GetFileInfo ( i ) . textureHeight ;
PPGeSetTexture ( param . GetFileInfo ( i ) . textureData , param . GetFileInfo ( i ) . textureWidth , param . GetFileInfo ( i ) . textureHeight ) ;
}
else
{
PPGeDisableTexture ( ) ;
}
PPGeDrawImage ( x , y , w , h , 0 , 0 , 1 , 1 , tw , th , textureColor ) ;
2012-12-14 01:04:45 +01:00
PPGeSetDefaultTexture ( ) ;
2012-12-10 13:08:54 +01:00
displayCount + + ;
}
if ( canMove )
{
if ( IsButtonPressed ( CTRL_UP ) & & currentSelectedSave > 0 )
{
currentSelectedSave - - ;
}
else if ( IsButtonPressed ( CTRL_DOWN ) & & currentSelectedSave < ( param . GetFilenameCount ( ) - 1 ) )
{
currentSelectedSave + + ;
}
}
}
void PSPSaveDialog : : DisplaySaveIcon ( )
{
2013-01-19 00:45:00 +01:00
int textureColor = CalcFadedColor ( 0xFFFFFFFF ) ;
2012-12-10 13:08:54 +01:00
if ( param . GetFileInfo ( currentSelectedSave ) . size = = 0 )
{
2013-01-19 00:45:00 +01:00
textureColor = CalcFadedColor ( 0xFF777777 ) ;
2012-12-10 13:08:54 +01:00
}
// Calc save image position on screen
2012-12-19 21:23:52 +01:00
float w = 150 ;
float h = 80 ;
float x = 20 ;
float y = 80 ;
2012-12-10 13:08:54 +01:00
2012-12-13 22:06:45 +01:00
int tw = 256 ;
int th = 256 ;
if ( param . GetFileInfo ( currentSelectedSave ) . textureData ! = 0 )
{
tw = param . GetFileInfo ( currentSelectedSave ) . textureWidth ;
th = param . GetFileInfo ( currentSelectedSave ) . textureHeight ;
PPGeSetTexture ( param . GetFileInfo ( currentSelectedSave ) . textureData , param . GetFileInfo ( currentSelectedSave ) . textureWidth , param . GetFileInfo ( currentSelectedSave ) . textureHeight ) ;
}
else
{
PPGeDisableTexture ( ) ;
}
PPGeDrawImage ( x , y , w , h , 0 , 0 , 1 , 1 , tw , th , textureColor ) ;
if ( param . GetFileInfo ( currentSelectedSave ) . textureData ! = 0 )
{
PPGeSetDefaultTexture ( ) ;
}
2012-12-10 13:08:54 +01:00
}
void PSPSaveDialog : : DisplaySaveDataInfo1 ( )
{
if ( param . GetFileInfo ( currentSelectedSave ) . size = = 0 )
{
2013-04-21 04:36:50 +09:00
I18NCategory * m = GetI18NCategory ( " Dialog " ) ;
PPGeDrawText ( m - > T ( " New Save " ) , 180 , 100 , PPGE_ALIGN_LEFT , 0.5f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
else
{
2013-01-13 23:45:32 +08:00
char title [ 512 ] ;
char time [ 512 ] ;
2013-01-14 08:45:53 +08:00
char saveTitle [ 512 ] ;
2013-01-13 23:45:32 +08:00
char saveDetail [ 512 ] ;
2012-12-25 01:36:21 -08:00
2013-01-19 23:41:35 +08:00
char am_pm [ ] = " AM " ;
2013-01-21 21:35:31 +08:00
char hour_time [ 10 ] ;
2013-01-19 23:41:35 +08:00
int hour = param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_hour ;
2013-01-21 21:35:31 +08:00
int min = param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_min ;
if ( g_Config . itimeformat ) {
if ( hour > 12 ) {
strcpy ( am_pm , " PM " ) ;
hour - = 12 ;
}
snprintf ( hour_time , 10 , " %02d:%02d %s " , hour , min , am_pm ) ;
} else
snprintf ( hour_time , 10 , " %02d:%02d " , hour , min ) ;
2013-01-19 23:41:35 +08:00
2013-01-14 08:45:53 +08:00
snprintf ( title , 512 , " %s " , param . GetFileInfo ( currentSelectedSave ) . title ) ;
2013-01-21 21:35:31 +08:00
snprintf ( time , 512 , " %02d/%02d/%d %s %lld KB "
2012-12-14 23:08:56 +01:00
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_mday
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_mon + 1
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_year + 1900
2013-01-21 21:35:31 +08:00
, hour_time
2012-12-14 23:08:56 +01:00
, param . GetFileInfo ( currentSelectedSave ) . size / 1024
) ;
2013-01-14 08:45:53 +08:00
snprintf ( saveTitle , 512 , " %s " , param . GetFileInfo ( currentSelectedSave ) . saveTitle ) ;
snprintf ( saveDetail , 512 , " %s " , param . GetFileInfo ( currentSelectedSave ) . saveDetail ) ;
2013-01-13 23:45:32 +08:00
2013-01-16 08:39:31 +08:00
2013-01-19 00:45:00 +01:00
PPGeDrawRect ( 180 , 139 , 980 , 140 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-01-13 23:45:32 +08:00
std : : string titleTxt = title ;
std : : string timeTxt = time ;
2013-01-14 08:45:53 +08:00
std : : string saveTitleTxt = saveTitle ;
2013-01-13 23:45:32 +08:00
std : : string saveDetailTxt = saveDetail ;
2013-04-16 20:55:27 +08:00
2013-04-18 08:36:39 +08:00
PPGeDrawText ( titleTxt . c_str ( ) , 180 , 120 , PPGE_ALIGN_LEFT , 0.6f , CalcFadedColor ( 0xFFC0C0C0 ) ) ;
2013-04-16 20:55:27 +08:00
PPGeDrawText ( timeTxt . c_str ( ) , 180 , 141 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
PPGeDrawText ( saveTitleTxt . c_str ( ) , 175 , 163 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-01-19 00:45:00 +01:00
PPGeDrawText ( saveDetailTxt . c_str ( ) , 175 , 185 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
}
void PSPSaveDialog : : DisplaySaveDataInfo2 ( )
{
if ( param . GetFileInfo ( currentSelectedSave ) . size = = 0 )
{
}
else
{
char txt [ 1024 ] ;
2013-01-19 23:41:35 +08:00
char am_pm [ ] = " AM " ;
2013-01-21 21:35:31 +08:00
char hour_time [ 10 ] ;
2013-01-19 23:41:35 +08:00
int hour = param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_hour ;
2013-01-21 21:35:31 +08:00
int min = param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_min ;
if ( g_Config . itimeformat ) {
if ( hour > 12 ) {
strcpy ( am_pm , " PM " ) ;
hour - = 12 ;
}
snprintf ( hour_time , 10 , " %02d:%02d %s " , hour , min , am_pm ) ;
} else
snprintf ( hour_time , 10 , " %02d:%02d " , hour , min ) ;
snprintf ( txt , 1024 , " %s \n %02d/%02d/%d %s \n %lld KB "
2012-12-14 23:08:56 +01:00
, param . GetFileInfo ( currentSelectedSave ) . saveTitle
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_mday
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_mon + 1
, param . GetFileInfo ( currentSelectedSave ) . modif_time . tm_year + 1900
2013-01-21 21:35:31 +08:00
, hour_time
2012-12-14 23:08:56 +01:00
, param . GetFileInfo ( currentSelectedSave ) . size / 1024
) ;
2012-12-10 13:08:54 +01:00
std : : string saveinfoTxt = txt ;
2013-01-19 00:45:00 +01:00
PPGeDrawText ( saveinfoTxt . c_str ( ) , 10 , 180 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
}
void PSPSaveDialog : : DisplayConfirmationYesNo ( std : : string text )
{
2013-04-21 04:36:50 +09:00
I18NCategory * m = GetI18NCategory ( " Dialog " ) ;
2013-01-19 22:14:19 +08:00
PPGeDrawRect ( 180 , 105 , 460 , 106 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-04-16 20:55:27 +08:00
PPGeDrawRect ( 180 , 160 , 460 , 161 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-01-19 22:14:19 +08:00
PPGeDrawText ( text . c_str ( ) , 220 , 110 , PPGE_ALIGN_LEFT , 0.45f , 0xFFFFFFFF ) ;
2013-04-21 04:36:50 +09:00
PPGeDrawText ( m - > T ( " Yes " ) , 250 , 140 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( yesnoChoice = = 1 ? 0xFF0000FF : 0xFFFFFFFF ) ) ;
PPGeDrawText ( m - > T ( " No " ) , 350 , 140 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( yesnoChoice = = 0 ? 0xFF0000FF : 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( CTRL_LEFT ) & & yesnoChoice = = 0 )
{
yesnoChoice = 1 ;
}
else if ( IsButtonPressed ( CTRL_RIGHT ) & & yesnoChoice = = 1 )
{
yesnoChoice = 0 ;
}
}
void PSPSaveDialog : : DisplayInfo ( std : : string text )
{
2013-01-19 00:45:00 +01:00
PPGeDrawRect ( 180 , 105 , 460 , 106 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
PPGeDrawRect ( 180 , 130 , 460 , 131 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-04-16 20:55:27 +08:00
PPGeDrawText ( text . c_str ( ) , 270 , 110 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
void PSPSaveDialog : : DisplayTitle ( std : : string name )
{
2013-01-19 00:45:00 +01:00
PPGeDrawText ( name . c_str ( ) , 10 , 10 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
void PSPSaveDialog : : DisplayEnterBack ( )
{
2013-04-21 04:36:50 +09:00
I18NCategory * m = GetI18NCategory ( " Dialog " ) ;
2013-01-19 00:45:00 +01:00
PPGeDrawImage ( okButtonImg , 180 , 257 , 11 , 11 , 0 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
PPGeDrawImage ( cancelButtonImg , 270 , 257 , 11 , 11 , 0 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-04-21 04:36:50 +09:00
PPGeDrawText ( m - > T ( " Enter " ) , 195 , 255 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
PPGeDrawText ( m - > T ( " Back " ) , 285 , 255 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
void PSPSaveDialog : : DisplayBack ( )
{
2013-04-21 04:36:50 +09:00
I18NCategory * m = GetI18NCategory ( " Dialog " ) ;
2013-01-19 00:45:00 +01:00
PPGeDrawImage ( cancelButtonImg , 180 , 257 , 11 , 11 , 0 , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2013-04-21 07:23:05 +08:00
PPGeDrawText ( m - > T ( " Back " ) , 195 , 255 , PPGE_ALIGN_LEFT , 0.45f , CalcFadedColor ( 0xFFFFFFFF ) ) ;
2012-12-10 13:08:54 +01:00
}
2012-12-24 18:37:28 -08:00
int PSPSaveDialog : : Update ( )
2012-12-10 13:08:54 +01:00
{
switch ( status ) {
case SCE_UTILITY_STATUS_FINISHED :
status = SCE_UTILITY_STATUS_SHUTDOWN ;
break ;
2012-12-24 01:22:28 +01:00
default :
break ;
2012-12-10 13:08:54 +01:00
}
if ( status ! = SCE_UTILITY_STATUS_RUNNING )
{
2013-03-17 21:39:06 -07:00
return SCE_ERROR_UTILITY_INVALID_STATUS ;
2012-12-10 13:08:54 +01:00
}
if ( ! param . GetPspParam ( ) ) {
status = SCE_UTILITY_STATUS_SHUTDOWN ;
2012-12-24 18:37:28 -08:00
return 0 ;
2012-12-10 13:08:54 +01:00
}
buttons = __CtrlPeekButtons ( ) ;
2013-01-19 00:45:00 +01:00
UpdateFade ( ) ;
2012-12-10 13:08:54 +01:00
okButtonImg = I_CIRCLE ;
cancelButtonImg = I_CROSS ;
okButtonFlag = CTRL_CIRCLE ;
cancelButtonFlag = CTRL_CROSS ;
if ( param . GetPspParam ( ) - > buttonSwap = = 1 )
{
okButtonImg = I_CROSS ;
cancelButtonImg = I_CIRCLE ;
okButtonFlag = CTRL_CROSS ;
cancelButtonFlag = CTRL_CIRCLE ;
}
2013-04-21 04:36:50 +09:00
I18NCategory * m = GetI18NCategory ( " Dialog " ) ;
2012-12-10 13:08:54 +01:00
switch ( display )
{
case DS_SAVE_LIST_CHOICE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2013-01-19 00:45:00 +01:00
// TODO : use focus param for selected save by default
2012-12-10 13:08:54 +01:00
DisplaySaveList ( ) ;
DisplaySaveDataInfo1 ( ) ;
DisplayEnterBack ( ) ;
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_DIALOG_RESULT_CANCEL ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
else if ( IsButtonPressed ( okButtonFlag ) )
{
// Save exist, ask user confirm
if ( param . GetFileInfo ( currentSelectedSave ) . size > 0 )
{
yesnoChoice = 0 ;
display = DS_SAVE_CONFIRM_OVERWRITE ;
}
else
{
display = DS_SAVE_SAVING ;
if ( param . Save ( param . GetPspParam ( ) , currentSelectedSave ) )
{
param . SetPspParam ( param . GetPspParam ( ) ) ; // Optim : Just Update modified save
display = DS_SAVE_DONE ;
}
else
{
display = DS_SAVE_LIST_CHOICE ; // This will probably need error message ?
}
}
}
EndDraw ( ) ;
break ;
case DS_SAVE_CONFIRM_OVERWRITE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
2013-04-21 04:36:50 +09:00
DisplayConfirmationYesNo ( m - > T ( " Do you want to overwrite the data? " ) ) ;
2012-12-10 13:08:54 +01:00
DisplayEnterBack ( ) ;
if ( IsButtonPressed ( cancelButtonFlag ) )
{
display = DS_SAVE_LIST_CHOICE ;
}
else if ( IsButtonPressed ( okButtonFlag ) )
{
if ( yesnoChoice = = 0 )
{
display = DS_SAVE_LIST_CHOICE ;
}
else
{
display = DS_SAVE_SAVING ;
if ( param . Save ( param . GetPspParam ( ) , currentSelectedSave ) )
{
param . SetPspParam ( param . GetPspParam ( ) ) ; // Optim : Just Update modified save
display = DS_SAVE_DONE ;
}
else
{
display = DS_SAVE_LIST_CHOICE ; // This will probably need error message ?
}
}
}
EndDraw ( ) ;
break ;
case DS_SAVE_SAVING :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Saving \n Please Wait... " ) ) ;
2012-12-10 13:08:54 +01:00
EndDraw ( ) ;
break ;
case DS_SAVE_DONE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
DisplayBack ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Save completed " ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_DIALOG_RESULT_SUCCESS ;
// Set the save to use for autosave and autoload
param . SetSelectedSave ( param . GetFileInfo ( currentSelectedSave ) . idx ) ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
EndDraw ( ) ;
break ;
case DS_LOAD_LIST_CHOICE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveList ( ) ;
DisplaySaveDataInfo1 ( ) ;
DisplayEnterBack ( ) ;
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_DIALOG_RESULT_CANCEL ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
else if ( IsButtonPressed ( okButtonFlag ) )
{
display = DS_LOAD_LOADING ;
if ( param . Load ( param . GetPspParam ( ) , currentSelectedSave ) )
{
display = DS_LOAD_DONE ;
}
}
EndDraw ( ) ;
break ;
case DS_LOAD_LOADING :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Loading \n Please Wait... " ) ) ;
2012-12-10 13:08:54 +01:00
EndDraw ( ) ;
break ;
case DS_LOAD_DONE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
DisplayBack ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Load completed " ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_DIALOG_RESULT_SUCCESS ;
// Set the save to use for autosave and autoload
param . SetSelectedSave ( param . GetFileInfo ( currentSelectedSave ) . idx ) ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
EndDraw ( ) ;
break ;
case DS_LOAD_NODATA :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplayBack ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " There is no data " ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
EndDraw ( ) ;
break ;
case DS_DELETE_LIST_CHOICE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveList ( ) ;
DisplaySaveDataInfo1 ( ) ;
DisplayEnterBack ( ) ;
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_DIALOG_RESULT_CANCEL ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
else if ( IsButtonPressed ( okButtonFlag ) )
{
yesnoChoice = 0 ;
display = DS_DELETE_CONFIRM ;
}
EndDraw ( ) ;
break ;
case DS_DELETE_CONFIRM :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplaySaveIcon ( ) ;
DisplaySaveDataInfo2 ( ) ;
2013-04-21 05:11:18 +09:00
DisplayConfirmationYesNo ( m - > T ( " This save data will be deleted. \n Are you sure you want to continue? " , " This save data will be deleted. \n Are you sure you want to continue? " ) ) ;
2013-01-19 22:14:19 +08:00
2012-12-10 13:08:54 +01:00
DisplayEnterBack ( ) ;
if ( IsButtonPressed ( cancelButtonFlag ) )
{
display = DS_DELETE_LIST_CHOICE ;
}
else if ( IsButtonPressed ( okButtonFlag ) )
{
if ( yesnoChoice = = 0 )
{
display = DS_DELETE_LIST_CHOICE ;
}
else
{
display = DS_DELETE_DELETING ;
if ( param . Delete ( param . GetPspParam ( ) , currentSelectedSave ) )
{
param . SetPspParam ( param . GetPspParam ( ) ) ; // Optim : Just Update modified save
display = DS_DELETE_DONE ;
}
else
{
display = DS_DELETE_LIST_CHOICE ; // This will probably need error message ?
}
}
}
EndDraw ( ) ;
break ;
case DS_DELETE_DELETING :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Deleting \n Please Wait... " ) ) ;
2012-12-10 13:08:54 +01:00
EndDraw ( ) ;
break ;
case DS_DELETE_DONE :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplayBack ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " Delete completed " ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( cancelButtonFlag ) )
{
if ( param . GetFilenameCount ( ) = = 0 )
display = DS_DELETE_NODATA ;
else
display = DS_DELETE_LIST_CHOICE ;
}
EndDraw ( ) ;
break ;
case DS_DELETE_NODATA :
StartDraw ( ) ;
2013-01-16 08:39:31 +08:00
2012-12-10 13:08:54 +01:00
DisplayBack ( ) ;
2013-04-21 04:36:50 +09:00
DisplayInfo ( m - > T ( " There is no data " ) ) ;
2012-12-10 13:08:54 +01:00
if ( IsButtonPressed ( cancelButtonFlag ) )
{
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA ;
2013-01-19 00:45:00 +01:00
StartFade ( false ) ;
2012-12-10 13:08:54 +01:00
}
EndDraw ( ) ;
break ;
case DS_NONE : // For action which display nothing
{
switch ( param . GetPspParam ( ) - > mode )
{
case SCE_UTILITY_SAVEDATA_TYPE_LOAD : // Only load and exit
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD :
2012-12-11 03:09:52 +01:00
if ( param . Load ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA ;
2012-12-10 13:08:54 +01:00
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
case SCE_UTILITY_SAVEDATA_TYPE_SAVE : // Only save and exit
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE :
2012-12-11 03:09:52 +01:00
if ( param . Save ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_SAVE_MS_NOSPACE ;
2012-12-10 13:08:54 +01:00
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2012-12-11 03:09:52 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_SIZES :
2012-12-19 16:57:22 +01:00
if ( param . GetSizes ( param . GetPspParam ( ) ) )
{
param . GetPspParam ( ) - > result = 0 ;
}
else
{
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_SIZES_NO_DATA ;
}
2012-12-11 03:09:52 +01:00
status = SCE_UTILITY_STATUS_FINISHED ;
2012-12-28 12:00:43 +01:00
break ;
2012-12-11 03:09:52 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_LIST :
param . GetList ( param . GetPspParam ( ) ) ;
param . GetPspParam ( ) - > result = 0 ;
status = SCE_UTILITY_STATUS_FINISHED ;
2012-12-26 17:33:56 -08:00
break ;
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_FILES :
if ( param . GetFilesList ( param . GetPspParam ( ) ) )
{
param . GetPspParam ( ) - > result = 0 ;
}
else
{
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA ;
}
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2013-01-10 14:33:05 +08:00
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE :
2012-12-31 19:08:46 +01:00
{
2013-04-15 21:00:35 +02:00
bool result = param . GetSize ( param . GetPspParam ( ) ) ;
2013-03-17 17:47:37 -07:00
// 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 ;
2013-04-15 21:00:35 +02:00
else if ( result )
2013-03-17 17:47:37 -07:00
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA ;
status = SCE_UTILITY_STATUS_FINISHED ;
2012-12-31 19:08:46 +01:00
}
2013-03-17 17:47:37 -07:00
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 ;
2012-12-31 19:08:46 +01:00
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2013-04-15 21:00:35 +02:00
//case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
2013-01-29 00:11:02 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_SINGLEDELETE :
2013-02-14 07:57:00 -05:00
if ( param . Delete ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
2013-01-29 00:11:02 +01:00
{
param . GetPspParam ( ) - > result = 0 ;
}
else
{
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA ;
}
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE :
2013-04-15 21:44:12 +08:00
if ( param . Save ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA ;
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA:
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE :
if ( param . Save ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA ;
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2013-04-15 23:31:17 +08:00
//case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
2012-12-31 19:08:46 +01:00
case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE :
if ( param . Load ( param . GetPspParam ( ) , param . GetSelectedSave ( ) ) )
param . GetPspParam ( ) - > result = 0 ;
else
param . GetPspParam ( ) - > result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA ; // not sure if correct code
2012-12-26 17:33:56 -08:00
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
2012-12-10 13:08:54 +01:00
default :
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
}
}
break ;
default :
status = SCE_UTILITY_STATUS_FINISHED ;
break ;
}
lastButtons = buttons ;
2012-12-24 01:22:28 +01:00
if ( status = = SCE_UTILITY_STATUS_FINISHED )
{
Memory : : Memcpy ( requestAddr , & request , request . size ) ;
}
2012-12-24 18:37:28 -08:00
return 0 ;
2012-12-10 13:08:54 +01:00
}
2012-12-24 18:37:28 -08:00
int PSPSaveDialog : : Shutdown ( )
2012-12-10 13:08:54 +01:00
{
2013-03-17 21:39:06 -07:00
if ( status ! = SCE_UTILITY_STATUS_FINISHED )
return SCE_ERROR_UTILITY_INVALID_STATUS ;
2012-12-10 13:08:54 +01:00
PSPDialog : : Shutdown ( ) ;
param . SetPspParam ( 0 ) ;
2012-12-24 18:37:28 -08:00
return 0 ;
2012-12-10 13:08:54 +01:00
}
2012-12-28 13:36:37 -08:00
void PSPSaveDialog : : DoState ( PointerWrap & p )
{
2012-12-29 02:56:27 -08:00
PSPDialog : : DoState ( p ) ;
2012-12-28 13:36:37 -08:00
p . Do ( display ) ;
param . DoState ( p ) ;
p . Do ( request ) ;
// Just reset it.
2012-12-29 02:56:27 -08:00
bool hasParam = param . GetPspParam ( ) ! = NULL ;
p . Do ( hasParam ) ;
if ( hasParam )
param . SetPspParam ( & request ) ;
2012-12-28 13:36:37 -08:00
p . Do ( requestAddr ) ;
p . Do ( currentSelectedSave ) ;
p . Do ( yesnoChoice ) ;
p . Do ( okButtonImg ) ;
p . Do ( cancelButtonImg ) ;
p . Do ( okButtonFlag ) ;
p . Do ( cancelButtonFlag ) ;
p . DoMarker ( " PSPSaveDialog " ) ;
}