OpenDDS  Snapshot(2023/04/07-19:43)
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::EncapsulationHeader Class Reference

#include <Serializer.h>

Public Types

enum  Kind {
  KIND_CDR_BE = 0x0000, KIND_CDR_LE = 0x0001, KIND_PL_CDR_BE = 0x0002, KIND_PL_CDR_LE = 0x0003,
  KIND_CDR2_BE = 0x0006, KIND_CDR2_LE = 0x0007, KIND_D_CDR2_BE = 0x0008, KIND_D_CDR2_LE = 0x0009,
  KIND_PL_CDR2_BE = 0x000a, KIND_PL_CDR2_LE = 0x000b, KIND_XML = 0x0004, KIND_INVALID = 0xFFFF
}
 

Public Member Functions

 EncapsulationHeader (Kind k=KIND_CDR_BE, ACE_CDR::UShort options=0)
 
 EncapsulationHeader (const Encoding &enc, Extensibility ext, ACE_CDR::UShort options=0)
 
Kind kind () const
 
void kind (Kind value)
 
ACE_UINT16 options () const
 
void options (ACE_UINT16 value)
 
bool is_good () const
 
bool from_encoding (const Encoding &encoding, Extensibility extensibility)
 
bool to_encoding (Encoding &encoding, Extensibility expected_extensibility)
 
bool to_any_encoding (Encoding &encoding)
 
String to_string () const
 

Static Public Member Functions

static bool set_encapsulation_options (Message_Block_Ptr &mb)
 

Static Public Attributes

static const size_t serialized_size = 4
 
static const size_t padding_marker_byte_index = 3
 
static const size_t padding_marker_alignment = 4
 

Private Member Functions

bool to_encoding_i (Encoding &encoding, Extensibility *expected_extensibility_ptr)
 

Private Attributes

Kind kind_
 The first two bytes as a big endian integer. More...
 
ACE_CDR::UShort options_
 The last two bytes as a big endian integer. More...
 

Detailed Description

Represents the RTPS encapsulation header for serialized data.

This consists of 4 bytes that appear in front of the data. The first two bytes represents the kind of the encoding the data uses and the last two bytes (known as "options") are traditionally reserved.

See XTypes 1.3 7.6.3.1.2

Definition at line 230 of file Serializer.h.

Member Enumeration Documentation

◆ Kind

The known possible values of the first 2 bytes represented as big endian integers.

Enumerator
KIND_CDR_BE 
KIND_CDR_LE 
KIND_PL_CDR_BE 
KIND_PL_CDR_LE 
KIND_CDR2_BE 
KIND_CDR2_LE 
KIND_D_CDR2_BE 
KIND_D_CDR2_LE 
KIND_PL_CDR2_BE 
KIND_PL_CDR2_LE 
KIND_XML 
KIND_INVALID 

Definition at line 236 of file Serializer.h.

Constructor & Destructor Documentation

◆ EncapsulationHeader() [1/2]

OpenDDS::DCPS::EncapsulationHeader::EncapsulationHeader ( Kind  k = KIND_CDR_BE,
ACE_CDR::UShort  options = 0 
)

Definition at line 98 of file Serializer.cpp.

99  : kind_(kind)
100  , options_(options)
101 {
102 }
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295
ACE_CDR::UShort options_
The last two bytes as a big endian integer.
Definition: Serializer.h:297

◆ EncapsulationHeader() [2/2]

OpenDDS::DCPS::EncapsulationHeader::EncapsulationHeader ( const Encoding enc,
Extensibility  ext,
ACE_CDR::UShort  options = 0 
)

Success can be verified using is_good()

Definition at line 104 of file Serializer.cpp.

References from_encoding(), kind_, and KIND_INVALID.

106  , options_(options)
107 {
108  if (!from_encoding(enc, ext)) {
110  }
111 }
bool from_encoding(const Encoding &encoding, Extensibility extensibility)
Definition: Serializer.cpp:113
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295
ACE_CDR::UShort options_
The last two bytes as a big endian integer.
Definition: Serializer.h:297

Member Function Documentation

◆ from_encoding()

bool OpenDDS::DCPS::EncapsulationHeader::from_encoding ( const Encoding encoding,
Extensibility  extensibility 
)

Translate from an encoding, returns false if it failed.

Definition at line 113 of file Serializer.cpp.

