aboutsummaryrefslogtreecommitdiff
path: root/zencore/compactbinarypackage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'zencore/compactbinarypackage.cpp')
-rw-r--r--zencore/compactbinarypackage.cpp136
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;