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

#include <DataSampleHeader.h>

Inheritance diagram for OpenDDS::DCPS::DataSampleHeader:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::DataSampleHeader:
Collaboration graph
[legend]

Classes

struct  MaybeGuard
 

Public Types

enum  { MESSAGE_ID_OFFSET = 0, SUBMESSAGE_ID_OFFSET = 1, FLAGS_OFFSET = 2 }
 

Public Member Functions

 DataSampleHeader ()
 
 DataSampleHeader (ACE_Message_Block &buffer)
 Construct with values extracted from a buffer. More...
 
DataSampleHeaderoperator= (ACE_Message_Block &buffer)
 Assignment from an ACE_Message_Block. More...
 
size_t get_serialized_size () const
 Amount of data read when initializing from a buffer. More...
 
void init (ACE_Message_Block *buffer)
 Implement load from buffer. More...
 
bool into_received_data_sample (ReceivedDataSample &rds)
 
ACE_UINT32 message_length () const
 
bool more_fragments () const
 
void pdu_remaining (size_t)
 
bool valid_data () const
 Returns true if the sample has a complete serialized payload. More...
 
DDS::InstanceStateKind instance_state () const
 

Static Public Member Functions

static ACE_UINT8 mask_flag (DataSampleHeaderFlag flag)
 
static ACE_UINT8 mask_flag (DataSampleHeaderFlag2 flag)
 
static void clear_flag (DataSampleHeaderFlag flag, ACE_Message_Block *buffer)
 
static void set_flag (DataSampleHeaderFlag flag, ACE_Message_Block *buffer)
 
static bool test_flag (DataSampleHeaderFlag flag, const ACE_Message_Block *buffer)
 
static bool partial (const ACE_Message_Block &mb)
 Does the data in this mb constitute a partial Sample Header? More...
 
static void add_cfentries (const GUIDSeq *guids, ACE_Message_Block *mb)
 
static void split (const ACE_Message_Block &orig, size_t size, Message_Block_Ptr &head, Message_Block_Ptr &tail)
 
static bool join (const DataSampleHeader &first, const DataSampleHeader &second, DataSampleHeader &result)
 
static size_t get_max_serialized_size ()
 Similar to IDL compiler generated methods. More...
 
static ACE_Message_Blockalloc_msgblock (const ACE_Message_Block &mb, size_t size, bool use_data_alloc)
 
static void split_payload (const ACE_Message_Block &orig, size_t size, Message_Block_Ptr &head, Message_Block_Ptr &tail)
 

Public Attributes

char message_id_
 The enum MessageId. More...
 
char submessage_id_
 Implementation-specific sub-message Ids. More...
 
bool byte_order_: 1
 
bool coherent_change_: 1
 
bool historic_sample_: 1
 
bool lifespan_duration_: 1
 
bool group_coherent_: 1
 
bool content_filter_: 1
 
bool sequence_repair_: 1
 
bool more_fragments_: 1
 The current "Data Sample" needs reassembly before further processing. More...
 
bool cdr_encapsulation_: 1
 
bool key_fields_only_: 1
 Only the key fields of the data sample are present in the payload. More...
 
bool reserved_1: 1
 
bool reserved_2: 1
 
bool reserved_3: 1
 
bool reserved_4: 1
 
bool reserved_5: 1
 
bool reserved_6: 1
 
ACE_UINT32 message_length_
 
SequenceNumber sequence_
 
ACE_INT32 source_timestamp_sec_
 
ACE_UINT32 source_timestamp_nanosec_
 
ACE_INT32 lifespan_duration_sec_
 
ACE_UINT32 lifespan_duration_nanosec_
 
GUID_t publication_id_
 
GUID_t publisher_id_
 
GUIDSeq content_filter_entries_
 

Private Attributes

size_t serialized_size_
 Keep track of the amount of data read from a buffer. More...
 

Detailed Description

The header message of a data sample. This header and the data sample are in different message block and will be chained together.

Definition at line 79 of file DataSampleHeader.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
MESSAGE_ID_OFFSET 
SUBMESSAGE_ID_OFFSET 
FLAGS_OFFSET 

Definition at line 80 of file DataSampleHeader.h.

Constructor & Destructor Documentation

◆ DataSampleHeader() [1/2]

ACE_INLINE OpenDDS::DCPS::DataSampleHeader::DataSampleHeader ( )

Definition at line 9 of file DataSampleHeader.inl.

References ACE_CDR_BYTE_ORDER, and ACE_INLINE.

10  : message_id_(0)
11  , submessage_id_(0)
12  , byte_order_(ACE_CDR_BYTE_ORDER)
13  , coherent_change_(0)
14  , historic_sample_(0)
16  , group_coherent_(0)
17  , content_filter_(0)
18  , sequence_repair_(0)
19  , more_fragments_(0)
21  , key_fields_only_(0)
22  , reserved_1(0)
23  , reserved_2(0)
24  , reserved_3(0)
25  , reserved_4(0)
26  , reserved_5(0)
27  , reserved_6(0)
28  , message_length_(0)
29  , sequence_()
36  , serialized_size_(0)
37 {
38 }
char message_id_
The enum MessageId.
const GUID_t GUID_UNKNOWN
Nil value for GUID.
Definition: GuidUtils.h:59
bool key_fields_only_
Only the key fields of the data sample are present in the payload.
bool more_fragments_
The current "Data Sample" needs reassembly before further processing.
char submessage_id_
Implementation-specific sub-message Ids.
size_t serialized_size_
Keep track of the amount of data read from a buffer.

◆ DataSampleHeader() [2/2]

ACE_INLINE OpenDDS::DCPS::DataSampleHeader::DataSampleHeader ( ACE_Message_Block buffer)
explicit

Construct with values extracted from a buffer.

Definition at line 41 of file DataSampleHeader.inl.

References ACE_CDR_BYTE_ORDER, ACE_INLINE, and init().

