prime/include/Kyoto/CMemoryCardSys.hpp

113 lines
2.8 KiB
C++
Raw Permalink Normal View History

#ifndef _CMEMORYCARDSYS
#define _CMEMORYCARDSYS
2022-10-11 11:37:01 +00:00
#include "string.h"
2022-10-11 12:09:23 +00:00
#include "types.h"
#include "Kyoto/CSimplePool.hpp"
#include "Kyoto/Streams/CMemoryStreamOut.hpp"
2022-10-11 12:09:23 +00:00
#include "rstl/string.hpp"
2022-10-10 19:58:03 +00:00
// TODO: likely comes from dolphin sdk
2022-10-11 12:09:23 +00:00
enum ECardResult {
2022-10-10 23:02:10 +00:00
kCR_CRC_MISMATCH = -1003, /* Extension enum for Retro's CRC check */
kCR_FATAL_ERROR = -128,
kCR_ENCODING = -13,
kCR_NAMETOOLONG = -12,
kCR_INSSPACE = -9,
kCR_NOENT = -8,
kCR_EXIST = -7,
kCR_BROKEN = -6,
kCR_IOERROR = -5,
kCR_NOFILE = -4,
kCR_NOCARD = -3,
kCR_WRONGDEVICE = -2,
kCR_BUSY = -1,
kCR_READY = 0
};
2022-10-11 12:09:23 +00:00
2022-10-10 22:53:28 +00:00
struct FileHandle {
u8 x0_pad[0x10];
};
struct ProbeResults {
ECardResult x0_error;
2022-10-11 09:41:19 +00:00
int x4_cardSize; /* in megabits */
int x8_sectorSize; /* in bytes */
2022-10-10 22:53:28 +00:00
};
2022-10-10 19:58:03 +00:00
2022-10-11 11:37:01 +00:00
struct CardStat {
u8 x0_pad[0x6c];
2022-10-11 12:09:23 +00:00
CardStat() { memset(this, 0, sizeof(CardStat)); }
2022-10-11 11:37:01 +00:00
int GetTime() const;
int GetCommentAddr() const;
};
2022-10-11 12:09:23 +00:00
class CMemoryCardSys {
public:
enum EMemoryCardPort { kCS_SlotA, kCS_SlotB };
2022-10-11 12:09:23 +00:00
class CCardFileInfo {
uchar pad[0xf4];
rstl::vector<u8> xf4_saveBuffer;
rstl::vector<u8> x104_cardBuffer;
public:
CCardFileInfo(EMemoryCardPort port, const rstl::string& name);
~CCardFileInfo();
void SetComment(const rstl::string& name);
void LockBannerToken(CAssetId bannerTxtr, CSimplePool& sp);
void LockIconToken(CAssetId iconTxtr, int speed, CSimplePool& sp);
ECardResult PumpCardTransfer();
ECardResult CreateFile();
ECardResult WriteFile();
ECardResult CloseFile();
rstl::vector<u8>& SaveBuffer() { return xf4_saveBuffer; }
inline CMemoryStreamOut BeginMemoryOut(uint sz) {
xf4_saveBuffer.resize(sz, '\x00');
return CMemoryStreamOut(xf4_saveBuffer.data(), sz);
}
};
2022-10-10 22:53:28 +00:00
2022-10-10 19:58:03 +00:00
struct CardFileHandle {
2022-10-10 22:53:28 +00:00
EMemoryCardPort slot;
2022-10-10 19:58:03 +00:00
FileHandle handle;
2022-10-10 22:53:28 +00:00
CardFileHandle(EMemoryCardPort slot) : slot(slot) {}
2022-10-11 11:37:01 +00:00
int GetFileNo() const;
2022-10-10 19:58:03 +00:00
};
CMemoryCardSys();
~CMemoryCardSys();
2022-10-10 22:53:28 +00:00
static ECardResult GetResultCode(int);
static ECardResult MountCard(EMemoryCardPort port);
static ECardResult CheckCard(EMemoryCardPort port);
2022-10-11 11:37:01 +00:00
static ECardResult GetStatus(EMemoryCardPort port, int fileNo, CardStat& statOut);
static ECardResult DeleteFile(EMemoryCardPort port, const rstl::string& name);
static ECardResult FastDeleteFile(EMemoryCardPort port, int fileNo);
static ECardResult FormatCard(EMemoryCardPort port);
2022-10-10 22:53:28 +00:00
static ProbeResults IsMemoryCardInserted(EMemoryCardPort);
2022-10-10 23:08:19 +00:00
static ECardResult GetSerialNo(EMemoryCardPort port, long long& serialOut);
2022-10-11 04:00:52 +00:00
static void UnmountCard(EMemoryCardPort);
static ECardResult Rename(EMemoryCardPort, const rstl::string&, const rstl::string&);
static ECardResult GetNumFreeBytes(EMemoryCardPort port, uint& freeBytes, uint& freeFiles);
2022-10-10 22:53:28 +00:00
void Initialize();
private:
// TODO
};
NESTED_CHECK_SIZEOF(CMemoryCardSys, CCardFileInfo, 0x114)
#endif // _CMEMORYCARDSYS