References ACE_ERROR, OpenDDS::DCPS::APPENDABLE, OpenDDS::DCPS::ENDIAN_BIG, OpenDDS::DCPS::Encoding::endianness(), OpenDDS::DCPS::LogLevel::Error, OpenDDS::DCPS::FINAL, OpenDDS::DCPS::Encoding::kind(), kind_, KIND_CDR2_BE, KIND_CDR2_LE, KIND_CDR_BE, KIND_CDR_LE, KIND_D_CDR2_BE, KIND_D_CDR2_LE, KIND_PL_CDR2_BE, KIND_PL_CDR2_LE, KIND_PL_CDR_BE, KIND_PL_CDR_LE, OpenDDS::DCPS::Encoding::kind_to_string(), OpenDDS::DCPS::Encoding::KIND_XCDR1, OpenDDS::DCPS::Encoding::KIND_XCDR2, LM_ERROR, OpenDDS::DCPS::log_level, and OpenDDS::DCPS::MUTABLE.

Referenced by EncapsulationHeader(), and OpenDDS::DCPS::DataWriterImpl::serialize_sample().

115 {
116  const bool big = encoding.endianness() == ENDIAN_BIG;
117  switch (encoding.kind()) {
119  switch (extensibility) {
120  case FINAL:
121  case APPENDABLE:
122  kind_ = big ? KIND_CDR_BE : KIND_CDR_LE;
123  break;
124  case MUTABLE:
126  break;
127  }
128  break;
130  switch (extensibility) {
131  case FINAL:
132  kind_ = big ? KIND_CDR2_BE : KIND_CDR2_LE;
133  break;
134  case APPENDABLE:
136  break;
137  case MUTABLE:
139  break;
140  }
141  break;
142  default:
143  if (log_level >= LogLevel::Error) {
144  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: EncapsulationHeader::from_encoding: "
145  "Got Encoding With Unsupported Kind: %C\n",
147  }
148  return false;
149  }
150  return true;
151 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
static String kind_to_string(Kind value)
Definition: Serializer.cpp:326
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295
Endianness endianness() const
Definition: Serializer.inl:64
extensibility(MUTABLE) struct TypeLookup_getTypes_In
Definition: TypeLookup.idl:29

◆ is_good()

ACE_INLINE bool OpenDDS::DCPS::EncapsulationHeader::is_good ( ) const

post-initialization test for a successful call to from_encoding during construction of this encapsulation header.

Definition at line 173 of file Serializer.inl.

References ACE_INLINE, and OpenDDS::DCPS::Encoding::kind_.

Referenced by OpenDDS::DCPS::operator<<().

174 {
175  return kind_ != KIND_INVALID;
176 }
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295

◆ kind() [1/2]

ACE_INLINE EncapsulationHeader::Kind OpenDDS::DCPS::EncapsulationHeader::kind ( void  ) const

Definition at line 161 of file Serializer.inl.

References ACE_INLINE, and OpenDDS::DCPS::Encoding::kind_.

Referenced by OpenDDS::DCPS::operator<<(), and OpenDDS::DCPS::operator>>().

162 {
163  return kind_;
164 }
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295

◆ kind() [2/2]

ACE_INLINE void OpenDDS::DCPS::EncapsulationHeader::kind ( Kind  value)

Definition at line 167 of file Serializer.inl.

References ACE_INLINE, OpenDDS::DCPS::Encoding::kind_, and value.

168 {
169  kind_ = value;
170 }
const LogLevel::Value value
Definition: debug.cpp:61
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295

◆ options() [1/2]

ACE_INLINE ACE_UINT16 OpenDDS::DCPS::EncapsulationHeader::options ( void  ) const

Definition at line 179 of file Serializer.inl.

References ACE_INLINE.

Referenced by OpenDDS::DCPS::operator<<(), and OpenDDS::DCPS::operator>>().

180 {
181  return options_;
182 }
ACE_CDR::UShort options_
The last two bytes as a big endian integer.
Definition: Serializer.h:297

◆ options() [2/2]

ACE_INLINE void OpenDDS::DCPS::EncapsulationHeader::options ( ACE_UINT16  value)

Definition at line 185 of file Serializer.inl.

References ACE_INLINE, and value.

186 {
187  options_ = value;
188 }
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::UShort options_
The last two bytes as a big endian integer.
Definition: Serializer.h:297

◆ set_encapsulation_options()

bool OpenDDS::DCPS::EncapsulationHeader::set_encapsulation_options ( Message_Block_Ptr mb)
static

Definition at line 251 of file Serializer.cpp.

References ACE_ERROR, OpenDDS::DCPS::LogLevel::Error, ACE_Message_Block::length(), LM_ERROR, OpenDDS::DCPS::log_level, padding_marker_alignment, padding_marker_byte_index, and ACE_Message_Block::rd_ptr().

Referenced by OpenDDS::DCPS::DataWriterImpl::serialize_sample().

252 {
253  if (mb->length() < padding_marker_byte_index + 1) {
254  if (log_level >= LogLevel::Error) {
255  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: EncapsulationHeader::set_encapsulation_options: "
256  "Insufficient buffer size %B\n", mb->length()));
257  }
258  return false;
259  }
260 
261  mb->rd_ptr()[padding_marker_byte_index] |= ((padding_marker_alignment - mb->length() % padding_marker_alignment) & 0x03);
262  return true;
263 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
static const size_t padding_marker_alignment
Definition: Serializer.h:253
static const size_t padding_marker_byte_index
Definition: Serializer.h:252