42  : message_id_(0)
43  , submessage_id_(0)
44  , byte_order_(ACE_CDR_BYTE_ORDER)
45  , coherent_change_(0)
46  , historic_sample_(0)
48  , group_coherent_(0)
49  , content_filter_(0)
50  , sequence_repair_(0)
51  , more_fragments_(0)
53  , key_fields_only_(0)
54  , reserved_1(0)
55  , reserved_2(0)
56  , reserved_3(0)
57  , reserved_4(0)
58  , reserved_5(0)
59  , reserved_6(0)
60  , message_length_(0)
61  , sequence_()
68 {
69  this->init(&buffer);
70 }
char message_id_
The enum MessageId.
const GUID_t GUID_UNKNOWN
Nil value for GUID.
Definition: GuidUtils.h:59
bool key_fields_only_
Only the key fields of the data sample are present in the payload.
bool more_fragments_
The current "Data Sample" needs reassembly before further processing.
void init(ACE_Message_Block *buffer)
Implement load from buffer.
char submessage_id_
Implementation-specific sub-message Ids.

Member Function Documentation

◆ add_cfentries()

void OpenDDS::DCPS::DataSampleHeader::add_cfentries ( const GUIDSeq guids,
ACE_Message_Block mb 
)
static

Marshal the "guids" as an optional header chained as to the continuation of "mb" (which must already be a valid DataSampleHeader serialization). Any existing payload of "mb" (its continuation) will be chained after the new optional header part. "guids" may be null, same serialization as 0.

Definition at line 331 of file DataSampleHeader.cpp.

References ACE_CDR_BYTE_ORDER, alloc_msgblock(), OpenDDS::DCPS::BYTE_ORDER_FLAG, ACE_Message_Block::cont(), OpenDDS::STUN::encoding(), OpenDDS::DCPS::int32_cdr_size, OpenDDS::DCPS::serialized_size(), and test_flag().

Referenced by OpenDDS::DCPS::DataLinkSet::send(), and split().

332 {
333  Encoding encoding(encoding_kind,
334  ACE_CDR_BYTE_ORDER != test_flag(BYTE_ORDER_FLAG, mb));
335  size_t size = 0;
336  if (guids) {
337  serialized_size(encoding, size, *guids);
338  } else {
339  size = int32_cdr_size;
340  }
341  ACE_Message_Block* optHdr = alloc_msgblock(*mb, size, false);
342 
343  Serializer ser(optHdr, encoding);
344  if (guids) {
345  ser << *guids;
346  } else {
347  ser << CORBA::ULong(0);
348  }
349 
350  // New chain: mb (DataSampleHeader), optHdr (GUIDSeq), data (Foo or control)
351  optHdr->cont(mb->cont());
352  mb->cont(optHdr);
353 }
static ACE_Message_Block * alloc_msgblock(const ACE_Message_Block &mb, size_t size, bool use_data_alloc)
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
const size_t int32_cdr_size
Definition: Serializer.h:95
ACE_CDR::ULong ULong
static bool test_flag(DataSampleHeaderFlag flag, const ACE_Message_Block *buffer)
ACE_Message_Block * cont(void) const
void serialized_size(const Encoding &encoding, size_t &size, const SequenceNumber &)

◆ alloc_msgblock()

ACE_Message_Block * OpenDDS::DCPS::DataSampleHeader::alloc_msgblock ( const ACE_Message_Block mb,
size_t  size,
bool  use_data_alloc 
)
static

Definition at line 90 of file DataSampleHeader.cpp.

References ACE_Message_Block::access_allocators(), ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY, ACE_NEW_MALLOC_RETURN, OpenDDS::RTPS::DATA, ACE_Message_Block::locking_strategy(), malloc(), ACE_Time_Value::max_time, ACE_Message_Block::MB_DATA, and ACE_Time_Value::zero.

Referenced by add_cfentries(), and split().

92 {
93  enum { DATA, DB, MB, N_ALLOC };
94  ACE_Allocator* allocators[N_ALLOC];
95  // It's an ACE bug that access_allocators isn't const
96  ACE_Message_Block& mut_mb = const_cast<ACE_Message_Block&>(mb);
97  mut_mb.access_allocators(allocators[DATA], allocators[DB], allocators[MB]);
98  if (allocators[MB]) {
99  ACE_Message_Block* result;
100  ACE_NEW_MALLOC_RETURN(result,
101  static_cast<ACE_Message_Block*>(
102  allocators[MB]->malloc(sizeof(ACE_Message_Block))),
103  ACE_Message_Block(size,
105  0, // cont
106  0, // data
107  use_data_alloc ? allocators[DATA] : 0,
108  mut_mb.locking_strategy(), // locking_strategy
112  allocators[DB],
113  allocators[MB]),
114  0);
115  return result;
116  } else {
117  return new ACE_Message_Block(size,
119  0, // cont
120  0, // data
121  use_data_alloc ? allocators[DATA] : 0,
122  mut_mb.locking_strategy(), // locking_strategy
126  allocators[DB]);
127  }
128 }
static const ACE_Time_Value max_time
ACE_Lock * locking_strategy(void)
void access_allocators(ACE_Allocator *&allocator_strategy, ACE_Allocator *&data_block_allocator, ACE_Allocator *&message_block_allocator)
void * malloc(size_t)
#define ACE_NEW_MALLOC_RETURN(POINTER, ALLOCATOR, CONSTRUCTOR, RET_VAL)
static const ACE_Time_Value zero
#define ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY

◆ clear_flag()

ACE_INLINE void OpenDDS::DCPS::DataSampleHeader::clear_flag ( DataSampleHeaderFlag  flag,
ACE_Message_Block buffer 
)
static

The clear_flag and set_flag methods are a hack to update the header flags after a sample has been serialized without deserializing the entire message. This method will break if the current Serializer behavior changes.

Definition at line 111 of file DataSampleHeader.inl.

References ACE_ERROR, ACE_INLINE, ACE_TEXT(), ACE_Message_Block::base(), ACE_Message_Block::end(), FLAGS_OFFSET, LM_ERROR, ACE_Message_Block::locking_strategy(), and mask_flag().

