Fast DDS  Version 3.6.1.0
Fast DDS
Loading...
Searching...
No Matches
CDRMessage_t.hpp
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
18
19#ifndef FASTDDS_RTPS_COMMON__CDRMESSAGE_T_HPP
20#define FASTDDS_RTPS_COMMON__CDRMESSAGE_T_HPP
21#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
22
23#include <fastdds/rtps/common/SerializedPayload.hpp>
24#include <fastdds/rtps/common/Types.hpp>
25#include <cassert>
26#include <cstdlib>
27#include <cstring>
28
29namespace eprosima {
30namespace fastdds {
31namespace rtps {
32
34#define RTPSMESSAGE_DEFAULT_SIZE 10500 //max size of rtps message in bytes
35#define RTPSMESSAGE_COMMON_RTPS_PAYLOAD_SIZE 536 //common payload a rtps message has TODO(Ricardo) It is necessary?
36#define RTPSMESSAGE_COMMON_DATA_PAYLOAD_SIZE 10000 //common data size
37#define RTPSMESSAGE_HEADER_SIZE 20 //header size in bytes
38#define RTPSMESSAGE_SUBMESSAGEHEADER_SIZE 4
39#define RTPSMESSAGE_DATA_EXTRA_INLINEQOS_SIZE 4
40#define RTPSMESSAGE_INFOTS_SIZE 12
41
42#define RTPSMESSAGE_OCTETSTOINLINEQOS_DATASUBMSG 16 //may change in future versions
43#define RTPSMESSAGE_OCTETSTOINLINEQOS_DATAFRAGSUBMSG 28 //may change in future versions
44#define RTPSMESSAGE_DATA_MIN_LENGTH 24
45
50struct FASTDDS_EXPORTED_API CDRMessage_t final
51{
52 // TODO(Miguel C): Deprecate when not used in mocks
55 RTPSMESSAGE_DEFAULT_SIZE)
56 {
57 }
58
60 {
61 if (buffer != nullptr && !wraps)
62 {
63 free(buffer);
64 }
65 }
66
71 explicit CDRMessage_t(
72 uint32_t size)
73 {
74 wraps = false;
75 pos = 0;
76 length = 0;
77
78 if (size != 0)
79 {
80 buffer = (octet*)malloc(size);
81 }
82 else
83 {
84 buffer = nullptr;
85 }
86
87 max_size = size;
88 reserved_size = size;
90 }
91
96 explicit CDRMessage_t(
97 const SerializedPayload_t& payload)
98 : wraps(true)
99 {
101 if (payload.encapsulation == PL_CDR_BE || payload.encapsulation == CDR_BE)
102 {
103 msg_endian = BIGEND;
104 }
105 pos = payload.pos;
106 length = payload.length;
107 buffer = payload.data;
108 max_size = payload.max_size;
109 reserved_size = payload.max_size;
110 }
111
125 const CDRMessage_t& other,
126 uint32_t length_from_current_position)
127 {
128 CDRMessage_t msg(0);
129 // Fail if length exceeds available data
130 if (other.length - other.pos < length_from_current_position)
131 {
132 // Error is indicated by length being zero and buffer being nullptr
133 }
134 else
135 {
136 msg.wraps = true;
137 msg.pos = 0;
138 msg.length = length_from_current_position;
139 msg.max_size = length_from_current_position;
140 msg.reserved_size = other.reserved_size;
141 msg.msg_endian = other.msg_endian;
142 msg.buffer = &other.buffer[other.pos];
143 }
144 return msg;
145 }
146
148 const CDRMessage_t& message)
149 {
150 wraps = false;
151 pos = 0;
152 length = message.length;
153 max_size = message.max_size;
154 msg_endian = message.msg_endian;
155
157 if (max_size != 0)
158 {
159 buffer = (octet*)malloc(max_size);
160 memcpy(buffer, message.buffer, length);
161 }
162 else
163 {
164 buffer = nullptr;
165 }
166 }
167
169 CDRMessage_t&& message)
170 {
171 wraps = message.wraps;
172 message.wraps = false;
173 pos = message.pos;
174 message.pos = 0;
175 length = message.length;
176 message.length = 0;
177 max_size = message.max_size;
178 message.max_size = 0;
179 reserved_size = message.reserved_size;
180 message.reserved_size = 0;
181 msg_endian = message.msg_endian;
182 message.msg_endian = DEFAULT_ENDIAN;
183 buffer = message.buffer;
184 message.buffer = nullptr;
185 }
186
187 CDRMessage_t& operator =(
188 CDRMessage_t&& message)
189 {
190 wraps = message.wraps;
191 message.wraps = false;
192 pos = message.pos;
193 message.pos = 0;
194 length = message.length;
195 message.length = 0;
196 max_size = message.max_size;
197 message.max_size = 0;
198 reserved_size = message.reserved_size;
199 message.reserved_size = 0;
200 msg_endian = message.msg_endian;
201 message.msg_endian = DEFAULT_ENDIAN;
202 buffer = message.buffer;
203 message.buffer = nullptr;
204
205 return *(this);
206 }
207
208 void init(
209 octet* buffer_ptr,
210 uint32_t size)
211 {
212 assert(buffer == nullptr);
213 wraps = true;
214 pos = 0;
215 length = 0;
216 buffer = buffer_ptr;
217 max_size = size;
218 reserved_size = size;
220 }
221
223 uint32_t size)
224 {
225 assert(wraps == false);
226 if (size > reserved_size)
227 {
228 octet* new_buffer = (octet*) realloc(buffer, size);
229 if (new_buffer == nullptr)
230 {
231 // TODO: Exception? Assertion?
232 }
233 else
234 {
235 buffer = new_buffer;
236 reserved_size = size;
237 }
238 }
239
240 max_size = size;
241 }
242
246 uint32_t pos;
248 uint32_t max_size;
252 uint32_t length;
255 //Whether this message is wrapping a buffer managed elsewhere.
256 bool wraps;
257};
258
259} // namespace rtps
260} // namespace fastdds
261} // namespace eprosima
262
263#endif // DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
264#endif // FASTDDS_RTPS_COMMON__CDRMESSAGE_T_HPP
Contains the RTPS protocol implementation.
Endianness_t
This enumeration represents endianness types.
Definition Types.hpp:40
@ LITTLEEND
Little endianness.
Definition Types.hpp:44
constexpr Endianness_t DEFAULT_ENDIAN
Definition Types.hpp:80
uint8_t octet
Definition Types.hpp:83
eProsima namespace.
void init(octet *buffer_ptr, uint32_t size)
Definition CDRMessage_t.hpp:208
octet * buffer
Pointer to the buffer where the data is stored.
Definition CDRMessage_t.hpp:244
uint32_t max_size
Max size of the message.
Definition CDRMessage_t.hpp:248
Endianness_t msg_endian
Endianness of the message.
Definition CDRMessage_t.hpp:254
~CDRMessage_t()
Definition CDRMessage_t.hpp:59
CDRMessage_t()
Definition CDRMessage_t.hpp:53
void reserve(uint32_t size)
Definition CDRMessage_t.hpp:222
static CDRMessage_t wrap_from_other_message(const CDRMessage_t &other, uint32_t length_from_current_position)
Wraps a portion of a CDRMessage_t into a new CDRMessage_t.
Definition CDRMessage_t.hpp:124
bool wraps
Definition CDRMessage_t.hpp:256
CDRMessage_t(const CDRMessage_t &message)
Definition CDRMessage_t.hpp:147
uint32_t reserved_size
Size allocated on buffer. May be higher than max_size.
Definition CDRMessage_t.hpp:250
uint32_t length
Current length of the message.
Definition CDRMessage_t.hpp:252
CDRMessage_t(CDRMessage_t &&message)
Definition CDRMessage_t.hpp:168
uint32_t pos
Read or write position.
Definition CDRMessage_t.hpp:246
CDRMessage_t(uint32_t size)
Constructor with maximum size.
Definition CDRMessage_t.hpp:71
CDRMessage_t(const SerializedPayload_t &payload)
Constructor to wrap a serialized payload.
Definition CDRMessage_t.hpp:96
Structure SerializedPayload_t.
Definition SerializedPayload.hpp:59
octet * data
Pointer to the data.
Definition SerializedPayload.hpp:68
uint16_t encapsulation
Encapsulation of the data as suggested in the RTPS 2.1 specification chapter 10.
Definition SerializedPayload.hpp:64
uint32_t max_size
Maximum size of the payload.
Definition SerializedPayload.hpp:70
uint32_t length
Actual length of the data.
Definition SerializedPayload.hpp:66
uint32_t pos
Position when reading.
Definition SerializedPayload.hpp:72