File indexing completed on 2024-05-12 05:25:58

0001 #include "entitybuffer.h"
0002 
0003 #include "entity_generated.h"
0004 #include "metadata_generated.h"
0005 #include <QDebug>
0006 
0007 using namespace Sink;
0008 
0009 EntityBuffer::EntityBuffer(const void *dataValue, int dataSize) : mEntity(nullptr)
0010 {
0011     flatbuffers::Verifier verifyer(reinterpret_cast<const uint8_t *>(dataValue), dataSize);
0012     // Q_ASSERT(Sink::VerifyEntity(verifyer));
0013     if (!Sink::VerifyEntityBuffer(verifyer)) {
0014         qWarning() << "invalid buffer";
0015     } else {
0016         mEntity = Sink::GetEntity(dataValue);
0017     }
0018 }
0019 
0020 EntityBuffer::EntityBuffer(const QByteArray &data) : EntityBuffer(data.constData(), data.size())
0021 {
0022 }
0023 
0024 bool EntityBuffer::isValid() const
0025 {
0026     return mEntity;
0027 }
0028 
0029 const Sink::Entity &EntityBuffer::entity() const
0030 {
0031     Q_ASSERT(mEntity);
0032     return *mEntity;
0033 }
0034 
0035 const uint8_t *EntityBuffer::resourceBuffer() const
0036 {
0037     if (!mEntity) {
0038         qDebug() << "no buffer";
0039         return nullptr;
0040     }
0041     return mEntity->resource()->Data();
0042 }
0043 
0044 const uint8_t *EntityBuffer::metadataBuffer() const
0045 {
0046     if (!mEntity) {
0047         return nullptr;
0048     }
0049     return mEntity->metadata()->Data();
0050 }
0051 
0052 const uint8_t *EntityBuffer::localBuffer() const
0053 {
0054     if (!mEntity) {
0055         return nullptr;
0056     }
0057     return mEntity->local()->Data();
0058 }
0059 
0060 void EntityBuffer::extractResourceBuffer(void *dataValue, int dataSize, const std::function<void(const uint8_t *, size_t size)> &handler)
0061 {
0062     Sink::EntityBuffer buffer(dataValue, dataSize);
0063     if (auto resourceData = buffer.entity().resource()) {
0064         handler(resourceData->Data(), resourceData->size());
0065     }
0066 }
0067 
0068 flatbuffers::Offset<flatbuffers::Vector<uint8_t>> EntityBuffer::appendAsVector(flatbuffers::FlatBufferBuilder &fbb, void const *data, size_t size)
0069 {
0070     // Since we do memcpy trickery, this will only work on little endian
0071     assert(FLATBUFFERS_LITTLEENDIAN);
0072     uint8_t *rawDataPtr = Q_NULLPTR;
0073     const auto pos = fbb.CreateUninitializedVector<uint8_t>(size, &rawDataPtr);
0074     std::memcpy((void *)rawDataPtr, data, size);
0075     return pos;
0076 }
0077 
0078 void EntityBuffer::assembleEntityBuffer(
0079     flatbuffers::FlatBufferBuilder &fbb, void const *metadataData, size_t metadataSize, void const *resourceData, size_t resourceSize, void const *localData, size_t localSize)
0080 {
0081     auto metadata = appendAsVector(fbb, metadataData, metadataSize);
0082     auto resource = appendAsVector(fbb, resourceData, resourceSize);
0083     auto local = appendAsVector(fbb, localData, localSize);
0084     auto entity = Sink::CreateEntity(fbb, metadata, resource, local);
0085     Sink::FinishEntityBuffer(fbb, entity);
0086 }
0087 
0088 Sink::Operation EntityBuffer::operation() const
0089 {
0090     const auto metadataBuffer = readBuffer<Sink::Metadata>(mEntity->metadata());
0091     return metadataBuffer ? metadataBuffer->operation() : Sink::Operation_Creation;
0092 }
0093 
0094 qint64 EntityBuffer::revision() const
0095 {
0096     const auto metadataBuffer = readBuffer<Sink::Metadata>(mEntity->metadata());
0097     return metadataBuffer ? metadataBuffer->revision() : -1;
0098 }