diff --git a/components/files/constrainedfilestreambuf.hpp b/components/files/constrainedfilestreambuf.hpp index 0808ba6a9c..bb9d6ca89e 100644 --- a/components/files/constrainedfilestreambuf.hpp +++ b/components/files/constrainedfilestreambuf.hpp @@ -22,7 +22,7 @@ namespace Files private: std::size_t mOrigin; std::size_t mSize; - Platform::File::Handle mFile{ Platform::File::Handle::Invalid }; + Platform::File::ScopedHandle mFile; char mBuffer[8192]{ 0 }; }; } diff --git a/components/platform/file.hpp b/components/platform/file.hpp index d0d5eb0399..8faf9c67cb 100644 --- a/components/platform/file.hpp +++ b/components/platform/file.hpp @@ -29,7 +29,36 @@ namespace Platform::File { size_t read(Handle handle, void* data, size_t size); + class ScopedHandle + { + Handle mHandle{ Handle::Invalid }; + + public: + ScopedHandle() noexcept = default; + ScopedHandle(ScopedHandle& other) = delete; + ScopedHandle(Handle handle) noexcept : mHandle(handle) {} + ScopedHandle(ScopedHandle&& other) noexcept + : mHandle(other.mHandle) + { + other.mHandle = Handle::Invalid; + } + ScopedHandle& operator=(const ScopedHandle& other) = delete; + ScopedHandle& operator=(ScopedHandle&& other) noexcept + { + if (mHandle != Handle::Invalid) + close(mHandle); + mHandle = other.mHandle; + other.mHandle = Handle::Invalid; + return *this; + } + ~ScopedHandle() + { + if(mHandle != Handle::Invalid) + close(mHandle); + } + operator Handle() const { return mHandle; } + }; } #endif // OPENMW_COMPONENTS_PLATFORM_FILE_HPP