From 7d76ab692f4ba75131296a2ddd5e54a0082247fd Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 5 May 2024 00:01:06 -0400 Subject: [PATCH] ut_FileStream thanks ogws --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 6 ++-- configure.py | 2 +- include/nw4r/ut/ut_FileStream.h | 22 ++++++++----- src/nw4r/ut/ut_FileStream.cpp | 58 +++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 12 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 0a647c7a..7fefadea 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -192,6 +192,7 @@ nw4r/ut/ut_IOStream.cpp: nw4r/ut/ut_FileStream.cpp: .text start:0x8042B560 end:0x8042B6EC .ctors start:0x804DB93C end:0x804DB940 + .sbss start:0x80576598 end:0x805765A0 nw4r/ut/ut_DvdFileStream.cpp: .text start:0x8042B6F0 end:0x8042BDAC diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 7d56a0ca..669414f7 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -23969,8 +23969,8 @@ CancelAsync__Q34nw4r2ut10FileStreamFPFlPQ34nw4r2ut8IOStreamPv_vPv = .text:0x8042 Skip__Q44nw4r2ut10FileStream12FilePositionFl = .text:0x8042B580; // type:function size:0x64 Append__Q44nw4r2ut10FileStream12FilePositionFl = .text:0x8042B5F0; // type:function size:0x50 Seek__Q44nw4r2ut10FileStream12FilePositionFlUl = .text:0x8042B640; // type:function size:0x88 -GetRuntimeTypeInfo__Q34nw4r2ut10FileStreamCFv = .text:0x8042B6D0; // type:function size:0x8 -__sinit_\ut_FileStream_cpp = .text:0x8042B6E0; // type:function size:0xC +GetRuntimeTypeInfo__Q34nw4r2ut10FileStreamCFv = .text:0x8042B6D0; // type:function size:0x8 scope:weak +__sinit_\ut_FileStream_cpp = .text:0x8042B6E0; // type:function size:0xC scope:local DvdAsyncCallback___Q34nw4r2ut13DvdFileStreamFlP11DVDFileInfo = .text:0x8042B6F0; // type:function size:0x2C DvdCBAsyncCallback___Q34nw4r2ut13DvdFileStreamFlP15DVDCommandBlock = .text:0x8042B720; // type:function size:0x28 __ct__Q34nw4r2ut13DvdFileStreamFl = .text:0x8042B750; // type:function size:0xBC @@ -40809,7 +40809,7 @@ lbl_80576580 = .sbss:0x80576580; // type:object size:0x1 data:byte lbl_80576584 = .sbss:0x80576584; // type:object size:0x4 data:4byte lbl_80576588 = .sbss:0x80576588; // type:object size:0x8 data:4byte typeInfo__Q34nw4r2ut8IOStream = .sbss:0x80576590; // type:object size:0x4 data:4byte -lbl_80576598 = .sbss:0x80576598; // type:object size:0x8 data:4byte +typeInfo__Q34nw4r2ut10FileStream = .sbss:0x80576598; // type:object size:0x4 data:4byte lbl_805765A0 = .sbss:0x805765A0; // type:object size:0x8 data:4byte lbl_805765A8 = .sbss:0x805765A8; // type:object size:0x8 data:4byte lbl_805765B0 = .sbss:0x805765B0; // type:object size:0x8 diff --git a/configure.py b/configure.py index 07061c3d..830c0c10 100644 --- a/configure.py +++ b/configure.py @@ -324,7 +324,7 @@ config.libs = [ Object(NonMatching, "nw4r/ut/ut_CharStrmReader.cpp"), Object(Matching, "nw4r/ut/ut_IOStream.cpp"), Object(Matching, "nw4r/ut/ut_TagProcessorBase.cpp"), - Object(NonMatching, "nw4r/ut/ut_FileStream.cpp"), + Object(Matching, "nw4r/ut/ut_FileStream.cpp"), Object(NonMatching, "nw4r/ut/ut_DvdFileStream.cpp"), Object(NonMatching, "nw4r/ut/ut_DvdLockedFileStream.cpp"), Object(NonMatching, "nw4r/ut/ut_NandFileStream.cpp"), diff --git a/include/nw4r/ut/ut_FileStream.h b/include/nw4r/ut/ut_FileStream.h index 99e4b336..17328c42 100644 --- a/include/nw4r/ut/ut_FileStream.h +++ b/include/nw4r/ut/ut_FileStream.h @@ -16,14 +16,20 @@ public: public: FilePosition() : mFileSize(0), mFileOffset(0) {} - u32 GetFileSize() const { return mFileSize; } - void SetFileSize(u32 fileSize) { mFileSize = fileSize; } + u32 GetFileSize() const { + return mFileSize; + } + void SetFileSize(unsigned long fileSize) { + mFileSize = fileSize; + } - u32 Tell() const { return mFileOffset; } + u32 Tell() const { + return mFileOffset; + } - u32 Skip(s32 offset); - u32 Append(s32 offset); - void Seek(s32 offset, u32 origin); + u32 Skip(long offset); + u32 Append(long offset); + void Seek(long offset, unsigned long origin); private: u32 mFileSize; // at 0x0 @@ -35,9 +41,9 @@ public: virtual ~FileStream() {} // at 0xC virtual u32 GetSize() const = 0; // at 0x40 - virtual void Seek(s32 offset, u32 origin); // at 0x44 + virtual void Seek(long offset, unsigned long origin); // at 0x44 virtual void Cancel(); // at 0x48 - virtual bool CancelAsync(AsyncCallback callback, void* arg); // at 0x4C + virtual bool CancelAsync(AsyncCallback callback, void *arg); // at 0x4C virtual bool CanSeek() const = 0; // at 0x50 virtual bool CanCancel() const = 0; // at 0x54 virtual u32 Tell() const = 0; // at 0x58 diff --git a/src/nw4r/ut/ut_FileStream.cpp b/src/nw4r/ut/ut_FileStream.cpp index e69de29b..a7b68cd0 100644 --- a/src/nw4r/ut/ut_FileStream.cpp +++ b/src/nw4r/ut/ut_FileStream.cpp @@ -0,0 +1,58 @@ +#include + +namespace nw4r { +namespace ut { + +NW4R_UT_RTTI_DEF_DERIVED(FileStream, IOStream); + +void FileStream::Cancel() {} + +bool FileStream::CancelAsync(AsyncCallback callback, void *arg) { +#pragma unused(callback) +#pragma unused(arg) + return true; +} + +u32 FileStream::FilePosition::Skip(long offset) { + if (offset != 0) { + s64 newOffset = mFileOffset + offset; + mFileOffset = Clamp(newOffset, 0, mFileSize); + } + + return mFileOffset; +} + +u32 FileStream::FilePosition::Append(long offset) { + s64 newOffset = mFileOffset + offset; + + if (newOffset < 0) { + mFileOffset = 0; + } else { + mFileOffset = newOffset; + mFileSize = Max(mFileOffset, mFileSize); + } + + return mFileOffset; +} + +void FileStream::FilePosition::Seek(long offset, unsigned long origin) { + switch (origin) { + case SEEK_BEG: + mFileOffset = 0; + break; + case SEEK_END: + mFileOffset = mFileSize; + break; + case SEEK_CUR: + default: + break; + } + + Skip(offset); +} + +// TODO: This should not be necessary. Because of nw4r::snd? still the case for ss +DECOMP_FORCEACTIVE(ut_FileStream_cpp, FileStream::GetRuntimeTypeInfo); + +} // namespace ut +} // namespace nw4r