113 {
114  char* base = buffer->base();
115 
116  // verify sufficient length exists:
117  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
118  ACE_ERROR((LM_ERROR,
119  ACE_TEXT("(%P|%t) ERROR: DataSampleHeader::clear_flag: ")
120  ACE_TEXT("ACE_Message_Block too short (missing flags octet).\n")));
121  return;
122  }
123 
124  MaybeGuard g(buffer->locking_strategy());
125  base[FLAGS_OFFSET] &= ~mask_flag(flag);
126 }
#define ACE_ERROR(X)
ACE_Lock * locking_strategy(void)
char * end(void) const
ACE_TEXT("TCP_Factory")
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)
char * base(void) const

◆ get_max_serialized_size()

ACE_INLINE size_t OpenDDS::DCPS::DataSampleHeader::get_max_serialized_size ( )
static

Similar to IDL compiler generated methods.

Definition at line 87 of file DataSampleHeader.inl.

References ACE_INLINE.

Referenced by OpenDDS::DCPS::DataLink::create_control(), OpenDDS::DCPS::DataWriterImpl::create_control_message(), OpenDDS::DCPS::ReplayerImpl::create_sample_data_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), OpenDDS::RTPS::Sedp::Writer::end_historic_samples(), OpenDDS::DCPS::UdpDataLink::open(), partial(), OpenDDS::RTPS::Sedp::Writer::request_ack(), OpenDDS::DCPS::TcpDataLink::request_ack_received(), OpenDDS::DCPS::TransportSendStrategy::send(), OpenDDS::DCPS::ShmemDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_graceful_disconnect_message(), OpenDDS::RTPS::Sedp::TypeLookupReplyWriter::send_type_lookup_reply(), OpenDDS::RTPS::Sedp::TypeLookupRequestWriter::send_type_lookup_request(), split(), OpenDDS::RTPS::Sedp::Writer::write_parameter_list(), OpenDDS::RTPS::Sedp::LivelinessWriter::write_participant_message(), OpenDDS::RTPS::Sedp::SecurityWriter::write_stateless_message(), OpenDDS::RTPS::Sedp::DiscoveryWriter::write_unregister_dispose(), and OpenDDS::RTPS::Sedp::SecurityWriter::write_volatile_message_secure().

88 {
89  return 1 + // message_id_;
90  1 + // submessage_id_;
91  2 + // flags
92  4 + // message_length_;
93  8 + // sequence_;
94  4 + // source_timestamp_sec_;
95  4 + // source_timestamp_nanosec_;
96  4 + // lifespan_duration_sec_;
97  4 + // lifespan_duration_nanosec_;
98  16 + // publication_id_;
99  16 ; // publisher_id_;
100  // content_filter_entries_ is not marsahled into the same Data Block
101  // so it is not part of the max_serialized_size() which is used to allocate
102 }

◆ get_serialized_size()

ACE_INLINE size_t OpenDDS::DCPS::DataSampleHeader::get_serialized_size ( ) const

Amount of data read when initializing from a buffer.

Definition at line 81 of file DataSampleHeader.inl.

References ACE_INLINE, and serialized_size_.

82 {
83  return serialized_size_;
84 }
size_t serialized_size_
Keep track of the amount of data read from a buffer.

◆ init()

void OpenDDS::DCPS::DataSampleHeader::init ( ACE_Message_Block buffer)

Implement load from buffer.

Definition at line 180 of file DataSampleHeader.cpp.

References ACE_CDR_BYTE_ORDER, OpenDDS::DCPS::byte_cdr_size, byte_order_, OpenDDS::DCPS::BYTE_ORDER_FLAG, OpenDDS::DCPS::CDR_ENCAP_FLAG, cdr_encapsulation_, coherent_change_, OpenDDS::DCPS::COHERENT_CHANGE_FLAG, content_filter_, content_filter_entries_, OpenDDS::DCPS::CONTENT_FILTER_FLAG, OpenDDS::STUN::encoding(), group_coherent_, OpenDDS::DCPS::GROUP_COHERENT_FLAG, historic_sample_, OpenDDS::DCPS::HISTORIC_SAMPLE_FLAG, key_fields_only_, OpenDDS::DCPS::KEY_ONLY_FLAG, lifespan_duration_, OpenDDS::DCPS::LIFESPAN_DURATION_FLAG, lifespan_duration_nanosec_, lifespan_duration_sec_, mask_flag(), message_id_, message_length_, more_fragments_, OpenDDS::DCPS::MORE_FRAGMENTS_FLAG, publication_id_, publisher_id_, sequence_, sequence_repair_, OpenDDS::DCPS::SEQUENCE_REPAIR_FLAG, OpenDDS::DCPS::serialized_size(), serialized_size_, source_timestamp_nanosec_, source_timestamp_sec_, submessage_id_, and OpenDDS::DCPS::Serializer::swap_bytes().

Referenced by DataSampleHeader(), and operator=().

