Coverage Report

Created: 2025-06-13 06:46

/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