Coverage Report

Created: 2025-07-03 06:58

/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
12
#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
    //!Whether the payload contains a serialized key, or the whole data
76
    bool is_serialized_key = false;
77
78
    //!Default constructor
79
    SerializedPayload_t()
80
12
        : encapsulation(CDR_BE)
81
12
        , length(0)
82
12
        , data(nullptr)
83
12
        , max_size(0)
84
12
        , pos(0)
85
12
    {
86
12
    }
87
88
    /**
89
     * @param len Maximum size of the payload
90
     */
91
    explicit SerializedPayload_t(
92
            uint32_t len)
93
0
        : SerializedPayload_t()
94
0
    {
95
0
        this->reserve(len);
96
0
    }
97
98
    //!Copy constructor
99
    SerializedPayload_t(
100
            const SerializedPayload_t& other) = delete;
101
    //!Copy operator
102
    SerializedPayload_t& operator = (
103
            const SerializedPayload_t& other) = delete;
104
105
    //!Move constructor
106
    SerializedPayload_t(
107
            SerializedPayload_t&& other) noexcept
108
0
    {
109
0
        *this = std::move(other);
110
0
    }
111
112
    //!Move operator
113
    SerializedPayload_t& operator = (
114
            SerializedPayload_t&& other) noexcept;
115
116
    /*!
117
     * Destructor
118
     * It is expected to release the payload if the payload owner is not nullptr before destruction
119
     */
120
    ~SerializedPayload_t();
121
122
    bool operator == (
123
            const SerializedPayload_t& other) const;
124
125
    /*!
126
     * Copy another structure (including allocating new space for the data).
127
     * @param [in] serData Pointer to the structure to copy
128
     * @param with_limit if true, the function will fail when providing a payload too big
129
     * @return True if correct
130
     */
131
    bool copy(
132
            const SerializedPayload_t* serData,
133
            bool with_limit = true);
134
135
    /*!
136
     * Allocate new space for fragmented data
137
     * @param [in] serData Pointer to the structure to copy
138
     * @return True if correct
139
     */
140
    bool reserve_fragmented(
141
            SerializedPayload_t* serData);
142
143
    /*!
144
     * Empty the payload
145
     * @pre payload_owner must be nullptr
146
     */
147
    void empty();
148
149
    void reserve(
150
            uint32_t new_size);
151
152
};
153
154
} // namespace rtps
155
} // namespace fastdds
156
} // namespace eprosima
157
158
#endif // FASTDDS_RTPS_COMMON__SERIALIZEDPAYLOAD_HPP