diff options
Diffstat (limited to 'zencore/compactbinarypackage.cpp')
| -rw-r--r-- | zencore/compactbinarypackage.cpp | 136 |
1 files changed, 85 insertions, 51 deletions
diff --git a/zencore/compactbinarypackage.cpp b/zencore/compactbinarypackage.cpp index 5b659ef39..b0dbd2918 100644 --- a/zencore/compactbinarypackage.cpp +++ b/zencore/compactbinarypackage.cpp @@ -97,28 +97,35 @@ CbAttachment::AsCompactBinary() const return CompactBinary ? CbFieldIterator::MakeRangeView(CompactBinary, Buffer) : CbFieldIterator(); } -void -CbAttachment::Load(IoBuffer& InBuffer, BufferAllocator Allocator) +bool +CbAttachment::TryLoad(IoBuffer& InBuffer, BufferAllocator Allocator) { MemoryInStream InStream(InBuffer.Data(), InBuffer.Size()); BinaryReader Reader(InStream); - Load(Reader, Allocator); + return TryLoad(Reader, Allocator); } -void -CbAttachment::Load(CbFieldIterator& Fields) +bool +CbAttachment::TryLoad(CbFieldIterator& Fields) { - ZEN_ASSERT(Fields.IsBinary()); //, TEXT("Attachments must start with a binary field.")); const MemoryView View = Fields.AsBinaryView(); + if (Fields.HasError()) + { + return false; + } + if (View.GetSize() > 0) { Buffer = SharedBuffer::MakeView(View, Fields.GetOuterBuffer()); Buffer.MakeOwned(); ++Fields; Hash = Fields.AsAttachment(); - ZEN_ASSERT(!Fields.HasError()); // TEXT("Attachments must be a non-empty binary value with a content hash.")); - if (Fields.IsCompactBinaryAttachment()) + if (Fields.HasError()) + { + return false; + } + if (Fields.IsObjectAttachment()) { CompactBinary = CbFieldViewIterator::MakeRange(Buffer); } @@ -131,14 +138,19 @@ CbAttachment::Load(CbFieldIterator& Fields) CompactBinary.Reset(); Hash = IoHash::Zero; } + + return true; } -void -CbAttachment::Load(BinaryReader& Reader, BufferAllocator Allocator) +bool +CbAttachment::TryLoad(BinaryReader& Reader, BufferAllocator Allocator) { - CbField BufferField = LoadCompactBinary(Reader, Allocator); - ZEN_ASSERT(BufferField.IsBinary(), "Attachments must start with a binary field"); - const MemoryView View = BufferField.AsBinaryView(); + CbField BufferField = LoadCompactBinary(Reader, Allocator); + const MemoryView View = BufferField.AsBinaryView(); + if (BufferField.HasError()) + { + return false; + } if (View.GetSize() > 0) { Buffer = SharedBuffer::MakeView(View, BufferField.GetOuterBuffer()); @@ -151,8 +163,11 @@ CbAttachment::Load(BinaryReader& Reader, BufferAllocator Allocator) return UniqueBuffer::MakeMutableView(HashBuffer.data(), Size); }); Hash = HashField.AsAttachment(); - ZEN_ASSERT(!HashField.HasError(), "Attachments must be a non-empty binary value with a content hash."); - if (HashField.IsCompactBinaryAttachment()) + if (HashField.HasError() || IoHash::HashMemory(Buffer) != Hash) + { + return false; + } + if (HashField.IsObjectAttachment()) { CompactBinary = CbFieldViewIterator::MakeRange(Buffer); } @@ -163,6 +178,7 @@ CbAttachment::Load(BinaryReader& Reader, BufferAllocator Allocator) CompactBinary.Reset(); Hash = IoHash::Zero; } + return true; } void @@ -179,7 +195,7 @@ CbAttachment::Save(CbWriter& Writer) const { Writer.AddBinary(AsBinaryView()); } - Writer.AddCompactBinaryAttachment(Hash); + Writer.AddObjectAttachment(Hash); } else if (Buffer && Buffer.GetSize()) { @@ -289,7 +305,7 @@ CbPackage::GatherAttachments(const CbFieldViewIterator& Fields, AttachmentResolv if (SharedBuffer Buffer = Resolver(Hash)) { - if (Field.IsCompactBinaryAttachment()) + if (Field.IsObjectAttachment()) { AddAttachment(CbAttachment(CbFieldIterator::MakeRange(std::move(Buffer)), Hash), &Resolver); } @@ -301,17 +317,17 @@ CbPackage::GatherAttachments(const CbFieldViewIterator& Fields, AttachmentResolv }); } -void -CbPackage::Load(IoBuffer& InBuffer, BufferAllocator Allocator, AttachmentResolver* Mapper) +bool +CbPackage::TryLoad(IoBuffer& InBuffer, BufferAllocator Allocator, AttachmentResolver* Mapper) { MemoryInStream InStream(InBuffer.Data(), InBuffer.Size()); BinaryReader Reader(InStream); - Load(Reader, Allocator, Mapper); + return TryLoad(Reader, Allocator, Mapper); } -void -CbPackage::Load(CbFieldIterator& Fields) +bool +CbPackage::TryLoad(CbFieldIterator& Fields) { *this = CbPackage(); while (Fields) @@ -324,19 +340,25 @@ CbPackage::Load(CbFieldIterator& Fields) else if (Fields.IsBinary()) { CbAttachment Attachment; - Attachment.Load(Fields); + Attachment.TryLoad(Fields); AddAttachment(Attachment); } else { - ZEN_ASSERT(Fields.IsObject(), TEXT("Expected Object, Binary, or Null field when loading a package.")); Object = Fields.AsObject(); + if (Fields->HasError()) + { + return false; + } Object.MakeOwned(); ++Fields; if (Object.CreateIterator()) { - ObjectHash = Fields.AsCompactBinaryAttachment(); - ZEN_ASSERT(!Fields.HasError(), TEXT("Object must be followed by a CompactBinaryReference with the object hash.")); + ObjectHash = Fields.AsObjectAttachment(); + if (Fields.HasError()) + { + return false; + } ++Fields; } else @@ -345,10 +367,12 @@ CbPackage::Load(CbFieldIterator& Fields) } } } + + return true; } -void -CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResolver* Mapper) +bool +CbPackage::TryLoad(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResolver* Mapper) { uint8_t StackBuffer[64]; const auto StackAllocator = [&Allocator, &StackBuffer](uint64_t Size) -> UniqueBuffer { @@ -365,9 +389,13 @@ CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResol for (;;) { CbField ValueField = LoadCompactBinary(Reader, StackAllocator); + if (!ValueField) + { + return false; + } if (ValueField.IsNull()) { - break; + return true; } else if (ValueField.IsBinary()) { @@ -379,7 +407,7 @@ CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResol CbField HashField = LoadCompactBinary(Reader, StackAllocator); const IoHash& Hash = HashField.AsAttachment(); ZEN_ASSERT(!HashField.HasError(), "Attachments must be a non-empty binary value with a content hash."); - if (HashField.IsCompactBinaryAttachment()) + if (HashField.IsObjectAttachment()) { AddAttachment(CbAttachment(CbFieldIterator::MakeRange(std::move(Buffer)), Hash)); } @@ -399,14 +427,20 @@ CbPackage::Load(BinaryReader& Reader, BufferAllocator Allocator, AttachmentResol } else { - ZEN_ASSERT(ValueField.IsObject(), "Expected Object, Binary, or Null field when loading a package"); Object = ValueField.AsObject(); + if (ValueField.HasError()) + { + return false; + } Object.MakeOwned(); if (Object.CreateViewIterator()) { CbField HashField = LoadCompactBinary(Reader, StackAllocator); - ObjectHash = HashField.AsCompactBinaryAttachment(); - ZEN_ASSERT(!HashField.HasError(), "Object must be followed by a CompactBinaryAttachment with the object hash."); + ObjectHash = HashField.AsObjectAttachment(); + if (HashField.HasError() || Object.GetHash() != ObjectHash) + { + return false; + } } else { @@ -422,7 +456,7 @@ CbPackage::Save(CbWriter& Writer) const if (Object.CreateIterator()) { Writer.AddObject(Object); - Writer.AddCompactBinaryAttachment(ObjectHash); + Writer.AddObjectAttachment(ObjectHash); } for (const CbAttachment& Attachment : Attachments) { @@ -463,17 +497,17 @@ TEST_CASE("usonpackage") CHECK(MakeMemoryView(WriteStream).EqualBytes(Fields.GetRangeBuffer().GetView())); CHECK(ValidateCompactBinaryRange(MakeMemoryView(WriteStream), CbValidateMode::All) == CbValidateError::None); - CHECK(ValidateCompactBinaryAttachment(MakeMemoryView(WriteStream), CbValidateMode::All) == CbValidateError::None); + CHECK(ValidateObjectAttachment(MakeMemoryView(WriteStream), CbValidateMode::All) == CbValidateError::None); CbAttachment FromFields; - FromFields.Load(Fields); + FromFields.TryLoad(Fields); CHECK(!bool(Fields)); CHECK(FromFields == Attachment); CbAttachment FromArchive; MemoryInStream InStream(MakeMemoryView(WriteStream)); BinaryReader Reader(InStream); - FromArchive.Load(Reader); + FromArchive.TryLoad(Reader); CHECK(Reader.CurrentOffset() == InStream.Size()); CHECK(FromArchive == Attachment); }; @@ -564,7 +598,7 @@ TEST_CASE("usonpackage") Attachment.Save(Writer); CbFieldIterator Fields = Writer.Save(); CbFieldIterator FieldsView = CbFieldIterator::MakeRangeView(CbFieldViewIterator(Fields)); - Attachment.Load(FieldsView); + Attachment.TryLoad(FieldsView); CHECK_FALSE(Attachment.IsNull()); CHECK(bool(Attachment)); @@ -590,7 +624,7 @@ TEST_CASE("usonpackage") CbFieldIterator Fields = Writer.Save(); CbFieldIterator FieldsView = CbFieldIterator::MakeRangeView(CbFieldViewIterator(Fields)); - Attachment.Load(FieldsView); + Attachment.TryLoad(FieldsView); CHECK_FALSE(Attachment.IsNull()); CHECK(bool(Attachment)); @@ -669,14 +703,14 @@ TEST_CASE("usonpackage.serialization") CHECK(ValidateCompactBinaryPackage(MakeMemoryView(MemStream), CbValidateMode::All) == CbValidateError::None); CbPackage FromFields; - FromFields.Load(Fields); + FromFields.TryLoad(Fields); CHECK_FALSE(bool(Fields)); CHECK(FromFields == Package); CbPackage FromArchive; MemoryInStream ReadMemStream(MakeMemoryView(MemStream)); BinaryReader ReadAr(ReadMemStream); - FromArchive.Load(ReadAr); + FromArchive.TryLoad(ReadAr); CHECK(ReadAr.CurrentOffset() == ReadMemStream.Size()); CHECK(FromArchive == Package); }; @@ -791,7 +825,7 @@ TEST_CASE("usonpackage.serialization") CbWriter Writer; Writer.SetName("Level3"); Writer.BeginArray(); - Writer.AddCompactBinaryAttachment(Level3Hash); + Writer.AddObjectAttachment(Level3Hash); Writer.EndArray(); Level2 = Writer.Save().AsArray(); } @@ -801,7 +835,7 @@ TEST_CASE("usonpackage.serialization") { CbWriter Writer; Writer.BeginObject(); - Writer.SetName("Level2").AddCompactBinaryAttachment(Level2Hash); + Writer.SetName("Level2").AddObjectAttachment(Level2Hash); Writer.EndObject(); Level1 = Writer.Save().AsObject(); } @@ -858,18 +892,18 @@ TEST_CASE("usonpackage.serialization") { CbWriter Writer; Writer.AddBinary(Level2.GetBuffer()); - Writer.AddCompactBinaryAttachment(Level2Hash); + Writer.AddObjectAttachment(Level2Hash); Writer.AddBinary(Level4); Writer.AddBinaryAttachment(Level4Hash); Writer.AddObject(Level1); - Writer.AddCompactBinaryAttachment(Level1Hash); + Writer.AddObjectAttachment(Level1Hash); Writer.AddBinary(Level3.GetBuffer()); - Writer.AddCompactBinaryAttachment(Level3Hash); + Writer.AddObjectAttachment(Level3Hash); Writer.AddNull(); CbFieldIterator Fields = Writer.Save(); CbPackage FromFields; - FromFields.Load(Fields); + FromFields.TryLoad(Fields); const CbAttachment* const Level2Attachment = FromFields.FindAttachment(Level2Hash); REQUIRE(Level2Attachment); @@ -902,22 +936,22 @@ TEST_CASE("usonpackage.serialization") CbPackage FromArchive; MemoryInStream ReadStream(MakeMemoryView(WriteStream)); BinaryReader ReadAr(ReadStream); - FromArchive.Load(ReadAr); + FromArchive.TryLoad(ReadAr); Writer.Reset(); FromArchive.Save(Writer); CbFieldIterator Saved = Writer.Save(); CHECK(Saved.AsObject().Equals(Level1)); ++Saved; - CHECK(Saved.AsCompactBinaryAttachment() == Level1Hash); + CHECK(Saved.AsObjectAttachment() == Level1Hash); ++Saved; CHECK(Saved.AsBinaryView().EqualBytes(Level2.GetView())); ++Saved; - CHECK(Saved.AsCompactBinaryAttachment() == Level2Hash); + CHECK(Saved.AsObjectAttachment() == Level2Hash); ++Saved; CHECK(Saved.AsBinaryView().EqualBytes(Level3.GetView())); ++Saved; - CHECK(Saved.AsCompactBinaryAttachment() == Level3Hash); + CHECK(Saved.AsObjectAttachment() == Level3Hash); ++Saved; CHECK(Saved.AsBinaryView().EqualBytes(Level4.GetView())); ++Saved; |