#pragma once #include "stdafx.h" #include // Return codes enum CellSaveDataError : u32 { CELL_SAVEDATA_ERROR_CBRESULT = 0x8002b401, CELL_SAVEDATA_ERROR_ACCESS_ERROR = 0x8002b402, CELL_SAVEDATA_ERROR_INTERNAL = 0x8002b403, CELL_SAVEDATA_ERROR_PARAM = 0x8002b404, CELL_SAVEDATA_ERROR_NOSPACE = 0x8002b405, CELL_SAVEDATA_ERROR_BROKEN = 0x8002b406, CELL_SAVEDATA_ERROR_FAILURE = 0x8002b407, CELL_SAVEDATA_ERROR_BUSY = 0x8002b408, CELL_SAVEDATA_ERROR_NOUSER = 0x8002b409, CELL_SAVEDATA_ERROR_SIZEOVER = 0x8002b40a, CELL_SAVEDATA_ERROR_NODATA = 0x8002b40b, CELL_SAVEDATA_ERROR_NOTSUPPORTED = 0x8002b40c, }; // Callback return codes enum { CELL_SAVEDATA_CBRESULT_OK_LAST_NOCONFIRM = 2, CELL_SAVEDATA_CBRESULT_OK_LAST = 1, CELL_SAVEDATA_CBRESULT_OK_NEXT = 0, CELL_SAVEDATA_CBRESULT_ERR_NOSPACE = -1, CELL_SAVEDATA_CBRESULT_ERR_FAILURE = -2, CELL_SAVEDATA_CBRESULT_ERR_BROKEN = -3, CELL_SAVEDATA_CBRESULT_ERR_NODATA = -4, CELL_SAVEDATA_CBRESULT_ERR_INVALID = -5, }; // Bind stat return codes enum { CELL_SAVEDATA_BINDSTAT_OK = 0, CELL_SAVEDATA_BINDSTAT_ERR_CONSOLE = 1 << 0, CELL_SAVEDATA_BINDSTAT_ERR_DISC = 1 << 1, CELL_SAVEDATA_BINDSTAT_ERR_PROGRAM = 1 << 2, CELL_SAVEDATA_BINDSTAT_ERR_NOACCOUNTI = 1 << 3, CELL_SAVEDATA_BINDSTAT_ERR_NOUSER = 1 << 3, CELL_SAVEDATA_BINDSTAT_ERR_ACCOUNTID = 1 << 4, CELL_SAVEDATA_BINDSTAT_ERR_OTHERS = 1 << 4, CELL_SAVEDATA_BINDSTAT_ERR_NOUSERID = 1 << 5, CELL_SAVEDATA_BINDSTAT_ERR_USERID = 1 << 6, CELL_SAVEDATA_BINDSTAT_ERR_NOOWNER = 1 << 8, CELL_SAVEDATA_BINDSTAT_ERR_OWNER = 1 << 9, CELL_SAVEDATA_BINDSTAT_ERR_LOCALOWNER = 1 << 10, }; // Constants enum { // CellSaveDataParamSize CELL_SAVEDATA_DIRNAME_SIZE = 32, CELL_SAVEDATA_FILENAME_SIZE = 13, CELL_SAVEDATA_SECUREFILEID_SIZE = 16, CELL_SAVEDATA_PREFIX_SIZE = 256, CELL_SAVEDATA_LISTITEM_MAX = 2048, CELL_SAVEDATA_SECUREFILE_MAX = 113, CELL_SAVEDATA_DIRLIST_MAX = 2048, CELL_SAVEDATA_INVALIDMSG_MAX = 256, CELL_SAVEDATA_INDICATORMSG_MAX = 64, // CellSaveDataSystemParamSize CELL_SAVEDATA_SYSP_TITLE_SIZE = 128, CELL_SAVEDATA_SYSP_SUBTITLE_SIZE = 128, CELL_SAVEDATA_SYSP_DETAIL_SIZE = 1024, CELL_SAVEDATA_SYSP_LPARAM_SIZE = 8, // CellSaveDataSortType CELL_SAVEDATA_SORTTYPE_MODIFIEDTIME = 0, CELL_SAVEDATA_SORTTYPE_SUBTITLE = 1, // CellSaveDataSortOrder CELL_SAVEDATA_SORTORDER_DESCENT = 0, CELL_SAVEDATA_SORTORDER_ASCENT = 1, // CellSaveDataIsNewData CELL_SAVEDATA_ISNEWDATA_NO = 0, CELL_SAVEDATA_ISNEWDATA_YES = 1, // CellSaveDataFocusPosition CELL_SAVEDATA_FOCUSPOS_DIRNAME = 0, CELL_SAVEDATA_FOCUSPOS_LISTHEAD = 1, CELL_SAVEDATA_FOCUSPOS_LISTTAIL = 2, CELL_SAVEDATA_FOCUSPOS_LATEST = 3, CELL_SAVEDATA_FOCUSPOS_OLDEST = 4, CELL_SAVEDATA_FOCUSPOS_NEWDATA = 5, // CellSaveDataFileOperation CELL_SAVEDATA_FILEOP_READ = 0, CELL_SAVEDATA_FILEOP_WRITE = 1, CELL_SAVEDATA_FILEOP_DELETE = 2, CELL_SAVEDATA_FILEOP_WRITE_NOTRUNC = 3, // CellSaveDataFileType CELL_SAVEDATA_FILETYPE_SECUREFILE = 0, CELL_SAVEDATA_FILETYPE_NORMALFILE = 1, CELL_SAVEDATA_FILETYPE_CONTENT_ICON0 = 2, CELL_SAVEDATA_FILETYPE_CONTENT_ICON1 = 3, CELL_SAVEDATA_FILETYPE_CONTENT_PIC1 = 4, CELL_SAVEDATA_FILETYPE_CONTENT_SND0 = 5, // CellSaveDataSystemFileParam attribute CELL_SAVEDATA_ATTR_NORMAL = 0, CELL_SAVEDATA_ATTR_NODUPLICATE = 1, // reCreateMode CELL_SAVEDATA_RECREATE_NO = 0, CELL_SAVEDATA_RECREATE_NO_NOBROKEN = 1, CELL_SAVEDATA_RECREATE_YES = 2, CELL_SAVEDATA_RECREATE_YES_RESET_OWNER = 3, CELL_SAVEDATA_RECREATE_MASK = 0xfffeffff, // Version CELL_SAVEDATA_VERSION_OLD = 0, CELL_SAVEDATA_VERSION_420 = 1, // Error Dialog CELL_SAVEDATA_ERRDIALOG_NONE = 0, CELL_SAVEDATA_ERRDIALOG_ALWAYS = 1, CELL_SAVEDATA_ERRDIALOG_NOREPEAT = 2, // Options for funcFixed dialog CELL_SAVEDATA_OPTION_NONE = 0, CELL_SAVEDATA_OPTION_NOCONFIRM = 1, // CellSaveDataAutoIndicatorDispPosition CELL_SAVEDATA_INDICATORPOS_LOWER_RIGHT = 0, CELL_SAVEDATA_INDICATORPOS_LOWER_LEFT = 1, CELL_SAVEDATA_INDICATORPOS_UPPER_RIGHT = 2, CELL_SAVEDATA_INDICATORPOS_UPPER_LEFT = 3, CELL_SAVEDATA_INDICATORPOS_CENTER = 4, // CellSaveDataAutoIndicatorDispMsgAlign CELL_SAVEDATA_INDICATORPOS_MSGALIGN_LEFT = 0 << 4, CELL_SAVEDATA_INDICATORPOS_MSGALIGN_RIGHT = 1 << 4, CELL_SAVEDATA_INDICATORPOS_MSGALIGN_CENTER = 2 << 4, // CellSaveDataAutoIndicatorDispMode CELL_SAVEDATA_INDICATORMODE_FIXED = 0, CELL_SAVEDATA_INDICATORMODE_BLINK = 1, CELL_SAVEDATA_INDICATORMODE_BLINK_FAST = 2, CELL_SAVEDATA_INDICATORMODE_BLINK_SLOW = 3, // Trophy ownership CELL_SAVEDATA_DISABLE_TROPHY_OWNERSHIP_CHECK = 1 << 16, }; // CellSaveDataListNewData::iconPosition enum : u32 { CELL_SAVEDATA_ICONPOS_HEAD = 0, CELL_SAVEDATA_ICONPOS_TAIL = 1, }; // Datatypes struct CellSaveDataSetList { be_t sortType; be_t sortOrder; vm::bptr dirNamePrefix; vm::bptr reserved; }; struct CellSaveDataSetBuf { be_t dirListMax; be_t fileListMax; be_t reserved[6]; be_t bufSize; vm::bptr buf; }; struct CellSaveDataNewDataIcon { vm::bptr title; be_t iconBufSize; vm::bptr iconBuf; vm::bptr reserved; }; struct CellSaveDataListNewData { be_t iconPosition; vm::bptr dirName; vm::bptr icon; vm::bptr reserved; }; struct CellSaveDataDirList { char dirName[CELL_SAVEDATA_DIRNAME_SIZE]; char listParam[CELL_SAVEDATA_SYSP_LPARAM_SIZE]; char reserved[8]; }; struct CellSaveDataListGet { be_t dirNum; be_t dirListNum; vm::bptr dirList; char reserved[64]; }; struct CellSaveDataListSet { be_t focusPosition; vm::bptr focusDirName; be_t fixedListNum; vm::bptr fixedList; vm::bptr newData; vm::bptr reserved; }; struct CellSaveDataFixedSet { vm::bptr dirName; vm::bptr newIcon; be_t option; }; struct CellSaveDataSystemFileParam { char title[CELL_SAVEDATA_SYSP_TITLE_SIZE]; char subTitle[CELL_SAVEDATA_SYSP_SUBTITLE_SIZE]; char detail[CELL_SAVEDATA_SYSP_DETAIL_SIZE]; be_t attribute; be_t parental_level; // char reserved2[4] in firmware 3.70 or higher char listParam[CELL_SAVEDATA_SYSP_LPARAM_SIZE]; char reserved[256]; }; struct CellSaveDataDirStat { be_t atime; be_t mtime; be_t ctime; char dirName[CELL_SAVEDATA_DIRNAME_SIZE]; }; struct CellSaveDataFileStat { be_t fileType; char reserved1[4]; be_t size; be_t atime; be_t mtime; be_t ctime; char fileName[CELL_SAVEDATA_FILENAME_SIZE]; char reserved2[3]; }; struct CellSaveDataStatGet { be_t hddFreeSizeKB; be_t isNewData; CellSaveDataDirStat dir; CellSaveDataSystemFileParam getParam; be_t bind; be_t sizeKB; be_t sysSizeKB; be_t fileNum; be_t fileListNum; vm::bptr fileList; char reserved[64]; }; struct CellSaveDataAutoIndicator { be_t dispPosition; be_t dispMode; vm::bptr dispMsg; be_t picBufSize; vm::bptr picBuf; vm::bptr reserved; }; struct CellSaveDataStatSet { vm::bptr setParam; be_t reCreateMode; vm::bptr indicator; }; struct CellSaveDataFileGet { be_t excSize; char reserved[64]; }; struct CellSaveDataFileSet { be_t fileOperation; vm::bptr reserved; be_t fileType; be_t secureFileId; vm::bptr fileName; be_t fileOffset; be_t fileSize; be_t fileBufSize; vm::bptr fileBuf; }; struct CellSaveDataCBResult { be_t result; be_t progressBarInc; be_t errNeedSizeKB; vm::bptr invalidMsg; vm::bptr userdata; }; struct CellSaveDataDoneGet { be_t excResult; char dirName[CELL_SAVEDATA_DIRNAME_SIZE]; be_t sizeKB; be_t hddFreeSizeKB; char reserved[64]; }; // Callback Functions using CellSaveDataFixedCallback = void(vm::ptr cbResult, vm::ptr get, vm::ptr set); using CellSaveDataListCallback = void(vm::ptr cbResult, vm::ptr get, vm::ptr set); using CellSaveDataStatCallback = void(vm::ptr cbResult, vm::ptr get, vm::ptr set); using CellSaveDataFileCallback = void(vm::ptr cbResult, vm::ptr get, vm::ptr set); using CellSaveDataDoneCallback = void(vm::ptr cbResult, vm::ptr get); // Auxiliary Structs struct SaveDataEntry { std::string escaped; std::string dirName; std::string listParam; std::string title; std::string subtitle; std::string details; u64 size{0}; s64 atime{0}; s64 mtime{0}; s64 ctime{0}; std::vector iconBuf; bool isNew{false}; }; class SaveDialogBase { public: virtual ~SaveDialogBase(); virtual s32 ShowSaveDataList(std::vector& save_entries, s32 focused, u32 op, vm::ptr listSet) = 0; };