Line data Source code
1 : /*
2 : *
3 : *
4 : * Distributed under the OpenDDS License.
5 : * See: http://www.opendds.org/license.html
6 : */
7 :
8 : ACE_INLINE
9 1902 : OpenDDS::DCPS::DataSampleHeader::DataSampleHeader()
10 1902 : : message_id_(0)
11 1902 : , submessage_id_(0)
12 1902 : , byte_order_(ACE_CDR_BYTE_ORDER)
13 1902 : , coherent_change_(0)
14 1902 : , historic_sample_(0)
15 1902 : , lifespan_duration_(0)
16 1902 : , group_coherent_(0)
17 1902 : , content_filter_(0)
18 1902 : , sequence_repair_(0)
19 1902 : , more_fragments_(0)
20 1902 : , cdr_encapsulation_(0)
21 1902 : , key_fields_only_(0)
22 1902 : , reserved_1(0)
23 1902 : , reserved_2(0)
24 1902 : , reserved_3(0)
25 1902 : , reserved_4(0)
26 1902 : , reserved_5(0)
27 1902 : , reserved_6(0)
28 1902 : , message_length_(0)
29 1902 : , sequence_()
30 1902 : , source_timestamp_sec_(0)
31 1902 : , source_timestamp_nanosec_(0)
32 1902 : , lifespan_duration_sec_(0)
33 1902 : , lifespan_duration_nanosec_(0)
34 1902 : , publication_id_(GUID_UNKNOWN)
35 1902 : , publisher_id_(GUID_UNKNOWN)
36 1902 : , serialized_size_(0)
37 : {
38 1902 : }
39 :
40 : ACE_INLINE
41 31 : OpenDDS::DCPS::DataSampleHeader::DataSampleHeader(ACE_Message_Block& buffer)
42 31 : : message_id_(0)
43 31 : , submessage_id_(0)
44 31 : , byte_order_(ACE_CDR_BYTE_ORDER)
45 31 : , coherent_change_(0)
46 31 : , historic_sample_(0)
47 31 : , lifespan_duration_(0)
48 31 : , group_coherent_(0)
49 31 : , content_filter_(0)
50 31 : , sequence_repair_(0)
51 31 : , more_fragments_(0)
52 31 : , cdr_encapsulation_(0)
53 31 : , key_fields_only_(0)
54 31 : , reserved_1(0)
55 31 : , reserved_2(0)
56 31 : , reserved_3(0)
57 31 : , reserved_4(0)
58 31 : , reserved_5(0)
59 31 : , reserved_6(0)
60 31 : , message_length_(0)
61 31 : , sequence_()
62 31 : , source_timestamp_sec_(0)
63 31 : , source_timestamp_nanosec_(0)
64 31 : , lifespan_duration_sec_(0)
65 31 : , lifespan_duration_nanosec_(0)
66 31 : , publication_id_(GUID_UNKNOWN)
67 31 : , publisher_id_(GUID_UNKNOWN)
68 : {
69 31 : this->init(&buffer);
70 31 : }
71 :
72 : ACE_INLINE
73 : OpenDDS::DCPS::DataSampleHeader&
74 2 : OpenDDS::DCPS::DataSampleHeader::operator=(ACE_Message_Block& buffer)
75 : {
76 2 : this->init(&buffer);
77 2 : return *this;
78 : }
79 :
80 : ACE_INLINE
81 : size_t OpenDDS::DCPS::DataSampleHeader::get_serialized_size() const
82 : {
83 : return serialized_size_;
84 : }
85 :
86 : ACE_INLINE
87 46 : size_t OpenDDS::DCPS::DataSampleHeader::get_max_serialized_size()
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 46 : 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 :
109 : ACE_INLINE
110 : void
111 : OpenDDS::DCPS::DataSampleHeader::clear_flag(DataSampleHeaderFlag flag,
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) {
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 : }
127 :
128 : ACE_INLINE
129 : void
130 3 : OpenDDS::DCPS::DataSampleHeader::set_flag(DataSampleHeaderFlag flag,
131 : ACE_Message_Block* buffer)
132 : {
133 3 : char* base = buffer->base();
134 :
135 : // verify sufficient length exists:
136 3 : if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
137 0 : 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 0 : return;
141 : }
142 :
143 3 : MaybeGuard g(buffer->locking_strategy());
144 3 : base[FLAGS_OFFSET] |= mask_flag(flag);
145 3 : }
146 :
147 : ACE_INLINE
148 : bool
149 7 : OpenDDS::DCPS::DataSampleHeader::test_flag(DataSampleHeaderFlag flag,
150 : const ACE_Message_Block* buffer)
151 : {
152 7 : char* base = buffer->base();
153 :
154 : // verify sufficient length exists:
155 7 : if (static_cast<size_t>(buffer->end() - base) < FLAGS_OFFSET + 1) {
156 0 : 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 7 : MaybeGuard g(const_cast<ACE_Message_Block*>(buffer)->locking_strategy());
162 7 : return base[FLAGS_OFFSET] & mask_flag(flag);
163 7 : }
164 :
165 : ACE_INLINE
166 : bool
167 12 : OpenDDS::DCPS::DataSampleHeader::valid_data() const
168 : {
169 12 : return message_id_ == SAMPLE_DATA;
170 : }
|