◆ to_any_encoding()

bool OpenDDS::DCPS::EncapsulationHeader::to_any_encoding ( Encoding encoding)

Like to_encoding, but without an expected extensibility.

Definition at line 159 of file Serializer.cpp.

References to_encoding_i().

160 {
161  return to_encoding_i(encoding, 0);
162 }
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
bool to_encoding_i(Encoding &encoding, Extensibility *expected_extensibility_ptr)
Definition: Serializer.cpp:164

◆ to_encoding()

bool OpenDDS::DCPS::EncapsulationHeader::to_encoding ( Encoding encoding,
Extensibility  expected_extensibility 
)

Translate to an encoding, returns false if it failed.

Definition at line 153 of file Serializer.cpp.

References to_encoding_i().

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::dds_demarshal(), OpenDDS::RTPS::Spdp::SpdpTransport::handle_input(), OpenDDS::DCPS::FilterEvaluator::SerializedForEval::lookup(), and OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::lookup_instance().

155 {
156  return to_encoding_i(encoding, &expected_extensibility);
157 }
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
bool to_encoding_i(Encoding &encoding, Extensibility *expected_extensibility_ptr)
Definition: Serializer.cpp:164

◆ to_encoding_i()

bool OpenDDS::DCPS::EncapsulationHeader::to_encoding_i ( Encoding encoding,
Extensibility expected_extensibility_ptr 
)
private

Definition at line 164 of file Serializer.cpp.

References ACE_ERROR, OpenDDS::DCPS::APPENDABLE, OpenDDS::DCPS::ENDIAN_BIG, OpenDDS::DCPS::ENDIAN_LITTLE, OpenDDS::DCPS::Encoding::endianness(), OpenDDS::DCPS::LogLevel::Error, OpenDDS::DCPS::ext_to_string(), OpenDDS::DCPS::FINAL, OpenDDS::DCPS::Encoding::kind(), kind_, KIND_CDR2_BE, KIND_CDR2_LE, KIND_CDR_BE, KIND_CDR_LE, KIND_D_CDR2_BE, KIND_D_CDR2_LE, KIND_PL_CDR2_BE, KIND_PL_CDR2_LE, KIND_PL_CDR_BE, KIND_PL_CDR_LE, OpenDDS::DCPS::Encoding::KIND_XCDR1, OpenDDS::DCPS::Encoding::KIND_XCDR2, LM_ERROR, OpenDDS::DCPS::log_level, OpenDDS::DCPS::MUTABLE, and to_string().

Referenced by to_any_encoding(), and to_encoding().

