mirror of
https://github.com/devkitPro/wut.git
synced 2026-04-16 06:26:42 -05:00
74 lines
2.9 KiB
C++
74 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <coreinit/filesystem.h>
|
|
#include <nn/result.h>
|
|
#include <nn/sl/IStream.h>
|
|
#include <nn/sl/details/IStreamDetails.h>
|
|
#include <wut.h>
|
|
|
|
#ifdef __cplusplus
|
|
|
|
namespace nn::sl {
|
|
namespace details {
|
|
typedef struct WUT_PACKED FileStreamInternal {
|
|
void *vtable;
|
|
FSClient *fsClient;
|
|
FSCmdBlock *fsCmdBlock;
|
|
FSFileHandle fileHandle;
|
|
} FileStreamInternal;
|
|
WUT_CHECK_SIZE(FileStreamInternal, 0x10);
|
|
WUT_CHECK_OFFSET(FileStreamInternal, 0x00, vtable);
|
|
WUT_CHECK_OFFSET(FileStreamInternal, 0x04, fsClient);
|
|
WUT_CHECK_OFFSET(FileStreamInternal, 0x08, fsCmdBlock);
|
|
WUT_CHECK_OFFSET(FileStreamInternal, 0x0C, fileHandle);
|
|
|
|
extern "C" nn::Result Initialize__Q3_2nn2sl10FileStreamFP8FSClientP10FSCmdBlockPCcT3(FileStreamInternal *, FSClient *, FSCmdBlock *, char const *, char const *);
|
|
extern "C" FileStreamInternal *__ct__Q3_2nn2sl10FileStreamFv(FileStreamInternal *);
|
|
extern "C" void __dt__Q3_2nn2sl10FileStreamFv(FileStreamInternal *, int);
|
|
} // namespace details
|
|
|
|
class FileStream : public details::IStreamBase {
|
|
public:
|
|
FileStream() {
|
|
__ct__Q3_2nn2sl10FileStreamFv(&mInstance);
|
|
}
|
|
|
|
~FileStream() override {
|
|
__dt__Q3_2nn2sl10FileStreamFv(&mInstance, 2);
|
|
}
|
|
|
|
nn::Result Read(uint32_t *bytesRead, void *buffer, uint32_t readSize) override {
|
|
auto *base = reinterpret_cast<details::IStreamInternal *>(&mInstance);
|
|
return base->vtable->ReadFn(base, bytesRead, buffer, readSize);
|
|
}
|
|
nn::Result Write(uint32_t *bytesWritten, void *buffer, uint32_t readSize) override {
|
|
auto *base = reinterpret_cast<details::IStreamInternal *>(&mInstance);
|
|
return base->vtable->WriteFn(base, bytesWritten, buffer, readSize);
|
|
}
|
|
nn::Result GetSize(uint32_t *fileSize) override {
|
|
auto *base = reinterpret_cast<details::IStreamInternal *>(&mInstance);
|
|
return base->vtable->GetSizeFn(base, fileSize);
|
|
}
|
|
nn::Result Seek(int32_t offset, nn::sl::SeekOrigin seekOrigin) override {
|
|
auto *base = reinterpret_cast<details::IStreamInternal *>(&mInstance);
|
|
return base->vtable->SeekFn(base, offset, seekOrigin);
|
|
}
|
|
|
|
/**
|
|
* The given client and cmd must be valid during the whole liftime of the filestream
|
|
*/
|
|
nn::Result Initialize(FSClient *client, FSCmdBlock *cmdBlock, char const *path, char const *mode) {
|
|
return Initialize__Q3_2nn2sl10FileStreamFP8FSClientP10FSCmdBlockPCcT3(&mInstance, client, cmdBlock, path, mode);
|
|
}
|
|
|
|
details::IStreamInternal *GetInternal() override {
|
|
return reinterpret_cast<details::IStreamInternal *>(&mInstance);
|
|
}
|
|
|
|
private:
|
|
details::FileStreamInternal mInstance = {};
|
|
};
|
|
|
|
}; // namespace nn::sl
|
|
|
|
#endif |