/src/Fast-DDS/include/fastdds/rtps/common/SerializedPayload.hpp
Line | Count | Source (jump to first uncovered line) |
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 SerializedPayload.hpp |
17 | | */ |
18 | | |
19 | | #ifndef FASTDDS_RTPS_COMMON__SERIALIZEDPAYLOAD_HPP |
20 | | #define FASTDDS_RTPS_COMMON__SERIALIZEDPAYLOAD_HPP |
21 | | |
22 | | #include <cstring> |
23 | | #include <new> |
24 | | #include <stdexcept> |
25 | | #include <cassert> |
26 | | #include <stdint.h> |
27 | | #include <stdlib.h> |
28 | | |
29 | | #include <fastdds/fastdds_dll.hpp> |
30 | | #include <fastdds/rtps/common/Types.hpp> |
31 | | #include <fastdds/rtps/history/IPayloadPool.hpp> |
32 | | |
33 | | /*! |
34 | | * @brief Maximum payload is maximum of UDP packet size minus 536bytes (RTPSMESSAGE_COMMON_RTPS_PAYLOAD_SIZE) |
35 | | * With those 536 bytes (RTPSMESSAGE_COMMON_RTPS_PAYLOAD_SIZE) bytes is posible to send RTPS Header plus RTPS Data submessage plus RTPS Heartbeat submessage. |
36 | | */ |
37 | | |
38 | | namespace eprosima { |
39 | | namespace fastdds { |
40 | | namespace rtps { |
41 | | |
42 | | //Pre define data encapsulation schemes |
43 | 343k | #define CDR_BE 0x0000 |
44 | 0 | #define CDR_LE 0x0001 |
45 | 0 | #define PL_CDR_BE 0x0002 |
46 | 0 | #define PL_CDR_LE 0x0003 |
47 | | |
48 | | #if FASTDDS_IS_BIG_ENDIAN_TARGET |
49 | | #define DEFAULT_ENCAPSULATION CDR_BE |
50 | | #define PL_DEFAULT_ENCAPSULATION PL_CDR_BE |
51 | | #else |
52 | 0 | #define DEFAULT_ENCAPSULATION CDR_LE |
53 | | #define PL_DEFAULT_ENCAPSULATION PL_CDR_LE |
54 | | #endif // FASTDDS_IS_BIG_ENDIAN_TARGET |
55 | | |
56 | | //!@brief Structure SerializedPayload_t. |
57 | | //!@ingroup COMMON_MODULE |
58 | | struct FASTDDS_EXPORTED_API SerializedPayload_t |
59 | | { |
60 | | //!Size in bytes of the representation header as specified in the RTPS 2.3 specification chapter 10. |
61 | | static constexpr size_t representation_header_size = 4u; |
62 | | |
63 | | //!Encapsulation of the data as suggested in the RTPS 2.1 specification chapter 10. |
64 | | uint16_t encapsulation; |
65 | | //!Actual length of the data |
66 | | uint32_t length; |
67 | | //!Pointer to the data. |
68 | | octet* data; |
69 | | //!Maximum size of the payload |
70 | | uint32_t max_size; |
71 | | //!Position when reading |
72 | | uint32_t pos; |
73 | | //!Pool that created the payload |
74 | | IPayloadPool* payload_owner = nullptr; |
75 | | |
76 | | //!Default constructor |
77 | | SerializedPayload_t() |
78 | 173k | : encapsulation(CDR_BE) |
79 | 173k | , length(0) |
80 | 173k | , data(nullptr) |
81 | 173k | , max_size(0) |
82 | 173k | , pos(0) |
83 | 173k | { |
84 | 173k | } |
85 | | |
86 | | /** |
87 | | * @param len Maximum size of the payload |
88 | | */ |
89 | | explicit SerializedPayload_t( |
90 | | uint32_t len) |
91 | 0 | : SerializedPayload_t() |
92 | 0 | { |
93 | 0 | this->reserve(len); |
94 | 0 | } |
95 | | |
96 | | //!Copy constructor |
97 | | SerializedPayload_t( |
98 | | const SerializedPayload_t& other) = delete; |
99 | | //!Copy operator |
100 | | SerializedPayload_t& operator = ( |
101 | | const SerializedPayload_t& other) = delete; |
102 | | |
103 | | //!Move constructor |
104 | | SerializedPayload_t( |
105 | | SerializedPayload_t&& other) noexcept |
106 | 0 | { |
107 | 0 | *this = std::move(other); |
108 | 0 | } |
109 | | |
110 | | //!Move operator |
111 | | SerializedPayload_t& operator = ( |
112 | | SerializedPayload_t&& other) noexcept; |
113 | | |
114 | | /*! |
115 | | * Destructor |
116 | | * It is expected to release the payload if the payload owner is not nullptr before destruction |
117 | | */ |
118 | | ~SerializedPayload_t(); |
119 | | |
120 | | bool operator == ( |
121 | | const SerializedPayload_t& other) const; |
122 | | |
123 | | /*! |
124 | | * Copy another structure (including allocating new space for the data). |
125 | | * @param [in] serData Pointer to the structure to copy |
126 | | * @param with_limit if true, the function will fail when providing a payload too big |
127 | | * @return True if correct |
128 | | */ |
129 | | bool copy( |
130 | | const SerializedPayload_t* serData, |
131 | | bool with_limit = true); |
132 | | |
133 | | /*! |
134 | | * Allocate new space for fragmented data |
135 | | * @param [in] serData Pointer to the structure to copy |
136 | | * @return True if correct |
137 | | */ |
138 | | bool reserve_fragmented( |
139 | | SerializedPayload_t* serData); |
140 | | |
141 | | /*! |
142 | | * Empty the payload |
143 | | * @pre payload_owner must be nullptr |
144 | | */ |
145 | | void empty(); |
146 | | |
147 | | void reserve( |
148 | | uint32_t new_size); |
149 | | |
150 | | }; |
151 | | |
152 | | } // namespace rtps |
153 | | } // namespace fastdds |
154 | | } // namespace eprosima |
155 | | |
156 | | #endif // FASTDDS_RTPS_COMMON__SERIALIZEDPAYLOAD_HPP |