181 {
182  Encoding encoding(encoding_kind);
183  Serializer reader(buffer, encoding);
184  serialized_size_ = 0;
185 
186  // Only byte-sized reads until we get the byte_order_ flag.
187 
188  if (!(reader >> this->message_id_)) {
189  return;
190  }
192 
193  if (!(reader >> this->submessage_id_)) {
194  return;
195  }
197 
198  // Extract the flag values.
199  ACE_CDR::Octet byte;
200  if (!(reader >> ACE_InputCDR::to_octet(byte))) {
201  return;
202  }
204 
205  this->byte_order_ = byte & mask_flag(BYTE_ORDER_FLAG);
213 
214  // Set swap_bytes flag to the Serializer if data sample from
215  // the publisher is in different byte order.
216  reader.swap_bytes(this->byte_order_ != ACE_CDR_BYTE_ORDER);
217 
218  if (!(reader >> ACE_InputCDR::to_octet(byte))) {
219  return;
220  }
221  serialized_size_ += sizeof(byte);
223  this->key_fields_only_ = byte & mask_flag(KEY_ONLY_FLAG);
224 
225  if (!(reader >> this->message_length_)) {
226  return;
227  }
229 
230  if (!(reader >> this->sequence_)) {
231  return;
232  }
234 
235  if (!(reader >> this->source_timestamp_sec_)) {
236  return;
237  }
239 
240  if (!(reader >> this->source_timestamp_nanosec_)) {
241  return;
242  }
244 
245  if (this->lifespan_duration_) {
246  if (!(reader >> this->lifespan_duration_sec_)) {
247  return;
248  }
250 
251  if (!(reader >> this->lifespan_duration_nanosec_)) {
252  return;
253  }
255  }
256 
257  if (!(reader >> this->publication_id_)) {
258  return;
259  }
261 
262 #ifndef OPENDDS_NO_OBJECT_MODEL_PROFILE
263  if (this->group_coherent_) {
264  if (!(reader >> this->publisher_id_)) {
265  return;
266  }
268  }
269 #endif
270 
271  if (this->content_filter_) {
272  if (!(reader >> this->content_filter_entries_)) {
273  return;
274  }
276  }
277 }
ACE_Byte Octet
char message_id_
The enum MessageId.
bool key_fields_only_
Only the key fields of the data sample are present in the payload.
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
bool more_fragments_
The current "Data Sample" needs reassembly before further processing.
void serialized_size(const Encoding &encoding, size_t &size, const SequenceNumber &)
const size_t byte_cdr_size
Definition: Serializer.h:90
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)
char submessage_id_
Implementation-specific sub-message Ids.
size_t serialized_size_
Keep track of the amount of data read from a buffer.

◆ instance_state()

DDS::InstanceStateKind OpenDDS::DCPS::DataSampleHeader::instance_state ( ) const
inline

◆ into_received_data_sample()

bool OpenDDS::DCPS::DataSampleHeader::into_received_data_sample ( ReceivedDataSample rds)

Definition at line 693 of file DataSampleHeader.cpp.

References OpenDDS::DCPS::ReceivedDataSample::header_, OpenDDS::DCPS::DataSampleHeader::MaybeGuard::non_lock, and OPENDDS_END_VERSIONED_NAMESPACE_DECL.

694 {
695  rds.header_ = *this;
696  return true;
697 }

◆ join()

bool OpenDDS::DCPS::DataSampleHeader::join ( const DataSampleHeader first,
const DataSampleHeader second,
DataSampleHeader result 
)
static

If "first" and "second" are two fragments of the same original message (as created by split()), return true and set up the "result" header to match the original header. Joining the data payload is the responsibility of the caller (manipulate the continuation chain).

Definition at line 454 of file DataSampleHeader.cpp.

References content_filter_, content_filter_entries_, message_length_, more_fragments_, and sequence_.

Referenced by OpenDDS::DCPS::TransportReassembly::FragInfo::insert().

456 {
457  if (!first.more_fragments_ || first.sequence_ != second.sequence_) {
458  return false;
459  }
460  result = second;
461  result.message_length_ += first.message_length_;
462  if (first.content_filter_) {
463  result.content_filter_ = true;
464  const CORBA::ULong entries = first.content_filter_entries_.length();
465  CORBA::ULong x = result.content_filter_entries_.length();
466  result.content_filter_entries_.length(x + entries);
467  for (CORBA::ULong i(entries); i > 0;) {
468  result.content_filter_entries_[x++] = first.content_filter_entries_[--i];
469  }
470  }
471  return true;
472 }
ACE_CDR::ULong ULong

◆ mask_flag() [1/2]

static ACE_UINT8 OpenDDS::DCPS::DataSampleHeader::mask_flag ( DataSampleHeaderFlag  flag)
inlinestatic

Definition at line 187 of file DataSampleHeader.h.

Referenced by clear_flag(), init(), partial(), set_flag(), and test_flag().

187 { return 1 << flag; }

◆ mask_flag() [2/2]

static ACE_UINT8 OpenDDS::DCPS::DataSampleHeader::mask_flag ( DataSampleHeaderFlag2  flag)
inlinestatic

Definition at line 188 of file DataSampleHeader.h.

References init().

188 { return 1 << flag; }

◆ message_length()

ACE_UINT32 OpenDDS::DCPS::DataSampleHeader::message_length ( void  ) const
inline

Definition at line 239 of file DataSampleHeader.h.

239 { return this->message_length_; }

◆ more_fragments()

bool OpenDDS::DCPS::DataSampleHeader::more_fragments ( void  ) const
inline

Definition at line 241 of file DataSampleHeader.h.

241 { return this->more_fragments_; }
bool more_fragments_
The current "Data Sample" needs reassembly before further processing.

◆ operator=()

ACE_INLINE OpenDDS::DCPS::DataSampleHeader & OpenDDS::DCPS::DataSampleHeader::operator= ( ACE_Message_Block buffer)

Assignment from an ACE_Message_Block.

Definition at line 74 of file DataSampleHeader.inl.

References ACE_INLINE, and init().

75 {
76  this->init(&buffer);
77  return *this;
78 }
void init(ACE_Message_Block *buffer)
Implement load from buffer.

◆ partial()

bool OpenDDS::DCPS::DataSampleHeader::partial ( const ACE_Message_Block mb)
static

Does the data in this mb constitute a partial Sample Header?

Definition at line 130 of file DataSampleHeader.cpp.

References OpenDDS::DCPS::BYTE_ORDER_FLAG, OpenDDS::DCPS::CONTENT_FILTER_FLAG, OpenDDS::STUN::encoding(), OpenDDS::DCPS::Encoding::endianness(), FLAGS_OFFSET, get_max_serialized_size(), OpenDDS::DCPS::GROUP_COHERENT_FLAG, OpenDDS::DCPS::guid_cdr_size, OpenDDS::DCPS::int32_cdr_size, OpenDDS::DCPS::LIFESPAN_DURATION_FLAG, mask_flag(), OpenDDS::DCPS::MESSAGE_ID_MAX, MESSAGE_ID_OFFSET, OpenDDS::DCPS::SUBMESSAGE_ID_MAX, SUBMESSAGE_ID_OFFSET, and ACE_Message_Block::total_length().

