OpenDDS  Snapshot(2023/04/28-20:55)
DataSampleHeader.inl
Go to the documentation of this file.
1 /*
2  *
3  *
4  * Distributed under the OpenDDS License.
5  * See: http://www.opendds.org/license.html
6  */
7 
10  : message_id_(0)
11  , submessage_id_(0)
12  , byte_order_(ACE_CDR_BYTE_ORDER)
13  , coherent_change_(0)
14  , historic_sample_(0)
15  , lifespan_duration_(0)
16  , group_coherent_(0)
17  , content_filter_(0)
18  , sequence_repair_(0)
19  , more_fragments_(0)
20  , cdr_encapsulation_(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_()
30  , source_timestamp_sec_(0)
31  , source_timestamp_nanosec_(0)
32  , lifespan_duration_sec_(0)
33  , lifespan_duration_nanosec_(0)
34  , publication_id_(GUID_UNKNOWN)
35  , publisher_id_(GUID_UNKNOWN)
36  , serialized_size_(0)
37 {
38 }
39 
42  : message_id_(0)
43  , submessage_id_(0)
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 }
71 
75 {
76  this->init(&buffer);
77  return *this;
78 }
79 
82 {
83  return serialized_size_;
84 }
85 
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 }
103 
104 /// The clear_flag and set_flag methods are a hack to update the
105 /// header flags after a sample has been serialized without
106 /// deserializing the entire message. This method will break if
107 /// the current Serializer behavior changes.
108 
110 void
112  ACE_Message_Block* buffer)
113 {
114  char* base = buffer->base();
115 
116  // verify sufficient length exists:
117  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
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 }
127 
129 void
131  ACE_Message_Block* buffer)
132 {
133  char* base = buffer->base();
134 
135  // verify sufficient length exists:
136  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
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 }
146 
148 bool
150  const ACE_Message_Block* buffer)
151 {
152  char* base = buffer->base();
153 
154  // verify sufficient length exists:
155  if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
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 }
164 
166 bool
168 {
169  return message_id_ == SAMPLE_DATA;
170 }
#define ACE_ERROR(X)
char message_id_
The enum MessageId.
ACE_Lock * locking_strategy(void)
bool key_fields_only_
Only the key fields of the data sample are present in the payload.
const GUID_t GUID_UNKNOWN
Nil value for GUID.
Definition: GuidUtils.h:59
static bool test_flag(DataSampleHeaderFlag flag, const ACE_Message_Block *buffer)
char * end(void) const
#define ACE_CDR_BYTE_ORDER
DataSampleHeader & operator=(ACE_Message_Block &buffer)
Assignment from an ACE_Message_Block.
bool valid_data() const
Returns true if the sample has a complete serialized payload.
static size_t get_max_serialized_size()
Similar to IDL compiler generated methods.
void init(ACE_Message_Block *buffer)
Implement load from buffer.
size_t get_serialized_size() const
Amount of data read when initializing from a buffer.
size_t serialized_size_
Keep track of the amount of data read from a buffer.
bool more_fragments_
The current "Data Sample" needs reassembly before further processing.
char submessage_id_
Implementation-specific sub-message Ids.
ACE_TEXT("TCP_Factory")
static void set_flag(DataSampleHeaderFlag flag, ACE_Message_Block *buffer)
static void clear_flag(DataSampleHeaderFlag flag, ACE_Message_Block *buffer)
#define ACE_INLINE
#define ACE_ERROR_RETURN(X, Y)
LM_ERROR
char * base(void) const
static ACE_UINT8 mask_flag(DataSampleHeaderFlag flag)