From 4ac0ddcecb1d54eba6f0f5eb6c4df001d4d6fbbb Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Sun, 22 Mar 2026 23:58:30 -0600 Subject: [PATCH] filedevice: Implement FileDeviceStreamSrc --- CMakeLists.txt | 2 + include/filedevice/seadFileDeviceStreamSrc.h | 31 ++++++++++ .../filedevice/seadFileDeviceStreamSrc.cpp | 56 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 include/filedevice/seadFileDeviceStreamSrc.h create mode 100644 modules/src/filedevice/seadFileDeviceStreamSrc.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 44bfc4a74..59f526978 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,11 +66,13 @@ add_library(sead OBJECT include/filedevice/seadArchiveFileDevice.h include/filedevice/seadFileDevice.h include/filedevice/seadFileDeviceMgr.h + include/filedevice/seadFileDeviceStreamSrc.h include/filedevice/seadMainFileDevice.h include/filedevice/seadPath.h modules/src/filedevice/seadArchiveFileDevice.cpp modules/src/filedevice/seadFileDevice.cpp modules/src/filedevice/seadFileDeviceMgr.cpp + modules/src/filedevice/seadFileDeviceStreamSrc.cpp modules/src/filedevice/seadMainFileDevice.cpp modules/src/filedevice/seadPath.cpp diff --git a/include/filedevice/seadFileDeviceStreamSrc.h b/include/filedevice/seadFileDeviceStreamSrc.h new file mode 100644 index 000000000..fa6fc1fed --- /dev/null +++ b/include/filedevice/seadFileDeviceStreamSrc.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include + +namespace sead +{ +class FileDeviceStreamSrc : public StreamSrc +{ +public: + FileDeviceStreamSrc(); + FileDeviceStreamSrc(FileHandle* fileHandle); + ~FileDeviceStreamSrc() override; + + u32 read(void* buffer, u32 size) override; + u32 write(const void* buffer, u32 size) override; + u32 skip(s32 offset) override; + void rewind() override; + bool isEOF() override; + + void setFileHandle(sead::FileHandle* fileHandle); + +private: + FileHandle* mFileHandle = nullptr; + u32 mStartingPos = 0; + FileHandle _18; + bool mIsHandleOpen = false; + u32 mFileSize = 0; +}; +} // namespace sead diff --git a/modules/src/filedevice/seadFileDeviceStreamSrc.cpp b/modules/src/filedevice/seadFileDeviceStreamSrc.cpp new file mode 100644 index 000000000..2c5e4a7ee --- /dev/null +++ b/modules/src/filedevice/seadFileDeviceStreamSrc.cpp @@ -0,0 +1,56 @@ +#include + +namespace sead +{ +FileDeviceStreamSrc::FileDeviceStreamSrc() = default; + +FileDeviceStreamSrc::FileDeviceStreamSrc(FileHandle* fileHandle) + : mFileHandle(fileHandle), mStartingPos(fileHandle->getCurrentSeekPos()), + mFileSize(fileHandle->getFileSize()) +{ +} + +FileDeviceStreamSrc::~FileDeviceStreamSrc() +{ + if (mIsHandleOpen && mFileHandle) + mFileHandle->close(); +} + +u32 FileDeviceStreamSrc::read(void* buffer, u32 size) +{ + return mFileHandle->read(static_cast(buffer), size); +} + +u32 FileDeviceStreamSrc::write(const void* buffer, u32 size) +{ + return mFileHandle->write(static_cast(buffer), size); +} + +u32 FileDeviceStreamSrc::skip(s32 offset) +{ + if (!mFileHandle->seek(offset, FileDevice::cSeekOrigin_Current)) + return 0; + return offset; +} + +void FileDeviceStreamSrc::rewind() +{ + mFileHandle->seek(mStartingPos, FileDevice::cSeekOrigin_Begin); +} + +bool FileDeviceStreamSrc::isEOF() +{ + return mFileHandle->getCurrentSeekPos() >= mFileSize; +} + +void FileDeviceStreamSrc::setFileHandle(sead::FileHandle* fileHandle) +{ + mFileHandle = fileHandle; + if (fileHandle) + { + mStartingPos = fileHandle->getCurrentSeekPos(); + mFileSize = fileHandle->getFileSize(); + } +} + +} // namespace sead