Fast DDS  Version 3.6.1.0
Fast DDS
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 
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 
29 namespace eprosima {
30 namespace fastdds {
31 namespace 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 
50 struct FASTDDS_EXPORTED_API CDRMessage_t final
51 {
52  // TODO(Miguel C): Deprecate when not used in mocks
54  : CDRMessage_t(
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;
89  msg_endian = DEFAULT_ENDIAN;
90  }
91 
96  explicit CDRMessage_t(
97  const SerializedPayload_t& payload)
98  : wraps(true)
99  {
100  msg_endian = LITTLEEND;
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 
156  reserved_size = max_size;
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;
219  msg_endian = DEFAULT_ENDIAN;
220  }
221 
222  void reserve(
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;
250  uint32_t reserved_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
Endianness_t
This enumeration represents endianness types.
Definition: Types.hpp:40
@ LITTLEEND
Little endianness.
Definition: Types.hpp:44
@ BIGEND
Big endianness.
Definition: Types.hpp:42
constexpr Endianness_t DEFAULT_ENDIAN
Definition: Types.hpp:80
uint8_t octet
Definition: Types.hpp:83
Structure CDRMessage_t, contains a serialized message.
Definition: CDRMessage_t.hpp:51
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