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 }