131 {
132  static const unsigned int LIFESPAN_MASK = mask_flag(LIFESPAN_DURATION_FLAG),
133  LIFESPAN_LENGTH = 8,
134  COHERENT_MASK = mask_flag(GROUP_COHERENT_FLAG),
135  COHERENT_LENGTH = 16,
136  CONTENT_FILT_MASK = mask_flag(CONTENT_FILTER_FLAG),
137  BYTE_ORDER_MASK = mask_flag(BYTE_ORDER_FLAG);
138 
139  const size_t len = mb.total_length();
140 
141  if (len <= FLAGS_OFFSET) return true;
142 
143  Encoding encoding(encoding_kind);
144  unsigned char msg_id;
145  if (!mb_peek(msg_id, mb, MESSAGE_ID_OFFSET, encoding)
146  || int(msg_id) >= MESSAGE_ID_MAX) {
147  // This check, and the similar one below for submessage id, are actually
148  // indicating an invalid header (and not a partial header) but we can
149  // treat it the same as partial for the sake of the TransportRecvStrategy.
150  return true;
151  }
152 
153  if (!mb_peek(msg_id, mb, SUBMESSAGE_ID_OFFSET, encoding)
154  || int(msg_id) >= SUBMESSAGE_ID_MAX) {
155  return true;
156  }
157 
158  char flags;
159  if (!mb_peek(flags, mb, FLAGS_OFFSET, encoding)) {
160  return true;
161  }
162 
163  size_t expected = get_max_serialized_size();
164  if (!(flags & LIFESPAN_MASK)) expected -= LIFESPAN_LENGTH;
165  if (!(flags & COHERENT_MASK)) expected -= COHERENT_LENGTH;
166 
167  if (flags & CONTENT_FILT_MASK) {
168  CORBA::ULong seqLen;
169  encoding.endianness(static_cast<Endianness>(flags & BYTE_ORDER_MASK));
170  if (!mb_peek(seqLen, mb, expected, encoding)) {
171  return true;
172  }
173  expected += int32_cdr_size + guid_cdr_size * seqLen;
174  }
175 
176  return len < expected;
177 }
const size_t guid_cdr_size
Definition: GuidUtils.h:115
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
const size_t int32_cdr_size
Definition: Serializer.h:95
ACE_CDR::ULong ULong
size_t total_length(void) const
static size_t get_max_serialized_size()
Similar to IDL compiler generated methods.
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)
Endianness endianness() const
Definition: Serializer.inl:64

◆ pdu_remaining()

void OpenDDS::DCPS::DataSampleHeader::pdu_remaining ( size_t  )
inline

Definition at line 243 of file DataSampleHeader.h.

243 { /* ignored, only RTPS uses this */ }

◆ set_flag()

ACE_INLINE void OpenDDS::DCPS::DataSampleHeader::set_flag ( DataSampleHeaderFlag  flag,
ACE_Message_Block buffer 
)
static

Definition at line 130 of file DataSampleHeader.inl.

References ACE_ERROR, ACE_INLINE, ACE_TEXT(), ACE_Message_Block::base(), ACE_Message_Block::end(), FLAGS_OFFSET, LM_ERROR, ACE_Message_Block::locking_strategy(), and mask_flag().

Referenced by OpenDDS::DCPS::WriteDataContainer::data_delivered().

132 {
133  char* base = buffer->base();
134 
135  // verify sufficient length exists:
136  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
137  ACE_ERROR((LM_ERROR,
138  ACE_TEXT("(%P|%t) ERROR: DataSampleHeader::set_flag: ")
139  ACE_TEXT("ACE_Message_Block too short (missing flags octet).\n")));
140  return;
141  }
142 
143  MaybeGuard g(buffer->locking_strategy());
144  base[FLAGS_OFFSET] |= mask_flag(flag);
145 }
#define ACE_ERROR(X)
ACE_Lock * locking_strategy(void)
char * end(void) const
ACE_TEXT("TCP_Factory")
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)
char * base(void) const

◆ split()

void OpenDDS::DCPS::DataSampleHeader::split ( const ACE_Message_Block orig,
size_t  size,
Message_Block_Ptr head,
Message_Block_Ptr tail 
)
static

Create two new serialized headers (owned by caller), the "head" having at most "size" bytes (header + data) and the "tail" having the rest.

Definition at line 382 of file DataSampleHeader.cpp.

References add_cfentries(), alloc_msgblock(), ACE_Message_Block::cont(), dup(), ACE_Message_Block::duplicate(), OpenDDS::STUN::encoding(), OpenDDS::DCPS::unique_ptr< T, Deleter >::get(), get_max_serialized_size(), OpenDDS::DCPS::guid_cdr_size, ACE_Message_Block::length(), message_length_, more_fragments_, OpenDDS::DCPS::unique_ptr< T, Deleter >::release(), OpenDDS::DCPS::unique_ptr< T, Deleter >::reset(), split_payload(), and ACE_Message_Block::total_length().

Referenced by OpenDDS::DCPS::TransportQueueElement::fragment().

