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