RTI Connext DDS Micro  Version 2.4.9
 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 /*e \dref_CDR_Stream_get_current_position_offset
148  */
149 MUST_CHECK_RETURN CDRDllExport RTI_UINT32
150 CDR_Stream_get_current_position_offset(struct CDR_Stream_t *cdrs);
151 
152 /*e \dref_CDR_Stream_set_current_position_offset
153  */
154 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
155 CDR_Stream_set_current_position_offset(struct CDR_Stream_t *cdrs,RTI_UINT32 num);
156 
157 /*e \dref_CDR_Stream_increment_current_position
158  */
159 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
160 CDR_Stream_increment_current_position(struct CDR_Stream_t *me,RTI_INT32 amount);
161 
162 /*ci
163  * \brief
164  * Assign buffer to stream
165  *
166  * \param[in] me Stream
167  * \param[in] buf Pointer of new stream buffer
168  * \param[in] length Length in bytes of new stream buffer
169  *
170  * \return RTI_TRUE on success with new stream buffer assigned. RTI_FALSE on
171  * failure.
172  */
173 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
174 CDR_Stream_set_buffer(struct CDR_Stream_t *me,char *buf, RTI_UINT32 length);
175 
176 
177 /*e \dref_CDR_Stream_check_size
178  */
179 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
180 CDR_Stream_check_size(struct CDR_Stream_t *me, RTI_UINT32 size);
181 
182 /*e \dref_CDR_Stream_get_current_position_ptr
183  */
184 MUST_CHECK_RETURN CDRDllExport char*
185 CDR_Stream_get_current_position_ptr(struct CDR_Stream_t *me);
186 
187 /*ci
188  * \brief
189  * Return the size of the encapsulation header based on the logical size of a
190  * stream.
191  *
192  * \param[in] size Current size of a stream
193  *
194  * \return Return the size of the encapsulation header
195  */
196 MUST_CHECK_RETURN CDRDllExport RTI_UINT32
197 CDR_Stream_get_encapsulation_size(RTI_UINT32 size);
198 
199 /*e \dref_CDR_Stream_is_byte_swapped
200  */
201 MUST_CHECK_RETURN CDRDllExport RTI_BOOL
202 CDR_Stream_is_byte_swapped(struct CDR_Stream_t *me);
203 
204 #ifdef __cplusplus
205 } /* extern "C" */
206 #endif
207 
208 
209 #endif /* cdr_stream_h */
210 
211 /*ci @} */

RTI Connext DDS Micro Version 2.4.9 Copyright © Thu Dec 15 2016 Real-Time Innovations, Inc