384 {
386  const Encoding encoding(encoding_kind);
387 
388  const size_t length = dup->total_length();
389  DataSampleHeader hdr(*dup); // deserialize entire header (with cfentries)
390  const size_t hdr_len = length - dup->total_length();
391  const size_t this_max_serialized_size = get_max_serialized_size();
392 
393  ACE_Message_Block* payload = dup.get();
394  //skip zero length message blocks
395  ACE_Message_Block* prev = 0;
396  for (; payload->length() == 0; payload = payload->cont()) {
397  prev = payload;
398  }
399  prev->cont(0);
400  Message_Block_Ptr payload_head(payload);
401 
402  if (size < hdr_len) { // need to fragment the content_filter_entries_
403  head.reset(alloc_msgblock(*dup, this_max_serialized_size, true));
404  hdr.more_fragments_ = true;
405  hdr.message_length_ = 0; // no room for payload data
406  *head << hdr;
407  const size_t avail = size - head->length() - 4 /* sequence length */;
408  const CORBA::ULong n_entries = static_cast<CORBA::ULong>(avail / guid_cdr_size);
409  GUIDSeq entries(n_entries);
410  entries.length(n_entries);
411  // remove from the end of hdr's entries (order doesn't matter)
412  for (CORBA::ULong i(0), x(hdr.content_filter_entries_.length());
413  i < n_entries; ++i) {
414  entries[i] = hdr.content_filter_entries_[--x];
415  hdr.content_filter_entries_.length(x);
416  }
417  add_cfentries(&entries, head.get());
418 
419  tail.reset(alloc_msgblock(*dup, this_max_serialized_size, true));
420  hdr.more_fragments_ = false;
421  hdr.content_filter_ = (hdr.content_filter_entries_.length() > 0);
422  hdr.message_length_ = static_cast<ACE_UINT32>(payload->total_length());
423  *tail << hdr;
424  tail->cont(payload_head.release());
425  if (hdr.content_filter_) {
426  add_cfentries(&hdr.content_filter_entries_, tail.get());
427  }
428  return;
429  }
430 
431  Message_Block_Ptr payload_tail;
432  split_payload(*payload, size - hdr_len, payload_head, payload_tail);
433 
434  hdr.more_fragments_ = true;
435  hdr.message_length_ = static_cast<ACE_UINT32>(payload_head->total_length());
436 
437  head.reset(alloc_msgblock(*dup, this_max_serialized_size, true));
438  *head << hdr;
439  head->cont(payload_head.release());
440  if (hdr.content_filter_) {
441  add_cfentries(&hdr.content_filter_entries_, head.get());
442  }
443 
444  hdr.more_fragments_ = false;
445  hdr.content_filter_ = false;
446  hdr.message_length_ = static_cast<ACE_UINT32>(payload_tail->total_length());
447 
448  tail.reset(alloc_msgblock(*dup, this_max_serialized_size, true));
449  *tail << hdr;
450  tail->cont(payload_tail.release());
451 }
size_t length(void) const
static void add_cfentries(const GUIDSeq *guids, ACE_Message_Block *mb)
static ACE_Message_Block * alloc_msgblock(const ACE_Message_Block &mb, size_t size, bool use_data_alloc)
const size_t guid_cdr_size
Definition: GuidUtils.h:115
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
static void split_payload(const ACE_Message_Block &orig, size_t size, Message_Block_Ptr &head, Message_Block_Ptr &tail)
ACE_CDR::ULong ULong
ACE_Message_Block * cont(void) const
virtual ACE_Message_Block * duplicate(void) const
size_t total_length(void) const
static size_t get_max_serialized_size()
Similar to IDL compiler generated methods.
sequence< GUID_t > GUIDSeq
Definition: DdsDcpsGuid.idl:62
unique_ptr< ACE_Message_Block, Message_Block_Deleter > Message_Block_Ptr
ACE_HANDLE dup(ACE_HANDLE handle)

◆ split_payload()

void OpenDDS::DCPS::DataSampleHeader::split_payload ( const ACE_Message_Block orig,
size_t  size,
Message_Block_Ptr head,
Message_Block_Ptr tail 
)
static

Definition at line 356 of file DataSampleHeader.cpp.

References ACE_Message_Block::cont(), ACE_Message_Block::duplicate(), OpenDDS::DCPS::unique_ptr< T, Deleter >::get(), ACE_Message_Block::length(), ACE_Message_Block::rd_ptr(), ACE_Message_Block::release(), OpenDDS::DCPS::unique_ptr< T, Deleter >::reset(), and ACE_Message_Block::wr_ptr().

Referenced by split().

359 {
360  if (!head) {
361  head.reset(orig.duplicate());
362  }
363 
364  ACE_Message_Block* frag = head.get();
365  size_t frag_remain = size;
366  for (; frag_remain > frag->length(); frag = frag->cont()) {
367  frag_remain -= frag->length();
368  }
369 
370  if (frag_remain == frag->length()) { // split at ACE_Message_Block boundary
371  tail.reset(frag->cont());
372  } else {
373  tail.reset(frag->duplicate());
374  frag->wr_ptr(frag->wr_ptr() - frag->length() + frag_remain);
376  tail->rd_ptr(frag_remain);
377  }
378  frag->cont(0);
379 }
size_t length(void) const
char * rd_ptr(void) const
virtual ACE_Message_Block * release(void)
ACE_Message_Block * cont(void) const
virtual ACE_Message_Block * duplicate(void) const
char * wr_ptr(void) const

◆ test_flag()

ACE_INLINE bool OpenDDS::DCPS::DataSampleHeader::test_flag ( DataSampleHeaderFlag  flag,
const ACE_Message_Block buffer 
)
static

Definition at line 149 of file DataSampleHeader.inl.

References ACE_ERROR_RETURN, ACE_INLINE, ACE_TEXT(), ACE_Message_Block::base(), ACE_Message_Block::end(), FLAGS_OFFSET, LM_ERROR, and mask_flag().

Referenced by add_cfentries(), OpenDDS::DCPS::SingleSendBuffer::insert(), OpenDDS::DCPS::DataDurabilityCache::insert(), OpenDDS::DCPS::WriteDataContainer::remove_excess_durable(), and OpenDDS::DCPS::DataLinkSet::send().

151 {
152  char* base = buffer->base();
153 
154  // verify sufficient length exists:
155  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
156  ACE_ERROR_RETURN((LM_ERROR,
157  ACE_TEXT("(%P|%t) ERROR: DataSampleHeader::set_flag: ")
158  ACE_TEXT("ACE_Message_Block too short (missing flags octet).\n")), false);
159  }
160 
161  MaybeGuard g(const_cast<ACE_Message_Block*>(buffer)->locking_strategy());
162  return base[FLAGS_OFFSET] & mask_flag(flag);
163 }
char * end(void) const
ACE_TEXT("TCP_Factory")
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)
#define ACE_ERROR_RETURN(X, Y)
char * base(void) const

