1 // Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 /*!
16  * @file SynDDSMessagePubSubTypes.cpp
17  * This header file contains the implementation of the serialization functions.
18  *
19  * This file was generated by the tool fastcdrgen.
20  */
21 
22 
23 #include <fastcdr/FastBuffer.h>
24 #include <fastcdr/Cdr.h>
25 
26 #include "SynDDSMessagePubSubTypes.h"
27 
28 using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
29 using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
30 
SynDDSMessagePubSubType()31 SynDDSMessagePubSubType::SynDDSMessagePubSubType()
32 {
33     setName("SynDDSMessage");
34     auto type_size = SynDDSMessage::getMaxCdrSerializedSize();
35     type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4); /* possible submessage alignment */
36     m_typeSize = static_cast<uint32_t>(type_size) + 4; /*encapsulation*/
37     m_isGetKeyDefined = SynDDSMessage::isKeyDefined();
38     size_t keyLength = SynDDSMessage::getKeyMaxCdrSerializedSize() > 16 ?
39             SynDDSMessage::getKeyMaxCdrSerializedSize() : 16;
40     m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
41     memset(m_keyBuffer, 0, keyLength);
42 }
43 
~SynDDSMessagePubSubType()44 SynDDSMessagePubSubType::~SynDDSMessagePubSubType()
45 {
46     if (m_keyBuffer != nullptr)
47     {
48         free(m_keyBuffer);
49     }
50 }
51 
serialize(void * data,SerializedPayload_t * payload)52 bool SynDDSMessagePubSubType::serialize(
53         void* data,
54         SerializedPayload_t* payload)
55 {
56     SynDDSMessage* p_type = static_cast<SynDDSMessage*>(data);
57 
58     // Object that manages the raw buffer.
59     eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
60     // Object that serializes the data.
61     eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
62     payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
63     // Serialize encapsulation
64     ser.serialize_encapsulation();
65 
66     try
67     {
68         // Serialize the object.
69         p_type->serialize(ser);
70     }
71     catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
72     {
73         return false;
74     }
75 
76     // Get the serialized length
77     payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
78     return true;
79 }
80 
deserialize(SerializedPayload_t * payload,void * data)81 bool SynDDSMessagePubSubType::deserialize(
82         SerializedPayload_t* payload,
83         void* data)
84 {
85     //Convert DATA to pointer of your type
86     SynDDSMessage* p_type = static_cast<SynDDSMessage*>(data);
87 
88     // Object that manages the raw buffer.
89     eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
90 
91     // Object that deserializes the data.
92     eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
93 
94     // Deserialize encapsulation.
95     deser.read_encapsulation();
96     payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
97 
98     try
99     {
100         // Deserialize the object.
101         p_type->deserialize(deser);
102     }
103     catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
104     {
105         return false;
106     }
107 
108     return true;
109 }
110 
getSerializedSizeProvider(void * data)111 std::function<uint32_t()> SynDDSMessagePubSubType::getSerializedSizeProvider(
112         void* data)
113 {
114     return [data]() -> uint32_t
115            {
116                return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<SynDDSMessage*>(data))) +
117                       4u /*encapsulation*/;
118            };
119 }
120 
createData()121 void* SynDDSMessagePubSubType::createData()
122 {
123     return reinterpret_cast<void*>(new SynDDSMessage());
124 }
125 
deleteData(void * data)126 void SynDDSMessagePubSubType::deleteData(
127         void* data)
128 {
129     delete(reinterpret_cast<SynDDSMessage*>(data));
130 }
131 
getKey(void * data,InstanceHandle_t * handle,bool force_md5)132 bool SynDDSMessagePubSubType::getKey(
133         void* data,
134         InstanceHandle_t* handle,
135         bool force_md5)
136 {
137     if (!m_isGetKeyDefined)
138     {
139         return false;
140     }
141 
142     SynDDSMessage* p_type = static_cast<SynDDSMessage*>(data);
143 
144     // Object that manages the raw buffer.
145     eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
146             SynDDSMessage::getKeyMaxCdrSerializedSize());
147 
148     // Object that serializes the data.
149     eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
150     p_type->serializeKey(ser);
151     if (force_md5 || SynDDSMessage::getKeyMaxCdrSerializedSize() > 16)
152     {
153         m_md5.init();
154         m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
155         m_md5.finalize();
156         for (uint8_t i = 0; i < 16; ++i)
157         {
158             handle->value[i] = m_md5.digest[i];
159         }
160     }
161     else
162     {
163         for (uint8_t i = 0; i < 16; ++i)
164         {
165             handle->value[i] = m_keyBuffer[i];
166         }
167     }
168     return true;
169 }
170 
171