rpcsx/rpcs3/Emu/Cell/Modules/cellSaveData.h

361 lines
9.4 KiB
C
Raw Normal View History

#pragma once
2018-02-09 15:49:37 +01:00
2020-02-22 20:42:49 +01:00
#include "stdafx.h"
#include <Emu/Memory/vm_ptr.h>
// Return codes
2019-01-13 14:25:50 +01:00
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,
2018-02-09 15:49:37 +01:00
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,
};
2019-12-27 11:41:22 +01:00
// 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,
2015-04-17 06:37:13 +02:00
// CellSaveDataSystemFileParam attribute
CELL_SAVEDATA_ATTR_NORMAL = 0,
CELL_SAVEDATA_ATTR_NODUPLICATE = 1,
2015-04-17 06:37:13 +02:00
// 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,
2019-12-27 11:41:22 +01:00
// 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
2018-02-09 15:49:37 +01:00
{
be_t<u32> sortType;
be_t<u32> sortOrder;
2014-09-04 19:32:20 +02:00
vm::bptr<char> dirNamePrefix;
vm::bptr<void> reserved;
};
struct CellSaveDataSetBuf
2018-02-09 15:49:37 +01:00
{
be_t<u32> dirListMax;
be_t<u32> fileListMax;
be_t<u32> reserved[6];
be_t<u32> bufSize;
2014-09-04 19:32:20 +02:00
vm::bptr<void> buf;
};
2018-02-09 15:49:37 +01:00
struct CellSaveDataNewDataIcon
{
2014-09-04 19:32:20 +02:00
vm::bptr<char> title;
be_t<u32> iconBufSize;
2014-09-04 19:32:20 +02:00
vm::bptr<void> iconBuf;
vm::bptr<void> reserved;
};
2018-02-09 15:49:37 +01:00
struct CellSaveDataListNewData
{
be_t<u32> iconPosition;
2014-09-04 19:32:20 +02:00
vm::bptr<char> dirName;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataNewDataIcon> icon;
2014-09-04 19:32:20 +02:00
vm::bptr<void> reserved;
};
struct CellSaveDataDirList
2018-02-09 15:49:37 +01:00
{
char dirName[CELL_SAVEDATA_DIRNAME_SIZE];
2014-09-04 19:32:20 +02:00
char listParam[CELL_SAVEDATA_SYSP_LPARAM_SIZE];
char reserved[8];
};
struct CellSaveDataListGet
2018-02-09 15:49:37 +01:00
{
be_t<u32> dirNum;
be_t<u32> dirListNum;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataDirList> dirList;
2014-09-04 19:32:20 +02:00
char reserved[64];
};
struct CellSaveDataListSet
2018-02-09 15:49:37 +01:00
{
be_t<u32> focusPosition;
2014-09-04 19:32:20 +02:00
vm::bptr<char> focusDirName;
be_t<u32> fixedListNum;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataDirList> fixedList;
vm::bptr<CellSaveDataListNewData> newData;
2014-09-04 19:32:20 +02:00
vm::bptr<void> reserved;
};
struct CellSaveDataFixedSet
2018-02-09 15:49:37 +01:00
{
2014-09-04 19:32:20 +02:00
vm::bptr<char> dirName;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataNewDataIcon> newIcon;
be_t<u32> option;
};
2018-02-09 15:49:37 +01:00
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<u32> attribute;
be_t<u32> parental_level; // char reserved2[4] in firmware 3.70 or higher
2018-02-09 15:49:37 +01:00
char listParam[CELL_SAVEDATA_SYSP_LPARAM_SIZE];
char reserved[256];
};
struct CellSaveDataDirStat
2018-02-09 15:49:37 +01:00
{
2015-04-17 06:37:13 +02:00
be_t<s64> atime;
be_t<s64> mtime;
be_t<s64> ctime;
2018-02-09 15:49:37 +01:00
char dirName[CELL_SAVEDATA_DIRNAME_SIZE];
};
struct CellSaveDataFileStat
2018-02-09 15:49:37 +01:00
{
be_t<u32> fileType;
2015-04-18 19:18:23 +02:00
char reserved1[4];
2015-04-17 06:37:13 +02:00
be_t<u64> size;
be_t<s64> atime;
be_t<s64> mtime;
be_t<s64> ctime;
2018-02-09 15:49:37 +01:00
char fileName[CELL_SAVEDATA_FILENAME_SIZE];
2015-04-18 19:18:23 +02:00
char reserved2[3];
};
struct CellSaveDataStatGet
2018-02-09 15:49:37 +01:00
{
be_t<s32> hddFreeSizeKB;
be_t<u32> isNewData;
CellSaveDataDirStat dir;
CellSaveDataSystemFileParam getParam;
be_t<u32> bind;
be_t<s32> sizeKB;
be_t<s32> sysSizeKB;
be_t<u32> fileNum;
be_t<u32> fileListNum;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataFileStat> fileList;
2014-09-04 19:32:20 +02:00
char reserved[64];
};
struct CellSaveDataAutoIndicator
2018-02-09 15:49:37 +01:00
{
be_t<u32> dispPosition;
be_t<u32> dispMode;
2014-09-04 19:32:20 +02:00
vm::bptr<char> dispMsg;
be_t<u32> picBufSize;
2014-09-04 19:32:20 +02:00
vm::bptr<void> picBuf;
vm::bptr<void> reserved;
};
2018-02-09 15:49:37 +01:00
struct CellSaveDataStatSet
{
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataSystemFileParam> setParam;
be_t<u32> reCreateMode;
2014-09-02 00:22:13 +02:00
vm::bptr<CellSaveDataAutoIndicator> indicator;
};
struct CellSaveDataFileGet
2018-02-09 15:49:37 +01:00
{
be_t<u32> excSize;
2014-09-04 19:32:20 +02:00
char reserved[64];
2018-02-09 15:49:37 +01:00
};
2018-02-09 15:49:37 +01:00
struct CellSaveDataFileSet
{
be_t<u32> fileOperation;
2014-09-04 19:32:20 +02:00
vm::bptr<void> reserved;
be_t<u32> fileType;
be_t<v128, 1> secureFileId;
2014-09-04 19:32:20 +02:00
vm::bptr<char> fileName;
be_t<u32> fileOffset;
be_t<u32> fileSize;
be_t<u32> fileBufSize;
2014-09-04 19:32:20 +02:00
vm::bptr<void> fileBuf;
};
2018-02-09 15:49:37 +01:00
struct CellSaveDataCBResult
{
be_t<s32> result;
be_t<u32> progressBarInc;
be_t<s32> errNeedSizeKB;
2014-09-04 19:32:20 +02:00
vm::bptr<char> invalidMsg;
vm::bptr<void> userdata;
};
struct CellSaveDataDoneGet
2018-02-09 15:49:37 +01:00
{
be_t<s32> excResult;
2018-02-09 15:49:37 +01:00
char dirName[CELL_SAVEDATA_DIRNAME_SIZE];
be_t<s32> sizeKB;
be_t<s32> hddFreeSizeKB;
2014-09-04 19:32:20 +02:00
char reserved[64];
};
// Callback Functions
2015-07-28 04:08:23 +02:00
using CellSaveDataFixedCallback = void(vm::ptr<CellSaveDataCBResult> cbResult, vm::ptr<CellSaveDataListGet> get, vm::ptr<CellSaveDataFixedSet> set);
using CellSaveDataListCallback = void(vm::ptr<CellSaveDataCBResult> cbResult, vm::ptr<CellSaveDataListGet> get, vm::ptr<CellSaveDataListSet> set);
using CellSaveDataStatCallback = void(vm::ptr<CellSaveDataCBResult> cbResult, vm::ptr<CellSaveDataStatGet> get, vm::ptr<CellSaveDataStatSet> set);
using CellSaveDataFileCallback = void(vm::ptr<CellSaveDataCBResult> cbResult, vm::ptr<CellSaveDataFileGet> get, vm::ptr<CellSaveDataFileSet> set);
using CellSaveDataDoneCallback = void(vm::ptr<CellSaveDataCBResult> cbResult, vm::ptr<CellSaveDataDoneGet> get);
// Auxiliary Structs
struct SaveDataEntry
{
2019-09-27 18:00:34 +02:00
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<uchar> iconBuf;
bool isNew{false};
};
2015-04-16 01:17:42 +02:00
class SaveDialogBase
2015-04-16 01:17:42 +02:00
{
public:
2017-01-24 13:29:58 +01:00
virtual ~SaveDialogBase();
2015-04-17 06:37:13 +02:00
2017-11-14 15:49:28 +01:00
virtual s32 ShowSaveDataList(std::vector<SaveDataEntry>& save_entries, s32 focused, u32 op, vm::ptr<CellSaveDataListSet> listSet) = 0;
2015-04-16 01:17:42 +02:00
};