◆ valid_data()

ACE_INLINE bool OpenDDS::DCPS::DataSampleHeader::valid_data ( ) const

Member Data Documentation

◆ byte_order_

bool OpenDDS::DCPS::DataSampleHeader::byte_order_

◆ cdr_encapsulation_

bool OpenDDS::DCPS::DataSampleHeader::cdr_encapsulation_

◆ coherent_change_

bool OpenDDS::DCPS::DataSampleHeader::coherent_change_

◆ content_filter_

bool OpenDDS::DCPS::DataSampleHeader::content_filter_

◆ content_filter_entries_

GUIDSeq OpenDDS::DCPS::DataSampleHeader::content_filter_entries_

Optional field present if the content_filter_ flag bit is set. Indicates which readers should not receive the data.

Definition at line 185 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::DataLink::data_received_i(), init(), join(), OpenDDS::DCPS::operator<<(), and OpenDDS::DCPS::to_string().

◆ group_coherent_

bool OpenDDS::DCPS::DataSampleHeader::group_coherent_

◆ historic_sample_

bool OpenDDS::DCPS::DataSampleHeader::historic_sample_

◆ key_fields_only_

bool OpenDDS::DCPS::DataSampleHeader::key_fields_only_

◆ lifespan_duration_

bool OpenDDS::DCPS::DataSampleHeader::lifespan_duration_

◆ lifespan_duration_nanosec_

ACE_UINT32 OpenDDS::DCPS::DataSampleHeader::lifespan_duration_nanosec_

◆ lifespan_duration_sec_

ACE_INT32 OpenDDS::DCPS::DataSampleHeader::lifespan_duration_sec_

The LIFESPAN duration field is generated from the DataWriter or supplied by the application at the time of the write. This field is used to determine if a given sample is considered 'stale' and should be discarded by associated DataReader. These fields are optional and are controlled by the lifespan_duration_ flag.

Definition at line 171 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::ReplayerImpl::create_sample_data_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), OpenDDS::DCPS::DataReaderImpl::filter_sample(), init(), OpenDDS::DCPS::operator<<(), and OpenDDS::DCPS::to_string().

◆ message_id_

char OpenDDS::DCPS::DataSampleHeader::message_id_

The enum MessageId.

