diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/src/Model/Template/Template_Main.cpp | 29 | ||||
-rw-r--r-- | core/src/Model/Workflow/Workflow_Main.cpp | 46 | ||||
-rw-r--r-- | core/src/Utils/IO/Archive.cpp | 8 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 2 | ||||
-rw-r--r-- | core/src/Utils/IO/FileStream.hpp | 4 |
5 files changed, 45 insertions, 44 deletions
diff --git a/core/src/Model/Template/Template_Main.cpp b/core/src/Model/Template/Template_Main.cpp index 49187d3..4d6b67c 100644 --- a/core/src/Model/Template/Template_Main.cpp +++ b/core/src/Model/Template/Template_Main.cpp @@ -4,8 +4,7 @@ #include "Model/Project.hpp" #include "UI/UI.hpp" #include "Utils/I18n.hpp" -#include "Utils/IO/DataStream.hpp" -#include "Utils/IO/FileStream.hpp" +#include "Utils/IO/Archive.hpp" #include "Utils/UUID.hpp" #include <imgui.h> @@ -35,17 +34,14 @@ void TemplateAssetList::DiscoverFiles(const std::function<void(SavedAsset)>& cal std::string TemplateAssetList::RetrieveNameFromFile(const fs::path& file) const { - std::ifstream ifs(file); - if (!ifs) return ""; + auto res = DataArchive::LoadFile(file); + if (!res) return ""; + auto& stream = res.value(); - uint64_t len; - ifs >> len; - - std::string name; - name.reserve(len); - std::copy_n(std::istreambuf_iterator(ifs), len, std::back_inserter(name)); + SavedAsset assetInfo; + stream.ReadObject(assetInfo); - return name; + return assetInfo.Name; } uuids::uuid TemplateAssetList::RetrieveUuidFromFile(const fs::path& file) const @@ -62,10 +58,13 @@ fs::path TemplateAssetList::RetrievePathFromAsset(const SavedAsset& asset) const bool TemplateAssetList::SaveInstance(const SavedAsset& assetInfo, const Asset* asset) const { auto path = RetrievePathFromAsset(assetInfo); - auto stream = OutputDataStream(OutputFileStream(path, OutputFileStream::TruncateFile)); + auto res = DataArchive::SaveFile(path); + if (!res) return false; + auto& stream = res.value(); stream.WriteObject(assetInfo); - if (auto tmpl = static_cast<const Template*>(asset)) { + // This cast is fine: calls to this class will always be wrapped in TypedAssetList<T>, which will ensure `asset` points to some Template + if (auto tmpl = static_cast<const Template*>(asset)) { // NOLINT(cppcoreguidelines-pro-type-static-cast-downcast) stream.WriteObject(*tmpl); } @@ -74,7 +73,9 @@ bool TemplateAssetList::SaveInstance(const SavedAsset& assetInfo, const Asset* a static std::unique_ptr<Template> LoadTemplateFromFile(const fs::path& path) { - auto stream = InputDataStream(InputFileStream(path)); + auto res = DataArchive::LoadFile(path); + if (!res) return nullptr; + auto& stream = res.value(); SavedAsset assetInfo; stream.ReadObject(assetInfo); diff --git a/core/src/Model/Workflow/Workflow_Main.cpp b/core/src/Model/Workflow/Workflow_Main.cpp index d502413..1f00b19 100644 --- a/core/src/Model/Workflow/Workflow_Main.cpp +++ b/core/src/Model/Workflow/Workflow_Main.cpp @@ -4,6 +4,7 @@ #include "Model/Project.hpp" #include "UI/UI.hpp" #include "Utils/I18n.hpp" +#include "Utils/IO/Archive.hpp" #include "Utils/UUID.hpp" #include <imgui.h> @@ -754,17 +755,14 @@ void WorkflowAssetList::DiscoverFiles(const std::function<void(SavedAsset)>& cal std::string WorkflowAssetList::RetrieveNameFromFile(const fs::path& file) const { - std::ifstream ifs(file); - if (!ifs) return ""; + auto res = DataArchive::LoadFile(file); + if (!res) return ""; + auto& stream = res.value(); - uint64_t len; - ifs >> len; + SavedAsset assetInfo; + stream.ReadObject(assetInfo); - std::string name; - name.reserve(len); - std::copy_n(std::istreambuf_iterator(ifs), len, std::back_inserter(name)); - - return name; + return assetInfo.Name; } uuids::uuid WorkflowAssetList::RetrieveUuidFromFile(const fs::path& file) const @@ -781,14 +779,14 @@ fs::path WorkflowAssetList::RetrievePathFromAsset(const SavedAsset& asset) const bool WorkflowAssetList::SaveInstance(const SavedAsset& assetInfo, const Asset* asset) const { auto path = RetrievePathFromAsset(assetInfo); + auto res = DataArchive::SaveFile(path); + if (!res) return false; + auto& stream = res.value(); - std::ofstream ofs(path); - if (!ofs) return false; - ofs << (uint64_t)assetInfo.Name.size(); - ofs << assetInfo.Name; - - if (auto workflow = static_cast<const Workflow*>(asset)) { - workflow->WriteTo(ofs); + stream.WriteObject(assetInfo); + // This cast is fine: calls to this class will always be wrapped in TypedAssetList<T>, which will ensure `asset` points to some Workflow + if (auto workflow = static_cast<const Workflow*>(asset)) { // NOLINT(cppcoreguidelines-pro-type-static-cast-downcast) + stream.WriteObject(*workflow); } return true; @@ -796,18 +794,16 @@ bool WorkflowAssetList::SaveInstance(const SavedAsset& assetInfo, const Asset* a static std::unique_ptr<Workflow> LoadWorkflowFromFile(const fs::path& path) { - std::ifstream ifs(path); - if (!ifs) return nullptr; + auto res = DataArchive::LoadFile(path); + if (!res) return nullptr; + auto& stream = res.value(); - // TODO fix serialization - uint64_t nameSize; - ifs >> nameSize; - ifs.seekg(nameSize, std::ios::end); + // TODO this is currently unused + SavedAsset assetInfo; + stream.ReadObject(assetInfo); auto workflow = std::make_unique<Workflow>(); - if (workflow->ReadFrom(ifs) != Workflow::RR_Success) { - return nullptr; - } + stream.ReadObject(*workflow); return workflow; } diff --git a/core/src/Utils/IO/Archive.cpp b/core/src/Utils/IO/Archive.cpp index aa47b67..f6e7b27 100644 --- a/core/src/Utils/IO/Archive.cpp +++ b/core/src/Utils/IO/Archive.cpp @@ -17,7 +17,9 @@ std::span<const uint8_t, 8> DataArchive::GetMagicNumbers() std::optional<InputDataStream> DataArchive::LoadFile(const std::filesystem::path& path) { - auto stream = InputDataStream(InputFileStream(path)); + InputFileStream fileStream(path); + fileStream.SetReadInSize(1024); + InputDataStream stream(std::move(fileStream)); uint8_t magicNumbers[kMagicNumberCount]; stream.ReadBytes(kMagicNumberCount, magicNumbers); @@ -42,7 +44,9 @@ std::optional<InputDataStream> DataArchive::LoadFile(const std::filesystem::path std::optional<OutputDataStream> DataArchive::SaveFile(const std::filesystem::path& path) { - auto stream = OutputDataStream(OutputFileStream(path, OutputFileStream::TruncateFile)); + OutputFileStream fileStream(path, OutputFileStream::TruncateFile); + fileStream.SetMaxBufferSize(1024); + OutputDataStream stream(std::move(fileStream)); stream.WriteBytes(kMagicNumberCount, kMagicNumbers); stream.Write(kByteOrderMark); diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp index 3c00f4c..c0891ac 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -164,7 +164,7 @@ public: } template <class TObject> - void WriteObject(const TObject& obj) + void WriteObject(const TObject& obj) { obj.WriteToDataStream(*this); } diff --git a/core/src/Utils/IO/FileStream.hpp b/core/src/Utils/IO/FileStream.hpp index 224f3b6..9f5f24a 100644 --- a/core/src/Utils/IO/FileStream.hpp +++ b/core/src/Utils/IO/FileStream.hpp @@ -29,7 +29,7 @@ private: // mBuffer is always mReadInSize size std::unique_ptr<std::byte[]> mBuffer; - int mReadInSize = 1024; + int mReadInSize; int mFirstByteIdx = 0; int mAvailableBytes = 0; @@ -65,7 +65,7 @@ public: private: alignas(void*) char mOsFileHandle[sizeof(void*)]; std::unique_ptr<std::byte[]> mBuffer; - int mMaxBufferSize = 1024; + int mMaxBufferSize; int mCurrentBufferSize = 0; public: |