diff --git a/pvAccessApp/remote/serializationHelper.cpp b/pvAccessApp/remote/serializationHelper.cpp new file mode 100644 index 0000000..dae7e9f --- /dev/null +++ b/pvAccessApp/remote/serializationHelper.cpp @@ -0,0 +1,80 @@ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * pvAccessCPP is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ + +#include +#include +#include + +using namespace epics::pvData; + +namespace epics { +namespace pvAccess { + +PVDataCreatePtr SerializationHelper::_pvDataCreate(getPVDataCreate()); + +PVStructure::shared_pointer SerializationHelper::deserializePVRequest(ByteBuffer* buffer, DeserializableControl* control) +{ + // for now ordinary structure, later can be changed + return deserializeStructureFull(buffer, control); +} + +PVStructure::shared_pointer SerializationHelper::deserializeStructureAndCreatePVStructure(ByteBuffer* buffer, DeserializableControl* control) +{ + return deserializeStructureAndCreatePVStructure(buffer, control, PVStructure::shared_pointer()); +} + +PVStructure::shared_pointer SerializationHelper::deserializeStructureAndCreatePVStructure(ByteBuffer* buffer, DeserializableControl* control, PVStructure::shared_pointer const & existingStructure) +{ + FieldConstPtr field = control->cachedDeserialize(buffer); + if (field.get() == 0) + return PVStructure::shared_pointer(); + + if (existingStructure.get() != 0 && *(field.get()) == *(existingStructure->getField())) + return existingStructure; + else + return _pvDataCreate->createPVStructure(std::tr1::static_pointer_cast(field)); +} + +PVStructure::shared_pointer SerializationHelper::deserializeStructureFull(ByteBuffer* buffer, DeserializableControl* control) +{ + PVStructure::shared_pointer pvStructure; + FieldConstPtr structureField = control->cachedDeserialize(buffer); + if (structureField.get() != 0) + { + pvStructure = _pvDataCreate->createPVStructure(std::tr1::static_pointer_cast(structureField)); + pvStructure->deserialize(buffer, control); + } + return pvStructure; +} + +void SerializationHelper::serializeNullField(ByteBuffer* buffer, SerializableControl* control) +{ + control->ensureBuffer(1); + buffer->putByte(IntrospectionRegistry::NULL_TYPE_CODE); +} + +void SerializationHelper::serializePVRequest(ByteBuffer* buffer, SerializableControl* control, PVStructure::shared_pointer const & pvRequest) +{ + // for now ordinary structure, later can be changed + serializeStructureFull(buffer, control, pvRequest); +} + +void SerializationHelper::serializeStructureFull(ByteBuffer* buffer, SerializableControl* control, PVStructure::shared_pointer const & pvStructure) +{ + if (pvStructure.get() == 0) + { + serializeNullField(buffer, control); + } + else + { + control->cachedSerialize(pvStructure->getField(), buffer); + pvStructure->serialize(buffer, control); + } +} + +}} + +