Definition at line 87 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::MulticastDataLink::check_header(), OpenDDS::DCPS::DataLink::create_control(), OpenDDS::DCPS::DataWriterImpl::create_control_message(), OpenDDS::DCPS::ReplayerImpl::create_sample_data_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), OpenDDS::DCPS::RtpsUdpDataLink::RtpsWriter::customize_queue_element_helper(), OpenDDS::DCPS::RtpsUdpDataLink::customize_queue_element_non_reliable_i(), OpenDDS::DCPS::WriteDataContainer::data_delivered(), OpenDDS::DCPS::WriteDataContainer::data_dropped(), OpenDDS::DCPS::RecorderImpl::data_received(), OpenDDS::DCPS::DataReaderImpl::data_received(), OpenDDS::RTPS::Sedp::Reader::data_received(), OpenDDS::RTPS::Sedp::DiscoveryReader::data_received_i(), OpenDDS::RTPS::Sedp::LivelinessReader::data_received_i(), OpenDDS::RTPS::Sedp::SecurityReader::data_received_i(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::dds_demarshal(), OpenDDS::DCPS::ShmemReceiveStrategy::deliver_sample(), OpenDDS::DCPS::UdpReceiveStrategy::deliver_sample(), OpenDDS::DCPS::TcpReceiveStrategy::deliver_sample(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::deliver_sample_i(), init(), OpenDDS::DCPS::RtpsSampleHeader::into_received_data_sample(), OpenDDS::DCPS::UdpDataLink::open(), OpenDDS::DCPS::operator<<(), OpenDDS::DCPS::RtpsSampleHeader::populate_data_control_submessages(), OpenDDS::DCPS::RtpsSampleHeader::populate_data_sample_submessages(), OpenDDS::DCPS::RtpsSampleHeader::process_iqos(), OpenDDS::DCPS::WriteDataContainer::release_buffer(), OpenDDS::DCPS::TcpDataLink::request_ack_received(), OpenDDS::DCPS::MulticastDataLink::sample_received(), OpenDDS::DCPS::ShmemDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_graceful_disconnect_message(), OpenDDS::DCPS::TransportClient::send_i(), OpenDDS::RTPS::Sedp::Writer::set_header_fields(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::set_instance_state_i(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data_check(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_synthetic_data(), OpenDDS::DCPS::to_string(), valid_data(), and OpenDDS::DCPS::DataReaderImpl::writer_activity().

◆ message_length_

ACE_UINT32 OpenDDS::DCPS::DataSampleHeader::message_length_

◆ more_fragments_

bool OpenDDS::DCPS::DataSampleHeader::more_fragments_

◆ publication_id_

GUID_t OpenDDS::DCPS::DataSampleHeader::publication_id_

Identify the DataWriter that produced the sample data being sent.

Definition at line 177 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::DataReaderImpl::accept_sample_processing(), OpenDDS::DCPS::TcpDataLink::ack_received(), OpenDDS::DCPS::DataReaderImpl::check_historic(), OpenDDS::DCPS::DataWriterImpl::create_control_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), OpenDDS::DCPS::RecorderImpl::data_received(), OpenDDS::DCPS::DataReaderImpl::data_received(), OpenDDS::RTPS::Sedp::Reader::data_received(), OpenDDS::DCPS::DataLink::data_received_i(), OpenDDS::RTPS::Sedp::DiscoveryReader::data_received_i(), OpenDDS::RTPS::Sedp::TypeLookupRequestReader::data_received_i(), OpenDDS::RTPS::Sedp::TypeLookupReplyReader::data_received_i(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::decode_payload(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::deliver_sample_i(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::MessageReceiver::fill_header(), OpenDDS::DCPS::RtpsUdpDataLink::filterBestEffortReaders(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::finish_store_instance_data(), init(), OpenDDS::DCPS::RtpsSampleHeader::into_received_data_sample(), OpenDDS::DCPS::operator<<(), OpenDDS::DCPS::RtpsSampleHeader::populate_data_control_submessages(), OpenDDS::RTPS::Sedp::TypeLookupReplyReader::process_get_dependencies_reply(), OpenDDS::DCPS::DataReaderImpl::process_latency(), OpenDDS::RTPS::Sedp::TypeLookupReplyReader::process_type_lookup_reply(), OpenDDS::DCPS::ReliableSession::ready_to_deliver(), OpenDDS::DCPS::TransportReassembly::reassemble_i(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::reassemble_i(), OpenDDS::DCPS::TcpDataLink::request_ack_received(), OpenDDS::DCPS::ShmemDataLink::request_ack_received(), OpenDDS::DCPS::ShmemDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_association_msg(), OpenDDS::DCPS::DataLink::send_control(), OpenDDS::RTPS::Sedp::Writer::set_header_fields(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::set_instance_state_i(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data_check(), OpenDDS::DCPS::to_string(), OpenDDS::DCPS::ReplayerImpl::write(), and OpenDDS::DCPS::DataReaderImpl::writer_activity().

◆ publisher_id_

GUID_t OpenDDS::DCPS::DataSampleHeader::publisher_id_

◆ reserved_1

bool OpenDDS::DCPS::DataSampleHeader::reserved_1

Definition at line 134 of file DataSampleHeader.h.

◆ reserved_2

bool OpenDDS::DCPS::DataSampleHeader::reserved_2

Definition at line 135 of file DataSampleHeader.h.

◆ reserved_3

bool OpenDDS::DCPS::DataSampleHeader::reserved_3

Definition at line 136 of file DataSampleHeader.h.

◆ reserved_4

bool OpenDDS::DCPS::DataSampleHeader::reserved_4

Definition at line 137 of file DataSampleHeader.h.

◆ reserved_5

bool OpenDDS::DCPS::DataSampleHeader::reserved_5

Definition at line 138 of file DataSampleHeader.h.

◆ reserved_6

bool OpenDDS::DCPS::DataSampleHeader::reserved_6

Definition at line 139 of file DataSampleHeader.h.

◆ sequence_

SequenceNumber OpenDDS::DCPS::DataSampleHeader::sequence_

The sequence number is obtained from the Publisher associated with the DataWriter based on the PRESENTATION requirement for the sequence value (access_scope == GROUP).

Definition at line 149 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::TcpDataLink::ack_received(), OpenDDS::DCPS::DataReaderImpl::check_historic(), OpenDDS::DCPS::DataWriterImpl::create_control_message(), OpenDDS::DCPS::ReplayerImpl::create_sample_data_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), OpenDDS::DCPS::WriteDataContainer::data_delivered(), OpenDDS::DCPS::DataReaderImpl::data_received(), OpenDDS::DCPS::TransportReassembly::data_unavailable(), OpenDDS::DCPS::RtpsUdpReceiveStrategy::deliver_sample_i(), OpenDDS::DCPS::RtpsUdpDataLink::filterBestEffortReaders(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::finish_store_instance_data(), init(), OpenDDS::DCPS::TransportReassembly::FragInfo::insert(), OpenDDS::DCPS::RtpsSampleHeader::into_received_data_sample(), join(), OpenDDS::DCPS::operator<<(), OpenDDS::DCPS::RtpsSampleHeader::populate_data_control_submessages(), OpenDDS::DCPS::RtpsSampleHeader::populate_data_sample_submessages(), OpenDDS::DCPS::ReliableSession::ready_to_deliver(), OpenDDS::DCPS::TransportReassembly::reassemble_i(), OpenDDS::DCPS::WriteDataContainer::reenqueue_all(), OpenDDS::DCPS::RtpsUdpDataLink::RtpsWriter::remove_sample(), OpenDDS::DCPS::TcpDataLink::request_ack_received(), OpenDDS::DCPS::ShmemDataLink::request_ack_received(), OpenDDS::DCPS::ShmemDataLink::send_association_msg(), OpenDDS::DCPS::TcpDataLink::send_association_msg(), OpenDDS::DCPS::TransportSendElement::sequence(), OpenDDS::DCPS::TransportSendControlElement::sequence(), OpenDDS::RTPS::Sedp::Writer::set_header_fields(), OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_synthetic_data(), OpenDDS::DCPS::to_string(), OpenDDS::DCPS::DataWriterImpl::write(), and OpenDDS::DCPS::DataReaderImpl::writer_activity().

◆ sequence_repair_

bool OpenDDS::DCPS::DataSampleHeader::sequence_repair_

Due to content filtering, a gap in the sequence numbers may be an expected condition. If this bit is set, assume prior sequence numbers were filtered-out and are not missing.

Definition at line 117 of file DataSampleHeader.h.

Referenced by OpenDDS::DCPS::DataWriterImpl::create_control_message(), OpenDDS::DCPS::ReplayerImpl::create_sample_data_message(), OpenDDS::DCPS::DataWriterImpl::create_sample_data_message(), init(), OpenDDS::DCPS::operator<<(), and OpenDDS::DCPS::to_string().

◆ serialized_size_

size_t OpenDDS::DCPS::DataSampleHeader::serialized_size_
private

Keep track of the amount of data read from a buffer.

Definition at line 269 of file DataSampleHeader.h.

Referenced by get_serialized_size(), and init().

◆ source_timestamp_nanosec_

ACE_UINT32 OpenDDS::DCPS::DataSampleHeader::source_timestamp_nanosec_

◆ source_timestamp_sec_

ACE_INT32 OpenDDS::DCPS::DataSampleHeader::source_timestamp_sec_

◆ submessage_id_

char OpenDDS::DCPS::DataSampleHeader::submessage_id_

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