#include <fastcdr/FastBuffer.h>
#include <fastcdr/Cdr.h>
#include <fastcdr/CdrSizeCalculator.hpp>
#include "ShapePubSubTypes.h"
#include "ShapeCdrAux.hpp"
using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
using DataRepresentationId_t = eprosima::fastdds::dds::DataRepresentationId_t;
ShapeTypePubSubType::ShapeTypePubSubType()
{
setName("ShapeType");
uint32_t type_size = ShapeType_max_cdr_typesize;
type_size += static_cast<uint32_t>(eprosima::fastcdr::Cdr::alignment(type_size, 4));
m_typeSize = type_size + 4;
m_isGetKeyDefined = true;
uint32_t keyLength = ShapeType_max_key_cdr_typesize > 16 ? ShapeType_max_key_cdr_typesize : 16;
m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
memset(m_keyBuffer, 0, keyLength);
}
ShapeTypePubSubType::~ShapeTypePubSubType()
{
if (m_keyBuffer != nullptr)
{
free(m_keyBuffer);
}
}
bool ShapeTypePubSubType::serialize(
void* data,
SerializedPayload_t* payload,
DataRepresentationId_t data_representation)
{
ShapeType* p_type = static_cast<ShapeType*>(data);
eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN,
data_representation == DataRepresentationId_t::XCDR_DATA_REPRESENTATION ?
eprosima::fastcdr::CdrVersion::XCDRv1 : eprosima::fastcdr::CdrVersion::XCDRv2);
payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
ser.set_encoding_flag(
data_representation == DataRepresentationId_t::XCDR_DATA_REPRESENTATION ?
eprosima::fastcdr::EncodingAlgorithmFlag::PLAIN_CDR :
eprosima::fastcdr::EncodingAlgorithmFlag::DELIMIT_CDR2);
try
{
ser.serialize_encapsulation();
ser << *p_type;
}
catch (eprosima::fastcdr::exception::Exception& )
{
return false;
}
payload->length = static_cast<uint32_t>(ser.get_serialized_data_length());
return true;
}
bool ShapeTypePubSubType::deserialize(
SerializedPayload_t* payload,
void* data)
{
try
{
ShapeType* p_type = static_cast<ShapeType*>(data);
eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN);
deser.read_encapsulation();
payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
deser >> *p_type;
}
catch (eprosima::fastcdr::exception::Exception& )
{
return false;
}
return true;
}
std::function<uint32_t()> ShapeTypePubSubType::getSerializedSizeProvider(
void* data,
DataRepresentationId_t data_representation)
{
return [data, data_representation]() -> uint32_t
{
eprosima::fastcdr::CdrSizeCalculator calculator(
data_representation == DataRepresentationId_t::XCDR_DATA_REPRESENTATION ?
eprosima::fastcdr::CdrVersion::XCDRv1 :eprosima::fastcdr::CdrVersion::XCDRv2);
size_t current_alignment {0};
return static_cast<uint32_t>(calculator.calculate_serialized_size(
*static_cast<ShapeType*>(data), current_alignment)) +
4u ;
};
}
void* ShapeTypePubSubType::createData()
{
return reinterpret_cast<void*>(new ShapeType());
}
void ShapeTypePubSubType::deleteData(
void* data)
{
delete(reinterpret_cast<ShapeType*>(data));
}
bool ShapeTypePubSubType::getKey(
void* data,
InstanceHandle_t* handle,
bool force_md5)
{
if (!m_isGetKeyDefined)
{
return false;
}
ShapeType* p_type = static_cast<ShapeType*>(data);
eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
ShapeType_max_key_cdr_typesize);
eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
eprosima::fastcdr::serialize_key(ser, *p_type);
if (force_md5 || ShapeType_max_key_cdr_typesize > 16)
{
m_md5.init();
m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.get_serialized_data_length()));
m_md5.finalize();
for (uint8_t i = 0; i < 16; ++i)
{
handle->value[i] = m_md5.digest[i];
}
}
else
{
for (uint8_t i = 0; i < 16; ++i)
{
handle->value[i] = m_keyBuffer[i];
}
}
return true;
}