diff options
| -rw-r--r-- | zencore/compactbinarypackage.cpp | 14 | ||||
| -rw-r--r-- | zencore/include/zencore/compactbinarypackage.h | 5 | ||||
| -rw-r--r-- | zenserver/projectstore.cpp | 15 | ||||
| -rw-r--r-- | zenserver/projectstore.h | 1 |
4 files changed, 29 insertions, 6 deletions
diff --git a/zencore/compactbinarypackage.cpp b/zencore/compactbinarypackage.cpp index 21883f5b1..9eb67ac93 100644 --- a/zencore/compactbinarypackage.cpp +++ b/zencore/compactbinarypackage.cpp @@ -299,12 +299,12 @@ CbPackage::GatherAttachments(const CbFieldViewIterator& Fields, AttachmentResolv } void -CbPackage::Load(IoBuffer& InBuffer, BufferAllocator Allocator) +CbPackage::Load(IoBuffer& InBuffer, BufferAllocator Allocator, AttachmentResolver* Mapper) { MemoryInStream InStream(InBuffer.Data(), InBuffer.Size()); BinaryReader Reader(InStream); - Load(Reader, Allocator); + Load(Reader, Allocator, Mapper); } void @@ -345,7 +345,7 @@ CbPackage::Load(CbFieldIterator& Fields) } void -CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator) +CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResolver* Mapper) { uint8_t StackBuffer[64]; const auto StackAllocator = [&Allocator, &StackBuffer](uint64_t Size) -> UniqueBuffer { @@ -386,6 +386,14 @@ CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator) } } } + else if (ValueField.IsHash()) + { + const IoHash Hash = ValueField.AsHash(); + + ZEN_ASSERT(Mapper); + + AddAttachment(CbAttachment((*Mapper)(Hash), Hash)); + } else { ZEN_ASSERT(ValueField.IsObject(), "Expected Object, Binary, or Null field when loading a package"); diff --git a/zencore/include/zencore/compactbinarypackage.h b/zencore/include/zencore/compactbinarypackage.h index c98ab047f..03098f494 100644 --- a/zencore/include/zencore/compactbinarypackage.h +++ b/zencore/include/zencore/compactbinarypackage.h @@ -16,6 +16,7 @@ class CbWriter; class BinaryReader; class BinaryWriter; class IoBuffer; +class CbAttachment; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -278,9 +279,9 @@ public: */ ZENCORE_API void Load(CbFieldIterator& Fields); - ZENCORE_API void Load(IoBuffer& Buffer, BufferAllocator Allocator = UniqueBuffer::Alloc); + ZENCORE_API void Load(IoBuffer& Buffer, BufferAllocator Allocator = UniqueBuffer::Alloc, AttachmentResolver* Mapper = nullptr); - ZENCORE_API void Load(BinaryReader& Reader, BufferAllocator Allocator = UniqueBuffer::Alloc); + ZENCORE_API void Load(BinaryReader& Reader, BufferAllocator Allocator = UniqueBuffer::Alloc, AttachmentResolver* Mapper = nullptr); /** Save the object and attachments into the writer as a stream of compact binary fields. */ ZENCORE_API void Save(CbWriter& Writer) const; diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 0dc0da1ae..c2c8c2421 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -1057,8 +1057,21 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) IoBuffer Payload = HttpReq.ReadPayload(); + CbPackage::AttachmentResolver Resolver = [&](const IoHash& Hash) -> SharedBuffer { + std::filesystem::path AttachmentPath = Log.TempPath() / Hash.ToHexString(); + + if (IoBuffer Data = IoBufferBuilder::MakeFromFile(AttachmentPath.native().c_str())) + { + return SharedBuffer::Clone(MemoryView(Data.Data(), Data.Size())); + } + else + { + return {}; + } + }; + CbPackage Package; - Package.Load(Payload); + Package.Load(Payload, &UniqueBuffer::Alloc, &Resolver); CbObject Core = Package.GetObject(); diff --git a/zenserver/projectstore.h b/zenserver/projectstore.h index 4ad0e42e0..0b41b837b 100644 --- a/zenserver/projectstore.h +++ b/zenserver/projectstore.h @@ -88,6 +88,7 @@ public: const std::string& OplogId() const { return m_OplogId; } const std::wstring& TempDir() const { return m_TempPath.native(); } + const std::filesystem::path& TempPath() const { return m_TempPath; } spdlog::logger& Log() { return m_OuterProject->Log(); } |