aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/Model/Template/Template_Main.cpp29
-rw-r--r--core/src/Model/Workflow/Workflow_Main.cpp46
-rw-r--r--core/src/Utils/IO/Archive.cpp8
-rw-r--r--core/src/Utils/IO/DataStream.hpp2
-rw-r--r--core/src/Utils/IO/FileStream.hpp4
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: