diff --git a/shadPS4/Types.h b/shadPS4/Types.h new file mode 100644 index 00000000..0d8de2da --- /dev/null +++ b/shadPS4/Types.h @@ -0,0 +1,14 @@ +#pragma once + +using S08 = char; +using S16 = short; +using S32 = int; +using S64 = long long; + +using U08 = unsigned char; +using U16 = unsigned short; +using U32 = unsigned int; +using U64 = unsigned long long; + +using F32 = float; +using F64 = double; diff --git a/shadPS4/core/FsFile.cpp b/shadPS4/core/FsFile.cpp new file mode 100644 index 00000000..311fc8e5 --- /dev/null +++ b/shadPS4/core/FsFile.cpp @@ -0,0 +1,90 @@ +#include "FsFile.h" + +FsFile::FsFile() +{ + m_file = nullptr; +} +FsFile::FsFile(const std::string& path, fsOpenMode mode) +{ + Open(path, mode); +} +bool FsFile::Open(const std::string& path, fsOpenMode mode) +{ + Close(); + fopen_s(&m_file, path.c_str(), getOpenMode(mode)); + return IsOpen(); +} +bool FsFile::Close() +{ + if (!IsOpen() || std::fclose(m_file) != 0) { + m_file = nullptr; + return false; + } + + m_file = nullptr; + return true; +} +FsFile::~FsFile() +{ + Close(); +} + +bool FsFile::Write(const void* src, U64 size) +{ + if (!IsOpen() || std::fwrite(src, 1, size, m_file) != size) { + return false; + } + return true; +} + +bool FsFile::Read(void* dst, U64 size) +{ + if (!IsOpen() || std::fread(dst, 1, size, m_file) != size) { + return false; + } + return true; +} + +U32 FsFile::ReadBytes(void* dst, U64 size) +{ + return std::fread(dst, 1, size, m_file); +} + +bool FsFile::Seek(S64 offset, fsSeekMode mode) +{ + if (!IsOpen() || _fseeki64(m_file, offset, getSeekMode(mode)) != 0) { + return false; + } + return true; +} + +U64 FsFile::Tell() const +{ + if (IsOpen()) { + return _ftelli64(m_file); + } + else { + return -1; + } +} +U64 FsFile::getFileSize() +{ + U64 pos = _ftelli64(m_file); + if (_fseeki64(m_file, 0, SEEK_END) != 0) { + + return 0; + } + + U64 size = _ftelli64(m_file); + if (_fseeki64(m_file, pos, SEEK_SET) != 0) { + + return 0; + } + return size; +} + +bool FsFile::IsOpen() const +{ + return m_file != nullptr; +} + diff --git a/shadPS4/core/FsFile.h b/shadPS4/core/FsFile.h new file mode 100644 index 00000000..705fad6f --- /dev/null +++ b/shadPS4/core/FsFile.h @@ -0,0 +1,64 @@ +#pragma once +#include +#include +#include "../Types.h" + +enum fsOpenMode +{ + fsRead = 0x1, + fsWrite = 0x2, + fsReadWrite = fsRead | fsWrite +}; + +enum fsSeekMode +{ + fsSeekSet, + fsSeekCur, + fsSeekEnd, +}; + +class FsFile +{ + std::FILE* m_file; +public: + FsFile(); + FsFile(const std::string& path, fsOpenMode mode = fsRead); + bool Open(const std::string& path, fsOpenMode mode = fsRead); + bool IsOpen() const; + bool Close(); + bool Read(void* dst, U64 size); + U32 ReadBytes(void* dst, U64 size); + bool Write(const void* src, U64 size); + bool Seek(S64 offset, fsSeekMode mode); + U64 getFileSize(); + U64 Tell() const; + ~FsFile(); + + + const char* getOpenMode(fsOpenMode mode) + { + switch (mode) { + case fsRead: return "rb"; + case fsWrite: return "wb"; + case fsReadWrite: return "r+b"; + } + + return "r"; + } + + const int getSeekMode(fsSeekMode mode) + { + switch (mode) { + case fsSeekSet: return SEEK_SET; + case fsSeekCur: return SEEK_CUR; + case fsSeekEnd: return SEEK_END; + } + + return SEEK_SET; + } + std::FILE* fileDescr() + { + return m_file; + } +}; + diff --git a/shadPS4/shadPS4.vcxproj b/shadPS4/shadPS4.vcxproj index 08b10862..56ef7d75 100644 --- a/shadPS4/shadPS4.vcxproj +++ b/shadPS4/shadPS4.vcxproj @@ -11,6 +11,7 @@ + @@ -24,6 +25,10 @@ + + + + {F005E4D9-1FBE-40B3-9FBD-35CEC59081CD} QtVS_v304 diff --git a/shadPS4/shadPS4.vcxproj.filters b/shadPS4/shadPS4.vcxproj.filters index 8c5d400f..5b6e92a3 100644 --- a/shadPS4/shadPS4.vcxproj.filters +++ b/shadPS4/shadPS4.vcxproj.filters @@ -24,6 +24,9 @@ {29ee17bd-9ad4-44e8-b1cd-b4be13ec6509} + + {73d07238-8864-48b5-9987-e455fa73c82f} + @@ -35,6 +38,9 @@ gui + + Core + @@ -49,4 +55,12 @@ gui + + + Header Files + + + Core + + \ No newline at end of file