Coverage Report

Created: 2022-08-24 06:19

/src/Fast-DDS/include/fastdds/rtps/common/CDRMessage_t.h
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 CDRMessage_t.h
17
 */
18
19
#ifndef _FASTDDS_RTPS_CDRMESSAGE_T_H_
20
#define _FASTDDS_RTPS_CDRMESSAGE_T_H_
21
#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
22
23
#include <fastdds/rtps/common/SerializedPayload.h>
24
#include <fastdds/rtps/common/Types.h>
25
#include <cassert>
26
#include <cstdlib>
27
#include <cstring>
28
29
namespace eprosima {
30
namespace fastrtps {
31
namespace rtps {
32
33
//!Max size of RTPS message in bytes.
34
0
#define RTPSMESSAGE_DEFAULT_SIZE 10500  //max size of rtps message in bytes
35
0
#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
5.86k
#define RTPSMESSAGE_HEADER_SIZE 20  //header size in bytes
38
#define RTPSMESSAGE_SUBMESSAGEHEADER_SIZE 4
39
0
#define RTPSMESSAGE_DATA_EXTRA_INLINEQOS_SIZE 4
40
#define RTPSMESSAGE_INFOTS_SIZE 12
41
42
0
#define RTPSMESSAGE_OCTETSTOINLINEQOS_DATASUBMSG 16 //may change in future versions
43
0
#define RTPSMESSAGE_OCTETSTOINLINEQOS_DATAFRAGSUBMSG 28 //may change in future versions
44
106
#define RTPSMESSAGE_DATA_MIN_LENGTH 24
45
46
/**
47
 * @brief Structure CDRMessage_t, contains a serialized message.
48
 * @ingroup COMMON_MODULE
49
 */
50
struct RTPS_DllAPI CDRMessage_t final
51
{
52
    // TODO(Miguel C): Deprecate when not used in mocks
53
    CDRMessage_t()
54
        : CDRMessage_t(RTPSMESSAGE_DEFAULT_SIZE)
55
0
    {
56
0
    }
57
58
    ~CDRMessage_t()
59
1.94k
    {
60
1.94k
        if (buffer != nullptr && !wraps)
61
0
        {
62
0
            free(buffer);
63
0
        }
64
1.94k
    }
65
66
    /**
67
     * Constructor with maximum size
68
     * @param size Maximum size
69
     */
70
    explicit CDRMessage_t(
71
            uint32_t size)
72
1.94k
    {
73
1.94k
        wraps = false;
74
1.94k
        pos = 0;
75
1.94k
        length = 0;
76
77
1.94k
        if (size != 0)
78
0
        {
79
0
            buffer = (octet*)malloc(size);
80
0
        }
81
1.94k
        else
82
1.94k
        {
83
1.94k
            buffer = nullptr;
84
1.94k
        }
85
86
1.94k
        max_size = size;
87
1.94k
        reserved_size = size;
88
1.94k
        msg_endian = DEFAULT_ENDIAN;
89
1.94k
    }
90
91
    /**
92
     * Constructor to wrap a serialized payload
93
     * @param payload Payload to wrap
94
     */
95
    explicit CDRMessage_t(
96
            const SerializedPayload_t& payload)
97
        : wraps(true)
98
0
    {
99
0
        msg_endian = payload.encapsulation == PL_CDR_BE ? BIGEND : LITTLEEND;
100
0
        pos = payload.pos;
101
0
        length = payload.length;
102
0
        buffer = payload.data;
103
0
        max_size = payload.max_size;
104
0
        reserved_size = payload.max_size;
105
0
    }
Unexecuted instantiation: eprosima::fastrtps::rtps::CDRMessage_t::CDRMessage_t(eprosima::fastrtps::rtps::SerializedPayload_t const&)
Unexecuted instantiation: eprosima::fastrtps::rtps::CDRMessage_t::CDRMessage_t(eprosima::fastrtps::rtps::SerializedPayload_t const&)
106
107
    CDRMessage_t(
108
            const CDRMessage_t& message)
109
0
    {
110
0
        wraps = false;
111
0
        pos = 0;
112
0
        length = message.length;
113
0
        max_size = message.max_size;
114
0
        msg_endian = message.msg_endian;
115
0
116
0
        reserved_size = max_size;
117
0
        if (max_size != 0)
118
0
        {
119
0
            buffer =  (octet*)malloc(max_size);
120
0
            memcpy(buffer, message.buffer, length);
121
0
        }
122
0
        else
123
0
        {
124
0
            buffer = nullptr;
125
0
        }
126
0
    }
127
128
    CDRMessage_t(
129
            CDRMessage_t&& message)
130
0
    {
131
0
        wraps = message.wraps;
132
0
        message.wraps = false;
133
0
        pos = message.pos;
134
0
        message.pos = 0;
135
0
        length = message.length;
136
0
        message.length = 0;
137
0
        max_size = message.max_size;
138
0
        message.max_size = 0;
139
0
        reserved_size = message.reserved_size;
140
0
        message.reserved_size = 0;
141
0
        msg_endian = message.msg_endian;
142
0
        message.msg_endian = DEFAULT_ENDIAN;
143
0
        buffer = message.buffer;
144
0
        message.buffer = nullptr;
145
0
    }
146
147
    CDRMessage_t& operator =(
148
            CDRMessage_t&& message)
149
0
    {
150
0
        wraps = message.wraps;
151
0
        message.wraps = false;
152
0
        pos = message.pos;
153
0
        message.pos = 0;
154
0
        length = message.length;
155
0
        message.length = 0;
156
0
        max_size = message.max_size;
157
0
        message.max_size = 0;
158
0
        reserved_size = message.reserved_size;
159
0
        message.reserved_size = 0;
160
0
        msg_endian = message.msg_endian;
161
0
        message.msg_endian = DEFAULT_ENDIAN;
162
0
        buffer = message.buffer;
163
0
        message.buffer = nullptr;
164
0
165
0
        return *(this);
166
0
    }
167
168
    void init(
169
            octet* buffer_ptr,
170
            uint32_t size)
171
0
    {
172
0
        assert(buffer == nullptr);
173
0
        wraps = true;
174
0
        pos = 0;
175
0
        length = 0;
176
0
        buffer = buffer_ptr;
177
0
        max_size = size;
178
0
        reserved_size = size;
179
0
        msg_endian = DEFAULT_ENDIAN;
180
0
    }
181
182
    void reserve(
183
            uint32_t size)
184
0
    {
185
0
        assert(wraps == false);
186
0
        if (size > reserved_size)
187
0
        {
188
0
            octet* new_buffer = (octet*) realloc(buffer, size);
189
0
            if (new_buffer == nullptr)
190
0
            {
191
0
                // TODO: Exception? Assertion?
192
0
            }
193
0
            else
194
0
            {
195
0
                buffer = new_buffer;
196
0
                reserved_size = size;
197
0
            }
198
0
        }
199
0
200
0
        max_size = size;
201
0
    }
202
203
    //!Pointer to the buffer where the data is stored.
204
    octet* buffer;
205
    //!Read or write position.
206
    uint32_t pos;
207
    //!Max size of the message.
208
    uint32_t max_size;
209
    //!Size allocated on buffer. May be higher than max_size.
210
    uint32_t reserved_size;
211
    //!Current length of the message.
212
    uint32_t length;
213
    //!Endianness of the message.
214
    Endianness_t msg_endian;
215
    //Whether this message is wrapping a buffer managed elsewhere.
216
    bool wraps;
217
};
218
219
}  // namespace rtps
220
}  // namespace fastrtps
221
}  // namespace eprosima
222
223
#endif /* DOXYGEN_SHOULD_SKIP_THIS_PUBLIC */
224
#endif /* _FASTDDS_RTPS_CDRMESSAGE_T_H_ */