From 676df7e1502c20fb657623fc9af24d8cfdca7442 Mon Sep 17 00:00:00 2001 From: Danilo Date: Thu, 9 May 2024 09:13:26 -0300 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=B5es=20em=20Content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/content/lzx/decoderstream.hpp | 1 + framework/content/manager.hpp | 7 ++- framework/csharp/stream.cpp | 4 +- framework/csharp/stream.hpp | 70 ++++++++++++++++++++++++- framework/enums.hpp | 9 ++++ framework/xna.cpp | 2 +- 6 files changed, 87 insertions(+), 6 deletions(-) diff --git a/framework/content/lzx/decoderstream.hpp b/framework/content/lzx/decoderstream.hpp index eac4f41..882a5bf 100644 --- a/framework/content/lzx/decoderstream.hpp +++ b/framework/content/lzx/decoderstream.hpp @@ -82,6 +82,7 @@ namespace xna { void Write(Byte const* buffer, Int bufferLength, Int offset, Int count, xna_error_nullarg) override; void Write(std::vector const& buffer, Int offset, Int count, xna_error_nullarg) override; void WriteByte(Byte value, xna_error_nullarg) override; + virtual constexpr bool IsClosed() override { return false; } }; } diff --git a/framework/content/manager.hpp b/framework/content/manager.hpp index fd88fc6..a1a6ff7 100644 --- a/framework/content/manager.hpp +++ b/framework/content/manager.hpp @@ -44,6 +44,10 @@ namespace xna { template T ReadAsset(String const& assetName) { auto input = OpenStream(assetName); + + if (input->IsClosed()) + return T(); + auto contentReader = ContentReader::Create(this, input, assetName); return contentReader->ReadAsset(); @@ -51,7 +55,8 @@ namespace xna { sptr OpenStream(String const& assetName) { String filePath = _rootDirectory + "\\" + assetName + contentExtension; - const auto stream = New(filePath); + const auto stream = New(filePath, FileMode::Open); + //const auto stream = New(filePath); return reinterpret_pointer_cast(stream); } diff --git a/framework/csharp/stream.cpp b/framework/csharp/stream.cpp index 67089dc..39277df 100644 --- a/framework/csharp/stream.cpp +++ b/framework/csharp/stream.cpp @@ -165,7 +165,7 @@ namespace xna { return -1; } - if (_closed) + if (_closed || _truncated) return 0; auto _buff = reinterpret_cast(buffer); @@ -184,7 +184,7 @@ namespace xna { } Int FileStream::ReadByte(xna_error_ptr_arg){ - if (_closed) + if (_closed || _truncated) return 0; char c = 0; diff --git a/framework/csharp/stream.hpp b/framework/csharp/stream.hpp index bdf28a9..d41b8df 100644 --- a/framework/csharp/stream.hpp +++ b/framework/csharp/stream.hpp @@ -14,6 +14,7 @@ namespace xna { virtual Int Length() = 0; virtual Long Position() = 0; virtual void Close() = 0; + virtual bool IsClosed() = 0; virtual Long Seek(Long offset, SeekOrigin const& origin, xna_error_nullarg) = 0; virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count, xna_error_nullarg) = 0; virtual Int Read(std::vector& buffer, Int offset, Int count, xna_error_nullarg) = 0; @@ -48,6 +49,10 @@ namespace xna { _buffer = std::vector(); } + virtual constexpr bool IsClosed() override { + return _closed; + } + virtual Long Seek(Long offset, SeekOrigin const& origin, xna_error_nullarg) override; virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count, xna_error_nullarg) override; virtual Int Read(std::vector& buffer, Int offset, Int count, xna_error_nullarg) override; @@ -66,7 +71,63 @@ namespace xna { class FileStream : public Stream { public: - FileStream(std::string const& path){ + FileStream(String const& path, FileMode fileMode) { + int flags = std::fstream::in + | std::fstream::out + | std::fstream::binary; + + const auto exists = std::filesystem::exists(path); + + switch (fileMode) + { + //Especifica se deve abrir um arquivo existente. + case FileMode::Open: + if (!exists) { + _closed = true; + return; + } + break; + //Especifica que se deve abrir um arquivo, se existir; + // caso contrário, um novo arquivo deverá ser criado. + case FileMode::OpenOrCreate: + case FileMode::Create: + if (!exists) + flags |= std::fstream::trunc; + break; + //Especifica que o sistema operacional deve criar um novo arquivo. + //Se o arquivo já existir, não abre o arquivo. + case FileMode::CreateNew: + if (!exists) + flags |= std::fstream::trunc; + else + return; + break; + //Abre o arquivo, se existir, e busca o final do arquivo ou cria um novo arquivo. + case FileMode::Append: + if (!exists) + flags |= std::fstream::trunc; + else + flags |= std::fstream::app; + break; + //Especifica que se deve abrir um arquivo existente. + //Quando o arquivo for aberto, ele deverá ser truncado + //para que seu tamanho seja zero bytes. + //Tentativa de ler um arquivo truncado retornará 0; + case FileMode::Truncate: + flags |= std::fstream::trunc; + _truncated = true; + break; + default: + break; + } + + _fstream.open(path.c_str(), flags); + + if (!_fstream.good()) + _closed = true; + } + + FileStream(String const& path){ int flags = std::fstream::in | std::fstream::out | std::fstream::binary; @@ -79,7 +140,7 @@ namespace xna { _fstream.open(path.c_str(), flags); - if (!_fstream.is_open()) + if (!_fstream.good()) _closed = true; } @@ -109,6 +170,10 @@ namespace xna { _fstream.close(); } + virtual constexpr bool IsClosed() override { + return _closed; + } + virtual Long Seek(Long offset, SeekOrigin const& origin, xna_error_nullarg) override; virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count, xna_error_nullarg) override; virtual Int Read(std::vector& buffer, Int offset, Int count, xna_error_nullarg) override; @@ -123,6 +188,7 @@ namespace xna { private: std::streampos _filesize{ 0 }; bool _closed{ false }; + bool _truncated{ false }; Int endOfFile() { if (_closed) diff --git a/framework/enums.hpp b/framework/enums.hpp index 0e2fa74..62ba815 100644 --- a/framework/enums.hpp +++ b/framework/enums.hpp @@ -165,6 +165,15 @@ namespace xna { Stretched = 2 }; + enum class FileMode { + CreateNew, + Create, + Append, + Open, + OpenOrCreate, + Truncate + }; + enum class FillMode { WireFrame, diff --git a/framework/xna.cpp b/framework/xna.cpp index f7e5296..86e6e80 100644 --- a/framework/xna.cpp +++ b/framework/xna.cpp @@ -28,7 +28,7 @@ namespace xna { void LoadContent() override { spriteBatch = New(*graphicsDevice); - texture = Content()->Load("idlse"); + texture = Content()->Load("idle"); Game::LoadContent(); }