RTI Connext DDS Micro  Version 2.4.11
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cdr_stream.h
1 /*
2  * FILE: cdr_stream.h - CDR stream API
3  *
4  * (c) Copyright, Real-Time Innovations, 2012-2015.
5  * All rights reserved.
6  *
7  * No duplications, whole or partial, manual or electronic, may be made
8  * without express written permission. Any such copies, or
9  * revisions thereof, must display this notice unaltered.
10  * This code contains trade secrets of Real-Time Innovations, Inc.
11  *
12  * Modification History
13  * --------------------
14  * 23feb2015,eh MICRO-1075: remove and replace macros
15  * 03jun2013,kaj MICRO-193 (verification cdrs != NULL made resp. of caller)
16  * 24mar2012,kaj Written
17  */
18 /*ci
19  * \file
20  * \defgroup CDRStreamClass CDR Stream
21  *
22  * \brief CDR Stream
23  *
24  * \details
25  * An abstraction for serializing and deserializing CDR types to and from a
26  * buffer. Enforces alignment and endianness.
27  *
28  */
29 /*ci \addtogroup CDRStreamClass
30  * @{
31  */
32 #ifndef cdr_stream_h
33 #define cdr_stream_h
34 
35 #ifndef osapi_types_h
36 #include "osapi/osapi_types.h"
37 #endif
38 
39 #ifndef cdr_dll_h
40 #include "cdr/cdr_dll.h"
41 #endif
42 
43 #ifdef __cplusplus
44 extern "C"
45 {
46 #endif
47 
48 #define CDR_MAX_ALIGNMENT 8
49 
50 /*i \ingroup RTICdrStreamModule
51  Big endian in CDR.
52 */
53 #define RTI_CDR_ENDIAN_BIG (0)
54 
55 /*i \ingroup RTICdrStreamModule
56  Little endian in CDR
57 */
58 #define RTI_CDR_ENDIAN_LITTLE (1)
59 
60 
61 #define CDR_BYTESWAP_INVALID -1
62 
63 /* -------------------------------------------------------------------------- */
64 /*ci \brief Abstraction for serializing to and deserializing from a buffer */
65 struct CDR_Stream_t
66 {
67  /*ci \brief Allocated buffer */
68  char *real_buff;
69 
70  /*ci \brief Buffer aligned on 8-byte boundary */
71  char *buffer;
72 
73  /*ci \brief Address used for alignment calculations */
74  char *align_base;
75 
76  /*ci \brief Current location in buffer */
77  char *buff_ptr;
78 
79  /*ci \brief Length of the aligned buffer */
80  RTI_UINT32 length;
81 
82  /*ci \brief Whether to byte swap during serialization/deserialization to
83  * be consistent with stream's endianness
84  */
85  RTI_BOOL need_byte_swap;
86 
87  /*ci \brief Endianness of stream, either RTI_CDR_ENDIAN_LITTLE or
88  * RTI_CDR_ENDIAN_BIG
89  */
90  RTI_UINT16 endian;
91 };
92 
93 /*ci \brief Set stream to specified alignment
94  *
95  * \param[inout] cdrs Stream to set, must be valid pointer
96  * \param[in] align Alignment to set
97  */
98 CDRDllExport void
99 CDR_Stream_align(struct CDR_Stream_t *stream,
100  RTI_UINT8 alignment);
101 
102 
103 #ifndef RTI_CERT
104 /*ci
105  * \brief
106  * Free resources of a stream
107  *
108  * \param[in] cdrs Stream to free
109  *
110  */
111 CDRDllExport void
112 CDR_Stream_free(struct CDR_Stream_t *cdrs);
113 #endif
114 
115 /*ci
116  * \brief
117  * Allocate and return a new stream
118  *
119  * \param[in] buffsize Size in bytes of stream buffer
120  *
121  * \return Pointer to allocated stream, is NULL if allocation failed
122  */
123 MUST_CHECK_RETURN CDRDllExport struct CDR_Stream_t*
124 CDR_Stream_alloc(RTI_UINT32 buffsize);
125 
126 /*ci
127  * \brief
128  * Reset stream pointer to start of buffer
129  *
130  * \param[in] cdrs Stream to reset
131  *
132  */
133 CDRDllExport void
134 CDR_Stream_reset(struct CDR_Stream_t *cdrs);
135 
136 /*ci
137  * \brief
138  * Set byte swap state of stream
139  *
140  * \param[in] cdrs Stream to set
141  * \param[in] littleEndian Flag to set stream for little endian byte order
142  *
143  */
144 CDRDllExport void
145 CDR_Stream_byteswap_set(struct CDR_Stream_t *cdrs, RTI_BOOL littleEndian);
146 
147 /*ci
148  * \brief
149  * Get endian and byte swap state of stream
150  *
151  * \param[in] cdrs Stream to set
152  * \param[in] littleEndian Flag to set stream for little endian byte order
153  *
154  */
155 CDRDllExport void
156 CDR_Stream_endian_and_byteswap_get(struct CDR_Stream_t *cdrs,
157  RTI_BOOL *need_byte_swap,
158  RTI_UINT16 *endian);
159 
160 /*ci
161  * \brief
162  * Get endian and byte swap state of stream
163  *
164  * \param[in] cdrs Stream to set
165  * \param[in] littleEndian Flag to set stream for little endian byte order
166  *
167  */
168 CDRDllExport void
169 CDR_Stream_endian_and_byteswap_set(struct CDR_Stream_t *cdrs,
170  RTI_BOOL need_byte_swap,
171  RTI_UINT16 endian);
172 
173 /*e \dref_CDR_Stream_get_current_position_offset
174  */
175 MUST_CHECK_RETURN CDRDllExport RTI_UINT32
176 CDR_Stream_get_current_position_offset(struct CDR_Stream_t *cdrs);
177 
178 /*e \dref_CDR_Stream_set_current_position_offset
179  */
180 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
181 CDR_Stream_set_current_position_offset(struct CDR_Stream_t *cdrs,RTI_UINT32 num);
182 
183 /*e \dref_CDR_Stream_increment_current_position
184  */
185 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
186 CDR_Stream_increment_current_position(struct CDR_Stream_t *me,RTI_INT32 amount);
187 
188 /*ci
189  * \brief
190  * Assign buffer to stream
191  *
192  * \param[in] me Stream
193  * \param[in] buf Pointer of new stream buffer
194  * \param[in] length Length in bytes of new stream buffer
195  *
196  * \return RTI_TRUE on success with new stream buffer assigned. RTI_FALSE on
197  * failure.
198  */
199 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
200 CDR_Stream_set_buffer(struct CDR_Stream_t *me,char *buf, RTI_UINT32 length);
201 
202 
203 /*e \dref_CDR_Stream_check_size
204  */
205 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
206 CDR_Stream_check_size(struct CDR_Stream_t *me, RTI_UINT32 size);
207 
208 /*e \dref_CDR_Stream_get_current_position_ptr
209  */
210 MUST_CHECK_RETURN CDRDllExport char*
211 CDR_Stream_get_current_position_ptr(struct CDR_Stream_t *me);
212 
213 /*ci
214  * \brief
215  * Return the size of the encapsulation header based on the logical size of a
216  * stream.
217  *
218  * \param[in] size Current size of a stream
219  *
220  * \return Return the size of the encapsulation header
221  */
222 MUST_CHECK_RETURN CDRDllExport RTI_UINT32
223 CDR_Stream_get_encapsulation_size(RTI_UINT32 size);
224 
225 /*e \dref_CDR_Stream_is_byte_swapped
226  */
227 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
228 CDR_Stream_is_byte_swapped(struct CDR_Stream_t *me);
229 
230 #ifdef __cplusplus
231 } /* extern "C" */
232 #endif
233 
234 
235 #endif /* cdr_stream_h */
236 
237 /*ci @} */

RTI Connext DDS Micro Version 2.4.11 Copyright © Mon Jul 23 2018 Real-Time Innovations, Inc