166 {
167  Extensibility expected_extensibility = expected_extensibility_ptr ?
168  *expected_extensibility_ptr : FINAL; // Placeholder, doesn't matter
169  bool wrong_extensibility = true;
170  switch (kind_) {
171  case KIND_CDR_BE:
174  wrong_extensibility = expected_extensibility == MUTABLE;
175  break;
176 
177  case KIND_CDR_LE:
180  wrong_extensibility = expected_extensibility == MUTABLE;
181  break;
182 
183  case KIND_PL_CDR_BE:
186  wrong_extensibility = expected_extensibility != MUTABLE;
187  break;
188 
189  case KIND_PL_CDR_LE:
192  wrong_extensibility = expected_extensibility != MUTABLE;
193  break;
194 
195  case KIND_CDR2_BE:
198  wrong_extensibility = expected_extensibility != FINAL;
199  break;
200 
201  case KIND_CDR2_LE:
204  wrong_extensibility = expected_extensibility != FINAL;
205  break;
206 
207  case KIND_D_CDR2_BE:
210  wrong_extensibility = expected_extensibility != APPENDABLE;
211  break;
212 
213  case KIND_D_CDR2_LE:
216  wrong_extensibility = expected_extensibility != APPENDABLE;
217  break;
218 
219  case KIND_PL_CDR2_BE:
222  wrong_extensibility = expected_extensibility != MUTABLE;
223  break;
224 
225  case KIND_PL_CDR2_LE:
228  wrong_extensibility = expected_extensibility != MUTABLE;
229  break;
230 
231  default:
232  if (log_level >= LogLevel::Error) {
233  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: EncapsulationHeader::to_encoding: "
234  "Unsupported Encoding: %C\n", to_string().c_str()));
235  }
236  return false;
237  }
238 
239  if (expected_extensibility_ptr && wrong_extensibility) {
240  if (log_level >= LogLevel::Error) {
241  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: EncapsulationHeader::to_encoding: "
242  "expected %C extensibility, but got %C\n",
243  ext_to_string(*expected_extensibility_ptr), to_string().c_str()));
244  }
245  return false;
246  }
247 
248  return true;
249 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295
Endianness endianness() const
Definition: Serializer.inl:64
const char * ext_to_string(Extensibility ext)
Definition: Serializer.h:75

◆ to_string()

String OpenDDS::DCPS::EncapsulationHeader::to_string ( void  ) const

Definition at line 265 of file Serializer.cpp.

References kind_, KIND_CDR2_BE, KIND_CDR2_LE, KIND_CDR_BE, KIND_CDR_LE, KIND_D_CDR2_BE, KIND_D_CDR2_LE, KIND_INVALID, KIND_PL_CDR2_BE, KIND_PL_CDR2_LE, KIND_PL_CDR_BE, KIND_PL_CDR_LE, KIND_XML, and OpenDDS::DCPS::to_dds_string().

Referenced by to_encoding_i().

266 {
267  switch (kind_) {
268  case KIND_CDR_BE:
269  return "CDR/XCDR1 Big Endian Plain";
270  case KIND_CDR_LE:
271  return "CDR/XCDR1 Little Endian Plain";
272  case KIND_PL_CDR_BE:
273  return "CDR/XCDR1 Big Endian Parameter List";
274  case KIND_PL_CDR_LE:
275  return "CDR/XCDR1 Little Endian Parameter List";
276  case KIND_CDR2_BE:
277  return "XCDR2 Big Endian Plain";
278  case KIND_CDR2_LE:
279  return "XCDR2 Little Endian Plain";
280  case KIND_D_CDR2_BE:
281  return "XCDR2 Big Endian Delimited";
282  case KIND_D_CDR2_LE:
283  return "XCDR2 Little Endian Delimited";
284  case KIND_PL_CDR2_BE:
285  return "XCDR2 Big Endian Parameter List";
286  case KIND_PL_CDR2_LE:
287  return "XCDR2 Little Endian Parameter List";
288  case KIND_XML:
289  return "XML";
290  case KIND_INVALID:
291  return "Invalid";
292  default:
293  return "Unknown: " + to_dds_string(static_cast<unsigned>(kind_), true);
294  }
295 }
Kind kind_
The first two bytes as a big endian integer.
Definition: Serializer.h:295
String to_dds_string(unsigned short to_convert)

Member Data Documentation

◆ kind_

Kind OpenDDS::DCPS::EncapsulationHeader::kind_
private

The first two bytes as a big endian integer.

Definition at line 295 of file Serializer.h.

Referenced by EncapsulationHeader(), from_encoding(), to_encoding_i(), OpenDDS::DCPS::Encoding::to_string(), and to_string().

◆ options_

ACE_CDR::UShort OpenDDS::DCPS::EncapsulationHeader::options_
private

The last two bytes as a big endian integer.

Definition at line 297 of file Serializer.h.

◆ padding_marker_alignment

const size_t OpenDDS::DCPS::EncapsulationHeader::padding_marker_alignment = 4
static

Definition at line 253 of file Serializer.h.

Referenced by set_encapsulation_options().

◆ padding_marker_byte_index

const size_t OpenDDS::DCPS::EncapsulationHeader::padding_marker_byte_index = 3
static

Definition at line 252 of file Serializer.h.

Referenced by set_encapsulation_options().

◆ serialized_size

const size_t OpenDDS::DCPS::EncapsulationHeader::serialized_size = 4
static

The documentation for this class was generated from the following files: