OpenDDS  Snapshot(2023/04/28-20:55)
DynamicDataImpl.cpp
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.opendds.org/license.html
4  */
5 
6 #include <DCPS/DdsDcps_pch.h>
7 
8 #ifndef OPENDDS_SAFETY_PROFILE
9 # include "DynamicDataImpl.h"
10 
11 # include "DynamicTypeMemberImpl.h"
12 # include "Utils.h"
13 
15 # include <dds/DCPS/DCPS_Utils.h>
16 
17 # include <dds/DdsDynamicDataSeqTypeSupportImpl.h>
18 # include <dds/DdsDcpsCoreTypeSupportImpl.h>
19 
21 
22 namespace OpenDDS {
23 namespace XTypes {
24 
25 using DCPS::LogLevel;
26 using DCPS::log_level;
28 
29 DynamicDataImpl::DynamicDataImpl(DDS::DynamicType_ptr type)
30  : DynamicDataBase(type)
31  , container_(type_, this)
32 {
33 }
34 
36  : CORBA::Object()
37  , DynamicData()
38  , CORBA::LocalObject()
39  , DCPS::RcObject()
40  , DynamicDataBase(other.type_)
41  , container_(other.container_, this)
42 {}
43 
45 {
47 }
48 
50 {
51  const TypeKind tk = type_->get_kind();
52  switch (tk) {
53  case TK_BOOLEAN:
54  case TK_BYTE:
55  case TK_INT16:
56  case TK_INT32:
57  case TK_INT64:
58  case TK_UINT16:
59  case TK_UINT32:
60  case TK_UINT64:
61  case TK_FLOAT32:
62  case TK_FLOAT64:
63  case TK_FLOAT128:
64  case TK_INT8:
65  case TK_UINT8:
66  case TK_CHAR8:
67 #ifdef DDS_HAS_WCHAR
68  case TK_CHAR16:
69 #endif
70  case TK_ENUM:
71  // Value of enum or primitive types can be indicated by Id MEMBER_ID_INVALID
72  // or by index 0 (Section 7.5.2.11.1).
73  if (index != 0 && log_level >= LogLevel::Notice) {
74  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_member_id_at_index:"
75  " Received invalid index (%u) for type %C\n", index, typekind_to_string(tk)));
76  }
77  return MEMBER_ID_INVALID;
78  case TK_BITMASK:
79  // TODO: Bitmask type needs improvement. See comments in set_single_value method.
80  return MEMBER_ID_INVALID;
81  case TK_STRING8:
82 #ifdef DDS_HAS_WCHAR
83  case TK_STRING16:
84 #endif
85  case TK_SEQUENCE: {
86  const CORBA::ULong bound = type_desc_->bound()[0];
87  if (bound > 0 && index >= bound) {
88  if (log_level >= LogLevel::Notice) {
89  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_member_id_at_index:"
90  " Input index (%u) is out-of-bound (bound is %u)\n", index, bound));
91  }
92  return MEMBER_ID_INVALID;
93  }
94  return index;
95  }
96  case TK_ARRAY: {
97  const DDS::UInt32 length = bound_total(type_desc_);
98  if (index >= length) {
99  if (log_level >= LogLevel::Notice) {
100  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_member_id_at_index:"
101  " Input index (%u) is out-of-bound (array length is %u)\n", index, length));
102  }
103  return MEMBER_ID_INVALID;
104  }
105  return index;
106  }
107  case TK_MAP:
108  if (log_level >= LogLevel::Notice) {
109  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_member_id_at_index:"
110  " Map is currently not supported\n"));
111  }
112  return MEMBER_ID_INVALID;
113  case TK_STRUCTURE: {
114  DDS::DynamicTypeMember_var dtm;
115  if (type_->get_member_by_index(dtm, index) != DDS::RETCODE_OK) {
116  return MEMBER_ID_INVALID;
117  }
118  return dtm->get_id();
119  }
120  case TK_UNION: {
121  if (index == 0) {
122  return DISCRIMINATOR_ID;
123  }
124  bool select_a_member;
125  DDS::MemberDescriptor_var selected_md;
126  const DDS::ReturnCode_t rc = get_selected_union_branch(select_a_member, selected_md);
127  if (rc != DDS::RETCODE_OK) {
128  if (log_level >= LogLevel::Warning) {
129  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::get_member_id_at_index:"
130  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
131  }
132  return MEMBER_ID_INVALID;
133  }
134  if (index == 1 && select_a_member) {
135  return selected_md->id();
136  }
137  if (log_level >= LogLevel::Warning) {
138  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::get_member_id_at_index:"
139  " invalid index: %u\n", index));
140  }
141  return MEMBER_ID_INVALID;
142  }
143  }
144 
145  if (log_level >= LogLevel::Notice) {
146  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_member_id_at_index:"
147  " Calling on an unexpected type %C\n", typekind_to_string(tk)));
148  }
149  return MEMBER_ID_INVALID;
150 }
151 
153 {
154  if (type_->get_kind() != TK_SEQUENCE) {
155  return 0;
156  }
157 
158  if (!container_.single_map_.empty() || !container_.complex_map_.empty()) {
159  CORBA::ULong largest_index;
160  if (!container_.get_largest_index_basic(largest_index)) {
161  return 0;
162  }
163  if (!container_.sequence_map_.empty()) {
164  CORBA::ULong largest_seq_index;
165  if (!container_.get_largest_sequence_index(largest_seq_index)) {
166  return 0;
167  }
168  largest_index = std::max(largest_index, largest_seq_index);
169  }
170  return largest_index + 1;
171  } else if (!container_.sequence_map_.empty()) {
172  CORBA::ULong largest_index;
173  if (!container_.get_largest_sequence_index(largest_index)) {
174  return 0;
175  }
176  return largest_index + 1;
177  }
178  return 0;
179 }
180 
182 {
183  if (container_.single_map_.erase(id) == 0) {
184  if (container_.sequence_map_.erase(id) == 0) {
185  container_.complex_map_.erase(id);
186  }
187  }
188 }
189 
191 {
192  const TypeKind tk = type_->get_kind();
193  switch (tk) {
194  case TK_BOOLEAN:
195  case TK_BYTE:
196  case TK_UINT8:
197  case TK_UINT16:
198  case TK_UINT32:
199  case TK_UINT64:
200  case TK_INT8:
201  case TK_INT16:
202  case TK_INT32:
203  case TK_INT64:
204  case TK_FLOAT32:
205  case TK_FLOAT64:
206  case TK_FLOAT128:
207  case TK_CHAR8:
208 #ifdef DDS_HAS_WCHAR
209  case TK_CHAR16:
210 #endif
211  case TK_ENUM:
212  return 1;
213  case TK_STRING8:
214 #ifdef DDS_HAS_WCHAR
215  case TK_STRING16:
216 #endif
217  {
218  if (!container_.single_map_.empty() || !container_.complex_map_.empty()) {
219  CORBA::ULong largest_index;
220  if (!container_.get_largest_index_basic(largest_index)) {
221  return 0;
222  }
223  return largest_index + 1;
224  }
225  return 0;
226  }
227  case TK_SEQUENCE:
228  return get_sequence_size();
229  case TK_BITMASK:
230  return static_cast<ACE_CDR::ULong>(container_.single_map_.size() +
231  container_.complex_map_.size());
232  case TK_ARRAY:
233  return bound_total(type_desc_);
234  case TK_STRUCTURE: {
235  const CORBA::ULong member_count = type_->get_member_count();
236  CORBA::ULong count = member_count;
237  // An optional member that hasn't been set is considered missing.
238  // All non-optional members are counted since they either are set directly
239  // or hold default values (XTypes spec 7.5.2.11.6).
240  for (CORBA::ULong i = 0; i < member_count; ++i) {
241  DDS::DynamicTypeMember_var dtm;
242  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
243  return 0;
244  }
245  DDS::MemberDescriptor_var md;
246  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
247  return 0;
248  }
249  if (md->is_optional()) {
250  const DDS::MemberId id = md->id();
251  if (container_.single_map_.find(id) == container_.single_map_.end() &&
252  container_.sequence_map_.find(id) == container_.sequence_map_.end() &&
253  container_.complex_map_.find(id) == container_.complex_map_.end()) {
254  --count;
255  }
256  }
257  }
258  return count;
259  }
260  case TK_UNION: {
261  CORBA::ULong count = static_cast<CORBA::ULong>(container_.single_map_.size() +
262  container_.sequence_map_.size() +
263  container_.complex_map_.size());
264  if (count > 0) {
265  return count;
266  }
267  DDS::DynamicType_var disc_type = get_base_type(type_desc_->discriminator_type());
268  CORBA::Long disc_val;
269  if (!container_.set_default_discriminator_value(disc_val, disc_type)) {
270  if (log_level >= LogLevel::Warning) {
271  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::get_item_count:"
272  " set_default_discriminator_value failed\n"));
273  }
274  return 0;
275  }
276  bool select_a_member;
277  DDS::MemberDescriptor_var selected_md;
278  const DDS::ReturnCode_t rc = get_selected_union_branch(disc_val, select_a_member, selected_md);
279  if (rc != DDS::RETCODE_OK) {
280  if (log_level >= LogLevel::Warning) {
281  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::get_item_count:"
282  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
283  }
284  return 0;
285  }
286  return select_a_member ? 2 : 1;
287  }
288  case TK_MAP:
289  case TK_BITSET:
290  case TK_ALIAS:
291  case TK_ANNOTATION:
292  default:
293  if (log_level >= LogLevel::Warning) {
294  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::get_item_count:"
295  " Encounter unexpected type kind %C\n", typekind_to_string(tk)));
296  }
297  return 0;
298  }
299 }
300 
302 {
303  const TypeKind tk = type_->get_kind();
304  if (is_primitive(tk) || tk == TK_ENUM) {
306  }
307 
308  switch (tk) {
309  case TK_BITMASK:
310  case TK_ARRAY:
311  case TK_STRING8:
312 #ifdef DDS_HAS_WCHAR
313  case TK_STRING16:
314 #endif
315  case TK_SEQUENCE:
316  case TK_STRUCTURE:
317  case TK_UNION:
318  clear_container();
319  break;
320  case TK_MAP:
321  case TK_BITSET:
322  case TK_ALIAS:
323  case TK_ANNOTATION:
324  default:
325  if (log_level >= LogLevel::Notice) {
326  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::clear_all_values:"
327  " Encounter unexpected type kind %C\n", typekind_to_string(tk)));
328  }
329  return DDS::RETCODE_ERROR;
330  }
331  return DDS::RETCODE_OK;
332 }
333 
335 {
336  container_.single_map_.clear();
337  container_.sequence_map_.clear();
338  container_.complex_map_.clear();
339 }
340 
342 {
344 }
345 
347 {
348  const TypeKind this_tk = type_->get_kind();
349  if (is_primitive(this_tk) || this_tk == TK_ENUM) {
350  if (id != MEMBER_ID_INVALID) {
352  }
353  return clear_value_i(id, type_);
354  }
355 
356  switch (this_tk) {
357  case TK_BITMASK:
358  return set_boolean_value(id, false);
359  case TK_ARRAY: {
360  const DDS::UInt32 bound = bound_total(type_desc_);
361  if (id >= bound) {
363  }
364  DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
365  return clear_value_i(id, elem_type);
366  }
367  case TK_STRING8:
368 #ifdef DDS_HAS_WCHAR
369  case TK_STRING16:
370 #endif
371  case TK_SEQUENCE: {
372  // Shift subsequent elements to the left (XTypes spec 7.5.2.11.3).
373  const CORBA::ULong size = get_sequence_size();
374  if (id >= size) {
375  return DDS::RETCODE_ERROR;
376  }
377 
378  // At the begin of each iterator, member with the current id is not present
379  // in any of the maps. Copy over the next member to the current id.
380  erase_member(id);
381  for (CORBA::ULong i = id; i < size - 1; ++i) {
382  const DDS::MemberId next_id = i + 1;
383  DataContainer::const_single_iterator single_it = container_.single_map_.find(next_id);
384  if (single_it != container_.single_map_.end()) {
385  container_.single_map_.insert(std::make_pair(i, single_it->second));
386  container_.single_map_.erase(next_id);
387  continue;
388  }
389  DataContainer::const_sequence_iterator seq_it = container_.sequence_map_.find(next_id);
390  if (seq_it != container_.sequence_map_.end()) {
391  container_.sequence_map_.insert(std::make_pair(i, seq_it->second));
392  container_.sequence_map_.erase(next_id);
393  continue;
394  }
395  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(next_id);
396  if (complex_it != container_.complex_map_.end()) {
397  container_.complex_map_.insert(std::make_pair(i, complex_it->second));
398  container_.complex_map_.erase(next_id);
399  continue;
400  }
401  }
402  break;
403  }
404  case TK_STRUCTURE:
405  case TK_UNION: {
406  DDS::DynamicTypeMember_var dtm;
407  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
408  return DDS::RETCODE_ERROR;
409  }
410  DDS::MemberDescriptor_var md;
411  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
412  return DDS::RETCODE_ERROR;
413  }
414  if (md->is_optional()) {
415  erase_member(id);
416  break;
417  }
418  DDS::DynamicType_var member_type = get_base_type(md->type());
419  return clear_value_i(id, member_type);
420  }
421  case TK_MAP:
422  case TK_BITSET:
423  case TK_ALIAS:
424  case TK_ANNOTATION:
425  default:
426  if (log_level >= LogLevel::Warning) {
427  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::clear_value:"
428  " Encounter unexpected type kind %C\n", typekind_to_string(this_tk)));
429  }
430  return DDS::RETCODE_ERROR;
431  }
432  return DDS::RETCODE_OK;
433 }
434 
435 DDS::ReturnCode_t DynamicDataImpl::clear_value_i(DDS::MemberId id, const DDS::DynamicType_var& member_type)
436 {
437  const TypeKind tk = member_type->get_kind();
438  switch (tk) {
439  case TK_BOOLEAN: {
440  ACE_OutputCDR::from_boolean val(false);
442  insert_single(id, val);
443  break;
444  }
445  case TK_BYTE: {
448  insert_single(id, val);
449  break;
450  }
451  case TK_UINT8: {
454  insert_single(id, val);
455  break;
456  }
457  case TK_UINT16: {
458  CORBA::UInt16 val(0);
460  insert_single(id, val);
461  break;
462  }
463  case TK_UINT32: {
464  CORBA::UInt32 val(0);
466  insert_single(id, val);
467  break;
468  }
469  case TK_UINT64: {
470  CORBA::UInt64 val(0);
472  insert_single(id, val);
473  break;
474  }
475  case TK_INT8: {
478  insert_single(id, val);
479  break;
480  }
481  case TK_INT16: {
482  CORBA::Int16 val(0);
484  insert_single(id, val);
485  break;
486  }
487  case TK_INT32: {
488  CORBA::Int32 val(0);
490  insert_single(id, val);
491  break;
492  }
493  case TK_INT64: {
494  CORBA::Int64 val(0);
496  insert_single(id, val);
497  break;
498  }
499  case TK_FLOAT32: {
500  CORBA::Float val(0.0f);
502  insert_single(id, val);
503  break;
504  }
505  case TK_FLOAT64: {
506  CORBA::Double val(0.0);
508  insert_single(id, val);
509  break;
510  }
511  case TK_FLOAT128: {
512  CORBA::LongDouble val;
514  insert_single(id, val);
515  break;
516  }
517  case TK_CHAR8: {
518  ACE_OutputCDR::from_char val('\0');
520  insert_single(id, val);
521  break;
522  }
523  case TK_STRING8: {
524  const char* val = 0;
526  insert_single(id, val);
527  break;
528  }
529 #ifdef DDS_HAS_WCHAR
530  case TK_CHAR16: {
531  ACE_OutputCDR::from_wchar val(L'\0');
533  insert_single(id, val);
534  break;
535  }
536  case TK_STRING16: {
537  const CORBA::WChar* val = 0;
539  insert_single(id, val);
540  break;
541  }
542 #endif
543  case TK_ENUM: {
544  // Set to first enumerator
546  if (!container_.set_default_enum_value(member_type, value)) {
547  return DDS::RETCODE_ERROR;
548  }
549  TypeKind treat_as = tk;
550  if (enum_bound(member_type, treat_as) != DDS::RETCODE_OK) {
551  return DDS::RETCODE_ERROR;
552  }
553  if (treat_as == TK_INT8) {
554  ACE_OutputCDR::from_int8 val(static_cast<CORBA::Int8>(value));
555  insert_single(id, val);
556  } else if (treat_as == TK_INT16) {
557  insert_single(id, static_cast<CORBA::Short>(value));
558  } else {
559  insert_single(id, value);
560  }
561  break;
562  }
563  case TK_BITMASK: {
564  // Set to default bitmask value
565  TypeKind treat_as = tk;
566  if (bitmask_bound(member_type, treat_as) != DDS::RETCODE_OK) {
567  return DDS::RETCODE_ERROR;
568  }
569  if (treat_as == TK_UINT8) {
572  insert_single(id, val);
573  } else if (treat_as == TK_UINT16) {
574  CORBA::UShort val;
576  insert_single(id, val);
577  } else if (treat_as == TK_UINT32) {
578  CORBA::ULong val;
580  insert_single(id, val);
581  } else {
582  CORBA::ULongLong val;
584  insert_single(id, val);
585  }
586  break;
587  }
588  case TK_ARRAY:
589  case TK_SEQUENCE:
590  case TK_STRUCTURE:
591  case TK_UNION: {
592  DDS::DynamicData_var dd = new DynamicDataImpl(member_type);
593  insert_complex(id, dd);
594  break;
595  }
596  case TK_MAP:
597  case TK_BITSET:
598  case TK_ALIAS:
599  case TK_ANNOTATION:
600  default:
601  if (log_level >= LogLevel::Warning) {
602  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataImpl::clear_value_i:"
603  " Member %u has unexpected type kind %C\n", id, typekind_to_string(tk)));
604  }
605  return DDS::RETCODE_ERROR;
606  }
607  return DDS::RETCODE_OK;
608 }
609 
610 DDS::DynamicData_ptr DynamicDataImpl::clone()
611 {
612  return new DynamicDataImpl(*this);
613 }
614 
616 {
617  // The same member might be already written to complex_map_.
618  // Make sure there is only one entry for each member.
619  if (container_.complex_map_.erase(id) == 0) {
620  container_.single_map_.erase(id);
621  }
622  return container_.single_map_.insert(std::make_pair(id, value)).second;
623 }
624 
626 {
627  if (container_.complex_map_.erase(id) == 0) {
628  container_.single_map_.erase(id);
629  }
630  return container_.single_map_.insert(std::make_pair(id, value)).second;
631 }
632 
634 {
635  if (container_.complex_map_.erase(id) == 0) {
636  container_.single_map_.erase(id);
637  }
638  return container_.single_map_.insert(std::make_pair(id, value)).second;
639 }
640 
642 {
643  if (container_.complex_map_.erase(id) == 0) {
644  container_.single_map_.erase(id);
645  }
646  return container_.single_map_.insert(std::make_pair(id, value)).second;
647 }
648 
650 {
651  if (container_.complex_map_.erase(id) == 0) {
652  container_.single_map_.erase(id);
653  }
654  return container_.single_map_.insert(std::make_pair(id, value)).second;
655 }
656 
657 #ifdef DDS_HAS_WCHAR
659 {
660  if (container_.complex_map_.erase(id) == 0) {
661  container_.single_map_.erase(id);
662  }
663  return container_.single_map_.insert(std::make_pair(id, value)).second;
664 }
665 #endif
666 
667 template<typename SingleType>
668 bool DynamicDataImpl::insert_single(DDS::MemberId id, const SingleType& value)
669 {
670  if (container_.complex_map_.erase(id) == 0) {
671  container_.single_map_.erase(id);
672  }
673  return container_.single_map_.insert(std::make_pair(id, value)).second;
674 }
675 
676 bool DynamicDataImpl::insert_complex(DDS::MemberId id, const DDS::DynamicData_var& value)
677 {
678  if (container_.single_map_.erase(id) == 0) {
679  if (container_.sequence_map_.erase(id) == 0) {
680  container_.complex_map_.erase(id);
681  }
682  }
683  return container_.complex_map_.insert(std::make_pair(id, value)).second;
684 }
685 
686 // Set a member with the given ID in a struct. The member must have type MemberTypeKind or
687 // enum/bitmask. In the latter case, its bit bound must be in the range [lower, upper].
688 template<TypeKind MemberTypeKind, typename MemberType>
689 bool DynamicDataImpl::set_value_to_struct(DDS::MemberId id, const MemberType& value)
690 {
691  DDS::MemberDescriptor_var md;
692  DDS::DynamicType_var member_type;
693  const DDS::ReturnCode_t rc = check_member(
694  md, member_type, "DynamicDataImpl::set_value_to_struct", "set", id, MemberTypeKind);
695  if (rc != DDS::RETCODE_OK) {
696  return false;
697  }
698  return insert_single(id, value);
699 }
700 
702 {
703  switch (tk) {
704  case TK_BOOLEAN:
705  case TK_BYTE:
706  case TK_CHAR8:
707 #ifdef DDS_HAS_WCHAR
708  case TK_CHAR16:
709 #endif
710  case TK_INT8:
711  case TK_UINT8:
712  case TK_INT16:
713  case TK_UINT16:
714  case TK_INT32:
715  case TK_UINT32:
716  case TK_INT64:
717  case TK_UINT64:
718  case TK_ENUM:
719  return true;
720  default:
721  return false;
722  }
723 }
724 
725 // Return true if a discriminator value selects the default member of a union.
727 {
728  if (type_->get_kind() != TK_UNION) {
729  return false;
730  }
731 
732  DDS::DynamicTypeMembersById_var members_var;
733  if (type_->get_all_members(members_var) != DDS::RETCODE_OK) {
734  return false;
735  }
736  DynamicTypeMembersByIdImpl* members = dynamic_cast<DynamicTypeMembersByIdImpl*>(members_var.in());
737  if (!members) {
738  return false;
739  }
740 
741  for (DynamicTypeMembersByIdImpl::const_iterator it = members->begin(); it != members->end(); ++it) {
742  if (it->first == default_id) continue;
743 
744  DDS::MemberDescriptor_var md;
745  if (it->second->get_descriptor(md) != DDS::RETCODE_OK) {
746  return false;
747  }
748  const DDS::UnionCaseLabelSeq& labels = md->label();
749  for (CORBA::ULong i = 0; i < labels.length(); ++i) {
750  if (disc_val == labels[i]) {
751  return false;
752  }
753  }
754  }
755  return true;
756 }
757 
759  : kind_(TK_INT32), active_(0), int32_(int32)
760 {}
761 
763  : kind_(TK_UINT32), active_(0), uint32_(uint32)
764 {}
765 
767  : kind_(TK_INT8), active_(new(int8_) ACE_OutputCDR::from_int8(value.val_))
768 {}
769 
771  : kind_(TK_UINT8), active_(new(uint8_) ACE_OutputCDR::from_uint8(value.val_))
772 {}
773 
775  : kind_(TK_INT16), active_(0), int16_(int16)
776 {}
777 
779  : kind_(TK_UINT16), active_(0), uint16_(uint16)
780 {}
781 
783  : kind_(TK_INT64), active_(0), int64_(int64)
784 {}
785 
787  : kind_(TK_UINT64), active_(0), uint64_(uint64)
788 {}
789 
791  : kind_(TK_FLOAT32), active_(0), float32_(float32)
792 {}
793 
795  : kind_(TK_FLOAT64), active_(0), float64_(float64)
796 {}
797 
799  : kind_(TK_FLOAT128), active_(0), float128_(float128)
800 {}
801 
803  : kind_(TK_CHAR8), active_(new(char8_) ACE_OutputCDR::from_char(value.val_))
804 {}
805 
807  : kind_(TK_BYTE), active_(new(byte_) ACE_OutputCDR::from_octet(value.val_))
808 {}
809 
811  : kind_(TK_BOOLEAN), active_(new(boolean_) ACE_OutputCDR::from_boolean(value.val_))
812 {}
813 
816 {}
817 
818 #ifdef DDS_HAS_WCHAR
820  : kind_(TK_CHAR16), active_(new(char16_) ACE_OutputCDR::from_wchar(value.val_))
821 {}
822 
824  : kind_(TK_STRING16), active_(0), wstr_(CORBA::wstring_dup(wstr))
825 {}
826 #endif
827 
829 {
830 #define SINGLE_VALUE_DESTRUCT(T) static_cast<ACE_OutputCDR::T*>(active_)->~T(); break
831  switch (kind_) {
832  case TK_INT8:
833  SINGLE_VALUE_DESTRUCT(from_int8);
834  case TK_UINT8:
835  SINGLE_VALUE_DESTRUCT(from_uint8);
836  case TK_CHAR8:
837  SINGLE_VALUE_DESTRUCT(from_char);
838  case TK_BYTE:
839  SINGLE_VALUE_DESTRUCT(from_octet);
840  case TK_BOOLEAN:
841  SINGLE_VALUE_DESTRUCT(from_boolean);
842  case TK_STRING8:
843  CORBA::string_free((char*)str_);
844  break;
845 #ifdef DDS_HAS_WCHAR
846  case TK_CHAR16:
847  SINGLE_VALUE_DESTRUCT(from_wchar);
848  case TK_STRING16:
850  break;
851 #endif
852  }
853 #undef SINGLE_VALUE_DESTRUCT
854 }
855 
856 template<> const CORBA::Long& DynamicDataImpl::SingleValue::get() const { return int32_; }
857 template<> const CORBA::ULong& DynamicDataImpl::SingleValue::get() const { return uint32_; }
858 
860 {
861  return *static_cast<ACE_OutputCDR::from_int8*>(active_);
862 }
863 
865 {
866  return *static_cast<ACE_OutputCDR::from_uint8*>(active_);
867 }
868 
869 template<> const CORBA::Short& DynamicDataImpl::SingleValue::get() const { return int16_; }
870 template<> const CORBA::UShort& DynamicDataImpl::SingleValue::get() const { return uint16_; }
871 template<> const CORBA::LongLong& DynamicDataImpl::SingleValue::get() const { return int64_; }
872 template<> const CORBA::ULongLong& DynamicDataImpl::SingleValue::get() const { return uint64_; }
873 template<> const CORBA::Float& DynamicDataImpl::SingleValue::get() const { return float32_; }
874 template<> const CORBA::Double& DynamicDataImpl::SingleValue::get() const { return float64_; }
875 template<> const CORBA::LongDouble& DynamicDataImpl::SingleValue::get() const { return float128_; }
876 
878 {
879  return *static_cast<ACE_OutputCDR::from_char*>(active_);
880 }
881 
883 {
884  return *static_cast<ACE_OutputCDR::from_octet*>(active_);
885 }
886 
888 {
889  return *static_cast<ACE_OutputCDR::from_boolean*>(active_);
890 }
891 
892 template<> const char* const& DynamicDataImpl::SingleValue::get() const { return str_; }
893 
894 #ifdef DDS_HAS_WCHAR
896 {
897  return *static_cast<ACE_OutputCDR::from_wchar*>(active_);
898 }
899 
900 template<> const CORBA::WChar* const& DynamicDataImpl::SingleValue::get() const { return wstr_; }
901 #endif
902 
905 
906 // Has to be below the get methods, or else there's a template specialization issue.
908  : kind_(other.kind_)
909  , active_(0)
910 {
911  switch (kind_) {
912  case TK_INT8:
914  break;
915  case TK_UINT8:
917  break;
918  case TK_INT16:
919  int16_ = other.int16_;
920  break;
921  case TK_UINT16:
922  uint16_ = other.uint16_;
923  break;
924  case TK_INT32:
925  int32_ = other.int32_;
926  break;
927  case TK_UINT32:
928  uint32_ = other.uint32_;
929  break;
930  case TK_INT64:
931  int64_ = other.int64_;
932  break;
933  case TK_UINT64:
934  uint64_ = other.uint64_;
935  break;
936  case TK_FLOAT32:
937  float32_ = other.float32_;
938  break;
939  case TK_FLOAT64:
940  float64_ = other.float64_;
941  break;
942  case TK_FLOAT128:
943  float128_ = other.float128_;
944  break;
945  case TK_BOOLEAN:
947  break;
948  case TK_BYTE:
950  break;
951  case TK_CHAR8:
953  break;
954  case TK_STRING8:
955  str_ = CORBA::string_dup(other.str_);
956  break;
957 #ifdef DDS_HAS_WCHAR
958  case TK_CHAR16:
960  break;
961  case TK_STRING16:
962  wstr_ = CORBA::wstring_dup(other.wstr_);
963  break;
964 #endif
965  }
966 }
967 
969  : elem_kind_(TK_INT32), active_(new(int32_seq_) DDS::Int32Seq(int32_seq))
970 {}
971 
973  : elem_kind_(TK_UINT32), active_(new(uint32_seq_) DDS::UInt32Seq(uint32_seq))
974 {}
975 
977  : elem_kind_(TK_INT8), active_(new(int8_seq_) DDS::Int8Seq(int8_seq))
978 {}
979 
981  : elem_kind_(TK_UINT8), active_(new(uint8_seq_) DDS::UInt8Seq(uint8_seq))
982 {}
983 
985  : elem_kind_(TK_INT16), active_(new(int16_seq_) DDS::Int16Seq(int16_seq))
986 {}
987 
989  : elem_kind_(TK_UINT16), active_(new(uint16_seq_) DDS::UInt16Seq(uint16_seq))
990 {}
991 
993  : elem_kind_(TK_INT64), active_(new(int64_seq_) DDS::Int64Seq(int64_seq))
994 {}
995 
997  : elem_kind_(TK_UINT64), active_(new(uint64_seq_) DDS::UInt64Seq(uint64_seq))
998 {}
999 
1001  : elem_kind_(TK_FLOAT32), active_(new(float32_seq_) DDS::Float32Seq(float32_seq))
1002 {}
1003 
1005  : elem_kind_(TK_FLOAT64), active_(new(float64_seq_) DDS::Float64Seq(float64_seq))
1006 {}
1007 
1009  : elem_kind_(TK_FLOAT128), active_(new(float128_seq_) DDS::Float128Seq(float128_seq))
1010 {}
1011 
1013  : elem_kind_(TK_CHAR8), active_(new(char8_seq_) DDS::CharSeq(char8_seq))
1014 {}
1015 
1017  : elem_kind_(TK_BYTE), active_(new(byte_seq_) DDS::ByteSeq(byte_seq))
1018 {}
1019 
1021  : elem_kind_(TK_BOOLEAN), active_(new(boolean_seq_) DDS::BooleanSeq(boolean_seq))
1022 {}
1023 
1025  : elem_kind_(TK_STRING8), active_(new(string_seq_) DDS::StringSeq(str_seq))
1026 {}
1027 
1028 #ifdef DDS_HAS_WCHAR
1030  : elem_kind_(TK_CHAR16), active_(new(char16_seq_) DDS::WcharSeq(char16_seq))
1031 {}
1032 
1034  : elem_kind_(TK_STRING16), active_(new(wstring_seq_) DDS::WstringSeq(wstr_seq))
1035 {}
1036 #endif
1037 
1039  : elem_kind_(rhs.elem_kind_), active_(0)
1040 {
1041 #define SEQUENCE_VALUE_PLACEMENT_NEW(T, N) active_ = new(N) DDS::T(reinterpret_cast<const DDS::T&>(rhs.N)); break;
1042  switch (elem_kind_) {
1043  case TK_INT32:
1045  case TK_UINT32:
1047  case TK_INT8:
1049  case TK_UINT8:
1051  case TK_INT16:
1053  case TK_UINT16:
1055  case TK_INT64:
1057  case TK_UINT64:
1059  case TK_FLOAT32:
1061  case TK_FLOAT64:
1063  case TK_FLOAT128:
1064  SEQUENCE_VALUE_PLACEMENT_NEW(Float128Seq, float128_seq_);
1065  case TK_CHAR8:
1067  case TK_BYTE:
1069  case TK_BOOLEAN:
1071  case TK_STRING8:
1073 #ifdef DDS_HAS_WCHAR
1074  case TK_CHAR16:
1075  SEQUENCE_VALUE_PLACEMENT_NEW(WcharSeq, char16_seq_);
1076  case TK_STRING16:
1078 #endif
1079  }
1080 #undef SEQUENCE_VALUE_PLACEMENT_NEW
1081 }
1082 
1084 {
1085 #define SEQUENCE_VALUE_DESTRUCT(T) static_cast<DDS::T*>(active_)->~T(); break
1086  switch (elem_kind_) {
1087  case TK_INT32:
1089  case TK_UINT32:
1091  case TK_INT8:
1093  case TK_UINT8:
1095  case TK_INT16:
1097  case TK_UINT16:
1099  case TK_INT64:
1101  case TK_UINT64:
1103  case TK_FLOAT32:
1105  case TK_FLOAT64:
1107  case TK_FLOAT128:
1109  case TK_CHAR8:
1111  case TK_BYTE:
1113  case TK_BOOLEAN:
1115  case TK_STRING8:
1117 #ifdef DDS_HAS_WCHAR
1118  case TK_CHAR16:
1120  case TK_STRING16:
1122 #endif
1123  }
1124  #undef SEQUENCE_VALUE_DESTRUCT
1125 }
1126 
1127 #define SEQUENCE_VALUE_GETTERS(T) return *static_cast<DDS::T*>(active_)
1158 #ifdef DDS_HAS_WCHAR
1159 template<> const DDS::WcharSeq& DynamicDataImpl::SequenceValue::get() const
1161 template<> const DDS::WstringSeq& DynamicDataImpl::SequenceValue::get() const
1163 #endif
1164 #undef SEQUENCE_VALUE_GETTERS
1165 
1166 bool DynamicDataImpl::read_discriminator(CORBA::Long& disc_val, const DDS::DynamicType_var& disc_type,
1167  DataContainer::const_single_iterator it) const
1168 {
1169  switch (disc_type->get_kind()) {
1170  case TK_BOOLEAN: {
1171  const ACE_OutputCDR::from_boolean& value = it->second.get<ACE_OutputCDR::from_boolean>();
1172  disc_val = static_cast<CORBA::Long>(value.val_);
1173  return true;
1174  }
1175  case TK_BYTE: {
1176  const ACE_OutputCDR::from_octet& value = it->second.get<ACE_OutputCDR::from_octet>();
1177  disc_val = static_cast<CORBA::Long>(value.val_);
1178  return true;
1179  }
1180  case TK_CHAR8: {
1181  const ACE_OutputCDR::from_char& value = it->second.get<ACE_OutputCDR::from_char>();
1182  disc_val = static_cast<CORBA::Long>(value.val_);
1183  return true;
1184  }
1185 #ifdef DDS_HAS_WCHAR
1186  case TK_CHAR16: {
1187  const ACE_OutputCDR::from_wchar& value = it->second.get<ACE_OutputCDR::from_wchar>();
1188  disc_val = static_cast<CORBA::Long>(value.val_);
1189  return true;
1190  }
1191 #endif
1192  case TK_INT8: {
1193  const ACE_OutputCDR::from_int8& value = it->second.get<ACE_OutputCDR::from_int8>();
1194  disc_val = static_cast<CORBA::Long>(value.val_);
1195  return true;
1196  }
1197  case TK_UINT8: {
1198  const ACE_OutputCDR::from_uint8& value = it->second.get<ACE_OutputCDR::from_uint8>();
1199  disc_val = static_cast<CORBA::Long>(value.val_);
1200  return true;
1201  }
1202  case TK_INT16: {
1203  CORBA::Short value = it->second.get<CORBA::Short>();
1204  disc_val = static_cast<CORBA::Long>(value);
1205  return true;
1206  }
1207  case TK_UINT16: {
1208  CORBA::UShort value = it->second.get<CORBA::UShort>();
1209  disc_val = static_cast<CORBA::Long>(value);
1210  return true;
1211  }
1212  case TK_INT32: {
1213  disc_val = it->second.get<CORBA::Long>();
1214  return true;
1215  }
1216  case TK_UINT32: {
1217  CORBA::ULong value = it->second.get<CORBA::ULong>();
1218  disc_val = static_cast<CORBA::Long>(value);
1219  return true;
1220  }
1221  case TK_INT64: {
1222  CORBA::LongLong value = it->second.get<CORBA::LongLong>();
1223  disc_val = static_cast<CORBA::Long>(value);
1224  return true;
1225  }
1226  case TK_UINT64: {
1227  CORBA::ULongLong value = it->second.get<CORBA::ULongLong>();
1228  disc_val = static_cast<CORBA::Long>(value);
1229  return true;
1230  }
1231  case TK_ENUM: {
1232  DDS::TypeDescriptor_var td;
1233  if (disc_type->get_descriptor(td) != DDS::RETCODE_OK) {
1234  return false;
1235  }
1236  const CORBA::ULong bitbound = td->bound()[0];
1237  if (bitbound >= 1 && bitbound <= 8) {
1238  const ACE_OutputCDR::from_int8& value = it->second.get<ACE_OutputCDR::from_int8>();
1239  disc_val = static_cast<CORBA::Long>(value.val_);
1240  } else if (bitbound >= 9 && bitbound <= 16) {
1241  CORBA::Short value = it->second.get<CORBA::Short>();
1242  disc_val = static_cast<CORBA::Long>(value);
1243  } else {
1244  disc_val = it->second.get<CORBA::Long>();
1245  }
1246  return true;
1247  }
1248  }
1249  return false;
1250 }
1251 
1252 // Read a discriminator value from a DynamicData that represents it.
1254 {
1255  if (!is_valid_discriminator_type(type_->get_kind())) {
1256  return false;
1257  }
1258  DataContainer::const_single_iterator it = container_.single_map_.find(MEMBER_ID_INVALID);
1259  if (it == container_.single_map_.end()) {
1260  return false;
1261  }
1262  return read_discriminator(disc_val, type_, it);
1263 }
1264 
1265 // If a selected member of a union is already written, return its ID.
1266 // Should only be called for union.
1268 {
1269  // There can be at most 2 entries in total in all three maps,
1270  // one for the discriminator, one for a selected member.
1271  for (DataContainer::const_single_iterator single_it = container_.single_map_.begin();
1272  single_it != container_.single_map_.end(); ++single_it) {
1273  if (single_it->first != DISCRIMINATOR_ID) {
1274  return single_it->first;
1275  }
1276  }
1277 
1278  // If there is any entry in sequence_map_, that must be for a selected member
1279  // since discriminator cannot be sequence.
1280  if (container_.sequence_map_.size() > 0) {
1281  OPENDDS_ASSERT(container_.sequence_map_.size() == 1);
1282  return container_.sequence_map_.begin()->first;
1283  }
1284 
1285  for (DataContainer::const_complex_iterator cmpl_it = container_.complex_map_.begin();
1286  cmpl_it != container_.complex_map_.end(); ++cmpl_it) {
1287  if (cmpl_it->first != DISCRIMINATOR_ID) {
1288  return cmpl_it->first;
1289  }
1290  }
1291 
1292  // There was no selected member written.
1293  return MEMBER_ID_INVALID;
1294 }
1295 
1296 // Check if a discriminator value would select a member with the given descriptor in a union.
1298  const DDS::MemberDescriptor_var& md) const
1299 {
1300  // If the selected member is not default, the discriminator value must equal one of its
1301  // labels. If the selected member is default, the discriminator value must not equal
1302  // any label of the non-default members.
1303  if (!md->is_default_label()) {
1304  const DDS::UnionCaseLabelSeq& labels = md->label();
1305  bool found = false;
1306  for (CORBA::ULong i = 0; !found && i < labels.length(); ++i) {
1307  if (disc_val == labels[i]) {
1308  found = true;
1309  }
1310  }
1311  if (!found) {
1312  return false;
1313  }
1314  } else if (!is_default_member_selected(disc_val, md->id())) {
1315  return false;
1316  }
1317  return true;
1318 }
1319 
1321  const ACE_OutputCDR::from_boolean& value) const
1322 {
1323  disc_value = static_cast<CORBA::Long>(value.val_);
1324  return true;
1325 }
1326 
1328  const ACE_OutputCDR::from_octet& value) const
1329 {
1330  disc_value = static_cast<CORBA::Long>(value.val_);
1331  return true;
1332 }
1333 
1335  const ACE_OutputCDR::from_char& value) const
1336 {
1337  disc_value = static_cast<CORBA::Long>(value.val_);
1338  return true;
1339 }
1340 
1341 #ifdef DDS_HAS_WCHAR
1343  const ACE_OutputCDR::from_wchar& value) const
1344 {
1345  disc_value = static_cast<CORBA::Long>(value.val_);
1346  return true;
1347 }
1348 #endif
1349 
1351  const ACE_OutputCDR::from_int8& value) const
1352 {
1353  disc_value = static_cast<CORBA::Long>(value.val_);
1354  return true;
1355 }
1356 
1358  const ACE_OutputCDR::from_uint8& value) const
1359 {
1360  disc_value = static_cast<CORBA::Long>(value.val_);
1361  return true;
1362 }
1363 
1365  const CORBA::Short& value) const
1366 {
1367  disc_value = static_cast<CORBA::Long>(value);
1368  return true;
1369 }
1370 
1372  const CORBA::UShort& value) const
1373 {
1374  disc_value = static_cast<CORBA::Long>(value);
1375  return true;
1376 }
1377 
1379  const CORBA::Long& value) const
1380 {
1381  disc_value = value;
1382  return true;
1383 }
1384 
1386  const CORBA::ULong& value) const
1387 {
1388  disc_value = static_cast<CORBA::Long>(value);
1389  return true;
1390 }
1391 
1393  const CORBA::LongLong& value) const
1394 {
1395  disc_value = static_cast<CORBA::Long>(value);
1396  return true;
1397 }
1398 
1400  const CORBA::ULongLong& value) const
1401 {
1402  disc_value = static_cast<CORBA::Long>(value);
1403  return true;
1404 }
1405 
1406 template<typename MemberType>
1408  const MemberType& /*value*/) const
1409 {
1410  return false;
1411 }
1412 
1413 template<TypeKind MemberTypeKind, typename MemberType>
1414 bool DynamicDataImpl::set_value_to_union(DDS::MemberId id, const MemberType& value,
1415  TypeKind enum_or_bitmask, LBound lower, LBound upper)
1416 {
1417  // This follows the IDL-to-C++ mapping for union.
1418  DDS::DynamicType_var member_type;
1419  if (id == DISCRIMINATOR_ID) {
1420  // Discriminator can only be of certain types (XTypes spec, 7.2.2.4.4.3)
1421  if (!is_valid_discriminator_type(MemberTypeKind)) {
1422  if (log_level >= LogLevel::Notice) {
1423  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_value_to_union:"
1424  " Type %C cannot be used for union discriminator\n",
1425  typekind_to_string(MemberTypeKind)));
1426  }
1427  return false;
1428  }
1429 
1430  member_type = get_base_type(type_desc_->discriminator_type());
1431 
1432  const TypeKind member_tk = member_type->get_kind();
1433  if (member_tk != MemberTypeKind && member_tk != enum_or_bitmask) {
1434  return false;
1435  }
1436 
1437  if (member_tk == enum_or_bitmask) {
1438  DDS::TypeDescriptor_var member_td;
1439  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
1440  return false;
1441  }
1442  const CORBA::ULong bit_bound = member_td->bound()[0];
1443  if (bit_bound < lower || bit_bound > upper) {
1444  return false;
1445  }
1446  }
1447 
1448  CORBA::Long disc_value;
1449  if (!cast_to_discriminator_value(disc_value, value)) {
1450  return false;
1451  }
1452 
1453  const DDS::MemberId selected_id = find_selected_member();
1454  if (selected_id != MEMBER_ID_INVALID) {
1455  DDS::DynamicTypeMember_var selected_member;
1456  if (type_->get_member(selected_member, selected_id) != DDS::RETCODE_OK) {
1457  return false;
1458  }
1459  DDS::MemberDescriptor_var selected_md;
1460  if (selected_member->get_descriptor(selected_md) != DDS::RETCODE_OK) {
1461  return false;
1462  }
1463 
1464  if (!validate_discriminator(disc_value, selected_md)) {
1465  if (log_level >= LogLevel::Notice) {
1466  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_value_to_union:"
1467  " Discriminator value %d does not select the activated member (ID %u)\n",
1468  disc_value, selected_id));
1469  }
1470  return false;
1471  }
1472  return insert_single(id, value);
1473  } else {
1474  // In case the union has implicit default member and the input discriminator value
1475  // selects that implicit default member, store the discriminator value. The semantics
1476  // of this is similar to the _default() method of the IDL-to-C++ mapping for union.
1477  if (discriminator_selects_no_member(disc_value)) {
1478  return insert_single(id, value);
1479  }
1480  if (log_level >= LogLevel::Notice) {
1481  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_value_to_union:"
1482  " Can't directly set a discriminator that selects a member."
1483  " Activate the member first!\n"));
1484  }
1485  return false;
1486  }
1487  }
1488 
1489  // Activate a member
1490  clear_container();
1491 
1492  DDS::DynamicTypeMember_var member;
1493  if (type_->get_member(member, id) != DDS::RETCODE_OK) {
1494  return false;
1495  }
1496  DDS::MemberDescriptor_var md;
1497  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
1498  return false;
1499  }
1500  member_type = get_base_type(md->type());
1501 
1502  const TypeKind member_tk = member_type->get_kind();
1503  if (member_tk != MemberTypeKind && member_tk != enum_or_bitmask) {
1504  return false;
1505  }
1506 
1507  return insert_valid_discriminator(md) && insert_single(id, value);
1508 }
1509 
1511 {
1512  if (memberSelected->is_default_label()) {
1514  const ACE_CDR::ULong members = type_->get_member_count();
1515  for (ACE_CDR::ULong i = 0; i < members; ++i) {
1516  DDS::DynamicTypeMember_var member;
1517  if (type_->get_member_by_index(member, i) != DDS::RETCODE_OK) {
1518  return false;
1519  }
1520  if (member->get_id() == DISCRIMINATOR_ID || member->get_id() == memberSelected->id()) {
1521  continue;
1522  }
1523  DDS::MemberDescriptor_var mdesc;
1524  if (member->get_descriptor(mdesc) != DDS::RETCODE_OK) {
1525  return false;
1526  }
1527  const DDS::UnionCaseLabelSeq& lseq = mdesc->label();
1528  for (ACE_CDR::ULong lbl = 0; lbl < lseq.length(); ++lbl) {
1529  used.add(lseq[lbl]);
1530  }
1531  }
1532  const ACE_CDR::Long disc = used.empty() ? 0 : used.begin()->second + 1;
1533  return insert_discriminator(disc);
1534  }
1535  const DDS::UnionCaseLabelSeq& lseq = memberSelected->label();
1536  return lseq.length() && insert_discriminator(lseq[0]);
1537 }
1538 
1540 {
1541  DDS::DynamicTypeMember_var member;
1542  if (type_->get_member(member, DISCRIMINATOR_ID) != DDS::RETCODE_OK) {
1543  return false;
1544  }
1545  DDS::MemberDescriptor_var descriptor;
1546  if (member->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1547  return false;
1548  }
1549  DDS::DynamicType_var discType = get_base_type(descriptor->type());
1550  switch (discType ? discType->get_kind() : TK_NONE) {
1551  case TK_BOOLEAN:
1553  case TK_BYTE:
1555  case TK_CHAR8:
1557 #ifdef DDS_HAS_WCHAR
1558  case TK_CHAR16:
1560 #endif
1561  case TK_INT8:
1563  case TK_UINT8:
1565  case TK_INT16:
1566  return insert_single(DISCRIMINATOR_ID, static_cast<ACE_CDR::Short>(value));
1567  case TK_UINT16:
1568  return insert_single(DISCRIMINATOR_ID, static_cast<ACE_CDR::UShort>(value));
1569  case TK_ENUM:
1570  case TK_INT32:
1571  return insert_single(DISCRIMINATOR_ID, value);
1572  case TK_UINT32:
1573  return insert_single(DISCRIMINATOR_ID, static_cast<ACE_CDR::ULong>(value));
1574  case TK_INT64:
1575  return insert_single(DISCRIMINATOR_ID, static_cast<ACE_CDR::LongLong>(value));
1576  case TK_UINT64:
1577  return insert_single(DISCRIMINATOR_ID, static_cast<ACE_CDR::ULongLong>(value));
1578  default:
1579  return false;
1580  }
1581 }
1582 
1583 // Check if a given member ID is valid for a given type with a maximum number of elements.
1585 {
1586  // The given Id is treated as index.
1587  switch (tk) {
1588  case TK_STRING8:
1589  case TK_STRING16:
1590  case TK_SEQUENCE:
1591  case TK_MAP:
1592  // Bound of 0 means unbounded.
1593  if (bound == 0 || id < bound) {
1594  return true;
1595  }
1596  break;
1597  case TK_BITMASK:
1598  case TK_ARRAY:
1599  if (id < bound) {
1600  return true;
1601  }
1602  break;
1603  }
1604  return false;
1605 }
1606 
1607 template<TypeKind ElementTypeKind, typename ElementType>
1609  TypeKind collection_tk, TypeKind enum_or_bitmask, LBound lower, LBound upper)
1610 {
1611  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
1612  const TypeKind elem_tk = elem_type->get_kind();
1613 
1614  if (elem_tk != ElementTypeKind && elem_tk != enum_or_bitmask) {
1615  if (log_level >= LogLevel::Notice) {
1616  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_value_to_collection:"
1617  " Could not write a value of type %C to %C with element type %C\n",
1618  typekind_to_string(ElementTypeKind), typekind_to_string(collection_tk),
1619  typekind_to_string(elem_tk)));
1620  }
1621  return false;
1622  }
1623 
1624  if (elem_tk == enum_or_bitmask) {
1625  DDS::TypeDescriptor_var elem_td;
1626  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
1627  return false;
1628  }
1629  const CORBA::ULong bit_bound = elem_td->bound()[0];
1630  if (bit_bound < lower || bit_bound > upper) {
1631  return false;
1632  }
1633  }
1634 
1635  return validate_member_id_collection(id, collection_tk) && insert_single(id, value);
1636 }
1637 
1638 template<TypeKind ValueTypeKind, typename ValueType>
1640  TypeKind enum_or_bitmask, LBound lower, LBound upper)
1641 {
1642  if (!is_type_supported(ValueTypeKind, "set_single_value")) {
1643  return DDS::RETCODE_ERROR;
1644  }
1645 
1646  const TypeKind tk = type_->get_kind();
1647  bool good = true;
1648 
1649  // TODO: Bitmask can be stored as a whole as a unsigned integer using MEMBER_ID_INVALID
1650  // (this is an extension to the XTypes spec). Elements of the bitmask can also be set
1651  // using the set_boolean_value interface. The two copies of the bitmask value must be
1652  // made consistent. For example, when a bit in the bitmask is updated, either update
1653  // the unsigned integer representation or invalidate it. Similarly, when the unsigned
1654  // integer value is updated, either update the stored elements or invalidate them all.
1655  if (tk == enum_or_bitmask) {
1656  const CORBA::ULong bit_bound = type_desc_->bound()[0];
1657  good = id == MEMBER_ID_INVALID && bit_bound >= lower && bit_bound <= upper &&
1658  insert_single(id, value);
1659  } else {
1660  switch (tk) {
1661  case ValueTypeKind:
1662  good = is_primitive(tk) && id == MEMBER_ID_INVALID && insert_single(id, value);
1663  break;
1664  case TK_STRUCTURE:
1665  good = set_value_to_struct<ValueTypeKind>(id, value);
1666  break;
1667  case TK_UNION:
1668  good = set_value_to_union<ValueTypeKind>(id, value, enum_or_bitmask, lower, upper);
1669  break;
1670  case TK_SEQUENCE:
1671  case TK_ARRAY:
1672  case TK_MAP:
1673  good = set_value_to_collection<ValueTypeKind>(id, value, tk, enum_or_bitmask, lower, upper);
1674  break;
1675  default:
1676  good = false;
1677  break;
1678  }
1679  }
1680 
1681  if (!good && log_level >= LogLevel::Notice) {
1682  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_single_value: "
1683  "Failed to write a value of %C to DynamicData object of type %C\n",
1684  typekind_to_string(ValueTypeKind), typekind_to_string(tk)));
1685  }
1686  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1687 }
1688 
1690 {
1691  return set_single_value<TK_INT32>(id, value, TK_ENUM, 17, 32);
1692 }
1693 
1695 {
1696  return set_single_value<TK_UINT32>(id, value, TK_BITMASK, 17, 32);
1697 }
1698 
1700 {
1701  return set_single_value<TK_INT8>(id, ACE_OutputCDR::from_int8(value), TK_ENUM, 1, 8);
1702 }
1703 
1705 {
1706  return set_single_value<TK_UINT8>(id, ACE_OutputCDR::from_uint8(value), TK_BITMASK, 1, 8);
1707 }
1708 
1710 {
1711  return set_single_value<TK_INT16>(id, value, TK_ENUM, 9, 16);
1712 }
1713 
1715 {
1716  return set_single_value<TK_UINT16>(id, value, TK_BITMASK, 9, 16);
1717 }
1718 
1720 {
1721  return set_single_value<TK_INT64>(id, value);
1722 }
1723 
1725 {
1726  return set_single_value<TK_UINT64>(id, value, TK_BITMASK, 33, 64);
1727 }
1728 
1730 {
1731  return set_single_value<TK_FLOAT32>(id, value);
1732 }
1733 
1735 {
1736  return set_single_value<TK_FLOAT64>(id, value);
1737 }
1738 
1740 {
1741  return set_single_value<TK_FLOAT128>(id, value);
1742 }
1743 
1744 template<TypeKind CharKind, TypeKind StringKind, typename FromCharT>
1746 {
1747  const TypeKind tk = type_->get_kind();
1748  bool good = true;
1749 
1750  switch (tk) {
1751  case CharKind:
1752  good = id == MEMBER_ID_INVALID && insert_single(id, value);
1753  break;
1754  case StringKind: {
1755  const CORBA::ULong bound = type_desc_->bound()[0];
1756  if (!check_index_from_id(tk, id, bound)) {
1757  good = false;
1758  } else {
1759  good = insert_single(id, value);
1760  }
1761  break;
1762  }
1763  case TK_STRUCTURE:
1764  good = set_value_to_struct<CharKind>(id, value);
1765  break;
1766  case TK_UNION:
1767  good = set_value_to_union<CharKind>(id, value);
1768  break;
1769  case TK_SEQUENCE:
1770  case TK_ARRAY:
1771  case TK_MAP:
1772  good = set_value_to_collection<CharKind>(id, value, tk);
1773  break;
1774  default:
1775  good = false;
1776  break;
1777  }
1778 
1779  if (!good && log_level >= LogLevel::Notice) {
1780  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_char_common:"
1781  " Failed to write DynamicData object of type %C\n", typekind_to_string(tk)));
1782  }
1783  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1784 }
1785 
1787 {
1788  return set_char_common<TK_CHAR8, TK_STRING8>(id, ACE_OutputCDR::from_char(value));
1789 }
1790 
1792 {
1793 #ifdef DDS_HAS_WCHAR
1794  return set_char_common<TK_CHAR16, TK_STRING16>(id, ACE_OutputCDR::from_wchar(value));
1795 #else
1796  return DDS::RETCODE_UNSUPPORTED;
1797 #endif
1798 }
1799 
1801 {
1802  return set_single_value<TK_BYTE>(id, ACE_OutputCDR::from_octet(value));
1803 }
1804 
1806 {
1807  const TypeKind tk = type_->get_kind();
1808  bool good = true;
1809 
1810  switch (tk) {
1811  case TK_BOOLEAN:
1812  good = id == MEMBER_ID_INVALID && insert_single(id, ACE_OutputCDR::from_boolean(value));
1813  break;
1814  case TK_BITMASK: {
1815  const CORBA::ULong bit_bound = type_desc_->bound()[0];
1816  if (!check_index_from_id(tk, id, bit_bound)) {
1817  good = false;
1818  } else {
1819  good = insert_single(id, ACE_OutputCDR::from_boolean(value));
1820  }
1821  break;
1822  }
1823  case TK_STRUCTURE:
1824  good = set_value_to_struct<TK_BOOLEAN>(id, ACE_OutputCDR::from_boolean(value));
1825  break;
1826  case TK_UNION:
1827  good = set_value_to_union<TK_BOOLEAN>(id, ACE_OutputCDR::from_boolean(value));
1828  break;
1829  case TK_SEQUENCE:
1830  case TK_ARRAY:
1831  case TK_MAP:
1832  good = set_value_to_collection<TK_BOOLEAN>(id, ACE_OutputCDR::from_boolean(value), tk);
1833  break;
1834  default:
1835  good = false;
1836  break;
1837  }
1838 
1839  if (!good && log_level >= LogLevel::Notice) {
1840  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_boolean_value:"
1841  " Failed to write boolean to DynamicData object of type %C\n",
1842  typekind_to_string(tk)));
1843  }
1844  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1845 }
1846 
1848 {
1849  DDS::DynamicType_var mtype;
1850  DDS::ReturnCode_t rc = get_member_type(mtype, type_, id);
1851  if (rc != DDS::RETCODE_OK) {
1852  return rc;
1853  }
1854  if (mtype->get_kind() == TK_ENUM) {
1855  DDS::Int32 intValue;
1856  rc = get_enumerator_value(intValue, value, mtype);
1857  if (rc != DDS::RETCODE_OK) {
1858  return rc;
1859  }
1860  return set_enum_value(mtype, this, id, intValue);
1861  }
1862  return set_single_value<TK_STRING8>(id, value);
1863 }
1864 
1866 {
1867 #ifdef DDS_HAS_WCHAR
1868  return set_single_value<TK_STRING16>(id, value);
1869 #else
1870  return DDS::RETCODE_UNSUPPORTED;
1871 #endif
1872 }
1873 
1874 #ifndef OPENDDS_NO_CONTENT_SUBSCRIPTION_PROFILE
1876  DDS::MemberId id) const
1877 {
1878  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
1879  if (single_it != container_.single_map_.end()) {
1880  value = single_it->second.get<ACE_OutputCDR::from_boolean>().val_;
1881  return DDS::RETCODE_OK;
1882  }
1883  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
1884  if (complex_it != container_.complex_map_.end()) {
1885  const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
1886  if (!inner_dd) {
1887  return DDS::RETCODE_ERROR;
1888  }
1889  DataContainer::const_single_iterator inner_it =
1890  inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
1891  if (inner_it != inner_dd->container_.single_map_.end()) {
1892  value = inner_it->second.get<ACE_OutputCDR::from_boolean>().val_;
1893  return DDS::RETCODE_OK;
1894  }
1895  }
1896  return DDS::RETCODE_ERROR;
1897 }
1898 
1900  DDS::MemberId id) const
1901 {
1902  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
1903  if (single_it != container_.single_map_.end()) {
1904  value = single_it->second.get<ACE_OutputCDR::from_char>().val_;
1905  return DDS::RETCODE_OK;
1906  }
1907  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
1908  if (complex_it != container_.complex_map_.end()) {
1909  const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
1910  if (!inner_dd) {
1911  return DDS::RETCODE_ERROR;
1912  }
1913  DataContainer::const_single_iterator inner_it =
1914  inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
1915  if (inner_it != inner_dd->container_.single_map_.end()) {
1916  value = inner_it->second.get<ACE_OutputCDR::from_char>().val_;
1917  return DDS::RETCODE_OK;
1918  }
1919  }
1920  return DDS::RETCODE_ERROR;
1921 }
1922 
1923 template<typename ValueType>
1925  DDS::MemberId id) const
1926 {
1927  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
1928  if (single_it != container_.single_map_.end()) {
1929  value = single_it->second.get<ValueType>();
1930  return DDS::RETCODE_OK;
1931  }
1932  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
1933  if (complex_it != container_.complex_map_.end()) {
1934  const DynamicDataImpl* inner_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
1935  if (!inner_dd) {
1936  return DDS::RETCODE_ERROR;
1937  }
1938  DataContainer::const_single_iterator inner_it =
1939  inner_dd->container_.single_map_.find(MEMBER_ID_INVALID);
1940  if (inner_it != inner_dd->container_.single_map_.end()) {
1941  value = inner_it->second.get<ValueType>();
1942  return DDS::RETCODE_OK;
1943  }
1944  }
1945  return DDS::RETCODE_ERROR;
1946 }
1947 
1949  DDS::MemberId id) const
1950 {
1951  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
1952  if (single_it != container_.single_map_.end()) {
1953  value = single_it->second.get<const char*>();
1954  return DDS::RETCODE_OK;
1955  }
1956 
1957  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
1958  if (complex_it != container_.complex_map_.end()) {
1959  // The string member has its own DynamicData object.
1960  const DynamicDataImpl* str_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
1961  char* str = 0;
1962  if (!str_dd || !str_dd->read_basic_value(str)) {
1963  return DDS::RETCODE_ERROR;
1964  }
1965  value = str;
1966  return DDS::RETCODE_OK;
1967  }
1968  return DDS::RETCODE_ERROR;
1969 }
1970 
1972  DDS::MemberId id) const
1973 {
1974  DDS::DynamicType_var mtype;
1975  DDS::ReturnCode_t ret = get_member_type(mtype, type_, id);
1976  if (ret != DDS::RETCODE_OK) {
1977  return ret;
1978  }
1979 
1980  DDS::Int32 enumAsInteger;
1981  ret = get_enum_value(enumAsInteger, mtype, interface_from_this(), id);
1982  if (ret != DDS::RETCODE_OK) {
1983  return ret;
1984  }
1985 
1986  DDS::String8_var str;
1987  ret = get_enumerator_name(str, enumAsInteger, mtype);
1988  if (ret != DDS::RETCODE_OK) {
1989  return ret;
1990  }
1991 
1992  value = str.in();
1993  return DDS::RETCODE_OK;
1994 }
1995 
1997 {
1998  DDS::DynamicTypeMember_var dtm;
1999  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
2000  return DDS::RETCODE_ERROR;
2001  }
2002  DDS::MemberDescriptor_var md;
2003  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
2004  return DDS::RETCODE_ERROR;
2005  }
2006  DDS::DynamicType_var member_type = get_base_type(md->type());
2007  const TypeKind member_kind = member_type->get_kind();
2008  switch (member_kind) {
2009  case TK_BOOLEAN:
2010  return get_simple_value_boolean(value, id);
2011  case TK_INT32:
2012  return get_simple_value_primitive<CORBA::Long>(value, id);
2013  case TK_UINT32:
2014  return get_simple_value_primitive<CORBA::ULong>(value, id);
2015  case TK_INT64:
2016  return get_simple_value_primitive<CORBA::LongLong>(value, id);
2017  case TK_UINT64:
2018  return get_simple_value_primitive<CORBA::ULongLong>(value, id);
2019  case TK_CHAR8:
2020  return get_simple_value_char(value, id);
2021  case TK_FLOAT64:
2022  return get_simple_value_primitive<CORBA::Double>(value, id);
2023  case TK_FLOAT128:
2024  return get_simple_value_primitive<CORBA::LongDouble>(value, id);
2025  case TK_STRING8:
2026  return get_simple_value_string(value, id);
2027  case TK_ENUM:
2028  return get_simple_value_enum(value, id);
2029  default:
2030  if (log_level >= LogLevel::Notice) {
2031  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_simple_value:"
2032  " Member type %C is not supported by DCPS::Value\n",
2033  typekind_to_string(member_kind)));
2034  }
2035  }
2036  return DDS::RETCODE_ERROR;
2037 }
2038 #endif
2039 
2040 bool DynamicDataImpl::set_complex_to_struct(DDS::MemberId id, DDS::DynamicData_var value)
2041 {
2042  DDS::DynamicTypeMember_var member;
2043  if (type_->get_member(member, id) != DDS::RETCODE_OK) {
2044  return false;
2045  }
2046  DDS::MemberDescriptor_var md;
2047  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
2048  return false;
2049  }
2050 
2051  const DDS::DynamicType_var member_type = get_base_type(md->type());
2052  const DDS::DynamicType_var value_type = value->type();
2053  if (!member_type || !value_type || !member_type->equals(value_type)) {
2054  return false;
2055  }
2056  return insert_complex(id, value);
2057 }
2058 
2059 bool DynamicDataImpl::set_complex_to_union(DDS::MemberId id, DDS::DynamicData_var value)
2060 {
2061  if (id == DISCRIMINATOR_ID) {
2062  DDS::DynamicType_var disc_type = get_base_type(type_desc_->discriminator_type());
2063  const DDS::DynamicType_var value_type = value->type();
2064  if (!disc_type->equals(value_type)) {
2065  return false;
2066  }
2067 
2068  CORBA::Long disc_val;
2069  const DynamicDataImpl* dd_impl = dynamic_cast<const DynamicDataImpl*>(value.in());
2070  if (!dd_impl || !dd_impl->read_discriminator(disc_val)) {
2071  return false;
2072  }
2073 
2074  const DDS::MemberId selected_id = find_selected_member();
2075  if (selected_id != MEMBER_ID_INVALID) {
2076  DDS::DynamicTypeMember_var selected_member;
2077  if (type_->get_member(selected_member, selected_id) != DDS::RETCODE_OK) {
2078  return false;
2079  }
2080  DDS::MemberDescriptor_var selected_md;
2081  if (selected_member->get_descriptor(selected_md) != DDS::RETCODE_OK) {
2082  return false;
2083  }
2084  if (!validate_discriminator(disc_val, selected_md)) {
2085  if (log_level >= LogLevel::Notice) {
2086  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_complex_to_union:"
2087  " Discriminator value %d does not select the activated member (ID %u)\n",
2088  disc_val, selected_id));
2089  }
2090  return false;
2091  }
2092  return insert_complex(id, value);
2093  } else {
2094  if (discriminator_selects_no_member(disc_val)) {
2095  return insert_complex(id, value);
2096  }
2097  if (log_level >= LogLevel::Notice) {
2098  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_complex_to_union:"
2099  " Can't directly set a discriminator that selects a member."
2100  " Activate the member first!\n"));
2101  }
2102  return false;
2103  }
2104  }
2105 
2106  // Activate a member
2107  clear_container();
2108 
2109  DDS::DynamicTypeMember_var member;
2110  if (type_->get_member(member, id) != DDS::RETCODE_OK) {
2111  return false;
2112  }
2113  DDS::MemberDescriptor_var md;
2114  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
2115  return false;
2116  }
2117  const DDS::DynamicType_var value_type = value->type();
2118  if (get_base_type(md->type())->equals(value_type)) {
2119  return false;
2120  }
2121 
2122  return insert_valid_discriminator(md) && insert_complex(id, value);
2123 }
2124 
2126 {
2127  switch (tk) {
2128  case TK_SEQUENCE:
2129  case TK_ARRAY:
2130  return check_index_from_id(tk, id, bound_total(type_desc_));
2131  case TK_MAP:
2132  if (log_level >= LogLevel::Notice) {
2133  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::validate_member_id_collection::"
2134  " Map is currently not supported\n"));
2135  }
2136  }
2137  return false;
2138 }
2139 
2140 bool DynamicDataImpl::set_complex_to_collection(DDS::MemberId id, DDS::DynamicData_var value,
2141  TypeKind collection_tk)
2142 {
2143  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
2144  const DDS::DynamicType_var value_type = value->type();
2145  if (!elem_type->equals(value_type)) {
2146  return false;
2147  }
2148 
2149  return validate_member_id_collection(id, collection_tk) && insert_complex(id, value);
2150 }
2151 
2153 {
2154  DDS::DynamicData_var value_var = DDS::DynamicData::_duplicate(value);
2155  const TypeKind tk = type_->get_kind();
2156  bool good = false;
2157 
2158  switch (tk) {
2159  case TK_STRUCTURE:
2160  good = set_complex_to_struct(id, value_var);
2161  break;
2162  case TK_UNION:
2163  good = set_complex_to_union(id, value_var);
2164  break;
2165  case TK_SEQUENCE:
2166  case TK_ARRAY:
2167  case TK_MAP:
2168  good = set_complex_to_collection(id, value_var, tk);
2169  break;
2170  default:
2171  good = false;
2172  break;
2173  }
2174 
2175  if (!good && log_level >= LogLevel::Notice) {
2176  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_complex_value:"
2177  " Failed to write complex value for member with ID %d\n", id));
2178  }
2179  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
2180 }
2181 
2182 template<typename SequenceType>
2183 bool DynamicDataImpl::insert_sequence(DDS::MemberId id, const SequenceType& value)
2184 {
2185  if (container_.complex_map_.erase(id) == 0) {
2186  container_.sequence_map_.erase(id);
2187  }
2188  return container_.sequence_map_.insert(std::make_pair(id, value)).second;
2189 }
2190 
2191 template<TypeKind ElementTypeKind>
2193  LBound lower, LBound upper) const
2194 {
2195  DDS::DynamicTypeMember_var member;
2196  if (type_->get_member(member, id)) {
2197  return false;
2198  }
2199  DDS::MemberDescriptor_var md;
2200  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
2201  return false;
2202  }
2203 
2204  const DDS::DynamicType_var member_type = get_base_type(md->type());
2205  const TypeKind member_tk = member_type->get_kind();
2206  if (member_tk != TK_SEQUENCE) {
2207  return false;
2208  }
2209 
2210  DDS::TypeDescriptor_var member_td;
2211  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
2212  return false;
2213  }
2214 
2215  const DDS::DynamicType_var elem_type = get_base_type(member_td->element_type());
2216  const TypeKind elem_tk = elem_type->get_kind();
2217  if (elem_tk != ElementTypeKind && elem_tk != enum_or_bitmask) {
2218  return false;
2219  }
2220 
2221  if (elem_tk == enum_or_bitmask) {
2222  DDS::TypeDescriptor_var elem_td;
2223  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
2224  return false;
2225  }
2226  const CORBA::ULong bit_bound = elem_td->bound()[0];
2227  if (bit_bound < lower || bit_bound > upper) {
2228  return false;
2229  }
2230  }
2231  return true;
2232 }
2233 
2234 template<TypeKind ElementTypeKind, typename SequenceType>
2235 bool DynamicDataImpl::set_values_to_struct(DDS::MemberId id, const SequenceType& value,
2236  TypeKind enum_or_bitmask,
2237  LBound lower, LBound upper)
2238 {
2239  return check_seqmem_in_struct_and_union<ElementTypeKind>(id, enum_or_bitmask, lower, upper) &&
2240  insert_sequence(id, value);
2241 }
2242 
2243 template<TypeKind ElementTypeKind, typename SequenceType>
2244 bool DynamicDataImpl::set_values_to_union(DDS::MemberId id, const SequenceType& value,
2245  TypeKind enum_or_bitmask,
2246  LBound lower, LBound upper)
2247 {
2248  if (id == DISCRIMINATOR_ID) {
2249  if (log_level >= LogLevel::Notice) {
2250  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_values_to_union:"
2251  " Union discriminator cannot be a sequence\n"));
2252  }
2253  return false;
2254  }
2255 
2256  // Check the member type against the input type parameters.
2257  if (!check_seqmem_in_struct_and_union<ElementTypeKind>(id, enum_or_bitmask, lower, upper)) {
2258  return false;
2259  }
2260 
2261  clear_container();
2262 
2263  DDS::DynamicTypeMember_var member;
2264  if (type_->get_member(member, id) != DDS::RETCODE_OK) {
2265  return false;
2266  }
2267  DDS::MemberDescriptor_var md;
2268  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
2269  return false;
2270  }
2271  return insert_valid_discriminator(md) && insert_sequence(id, value);
2272 }
2273 
2274 template<TypeKind ElementTypeKind>
2276  TypeKind enum_or_bitmask, LBound lower, LBound upper) const
2277 {
2278  if (!check_index_from_id(type_->get_kind(), id, bound)) {
2279  return false;
2280  }
2281 
2282  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
2283  const TypeKind elem_tk = elem_type->get_kind();
2284  if (elem_tk != TK_SEQUENCE) {
2285  return false;
2286  }
2287 
2288  DDS::TypeDescriptor_var elem_td;
2289  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
2290  return false;
2291  }
2292 
2293  const DDS::DynamicType_var nested_elem_type = get_base_type(elem_td->element_type());
2294  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
2295  if (nested_elem_tk != ElementTypeKind && nested_elem_tk != enum_or_bitmask) {
2296  return false;
2297  }
2298  if (nested_elem_tk == enum_or_bitmask) {
2299  DDS::TypeDescriptor_var nested_elem_td;
2300  if (nested_elem_type->get_descriptor(nested_elem_td) != DDS::RETCODE_OK) {
2301  return false;
2302  }
2303  const CORBA::ULong bit_bound = nested_elem_td->bound()[0];
2304  if (bit_bound < lower || bit_bound > upper) {
2305  return false;
2306  }
2307  }
2308  return true;
2309 }
2310 
2311 template<TypeKind ElementTypeKind, typename SequenceType>
2312 bool DynamicDataImpl::set_values_to_sequence(DDS::MemberId id, const SequenceType& value,
2313  TypeKind enum_or_bitmask,
2314  LBound lower, LBound upper)
2315 {
2316  const DDS::UInt32 bound = type_desc_->bound()[0];
2317  return
2318  check_seqmem_in_sequence_and_array<ElementTypeKind>(id, bound, enum_or_bitmask, lower, upper) &&
2320  insert_sequence(id, value);
2321 }
2322 
2323 template<TypeKind ElementTypeKind, typename SequenceType>
2324 bool DynamicDataImpl::set_values_to_array(DDS::MemberId id, const SequenceType& value,
2325  TypeKind enum_or_bitmask,
2326  LBound lower, LBound upper)
2327 {
2328  const DDS::UInt32 length = bound_total(type_desc_);
2329  return
2330  check_seqmem_in_sequence_and_array<ElementTypeKind>(id, length, enum_or_bitmask, lower, upper) &&
2332  insert_sequence(id, value);
2333 }
2334 
2335 template<TypeKind ElementTypeKind, typename SequenceType>
2337  TypeKind enum_or_bitmask,
2338  LBound lower, LBound upper)
2339 {
2340  if (!is_type_supported(ElementTypeKind, "set_sequence_values")) {
2341  return DDS::RETCODE_ERROR;
2342  }
2343 
2344  const TypeKind tk = type_->get_kind();
2345  bool good = true;
2346 
2347  switch (tk) {
2348  case TK_STRUCTURE:
2349  good = set_values_to_struct<ElementTypeKind>(id, value, enum_or_bitmask, lower, upper);
2350  break;
2351  case TK_UNION:
2352  good = set_values_to_union<ElementTypeKind>(id, value, enum_or_bitmask, lower, upper);
2353  break;
2354  case TK_SEQUENCE:
2355  good = set_values_to_sequence<ElementTypeKind>(id, value, enum_or_bitmask, lower, upper);
2356  break;
2357  case TK_ARRAY:
2358  good = set_values_to_array<ElementTypeKind>(id, value, enum_or_bitmask, lower, upper);
2359  break;
2360  case TK_MAP:
2361  if (log_level >= LogLevel::Notice) {
2362  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_sequence_values:"
2363  " Map is currently not supported\n"));
2364  }
2365  return DDS::RETCODE_ERROR;
2366  default:
2367  if (log_level >= LogLevel::Notice) {
2368  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_sequence_values:"
2369  " Write to unsupported type (%C)\n", typekind_to_string(tk)));
2370  }
2371  return DDS::RETCODE_ERROR;
2372  }
2373 
2374  if (!good && log_level >= LogLevel::Notice) {
2375  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::set_sequence_values:"
2376  " Failed to write sequence of %C to member with ID %d\n",
2377  typekind_to_string(ElementTypeKind), id));
2378  }
2379  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
2380 }
2381 
2383 {
2384  return set_sequence_values<TK_INT32>(id, value, TK_ENUM, 17, 32);
2385 }
2386 
2388 {
2389  return set_sequence_values<TK_UINT32>(id, value, TK_BITMASK, 17, 32);
2390 }
2391 
2393 {
2394  return set_sequence_values<TK_INT8>(id, value, TK_ENUM, 1, 8);
2395 }
2396 
2398 {
2399  return set_sequence_values<TK_UINT8>(id, value, TK_BITMASK, 1, 8);
2400 }
2401 
2403 {
2404  return set_sequence_values<TK_INT16>(id, value, TK_ENUM, 9, 16);
2405 }
2406 
2408 {
2409  return set_sequence_values<TK_UINT16>(id, value, TK_BITMASK, 9, 16);
2410 }
2411 
2413 {
2414  return set_sequence_values<TK_INT64>(id, value);
2415 }
2416 
2418 {
2419  return set_sequence_values<TK_UINT64>(id, value, TK_BITMASK, 33, 64);
2420 }
2421 
2423 {
2424  return set_sequence_values<TK_FLOAT32>(id, value);
2425 }
2426 
2428 {
2429  return set_sequence_values<TK_FLOAT64>(id, value);
2430 }
2431 
2433 {
2434  return set_sequence_values<TK_FLOAT128>(id, value);
2435 }
2436 
2438 {
2439  return set_sequence_values<TK_CHAR8>(id, value);
2440 }
2441 
2443 {
2444 #ifdef DDS_HAS_WCHAR
2445  return set_sequence_values<TK_CHAR16>(id, value);
2446 #else
2447  return DDS::RETCODE_UNSUPPORTED;
2448 #endif
2449 }
2450 
2452 {
2453  return set_sequence_values<TK_BYTE>(id, value);
2454 }
2455 
2457 {
2458  return set_sequence_values<TK_BOOLEAN>(id, value);
2459 }
2460 
2462 {
2463  return set_sequence_values<TK_STRING8>(id, value);
2464 }
2465 
2467 {
2468 #ifdef DDS_HAS_WCHAR
2469  return set_sequence_values<TK_STRING16>(id, value);
2470 #else
2471  return DDS::RETCODE_UNSUPPORTED;
2472 #endif
2473 }
2474 
2476 {
2478 }
2479 
2481 {
2483 }
2484 
2486 {
2488 }
2489 
2491 {
2493 }
2494 
2496 {
2498 }
2499 
2501 {
2503 }
2504 
2506 {
2508 }
2509 
2511 {
2513 }
2514 
2516 {
2518 }
2519 
2521 {
2523 }
2524 
2526 {
2528 }
2529 
2531 {
2533 }
2534 
2535 #ifdef DDS_HAS_WCHAR
2537 {
2539 }
2540 #endif
2541 
2543 {
2545 }
2546 
2548 {
2550 }
2551 
2552 bool DynamicDataImpl::read_basic_value(char*& value) const
2553 {
2554  const bool is_empty = container_.single_map_.empty() && container_.complex_map_.empty();
2555  if (!is_empty) {
2556  CORBA::ULong largest_index;
2557  if (!container_.get_largest_index_basic(largest_index)) {
2558  return false;
2559  }
2560  const CORBA::ULong length = largest_index + 2;
2561  CORBA::String_var str_var = CORBA::string_alloc(length);
2562  ACE_OS::memset(str_var.inout(), 0, length);
2563  if (!container_.reconstruct_string_value(str_var.inout())) {
2564  return false;
2565  }
2566  CORBA::string_free(value);
2567  value = str_var._retn();
2568  } else {
2569  CORBA::string_free(value);
2570  value = CORBA::string_dup("");
2571  }
2572  return true;
2573 }
2574 
2575 #ifdef DDS_HAS_WCHAR
2577 {
2578  const bool is_empty = container_.single_map_.empty() && container_.complex_map_.empty();
2579  if (!is_empty) {
2580  CORBA::ULong largest_index;
2581  if (!container_.get_largest_index_basic(largest_index)) {
2582  return false;
2583  }
2584  const CORBA::ULong length = largest_index + 2;
2585  CORBA::WString_var wstr_var = CORBA::wstring_alloc(length);
2586  ACE_OS::memset(wstr_var.inout(), 0, length * sizeof(CORBA::WChar));
2587  if (!container_.reconstruct_wstring_value(wstr_var.inout())) {
2588  return false;
2589  }
2590  CORBA::wstring_free(value);
2591  value = wstr_var._retn();
2592  } else {
2593  CORBA::wstring_free(value);
2594  value = CORBA::wstring_dup(L"");
2595  }
2596  return true;
2597 }
2598 #endif
2599 
2600 template<typename ValueType>
2602 {
2603  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
2604  if (single_it != container_.single_map_.end()) {
2605  value = single_it->second.get<ValueType>();
2606  return true;
2607  }
2608  return false;
2609 }
2610 
2611 template<>
2613 {
2614  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
2615  if (single_it != container_.single_map_.end()) {
2616  CORBA::string_free(value);
2617  value = single_it->second.get_string();
2618  return true;
2619  }
2620  return false;
2621 }
2622 
2623 template<>
2625 {
2626  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
2627  if (single_it != container_.single_map_.end()) {
2628  CORBA::wstring_free(value);
2629  value = single_it->second.get_wstring();
2630  return true;
2631  }
2632  return false;
2633 }
2634 
2635 template<typename ValueType>
2637 {
2638  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
2639  if (complex_it != container_.complex_map_.end()) {
2640  DynamicDataImpl* nested_dd = dynamic_cast<DynamicDataImpl*>(complex_it->second.in());
2641  return nested_dd && nested_dd->read_basic_value(value);
2642  }
2643  return false;
2644 }
2645 
2646 template<typename ValueType>
2648 {
2649  return read_basic_in_single_map(value, id) || read_basic_in_complex_map(value, id);
2650 }
2651 
2652 template<>
2654 {
2655  return read_basic_in_single_map(value, id) || read_basic_in_complex_map(value, id);
2656 }
2657 
2658 template<>
2660 {
2661  return read_basic_in_single_map(value, id) || read_basic_in_complex_map(value, id);
2662 }
2663 
2664 template<typename ValueType>
2666 {
2667  // Primitive or enum value can be read using MEMBER_ID_INVALID.
2668  if (!is_primitive(type_->get_kind()) || id != MEMBER_ID_INVALID) {
2669  return false;
2670  }
2671  DataContainer::const_single_iterator it = container_.single_map_.find(MEMBER_ID_INVALID);
2672  if (it != container_.single_map_.end()) {
2673  value = it->second.get<ValueType>();
2674  } else {
2676  }
2677  return true;
2678 }
2679 
2680 template<>
2682 {
2683  // Can't read a string from a DynamicData instance representing a string.
2684  return false;
2685 }
2686 
2687 template<>
2689 {
2690  // Can't read a wstring from a DynamicData instance representing a wstring.
2691  return false;
2692 }
2693 
2694 template<TypeKind ValueTypeKind, typename ValueType>
2696 {
2697  TypeKind treat_as_tk;
2698  const DDS::ReturnCode_t rc = enum_bound(type_, treat_as_tk);
2699  if (rc != DDS::RETCODE_OK || treat_as_tk != ValueTypeKind || id != MEMBER_ID_INVALID) {
2700  return false;
2701  }
2702  DataContainer::const_single_iterator it = container_.single_map_.find(MEMBER_ID_INVALID);
2703  if (it != container_.single_map_.end()) {
2704  value = it->second.get<ValueType>();
2705  } else {
2706  CORBA::Long enum_default_val;
2707  if (!container_.set_default_enum_value(type_, enum_default_val)) {
2708  return false;
2709  }
2710  cast_to_enum_value(value, enum_default_val);
2711  }
2712  return true;
2713 }
2714 
2715 template<>
2716 bool DynamicDataImpl::get_value_from_enum<TK_STRING8>(char*&, DDS::MemberId)
2717 {
2718  return false;
2719 }
2720 template<>
2721 bool DynamicDataImpl::get_value_from_enum<TK_STRING16>(CORBA::WChar*&, DDS::MemberId)
2722 {
2723  return false;
2724 }
2725 
2726 template<TypeKind ValueTypeKind, typename ValueType>
2728 {
2729  // Allow bitmask to be read as an unsigned integer.
2730  TypeKind treat_as_tk;
2731  const DDS::ReturnCode_t rc = bitmask_bound(type_, treat_as_tk);
2732  if (rc != DDS::RETCODE_OK || treat_as_tk != ValueTypeKind || id != MEMBER_ID_INVALID) {
2733  return false;
2734  }
2735  DataContainer::const_single_iterator it = container_.single_map_.find(MEMBER_ID_INVALID);
2736  if (it != container_.single_map_.end()) {
2737  value = it->second.get<ValueType>();
2738  } else {
2740  }
2741  return true;
2742 }
2743 
2744 template<>
2745 bool DynamicDataImpl::get_value_from_bitmask<TK_STRING8>(char*&, DDS::MemberId)
2746 {
2747  return false;
2748 }
2749 template<>
2750 bool DynamicDataImpl::get_value_from_bitmask<TK_STRING16>(CORBA::WChar*&, DDS::MemberId)
2751 {
2752  return false;
2753 }
2754 
2755 template<TypeKind ValueTypeKind, typename ValueType>
2757 {
2758  DDS::MemberDescriptor_var md;
2759  DDS::DynamicType_var member_type;
2761  md, member_type, "DynamicDataImpl::get_value_from_struct", "get", id, ValueTypeKind);
2762  if (rc != DDS::RETCODE_OK) {
2763  return false;
2764  }
2765  if (read_basic_member(value, id)) {
2766  return true;
2767  }
2768 
2769  // Not returning a default value for a missing optional member.
2770  if (md->is_optional()) {
2771  if (log_level >= LogLevel::Notice) {
2772  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_value_from_struct:"
2773  " Optional member Id %u is not present\n", id));
2774  }
2775  return false;
2776  }
2778  return true;
2779 }
2780 
2781 template<TypeKind ValueTypeKind, typename ValueType>
2783 {
2784  DDS::MemberDescriptor_var md;
2785  DDS::DynamicType_var member_type;
2787  md, member_type, "DynamicDataImpl::get_value_from_union", "get", id, ValueTypeKind);
2788  if (rc != DDS::RETCODE_OK) {
2789  return false;
2790  }
2791 
2792  // Return the member if it is in the container.
2793  if (read_basic_member(value, id)) {
2794  return true;
2795  }
2796 
2797  if (id == DISCRIMINATOR_ID) {
2798  // Set the discriminator to default value.
2799  // If it selects a branch, set the branch to default value.
2801  CORBA::Long disc_value;
2802  if (!cast_to_discriminator_value(disc_value, value)) {
2803  return false;
2804  }
2805  bool found_selected_member = false;
2806  DDS::MemberDescriptor_var selected_md;
2807  const DDS::ReturnCode_t rc =
2808  get_selected_union_branch(disc_value, found_selected_member, selected_md);
2809  if (rc != DDS::RETCODE_OK) {
2810  if (log_level >= LogLevel::Notice) {
2811  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_value_from_union:"
2812  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
2813  }
2814  return false;
2815  }
2816  insert_single(id, value);
2817  if (found_selected_member && !selected_md->is_optional()) {
2818  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
2819  if (clear_value_i(selected_md->id(), selected_type) != DDS::RETCODE_OK) {
2820  return false;
2821  }
2822  }
2823  } else {
2824  DataContainer::const_single_iterator single_it = container_.single_map_.find(DISCRIMINATOR_ID);
2825  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(DISCRIMINATOR_ID);
2826  const bool has_disc = single_it != container_.single_map_.end() ||
2827  complex_it != container_.complex_map_.end();
2828  if (has_disc) {
2829  if (log_level >= LogLevel::Notice) {
2830  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_value_from_union:"
2831  " Branch Id %u is not the active branch in the union\n", id));
2832  }
2833  return false;
2834  }
2835  // Set the branch to default value and set the discriminator to a value that selects this branch.
2836  DDS::DynamicTypeMember_var dtm;
2837  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
2838  return false;
2839  }
2840  DDS::MemberDescriptor_var md;
2841  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
2842  return false;
2843  }
2844  DDS::DynamicType_var dt = get_base_type(md->type());
2845  if (clear_value_i(id, dt) != DDS::RETCODE_OK) {
2846  return false;
2847  }
2848  if (!insert_valid_discriminator(md)) {
2849  return false;
2850  }
2852  }
2853  return true;
2854 }
2855 
2857 {
2858  dst = ACE_OutputCDR::from_int8(static_cast<CORBA::Int8>(src));
2859 }
2860 
2862 {
2863  dst = static_cast<CORBA::Short>(src);
2864 }
2865 
2867 {
2868  dst = src;
2869 }
2870 
2871 template<typename ValueType>
2873 {}
2874 
2875 template<TypeKind ValueTypeKind, typename ValueType>
2877 {
2878  if (type_->get_kind() == TK_ARRAY && id >= bound_total(type_desc_)) {
2879  return false;
2880  }
2881 
2882  DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
2883  const TypeKind elem_tk = elem_type->get_kind();
2884  TypeKind treat_as_tk = elem_tk;
2885  switch (elem_tk) {
2886  case TK_ENUM:
2887  if (enum_bound(elem_type, treat_as_tk) != DDS::RETCODE_OK) {
2888  return false;
2889  }
2890  break;
2891  case TK_BITMASK: {
2892  if (bitmask_bound(elem_type, treat_as_tk) != DDS::RETCODE_OK) {
2893  return false;
2894  }
2895  break;
2896  }
2897  }
2898  if (treat_as_tk != ValueTypeKind) {
2899  return false;
2900  }
2901  if (read_basic_member(value, id)) {
2902  return true;
2903  }
2905 
2906  // Must insert this member in case it's index is larger than the current largest index,
2907  // so that all new members up to this member are serialized. Otherwise, we would be returning
2908  // a value that wouldn't be in the serialized data.
2909  insert_single(id, value);
2910  return true;
2911 }
2912 
2913 template<TypeKind ValueTypeKind, typename ValueType>
2915 {
2916  if (!is_type_supported(ValueTypeKind, "get_single_value")) {
2917  return DDS::RETCODE_ERROR;
2918  }
2919  const TypeKind tk = type_->get_kind();
2920  bool good = true;
2921 
2922  switch (tk) {
2923  case ValueTypeKind:
2924  good = get_value_from_self(value, id);
2925  break;
2926  case TK_ENUM:
2927  good = get_value_from_enum<ValueTypeKind>(value, id);
2928  break;
2929  case TK_BITMASK:
2930  good = get_value_from_bitmask<ValueTypeKind>(value, id);
2931  break;
2932  case TK_STRUCTURE:
2933  good = get_value_from_struct<ValueTypeKind>(value, id);
2934  break;
2935  case TK_UNION:
2936  good = get_value_from_union<ValueTypeKind>(value, id);
2937  break;
2938  case TK_SEQUENCE:
2939  case TK_ARRAY:
2940  good = get_value_from_collection<ValueTypeKind>(value, id);
2941  break;
2942  case TK_MAP:
2943  if (log_level >= LogLevel::Notice) {
2944  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_single_value:"
2945  " Map is currently not supported\n"));
2946  }
2947  good = false;
2948  break;
2949  default:
2950  good = false;
2951  break;
2952  }
2953 
2954  if (!good && log_level >= LogLevel::Notice) {
2955  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_single_value:"
2956  " Failed to read a value of type %C from a DynamicData object of type %C\n",
2957  typekind_to_string(ValueTypeKind), typekind_to_string(tk)));
2958  }
2959  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
2960 }
2961 
2963 {
2964  ACE_OutputCDR::from_int8 from_int8(0);
2965  const DDS::ReturnCode_t rc = get_single_value<TK_INT8>(from_int8, id);
2966  if (rc == DDS::RETCODE_OK) {
2967  value = from_int8.val_;
2968  }
2969  return rc;
2970 }
2971 
2973 {
2974  ACE_OutputCDR::from_uint8 from_uint8(0);
2975  const DDS::ReturnCode_t rc = get_single_value<TK_UINT8>(from_uint8, id);
2976  if (rc == DDS::RETCODE_OK) {
2977  value = from_uint8.val_;
2978  }
2979  return rc;
2980 }
2981 
2983 {
2984  return get_single_value<TK_INT16>(value, id);
2985 }
2986 
2988 {
2989  return get_single_value<TK_UINT16>(value, id);
2990 }
2991 
2993 {
2994  return get_single_value<TK_INT32>(value, id);
2995 }
2996 
2998 {
2999  return get_single_value<TK_UINT32>(value, id);
3000 }
3001 
3003 {
3004  return get_single_value<TK_INT64>(value, id);
3005 }
3006 
3008 {
3009  return get_single_value<TK_UINT64>(value, id);
3010 }
3011 
3013 {
3014  return get_single_value<TK_FLOAT32>(value, id);
3015 }
3016 
3018 {
3019  return get_single_value<TK_FLOAT64>(value, id);
3020 }
3021 
3023 {
3024  return get_single_value<TK_FLOAT128>(value, id);
3025 }
3026 
3027 template<TypeKind CharKind, TypeKind StringKind, typename FromCharT, typename CharT>
3029 {
3030  const TypeKind tk = type_->get_kind();
3031  bool good = true;
3032  switch (tk) {
3033  case CharKind: {
3034  if (id != MEMBER_ID_INVALID) {
3035  good = false;
3036  break;
3037  }
3038  DataContainer::const_single_iterator it = container_.single_map_.find(id);
3039  if (it != container_.single_map_.end()) {
3040  FromCharT from_char = it->second.get<FromCharT>();
3041  value = from_char.val_;
3042  } else {
3043  FromCharT from_char('\0');
3045  value = from_char.val_;
3046  }
3047  break;
3048  }
3049  case StringKind: {
3050  FromCharT from_char('\0');
3051  good = read_basic_member(from_char, id);
3052  if (good) {
3053  value = from_char.val_;
3054  }
3055  break;
3056  }
3057  case TK_STRUCTURE: {
3058  FromCharT from_char('\0');
3059  good = get_value_from_struct<CharKind>(from_char, id);
3060  if (good) {
3061  value = from_char.val_;
3062  }
3063  break;
3064  }
3065  case TK_UNION: {
3066  FromCharT from_char('\0');
3067  good = get_value_from_union<CharKind>(from_char, id);
3068  if (good) {
3069  value = from_char.val_;
3070  }
3071  break;
3072  }
3073  case TK_SEQUENCE:
3074  case TK_ARRAY: {
3075  FromCharT from_char('\0');
3076  good = get_value_from_collection<CharKind>(from_char, id);
3077  if (good) {
3078  value = from_char.val_;
3079  }
3080  break;
3081  }
3082  case TK_MAP:
3083  if (log_level >= LogLevel::Notice) {
3084  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_char_common:"
3085  " Map is currently not supported\n"));
3086  }
3087  good = false;
3088  break;
3089  default:
3090  good = false;
3091  break;
3092  }
3093 
3094  if (!good && log_level >= LogLevel::Notice) {
3095  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_char_common::"
3096  " Failed to read a value of type %C from a DynamicData object of type %C\n",
3097  typekind_to_string(CharKind), typekind_to_string(tk)));
3098  }
3099  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
3100 }
3101 
3103 {
3104  return get_char_common<TK_CHAR8, TK_STRING8, ACE_OutputCDR::from_char>(value, id);
3105 }
3106 
3108 {
3109 #ifdef DDS_HAS_WCHAR
3110  return get_char_common<TK_CHAR16, TK_STRING16, ACE_OutputCDR::from_wchar>(value, id);
3111 #else
3112  return DDS::RETCODE_UNSUPPORTED;
3113 #endif
3114 }
3115 
3117 {
3118  ACE_OutputCDR::from_octet from_octet(0);
3119  const DDS::ReturnCode_t rc = get_single_value<TK_BYTE>(from_octet, id);
3120  if (rc == DDS::RETCODE_OK) {
3121  value = from_octet.val_;
3122  }
3123  return rc;
3124 }
3125 
3126 template<typename UIntType>
3128 {
3129  UIntType bitmask;
3130  if (!read_basic_value(bitmask)) {
3131  return false;
3132  }
3133  value = (1ULL << index) & bitmask;
3134  return true;
3135 }
3136 
3137 template<>
3138 bool DynamicDataImpl::get_boolean_from_bitmask<CORBA::UInt8>(CORBA::ULong index, CORBA::Boolean& value)
3139 {
3140  ACE_OutputCDR::from_int8 bitmask(0);
3141  if (!read_basic_value(bitmask)) {
3142  return false;
3143  }
3144  value = ((1 << index) & bitmask.val_) ? true : false;
3145  return true;
3146 }
3147 
3149 {
3150  const TypeKind tk = type_->get_kind();
3151  bool good = true;
3152  switch (tk) {
3153  case TK_BOOLEAN: {
3154  if (id != MEMBER_ID_INVALID) {
3155  good = false;
3156  break;
3157  }
3158  DataContainer::const_single_iterator it = container_.single_map_.find(id);
3159  if (it != container_.single_map_.end()) {
3160  ACE_OutputCDR::from_boolean from_bool = it->second.get<ACE_OutputCDR::from_boolean>();
3161  value = from_bool.val_;
3162  } else {
3163  ACE_OutputCDR::from_boolean from_bool(false);
3165  value = from_bool.val_;
3166  }
3167  break;
3168  }
3169  case TK_BITMASK: {
3170  const LBound bitbound = type_desc_->bound()[0];
3171  ACE_CDR::ULong index;
3172  if (!get_index_from_id(id, index, bitbound)) {
3173  good = false;
3174  break;
3175  }
3176  if (bitbound >= 1 && bitbound <= 8) {
3177  good = get_boolean_from_bitmask<CORBA::UInt8>(index, value);
3178  } else if (bitbound >= 9 && bitbound <= 16) {
3179  good = get_boolean_from_bitmask<CORBA::UShort>(index, value);
3180  } else if (bitbound >= 17 && bitbound <= 32) {
3181  good = get_boolean_from_bitmask<CORBA::ULong>(index, value);
3182  } else {
3183  good = get_boolean_from_bitmask<CORBA::ULongLong>(index, value);
3184  }
3185  break;
3186  }
3187  case TK_STRUCTURE: {
3188  ACE_OutputCDR::from_boolean from_bool(false);
3189  good = get_value_from_struct<TK_BOOLEAN>(from_bool, id);
3190  if (good) {
3191  value = from_bool.val_;
3192  }
3193  break;
3194  }
3195  case TK_UNION: {
3196  ACE_OutputCDR::from_boolean from_bool(false);
3197  good = get_value_from_union<TK_BOOLEAN>(from_bool, id);
3198  if (good) {
3199  value = from_bool.val_;
3200  }
3201  break;
3202  }
3203  case TK_SEQUENCE:
3204  case TK_ARRAY: {
3205  ACE_OutputCDR::from_boolean from_bool(false);
3206  good = get_value_from_collection<TK_BOOLEAN>(from_bool, id);
3207  if (good) {
3208  value = from_bool.val_;
3209  }
3210  break;
3211  }
3212  case TK_MAP:
3213  if (log_level >= LogLevel::Notice) {
3214  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_boolean_value:"
3215  " Map is currently not supported\n"));
3216  }
3217  good = false;
3218  break;
3219  default:
3220  good = false;
3221  break;
3222  }
3223 
3224  if (!good && log_level >= LogLevel::Notice) {
3225  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_boolean_value:"
3226  " Failed to read a boolean value from a DynamicData object of type %C\n",
3227  typekind_to_string(tk)));
3228  }
3229  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
3230 }
3231 
3233 {
3234  if (enum_string_helper(value, id)) {
3235  return DDS::RETCODE_OK;
3236  }
3237 
3238  return get_single_value<TK_STRING8>(value, id);
3239 }
3240 
3242 {
3243 #ifdef DDS_HAS_WCHAR
3244  return get_single_value<TK_STRING16>(value, id);
3245 #else
3246  return DDS::RETCODE_UNSUPPORTED;
3247 #endif
3248 }
3249 
3250 bool DynamicDataImpl::move_single_to_complex(const DataContainer::const_single_iterator& it,
3251  DynamicDataImpl* data)
3252 {
3253  DDS::DynamicType_var member_type = data->type();
3254  const TypeKind member_tk = member_type->get_kind();
3255  TypeKind treat_as = member_tk;
3256  if (member_tk == TK_ENUM) {
3257  if (enum_bound(member_type, treat_as) != DDS::RETCODE_OK) {
3258  return false;
3259  }
3260  }
3261  return move_single_to_complex_i(it, data, treat_as);
3262 }
3263 
3264 bool DynamicDataImpl::move_single_to_complex_i(const DataContainer::const_single_iterator& it,
3265  DynamicDataImpl* data, const TypeKind treat_as)
3266 {
3267  switch (treat_as) {
3268  case TK_INT8: {
3269  const ACE_OutputCDR::from_int8& value = it->second.get<ACE_OutputCDR::from_int8>();
3270  data->insert_single(MEMBER_ID_INVALID, value);
3271  break;
3272  }
3273  case TK_UINT8: {
3274  const ACE_OutputCDR::from_uint8& value = it->second.get<ACE_OutputCDR::from_uint8>();
3275  data->insert_single(MEMBER_ID_INVALID, value);
3276  break;
3277  }
3278  case TK_INT16: {
3279  const CORBA::Short value = it->second.get<CORBA::Short>();
3280  data->insert_single(MEMBER_ID_INVALID, value);
3281  break;
3282  }
3283  case TK_UINT16: {
3284  const CORBA::UShort value = it->second.get<CORBA::UShort>();
3285  data->insert_single(MEMBER_ID_INVALID, value);
3286  break;
3287  }
3288  case TK_INT32: {
3289  const CORBA::Long value = it->second.get<CORBA::Long>();
3290  data->insert_single(MEMBER_ID_INVALID, value);
3291  break;
3292  }
3293  case TK_UINT32: {
3294  const CORBA::ULong value = it->second.get<CORBA::ULong>();
3295  data->insert_single(MEMBER_ID_INVALID, value);
3296  break;
3297  }
3298  case TK_INT64: {
3299  const CORBA::LongLong value = it->second.get<CORBA::LongLong>();
3300  data->insert_single(MEMBER_ID_INVALID, value);
3301  break;
3302  }
3303  case TK_UINT64: {
3304  const CORBA::ULongLong value = it->second.get<CORBA::ULongLong>();
3305  data->insert_single(MEMBER_ID_INVALID, value);
3306  break;
3307  }
3308  case TK_FLOAT32: {
3309  const CORBA::Float value = it->second.get<CORBA::Float>();
3310  data->insert_single(MEMBER_ID_INVALID, value);
3311  break;
3312  }
3313  case TK_FLOAT64: {
3314  const CORBA::Double value = it->second.get<CORBA::Double>();
3315  data->insert_single(MEMBER_ID_INVALID, value);
3316  break;
3317  }
3318  case TK_FLOAT128: {
3319  const CORBA::LongDouble value = it->second.get<CORBA::LongDouble>();
3320  data->insert_single(MEMBER_ID_INVALID, value);
3321  break;
3322  }
3323  case TK_CHAR8: {
3324  const ACE_OutputCDR::from_char& value = it->second.get<ACE_OutputCDR::from_char>();
3325  data->insert_single(MEMBER_ID_INVALID, value);
3326  break;
3327  }
3328 #ifdef DDS_HAS_WCHAR
3329  case TK_CHAR16: {
3330  const ACE_OutputCDR::from_wchar& value = it->second.get<ACE_OutputCDR::from_wchar>();
3331  data->insert_single(MEMBER_ID_INVALID, value);
3332  break;
3333  }
3334 #endif
3335  case TK_BYTE: {
3336  const ACE_OutputCDR::from_octet& value = it->second.get<ACE_OutputCDR::from_octet>();
3337  data->insert_single(MEMBER_ID_INVALID, value);
3338  break;
3339  }
3340  case TK_BOOLEAN: {
3341  const ACE_OutputCDR::from_boolean& value = it->second.get<ACE_OutputCDR::from_boolean>();
3342  data->insert_single(MEMBER_ID_INVALID, value);
3343  break;
3344  }
3345  case TK_STRING8: {
3346  const char* str = it->second.get<const char*>();
3347  const size_t len = ACE_OS::strlen(str);
3348  for (CORBA::ULong i = 0; i < len; ++i) {
3349  data->insert_single(i, ACE_OutputCDR::from_char(str[i]));
3350  }
3351  break;
3352  }
3353 #ifdef DDS_HAS_WCHAR
3354  case TK_STRING16: {
3355  const CORBA::WChar* wstr = it->second.get<const CORBA::WChar*>();
3356  const size_t len = ACE_OS::strlen(wstr);
3357  for (CORBA::ULong i = 0; i < len; ++i) {
3358  data->insert_single(i, ACE_OutputCDR::from_wchar(wstr[i]));
3359  }
3360  break;
3361  }
3362 #endif
3363  default:
3364  return false;
3365  }
3366  return true;
3367 }
3368 
3369 template<typename SequenceType>
3370 void DynamicDataImpl::move_sequence_helper(const DataContainer::const_sequence_iterator& it,
3371  DynamicDataImpl* data)
3372 {
3373  const SequenceType& values = it->second.get<SequenceType>();
3374  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3375  data->insert_single(i, values[i]);
3376  }
3377 }
3378 
3379 // Get the inner C-string explicitly
3380 template<>
3381 void DynamicDataImpl::move_sequence_helper<DDS::StringSeq>(const DataContainer::const_sequence_iterator& it,
3382  DynamicDataImpl* data)
3383 {
3384  const DDS::StringSeq& values = it->second.get<DDS::StringSeq>();
3385  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3386  data->insert_single(i, values[i].in());
3387  }
3388 }
3389 
3390 #ifdef DDS_HAS_WCHAR
3391 template<>
3392 void DynamicDataImpl::move_sequence_helper<DDS::WstringSeq>(const DataContainer::const_sequence_iterator& it,
3393  DynamicDataImpl* data)
3394 {
3395  const DDS::WstringSeq& values = it->second.get<DDS::WstringSeq>();
3396  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3397  data->insert_single(i, values[i].in());
3398  }
3399 }
3400 #endif
3401 
3402 template<>
3403 void DynamicDataImpl::move_sequence_helper<DDS::Int8Seq>(const DataContainer::const_sequence_iterator& it,
3404  DynamicDataImpl* data)
3405 {
3406  const DDS::Int8Seq& values = it->second.get<DDS::Int8Seq>();
3407  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3408  data->insert_single(i, ACE_OutputCDR::from_int8(values[i]));
3409  }
3410 }
3411 
3412 template<>
3413 void DynamicDataImpl::move_sequence_helper<DDS::UInt8Seq>(const DataContainer::const_sequence_iterator& it,
3414  DynamicDataImpl* data)
3415 {
3416  const DDS::UInt8Seq& values = it->second.get<DDS::UInt8Seq>();
3417  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3418  data->insert_single(i, ACE_OutputCDR::from_uint8(values[i]));
3419  }
3420 }
3421 
3422 template<>
3423 void DynamicDataImpl::move_sequence_helper<DDS::CharSeq>(const DataContainer::const_sequence_iterator& it,
3424  DynamicDataImpl* data)
3425 {
3426  const DDS::CharSeq& values = it->second.get<DDS::CharSeq>();
3427  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3428  data->insert_single(i, ACE_OutputCDR::from_char(values[i]));
3429  }
3430 }
3431 
3432 template<>
3433 void DynamicDataImpl::move_sequence_helper<DDS::ByteSeq>(const DataContainer::const_sequence_iterator& it,
3434  DynamicDataImpl* data)
3435 {
3436  const DDS::ByteSeq& values = it->second.get<DDS::ByteSeq>();
3437  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3438  data->insert_single(i, ACE_OutputCDR::from_octet(values[i]));
3439  }
3440 }
3441 
3442 template<>
3443 void DynamicDataImpl::move_sequence_helper<DDS::BooleanSeq>(const DataContainer::const_sequence_iterator& it,
3444  DynamicDataImpl* data)
3445 {
3446  const DDS::BooleanSeq& values = it->second.get<DDS::BooleanSeq>();
3447  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3448  data->insert_single(i, ACE_OutputCDR::from_boolean(values[i]));
3449  }
3450 }
3451 
3452 #ifdef DDS_HAS_WCHAR
3453 template<>
3454 void DynamicDataImpl::move_sequence_helper<DDS::WcharSeq>(const DataContainer::const_sequence_iterator& it,
3455  DynamicDataImpl* data)
3456 {
3457  const DDS::WcharSeq& values = it->second.get<DDS::WcharSeq>();
3458  for (CORBA::ULong i = 0; i < values.length(); ++i) {
3459  data->insert_single(i, ACE_OutputCDR::from_wchar(values[i]));
3460  }
3461 }
3462 #endif
3463 
3464 bool DynamicDataImpl::move_sequence_to_complex(const DataContainer::const_sequence_iterator& it,
3465  DynamicDataImpl* data)
3466 {
3467  DDS::DynamicType_var seq_type = data->type();
3468  DDS::TypeDescriptor_var seq_td;
3469  if (seq_type->get_descriptor(seq_td) != DDS::RETCODE_OK) {
3470  return false;
3471  }
3472  DDS::DynamicType_var elem_type = get_base_type(seq_td->element_type());
3473 
3474  switch (elem_type->get_kind()) {
3475  case TK_INT8: {
3476  move_sequence_helper<DDS::Int8Seq>(it, data);
3477  break;
3478  }
3479  case TK_UINT8: {
3480  move_sequence_helper<DDS::UInt8Seq>(it, data);
3481  break;
3482  }
3483  case TK_INT16: {
3484  move_sequence_helper<DDS::Int16Seq>(it, data);
3485  break;
3486  }
3487  case TK_UINT16: {
3488  move_sequence_helper<DDS::UInt16Seq>(it, data);
3489  break;
3490  }
3491  case TK_INT32: {
3492  move_sequence_helper<DDS::Int32Seq>(it, data);
3493  break;
3494  }
3495  case TK_UINT32: {
3496  move_sequence_helper<DDS::UInt32Seq>(it, data);
3497  break;
3498  }
3499  case TK_INT64: {
3500  move_sequence_helper<DDS::Int64Seq>(it, data);
3501  break;
3502  }
3503  case TK_UINT64: {
3504  move_sequence_helper<DDS::UInt64Seq>(it, data);
3505  break;
3506  }
3507  case TK_FLOAT32: {
3508  move_sequence_helper<DDS::Float32Seq>(it, data);
3509  break;
3510  }
3511  case TK_FLOAT64: {
3512  move_sequence_helper<DDS::Float64Seq>(it, data);
3513  break;
3514  }
3515  case TK_FLOAT128: {
3516  move_sequence_helper<DDS::Float128Seq>(it, data);
3517  break;
3518  }
3519  case TK_CHAR8: {
3520  move_sequence_helper<DDS::CharSeq>(it, data);
3521  break;
3522  }
3523 #ifdef DDS_HAS_WCHAR
3524  case TK_CHAR16: {
3525  move_sequence_helper<DDS::WcharSeq>(it, data);
3526  break;
3527  }
3528 #endif
3529  case TK_BYTE: {
3530  move_sequence_helper<DDS::ByteSeq>(it, data);
3531  break;
3532  }
3533  case TK_BOOLEAN: {
3534  move_sequence_helper<DDS::BooleanSeq>(it, data);
3535  break;
3536  }
3537  case TK_STRING8: {
3538  move_sequence_helper<DDS::StringSeq>(it, data);
3539  break;
3540  }
3541 #ifdef DDS_HAS_WCHAR
3542  case TK_STRING16: {
3543  move_sequence_helper<DDS::WstringSeq>(it, data);
3544  break;
3545  }
3546 #endif
3547  default:
3548  return false;
3549  }
3550  return true;
3551 }
3552 
3554  FoundStatus& found_status)
3555 {
3556  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
3557  if (complex_it != container_.complex_map_.end()) {
3558  value = DDS::DynamicData::_duplicate(complex_it->second);
3559  found_status = FOUND_IN_COMPLEX_MAP;
3560  return true;
3561  }
3562 
3563  DDS::DynamicTypeMember_var dtm;
3564  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
3565  return false;
3566  }
3567  DDS::MemberDescriptor_var md;
3568  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
3569  return false;
3570  }
3571  DDS::DynamicType_var member_type = get_base_type(md->type());
3572  DynamicDataImpl* dd_impl = new DynamicDataImpl(member_type);
3573  DDS::DynamicData_var dd_var = dd_impl;
3574 
3575  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
3576  if (single_it != container_.single_map_.end()) {
3577  if (!move_single_to_complex(single_it, dd_impl)) {
3578  return false;
3579  }
3580  found_status = FOUND_IN_NON_COMPLEX_MAP;
3581  } else {
3582  DataContainer::const_sequence_iterator sequence_it = container_.sequence_map_.find(id);
3583  if (sequence_it != container_.sequence_map_.end()) {
3584  if (!move_sequence_to_complex(sequence_it, dd_impl)) {
3585  return false;
3586  }
3587  found_status = FOUND_IN_NON_COMPLEX_MAP;
3588  } else {
3589  found_status = NOT_FOUND;
3590  }
3591  }
3592  value = dd_var;
3593  return true;
3594 }
3595 
3596 bool DynamicDataImpl::get_complex_from_struct(DDS::DynamicData_ptr& value, DDS::MemberId id)
3597 {
3598  FoundStatus found_status = NOT_FOUND;
3599  DDS::DynamicData_var dd_var;
3600  if (!get_complex_from_aggregated(dd_var, id, found_status)) {
3601  return false;
3602  }
3603 
3604  if (found_status == FOUND_IN_NON_COMPLEX_MAP || found_status == NOT_FOUND) {
3605  insert_complex(id, dd_var);
3606  }
3607  CORBA::release(value);
3608  value = DDS::DynamicData::_duplicate(dd_var);
3609  return true;
3610 }
3611 
3613 {
3614  switch (treat_as) {
3615  case TK_BOOLEAN:
3617  case TK_BYTE:
3619  case TK_CHAR8:
3621 #ifdef DDS_HAS_WCHAR
3622  case TK_CHAR16:
3624 #endif
3625  case TK_INT8:
3627  case TK_UINT8:
3629  case TK_INT16:
3630  return insert_single(MEMBER_ID_INVALID, static_cast<CORBA::Short>(value));
3631  case TK_UINT16:
3632  return insert_single(MEMBER_ID_INVALID, static_cast<CORBA::UShort>(value));
3633  case TK_INT32:
3634  return insert_single(MEMBER_ID_INVALID, value);
3635  case TK_UINT32:
3636  return insert_single(MEMBER_ID_INVALID, static_cast<CORBA::ULong>(value));
3637  case TK_INT64:
3638  return insert_single(MEMBER_ID_INVALID, static_cast<CORBA::LongLong>(value));
3639  case TK_UINT64:
3640  return insert_single(MEMBER_ID_INVALID, static_cast<CORBA::ULongLong>(value));
3641  default:
3642  return false;
3643  }
3644 }
3645 
3646 // Write value to discriminator represented by a DynamicData instance.
3648 {
3649  TypeKind treat_as = type_->get_kind();
3650  if (treat_as == TK_ENUM) {
3651  if (enum_bound(type_, treat_as) != DDS::RETCODE_OK) {
3652  return false;
3653  }
3654  }
3655  return write_discriminator_helper(value, treat_as);
3656 }
3657 
3658 bool DynamicDataImpl::get_complex_from_union(DDS::DynamicData_ptr& value, DDS::MemberId id)
3659 {
3660  FoundStatus found_status = NOT_FOUND;
3661  DDS::DynamicData_var dd_var;
3662  if (!get_complex_from_aggregated(dd_var, id, found_status)) {
3663  return false;
3664  }
3665  if (found_status != NOT_FOUND) {
3666  if (found_status == FOUND_IN_NON_COMPLEX_MAP) {
3667  insert_complex(id, dd_var);
3668  }
3669  CORBA::release(value);
3670  value = DDS::DynamicData::_duplicate(dd_var);
3671  return true;
3672  }
3673 
3674  // Requested member with the given Id is not present in the container.
3675  if (id == DISCRIMINATOR_ID) {
3676  DDS::DynamicType_var disc_type = get_base_type(type_desc_->discriminator_type());
3677  CORBA::Long disc_value;
3678  if (!container_.set_default_discriminator_value(disc_value, disc_type)) {
3679  return false;
3680  }
3681  bool found_selected_member = false;
3682  DDS::MemberDescriptor_var selected_md;
3683  const DDS::ReturnCode_t rc =
3684  get_selected_union_branch(disc_value, found_selected_member, selected_md);
3685  if (rc != DDS::RETCODE_OK) {
3686  if (log_level >= LogLevel::Notice) {
3687  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_complex_from_union:"
3688  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
3689  }
3690  return false;
3691  }
3692  DynamicDataImpl* dd_impl = new DynamicDataImpl(disc_type);
3693  DDS::DynamicData_var dd_var = dd_impl;
3694  dd_impl->write_discriminator(disc_value);
3696  if (found_selected_member && !selected_md->is_optional()) {
3697  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
3698  if (clear_value_i(selected_md->id(), selected_type) != DDS::RETCODE_OK) {
3699  return false;
3700  }
3701  }
3702  CORBA::release(value);
3703  value = DDS::DynamicData::_duplicate(dd_var);
3704  } else {
3705  DataContainer::const_single_iterator single_it = container_.single_map_.find(DISCRIMINATOR_ID);
3706  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(DISCRIMINATOR_ID);
3707  const bool has_disc = single_it != container_.single_map_.end() ||
3708  complex_it != container_.complex_map_.end();
3709  if (has_disc) {
3710  if (log_level >= LogLevel::Notice) {
3711  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_complex_from_union:"
3712  " Branch Id %u is not the active branch in the union\n", id));
3713  }
3714  return false;
3715  }
3716  DDS::DynamicTypeMember_var dtm;
3717  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
3718  return false;
3719  }
3720  DDS::MemberDescriptor_var md;
3721  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
3722  return false;
3723  }
3724  // An empty DynamicData object implicitly contains default value of the associated type.
3725  DynamicDataImpl* dd_impl = new DynamicDataImpl(md->type());
3726  DDS::DynamicData_var dd_var = dd_impl;
3727  if (!insert_valid_discriminator(md)) {
3728  return false;
3729  }
3730  insert_complex(id, dd_var);
3731  CORBA::release(value);
3732  value = DDS::DynamicData::_duplicate(dd_var);
3733  }
3734  return true;
3735 }
3736 
3738 {
3739  DataContainer::const_complex_iterator complex_it = container_.complex_map_.find(id);
3740  if (complex_it != container_.complex_map_.end()) {
3741  CORBA::release(value);
3742  value = DDS::DynamicData::_duplicate(complex_it->second);
3743  return true;
3744  }
3745 
3746  if (type_->get_kind() == TK_ARRAY && id >= bound_total(type_desc_)) {
3747  return false;
3748  }
3749 
3750  DynamicDataImpl* dd_impl = new DynamicDataImpl(type_desc_->element_type());
3751  DDS::DynamicData_var dd_var = dd_impl;
3752 
3753  DataContainer::const_single_iterator single_it = container_.single_map_.find(id);
3754  if (single_it != container_.single_map_.end()) {
3755  if (!move_single_to_complex(single_it, dd_impl)) {
3756  return false;
3757  }
3758  } else {
3759  DataContainer::const_sequence_iterator sequence_it = container_.sequence_map_.find(id);
3760  if (sequence_it != container_.sequence_map_.end()) {
3761  if (!move_sequence_to_complex(sequence_it, dd_impl)) {
3762  return false;
3763  }
3764  }
3765  }
3766  insert_complex(id, dd_var);
3767  CORBA::release(value);
3768  value = DDS::DynamicData::_duplicate(dd_var);
3769  return true;
3770 }
3771 
3773 {
3774  const TypeKind tk = type_->get_kind();
3775  bool good = true;
3776  switch (tk) {
3777  case TK_STRUCTURE:
3778  good = get_complex_from_struct(value, id);
3779  break;
3780  case TK_UNION:
3781  good = get_complex_from_union(value, id);
3782  break;
3783  case TK_SEQUENCE:
3784  case TK_ARRAY:
3785  good = get_complex_from_collection(value, id);
3786  break;
3787  case TK_MAP:
3788  if (log_level >= LogLevel::Notice) {
3789  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_complex_value:"
3790  " Map is currently not supported\n"));
3791  }
3792  good = false;
3793  break;
3794  default:
3795  good = false;
3796  break;
3797  }
3798 
3799  if (!good && log_level >= LogLevel::Notice) {
3800  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::get_complex_value:"
3801  " Failed to read a complex value from a DynamicData object of type %C\n",
3802  typekind_to_string(tk)));
3803  }
3804  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
3805 }
3806 
3808 {
3809  ACE_UNUSED_ARG(value);
3810  ACE_UNUSED_ARG(id);
3811  return DDS::RETCODE_UNSUPPORTED;
3812 }
3813 
3815 {
3816  ACE_UNUSED_ARG(value);
3817  ACE_UNUSED_ARG(id);
3818  return DDS::RETCODE_UNSUPPORTED;
3819 }
3820 
3822 {
3823  ACE_UNUSED_ARG(value);
3824  ACE_UNUSED_ARG(id);
3825  return DDS::RETCODE_UNSUPPORTED;
3826 }
3827 
3829 {
3830  ACE_UNUSED_ARG(value);
3831  ACE_UNUSED_ARG(id);
3832  return DDS::RETCODE_UNSUPPORTED;
3833 }
3834 
3836 {
3837  ACE_UNUSED_ARG(value);
3838  ACE_UNUSED_ARG(id);
3839  return DDS::RETCODE_UNSUPPORTED;
3840 }
3841 
3843 {
3844  ACE_UNUSED_ARG(value);
3845  ACE_UNUSED_ARG(id);
3846  return DDS::RETCODE_UNSUPPORTED;
3847 }
3848 
3850 {
3851  ACE_UNUSED_ARG(value);
3852  ACE_UNUSED_ARG(id);
3853  return DDS::RETCODE_UNSUPPORTED;
3854 }
3855 
3857 {
3858  ACE_UNUSED_ARG(value);
3859  ACE_UNUSED_ARG(id);
3860  return DDS::RETCODE_UNSUPPORTED;
3861 }
3862 
3864 {
3865  ACE_UNUSED_ARG(value);
3866  ACE_UNUSED_ARG(id);
3867  return DDS::RETCODE_UNSUPPORTED;
3868 }
3869 
3871 {
3872  ACE_UNUSED_ARG(value);
3873  ACE_UNUSED_ARG(id);
3874  return DDS::RETCODE_UNSUPPORTED;
3875 }
3876 
3878 {
3879  ACE_UNUSED_ARG(value);
3880  ACE_UNUSED_ARG(id);
3881  return DDS::RETCODE_UNSUPPORTED;
3882 }
3883 
3885 {
3886  ACE_UNUSED_ARG(value);
3887  ACE_UNUSED_ARG(id);
3888  return DDS::RETCODE_UNSUPPORTED;
3889 }
3890 
3892 {
3893  ACE_UNUSED_ARG(value);
3894  ACE_UNUSED_ARG(id);
3895  return DDS::RETCODE_UNSUPPORTED;
3896 }
3897 
3899 {
3900  ACE_UNUSED_ARG(value);
3901  ACE_UNUSED_ARG(id);
3902  return DDS::RETCODE_UNSUPPORTED;
3903 }
3904 
3906 {
3907  ACE_UNUSED_ARG(value);
3908  ACE_UNUSED_ARG(id);
3909  return DDS::RETCODE_UNSUPPORTED;
3910 }
3911 
3913 {
3914  ACE_UNUSED_ARG(value);
3915  ACE_UNUSED_ARG(id);
3916  return DDS::RETCODE_UNSUPPORTED;
3917 }
3918 
3920 {
3921  ACE_UNUSED_ARG(value);
3922  ACE_UNUSED_ARG(id);
3923  return DDS::RETCODE_UNSUPPORTED;
3924 }
3925 
3927 {
3928  single_map_.clear();
3929  complex_map_.clear();
3930  sequence_map_.clear();
3931 }
3932 
3933 // Get largest index among elements of a sequence-like type written to the single map.
3935 {
3936  OPENDDS_ASSERT(is_sequence_like(type_->get_kind()));
3937  const DDS::UInt32 bound = bound_total(type_desc_);
3938 
3939  // Since ID is used as index in this implementation, the last element has largest index.
3940  // A different implementation (ID-to-index mapping) may need to iterate through all
3941  // stored elements to find the one with the largest index.
3942  return data_->get_index_from_id(single_map_.rbegin()->first, largest_index, bound);
3943 }
3944 
3945 // Get largest index among elements of a nesting sequence type written to the sequence map.
3947 {
3948  OPENDDS_ASSERT(type_->get_kind() == TK_SEQUENCE);
3949  const CORBA::ULong bound = type_desc_->bound()[0];
3950  return data_->get_index_from_id(sequence_map_.rbegin()->first, largest_index, bound);
3951 }
3952 
3953 // Get largest index among elements of a sequence-like type written to the complex map.
3955 {
3956  OPENDDS_ASSERT(is_sequence_like(type_->get_kind()));
3957  const DDS::UInt32 bound = bound_total(type_desc_);
3958  return data_->get_index_from_id(complex_map_.rbegin()->first, largest_index, bound);
3959 }
3960 
3962 {
3963  largest_index = 0;
3964  if (!single_map_.empty() && !get_largest_single_index(largest_index)) {
3965  return false;
3966  }
3967  if (!complex_map_.empty()) {
3968  CORBA::ULong index;
3969  if (!get_largest_complex_index(index)) {
3970  return false;
3971  }
3972  largest_index = std::max(index, largest_index);
3973  }
3974  return true;
3975 }
3976 
3978 {
3979  largest_index = 0;
3980  if (!sequence_map_.empty() && !get_largest_sequence_index(largest_index)) {
3981  return false;
3982  }
3983  if (!complex_map_.empty()) {
3984  CORBA::ULong index;
3985  if (!get_largest_complex_index(index)) {
3986  return false;
3987  }
3988  largest_index = std::max(index, largest_index);
3989  }
3990  return true;
3991 }
3992 
3994  const SingleValue& sv) const
3995 {
3996  switch (sv.kind_) {
3997  case TK_INT32:
3998  return ser << sv.get<CORBA::Long>();
3999  case TK_UINT32:
4000  return ser << sv.get<CORBA::ULong>();
4001  case TK_INT8:
4002  return ser << sv.get<ACE_OutputCDR::from_int8>();
4003  case TK_UINT8:
4004  return ser << sv.get<ACE_OutputCDR::from_uint8>();
4005  case TK_INT16:
4006  return ser << sv.get<CORBA::Short>();
4007  case TK_UINT16:
4008  return ser << sv.get<CORBA::UShort>();
4009  case TK_INT64:
4010  return ser << sv.get<CORBA::LongLong>();
4011  case TK_UINT64:
4012  return ser << sv.get<CORBA::ULongLong>();
4013  case TK_FLOAT32:
4014  return ser << sv.get<CORBA::Float>();
4015  case TK_FLOAT64:
4016  return ser << sv.get<CORBA::Double>();
4017  case TK_FLOAT128:
4018  return ser << sv.get<CORBA::LongDouble>();
4019  case TK_CHAR8:
4020  return ser << sv.get<ACE_OutputCDR::from_char>();
4021  case TK_BYTE:
4022  return ser << sv.get<ACE_OutputCDR::from_octet>();
4023  case TK_BOOLEAN:
4024  return ser << sv.get<ACE_OutputCDR::from_boolean>();
4025  case TK_STRING8:
4026  return ser << sv.get<const char*>();
4027 #ifdef DDS_HAS_WCHAR
4028  case TK_CHAR16:
4029  return ser << sv.get<ACE_OutputCDR::from_wchar>();
4030  case TK_STRING16:
4031  return ser << sv.get<const CORBA::WChar*>();
4032 #endif
4033  default:
4034  return false;
4035  }
4036 }
4037 
4038 template<typename PrimitiveType>
4040  PrimitiveType default_value) const
4041 {
4042  const_single_iterator it = single_map_.find(MEMBER_ID_INVALID);
4043  if (it != single_map_.end()) {
4044  return serialize_single_value(ser, it->second);
4045  }
4046 
4047  // No data stored. Use default value.
4048  set_default_basic_value(default_value);
4049  return ser << default_value;
4050 }
4051 
4053  size_t& size, const DDS::DynamicType_var& enum_type) const
4054 {
4055  DDS::TypeDescriptor_var enum_td;
4056  if (enum_type->get_descriptor(enum_td) != DDS::RETCODE_OK) {
4057  return false;
4058  }
4059  const CORBA::ULong bit_bound = enum_td->bound()[0];
4060  if (bit_bound >= 1 && bit_bound <= 8) {
4061  primitive_serialized_size_int8(encoding, size);
4062  return true;
4063  } else if (bit_bound >= 9 && bit_bound <= 16) {
4064  return primitive_serialized_size(encoding, size, CORBA::Short());
4065  } else if (bit_bound >= 17 && bit_bound <= 32) {
4066  return primitive_serialized_size(encoding, size, CORBA::Long());
4067  }
4068  return false;
4069 }
4070 
4072  const DDS::DynamicType_var& enum_type) const
4073 {
4074  // The first enumerator is used as the enum's default value (Table 9).
4075  DDS::DynamicTypeMember_var first_dtm;
4076  if (enum_type->get_member_by_index(first_dtm, 0) != DDS::RETCODE_OK) {
4077  return false;
4078  }
4079  DDS::MemberDescriptor_var first_md;
4080  if (first_dtm->get_descriptor(first_md) != DDS::RETCODE_OK) {
4081  return false;
4082  }
4083  DDS::TypeDescriptor_var descriptor;
4084  if (enum_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
4085  return false;
4086  }
4087  const CORBA::ULong bit_bound = descriptor->bound()[0];
4088 
4089  if (bit_bound >= 1 && bit_bound <= 8) {
4090  return ser << static_cast<CORBA::Int8>(first_md->id());
4091  } else if (bit_bound >= 9 && bit_bound <= 16) {
4092  return ser << static_cast<CORBA::Short>(first_md->id());
4093  } else if (bit_bound >= 17 && bit_bound <= 32) {
4094  return ser << static_cast<CORBA::Long>(first_md->id());
4095  }
4096  return false;
4097 }
4098 
4100 {
4101  const_single_iterator it = single_map_.find(MEMBER_ID_INVALID);
4102  if (it != single_map_.end()) {
4103  return serialize_single_value(ser, it->second);
4104  }
4105  return serialize_enum_default_value(ser, type_);
4106 }
4107 
4109  size_t& size, const DDS::DynamicType_var& bitmask_type) const
4110 {
4111  DDS::TypeDescriptor_var bitmask_td;
4112  if (bitmask_type->get_descriptor(bitmask_td) != DDS::RETCODE_OK) {
4113  return false;
4114  }
4115  const CORBA::ULong bit_bound = bitmask_td->bound()[0];
4116  if (bit_bound >= 1 && bit_bound <= 8) {
4117  primitive_serialized_size_uint8(encoding, size);
4118  return true;
4119  } else if (bit_bound >= 9 && bit_bound <= 16) {
4120  return primitive_serialized_size(encoding, size, CORBA::UShort());
4121  } else if (bit_bound >= 17 && bit_bound <= 32) {
4122  return primitive_serialized_size(encoding, size, CORBA::ULong());
4123  } else if (bit_bound >= 33 && bit_bound <= 64) {
4124  return primitive_serialized_size(encoding, size, CORBA::ULongLong());
4125  }
4126  return false;
4127 }
4128 
4130  const DDS::DynamicType_var& bitmask_type) const
4131 {
4132  DDS::TypeDescriptor_var descriptor;
4133  if (bitmask_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
4134  return false;
4135  }
4136  const CORBA::ULong bit_bound = descriptor->bound()[0];
4137 
4138  // Table 9 doesn't mention default value for bitmask. Use 0 as default here.
4139  if (bit_bound >= 1 && bit_bound <= 8) {
4140  return ser << static_cast<CORBA::UInt8>(0);
4141  } else if (bit_bound >= 9 && bit_bound <= 16) {
4142  return ser << static_cast<CORBA::UShort>(0);
4143  } else if (bit_bound >= 17 && bit_bound <= 32) {
4144  return ser << static_cast<CORBA::ULong>(0);
4145  } else if (bit_bound >= 33 && bit_bound <= 64) {
4146  return ser << static_cast<CORBA::ULongLong>(0);
4147  }
4148  return false;
4149 }
4150 
4152 {
4153  const_single_iterator it = single_map_.find(MEMBER_ID_INVALID);
4154  if (it != single_map_.end()) {
4155  return serialize_single_value(ser, it->second);
4156  }
4157  return serialize_bitmask_default_value(ser, type_);
4158 }
4159 
4161 {
4162  const CORBA::ULong bound = type_desc_->bound()[0];
4163  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4164  CORBA::ULong index;
4165  if (!data_->get_index_from_id(it->first, index, bound)) {
4166  return false;
4167  }
4168  str[index] = it->second.get<ACE_OutputCDR::from_char>().val_;
4169  }
4170  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4171  CORBA::ULong index;
4172  if (!data_->get_index_from_id(it->first, index, bound)) {
4173  return false;
4174  }
4175  // The DynamicData object for this character may not contain any data.
4176  // Use default value for character if it is the case.
4177  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4178  if (!elem_dd) {
4179  return false;
4180  }
4181  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4182  if (elem_it != elem_dd->container_.single_map_.end()) {
4183  str[index] = elem_it->second.get<ACE_OutputCDR::from_char>().val_;
4184  } else {
4185  ACE_OutputCDR::from_char from_char('\0');
4186  set_default_basic_value(from_char);
4187  str[index] = from_char.val_;
4188  }
4189  }
4190  return true;
4191 }
4192 
4194  size_t& size) const
4195 {
4196  const bool is_empty = single_map_.empty() && complex_map_.empty();
4197  if (!is_empty) {
4198  CORBA::ULong largest_index;
4199  if (!get_largest_index_basic(largest_index)) {
4200  return false;
4201  }
4202  primitive_serialized_size_ulong(encoding, size);
4203  size += largest_index + 2; // Include null
4204  } else {
4205  // Use default value for string, i.e., empty string.
4206  primitive_serialized_size_ulong(encoding, size);
4207  size += 1; // For the null termination
4208  }
4209  return true;
4210 }
4211 
4213 {
4214  char* str = 0;
4215  return data_->read_basic_value(str) && (ser << str);
4216 }
4217 
4218 #ifdef DDS_HAS_WCHAR
4219 bool DynamicDataImpl::DataContainer::reconstruct_wstring_value(CORBA::WChar* wstr) const
4220 {
4221  const CORBA::ULong bound = type_desc_->bound()[0];
4222  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4223  CORBA::ULong index;
4224  if (!data_->get_index_from_id(it->first, index, bound)) {
4225  return false;
4226  }
4227  wstr[index] = it->second.get<ACE_OutputCDR::from_wchar>().val_;
4228  }
4229  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4230  CORBA::ULong index;
4231  if (!data_->get_index_from_id(it->first, index, bound)) {
4232  return false;
4233  }
4234  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4235  if (!elem_dd) {
4236  return false;
4237  }
4238  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4239  if (elem_it != elem_dd->container_.single_map_.end()) {
4240  wstr[index] = elem_it->second.get<ACE_OutputCDR::from_wchar>().val_;
4241  } else {
4242  ACE_OutputCDR::from_wchar from_wchar('\0');
4243  set_default_basic_value(from_wchar);
4244  wstr[index] = from_wchar.val_;
4245  }
4246  }
4247  return true;
4248 }
4249 
4251  size_t& size) const
4252 {
4253  const bool is_empty = single_map_.empty() && complex_map_.empty();
4254  if (!is_empty) {
4255  CORBA::ULong largest_index;
4256  if (!get_largest_index_basic(largest_index)) {
4257  return false;
4258  }
4259  primitive_serialized_size_ulong(encoding, size);
4260  size += (largest_index + 1) * DCPS::char16_cdr_size; // Not include null termination
4261  } else {
4262  // Only need length
4263  primitive_serialized_size_ulong(encoding, size);
4264  }
4265  return true;
4266 }
4267 
4269 {
4270  CORBA::WChar* wstr = 0;
4271  return data_->read_basic_value(wstr) && (ser << wstr);
4272 }
4273 #endif
4274 
4276  size_t& size, TypeKind elem_tk, CORBA::ULong length) const
4277 {
4278  switch (elem_tk) {
4279  case TK_INT32:
4280  primitive_serialized_size_ulong(encoding, size);
4281  if (length == 0) {
4282  return;
4283  }
4284  primitive_serialized_size(encoding, size, CORBA::Long(), length);
4285  return;
4286  case TK_UINT32:
4287  primitive_serialized_size_ulong(encoding, size);
4288  if (length == 0) {
4289  return;
4290  }
4291  primitive_serialized_size(encoding, size, CORBA::ULong(), length);
4292  return;
4293  case TK_INT8:
4294  primitive_serialized_size_ulong(encoding, size);
4295  if (length == 0) {
4296  return;
4297  }
4298  primitive_serialized_size_int8(encoding, size, length);
4299  return;
4300  case TK_UINT8:
4301  primitive_serialized_size_ulong(encoding, size);
4302  if (length == 0) {
4303  return;
4304  }
4305  primitive_serialized_size_uint8(encoding, size, length);
4306  return;
4307  case TK_INT16:
4308  primitive_serialized_size_ulong(encoding, size);
4309  if (length == 0) {
4310  return;
4311  }
4312  primitive_serialized_size(encoding, size, CORBA::Short(), length);
4313  return;
4314  case TK_UINT16:
4315  primitive_serialized_size_ulong(encoding, size);
4316  if (length == 0) {
4317  return;
4318  }
4319  primitive_serialized_size(encoding, size, CORBA::UShort(), length);
4320  return;
4321  case TK_INT64:
4322  primitive_serialized_size_ulong(encoding, size);
4323  if (length == 0) {
4324  return;
4325  }
4326  primitive_serialized_size(encoding, size, CORBA::LongLong(), length);
4327  return;
4328  case TK_UINT64:
4329  primitive_serialized_size_ulong(encoding, size);
4330  if (length == 0) {
4331  return;
4332  }
4333  primitive_serialized_size(encoding, size, CORBA::ULongLong(), length);
4334  return;
4335  case TK_FLOAT32:
4336  primitive_serialized_size_ulong(encoding, size);
4337  if (length == 0) {
4338  return;
4339  }
4340  primitive_serialized_size(encoding, size, CORBA::Float(), length);
4341  return;
4342  case TK_FLOAT64:
4343  primitive_serialized_size_ulong(encoding, size);
4344  if (length == 0) {
4345  return;
4346  }
4347  primitive_serialized_size(encoding, size, CORBA::Double(), length);
4348  return;
4349  case TK_FLOAT128:
4350  primitive_serialized_size_ulong(encoding, size);
4351  if (length == 0) {
4352  return;
4353  }
4354  primitive_serialized_size(encoding, size, CORBA::LongDouble(), length);
4355  return;
4356  case TK_CHAR8:
4357  primitive_serialized_size_ulong(encoding, size);
4358  if (length == 0) {
4359  return;
4360  }
4361  primitive_serialized_size_char(encoding, size, length);
4362  return;
4363 #ifdef DDS_HAS_WCHAR
4364  case TK_CHAR16:
4365  primitive_serialized_size_ulong(encoding, size);
4366  if (length == 0) {
4367  return;
4368  }
4369  primitive_serialized_size_wchar(encoding, size, length);
4370  return;
4371 #endif
4372  case TK_BYTE:
4373  primitive_serialized_size_ulong(encoding, size);
4374  if (length == 0) {
4375  return;
4376  }
4377  primitive_serialized_size_octet(encoding, size, length);
4378  return;
4379  case TK_BOOLEAN:
4380  primitive_serialized_size_ulong(encoding, size);
4381  if (length == 0) {
4382  return;
4383  }
4384  primitive_serialized_size_boolean(encoding, size, length);
4385  return;
4386  }
4387 }
4388 
4389 // Group of functions to set default value for a basic type (Table 9).
4390 // When MemberDescriptor::default_value is fully supported, it would
4391 // have precedence over these default values.
4393 {
4394  value = 0;
4395 }
4396 
4398 {
4399  value = 0;
4400 }
4401 
4403 {
4404  value.val_ = 0;
4405 }
4406 
4408 {
4409  value.val_ = 0;
4410 }
4411 
4413 {
4414  value = 0;
4415 }
4416 
4418 {
4419  value = 0;
4420 }
4421 
4423 {
4424  value = 0;
4425 }
4426 
4428 {
4429  value = 0;
4430 }
4431 
4433 {
4434  value = 0;
4435 }
4436 
4438 {
4439  value = 0;
4440 }
4441 
4443 {
4444 #if ACE_SIZEOF_LONG_DOUBLE == 16
4445  value = 0;
4446 #else
4447  ACE_OS::memset(value.ld, 0, 16);
4448 #endif
4449 }
4450 
4452 {
4453  value.val_ = '\0';
4454 }
4455 
4457 {
4458  value.val_ = 0x00;
4459 }
4460 
4462 {
4463  value = "";
4464 }
4465 
4467 {
4468  CORBA::string_free(value);
4469  value = CORBA::string_dup("");
4470 }
4471 
4473 {
4474  value.val_ = false;
4475 }
4476 
4477 #ifdef DDS_HAS_WCHAR
4479 {
4480  value.val_ = '\0';
4481 }
4482 
4483 void DynamicDataImpl::DataContainer::set_default_basic_value(const CORBA::WChar*& value) const
4484 {
4485  value = L"";
4486 }
4487 
4488 void DynamicDataImpl::DataContainer::set_default_basic_value(CORBA::WChar*& value) const
4489 {
4490  CORBA::wstring_free(value);
4491  value = CORBA::wstring_dup(L"");
4492 }
4493 #endif
4494 
4495 bool DynamicDataImpl::DataContainer::set_default_enum_value(const DDS::DynamicType_var& enum_type,
4496  CORBA::Long& value) const
4497 {
4498  // Default enum value is the first enumerator.
4499  DDS::DynamicTypeMember_var first_dtm;
4500  if (enum_type->get_member_by_index(first_dtm, 0) != DDS::RETCODE_OK) {
4501  return false;
4502  }
4503  DDS::MemberDescriptor_var first_md;
4504  if (first_dtm->get_descriptor(first_md) != DDS::RETCODE_OK) {
4505  return false;
4506  }
4507  value = static_cast<CORBA::Long>(first_md->id());
4508  return true;
4509 }
4510 
4512 {
4513  value.val_ = 0;
4514 }
4515 
4517 {
4518  value = 0;
4519 }
4520 
4522 {
4523  value = 0;
4524 }
4525 
4527 {
4528  value = 0;
4529 }
4530 
4531 template<typename Type>
4533 {
4534  // No-op. Should never be called.
4535 }
4536 
4538 {
4539  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4541  set_default_basic_value(value);
4542  collection[i] = value.val_;
4543  }
4544 }
4545 
4547 {
4548  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4550  set_default_basic_value(value);
4551  collection[i] = value.val_;
4552  }
4553 }
4554 
4556 {
4557  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4559  set_default_basic_value(value);
4560  collection[i] = value.val_;
4561  }
4562 }
4563 
4565 {
4566  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4568  set_default_basic_value(value);
4569  collection[i] = value.val_;
4570  }
4571 }
4572 
4574 {
4575  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4577  set_default_basic_value(value);
4578  collection[i] = value.val_;
4579  }
4580 }
4581 
4582 #ifdef DDS_HAS_WCHAR
4584 {
4585  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4587  set_default_basic_value(value);
4588  collection[i] = value.val_;
4589  }
4590 }
4591 #endif
4592 
4593 template<typename CollectionType>
4595 {
4596  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
4597  set_default_basic_value(collection[i]);
4598  }
4599 }
4600 
4601 // Set elements for a sequence of primitive type
4602 template<>
4604  CORBA::ULong bound, const ACE_OutputCDR::from_boolean& /*elem_tag*/) const
4605 {
4606  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4607  CORBA::ULong index;
4608  if (!data_->get_index_from_id(it->first, index, bound)) {
4609  return false;
4610  }
4611  collection[index] = it->second.get<ACE_OutputCDR::from_boolean>().val_;
4612  }
4613 
4614  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4615  CORBA::ULong index;
4616  if (!data_->get_index_from_id(it->first, index, bound)) {
4617  return false;
4618  }
4619  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4620  if (!elem_dd) {
4621  return false;
4622  }
4623  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4624  if (elem_it != elem_dd->container_.single_map_.end()) {
4625  collection[index] = elem_it->second.get<ACE_OutputCDR::from_boolean>().val_;
4626  }
4627  }
4628  return true;
4629 }
4630 
4631 template<>
4633  CORBA::ULong bound, const ACE_OutputCDR::from_octet& /*elem_tag*/) const
4634 {
4635  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4636  CORBA::ULong index;
4637  if (!data_->get_index_from_id(it->first, index, bound)) {
4638  return false;
4639  }
4640  collection[index] = it->second.get<ACE_OutputCDR::from_octet>().val_;
4641  }
4642 
4643  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4644  CORBA::ULong index;
4645  if (!data_->get_index_from_id(it->first, index, bound)) {
4646  return false;
4647  }
4648  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4649  if (!elem_dd) {
4650  return false;
4651  }
4652  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4653  if (elem_it != elem_dd->container_.single_map_.end()) {
4654  collection[index] = elem_it->second.get<ACE_OutputCDR::from_octet>().val_;
4655  }
4656  }
4657  return true;
4658 }
4659 
4660 template<>
4662  CORBA::ULong bound, const ACE_OutputCDR::from_int8& /*elem_tag*/) const
4663 {
4664  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4665  CORBA::ULong index;
4666  if (!data_->get_index_from_id(it->first, index, bound)) {
4667  return false;
4668  }
4669  collection[index] = it->second.get<ACE_OutputCDR::from_int8>().val_;
4670  }
4671 
4672  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4673  CORBA::ULong index;
4674  if (!data_->get_index_from_id(it->first, index, bound)) {
4675  return false;
4676  }
4677  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4678  if (!elem_dd) {
4679  return false;
4680  }
4681  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4682  if (elem_it != elem_dd->container_.single_map_.end()) {
4683  collection[index] = elem_it->second.get<ACE_OutputCDR::from_int8>().val_;
4684  }
4685  }
4686  return true;
4687 }
4688 
4689 template<>
4691  CORBA::ULong bound, const ACE_OutputCDR::from_uint8& /*elem_tag*/) const
4692 {
4693  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4694  CORBA::ULong index;
4695  if (!data_->get_index_from_id(it->first, index, bound)) {
4696  return false;
4697  }
4698  collection[index] = it->second.get<ACE_OutputCDR::from_uint8>().val_;
4699  }
4700 
4701  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4702  CORBA::ULong index;
4703  if (!data_->get_index_from_id(it->first, index, bound)) {
4704  return false;
4705  }
4706  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4707  if (!elem_dd) {
4708  return false;
4709  }
4710  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4711  if (elem_it != elem_dd->container_.single_map_.end()) {
4712  collection[index] = elem_it->second.get<ACE_OutputCDR::from_uint8>().val_;
4713  }
4714  }
4715  return true;
4716 }
4717 
4718 template<>
4720  CORBA::ULong bound, const ACE_OutputCDR::from_char& /*elem_tag*/) const
4721 {
4722  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4723  CORBA::ULong index;
4724  if (!data_->get_index_from_id(it->first, index, bound)) {
4725  return false;
4726  }
4727  collection[index] = it->second.get<ACE_OutputCDR::from_char>().val_;
4728  }
4729 
4730  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4731  CORBA::ULong index;
4732  if (!data_->get_index_from_id(it->first, index, bound)) {
4733  return false;
4734  }
4735  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4736  if (!elem_dd) {
4737  return false;
4738  }
4739  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4740  if (elem_it != elem_dd->container_.single_map_.end()) {
4741  collection[index] = elem_it->second.get<ACE_OutputCDR::from_char>().val_;
4742  }
4743  }
4744  return true;
4745 }
4746 
4747 #ifdef DDS_HAS_WCHAR
4748 template<>
4750  CORBA::ULong bound, const ACE_OutputCDR::from_wchar& /*elem_tag*/) const
4751 {
4752  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4753  CORBA::ULong index;
4754  if (!data_->get_index_from_id(it->first, index, bound)) {
4755  return false;
4756  }
4757  collection[index] = it->second.get<ACE_OutputCDR::from_wchar>().val_;
4758  }
4759 
4760  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4761  CORBA::ULong index;
4762  if (!data_->get_index_from_id(it->first, index, bound)) {
4763  return false;
4764  }
4765  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4766  if (!elem_dd) {
4767  return false;
4768  }
4769  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4770  if (elem_it != elem_dd->container_.single_map_.end()) {
4771  collection[index] = elem_it->second.get<ACE_OutputCDR::from_wchar>().val_;
4772  }
4773  }
4774  return true;
4775 }
4776 #endif
4777 
4778 template<typename ElementType, typename CollectionType>
4780  CORBA::ULong bound, const ElementType& /*elem_tag*/) const
4781 {
4782  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
4783  CORBA::ULong index;
4784  if (!data_->get_index_from_id(it->first, index, bound)) {
4785  return false;
4786  }
4787  collection[index] = it->second.get<ElementType>();
4788  }
4789 
4790  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
4791  CORBA::ULong index;
4792  if (!data_->get_index_from_id(it->first, index, bound)) {
4793  return false;
4794  }
4795  const DynamicDataImpl* elem_dd = dynamic_cast<const DynamicDataImpl*>(it->second.in());
4796  if (!elem_dd) {
4797  return false;
4798  }
4799  const_single_iterator elem_it = elem_dd->container_.single_map_.find(MEMBER_ID_INVALID);
4800  if (elem_it != elem_dd->container_.single_map_.end()) {
4801  collection[index] = elem_it->second.get<ElementType>();
4802  }
4803  }
4804  return true;
4805 }
4806 
4807 // Helper function to reconstruct a sequence or array of primitive type.
4808 // For array, @a size is equal to @a bound.
4809 template<typename ElementType, typename CollectionType>
4811  CollectionType& collection, CORBA::ULong size, CORBA::ULong bound, const ElementType& elem_tag) const
4812 {
4813  collection.length(size);
4814  set_default_primitive_values(collection);
4815  return set_primitive_values(collection, bound, elem_tag);
4816 }
4817 
4818 // Reconstruct the primitive sequence written by the user (elements that are not
4819 // explicitly written are set to default value of the corresponding type).
4820 // Then serialize the constructed sequence.
4822  TypeKind elem_tk, CORBA::ULong size, CORBA::ULong bound) const
4823 {
4824  switch (elem_tk) {
4825  case TK_INT32: {
4826  DDS::Int32Seq int32seq;
4827  return reconstruct_primitive_collection(int32seq, size, bound, CORBA::Long()) &&
4828  (ser << int32seq);
4829  }
4830  case TK_UINT32: {
4831  DDS::UInt32Seq uint32seq;
4832  return reconstruct_primitive_collection(uint32seq, size, bound, CORBA::ULong()) &&
4833  (ser << uint32seq);
4834  }
4835  case TK_INT8: {
4836  DDS::Int8Seq int8seq;
4837  return reconstruct_primitive_collection(int8seq, size, bound, ACE_OutputCDR::from_int8(0)) &&
4838  (ser << int8seq);
4839  }
4840  case TK_UINT8: {
4841  DDS::UInt8Seq uint8seq;
4842  return reconstruct_primitive_collection(uint8seq, size, bound, ACE_OutputCDR::from_uint8(0)) &&
4843  (ser << uint8seq);
4844  }
4845  case TK_INT16: {
4846  DDS::Int16Seq int16seq;
4847  return reconstruct_primitive_collection(int16seq, size, bound, CORBA::Short()) &&
4848  (ser << int16seq);
4849  }
4850  case TK_UINT16: {
4851  DDS::UInt16Seq uint16seq;
4852  return reconstruct_primitive_collection(uint16seq, size, bound, CORBA::UShort()) &&
4853  (ser << uint16seq);
4854  }
4855  case TK_INT64: {
4856  DDS::Int64Seq int64seq;
4857  return reconstruct_primitive_collection(int64seq, size, bound, CORBA::LongLong()) &&
4858  (ser << int64seq);
4859  }
4860  case TK_UINT64: {
4861  DDS::UInt64Seq uint64seq;
4862  return reconstruct_primitive_collection(uint64seq, size, bound, CORBA::ULongLong()) &&
4863  (ser << uint64seq);
4864  }
4865  case TK_FLOAT32: {
4866  DDS::Float32Seq float32seq;
4867  return reconstruct_primitive_collection(float32seq, size, bound, CORBA::Float()) &&
4868  (ser << float32seq);
4869  }
4870  case TK_FLOAT64: {
4871  DDS::Float64Seq float64seq;
4872  return reconstruct_primitive_collection(float64seq, size, bound, CORBA::Double()) &&
4873  (ser << float64seq);
4874  }
4875  case TK_FLOAT128: {
4876  DDS::Float128Seq float128seq;
4877  return reconstruct_primitive_collection(float128seq, size, bound, CORBA::LongDouble()) &&
4878  (ser << float128seq);
4879  }
4880  case TK_CHAR8: {
4881  DDS::CharSeq charseq;
4882  return reconstruct_primitive_collection(charseq, size, bound, ACE_OutputCDR::from_char('\0')) &&
4883  (ser << charseq);
4884  }
4885 #ifdef DDS_HAS_WCHAR
4886  case TK_CHAR16: {
4887  DDS::WcharSeq wcharseq;
4888  return reconstruct_primitive_collection(wcharseq, size, bound, ACE_OutputCDR::from_wchar(0)) &&
4889  (ser << wcharseq);
4890  }
4891 #endif
4892  case TK_BYTE: {
4893  DDS::ByteSeq byteseq;
4894  return reconstruct_primitive_collection(byteseq, size, bound, ACE_OutputCDR::from_octet(0x00)) &&
4895  (ser << byteseq);
4896  }
4897  case TK_BOOLEAN: {
4898  DDS::BooleanSeq boolseq;
4899  return reconstruct_primitive_collection(boolseq, size, bound, ACE_OutputCDR::from_boolean(false)) &&
4900  (ser << boolseq);
4901  }
4902  }
4903  return false;
4904 }
4905 
4906 // Unlike primitive types, string and wstring are not as easy to reconstruct since each
4907 // element string may need to be reconstructed individually. Instead, we serialize
4908 // the element strings one by one directly.
4910  size_t& size, const char* str) const
4911 {
4912  primitive_serialized_size_ulong(encoding, size);
4913  if (str) {
4914  size += ACE_OS::strlen(str) + 1; // Include null termination
4915  }
4916 }
4917 
4918 #ifdef DDS_HAS_WCHAR
4920  size_t& size, const CORBA::WChar* wstr) const
4921 {
4922  primitive_serialized_size_ulong(encoding, size);
4923  if (wstr) {
4924  size += ACE_OS::strlen(wstr) * DCPS::char16_cdr_size; // Not include null termination
4925  }
4926 }
4927 #endif
4928 
4930  size_t& size, const SingleValue& sv) const
4931 {
4932  if (sv.kind_ == TK_STRING8) {
4933  serialized_size_string_common(encoding, size, sv.str_);
4934  }
4935 #ifdef DDS_HAS_WCHAR
4936  else if (sv.kind_ == TK_STRING16) {
4937  serialized_size_string_common(encoding, size, sv.wstr_);
4938  }
4939 #endif
4940 }
4941 
4942 template<typename StringType>
4944  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
4945 {
4946  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
4947  const DDS::MemberId id = index_to_id[i];
4948  if (id != MEMBER_ID_INVALID) {
4949  const_single_iterator single_it = single_map_.find(id);
4950  if (single_it != single_map_.end()) {
4951  serialized_size_string_common(encoding, size, single_it->second);
4952  } else if (!serialized_size_complex_member_i(encoding, size, id, DCPS::Sample::Full)) {
4953  return false;
4954  }
4955  } else {
4956  StringType default_value;
4957  set_default_basic_value(default_value);
4958  serialized_size_string_common(encoding, size, default_value);
4959  }
4960  }
4961  return true;
4962 }
4963 
4964 template<typename StringType>
4966  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
4967 {
4968  serialized_size_delimiter(encoding, size);
4969  primitive_serialized_size_ulong(encoding, size);
4970  if (index_to_id.empty()) {
4971  return true;
4972  }
4973  return serialized_size_generic_string_collection<StringType>(encoding, size, index_to_id);
4974 }
4975 
4976 // Serialize the individual elements from a sequence or an array of string (or wstring).
4977 template<typename StringType>
4979  const IndexToIdMap& index_to_id) const
4980 {
4981  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
4982  const DDS::MemberId id = index_to_id[i];
4983  if (id != MEMBER_ID_INVALID) {
4984  const_single_iterator single_it = single_map_.find(id);
4985  if (single_it != single_map_.end()) {
4986  if (!serialize_single_value(ser, single_it->second)) {
4987  return false;
4988  }
4989  } else if (!serialize_complex_member_i(ser, id, DCPS::Sample::Full)) {
4990  return false;
4991  }
4992  } else { // Not set by the user. Use default value.
4993  StringType default_value;
4994  set_default_basic_value(default_value);
4995  if (!(ser << default_value)) {
4996  return false;
4997  }
4998  }
4999  }
5000  return true;
5001 }
5002 
5003 template<typename StringType>
5005  CORBA::ULong length, CORBA::ULong bound) const
5006 {
5007  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
5008  if (!get_index_to_id_map(index_to_id, bound)) {
5009  return false;
5010  }
5011 
5012  const DCPS::Encoding& encoding = ser.encoding();
5013  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5014  size_t total_size = 0;
5015  if (!serialized_size_generic_string_sequence<StringType>(encoding, total_size, index_to_id) ||
5016  !ser.write_delimiter(total_size)) {
5017  return false;
5018  }
5019  }
5020  if (!(ser << length)) {
5021  return false;
5022  }
5023  if (length == 0) {
5024  return true;
5025  }
5026  return serialize_generic_string_collection<StringType>(ser, index_to_id);
5027 }
5028 
5029 template<typename ElementType, typename CollectionType>
5031  const DDS::DynamicType_var& enum_type) const
5032 {
5034  if (!set_default_enum_value(enum_type, value)) {
5035  return false;
5036  }
5037  for (CORBA::ULong i = 0; i < collection.length(); ++i) {
5038  collection[i] = static_cast<ElementType>(value);
5039  }
5040  return true;
5041 }
5042 
5043 template<typename ElementType, typename WrapElementType, typename CollectionType>
5045  CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var& enum_type,
5046  const WrapElementType& elem_tag) const
5047 {
5048  collection.length(size);
5049  if (!set_default_enum_values<ElementType>(collection, enum_type)) {
5050  return false;
5051  }
5052  return set_primitive_values(collection, bound, elem_tag);
5053 }
5054 
5055 // Serialize enum sequence represented as int8 sequence
5057  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5058 {
5059  serialized_size_delimiter(encoding, size);
5060  primitive_serialized_size_ulong(encoding, size);
5061  if (length == 0) {
5062  return;
5063  }
5064  primitive_serialized_size_int8(encoding, size, length);
5065 }
5066 
5068  const DCPS::Encoding& encoding, size_t& size, const DDS::Int8Seq& seq) const
5069 {
5070  serialized_size_enum_sequence_as_int8s(encoding, size, seq.length());
5071 }
5072 
5074  const DDS::Int8Seq& enumseq) const
5075 {
5076  const DCPS::Encoding& encoding = ser.encoding();
5077  size_t total_size = 0;
5078  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5079  serialized_size_enum_sequence_as_int8s(encoding, total_size, enumseq.length());
5080  if (!ser.write_delimiter(total_size)) {
5081  return false;
5082  }
5083  }
5084  const CORBA::ULong length = enumseq.length();
5085  if (!(ser << length)) {
5086  return false;
5087  }
5088  if (length == 0) {
5089  return true;
5090  }
5091  return ser.write_int8_array(enumseq.get_buffer(), length);
5092 }
5093 
5095  CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const
5096 {
5097  DDS::Int8Seq enumseq;
5098  return reconstruct_enum_collection<CORBA::Int8>(enumseq, size, bound, enum_type, ACE_OutputCDR::from_int8(0)) &&
5099  serialize_enum_sequence_as_ints_i(ser, enumseq);
5100 }
5101 
5102 // Serialize enum sequence represented as int16 sequence
5104  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5105 {
5106  serialized_size_delimiter(encoding, size);
5107  primitive_serialized_size_ulong(encoding, size);
5108  if (length == 0) {
5109  return;
5110  }
5111  primitive_serialized_size(encoding, size, CORBA::Short(), length);
5112 }
5113 
5115  const DCPS::Encoding& encoding, size_t& size, const DDS::Int16Seq& seq) const
5116 {
5117  serialized_size_enum_sequence_as_int16s(encoding, size, seq.length());
5118 }
5119 
5121  const DDS::Int16Seq& enumseq) const
5122 {
5123  const DCPS::Encoding& encoding = ser.encoding();
5124  size_t total_size = 0;
5125  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5126  serialized_size_enum_sequence_as_int16s(encoding, total_size, enumseq.length());
5127  if (!ser.write_delimiter(total_size)) {
5128  return false;
5129  }
5130  }
5131  const CORBA::ULong length = enumseq.length();
5132  if (!(ser << length)) {
5133  return false;
5134  }
5135  if (length == 0) {
5136  return true;
5137  }
5138  return ser.write_short_array(enumseq.get_buffer(), length);
5139 }
5140 
5142  CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const
5143 {
5144  DDS::Int16Seq enumseq;
5145  return reconstruct_enum_collection<CORBA::Short>(enumseq, size, bound, enum_type, CORBA::Short()) &&
5146  serialize_enum_sequence_as_ints_i(ser, enumseq);
5147 }
5148 
5149 // Serialize enum sequence represented as int32 sequence
5151  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5152 {
5153  serialized_size_delimiter(encoding, size);
5154  primitive_serialized_size_ulong(encoding, size);
5155  if (length == 0) {
5156  return;
5157  }
5158  primitive_serialized_size(encoding, size, CORBA::Long(), length);
5159 }
5160 
5162  const DCPS::Encoding& encoding, size_t& size, const DDS::Int32Seq& seq) const
5163 {
5164  serialized_size_enum_sequence_as_int32s(encoding, size, seq.length());
5165 }
5166 
5168  const DDS::Int32Seq& enumseq) const
5169 {
5170  const DCPS::Encoding& encoding = ser.encoding();
5171  size_t total_size = 0;
5172  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5173  serialized_size_enum_sequence_as_int32s(encoding, total_size, enumseq.length());
5174  if (!ser.write_delimiter(total_size)) {
5175  return false;
5176  }
5177  }
5178  const CORBA::ULong length = enumseq.length();
5179  if (!(ser << length)) {
5180  return false;
5181  }
5182  if (length == 0) {
5183  return true;
5184  }
5185  return ser.write_long_array(enumseq.get_buffer(), length);
5186 }
5187 
5189  CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var& enum_type) const
5190 {
5191  DDS::Int32Seq enumseq;
5192  return reconstruct_enum_collection<CORBA::Long>(enumseq, size, bound, enum_type, CORBA::Long()) &&
5193  serialize_enum_sequence_as_ints_i(ser, enumseq);
5194 }
5195 
5197  size_t& size, CORBA::ULong length, CORBA::ULong bitbound) const
5198 {
5199  if (bitbound >= 1 && bitbound <= 8) {
5200  serialized_size_enum_sequence_as_int8s(encoding, size, length);
5201  } else if (bitbound >= 9 && bitbound <= 16) {
5202  serialized_size_enum_sequence_as_int16s(encoding, size, length);
5203  } else { // From 17 to 32
5204  serialized_size_enum_sequence_as_int32s(encoding, size, length);
5205  }
5206 }
5207 
5209  CORBA::ULong size, CORBA::ULong bitbound, CORBA::ULong seqbound,
5210  const DDS::DynamicType_var& enum_type) const
5211 {
5212  if (bitbound >= 1 && bitbound <= 8) {
5213  return serialize_enum_sequence_as_int8s(ser, size, seqbound, enum_type);
5214  } else if (bitbound >= 9 && bitbound <= 16) {
5215  return serialize_enum_sequence_as_int16s(ser, size, seqbound, enum_type);
5216  } else if (bitbound >= 17 && bitbound <= 32) {
5217  return serialize_enum_sequence_as_int32s(ser, size, seqbound, enum_type);
5218  }
5219  return false;
5220 }
5221 
5222 template<typename CollectionType>
5224 {
5225  // Table 9 doesn't mention default value for bitmask. Use 0 as default here.
5226  for (CORBA::ULong i = 0; i < col.length(); ++i) {
5227  col[i] = 0;
5228  }
5229 }
5230 
5231 template<typename WrapElementType, typename CollectionType>
5233  CORBA::ULong size, CORBA::ULong bound, const WrapElementType& elem_tag) const
5234 {
5235  collection.length(size);
5236  set_default_bitmask_values(collection);
5237  return set_primitive_values(collection, bound, elem_tag);
5238 }
5239 
5240 // Bitmask sequence represented as uint8 sequence.
5242  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5243 {
5244  serialized_size_delimiter(encoding, size);
5245  primitive_serialized_size_ulong(encoding, size);
5246  if (length == 0) {
5247  return;
5248  }
5249  primitive_serialized_size_uint8(encoding, size, length);
5250 }
5251 
5253  size_t& size, const DDS::UInt8Seq& seq) const
5254 {
5255  serialized_size_bitmask_sequence_as_uint8s(encoding, size, seq.length());
5256 }
5257 
5259  const DDS::UInt8Seq& bitmask_seq) const
5260 {
5261  const DCPS::Encoding& encoding = ser.encoding();
5262  size_t total_size = 0;
5263  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5264  serialized_size_bitmask_sequence(encoding, total_size, bitmask_seq);
5265  if (!ser.write_delimiter(total_size)) {
5266  return false;
5267  }
5268  }
5269  const CORBA::ULong length = bitmask_seq.length();
5270  if (!(ser << length)) {
5271  return false;
5272  }
5273  if (length == 0) {
5274  return true;
5275  }
5276  return ser.write_uint8_array(bitmask_seq.get_buffer(), length);
5277 }
5278 
5280  CORBA::ULong size, CORBA::ULong bound) const
5281 {
5282  DDS::UInt8Seq bitmask_seq;
5283  return reconstruct_bitmask_collection(bitmask_seq, size, bound, ACE_OutputCDR::from_uint8(0)) &&
5284  serialize_bitmask_sequence_as_uints_i(ser, bitmask_seq);
5285 }
5286 
5287 // Bitmask sequence represented as uint16 sequence
5289  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5290 {
5291  serialized_size_delimiter(encoding, size);
5292  primitive_serialized_size_ulong(encoding, size);
5293  if (length == 0) {
5294  return;
5295  }
5296  primitive_serialized_size(encoding, size, CORBA::UShort(), length);
5297 }
5298 
5300  size_t& size, const DDS::UInt16Seq& seq) const
5301 {
5302  serialized_size_bitmask_sequence_as_uint16s(encoding, size, seq.length());
5303 }
5304 
5306  const DDS::UInt16Seq& bitmask_seq) const
5307 {
5308  const DCPS::Encoding& encoding = ser.encoding();
5309  size_t total_size = 0;
5310  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5311  serialized_size_bitmask_sequence(encoding, total_size, bitmask_seq);
5312  if (!ser.write_delimiter(total_size)) {
5313  return false;
5314  }
5315  }
5316  const CORBA::ULong length = bitmask_seq.length();
5317  if (!(ser << length)) {
5318  return false;
5319  }
5320  if (length == 0) {
5321  return true;
5322  }
5323  return ser.write_ushort_array(bitmask_seq.get_buffer(), length);
5324 }
5325 
5327  CORBA::ULong size, CORBA::ULong bound) const
5328 {
5329  DDS::UInt16Seq bitmask_seq;
5330  return reconstruct_bitmask_collection(bitmask_seq, size, bound, CORBA::UShort()) &&
5331  serialize_bitmask_sequence_as_uints_i(ser, bitmask_seq);
5332 }
5333 
5334 // Bitmask sequence represented as uint32 sequence
5336  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5337 {
5338  serialized_size_delimiter(encoding, size);
5339  primitive_serialized_size_ulong(encoding, size);
5340  if (length == 0) {
5341  return;
5342  }
5343  primitive_serialized_size(encoding, size, CORBA::ULong(), length);
5344 }
5345 
5347  size_t& size, const DDS::UInt32Seq& seq) const
5348 {
5349  serialized_size_bitmask_sequence_as_uint32s(encoding, size, seq.length());
5350 }
5351 
5353  const DDS::UInt32Seq& bitmask_seq) const
5354 {
5355  const DCPS::Encoding& encoding = ser.encoding();
5356  size_t total_size = 0;
5357  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5358  serialized_size_bitmask_sequence(encoding, total_size, bitmask_seq);
5359  if (!ser.write_delimiter(total_size)) {
5360  return false;
5361  }
5362  }
5363  const CORBA::ULong length = bitmask_seq.length();
5364  if (!(ser << length)) {
5365  return false;
5366  }
5367  if (length == 0) {
5368  return true;
5369  }
5370  return ser.write_ulong_array(bitmask_seq.get_buffer(), length);
5371 }
5372 
5374  CORBA::ULong size, CORBA::ULong bound) const
5375 {
5376  DDS::UInt32Seq bitmask_seq;
5377  return reconstruct_bitmask_collection(bitmask_seq, size, bound, CORBA::ULong()) &&
5378  serialize_bitmask_sequence_as_uints_i(ser, bitmask_seq);
5379 }
5380 
5381 // Bitmask sequence represented as uint64 sequence
5383  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
5384 {
5385  serialized_size_delimiter(encoding, size);
5386  primitive_serialized_size_ulong(encoding, size);
5387  if (length == 0) {
5388  return;
5389  }
5390  primitive_serialized_size(encoding, size, CORBA::ULongLong(), length);
5391 }
5392 
5394  size_t& size, const DDS::UInt64Seq& seq) const
5395 {
5396  serialized_size_bitmask_sequence_as_uint64s(encoding, size, seq.length());
5397 }
5398 
5400  const DDS::UInt64Seq& bitmask_seq) const
5401 {
5402  const DCPS::Encoding& encoding = ser.encoding();
5403  size_t total_size = 0;
5404  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5405  serialized_size_bitmask_sequence(encoding, total_size, bitmask_seq);
5406  if (!ser.write_delimiter(total_size)) {
5407  return false;
5408  }
5409  }
5410  const CORBA::ULong length = bitmask_seq.length();
5411  if (!(ser << length)) {
5412  return false;
5413  }
5414  if (length == 0) {
5415  return true;
5416  }
5417  return ser.write_ulonglong_array(bitmask_seq.get_buffer(), length);
5418 }
5419 
5421  CORBA::ULong size, CORBA::ULong bound) const
5422 {
5423  DDS::UInt64Seq bitmask_seq;
5424  return reconstruct_bitmask_collection(bitmask_seq, size, bound, CORBA::ULongLong()) &&
5425  serialize_bitmask_sequence_as_uints_i(ser, bitmask_seq);
5426 }
5427 
5429  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length, CORBA::ULong bitbound) const
5430 {
5431  if (bitbound >= 1 && bitbound <= 8) {
5432  serialized_size_bitmask_sequence_as_uint8s(encoding, size, length);
5433  } else if (bitbound >= 9 && bitbound <= 16) {
5434  serialized_size_bitmask_sequence_as_uint16s(encoding, size, length);
5435  } else if (bitbound >= 17 && bitbound <= 32) {
5436  serialized_size_bitmask_sequence_as_uint32s(encoding, size, length);
5437  } else { // from 33 to 64
5438  serialized_size_bitmask_sequence_as_uint64s(encoding, size, length);
5439  }
5440 }
5441 
5443  CORBA::ULong size, CORBA::ULong bitbound, CORBA::ULong seqbound) const
5444 {
5445  if (bitbound >= 1 && bitbound <= 8) {
5446  return serialize_bitmask_sequence_as_uint8s(ser, size, seqbound);
5447  } else if (bitbound >= 9 && bitbound <= 16) {
5448  return serialize_bitmask_sequence_as_uint16s(ser, size, seqbound);
5449  } else if (bitbound >= 17 && bitbound <= 32) {
5450  return serialize_bitmask_sequence_as_uint32s(ser, size, seqbound);
5451  } else if (bitbound >= 33 && bitbound <= 64) {
5452  return serialize_bitmask_sequence_as_uint64s(ser, size, seqbound);
5453  }
5454  return false;
5455 }
5456 
5457 // Serialize a SequenceValue object
5459  const DCPS::Encoding& encoding, size_t& size, const SequenceValue& sv) const
5460 {
5461  switch (sv.elem_kind_) {
5462  case TK_INT32:
5463  serialized_size(encoding, size, sv.get<DDS::Int32Seq>());
5464  return true;
5465  case TK_UINT32:
5466  serialized_size(encoding, size, sv.get<DDS::UInt32Seq>());
5467  return true;
5468  case TK_INT8:
5469  serialized_size(encoding, size, sv.get<DDS::Int8Seq>());
5470  return true;
5471  case TK_UINT8:
5472  serialized_size(encoding, size, sv.get<DDS::UInt8Seq>());
5473  return true;
5474  case TK_INT16:
5475  serialized_size(encoding, size, sv.get<DDS::Int16Seq>());
5476  return true;
5477  case TK_UINT16:
5478  serialized_size(encoding, size, sv.get<DDS::UInt16Seq>());
5479  return true;
5480  case TK_INT64:
5481  serialized_size(encoding, size, sv.get<DDS::Int64Seq>());
5482  return true;
5483  case TK_UINT64:
5484  serialized_size(encoding, size, sv.get<DDS::UInt64Seq>());
5485  return true;
5486  case TK_FLOAT32:
5487  serialized_size(encoding, size, sv.get<DDS::Float32Seq>());
5488  return true;
5489  case TK_FLOAT64:
5490  serialized_size(encoding, size, sv.get<DDS::Float64Seq>());
5491  return true;
5492  case TK_FLOAT128:
5493  serialized_size(encoding, size, sv.get<DDS::Float128Seq>());
5494  return true;
5495  case TK_CHAR8:
5496  serialized_size(encoding, size, sv.get<DDS::CharSeq>());
5497  return true;
5498  case TK_BYTE:
5499  serialized_size(encoding, size, sv.get<DDS::ByteSeq>());
5500  return true;
5501  case TK_BOOLEAN:
5502  serialized_size(encoding, size, sv.get<DDS::BooleanSeq>());
5503  return true;
5504  case TK_STRING8:
5505  serialized_size(encoding, size, sv.get<DDS::StringSeq>());
5506  return true;
5507 #ifdef DDS_HAS_WCHAR
5508  case TK_CHAR16:
5509  serialized_size(encoding, size, sv.get<DDS::WcharSeq>());
5510  return true;
5511  case TK_STRING16:
5512  serialized_size(encoding, size, sv.get<DDS::WstringSeq>());
5513  return true;
5514 #endif
5515  default:
5516  return false;
5517  }
5518 }
5519 
5521  const SequenceValue& sv) const
5522 {
5523  switch (sv.elem_kind_) {
5524  case TK_INT32:
5525  return ser << sv.get<DDS::Int32Seq>();
5526  case TK_UINT32:
5527  return ser << sv.get<DDS::UInt32Seq>();
5528  case TK_INT8:
5529  return ser << sv.get<DDS::Int8Seq>();
5530  case TK_UINT8:
5531  return ser << sv.get<DDS::UInt8Seq>();
5532  case TK_INT16:
5533  return ser << sv.get<DDS::Int16Seq>();
5534  case TK_UINT16:
5535  return ser << sv.get<DDS::UInt16Seq>();
5536  case TK_INT64:
5537  return ser << sv.get<DDS::Int64Seq>();
5538  case TK_UINT64:
5539  return ser << sv.get<DDS::UInt64Seq>();
5540  case TK_FLOAT32:
5541  return ser << sv.get<DDS::Float32Seq>();
5542  case TK_FLOAT64:
5543  return ser << sv.get<DDS::Float64Seq>();
5544  case TK_FLOAT128:
5545  return ser << sv.get<DDS::Float128Seq>();
5546  case TK_CHAR8:
5547  return ser << sv.get<DDS::CharSeq>();
5548  case TK_BYTE:
5549  return ser << sv.get<DDS::ByteSeq>();
5550  case TK_BOOLEAN:
5551  return ser << sv.get<DDS::BooleanSeq>();
5552  case TK_STRING8:
5553  return ser << sv.get<DDS::StringSeq>();
5554 #ifdef DDS_HAS_WCHAR
5555  case TK_CHAR16:
5556  return ser << sv.get<DDS::WcharSeq>();
5557  case TK_STRING16:
5558  return ser << sv.get<DDS::WstringSeq>();
5559 #endif
5560  default:
5561  return false;
5562  }
5563 }
5564 
5565 // Helper function for serializing sequences and arrays
5567  CORBA::ULong bound) const
5568 {
5569  for (const_single_iterator it = single_map_.begin(); it != single_map_.end(); ++it) {
5570  CORBA::ULong index;
5571  if (!data_->get_index_from_id(it->first, index, bound)) {
5572  return false;
5573  }
5574  index_to_id[index] = it->first;
5575  }
5576  for (const_sequence_iterator it = sequence_map_.begin(); it != sequence_map_.end(); ++it) {
5577  CORBA::ULong index;
5578  if (!data_->get_index_from_id(it->first, index, bound)) {
5579  return false;
5580  }
5581  index_to_id[index] = it->first;
5582  }
5583  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
5584  CORBA::ULong index;
5585  if (!data_->get_index_from_id(it->first, index, bound)) {
5586  return false;
5587  }
5588  index_to_id[index] = it->first;
5589  }
5590  return true;
5591 }
5592 
5594  const DCPS::Encoding& encoding, size_t& size, DDS::MemberId id, DCPS::Sample::Extent ext) const
5595 {
5596  const DDS::DynamicData_var& dd_var = complex_map_.at(id);
5597  const DynamicDataImpl* data_impl = dynamic_cast<const DynamicDataImpl*>(dd_var.in());
5598  if (!data_impl) {
5599  return false;
5600  }
5601  return data_impl->serialized_size_i(encoding, size, ext);
5602 }
5603 
5604 template<typename SequenceType>
5606  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id,
5607  SequenceType protoseq) const
5608 {
5609  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5610  const CORBA::ULong id = index_to_id[i];
5611  if (id != MEMBER_ID_INVALID) {
5612  const_sequence_iterator it = sequence_map_.find(id);
5613  if (it != sequence_map_.end()) {
5614  serialized_size_sequence_value(encoding, size, it->second);
5615  } else if (!serialized_size_complex_member_i(encoding, size, id, DCPS::Sample::Full)) {
5616  return false;
5617  }
5618  } else { // Empty sequence
5619  protoseq.length(0);
5620  serialized_size(encoding, size, protoseq);
5621  }
5622  }
5623  return true;
5624 }
5625 
5626 template<typename SequenceType>
5628  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id,
5629  SequenceType protoseq) const
5630 {
5631  serialized_size_delimiter(encoding, size);
5632  primitive_serialized_size_ulong(encoding, size);
5633  if (index_to_id.empty()) {
5634  return true;
5635  }
5636  return serialized_size_nested_basic_sequences(encoding, size, index_to_id, protoseq);
5637 }
5638 
5640  DDS::MemberId id,
5641  DCPS::Sample::Extent ext) const
5642 {
5643  const DDS::DynamicData_var& dd_var = complex_map_.at(id);
5644  const DynamicDataImpl* data_impl = dynamic_cast<const DynamicDataImpl*>(dd_var.in());
5645  if (!data_impl) {
5646  return false;
5647  }
5648  return data_impl->serialize_i(ser, ext);
5649 }
5650 
5651 template<typename SequenceType>
5653  const IndexToIdMap& index_to_id, SequenceType protoseq) const
5654 {
5655  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5656  const CORBA::ULong id = index_to_id[i];
5657  if (id != MEMBER_ID_INVALID) {
5658  const_sequence_iterator it = sequence_map_.find(id);
5659  if (it != sequence_map_.end()) {
5660  if (!serialize_sequence_value(ser, it->second)) {
5661  return false;
5662  }
5663  } else if (!serialize_complex_member_i(ser, id, DCPS::Sample::Full)) {
5664  return false;
5665  }
5666  } else {
5667  // Table 9: Use zero-length sequence of the same element type.
5668  protoseq.length(0);
5669  if (!(ser << protoseq)) {
5670  return false;
5671  }
5672  }
5673  }
5674  return true;
5675 }
5676 
5677 template<typename SequenceType>
5679  CORBA::ULong size, CORBA::ULong bound, SequenceType protoseq) const
5680 {
5681  // Map from index to ID. Use MEMBER_ID_INVALID to indicate there is
5682  // no data for an element at a given index.
5683  IndexToIdMap index_to_id(size, MEMBER_ID_INVALID);
5684  if (!get_index_to_id_map(index_to_id, bound)) {
5685  return false;
5686  }
5687 
5688  const DCPS::Encoding& encoding = ser.encoding();
5689  size_t total_size = 0;
5690  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5691  if (!serialized_size_nesting_basic_sequence(encoding, total_size, index_to_id, protoseq) ||
5692  !ser.write_delimiter(total_size)) {
5693  return false;
5694  }
5695  }
5696 
5697  // Serialize the top-level sequence's length
5698  if (!(ser << size)) {
5699  return false;
5700  }
5701  if (size == 0) {
5702  return true;
5703  }
5704  return serialize_nested_basic_sequences(ser, index_to_id, protoseq);
5705 }
5706 
5708  const DCPS::Encoding& encoding, size_t& size, TypeKind nested_elem_tk,
5709  const IndexToIdMap& index_to_id) const
5710 {
5711  switch (nested_elem_tk) {
5712  case TK_INT32:
5713  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Int32Seq());
5714  case TK_UINT32:
5715  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::UInt32Seq());
5716  case TK_INT8:
5717  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Int8Seq());
5718  case TK_UINT8:
5719  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::UInt8Seq());
5720  case TK_INT16:
5721  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Int16Seq());
5722  case TK_UINT16:
5723  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::UInt16Seq());
5724  case TK_INT64:
5725  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Int64Seq());
5726  case TK_UINT64:
5727  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::UInt64Seq());
5728  case TK_FLOAT32:
5729  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Float32Seq());
5730  case TK_FLOAT64:
5731  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Float64Seq());
5732  case TK_FLOAT128:
5733  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::Float128Seq());
5734  case TK_CHAR8:
5735  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::CharSeq());
5736  case TK_STRING8:
5737  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::StringSeq());
5738 #ifdef DDS_HAS_WCHAR
5739  case TK_CHAR16:
5740  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::WcharSeq());
5741  case TK_STRING16:
5742  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::WstringSeq());
5743 #endif
5744  case TK_BYTE:
5745  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::ByteSeq());
5746  case TK_BOOLEAN:
5747  return serialized_size_nesting_basic_sequence(encoding, size, index_to_id, DDS::BooleanSeq());
5748  }
5749  return false;
5750 }
5751 
5753  TypeKind nested_elem_tk, CORBA::ULong size, CORBA::ULong bound) const
5754 {
5755  switch (nested_elem_tk) {
5756  case TK_INT32:
5757  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Int32Seq());
5758  case TK_UINT32:
5759  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::UInt32Seq());
5760  case TK_INT8:
5761  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Int8Seq());
5762  case TK_UINT8:
5763  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::UInt8Seq());
5764  case TK_INT16:
5765  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Int16Seq());
5766  case TK_UINT16:
5767  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::UInt16Seq());
5768  case TK_INT64:
5769  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Int64Seq());
5770  case TK_UINT64:
5771  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::UInt64Seq());
5772  case TK_FLOAT32:
5773  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Float32Seq());
5774  case TK_FLOAT64:
5775  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Float64Seq());
5776  case TK_FLOAT128:
5777  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::Float128Seq());
5778  case TK_CHAR8:
5779  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::CharSeq());
5780  case TK_STRING8:
5781  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::StringSeq());
5782 #ifdef DDS_HAS_WCHAR
5783  case TK_CHAR16:
5784  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::WcharSeq());
5785  case TK_STRING16:
5786  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::WstringSeq());
5787 #endif
5788  case TK_BYTE:
5789  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::ByteSeq());
5790  case TK_BOOLEAN:
5791  return serialize_nesting_basic_sequence_i(ser, size, bound, DDS::BooleanSeq());
5792  }
5793  return false;
5794 }
5795 
5797  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
5798 {
5799  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5800  const CORBA::ULong id = index_to_id[i];
5801  if (id != MEMBER_ID_INVALID) {
5802  const_sequence_iterator it = sequence_map_.find(id);
5803  if (it != sequence_map_.end()) {
5804  serialized_size_enum_sequence(encoding, size, it);
5805  } else if (!serialized_size_complex_member_i(encoding, size, id, DCPS::Sample::Full)) {
5806  return false;
5807  }
5808  } else {
5809  serialized_size_delimiter(encoding, size);
5810  primitive_serialized_size_ulong(encoding, size);
5811  }
5812  }
5813  return true;
5814 }
5815 
5817  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
5818 {
5819  serialized_size_delimiter(encoding, size);
5820  primitive_serialized_size_ulong(encoding, size);
5821  if (index_to_id.empty()) {
5822  return true;
5823  }
5824  return serialized_size_nested_enum_sequences(encoding, size, index_to_id);
5825 }
5826 
5828  DCPS::Serializer& ser, const IndexToIdMap& index_to_id) const
5829 {
5830  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5831  const CORBA::ULong id = index_to_id[i];
5832  if (id != MEMBER_ID_INVALID) {
5833  const_sequence_iterator it = sequence_map_.find(id);
5834  if (it != sequence_map_.end()) {
5835  if (!serialize_enum_sequence(ser, it)) {
5836  return false;
5837  }
5838  } else if (!serialize_complex_member_i(ser, id, DCPS::Sample::Full)) {
5839  return false;
5840  }
5841  } else { // Empty sequence of enums
5843  if (!ser.write_delimiter(2 * DCPS::uint32_cdr_size)) {
5844  return false;
5845  }
5846  }
5847  if (!(ser << static_cast<CORBA::ULong>(0))) {
5848  return false;
5849  }
5850  }
5851  }
5852  return true;
5853 }
5854 
5856  CORBA::ULong size, CORBA::ULong bound) const
5857 {
5858  IndexToIdMap index_to_id(size, MEMBER_ID_INVALID);
5859  if (!get_index_to_id_map(index_to_id, bound)) {
5860  return false;
5861  }
5862 
5863  const DCPS::Encoding& encoding = ser.encoding();
5864  size_t total_size = 0;
5865  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5866  if (!serialized_size_nesting_enum_sequence(encoding, total_size, index_to_id) ||
5867  !ser.write_delimiter(total_size)) {
5868  return false;
5869  }
5870  }
5871 
5872  if (!(ser << size)) {
5873  return false;
5874  }
5875  if (size == 0) {
5876  return true;
5877  }
5878  return serialize_nested_enum_sequences(ser, index_to_id);
5879 }
5880 
5882  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
5883 {
5884  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5885  const CORBA::ULong id = index_to_id[i];
5886  if (id != MEMBER_ID_INVALID) {
5887  const_sequence_iterator it = sequence_map_.find(id);
5888  if (it != sequence_map_.end()) {
5889  serialized_size_bitmask_sequence(encoding, size, it);
5890  } else if (!serialized_size_complex_member_i(encoding, size, id, DCPS::Sample::Full)) {
5891  return false;
5892  }
5893  } else {
5894  serialized_size_delimiter(encoding, size);
5895  primitive_serialized_size_ulong(encoding, size);
5896  }
5897  }
5898  return true;
5899 }
5900 
5902  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
5903 {
5904  serialized_size_delimiter(encoding, size);
5905  primitive_serialized_size_ulong(encoding, size);
5906  if (index_to_id.empty()) {
5907  return true;
5908  }
5909  return serialized_size_nested_bitmask_sequences(encoding, size, index_to_id);
5910 }
5911 
5913  const IndexToIdMap& index_to_id) const
5914 {
5915  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5916  const CORBA::ULong id = index_to_id[i];
5917  if (id != MEMBER_ID_INVALID) {
5918  const_sequence_iterator it = sequence_map_.find(id);
5919  if (it != sequence_map_.end()) {
5920  if (!serialize_bitmask_sequence(ser, it)) {
5921  return false;
5922  }
5923  } else if (!serialize_complex_member_i(ser, id, DCPS::Sample::Full)) {
5924  return false;
5925  }
5926  } else { // Empty sequence of bitmasks
5928  if (!ser.write_delimiter(2 * DCPS::uint32_cdr_size)) {
5929  return false;
5930  }
5931  }
5932  if (!(ser << static_cast<CORBA::ULong>(0))) {
5933  return false;
5934  }
5935  }
5936  }
5937  return true;
5938 }
5939 
5941  CORBA::ULong size, CORBA::ULong bound) const
5942 {
5943  IndexToIdMap index_to_id(size, MEMBER_ID_INVALID);
5944  if (!get_index_to_id_map(index_to_id, bound)) {
5945  return false;
5946  }
5947 
5948  const DCPS::Encoding& encoding = ser.encoding();
5949  size_t total_size = 0;
5950  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
5951  if (!serialized_size_nesting_bitmask_sequence(encoding, total_size, index_to_id) ||
5952  !ser.write_delimiter(total_size)) {
5953  return false;
5954  }
5955  }
5956 
5957  if (!(ser << size)) {
5958  return false;
5959  }
5960  if (size == 0) {
5961  return true;
5962  }
5963  return serialize_nested_bitmask_sequences(ser, index_to_id);
5964 }
5965 
5967  size_t& size, DDS::MemberId id, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const
5968 {
5969  if (id != MEMBER_ID_INVALID) {
5970  return serialized_size_complex_member_i(encoding, size, id, ext);
5971  } else {
5972  return DynamicDataImpl(elem_type).serialized_size_i(encoding, size, ext);
5973  }
5974 }
5975 
5977  size_t& size, const IndexToIdMap& index_to_id, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const
5978 {
5979  serialized_size_delimiter(encoding, size);
5980  primitive_serialized_size_ulong(encoding, size);
5981  if (index_to_id.empty()) {
5982  return true;
5983  }
5984  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5985  if (!serialized_size_complex_member(encoding, size, index_to_id[i], elem_type, ext)) {
5986  return false;
5987  }
5988  }
5989  return true;
5990 }
5991 
5993  const IndexToIdMap& index_to_id, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const
5994 {
5995  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
5996  const CORBA::ULong id = index_to_id[i];
5997  if (id != MEMBER_ID_INVALID) {
5998  if (!serialize_complex_member_i(ser, id, ext)) {
5999  return false;
6000  }
6001  } else {
6002  if (!DynamicDataImpl(elem_type).serialize_i(ser, ext)) {
6003  return false;
6004  }
6005  }
6006  }
6007  return true;
6008 }
6009 
6011  CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const
6012 {
6013  IndexToIdMap index_to_id(size, MEMBER_ID_INVALID);
6014  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
6015  CORBA::ULong index;
6016  if (!data_->get_index_from_id(it->first, index, bound)) {
6017  return false;
6018  }
6019  index_to_id[index] = it->first;
6020  }
6021 
6022  const DCPS::Encoding& encoding = ser.encoding();
6023  size_t total_size = 0;
6024  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6025  if (!serialized_size_complex_sequence(encoding, total_size, index_to_id, elem_type, ext) ||
6026  !ser.write_delimiter(total_size)) {
6027  return false;
6028  }
6029  }
6030 
6031  if (!(ser << size)) {
6032  return false;
6033  }
6034  if (size == 0) {
6035  return true;
6036  }
6037  return serialize_complex_sequence_i(ser, index_to_id, elem_type, ext);
6038 }
6039 
6041  CORBA::ULong bound) const
6042 {
6043  CORBA::ULong length = 0;
6044  if (!complex_map_.empty()) {
6045  CORBA::ULong largest_index;
6046  if (!get_largest_complex_index(largest_index)) {
6047  return false;
6048  }
6049  length = largest_index + 1;
6050  }
6051  index_to_id.resize(length, MEMBER_ID_INVALID);
6052  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
6053  CORBA::ULong index;
6054  if (!data_->get_index_from_id(it->first, index, bound)) {
6055  return false;
6056  }
6057  index_to_id[index] = it->first;
6058  }
6059  return true;
6060 }
6061 
6063  size_t& size,
6064  DCPS::Sample::Extent ext) const
6065 {
6066  const CORBA::ULong bound = type_desc_->bound()[0];
6067 
6068  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
6069  const TypeKind elem_tk = elem_type->get_kind();
6070  DDS::TypeDescriptor_var elem_td;
6071  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
6072  return false;
6073  }
6074 
6075  if (is_basic(elem_tk) || elem_tk == TK_ENUM || elem_tk == TK_BITMASK) {
6076  const bool is_empty = single_map_.empty() && complex_map_.empty();
6077  CORBA::ULong length = 0;
6078  if (!is_empty) {
6079  CORBA::ULong largest_index;
6080  if (!get_largest_index_basic(largest_index)) {
6081  return false;
6082  }
6083  length = largest_index + 1;
6084  }
6085  if (is_primitive(elem_tk)) {
6086  serialized_size_primitive_sequence(encoding, size, elem_tk, length);
6087  return true;
6088  } else if (elem_tk == TK_STRING8) {
6089  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6090  if (!get_index_to_id_map(index_to_id, bound)) {
6091  return false;
6092  }
6093  return serialized_size_generic_string_sequence<const char*>(encoding, size, index_to_id);
6094  } else if (elem_tk == TK_STRING16) {
6095 #ifdef DDS_HAS_WCHAR
6096  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6097  if (!get_index_to_id_map(index_to_id, bound)) {
6098  return false;
6099  }
6100  return serialized_size_generic_string_sequence<const CORBA::WChar*>(encoding, size, index_to_id);
6101 #else
6102  return false;
6103 #endif
6104  } else if (elem_tk == TK_ENUM) {
6105  const CORBA::ULong bit_bound = elem_td->bound()[0];
6106  serialized_size_enum_sequence(encoding, size, length, bit_bound);
6107  return true;
6108  } else if (elem_tk == TK_BITMASK) {
6109  const CORBA::ULong bit_bound = elem_td->bound()[0];
6110  serialized_size_bitmask_sequence(encoding, size, length, bit_bound);
6111  }
6112  } else if (elem_tk == TK_SEQUENCE) {
6113  const DDS::DynamicType_var nested_elem_type = get_base_type(elem_td->element_type());
6114  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
6115  if (is_basic(nested_elem_tk) || nested_elem_tk == TK_ENUM ||
6116  nested_elem_tk == TK_BITMASK) {
6117  const bool is_empty = sequence_map_.empty() && complex_map_.empty();
6118  CORBA::ULong length = 0;
6119  if (!is_empty) {
6120  CORBA::ULong largest_index;
6121  if (!get_largest_index_basic_sequence(largest_index)) {
6122  return false;
6123  }
6124  length = largest_index + 1;
6125  }
6126  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6127  if (!get_index_to_id_map(index_to_id, bound)) {
6128  return false;
6129  }
6130  if (is_basic(nested_elem_tk)) {
6131  return serialized_size_nesting_basic_sequence(encoding, size, nested_elem_tk, index_to_id);
6132  } else if (nested_elem_tk == TK_ENUM) {
6133  return serialized_size_nesting_enum_sequence(encoding, size, index_to_id);
6134  } else {
6135  return serialized_size_nesting_bitmask_sequence(encoding, size, index_to_id);
6136  }
6137  }
6138  }
6139 
6140  // Elements stored in complex map
6141  IndexToIdMap index_to_id;
6142  if (!get_index_to_id_from_complex(index_to_id, bound)) {
6143  return false;
6144  }
6145  return serialized_size_complex_sequence(encoding, size, index_to_id, elem_type, ext);
6146 }
6147 
6149 {
6150  const CORBA::ULong bound = type_desc_->bound()[0];
6151 
6152  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
6153  const TypeKind elem_tk = elem_type->get_kind();
6154  DDS::TypeDescriptor_var elem_td;
6155  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
6156  return false;
6157  }
6158 
6159  if (is_basic(elem_tk) || elem_tk == TK_ENUM || elem_tk == TK_BITMASK) {
6160  const bool is_empty = single_map_.empty() && complex_map_.empty();
6161  CORBA::ULong length = 0;
6162  if (!is_empty) {
6163  CORBA::ULong largest_index;
6164  if (!get_largest_index_basic(largest_index)) {
6165  return false;
6166  }
6167  length = largest_index + 1;
6168  }
6169  if (is_primitive(elem_tk)) {
6170  return serialize_primitive_sequence(ser, elem_tk, length, bound);
6171  } else if (elem_tk == TK_STRING8) {
6172  return serialize_generic_string_sequence<const char*>(ser, length, bound);
6173  } else if (elem_tk == TK_STRING16) {
6174 #ifdef DDS_HAS_WCHAR
6175  return serialize_generic_string_sequence<const CORBA::WChar*>(ser, length, bound);
6176 #else
6177  return false;
6178 #endif
6179  } else if (elem_tk == TK_ENUM) {
6180  const CORBA::ULong bit_bound = elem_td->bound()[0];
6181  return serialize_enum_sequence(ser, length, bit_bound, bound, elem_type);
6182  } else {
6183  const CORBA::ULong bit_bound = elem_td->bound()[0];
6184  return serialize_bitmask_sequence(ser, length, bit_bound, bound);
6185  }
6186  } else if (elem_tk == TK_SEQUENCE) {
6187  const DDS::DynamicType_var nested_elem_type = get_base_type(elem_td->element_type());
6188  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
6189  if (is_basic(nested_elem_tk) || nested_elem_tk == TK_ENUM ||
6190  nested_elem_tk == TK_BITMASK) {
6191  const bool is_empty = sequence_map_.empty() && complex_map_.empty();
6192  CORBA::ULong length = 0;
6193  if (!is_empty) {
6194  CORBA::ULong largest_index;
6195  if (!get_largest_index_basic_sequence(largest_index)) {
6196  return false;
6197  }
6198  length = largest_index + 1;
6199  }
6200  if (is_basic(nested_elem_tk)) {
6201  return serialize_nesting_basic_sequence(ser, nested_elem_tk, length, bound);
6202  } else if (nested_elem_tk == TK_ENUM) {
6203  return serialize_nesting_enum_sequence(ser, length, bound);
6204  } else {
6205  return serialize_nesting_bitmask_sequence(ser, length, bound);
6206  }
6207  }
6208  }
6209 
6210  // Elements with all the other types are stored in the complex map.
6211  CORBA::ULong length = 0;
6212  if (!complex_map_.empty()) {
6213  CORBA::ULong largest_index;
6214  if (!get_largest_complex_index(largest_index)) {
6215  return false;
6216  }
6217  length = largest_index + 1;
6218  }
6219  return serialize_complex_sequence(ser, length, bound, elem_type, ext);
6220 }
6221 
6223  size_t& size, TypeKind elem_tk, CORBA::ULong length) const
6224 {
6225  switch (elem_tk) {
6226  case TK_INT32:
6227  primitive_serialized_size(encoding, size, CORBA::Long(), length);
6228  return;
6229  case TK_UINT32:
6230  primitive_serialized_size(encoding, size, CORBA::ULong(), length);
6231  return;
6232  case TK_INT8:
6233  primitive_serialized_size_int8(encoding, size, length);
6234  return;
6235  case TK_UINT8:
6236  primitive_serialized_size_uint8(encoding, size, length);
6237  return;
6238  case TK_INT16:
6239  primitive_serialized_size(encoding, size, CORBA::Short(), length);
6240  return;
6241  case TK_UINT16:
6242  primitive_serialized_size(encoding, size, CORBA::UShort(), length);
6243  return;
6244  case TK_INT64:
6245  primitive_serialized_size(encoding, size, CORBA::LongLong(), length);
6246  return;
6247  case TK_UINT64:
6248  primitive_serialized_size(encoding, size, CORBA::ULongLong(), length);
6249  return;
6250  case TK_FLOAT32:
6251  primitive_serialized_size(encoding, size, CORBA::Float(), length);
6252  return;
6253  case TK_FLOAT64:
6254  primitive_serialized_size(encoding, size, CORBA::Double(), length);
6255  return;
6256  case TK_FLOAT128:
6257  primitive_serialized_size(encoding, size, CORBA::LongDouble(), length);
6258  return;
6259  case TK_CHAR8:
6260  primitive_serialized_size_char(encoding, size, length);
6261  return;
6262 #ifdef DDS_HAS_WCHAR
6263  case TK_CHAR16:
6264  primitive_serialized_size_wchar(encoding, size, length);
6265  return;
6266 #endif
6267  case TK_BYTE:
6268  primitive_serialized_size_octet(encoding, size, length);
6269  return;
6270  case TK_BOOLEAN:
6271  primitive_serialized_size_boolean(encoding, size, length);
6272  return;
6273  }
6274 }
6275 
6277  TypeKind elem_tk, CORBA::ULong length) const
6278 {
6279  switch (elem_tk) {
6280  case TK_INT32: {
6281  DDS::Int32Seq int32arr;
6282  return reconstruct_primitive_collection(int32arr, length, length, CORBA::Long()) &&
6283  ser.write_long_array(int32arr.get_buffer(), length);
6284  }
6285  case TK_UINT32: {
6286  DDS::UInt32Seq uint32arr;
6287  return reconstruct_primitive_collection(uint32arr, length, length, CORBA::ULong()) &&
6288  ser.write_ulong_array(uint32arr.get_buffer(), length);
6289  }
6290  case TK_INT8: {
6291  DDS::Int8Seq int8arr;
6292  return reconstruct_primitive_collection(int8arr, length, length, ACE_OutputCDR::from_int8(0)) &&
6293  ser.write_int8_array(int8arr.get_buffer(), length);
6294  }
6295  case TK_UINT8: {
6296  DDS::UInt8Seq uint8arr;
6297  return reconstruct_primitive_collection(uint8arr, length, length, ACE_OutputCDR::from_uint8(0)) &&
6298  ser.write_uint8_array(uint8arr.get_buffer(), length);
6299  }
6300  case TK_INT16: {
6301  DDS::Int16Seq int16arr;
6302  return reconstruct_primitive_collection(int16arr, length, length, CORBA::Short()) &&
6303  ser.write_short_array(int16arr.get_buffer(), length);
6304  }
6305  case TK_UINT16: {
6306  DDS::UInt16Seq uint16arr;
6307  return reconstruct_primitive_collection(uint16arr, length, length, CORBA::UShort()) &&
6308  ser.write_ushort_array(uint16arr.get_buffer(), length);
6309  }
6310  case TK_INT64: {
6311  DDS::Int64Seq int64arr;
6312  return reconstruct_primitive_collection(int64arr, length, length, CORBA::LongLong()) &&
6313  ser.write_longlong_array(int64arr.get_buffer(), length);
6314  }
6315  case TK_UINT64: {
6316  DDS::UInt64Seq uint64arr;
6317  return reconstruct_primitive_collection(uint64arr, length, length, CORBA::ULongLong()) &&
6318  ser.write_ulonglong_array(uint64arr.get_buffer(), length);
6319  }
6320  case TK_FLOAT32: {
6321  DDS::Float32Seq float32arr;
6322  return reconstruct_primitive_collection(float32arr, length, length, CORBA::Float()) &&
6323  ser.write_float_array(float32arr.get_buffer(), length);
6324  }
6325  case TK_FLOAT64: {
6326  DDS::Float64Seq float64arr;
6327  return reconstruct_primitive_collection(float64arr, length, length, CORBA::Double()) &&
6328  ser.write_double_array(float64arr.get_buffer(), length);
6329  }
6330  case TK_FLOAT128: {
6331  DDS::Float128Seq float128arr;
6332  return reconstruct_primitive_collection(float128arr, length, length, CORBA::LongDouble()) &&
6333  ser.write_longdouble_array(float128arr.get_buffer(), length);
6334  }
6335  case TK_CHAR8: {
6336  DDS::CharSeq chararr;
6337  return reconstruct_primitive_collection(chararr, length, length, ACE_OutputCDR::from_char('\0')) &&
6338  ser.write_char_array(chararr.get_buffer(), length);
6339  }
6340 #ifdef DDS_HAS_WCHAR
6341  case TK_CHAR16: {
6342  DDS::WcharSeq wchararr;
6343  return reconstruct_primitive_collection(wchararr, length, length, ACE_OutputCDR::from_wchar(0)) &&
6344  ser.write_wchar_array(wchararr.get_buffer(), length);
6345  }
6346 #endif
6347  case TK_BYTE: {
6348  DDS::ByteSeq bytearr;
6349  return reconstruct_primitive_collection(bytearr, length, length, ACE_OutputCDR::from_octet(0x00)) &&
6350  ser.write_octet_array(bytearr.get_buffer(), length);
6351  }
6352  case TK_BOOLEAN: {
6353  DDS::BooleanSeq boolarr;
6354  return reconstruct_primitive_collection(boolarr, length, length, ACE_OutputCDR::from_boolean(false)) &&
6355  ser.write_boolean_array(boolarr.get_buffer(), length);
6356  }
6357  }
6358  return false;
6359 }
6360 
6361 template<typename StringType>
6363  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
6364 {
6365  serialized_size_delimiter(encoding, size);
6366  return serialized_size_generic_string_collection<StringType>(encoding, size, index_to_id);
6367 }
6368 
6369 template<typename StringType>
6371  CORBA::ULong length) const
6372 {
6373  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6374  if (!get_index_to_id_map(index_to_id, length)) {
6375  return false;
6376  }
6377 
6378  const DCPS::Encoding& encoding = ser.encoding();
6379  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6380  size_t total_size = 0;
6381  if (!serialized_size_generic_string_array<StringType>(encoding, total_size, index_to_id) ||
6382  !ser.write_delimiter(total_size)) {
6383  return false;
6384  }
6385  }
6386  return serialize_generic_string_collection<StringType>(ser, index_to_id);
6387 }
6388 
6389 // Serialize enum array represented as int8 array
6391  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6392 {
6393  serialized_size_delimiter(encoding, size);
6394  primitive_serialized_size_int8(encoding, size, length);
6395 }
6396 
6398  const DDS::Int8Seq& enumarr) const
6399 {
6400  const DCPS::Encoding& encoding = ser.encoding();
6401  size_t total_size = 0;
6402  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6403  serialized_size_enum_array_as_int8s(encoding, total_size, enumarr.length());
6404  if (!ser.write_delimiter(total_size)) {
6405  return false;
6406  }
6407  }
6408  return ser.write_int8_array(enumarr.get_buffer(), enumarr.length());
6409 }
6410 
6412  CORBA::ULong length, const DDS::DynamicType_var& enum_type) const
6413 {
6414  DDS::Int8Seq enumarr;
6415  return reconstruct_enum_collection<CORBA::Int8>(enumarr, length, length, enum_type, ACE_OutputCDR::from_int8(0)) &&
6416  serialize_enum_array_as_ints_i(ser, enumarr);
6417 }
6418 
6419 // Serialize enum array represented as int16 array
6421  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6422 {
6423  serialized_size_delimiter(encoding, size);
6424  primitive_serialized_size(encoding, size, CORBA::Short(), length);
6425 }
6426 
6428  const DDS::Int16Seq& enumarr) const
6429 {
6430  const DCPS::Encoding& encoding = ser.encoding();
6431  size_t total_size = 0;
6432  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6433  serialized_size_enum_array_as_int16s(encoding, total_size, enumarr.length());
6434  if (!ser.write_delimiter(total_size)) {
6435  return false;
6436  }
6437  }
6438  return ser.write_short_array(enumarr.get_buffer(), enumarr.length());
6439 }
6440 
6442  CORBA::ULong length, const DDS::DynamicType_var& enum_type) const
6443 {
6444  DDS::Int16Seq enumarr;
6445  return reconstruct_enum_collection<CORBA::Short>(enumarr, length, length, enum_type, CORBA::Short()) &&
6446  serialize_enum_array_as_ints_i(ser, enumarr);
6447 }
6448 
6449 // Serialize enum array represented as int32 array
6451  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6452 {
6453  serialized_size_delimiter(encoding, size);
6454  primitive_serialized_size(encoding, size, CORBA::Long(), length);
6455 }
6456 
6458  const DDS::Int32Seq& enumarr) const
6459 {
6460  const DCPS::Encoding& encoding = ser.encoding();
6461  size_t total_size = 0;
6462  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6463  serialized_size_enum_array_as_int32s(encoding, total_size, enumarr.length());
6464  if (!ser.write_delimiter(total_size)) {
6465  return false;
6466  }
6467  }
6468  return ser.write_long_array(enumarr.get_buffer(), enumarr.length());
6469 }
6470 
6472  CORBA::ULong length, const DDS::DynamicType_var& enum_type) const
6473 {
6474  DDS::Int32Seq enumarr;
6475  return reconstruct_enum_collection<CORBA::Long>(enumarr, length, length, enum_type, CORBA::Long()) &&
6476  serialize_enum_array_as_ints_i(ser, enumarr);
6477 }
6478 
6480  size_t& size, CORBA::ULong length, CORBA::ULong bitbound) const
6481 {
6482  if (bitbound >= 1 && bitbound <= 8) {
6483  serialized_size_enum_array_as_int8s(encoding, size, length);
6484  } else if (bitbound >= 9 && bitbound <= 16) {
6485  serialized_size_enum_array_as_int16s(encoding, size, length);
6486  } else { // from 17 to 32
6487  serialized_size_enum_array_as_int32s(encoding, size, length);
6488  }
6489 }
6490 
6492  CORBA::ULong bitbound, CORBA::ULong length, const DDS::DynamicType_var& enum_type) const
6493 {
6494  if (bitbound >= 1 && bitbound <= 8) {
6495  return serialize_enum_array_as_int8s(ser, length, enum_type);
6496  } else if (bitbound >= 9 && bitbound <= 16) {
6497  return serialize_enum_array_as_int16s(ser, length, enum_type);
6498  } else if (bitbound >= 17 && bitbound <= 32) {
6499  return serialize_enum_array_as_int32s(ser, length, enum_type);
6500  }
6501  return false;
6502 }
6503 
6504 // Bitmask array represented as uint8 array.
6506  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6507 {
6508  serialized_size_delimiter(encoding, size);
6509  primitive_serialized_size_uint8(encoding, size, length);
6510 }
6511 
6513  const DDS::UInt8Seq& bitmask_arr) const
6514 {
6515  const DCPS::Encoding& encoding = ser.encoding();
6516  size_t total_size = 0;
6517  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6518  serialized_size_bitmask_array_as_uint8s(encoding, total_size, bitmask_arr.length());
6519  if (!ser.write_delimiter(total_size)) {
6520  return false;
6521  }
6522  }
6523  return ser.write_uint8_array(bitmask_arr.get_buffer(), bitmask_arr.length());
6524 }
6525 
6527  CORBA::ULong length) const
6528 {
6529  DDS::UInt8Seq bitmask_arr;
6530  return reconstruct_bitmask_collection(bitmask_arr, length, length, ACE_OutputCDR::from_uint8(0)) &&
6531  serialize_bitmask_array_as_uints_i(ser, bitmask_arr);
6532 }
6533 
6534 // Bitmask array represented as uint16 array.
6536  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6537 {
6538  serialized_size_delimiter(encoding, size);
6539  primitive_serialized_size(encoding, size, CORBA::UShort(), length);
6540 }
6541 
6543  const DDS::UInt16Seq& bitmask_arr) const
6544 {
6545  const DCPS::Encoding& encoding = ser.encoding();
6546  size_t total_size = 0;
6547  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6548  serialized_size_bitmask_array_as_uint16s(encoding, total_size, bitmask_arr.length());
6549  if (!ser.write_delimiter(total_size)) {
6550  return false;
6551  }
6552  }
6553  return ser.write_ushort_array(bitmask_arr.get_buffer(), bitmask_arr.length());
6554 }
6555 
6557  CORBA::ULong length) const
6558 {
6559  DDS::UInt16Seq bitmask_arr;
6560  return reconstruct_bitmask_collection(bitmask_arr, length, length, CORBA::UShort()) &&
6561  serialize_bitmask_array_as_uints_i(ser, bitmask_arr);
6562 }
6563 
6564 // Bitmask array represented as uint32 array.
6566  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6567 {
6568  serialized_size_delimiter(encoding, size);
6569  primitive_serialized_size(encoding, size, CORBA::ULong(), length);
6570 }
6571 
6573  const DDS::UInt32Seq& bitmask_arr) const
6574 {
6575  const DCPS::Encoding& encoding = ser.encoding();
6576  size_t total_size = 0;
6577  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6578  serialized_size_bitmask_array_as_uint32s(encoding, total_size, bitmask_arr.length());
6579  if (!ser.write_delimiter(total_size)) {
6580  return false;
6581  }
6582  }
6583  return ser.write_ulong_array(bitmask_arr.get_buffer(), bitmask_arr.length());
6584 }
6585 
6587  CORBA::ULong length) const
6588 {
6589  DDS::UInt32Seq bitmask_arr;
6590  return reconstruct_bitmask_collection(bitmask_arr, length, length, CORBA::ULong()) &&
6591  serialize_bitmask_array_as_uints_i(ser, bitmask_arr);
6592 }
6593 
6594 // Bitmask array represented as uint64 array.
6596  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length) const
6597 {
6598  serialized_size_delimiter(encoding, size);
6599  primitive_serialized_size(encoding, size, CORBA::ULongLong(), length);
6600 }
6601 
6603  const DDS::UInt64Seq& bitmask_arr) const
6604 {
6605  const DCPS::Encoding& encoding = ser.encoding();
6606  size_t total_size = 0;
6607  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6608  serialized_size_bitmask_array_as_uint64s(encoding, total_size, bitmask_arr.length());
6609  if (!ser.write_delimiter(total_size)) {
6610  return false;
6611  }
6612  }
6613  return ser.write_ulonglong_array(bitmask_arr.get_buffer(), bitmask_arr.length());
6614 }
6615 
6617  CORBA::ULong length) const
6618 {
6619  DDS::UInt64Seq bitmask_arr;
6620  return reconstruct_bitmask_collection(bitmask_arr, length, length, CORBA::ULongLong()) &&
6621  serialize_bitmask_array_as_uints_i(ser, bitmask_arr);
6622 }
6623 
6625  const DCPS::Encoding& encoding, size_t& size, CORBA::ULong length, CORBA::ULong bitbound) const
6626 {
6627  if (bitbound >= 1 && bitbound <= 8) {
6628  serialized_size_bitmask_array_as_uint8s(encoding, size, length);
6629  } else if (bitbound >= 9 && bitbound <= 16) {
6630  serialized_size_bitmask_array_as_uint16s(encoding, size, length);
6631  } else if (bitbound >= 17 && bitbound <= 32) {
6632  serialized_size_bitmask_array_as_uint32s(encoding, size, length);
6633  } else { // from 33 to 64
6634  serialized_size_bitmask_array_as_uint64s(encoding, size, length);
6635  }
6636 }
6637 
6639  CORBA::ULong bitbound, CORBA::ULong length) const
6640 {
6641  if (bitbound >= 1 && bitbound <= 8) {
6642  return serialize_bitmask_array_as_uint8s(ser, length);
6643  } else if (bitbound >= 9 && bitbound <= 16) {
6644  return serialize_bitmask_array_as_uint16s(ser, length);
6645  } else if (bitbound >= 17 && bitbound <= 32) {
6646  return serialize_bitmask_array_as_uint32s(ser, length);
6647  } else if (bitbound >= 33 && bitbound <= 64) {
6648  return serialize_bitmask_array_as_uint64s(ser, length);
6649  }
6650  return false;
6651 }
6652 
6653 template<typename SequenceType>
6655  size_t& size, const IndexToIdMap& index_to_id, SequenceType protoseq) const
6656 {
6657  serialized_size_delimiter(encoding, size);
6658  return serialized_size_nested_basic_sequences(encoding, size, index_to_id, protoseq);
6659 }
6660 
6661 template<typename SequenceType>
6663  CORBA::ULong length, SequenceType protoseq) const
6664 {
6665  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6666  if (!get_index_to_id_map(index_to_id, length)) {
6667  return false;
6668  }
6669 
6670  const DCPS::Encoding& encoding = ser.encoding();
6671  size_t total_size = 0;
6672  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6673  if (!serialized_size_nesting_basic_array(encoding, total_size, index_to_id, protoseq) ||
6674  !ser.write_delimiter(total_size)) {
6675  return false;
6676  }
6677  }
6678  return serialize_nested_basic_sequences(ser, index_to_id, protoseq);
6679 }
6680 
6682  const DCPS::Encoding& encoding, size_t& size, TypeKind nested_elem_tk,
6683  const IndexToIdMap& index_to_id) const
6684 {
6685  switch (nested_elem_tk) {
6686  case TK_INT32:
6687  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Int32Seq());
6688  case TK_UINT32:
6689  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::UInt32Seq());
6690  case TK_INT8:
6691  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Int8Seq());
6692  case TK_UINT8:
6693  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::UInt8Seq());
6694  case TK_INT16:
6695  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Int16Seq());
6696  case TK_UINT16:
6697  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::UInt16Seq());
6698  case TK_INT64:
6699  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Int64Seq());
6700  case TK_UINT64:
6701  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::UInt64Seq());
6702  case TK_FLOAT32:
6703  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Float32Seq());
6704  case TK_FLOAT64:
6705  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Float64Seq());
6706  case TK_FLOAT128:
6707  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::Float128Seq());
6708  case TK_CHAR8:
6709  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::CharSeq());
6710  case TK_STRING8:
6711  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::StringSeq());
6712 #ifdef DDS_HAS_WCHAR
6713  case TK_CHAR16:
6714  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::WcharSeq());
6715  case TK_STRING16:
6716  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::WstringSeq());
6717 #endif
6718  case TK_BYTE:
6719  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::ByteSeq());
6720  case TK_BOOLEAN:
6721  return serialized_size_nesting_basic_array(encoding, size, index_to_id, DDS::BooleanSeq());
6722  }
6723  return false;
6724 }
6725 
6727  TypeKind nested_elem_tk, CORBA::ULong length) const
6728 {
6729  switch (nested_elem_tk) {
6730  case TK_INT32:
6731  return serialize_nesting_basic_array_i(ser, length, DDS::Int32Seq());
6732  case TK_UINT32:
6733  return serialize_nesting_basic_array_i(ser, length, DDS::UInt32Seq());
6734  case TK_INT8:
6735  return serialize_nesting_basic_array_i(ser, length, DDS::Int8Seq());
6736  case TK_UINT8:
6737  return serialize_nesting_basic_array_i(ser, length, DDS::UInt8Seq());
6738  case TK_INT16:
6739  return serialize_nesting_basic_array_i(ser, length, DDS::Int16Seq());
6740  case TK_UINT16:
6741  return serialize_nesting_basic_array_i(ser, length, DDS::UInt16Seq());
6742  case TK_INT64:
6743  return serialize_nesting_basic_array_i(ser, length, DDS::Int64Seq());
6744  case TK_UINT64:
6745  return serialize_nesting_basic_array_i(ser, length, DDS::UInt64Seq());
6746  case TK_FLOAT32:
6747  return serialize_nesting_basic_array_i(ser, length, DDS::Float32Seq());
6748  case TK_FLOAT64:
6749  return serialize_nesting_basic_array_i(ser, length, DDS::Float64Seq());
6750  case TK_FLOAT128:
6751  return serialize_nesting_basic_array_i(ser, length, DDS::Float128Seq());
6752  case TK_CHAR8:
6753  return serialize_nesting_basic_array_i(ser, length, DDS::CharSeq());
6754  case TK_STRING8:
6755  return serialize_nesting_basic_array_i(ser, length, DDS::StringSeq());
6756 #ifdef DDS_HAS_WCHAR
6757  case TK_CHAR16:
6758  return serialize_nesting_basic_array_i(ser, length, DDS::WcharSeq());
6759  case TK_STRING16:
6760  return serialize_nesting_basic_array_i(ser, length, DDS::WstringSeq());
6761 #endif
6762  case TK_BYTE:
6763  return serialize_nesting_basic_array_i(ser, length, DDS::ByteSeq());
6764  case TK_BOOLEAN:
6765  return serialize_nesting_basic_array_i(ser, length, DDS::BooleanSeq());
6766  }
6767  return false;
6768 }
6769 
6771  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
6772 {
6773  serialized_size_delimiter(encoding, size);
6774  return serialized_size_nested_enum_sequences(encoding, size, index_to_id);
6775 }
6776 
6778  CORBA::ULong length) const
6779 {
6780  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6781  if (!get_index_to_id_map(index_to_id, length)) {
6782  return false;
6783  }
6784 
6785  const DCPS::Encoding& encoding = ser.encoding();
6786  size_t total_size = 0;
6787  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6788  if (!serialized_size_nesting_enum_array(encoding, total_size, index_to_id) ||
6789  !ser.write_delimiter(total_size)) {
6790  return false;
6791  }
6792  }
6793  return serialize_nested_enum_sequences(ser, index_to_id);
6794 }
6795 
6797  const DCPS::Encoding& encoding, size_t& size, const IndexToIdMap& index_to_id) const
6798 {
6799  serialized_size_delimiter(encoding, size);
6800  return serialized_size_nested_bitmask_sequences(encoding, size, index_to_id);
6801 }
6802 
6804  CORBA::ULong length) const
6805 {
6806  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6807  if (!get_index_to_id_map(index_to_id, length)) {
6808  return false;
6809  }
6810 
6811  const DCPS::Encoding& encoding = ser.encoding();
6812  size_t total_size = 0;
6813  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6814  if (!serialized_size_nesting_bitmask_array(encoding, total_size, index_to_id) ||
6815  !ser.write_delimiter(total_size)) {
6816  return false;
6817  }
6818  }
6819  return serialize_nested_bitmask_sequences(ser, index_to_id);
6820 }
6821 
6823  size_t& size, const IndexToIdMap& index_to_id, const DDS::DynamicType_var& elem_type,
6824  DCPS::Sample::Extent ext) const
6825 {
6826  serialized_size_delimiter(encoding, size);
6827  for (CORBA::ULong i = 0; i < index_to_id.size(); ++i) {
6828  if (!serialized_size_complex_member(encoding, size, index_to_id[i], elem_type, ext)) {
6829  return false;
6830  }
6831  }
6832  return true;
6833 }
6834 
6836  DCPS::Serializer& ser, CORBA::ULong length, const DDS::DynamicType_var& elem_type, DCPS::Sample::Extent ext) const
6837 {
6838  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6839  for (const_complex_iterator it = complex_map_.begin(); it != complex_map_.end(); ++it) {
6840  CORBA::ULong index;
6841  if (!data_->get_index_from_id(it->first, index, length)) {
6842  return false;
6843  }
6844  index_to_id[index] = it->first;
6845  }
6846 
6847  const DCPS::Encoding& encoding = ser.encoding();
6848  size_t total_size = 0;
6849  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
6850  if (!serialized_size_complex_array(encoding, total_size, index_to_id, elem_type, ext) ||
6851  !ser.write_delimiter(total_size)) {
6852  return false;
6853  }
6854  }
6855  return serialize_complex_sequence_i(ser, index_to_id, elem_type, ext);
6856 }
6857 
6859  size_t& size,
6860  DCPS::Sample::Extent ext) const
6861 {
6862  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
6863  const TypeKind elem_tk = elem_type->get_kind();
6864  DDS::TypeDescriptor_var elem_td;
6865  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
6866  return false;
6867  }
6868 
6869  const CORBA::ULong length = bound_total(type_desc_);
6870  if (is_basic(elem_tk)) {
6871  serialized_size_primitive_array(encoding, size, elem_tk, length);
6872  return true;
6873  } else if (elem_tk == TK_STRING8) {
6874  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6875  if (!get_index_to_id_map(index_to_id, length)) {
6876  return false;
6877  }
6878  return serialized_size_generic_string_array<const char*>(encoding, size, index_to_id);
6879  } else if (elem_tk == TK_STRING16) {
6880 #ifdef DDS_HAS_WCHAR
6881  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6882  if (!get_index_to_id_map(index_to_id, length)) {
6883  return false;
6884  }
6885  return serialized_size_generic_string_array<const CORBA::WChar*>(encoding, size, index_to_id);
6886 #else
6887  return false;
6888 #endif
6889  } else if (elem_tk == TK_ENUM) {
6890  const CORBA::ULong bit_bound = elem_td->bound()[0];
6891  serialized_size_enum_array(encoding, size, length, bit_bound);
6892  return true;
6893  } else if (elem_tk == TK_BITMASK) {
6894  const CORBA::ULong bit_bound = elem_td->bound()[0];
6895  serialized_size_bitmask_array(encoding, size, length, bit_bound);
6896  return true;
6897  } else if (elem_tk == TK_SEQUENCE) {
6898  const DDS::DynamicType_var nested_elem_type = get_base_type(elem_td->element_type());
6899  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
6900  IndexToIdMap index_to_id(length, MEMBER_ID_INVALID);
6901  if (!get_index_to_id_map(index_to_id, length)) {
6902  return false;
6903  }
6904  if (is_basic(nested_elem_tk)) {
6905  return serialized_size_nesting_basic_array(encoding, size, nested_elem_tk, index_to_id);
6906  } else if (nested_elem_tk == TK_ENUM) {
6907  return serialized_size_nesting_enum_array(encoding, size, index_to_id);
6908  } else if (nested_elem_tk == TK_BITMASK) {
6909  return serialized_size_nesting_bitmask_array(encoding, size, index_to_id);
6910  }
6911  }
6912 
6913  // Elements stored in complex map
6914  IndexToIdMap index_to_id;
6915  if (!get_index_to_id_from_complex(index_to_id, length)) {
6916  return false;
6917  }
6918  return serialized_size_complex_array(encoding, size, index_to_id, elem_type, ext);
6919 }
6920 
6922 {
6923  const DDS::DynamicType_var elem_type = get_base_type(type_desc_->element_type());
6924  const TypeKind elem_tk = elem_type->get_kind();
6925  DDS::TypeDescriptor_var elem_td;
6926  if (elem_type->get_descriptor(elem_td) != DDS::RETCODE_OK) {
6927  return false;
6928  }
6929 
6930  const CORBA::ULong length = bound_total(type_desc_);
6931  if (is_basic(elem_tk)) {
6932  return serialize_primitive_array(ser, elem_tk, length);
6933  } else if (elem_tk == TK_STRING8) {
6934  return serialize_generic_string_array<const char*>(ser, length);
6935  } else if (elem_tk == TK_STRING16) {
6936 #ifdef DDS_HAS_WCHAR
6937  return serialize_generic_string_array<const CORBA::WChar*>(ser, length);
6938 #else
6939  return false;
6940 #endif
6941  } else if (elem_tk == TK_ENUM) {
6942  const CORBA::ULong bit_bound = elem_td->bound()[0];
6943  return serialize_enum_array(ser, bit_bound, length, elem_type);
6944  } else if (elem_tk == TK_BITMASK) {
6945  const CORBA::ULong bit_bound = elem_td->bound()[0];
6946  return serialize_bitmask_array(ser, bit_bound, length);
6947  } else if (elem_tk == TK_SEQUENCE) {
6948  const DDS::DynamicType_var nested_elem_type = get_base_type(elem_td->element_type());
6949  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
6950  if (is_basic(nested_elem_tk)) {
6951  return serialize_nesting_basic_array(ser, nested_elem_tk, length);
6952  } else if (nested_elem_tk == TK_ENUM) {
6953  return serialize_nesting_enum_array(ser, length);
6954  } else if (nested_elem_tk == TK_BITMASK) {
6955  return serialize_nesting_bitmask_array(ser, length);
6956  }
6957  }
6958  return serialize_complex_array(ser, length, elem_type, ext);
6959 }
6960 
6962  size_t& size, TypeKind member_tk) const
6963 {
6964  using namespace OpenDDS::DCPS;
6965 
6966  switch (member_tk) {
6967  case TK_INT32:
6968  return primitive_serialized_size(encoding, size, CORBA::Long());
6969  case TK_UINT32:
6970  return primitive_serialized_size(encoding, size, CORBA::ULong());
6971  case TK_INT8:
6972  primitive_serialized_size_int8(encoding, size);
6973  return true;
6974  case TK_UINT8:
6975  primitive_serialized_size_uint8(encoding, size);
6976  return true;
6977  case TK_INT16:
6978  return primitive_serialized_size(encoding, size, CORBA::Short());
6979  case TK_UINT16:
6980  return primitive_serialized_size(encoding, size, CORBA::UShort());
6981  case TK_INT64:
6982  return primitive_serialized_size(encoding, size, CORBA::LongLong());
6983  case TK_UINT64:
6984  return primitive_serialized_size(encoding, size, CORBA::ULongLong());
6985  case TK_FLOAT32:
6986  return primitive_serialized_size(encoding, size, CORBA::Float());
6987  case TK_FLOAT64:
6988  return primitive_serialized_size(encoding, size, CORBA::Double());
6989  case TK_FLOAT128:
6990  return primitive_serialized_size(encoding, size, CORBA::LongDouble());
6991  case TK_CHAR8:
6992  primitive_serialized_size_char(encoding, size);
6993  return true;
6994 #ifdef DDS_HAS_WCHAR
6995  case TK_CHAR16:
6996  primitive_serialized_size_wchar(encoding, size);
6997  return true;
6998 #endif
6999  case TK_BYTE:
7000  primitive_serialized_size_octet(encoding, size);
7001  return true;
7002  case TK_BOOLEAN:
7003  primitive_serialized_size_boolean(encoding, size);
7004  return true;
7005  }
7006  return false;
7007 }
7008 
7010  const DCPS::Encoding& encoding, size_t& size, TypeKind member_tk) const
7011 {
7012  if (is_primitive(member_tk)) {
7013  return serialized_size_primitive_member(encoding, size, member_tk);
7014  } else if (member_tk == TK_STRING8) {
7015  const char* str_default;
7016  set_default_basic_value(str_default);
7017  serialized_size_string_common(encoding, size, str_default);
7018  return true;
7019  }
7020 #ifdef DDS_HAS_WCHAR
7021  else if (member_tk == TK_STRING16) {
7022  const CORBA::WChar* wstr_default;
7023  set_default_basic_value(wstr_default);
7024  serialized_size_string_common(encoding, size, wstr_default);
7025  return true;
7026  }
7027 #endif
7028  return false;
7029 }
7030 
7031 // Serialized size of a basic member of an aggregated type. Member header size is not included.
7033  size_t& size, TypeKind member_tk, const_single_iterator it) const
7034 {
7035  if (is_primitive(member_tk)) {
7036  return serialized_size_primitive_member(encoding, size, member_tk);
7037  } else if (member_tk == TK_STRING8 || member_tk == TK_STRING16) {
7038  serialized_size_string_common(encoding, size, it->second);
7039  return true;
7040  }
7041  return false;
7042 }
7043 
7045  TypeKind member_tk) const
7046 {
7047  switch (member_tk) {
7048  case TK_INT32: {
7050  set_default_basic_value(value);
7051  return ser << value;
7052  }
7053  case TK_UINT32: {
7055  set_default_basic_value(value);
7056  return ser << value;
7057  }
7058  case TK_INT8: {
7060  set_default_basic_value(value);
7061  return ser << value;
7062  }
7063  case TK_UINT8: {
7065  set_default_basic_value(value);
7066  return ser << value;
7067  }
7068  case TK_INT16: {
7070  set_default_basic_value(value);
7071  return ser << value;
7072  }
7073  case TK_UINT16: {
7075  set_default_basic_value(value);
7076  return ser << value;
7077  }
7078  case TK_INT64: {
7080  set_default_basic_value(value);
7081  return ser << value;
7082  }
7083  case TK_UINT64: {
7085  set_default_basic_value(value);
7086  return ser << value;
7087  }
7088  case TK_FLOAT32: {
7090  set_default_basic_value(value);
7091  return ser << value;
7092  }
7093  case TK_FLOAT64: {
7095  set_default_basic_value(value);
7096  return ser << value;
7097  }
7098  case TK_FLOAT128: {
7100  set_default_basic_value(value);
7101  return ser << value;
7102  }
7103  case TK_CHAR8: {
7105  set_default_basic_value(value);
7106  return ser << value;
7107  }
7108  case TK_STRING8: {
7109  const char* value;
7110  set_default_basic_value(value);
7111  return ser << value;
7112  }
7113 #ifdef DDS_HAS_WCHAR
7114  case TK_CHAR16: {
7116  set_default_basic_value(value);
7117  return ser << value;
7118  }
7119  case TK_STRING16: {
7120  const CORBA::WChar* value;
7121  set_default_basic_value(value);
7122  return ser << value;
7123  }
7124 #endif
7125  case TK_BYTE: {
7127  set_default_basic_value(value);
7128  return ser << value;
7129  }
7130  case TK_BOOLEAN: {
7132  set_default_basic_value(value);
7133  return ser << value;
7134  }
7135  }
7136  return false;
7137 }
7138 
7139 // Serialize an aggregated member stored in the single map.
7140 // The member type is basic or enum or bitmask.
7142  const DCPS::Encoding& encoding, size_t& size, const_single_iterator it,
7143  const DDS::DynamicType_var& member_type, bool optional,
7144  DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const
7145 {
7146  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7147  primitive_serialized_size_boolean(encoding, size);
7148  } else if (extensibility == DDS::MUTABLE) {
7149  serialized_size_parameter_id(encoding, size, mutable_running_total);
7150  }
7151  const TypeKind member_tk = member_type->get_kind();
7152  if (is_basic(member_tk)) {
7153  return serialized_size_basic_member(encoding, size, member_tk, it);
7154  } else if (member_tk == TK_ENUM) {
7155  return serialized_size_enum(encoding, size, member_type);
7156  } else { // Bitmask
7157  return serialized_size_bitmask(encoding, size, member_type);
7158  }
7159 }
7160 
7162  const_single_iterator it, const DDS::DynamicType_var& member_type, bool optional,
7163  bool must_understand, DDS::ExtensibilityKind extensibility) const
7164 {
7165  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7166  if (!(ser << ACE_OutputCDR::from_boolean(true))) {
7167  return false;
7168  }
7169  } else if (extensibility == DDS::MUTABLE) {
7170  const DCPS::Encoding& encoding = ser.encoding();
7171  const TypeKind member_tk = member_type->get_kind();
7172  size_t member_size = 0;
7173  if (is_basic(member_tk)) {
7174  serialized_size_basic_member(encoding, member_size, member_tk, it);
7175  } else if (member_tk == TK_ENUM) {
7176  serialized_size_enum(encoding, member_size, member_type);
7177  } else if (member_tk == TK_BITMASK) {
7178  serialized_size_bitmask(encoding, member_size, member_type);
7179  } else {
7180  return false;
7181  }
7182  if (!ser.write_parameter_id(it->first, member_size, must_understand)) {
7183  return false;
7184  }
7185  }
7186  return serialize_single_value(ser, it->second);
7187 }
7188 
7189 // Serialize a member of an aggregated type whose value must be represented by a DynamicData
7190 // object. However, the data for the member is missing from the complex map. So default value
7191 // of the corresponding type is used for serialization.
7193  const DCPS::Encoding& encoding, size_t& size, const DDS::DynamicType_var& member_type,
7194  bool optional, DDS::ExtensibilityKind extensibility, size_t& mutable_running_total,
7195  DCPS::Sample::Extent ext) const
7196 {
7197  if (optional) {
7198  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7199  primitive_serialized_size_boolean(encoding, size);
7200  }
7201  return true;
7202  }
7203  if (extensibility == DDS::MUTABLE) {
7204  serialized_size_parameter_id(encoding, size, mutable_running_total);
7205  }
7206 
7207  return DynamicDataImpl(member_type).serialized_size_i(encoding, size, ext);
7208 }
7209 
7211  DCPS::Serializer& ser, DDS::MemberId id, const DDS::DynamicType_var& member_type,
7212  bool optional, bool must_understand, DDS::ExtensibilityKind extensibility,
7213  DCPS::Sample::Extent ext) const
7214 {
7215  if (optional) {
7216  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7217  return ser << ACE_OutputCDR::from_boolean(false);
7218  }
7219  return true;
7220  }
7221  // Use default value if the member is not optional.
7222  const DynamicDataImpl default_value(member_type);
7223  if (extensibility == DDS::MUTABLE) {
7224  size_t member_size = 0;
7225  default_value.serialized_size_i(ser.encoding(), member_size, ext);
7226  if (!ser.write_parameter_id(id, member_size, must_understand)) {
7227  return false;
7228  }
7229  }
7230  return default_value.serialize_i(ser, ext);
7231 }
7232 
7233 // Serialize a member of an aggregated type stored in the complex map,
7234 // i.e., the member value is represented by a DynamicData object.
7236  const DCPS::Encoding& encoding, size_t& size, const_complex_iterator it,
7237  bool optional, DDS::ExtensibilityKind extensibility, size_t& mutable_running_total,
7238  DCPS::Sample::Extent ext) const
7239 {
7240  const DDS::DynamicData_var& data_var = it->second;
7241  const DynamicDataImpl* data_impl = dynamic_cast<DynamicDataImpl*>(data_var.in());
7242  if (!data_impl) {
7243  return false;
7244  }
7245 
7246  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7247  primitive_serialized_size_boolean(encoding, size);
7248  } else if (extensibility == DDS::MUTABLE) {
7249  serialized_size_parameter_id(encoding, size, mutable_running_total);
7250  }
7251  return data_impl->serialized_size_i(encoding, size, ext);
7252 }
7253 
7255  DCPS::Serializer& ser, const_complex_iterator it, bool optional,
7256  bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const
7257 {
7258  const DDS::DynamicData_var& data_var = it->second;
7259  const DynamicDataImpl* data_impl = dynamic_cast<DynamicDataImpl*>(data_var.in());
7260  if (!data_impl) {
7261  return false;
7262  }
7263 
7264  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7265  if (!(ser << ACE_OutputCDR::from_boolean(true))) {
7266  return false;
7267  }
7268  } else if (extensibility == DDS::MUTABLE) {
7269  size_t member_size = 0;
7270  if (!data_impl->serialized_size_i(ser.encoding(), member_size, ext) ||
7271  !ser.write_parameter_id(it->first, member_size, must_understand)) {
7272  return false;
7273  }
7274  }
7275  return data_impl->serialize_i(ser, ext);
7276 }
7277 
7278 // Serialize struct member whose type is basic or compatible with a basic type,
7279 // that are enum and bitmask types.
7281  const DCPS::Encoding& encoding, size_t& size, DDS::MemberId id,
7282  const DDS::DynamicType_var& member_type, bool optional,
7283  DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const
7284 {
7285  const TypeKind member_tk = member_type->get_kind();
7286  const_single_iterator single_it = single_map_.find(id);
7287  const_complex_iterator complex_it = complex_map_.find(id);
7288  if (single_it == single_map_.end() && complex_it == complex_map_.end()) {
7289  if (optional) {
7290  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7291  primitive_serialized_size_boolean(encoding, size);
7292  }
7293  return true;
7294  }
7295  if (extensibility == DDS::MUTABLE) {
7296  serialized_size_parameter_id(encoding, size, mutable_running_total);
7297  }
7298  if (is_basic(member_tk)) {
7299  return serialized_size_basic_member_default_value(encoding, size, member_tk);
7300  } else if (member_tk == TK_ENUM) {
7301  return serialized_size_enum(encoding, size, member_type);
7302  } else { // Bitmask
7303  return serialized_size_bitmask(encoding, size, member_type);
7304  }
7305  }
7306 
7307  if (single_it != single_map_.end()) {
7308  return serialized_size_single_aggregated_member_xcdr2(encoding, size, single_it, member_type,
7309  optional, extensibility, mutable_running_total);
7310  }
7311  return serialized_size_complex_aggregated_member_xcdr2(encoding, size, complex_it, optional,
7312  extensibility, mutable_running_total,
7314 }
7315 
7317  DDS::MemberId id, const DDS::DynamicType_var& member_type, bool optional,
7318  bool must_understand, DDS::ExtensibilityKind extensibility) const
7319 {
7320  const TypeKind member_tk = member_type->get_kind();
7321  const DCPS::Encoding& encoding = ser.encoding();
7322  const_single_iterator single_it = single_map_.find(id);
7323  const_complex_iterator complex_it = complex_map_.find(id);
7324  if (single_it == single_map_.end() && complex_it == complex_map_.end()) {
7325  if (optional) {
7326  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7327  return ser << ACE_OutputCDR::from_boolean(false);
7328  }
7329  return true;
7330  }
7331  if (extensibility == DDS::MUTABLE) {
7332  size_t member_size = 0;
7333  if (is_basic(member_tk)) {
7334  serialized_size_basic_member_default_value(encoding, member_size, member_tk);
7335  } else if (member_tk == TK_ENUM) {
7336  serialized_size_enum(encoding, member_size, member_type);
7337  } else if (member_tk == TK_BITMASK) {
7338  serialized_size_bitmask(encoding, member_size, member_type);
7339  } else {
7340  return false;
7341  }
7342  if (!ser.write_parameter_id(id, member_size, must_understand)) {
7343  return false;
7344  }
7345  }
7346  if (is_basic(member_tk)) {
7347  return serialize_basic_member_default_value(ser, member_tk);
7348  } else if (member_tk == TK_ENUM) {
7349  return serialize_enum_default_value(ser, member_type);
7350  } else if (member_tk == TK_BITMASK) {
7351  return serialize_bitmask_default_value(ser, member_type);
7352  }
7353  return false;
7354  }
7355 
7356  if (single_it != single_map_.end()) {
7357  return serialize_single_aggregated_member_xcdr2(ser, single_it, member_type, optional,
7358  must_understand, extensibility);
7359  }
7360  return serialize_complex_aggregated_member_xcdr2(ser, complex_it, optional,
7361  must_understand, extensibility,
7363 }
7364 
7366  const DCPS::Encoding& encoding, size_t& size, TypeKind elem_tk) const
7367 {
7368  // Zero-length sequence
7369  if (!is_primitive(elem_tk)) {
7370  serialized_size_delimiter(encoding, size);
7371  }
7372  primitive_serialized_size_ulong(encoding, size);
7373 }
7374 
7376  TypeKind elem_tk) const
7377 {
7378  // Zero-length sequence
7379  const DCPS::Encoding& encoding = ser.encoding();
7380  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2 && !is_primitive(elem_tk)) {
7381  if (!ser.write_delimiter(2 * DCPS::uint32_cdr_size)) {
7382  return false;
7383  }
7384  }
7385  return ser << static_cast<CORBA::ULong>(0);
7386 }
7387 
7389  size_t& size, const_sequence_iterator it) const
7390 {
7391  switch (it->second.elem_kind_) {
7392  case TK_INT32: {
7393  const DDS::Int32Seq& seq = it->second.get<DDS::Int32Seq>();
7394  serialized_size(encoding, size, seq);
7395  return true;
7396  }
7397  case TK_UINT32: {
7398  const DDS::UInt32Seq& seq = it->second.get<DDS::UInt32Seq>();
7399  serialized_size(encoding, size, seq);
7400  return true;
7401  }
7402  case TK_INT8: {
7403  const DDS::Int8Seq& seq = it->second.get<DDS::Int8Seq>();
7404  serialized_size(encoding, size, seq);
7405  return true;
7406  }
7407  case TK_UINT8: {
7408  const DDS::UInt8Seq& seq = it->second.get<DDS::UInt8Seq>();
7409  serialized_size(encoding, size, seq);
7410  return true;
7411  }
7412  case TK_INT16: {
7413  const DDS::Int16Seq& seq = it->second.get<DDS::Int16Seq>();
7414  serialized_size(encoding, size, seq);
7415  return true;
7416  }
7417  case TK_UINT16: {
7418  const DDS::UInt16Seq& seq = it->second.get<DDS::UInt16Seq>();
7419  serialized_size(encoding, size, seq);
7420  return true;
7421  }
7422  case TK_INT64: {
7423  const DDS::Int64Seq& seq = it->second.get<DDS::Int64Seq>();
7424  serialized_size(encoding, size, seq);
7425  return true;
7426  }
7427  case TK_UINT64: {
7428  const DDS::UInt64Seq& seq = it->second.get<DDS::UInt64Seq>();
7429  serialized_size(encoding, size, seq);
7430  return true;
7431  }
7432  case TK_FLOAT32: {
7433  const DDS::Float32Seq& seq = it->second.get<DDS::Float32Seq>();
7434  serialized_size(encoding, size, seq);
7435  return true;
7436  }
7437  case TK_FLOAT64: {
7438  const DDS::Float64Seq& seq = it->second.get<DDS::Float64Seq>();
7439  serialized_size(encoding, size, seq);
7440  return true;
7441  }
7442  case TK_FLOAT128: {
7443  const DDS::Float128Seq& seq = it->second.get<DDS::Float128Seq>();
7444  serialized_size(encoding, size, seq);
7445  return true;
7446  }
7447  case TK_CHAR8: {
7448  const DDS::CharSeq& seq = it->second.get<DDS::CharSeq>();
7449  serialized_size(encoding, size, seq);
7450  return true;
7451  }
7452  case TK_BYTE: {
7453  const DDS::ByteSeq& seq = it->second.get<DDS::ByteSeq>();
7454  serialized_size(encoding, size, seq);
7455  return true;
7456  }
7457  case TK_BOOLEAN: {
7458  const DDS::BooleanSeq& seq = it->second.get<DDS::BooleanSeq>();
7459  serialized_size(encoding, size, seq);
7460  return true;
7461  }
7462  case TK_STRING8: {
7463  const DDS::StringSeq& seq = it->second.get<DDS::StringSeq>();
7464  serialized_size(encoding, size, seq);
7465  return true;
7466  }
7467 #ifdef DDS_HAS_WCHAR
7468  case TK_CHAR16: {
7469  const DDS::WcharSeq& seq = it->second.get<DDS::WcharSeq>();
7470  serialized_size(encoding, size, seq);
7471  return true;
7472  }
7473  case TK_STRING16: {
7474  const DDS::WstringSeq& seq = it->second.get<DDS::WstringSeq>();
7475  serialized_size(encoding, size, seq);
7476  return true;
7477  }
7478 #endif
7479  }
7480  return false;
7481 }
7482 
7484  const_sequence_iterator it) const
7485 {
7486  switch (it->second.elem_kind_) {
7487  case TK_INT32: {
7488  const DDS::Int32Seq& seq = it->second.get<DDS::Int32Seq>();
7489  return ser << seq;
7490  }
7491  case TK_UINT32: {
7492  const DDS::UInt32Seq& seq = it->second.get<DDS::UInt32Seq>();
7493  return ser << seq;
7494  }
7495  case TK_INT8: {
7496  const DDS::Int8Seq& seq = it->second.get<DDS::Int8Seq>();
7497  return ser << seq;
7498  }
7499  case TK_UINT8: {
7500  const DDS::UInt8Seq& seq = it->second.get<DDS::UInt8Seq>();
7501  return ser << seq;
7502  }
7503  case TK_INT16: {
7504  const DDS::Int16Seq& seq = it->second.get<DDS::Int16Seq>();
7505  return ser << seq;
7506  }
7507  case TK_UINT16: {
7508  const DDS::UInt16Seq& seq = it->second.get<DDS::UInt16Seq>();
7509  return ser << seq;
7510  }
7511  case TK_INT64: {
7512  const DDS::Int64Seq& seq = it->second.get<DDS::Int64Seq>();
7513  return ser << seq;
7514  }
7515  case TK_UINT64: {
7516  const DDS::UInt64Seq& seq = it->second.get<DDS::UInt64Seq>();
7517  return ser << seq;
7518  }
7519  case TK_FLOAT32: {
7520  const DDS::Float32Seq& seq = it->second.get<DDS::Float32Seq>();
7521  return ser << seq;
7522  }
7523  case TK_FLOAT64: {
7524  const DDS::Float64Seq& seq = it->second.get<DDS::Float64Seq>();
7525  return ser << seq;
7526  }
7527  case TK_FLOAT128: {
7528  const DDS::Float128Seq& seq = it->second.get<DDS::Float128Seq>();
7529  return ser << seq;
7530  }
7531  case TK_CHAR8: {
7532  const DDS::CharSeq& seq = it->second.get<DDS::CharSeq>();
7533  return ser << seq;
7534  }
7535  case TK_BYTE: {
7536  const DDS::ByteSeq& seq = it->second.get<DDS::ByteSeq>();
7537  return ser << seq;
7538  }
7539  case TK_BOOLEAN: {
7540  const DDS::BooleanSeq& seq = it->second.get<DDS::BooleanSeq>();
7541  return ser << seq;
7542  }
7543  case TK_STRING8: {
7544  const DDS::StringSeq& seq = it->second.get<DDS::StringSeq>();
7545  return ser << seq;
7546  }
7547 #ifdef DDS_HAS_WCHAR
7548  case TK_CHAR16: {
7549  const DDS::WcharSeq& seq = it->second.get<DDS::WcharSeq>();
7550  return ser << seq;
7551  }
7552  case TK_STRING16: {
7553  const DDS::WstringSeq& seq = it->second.get<DDS::WstringSeq>();
7554  return ser << seq;
7555  }
7556 #endif
7557  }
7558  return false;
7559 }
7560 
7562  const DCPS::Encoding& encoding, size_t& size, const_sequence_iterator it) const
7563 {
7564  switch (it->second.elem_kind_) {
7565  case TK_INT8: {
7566  const DDS::Int8Seq& seq = it->second.get<DDS::Int8Seq>();
7567  serialized_size_enum_sequence(encoding, size, seq);
7568  return true;
7569  }
7570  case TK_INT16: {
7571  const DDS::Int16Seq& seq = it->second.get<DDS::Int16Seq>();
7572  serialized_size_enum_sequence(encoding, size, seq);
7573  return true;
7574  }
7575  case TK_INT32: {
7576  const DDS::Int32Seq& seq = it->second.get<DDS::Int32Seq>();
7577  serialized_size_enum_sequence(encoding, size, seq);
7578  return true;
7579  }
7580  }
7581  return false;
7582 }
7583 
7585  DCPS::Serializer& ser, const_sequence_iterator it) const
7586 {
7587  switch (it->second.elem_kind_) {
7588  case TK_INT8: {
7589  const DDS::Int8Seq& seq = it->second.get<DDS::Int8Seq>();
7590  return serialize_enum_sequence_as_ints_i(ser, seq);
7591  }
7592  case TK_INT16: {
7593  const DDS::Int16Seq& seq = it->second.get<DDS::Int16Seq>();
7594  return serialize_enum_sequence_as_ints_i(ser, seq);
7595  }
7596  case TK_INT32: {
7597  const DDS::Int32Seq& seq = it->second.get<DDS::Int32Seq>();
7598  return serialize_enum_sequence_as_ints_i(ser, seq);
7599  }
7600  }
7601  return false;
7602 }
7603 
7605  const DCPS::Encoding& encoding, size_t& size, const_sequence_iterator it) const
7606 {
7607  switch (it->second.elem_kind_) {
7608  case TK_UINT8: {
7609  const DDS::UInt8Seq& seq = it->second.get<DDS::UInt8Seq>();
7610  serialized_size_bitmask_sequence(encoding, size, seq);
7611  return true;
7612  }
7613  case TK_UINT16: {
7614  const DDS::UInt16Seq& seq = it->second.get<DDS::UInt16Seq>();
7615  serialized_size_bitmask_sequence(encoding, size, seq);
7616  return true;
7617  }
7618  case TK_UINT32: {
7619  const DDS::UInt32Seq& seq = it->second.get<DDS::UInt32Seq>();
7620  serialized_size_bitmask_sequence(encoding, size, seq);
7621  return true;
7622  }
7623  case TK_UINT64: {
7624  const DDS::UInt64Seq& seq = it->second.get<DDS::UInt64Seq>();
7625  serialized_size_bitmask_sequence(encoding, size, seq);
7626  return true;
7627  }
7628  }
7629  return false;
7630 }
7631 
7633  const_sequence_iterator it) const
7634 {
7635  switch (it->second.elem_kind_) {
7636  case TK_UINT8: {
7637  const DDS::UInt8Seq& seq = it->second.get<DDS::UInt8Seq>();
7638  return serialize_bitmask_sequence_as_uints_i(ser, seq);
7639  }
7640  case TK_UINT16: {
7641  const DDS::UInt16Seq& seq = it->second.get<DDS::UInt16Seq>();
7642  return serialize_bitmask_sequence_as_uints_i(ser, seq);
7643  }
7644  case TK_UINT32: {
7645  const DDS::UInt32Seq& seq = it->second.get<DDS::UInt32Seq>();
7646  return serialize_bitmask_sequence_as_uints_i(ser, seq);
7647  }
7648  case TK_UINT64: {
7649  const DDS::UInt64Seq& seq = it->second.get<DDS::UInt64Seq>();
7650  return serialize_bitmask_sequence_as_uints_i(ser, seq);
7651  }
7652  }
7653  return false;
7654 }
7655 
7656 // Serialize an aggregated member stored in the sequence map.
7657 // The member type is sequence of basic or enum or bitmask type.
7659  const DCPS::Encoding& encoding, size_t& size, const_sequence_iterator it, TypeKind elem_tk,
7660  bool optional, DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const
7661 {
7662  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7663  primitive_serialized_size_boolean(encoding, size);
7664  } else if (extensibility == DDS::MUTABLE) {
7665  serialized_size_parameter_id(encoding, size, mutable_running_total);
7666  }
7667  if (is_basic(elem_tk)) {
7668  serialized_size_basic_sequence(encoding, size, it);
7669  } else if (elem_tk == TK_ENUM) {
7670  serialized_size_enum_sequence(encoding, size, it);
7671  } else { // Bitmask
7672  serialized_size_bitmask_sequence(encoding, size, it);
7673  }
7674 }
7675 
7677  const_sequence_iterator it, TypeKind elem_tk, bool optional,
7678  bool must_understand, DDS::ExtensibilityKind extensibility) const
7679 {
7680  if (optional && (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE)) {
7681  if (!(ser << ACE_OutputCDR::from_boolean(true))) {
7682  return false;
7683  }
7684  } else if (extensibility == DDS::MUTABLE) {
7685  const DCPS::Encoding& encoding = ser.encoding();
7686  size_t member_size = 0;
7687  if (is_basic(elem_tk)) {
7688  serialized_size_basic_sequence(encoding, member_size, it);
7689  } else if (elem_tk == TK_ENUM) {
7690  serialized_size_enum_sequence(encoding, member_size, it);
7691  } else if (elem_tk == TK_BITMASK) {
7692  serialized_size_bitmask_sequence(encoding, member_size, it);
7693  } else {
7694  return false;
7695  }
7696  if (!ser.write_parameter_id(it->first, member_size, must_understand)) {
7697  return false;
7698  }
7699  }
7700  if (is_basic(elem_tk)) {
7701  return serialize_basic_sequence(ser, it);
7702  } else if (elem_tk == TK_ENUM) {
7703  return serialize_enum_sequence(ser, it);
7704  } else if (elem_tk == TK_BITMASK) {
7705  return serialize_bitmask_sequence(ser, it);
7706  }
7707  return false;
7708 }
7709 
7710 // Serialize a struct member whose type is sequence of basic type or enum or bitmask.
7712  const DCPS::Encoding& encoding, size_t& size, DDS::MemberId id, TypeKind elem_tk,
7713  bool optional, DDS::ExtensibilityKind extensibility, size_t& mutable_running_total,
7714  DCPS::Sample::Extent) const
7715 {
7716  const_sequence_iterator seq_it = sequence_map_.find(id);
7717  const_complex_iterator complex_it = complex_map_.find(id);
7718  if (seq_it == sequence_map_.end() && complex_it == complex_map_.end()) {
7719  if (optional) {
7720  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7721  primitive_serialized_size_boolean(encoding, size);
7722  }
7723  return true;
7724  }
7725  if (extensibility == DDS::MUTABLE) {
7726  serialized_size_parameter_id(encoding, size, mutable_running_total);
7727  }
7728  serialized_size_sequence_member_default_value(encoding, size, elem_tk);
7729  return true;
7730  }
7731  if (seq_it != sequence_map_.end()) {
7732  serialized_size_sequence_aggregated_member_xcdr2(encoding, size, seq_it, elem_tk, optional,
7733  extensibility, mutable_running_total);
7734  return true;
7735  }
7736  return serialized_size_complex_aggregated_member_xcdr2(encoding, size, complex_it, optional,
7737  extensibility, mutable_running_total,
7739 }
7740 
7742  DDS::MemberId id, TypeKind elem_tk, bool optional,
7743  bool must_understand, DDS::ExtensibilityKind extensibility,
7744  DCPS::Sample::Extent ext) const
7745 {
7746  const DCPS::Encoding& encoding = ser.encoding();
7747  const_sequence_iterator seq_it = sequence_map_.find(id);
7748  const_complex_iterator complex_it = complex_map_.find(id);
7749  if (seq_it == sequence_map_.end() && complex_it == complex_map_.end()) {
7750  if (optional) {
7751  if (extensibility == DDS::FINAL || extensibility == DDS::APPENDABLE) {
7752  return ser << ACE_OutputCDR::from_boolean(false);
7753  }
7754  return true;
7755  }
7756  if (extensibility == DDS::MUTABLE) {
7757  size_t member_size = 0;
7758  serialized_size_sequence_member_default_value(encoding, member_size, elem_tk);
7759  if (!ser.write_parameter_id(id, member_size, must_understand)) {
7760  return false;
7761  }
7762  }
7763  return serialize_sequence_member_default_value(ser, elem_tk);
7764  }
7765 
7766  if (seq_it != sequence_map_.end()) {
7767  return serialize_sequence_aggregated_member_xcdr2(ser, seq_it, elem_tk, optional,
7768  must_understand, extensibility);
7769  }
7770  return serialize_complex_aggregated_member_xcdr2(ser, complex_it, optional,
7771  must_understand, extensibility, ext);
7772 }
7773 
7775  const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const
7776 {
7777  const DDS::ExtensibilityKind extensibility = type_desc_->extensibility_kind();
7779 
7780  // Delimiter
7781  if (extensibility == DDS::APPENDABLE || extensibility == DDS::MUTABLE) {
7782  serialized_size_delimiter(encoding, size);
7783  }
7784 
7785  // Members
7786  size_t mutable_running_total = 0;
7787  const CORBA::ULong member_count = type_->get_member_count();
7788  for (CORBA::ULong i = 0; i < member_count; ++i) {
7789  DDS::DynamicTypeMember_var dtm;
7790  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
7791  return false;
7792  }
7793  DDS::MemberDescriptor_var md;
7794  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
7795  return false;
7796  }
7797 
7798  if (exclude_member(ext, md->is_key(), struct_has_explicit_keys)) {
7799  continue;
7800  }
7801 
7802  const DDS::MemberId id = md->id();
7803  const CORBA::Boolean optional = md->is_optional();
7804  const DDS::DynamicType_var member_type = get_base_type(md->type());
7805  const TypeKind member_tk = member_type->get_kind();
7806 
7807  if (is_basic(member_tk) || member_tk == TK_ENUM || member_tk == TK_BITMASK) {
7808  if (!serialized_size_basic_struct_member_xcdr2(encoding, size, id, member_type, optional,
7809  extensibility, mutable_running_total)) {
7810  return false;
7811  }
7812  continue;
7813  } else if (member_tk == TK_SEQUENCE) {
7814  DDS::TypeDescriptor_var member_td;
7815  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
7816  return false;
7817  }
7818  const DDS::DynamicType_var elem_type = get_base_type(member_td->element_type());
7819  const TypeKind elem_tk = elem_type->get_kind();
7820  if (is_basic(elem_tk) || elem_tk == TK_ENUM || elem_tk == TK_BITMASK) {
7821  if (!serialized_size_sequence_struct_member_xcdr2(encoding, size, id, elem_tk, optional,
7822  extensibility, mutable_running_total, nested(ext))) {
7823  return false;
7824  }
7825  continue;
7826  }
7827  }
7828 
7829  const_complex_iterator it = complex_map_.find(id);
7830  if (it != complex_map_.end()) {
7831  if (!serialized_size_complex_aggregated_member_xcdr2(encoding, size, it, optional,
7832  extensibility, mutable_running_total,
7833  nested(ext))) {
7834  return false;
7835  }
7836  } else if (!serialized_size_complex_aggregated_member_xcdr2_default(encoding, size, member_type, optional,
7837  extensibility, mutable_running_total,
7838  nested(ext))) {
7839  return false;
7840  }
7841  }
7842 
7843  if (extensibility == DDS::MUTABLE) {
7844  serialized_size_list_end_parameter_id(encoding, size, mutable_running_total);
7845  }
7846  return true;
7847 }
7848 
7850 {
7851  const DDS::ExtensibilityKind extensibility = type_desc_->extensibility_kind();
7853 
7854  // Delimiter
7855  const DCPS::Encoding& encoding = ser.encoding();
7856  size_t total_size = 0;
7857  if (extensibility == DDS::APPENDABLE || extensibility == DDS::MUTABLE) {
7858  if (!data_->serialized_size_i(encoding, total_size, ext) || !ser.write_delimiter(total_size)) {
7859  return false;
7860  }
7861  }
7862 
7863  // Members
7864  const CORBA::ULong member_count = type_->get_member_count();
7865  for (CORBA::ULong i = 0; i < member_count; ++i) {
7866  DDS::DynamicTypeMember_var dtm;
7867  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
7868  return false;
7869  }
7870  DDS::MemberDescriptor_var md;
7871  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
7872  return false;
7873  }
7874 
7875  if (exclude_member(ext, md->is_key(), struct_has_explicit_keys)) {
7876  continue;
7877  }
7878 
7879  const DDS::MemberId id = md->id();
7880  const CORBA::Boolean optional = md->is_optional();
7881  const CORBA::Boolean must_understand = md->is_must_understand() || md->is_key();
7882  const DDS::DynamicType_var member_type = get_base_type(md->type());
7883  const TypeKind member_tk = member_type->get_kind();
7884 
7885  if (is_basic(member_tk) || member_tk == TK_ENUM || member_tk == TK_BITMASK) {
7886  if (!serialize_basic_struct_member_xcdr2(ser, id, member_type, optional,
7887  must_understand, extensibility)) {
7888  return false;
7889  }
7890  continue;
7891  } else if (member_tk == TK_SEQUENCE) {
7892  DDS::TypeDescriptor_var member_td;
7893  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
7894  return false;
7895  }
7896  const DDS::DynamicType_var elem_type = get_base_type(member_td->element_type());
7897  const TypeKind elem_tk = elem_type->get_kind();
7898  if (is_basic(elem_tk) || elem_tk == TK_ENUM || elem_tk == TK_BITMASK) {
7899  if (!serialize_sequence_struct_member_xcdr2(ser, id, elem_tk, optional,
7900  must_understand, extensibility, nested(ext))) {
7901  return false;
7902  }
7903  continue;
7904  }
7905  }
7906 
7907  const_complex_iterator it = complex_map_.find(id);
7908  if (it != complex_map_.end()) {
7909  if (!serialize_complex_aggregated_member_xcdr2(ser, it, optional,
7910  must_understand, extensibility, nested(ext))) {
7911  return false;
7912  }
7913  } else if (!serialize_complex_aggregated_member_xcdr2_default(ser, id, member_type, optional,
7914  must_understand, extensibility, nested(ext))) {
7915  return false;
7916  }
7917  }
7918  return true;
7919 }
7920 
7922  const DCPS::Encoding& /*encoding*/, size_t& /*size*/, DCPS::Sample::Extent /*ext*/) const
7923 {
7924  // TODO: Support Final & Mutable extensibility?
7925  return false;
7926 }
7927 
7929 {
7930  // TODO: Support only Final & Mutable extensibility?
7931  return false;
7932 }
7933 
7935  size_t& size,
7936  DCPS::Sample::Extent ext) const
7937 {
7938  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
7939  return serialized_size_structure_xcdr2(encoding, size, ext);
7940  } else if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_1) {
7941  return serialized_size_structure_xcdr1(encoding, size, ext);
7942  }
7943  return false;
7944 }
7945 
7947 {
7948  const DCPS::Encoding& encoding = ser.encoding();
7949  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
7950  return serialize_structure_xcdr2(ser, ext);
7951  } else if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_1) {
7952  return serialize_structure_xcdr1(ser, ext);
7953  }
7954  return false;
7955 }
7956 
7957 // Set discriminator to the default value of the corresponding type.
7959  CORBA::Long& value, const DDS::DynamicType_var& disc_type) const
7960 {
7961  const TypeKind disc_tk = disc_type->get_kind();
7962  switch (disc_tk) {
7963  case TK_BOOLEAN: {
7964  ACE_OutputCDR::from_boolean val(false);
7965  set_default_basic_value(val);
7966  value = static_cast<CORBA::Long>(val.val_);
7967  return true;
7968  }
7969  case TK_BYTE: {
7970  ACE_OutputCDR::from_octet val(0x00);
7971  set_default_basic_value(val);
7972  value = static_cast<CORBA::Long>(val.val_);
7973  return true;
7974  }
7975  case TK_CHAR8: {
7976  ACE_OutputCDR::from_char val('\0');
7977  set_default_basic_value(val);
7978  value = static_cast<CORBA::Long>(val.val_);
7979  return true;
7980  }
7981 #ifdef DDS_HAS_WCHAR
7982  case TK_CHAR16: {
7984  set_default_basic_value(val);
7985  value = static_cast<CORBA::Long>(val.val_);
7986  return true;
7987  }
7988 #endif
7989  case TK_INT8: {
7990  ACE_OutputCDR::from_int8 val(0);
7991  set_default_basic_value(val);
7992  value = static_cast<CORBA::Long>(val.val_);
7993  return true;
7994  }
7995  case TK_UINT8: {
7997  set_default_basic_value(val);
7998  value = static_cast<CORBA::Long>(val.val_);
7999  return true;
8000  }
8001  case TK_INT16: {
8002  CORBA::Short val;
8003  set_default_basic_value(val);
8004  value = static_cast<CORBA::Long>(val);
8005  return true;
8006  }
8007  case TK_UINT16: {
8008  CORBA::UShort val;
8009  set_default_basic_value(val);
8010  value = static_cast<CORBA::Long>(val);
8011  return true;
8012  }
8013  case TK_INT32: {
8014  set_default_basic_value(value);
8015  return true;
8016  }
8017  case TK_UINT32: {
8018  CORBA::ULong val;
8019  set_default_basic_value(val);
8020  value = static_cast<CORBA::Long>(val);
8021  return true;
8022  }
8023  case TK_INT64: {
8024  CORBA::LongLong val;
8025  set_default_basic_value(val);
8026  value = static_cast<CORBA::Long>(val);
8027  return true;
8028  }
8029  case TK_UINT64: {
8030  CORBA::ULongLong val;
8031  set_default_basic_value(val);
8032  value = static_cast<CORBA::Long>(val);
8033  return true;
8034  }
8035  case TK_ENUM: {
8036  return set_default_enum_value(disc_type, value);
8037  }
8038  }
8039  return false;
8040 }
8041 
8042 // Get discriminator value from the data container. The discriminator data must present
8043 // in either single map or complex map.
8045  CORBA::Long& value, const_single_iterator single_it, const_complex_iterator complex_it,
8046  const DDS::DynamicType_var& disc_type) const
8047 {
8048  if (single_it != single_map_.end()) {
8049  data_->read_discriminator(value, disc_type, single_it);
8050  } else { // Find in complex map
8051  const DynamicDataImpl* dd_impl = dynamic_cast<const DynamicDataImpl*>(complex_it->second.in());
8052  if (!dd_impl) {
8053  return false;
8054  }
8055  const_single_iterator it = dd_impl->container_.single_map_.find(MEMBER_ID_INVALID);
8056  if (it != dd_impl->container_.single_map_.end()) {
8057  data_->read_discriminator(value, disc_type, it);
8058  } else {
8059  return set_default_discriminator_value(value, disc_type);
8060  }
8061  }
8062  return true;
8063 }
8064 
8066  const DCPS::Encoding& encoding, size_t& size, const DDS::DynamicType_var& disc_type,
8067  DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const
8068 {
8069  if (extensibility == DDS::MUTABLE) {
8070  serialized_size_parameter_id(encoding, size, mutable_running_total);
8071  }
8072  const TypeKind disc_tk = disc_type->get_kind();
8073  if (is_primitive(disc_tk)) {
8074  return serialized_size_primitive_member(encoding, size, disc_tk);
8075  }
8076  return serialized_size_enum(encoding, size, disc_type);
8077 }
8078 
8080  DCPS::Serializer& ser, CORBA::Long value, const DDS::DynamicType_var& disc_type,
8082 {
8083  const DCPS::Encoding& encoding = ser.encoding();
8084  const TypeKind disc_tk = disc_type->get_kind();
8085  if (extensibility == DDS::MUTABLE) {
8086  size_t disc_size = 0;
8087  if (is_primitive(disc_tk)) {
8088  serialized_size_primitive_member(encoding, disc_size, disc_tk);
8089  } else {
8090  serialized_size_enum(encoding, disc_size, disc_type);
8091  }
8092  // Use member Id 0 for discriminator?
8093  if (!ser.write_parameter_id(0, disc_size, false)) {
8094  return false;
8095  }
8096  }
8097 
8098  switch (disc_tk) {
8099  case TK_BOOLEAN:
8100  return ser << static_cast<CORBA::Boolean>(value);
8101  case TK_BYTE:
8102  return ser << static_cast<CORBA::Octet>(value);
8103  case TK_CHAR8:
8104  return ser << static_cast<CORBA::Char>(value);
8105 #ifdef DDS_HAS_WCHAR
8106  case TK_CHAR16:
8107  return ser << static_cast<CORBA::WChar>(value);
8108 #endif
8109  case TK_INT8:
8110  return ser << static_cast<CORBA::Int8>(value);
8111  case TK_UINT8:
8112  return ser << static_cast<CORBA::UInt8>(value);
8113  case TK_INT16:
8114  return ser << static_cast<CORBA::Short>(value);
8115  case TK_UINT16:
8116  return ser << static_cast<CORBA::UShort>(value);
8117  case TK_INT32:
8118  return ser << value;
8119  case TK_UINT32:
8120  return ser << static_cast<CORBA::ULong>(value);
8121  case TK_INT64:
8122  return ser << static_cast<CORBA::LongLong>(value);
8123  case TK_UINT64:
8124  return ser << static_cast<CORBA::ULongLong>(value);
8125  case TK_ENUM: {
8126  DDS::TypeDescriptor_var td;
8127  if (disc_type->get_descriptor(td) != DDS::RETCODE_OK) {
8128  return false;
8129  }
8130  const CORBA::ULong bitbound = td->bound()[0];
8131  if (bitbound >= 1 && bitbound <= 8) {
8132  return ser << static_cast<CORBA::Int8>(value);
8133  } else if (bitbound >= 9 && bitbound <= 16) {
8134  return ser << static_cast<CORBA::Short>(value);
8135  } else if (bitbound >= 17 && bitbound <= 32) {
8136  return ser << value;
8137  }
8138  }
8139  }
8140  return false;
8141 }
8142 
8144  const DCPS::Encoding& encoding, size_t& size, DDS::MemberId selected_id,
8145  DDS::ExtensibilityKind extensibility, size_t& mutable_running_total) const
8146 {
8147  DDS::DynamicTypeMember_var selected_dtm;
8148  if (type_->get_member(selected_dtm, selected_id) != DDS::RETCODE_OK) {
8149  return false;
8150  }
8151  DDS::MemberDescriptor_var selected_md;
8152  if (selected_dtm->get_descriptor(selected_md) != DDS::RETCODE_OK) {
8153  return false;
8154  }
8155  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
8156  const bool optional = selected_md->is_optional();
8157 
8158  const_single_iterator single_it = single_map_.find(selected_id);
8159  if (single_it != single_map_.end()) {
8160  return serialized_size_single_aggregated_member_xcdr2(encoding, size, single_it, selected_type, optional,
8161  extensibility, mutable_running_total);
8162  }
8163 
8164  const_sequence_iterator seq_it = sequence_map_.find(selected_id);
8165  if (seq_it != sequence_map_.end()) {
8166  DDS::TypeDescriptor_var selected_td;
8167  if (selected_type->get_descriptor(selected_td) != DDS::RETCODE_OK) {
8168  return false;
8169  }
8170  const TypeKind elem_tk = get_base_type(selected_td->element_type())->get_kind();
8171  serialized_size_sequence_aggregated_member_xcdr2(encoding, size, seq_it, elem_tk, optional,
8172  extensibility, mutable_running_total);
8173  return true;
8174  }
8175 
8176  const_complex_iterator complex_it = complex_map_.find(selected_id);
8177  if (complex_it != complex_map_.end()) {
8178  return serialized_size_complex_aggregated_member_xcdr2(encoding, size, complex_it, optional,
8179  extensibility, mutable_running_total,
8181  }
8182  return false;
8183 }
8184 
8187 {
8188  DDS::DynamicTypeMember_var selected_dtm;
8189  if (type_->get_member(selected_dtm, selected_id) != DDS::RETCODE_OK) {
8190  return false;
8191  }
8192  DDS::MemberDescriptor_var selected_md;
8193  if (selected_dtm->get_descriptor(selected_md) != DDS::RETCODE_OK) {
8194  return false;
8195  }
8196  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
8197  const bool optional = selected_md->is_optional();
8198  const bool must_understand = selected_md->is_must_understand();
8199 
8200  const_single_iterator single_it = single_map_.find(selected_id);
8201  if (single_it != single_map_.end()) {
8202  return serialize_single_aggregated_member_xcdr2(ser, single_it, selected_type, optional,
8203  must_understand, extensibility);
8204  }
8205 
8206  const_sequence_iterator seq_it = sequence_map_.find(selected_id);
8207  if (seq_it != sequence_map_.end()) {
8208  DDS::TypeDescriptor_var selected_td;
8209  if (selected_type->get_descriptor(selected_td) != DDS::RETCODE_OK) {
8210  return false;
8211  }
8212  const TypeKind elem_tk = get_base_type(selected_td->element_type())->get_kind();
8213  return serialize_sequence_aggregated_member_xcdr2(ser, seq_it, elem_tk, optional,
8214  must_understand, extensibility);
8215  }
8216 
8217  const_complex_iterator complex_it = complex_map_.find(selected_id);
8218  if (complex_it != complex_map_.end()) {
8219  return serialize_complex_aggregated_member_xcdr2(ser, complex_it, optional,
8220  must_understand, extensibility,
8222  }
8223  return false;
8224 }
8225 
8227  size_t& size, DCPS::Sample::Extent ext) const
8228 {
8229  if (ext == DCPS::Sample::KeyOnly && !has_explicit_keys(type_)) {
8230  // nothing is serialized (not even a delimiter) for key-only serialization when there is no @key
8231  return true;
8232  }
8233 
8234  const DDS::ExtensibilityKind extensibility = type_desc_->extensibility_kind();
8235  if (extensibility == DDS::APPENDABLE || extensibility == DDS::MUTABLE) {
8236  serialized_size_delimiter(encoding, size);
8237  }
8238 
8239  size_t mutable_running_total = 0;
8240  DDS::DynamicType_var disc_type = get_base_type(type_desc_->discriminator_type());
8241  if (ext != DCPS::Sample::Full) {
8242  if (!serialized_size_discriminator_member_xcdr2(encoding, size, disc_type,
8243  extensibility, mutable_running_total)) {
8244  return false;
8245  }
8246  serialized_size_list_end_parameter_id(encoding, size, mutable_running_total);
8247  return true;
8248  }
8249 
8250  const_single_iterator single_it = single_map_.find(DISCRIMINATOR_ID);
8251  const_complex_iterator complex_it = complex_map_.find(DISCRIMINATOR_ID);
8252  const bool has_disc = single_it != single_map_.end() || complex_it != complex_map_.end();
8253  const DDS::MemberId selected_id = data_->find_selected_member();
8254 
8255  CORBA::Long disc_value;
8256  if (has_disc) {
8257  if (!get_discriminator_value(disc_value, single_it, complex_it, disc_type)) {
8258  return false;
8259  }
8260  } else if (!set_default_discriminator_value(disc_value, disc_type)) {
8261  return false;
8262  }
8263 
8264  if (selected_id == MEMBER_ID_INVALID) {
8265  bool found_selected_member = false;
8266  DDS::MemberDescriptor_var selected_md;
8267  const DDS::ReturnCode_t rc =
8268  data_->get_selected_union_branch(disc_value, found_selected_member, selected_md);
8269  if (rc != DDS::RETCODE_OK) {
8270  if (log_level >= LogLevel::Notice) {
8271  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::serialized_size_union_xcdr2:"
8272  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
8273  }
8274  return false;
8275  }
8276  if (!serialized_size_discriminator_member_xcdr2(encoding, size, disc_type,
8277  extensibility, mutable_running_total)) {
8278  return false;
8279  }
8280  if (ext == DCPS::Sample::KeyOnly) {
8281  return true;
8282  }
8283  if (found_selected_member) {
8284  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
8285  const bool optional = selected_md->is_optional();
8286  if (!serialized_size_complex_aggregated_member_xcdr2_default(encoding, size, selected_type, optional,
8287  extensibility, mutable_running_total,
8288  DCPS::Sample::Full)) {
8289  return false;
8290  }
8291  }
8292  serialized_size_list_end_parameter_id(encoding, size, mutable_running_total);
8293  return true;
8294  }
8295 
8296  if (!serialized_size_discriminator_member_xcdr2(encoding, size, disc_type,
8297  extensibility, mutable_running_total)) {
8298  return false;
8299  }
8300  if (ext != DCPS::Sample::KeyOnly) {
8301  if (!serialized_size_selected_member_xcdr2(
8302  encoding, size, selected_id, extensibility, mutable_running_total)) {
8303  return false;
8304  }
8305  }
8306  serialized_size_list_end_parameter_id(encoding, size, mutable_running_total);
8307  return true;
8308 }
8309 
8311 {
8312  if (ext == DCPS::Sample::KeyOnly && !has_explicit_keys(type_)) {
8313  // nothing is serialized (not even a delimiter) for key-only serialization when there is no @key
8314  return true;
8315  }
8316 
8317  const DDS::ExtensibilityKind extensibility = type_desc_->extensibility_kind();
8318 
8319  // Delimiter
8320  const DCPS::Encoding& encoding = ser.encoding();
8321  size_t total_size = 0;
8322  if (extensibility == DDS::APPENDABLE || extensibility == DDS::MUTABLE) {
8323  if (!data_->serialized_size_i(encoding, total_size, ext) || !ser.write_delimiter(total_size)) {
8324  return false;
8325  }
8326  }
8327 
8328  const_single_iterator single_it = single_map_.find(DISCRIMINATOR_ID);
8329  const_complex_iterator complex_it = complex_map_.find(DISCRIMINATOR_ID);
8330  const bool has_disc = single_it != single_map_.end() || complex_it != complex_map_.end();
8331  const DDS::MemberId selected_id = data_->find_selected_member();
8332  DDS::DynamicType_var disc_type = get_base_type(type_desc_->discriminator_type());
8333  const TypeKind disc_tk = disc_type->get_kind();
8334 
8335  // Read the discriminator value if the user already set it. Otherwise,
8336  // set it to the default value of the corresponding type.
8337  CORBA::Long disc_value;
8338  if (has_disc) {
8339  if (!get_discriminator_value(disc_value, single_it, complex_it, disc_type)) {
8340  return false;
8341  }
8342  } else if (!set_default_discriminator_value(disc_value, disc_type)) {
8343  return false;
8344  }
8345 
8346  if (selected_id == MEMBER_ID_INVALID) {
8347  // If the defined discriminator value selects a member, serialize the member with
8348  // its default value. Otherwise, serialize only the discriminator.
8349  bool found_selected_member = false;
8350  DDS::MemberDescriptor_var selected_md;
8351  const DDS::ReturnCode_t rc =
8352  data_->get_selected_union_branch(disc_value, found_selected_member, selected_md);
8353  if (rc != DDS::RETCODE_OK) {
8354  if (log_level >= LogLevel::Notice) {
8355  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::serialize_union_xcdr2:"
8356  " get_selected_union_branch failed: %C\n", retcode_to_string(rc)));
8357  }
8358  return false;
8359  }
8360  // Discriminator
8361  if (!serialize_discriminator_member_xcdr2(ser, disc_value, disc_type, extensibility)) {
8362  return false;
8363  }
8364  if (ext == DCPS::Sample::KeyOnly) {
8365  return true;
8366  }
8367  // Selected member
8368  if (found_selected_member) {
8369  DDS::DynamicType_var selected_type = get_base_type(selected_md->type());
8370  const DDS::MemberId id = selected_md->id();
8371  const bool optional = selected_md->is_optional();
8372  const bool must_understand = selected_md->is_must_understand();
8373  return serialize_complex_aggregated_member_xcdr2_default(ser, id, selected_type, optional,
8374  must_understand, extensibility,
8376  }
8377  return true;
8378  }
8379 
8380  // Both discriminator and a selected member exist in the data container.
8381  if (single_it != single_map_.end()) {
8382  if (extensibility == DDS::MUTABLE) {
8383  size_t disc_size = 0;
8384  if (is_primitive(disc_tk)) {
8385  serialized_size_primitive_member(encoding, disc_size, disc_tk);
8386  } else { // Enum is the only other type can be used for discriminator
8387  serialized_size_enum(encoding, disc_size, disc_type);
8388  }
8389  // Discriminator always has Id 0?
8390  if (!ser.write_parameter_id(0, disc_size, false)) {
8391  return false;
8392  }
8393  }
8394  if (!serialize_single_value(ser, single_it->second)) {
8395  return false;
8396  }
8397  } else {
8398  if (extensibility == DDS::MUTABLE) {
8399  size_t disc_size = 0;
8400  serialized_size_complex_member_i(encoding, disc_size, complex_it->first, DCPS::Sample::Full);
8401  if (!ser.write_parameter_id(0, disc_size, false)) {
8402  return false;
8403  }
8404  }
8405  if (!serialize_complex_member_i(ser, complex_it->first, DCPS::Sample::Full)) {
8406  return false;
8407  }
8408  }
8409  return ext == DCPS::Sample::KeyOnly ||
8410  serialize_selected_member_xcdr2(ser, selected_id, extensibility);
8411 }
8412 
8414  size_t& /*size*/, DCPS::Sample::Extent) const
8415 {
8416  // TODO:
8417  return false;
8418 }
8419 
8421 {
8422  // TODO:
8423  return false;
8424 }
8425 
8427  size_t& size,
8428  DCPS::Sample::Extent ext) const
8429 {
8430  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
8431  return serialized_size_union_xcdr2(encoding, size, ext);
8432  } else if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_1) {
8433  return serialized_size_union_xcdr1(encoding, size, ext);
8434  }
8435  return false;
8436 }
8437 
8439 {
8440  const DCPS::Encoding& encoding = ser.encoding();
8441  if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_2) {
8442  return serialize_union_xcdr2(ser, ext);
8443  } else if (encoding.xcdr_version() == DCPS::Encoding::XCDR_VERSION_1) {
8444  return serialize_union_xcdr1(ser, ext);
8445  }
8446  return false;
8447 }
8448 
8449 bool DynamicDataImpl::serialized_size_i(const DCPS::Encoding& encoding, size_t& size, DCPS::Sample::Extent ext) const
8450 {
8451  const TypeKind tk = type_->get_kind();
8452  switch (tk) {
8453  case TK_INT32:
8454  return primitive_serialized_size(encoding, size, CORBA::Long());
8455  case TK_UINT32:
8456  return primitive_serialized_size(encoding, size, CORBA::ULong());
8457  case TK_INT8:
8458  primitive_serialized_size_int8(encoding, size);
8459  return true;
8460  case TK_UINT8:
8461  primitive_serialized_size_uint8(encoding, size);
8462  return true;
8463  case TK_INT16:
8464  return primitive_serialized_size(encoding, size, CORBA::Short());
8465  case TK_UINT16:
8466  return primitive_serialized_size(encoding, size, CORBA::UShort());
8467  case TK_INT64:
8468  return primitive_serialized_size(encoding, size, CORBA::LongLong());
8469  case TK_UINT64:
8470  return primitive_serialized_size(encoding, size, CORBA::ULongLong());
8471  case TK_FLOAT32:
8472  return primitive_serialized_size(encoding, size, CORBA::Float());
8473  case TK_FLOAT64:
8474  return primitive_serialized_size(encoding, size, CORBA::Double());
8475  case TK_FLOAT128:
8476  return primitive_serialized_size(encoding, size, CORBA::LongDouble());
8477  case TK_CHAR8:
8478  primitive_serialized_size_char(encoding, size);
8479  return true;
8480 #ifdef DDS_HAS_WCHAR
8481  case TK_CHAR16:
8482  primitive_serialized_size_wchar(encoding, size);
8483  return true;
8484 #endif
8485  case TK_BYTE:
8486  primitive_serialized_size_octet(encoding, size);
8487  return true;
8488  case TK_BOOLEAN:
8489  primitive_serialized_size_boolean(encoding, size);
8490  return true;
8491  case TK_ENUM:
8492  return container_.serialized_size_enum(encoding, size, type_);
8493  case TK_BITMASK:
8494  return container_.serialized_size_bitmask(encoding, size, type_);
8495  case TK_STRING8:
8496  return container_.serialized_size_string(encoding, size);
8497 #ifdef DDS_HAS_WCHAR
8498  case TK_STRING16:
8499  return container_.serialized_size_wstring(encoding, size);
8500 #endif
8501  case TK_STRUCTURE:
8502  return container_.serialized_size_structure(encoding, size, ext);
8503  case TK_UNION:
8504  return container_.serialized_size_union(encoding, size, ext);
8505  case TK_SEQUENCE:
8506  return container_.serialized_size_sequence(encoding, size, ext);
8507  case TK_ARRAY:
8508  return container_.serialized_size_array(encoding, size, ext);
8509  case TK_MAP:
8510  if (log_level >= LogLevel::Notice) {
8511  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::serialized_size_i: Serialization of map types is not supported\n"));
8512  }
8513  }
8514  return false;
8515 }
8516 
8518 {
8519  const TypeKind tk = type_->get_kind();
8520  switch (tk) {
8521  case TK_INT32:
8523  case TK_UINT32:
8525  case TK_INT8:
8527  case TK_UINT8:
8528  return container_.serialize_primitive_value(ser, ACE_OutputCDR::from_uint8(CORBA::UInt8()));
8529  case TK_INT16:
8531  case TK_UINT16:
8533  case TK_INT64:
8535  case TK_UINT64:
8537  case TK_FLOAT32:
8539  case TK_FLOAT64:
8541  case TK_FLOAT128:
8543  case TK_CHAR8:
8545 #ifdef DDS_HAS_WCHAR
8546  case TK_CHAR16:
8547  return container_.serialize_primitive_value(ser, ACE_OutputCDR::from_wchar(CORBA::WChar()));
8548 #endif
8549  case TK_BYTE:
8551  case TK_BOOLEAN:
8553  case TK_ENUM:
8554  return container_.serialize_enum_value(ser);
8555  case TK_BITMASK:
8556  return container_.serialize_bitmask_value(ser);
8557  case TK_STRING8:
8558  return container_.serialize_string_value(ser);
8559 #ifdef DDS_HAS_WCHAR
8560  case TK_STRING16:
8561  return container_.serialize_wstring_value(ser);
8562 #endif
8563  case TK_STRUCTURE:
8564  return container_.serialize_structure(ser, ext);
8565  case TK_UNION:
8566  return container_.serialize_union(ser, ext);
8567  case TK_SEQUENCE:
8568  return container_.serialize_sequence(ser, ext);
8569  case TK_ARRAY:
8570  return container_.serialize_array(ser, ext);
8571  case TK_MAP:
8572  if (log_level >= LogLevel::Notice) {
8573  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataImpl::serialize_i: Serialization of map types is not supported\n"));
8574  }
8575  }
8576  return false;
8577 }
8578 
8579 } // namespace XTypes
8580 
8581 namespace DCPS {
8582 
8583 bool serialized_size(const Encoding& encoding, size_t& size, const XTypes::DynamicDataImpl& data)
8584 {
8585  return data.serialized_size_i(encoding, size, Sample::Full);
8586 }
8587 
8589 {
8590  return data.serialize_i(ser, Sample::Full);
8591 }
8592 
8594 {
8595  return key.value.serialized_size_i(encoding, size, Sample::KeyOnly);
8596 }
8597 
8598 bool operator<<(Serializer& ser, const KeyOnly<const XTypes::DynamicDataImpl>& key)
8599 {
8600  return key.value.serialize_i(ser, Sample::KeyOnly);
8601 }
8602 
8603 } // namespace DCPS
8604 } // namespace OpenDDS
8605 
8607 
8608 #endif // OPENDDS_SAFETY_PROFILE
bool serialize_array(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
void set_default_bitmask_values(CollectionType &col) const
bool write_char_array(const ACE_CDR::Char *x, ACE_CDR::ULong length)
Definition: Serializer.inl:679
void serialized_size_bitmask_array_as_uint8s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool read_basic_in_single_map(ValueType &value, DDS::MemberId id)
Read a basic member from a containing type.
bool read_basic_member(ValueType &value, DDS::MemberId id)
DDS::ReturnCode_t set_int32_value(DDS::MemberId id, CORBA::Long value)
bool insert_discriminator(ACE_CDR::Long value)
bool serialize_nesting_basic_array_i(DCPS::Serializer &ser, CORBA::ULong length, SequenceType protoseq) const
bool serialized_size_nested_bitmask_sequences(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
void serialized_size_enum_array_as_int8s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
ACE_CDR::Long Long
bool serialize_primitive_array(DCPS::Serializer &ser, TypeKind elem_tk, CORBA::ULong length) const
bool serialize_nesting_bitmask_sequence(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
sequence< unsigned short > UInt16Seq
DDS::ReturnCode_t set_char_common(DDS::MemberId id, const FromCharT &value)
#define ACE_ERROR(X)
bool get_complex_from_union(DDS::DynamicData_ptr &value, DDS::MemberId id)
bool move_single_to_complex(const DataContainer::const_single_iterator &it, DynamicDataImpl *data)
bool serialized_size_nesting_bitmask_sequence(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
void set_default_basic_value(CORBA::Long &value) const
sequence< long > Int32Seq
DDS::ReturnCode_t get_boolean_value(CORBA::Boolean &value, DDS::MemberId id)
SequenceValue(const DDS::Int32Seq &int32_seq)
ACE_CDR::ULong MemberId
Definition: TypeObject.h:910
sequence< wchar > WcharSeq
bool struct_has_explicit_keys(AST_Structure *node)
bool serialize_sequence_aggregated_member_xcdr2(DCPS::Serializer &ser, const_sequence_iterator it, TypeKind elem_tk, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility) const
const LogLevel::Value value
Definition: debug.cpp:61
bool serialized_size_complex_aggregated_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, const_complex_iterator it, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total, DCPS::Sample::Extent ext) const
const TypeKind TK_INT32
Definition: TypeObject.h:217
DDS::ReturnCode_t get_enumerator_value(DDS::Int32 &value, const char *name, DDS::DynamicType_ptr type)
ACE_CDR::Int32 Int32
bool serialized_size_generic_string_array(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
void release(T x)
bool serialize_nesting_basic_array(DCPS::Serializer &ser, TypeKind nested_elem_tk, CORBA::ULong length) const
const TypeKind TK_STRING16
Definition: TypeObject.h:232
DDS::ReturnCode_t set_float32_value(DDS::MemberId id, CORBA::Float value)
DDS::ReturnCode_t get_float64_values(DDS::Float64Seq &value, DDS::MemberId id)
bool serialize_bitmask_array_as_uints_i(DCPS::Serializer &ser, const DDS::UInt8Seq &bitmask_arr) const
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
DDS::ReturnCode_t set_uint16_value(DDS::MemberId id, CORBA::UShort value)
OpenDDS_Dcps_Export void primitive_serialized_size_ulong(const Encoding &encoding, size_t &size, size_t count=1)
bool get_largest_single_index(CORBA::ULong &index) const
bool get_value_from_collection(ValueType &value, DDS::MemberId id)
DDS::ReturnCode_t get_member_type(DDS::DynamicType_var &member_type, DDS::DynamicType_ptr container_type, DDS::MemberId id)
void serialized_size_bitmask_sequence(const DCPS::Encoding &encoding, size_t &size, const DDS::UInt8Seq &seq) const
void serialized_size_bitmask_sequence_as_uint32s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool insert_valid_discriminator(DDS::MemberDescriptor *memberSelected)
DDS::ReturnCode_t get_uint32_values(DDS::UInt32Seq &value, DDS::MemberId id)
DDS::ReturnCode_t get_simple_value_boolean(DCPS::Value &value, DDS::MemberId id) const
const TypeKind TK_BYTE
Definition: TypeObject.h:215
Object(TAO_Stub *p, CORBA::Boolean collocated=false, TAO_Abstract_ServantBase *servant=0, TAO_ORB_Core *orb_core=0)
Definition: Object.cpp:21
bool serialized_size_complex_array(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
bool serialized_size(const Encoding &encoding, size_t &size, const KeyOnly< const XTypes::DynamicDataImpl > &key)
void wstring_free(WChar *const)
bool serialize_bitmask_array(DCPS::Serializer &ser, CORBA::ULong bitbound, CORBA::ULong length) const
bool write_discriminator_helper(CORBA::Long value, TypeKind treat_as)
const TypeKind TK_UNION
Definition: TypeObject.h:244
bool serialize_bitmask_sequence_as_uint32s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
bool serialize_complex_member_i(DCPS::Serializer &ser, DDS::MemberId id, DCPS::Sample::Extent ext) const
sequence< char > CharSeq
bool serialize_wstring_value(DCPS::Serializer &ser) const
bool write_ulonglong_array(const ACE_CDR::ULongLong *x, ACE_CDR::ULong length)
Definition: Serializer.inl:771
bool set_values_to_union(DDS::MemberId id, const SequenceType &value, TypeKind enum_or_bitmask, LBound lower, LBound upper)
DDS::ReturnCode_t set_float128_value(DDS::MemberId id, CORBA::LongDouble value)
bool serialize_union_xcdr2(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
sequence< long long > Int64Seq
DDS::ReturnCode_t set_complex_value(DDS::MemberId id, DDS::DynamicData_ptr value)
DDS::ReturnCode_t get_byte_value(CORBA::Octet &value, DDS::MemberId id)
ACE_CDR::LongLong LongLong
sequence< octet > key
DDS::ReturnCode_t get_string_value(char *&value, DDS::MemberId id)
bool serialize_bitmask_array_as_uint64s(DCPS::Serializer &ser, CORBA::ULong length) const
const TypeKind TK_INT16
Definition: TypeObject.h:216
char * string_alloc(ULong len)
DDS::ReturnCode_t get_simple_value_enum(DCPS::Value &value, DDS::MemberId id) const
DDS::ReturnCode_t set_uint32_values(DDS::MemberId id, const DDS::UInt32Seq &value)
void serialized_size_bitmask_array(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length, CORBA::ULong bitbound) const
bool is_type_supported(TypeKind tk, const char *func_name)
Verify that a given type is primitive or string or wstring.
OpenDDS_Dcps_Export void serialized_size_delimiter(const Encoding &encoding, size_t &size)
Add delimiter to the size of a serialized size if the encoding has them.
bool serialized_size_complex_sequence(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
bool write_parameter_id(const unsigned id, size_t size, bool must_understand=false)
Definition: Serializer.cpp:784
DDS::ReturnCode_t set_uint32_value(DDS::MemberId id, CORBA::ULong value)
unsigned char uint8_[sizeof(ACE_OutputCDR::from_uint8)]
bool get_complex_from_struct(DDS::DynamicData_ptr &value, DDS::MemberId id)
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
ACE_CDR::Short Short
bool serialized_size_union_xcdr2(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t get_float32_values(DDS::Float32Seq &value, DDS::MemberId id)
bool serialize_string_value(DCPS::Serializer &ser) const
bool set_complex_to_union(DDS::MemberId id, DDS::DynamicData_var value)
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
bool serialize_enum_value(DCPS::Serializer &ser) const
bool serialized_size_i(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
bool serialized_size_union(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
const TypeKind TK_UINT16
Definition: TypeObject.h:219
DDS::ReturnCode_t set_boolean_value(DDS::MemberId id, CORBA::Boolean value)
void serialized_size_enum_array_as_int16s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool insert_sequence(DDS::MemberId id, const SequenceType &value)
DynamicDataImpl(DDS::DynamicType_ptr type)
void set_default_primitive_values(DDS::Int8Seq &collection) const
OpenDDS_Dcps_Export void primitive_serialized_size_octet(const Encoding &encoding, size_t &size, size_t count=1)
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:72
DDS::ReturnCode_t get_float128_value(CORBA::LongDouble &value, DDS::MemberId id)
DDS::ReturnCode_t clear_value_i(DDS::MemberId id, const DDS::DynamicType_var &member_type)
DDS::TypeDescriptor_var type_desc_
bool get_index_to_id_map(IndexToIdMap &index_to_id, CORBA::ULong bound) const
bool serialize_generic_string_array(DCPS::Serializer &ser, CORBA::ULong length) const
bool serialize_nesting_basic_sequence(DCPS::Serializer &ser, TypeKind nested_elem_tk, CORBA::ULong size, CORBA::ULong bound) const
DDS::ReturnCode_t get_uint64_value_impl(CORBA::ULongLong &value, DDS::MemberId id)
bool serialize_primitive_value(DCPS::Serializer &ser, PrimitiveType default_value) const
bool set_default_enum_values(CollectionType &collection, const DDS::DynamicType_var &enum_type) const
DDS::ReturnCode_t set_float64_values(DDS::MemberId id, const DDS::Float64Seq &value)
void serialized_size_bitmask_array_as_uint64s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool reconstruct_enum_collection(CollectionType &collection, CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var &enum_type, const WrapElementType &elem_tag) const
DDS::ReturnCode_t get_int8_values(DDS::Int8Seq &value, DDS::MemberId id)
bool serialize_sequence_struct_member_xcdr2(DCPS::Serializer &ser, DDS::MemberId id, TypeKind elem_tk, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t set_boolean_values(DDS::MemberId id, const DDS::BooleanSeq &value)
DDS::ReturnCode_t set_char8_values(DDS::MemberId id, const DDS::CharSeq &value)
bool serialized_size_sequence_value(const DCPS::Encoding &encoding, size_t &size, const SequenceValue &sv) const
DDS::ReturnCode_t get_uint16_value(CORBA::UShort &value, DDS::MemberId id)
bool reconstruct_bitmask_collection(CollectionType &collection, CORBA::ULong size, CORBA::ULong bound, const WrapElementType &elem_tag) const
bool is_default_member_selected(CORBA::Long disc_val, DDS::MemberId default_id) const
DDS::ReturnCode_t set_string_value(DDS::MemberId id, const char *value)
DDS::ReturnCode_t set_int16_value(DDS::MemberId id, CORBA::Short value)
void serialized_size_enum_array_as_int32s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool write_longlong_array(const ACE_CDR::LongLong *x, ACE_CDR::ULong length)
Definition: Serializer.inl:760
DDS::ReturnCode_t set_single_value(DDS::MemberId id, const ValueType &value, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
DDS::ReturnCode_t get_simple_value(DCPS::Value &value, DDS::MemberId id)
bool serialize_nested_enum_sequences(DCPS::Serializer &ser, const IndexToIdMap &index_to_id) const
bool is_primitive(TypeKind tk)
bool serialized_size_union_xcdr1(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
void serialized_size_sequence_aggregated_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, const_sequence_iterator it, TypeKind elem_tk, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total) const
bool serialize_bitmask_array_as_uint8s(DCPS::Serializer &ser, CORBA::ULong length) const
bool serialized_size_sequence_struct_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, DDS::MemberId id, TypeKind elem_tk, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t get_char_common(CharT &value, DDS::MemberId id)
bool serialized_size_nesting_bitmask_array(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
bool serialize_enum_array(DCPS::Serializer &ser, CORBA::ULong bitbound, CORBA::ULong length, const DDS::DynamicType_var &enum_type) const
bool serialize_bitmask_value(DCPS::Serializer &ser) const
DDS::ReturnCode_t get_single_value(ValueType &value, DDS::MemberId id)
bool write_wchar_array(const ACE_CDR::WChar *x, ACE_CDR::ULong length)
Definition: Serializer.inl:686
DDS::ReturnCode_t set_uint64_values(DDS::MemberId id, const DDS::UInt64Seq &value)
const size_t uint32_cdr_size
Definition: Serializer.h:96
bool serialized_size_nesting_basic_array(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id, SequenceType protoseq) const
bool validate_member_id_collection(DDS::MemberId id, TypeKind collection_tk) const
void serialized_size_primitive_sequence(const DCPS::Encoding &encoding, size_t &size, TypeKind elem_tk, CORBA::ULong length) const
void move_sequence_helper(const DataContainer::const_sequence_iterator &it, DynamicDataImpl *data)
DDS::ReturnCode_t set_float32_values(DDS::MemberId id, const DDS::Float32Seq &value)
const TypeKind TK_INT8
Definition: TypeObject.h:225
void serialized_size_enum_array(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length, CORBA::ULong bitbound) const
size_t strlen(const char *s)
bool get_value_from_struct(ValueType &value, DDS::MemberId id)
bool serialize_structure_xcdr2(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t set_wstring_values(DDS::MemberId id, const DDS::WstringSeq &value)
bool serialize_sequence(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
void set_default_bitmask_value(ACE_OutputCDR::from_uint8 &value) const
CORBA::ULong get_sequence_size() const
bool serialize_enum_sequence_as_int8s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var &enum_type) const
ACE_CDR::ULongLong ULongLong
bool cast_to_discriminator_value(CORBA::Long &disc_value, const ACE_OutputCDR::from_boolean &value) const
bool serialize_enum_array_as_int16s(DCPS::Serializer &ser, CORBA::ULong length, const DDS::DynamicType_var &enum_type) const
bool get_largest_sequence_index(CORBA::ULong &index) const
MemberId get_member_id_at_index(ACE_CDR::ULong index)
sequence< short > Int16Seq
DDS::ReturnCode_t set_int64_value(DDS::MemberId id, CORBA::LongLong value)
bool write_octet_array(const ACE_CDR::Octet *x, ACE_CDR::ULong length)
Definition: Serializer.inl:697
bool serialize_basic_struct_member_xcdr2(DCPS::Serializer &ser, DDS::MemberId id, const DDS::DynamicType_var &member_type, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility) const
bool serialize_bitmask_sequence_as_uint8s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
DDS::ReturnCode_t get_char8_value(CORBA::Char &value, DDS::MemberId id)
public UnionCaseLabelSeq label
DDS::ReturnCode_t get_int64_value_impl(CORBA::LongLong &value, DDS::MemberId id)
bool is_sequence_like(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
bool write_short_array(const ACE_CDR::Short *x, ACE_CDR::ULong length)
Definition: Serializer.inl:720
bool serialize_basic_sequence(DCPS::Serializer &ser, const_sequence_iterator it) const
bool get_complex_from_aggregated(DDS::DynamicData_var &value, DDS::MemberId id, FoundStatus &found_status)
DDS::ReturnCode_t get_int32_values(DDS::Int32Seq &value, DDS::MemberId id)
bool serialize_bitmask_sequence_as_uint64s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
DDS::Boolean equals(DDS::DynamicData_ptr other)
bool insert_single(DDS::MemberId id, const ACE_OutputCDR::from_int8 &value)
char * string_dup(const char *)
DDS::ReturnCode_t get_int64_value(DDS::Int64 &value, DDS::MemberId id)
OpenDDS_Dcps_Export void primitive_serialized_size_char(const Encoding &encoding, size_t &size, size_t count=1)
bool write_discriminator(CORBA::Long value)
DDS::ReturnCode_t get_char16_values(DDS::WcharSeq &value, DDS::MemberId id)
DDS::ReturnCode_t set_int8_values(DDS::MemberId id, const DDS::Int8Seq &value)
bool serialized_size_primitive_member(const DCPS::Encoding &encoding, size_t &size, TypeKind member_tk) const
bool write_long_array(const ACE_CDR::Long *x, ACE_CDR::ULong length)
Definition: Serializer.inl:740
sequence< unsigned long long > UInt64Seq
unsigned long MemberId
sequence< uint8 > UInt8Seq
bool check_index_from_id(TypeKind tk, DDS::MemberId id, CORBA::ULong bound) const
sequence< boolean > BooleanSeq
DDS::ReturnCode_t set_int32_values(DDS::MemberId id, const DDS::Int32Seq &value)
bool set_values_to_struct(DDS::MemberId id, const SequenceType &value, TypeKind enum_or_bitmask, LBound lower, LBound upper)
ACE_CDR::ULong ULong
Class to serialize and deserialize data for DDS.
Definition: Serializer.h:369
bool serialized_size_wstring(const DCPS::Encoding &encoding, size_t &size) const
bool serialized_size_structure(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
bool serialize_bitmask_sequence_as_uints_i(DCPS::Serializer &ser, const DDS::UInt8Seq &bitmask_seq) const
DDS::ReturnCode_t get_int16_values(DDS::Int16Seq &value, DDS::MemberId id)
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const char * typekind_to_string(TypeKind tk)
DDS::ReturnCode_t get_enum_value(DDS::Int32 &value, DDS::DynamicType_ptr enum_type, DDS::DynamicData_ptr src, DDS::MemberId id)
static bool has_explicit_keys(DDS::DynamicType *dt)
sequence< uint8 > UInt8Seq
bool move_single_to_complex_i(const DataContainer::const_single_iterator &it, DynamicDataImpl *data, const TypeKind treat_as)
bool serialize_generic_string_collection(DCPS::Serializer &ser, const IndexToIdMap &index_to_id) const
bool serialize_nesting_enum_array(DCPS::Serializer &ser, CORBA::ULong length) const
OpenDDS_Dcps_Export void primitive_serialized_size_wchar(const Encoding &encoding, size_t &size, size_t count=1)
bool operator<<(Serializer &ser, const KeyOnly< const XTypes::DynamicDataImpl > &key)
ACE_CDR::Boolean Boolean
bool serialize_enum_sequence(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bitbound, CORBA::ULong seqbound, const DDS::DynamicType_var &enum_type) const
sequence< octet > ByteSeq
bool move_sequence_to_complex(const DataContainer::const_sequence_iterator &it, DynamicDataImpl *data)
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
bool reconstruct_string_value(CORBA::Char *str) const
void serialized_size_bitmask_array_as_uint32s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
DDS::ReturnCode_t check_member(DDS::MemberDescriptor_var &member_desc, DDS::DynamicType_var &member_type, const char *method, const char *action, DDS::MemberId id, DDS::TypeKind tk=TK_NONE)
void serialized_size_enum_sequence(const DCPS::Encoding &encoding, size_t &size, const DDS::Int8Seq &seq) const
DDS::ReturnCode_t set_string_values(DDS::MemberId id, const DDS::StringSeq &value)
bool serialized_size_complex_member_i(const DCPS::Encoding &encoding, size_t &size, DDS::MemberId id, DCPS::Sample::Extent ext) const
ACE_CDR::UInt64 UInt64
bool serialize_enum_array_as_ints_i(DCPS::Serializer &ser, const DDS::Int8Seq &enumarr) const
bool serialized_size_generic_string_sequence(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
void erase_member(DDS::MemberId id)
void serialized_size_bitmask_array_as_uint16s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
sequence< int8 > Int8Seq
bool serialized_size_nesting_enum_sequence(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
bool serialize_nesting_bitmask_array(DCPS::Serializer &ser, CORBA::ULong length) const
WChar * wstring_dup(const WChar *const)
bool serialize_bitmask_default_value(DCPS::Serializer &ser, const DDS::DynamicType_var &bitmask_type) const
LM_NOTICE
bool serialized_size_bitmask(const DCPS::Encoding &encoding, size_t &size, const DDS::DynamicType_var &bitmask_type) const
bool get_index_to_id_from_complex(IndexToIdMap &index_to_id, CORBA::ULong bound) const
sequence< unsigned long > UInt32Seq
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const
bool get_complex_from_collection(DDS::DynamicData_ptr &value, DDS::MemberId id)
bool get_value_from_self(ValueType &value, DDS::MemberId id)
bool check_seqmem_in_struct_and_union(DDS::MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper) const
WChar * wstring_alloc(ULong len)
void serialized_size_bitmask_sequence_as_uint8s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool serialize_i(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
bool serialize_generic_string_sequence(DCPS::Serializer &ser, CORBA::ULong length, CORBA::ULong bound) const
DDS::ReturnCode_t get_simple_value_string(DCPS::Value &value, DDS::MemberId id) const
ACE_CDR::UShort UShort
sequence< long double > Float128Seq
DDS::ReturnCode_t set_sequence_values(DDS::MemberId id, const SequenceType &value, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
unsigned char char8_[sizeof(ACE_OutputCDR::from_char)]
DDS::ReturnCode_t get_uint16_values(DDS::UInt16Seq &value, DDS::MemberId id)
DDS::ReturnCode_t set_uint16_values(DDS::MemberId id, const DDS::UInt16Seq &value)
DDS::UInt32 bound_total(DDS::TypeDescriptor_var descriptor)
bool serialize_nesting_enum_sequence(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
static bool exclude_member(DCPS::Sample::Extent ext, bool is_key, bool has_explicit_keys)
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
bool get_value_from_union(ValueType &value, DDS::MemberId id)
bool serialized_size_basic_member(const DCPS::Encoding &encoding, size_t &size, TypeKind member_tk, const_single_iterator it) const
const ACE_CDR::ULong MEMBER_ID_INVALID
Definition: TypeObject.h:911
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
void serialized_size_enum_sequence_as_int8s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
sequence< float > Float32Seq
void string_free(char *)
LM_WARNING
bool serialized_size_basic_member_default_value(const DCPS::Encoding &encoding, size_t &size, TypeKind member_tk) const
bool serialized_size_complex_aggregated_member_xcdr2_default(const DCPS::Encoding &encoding, size_t &size, const DDS::DynamicType_var &member_type, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total, DCPS::Sample::Extent ext) const
bool serialize_primitive_sequence(DCPS::Serializer &ser, TypeKind elem_tk, CORBA::ULong size, CORBA::ULong bound) const
unsigned char boolean_[sizeof(ACE_OutputCDR::from_boolean)]
DDS::ReturnCode_t clear_nonkey_values()
character_type *& inout(void)
bool serialize_enum_default_value(DCPS::Serializer &ser, const DDS::DynamicType_var &enum_type) const
DDS::ReturnCode_t get_wstring_value(CORBA::WChar *&value, DDS::MemberId id)
ACE_UINT32 ULong
bool serialized_size_selected_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, DDS::MemberId selected_id, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total) const
bool read_basic_value(ACE_OutputCDR::from_int8 &value)
Group of functions to read a basic value represented by this DynamicData instance.
DDS::ReturnCode_t get_uint64_values(DDS::UInt64Seq &value, DDS::MemberId id)
bool set_value_to_collection(DDS::MemberId id, const ElementType &value, TypeKind coll_tk, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
bool serialize_discriminator_member_xcdr2(DCPS::Serializer &ser, CORBA::Long value, const DDS::DynamicType_var &disc_type, DDS::ExtensibilityKind extensibility) const
bool write_boolean_array(const ACE_CDR::Boolean *x, ACE_CDR::ULong length)
Definition: Serializer.inl:671
The End User API.
bool get_value_from_bitmask(ValueType &value, DDS::MemberId id)
bool write_double_array(const ACE_CDR::Double *x, ACE_CDR::ULong length)
Definition: Serializer.inl:792
DDS::ReturnCode_t get_int16_value(CORBA::Short &value, DDS::MemberId id)
bool serialized_size_complex_member(const DCPS::Encoding &encoding, size_t &size, DDS::MemberId id, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
DDS::ReturnCode_t get_int8_value(CORBA::Int8 &value, DDS::MemberId id)
#define SEQUENCE_VALUE_DESTRUCT(T)
ACE_CDR::Int64 Int64
DDS::ReturnCode_t set_uint8_values(DDS::MemberId id, const DDS::UInt8Seq &value)
bool serialize_complex_aggregated_member_xcdr2(DCPS::Serializer &ser, const_complex_iterator it, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const
#define SINGLE_VALUE_DESTRUCT(T)
bool serialize_union(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t get_uint8_values(DDS::UInt8Seq &value, DDS::MemberId id)
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
DDS::ReturnCode_t get_complex_value(DDS::DynamicData_ptr &value, DDS::MemberId id)
DDS::ReturnCode_t get_float128_values(DDS::Float128Seq &value, DDS::MemberId id)
character_type * _retn(void)
bool serialize_single_value(DCPS::Serializer &ser, const SingleValue &sv) const
OpenDDS_Dcps_Export void serialized_size_parameter_id(const Encoding &encoding, size_t &size, size_t &running_size)
bool serialize_basic_member_default_value(DCPS::Serializer &ser, TypeKind member_tk) const
const TypeKind TK_STRING8
Definition: TypeObject.h:231
DDS::ReturnCode_t get_char8_values(DDS::CharSeq &value, DDS::MemberId id)
DDS::ReturnCode_t set_descriptor(MemberId id, DDS::MemberDescriptor *value)
bool set_primitive_values(CollectionType &collection, CORBA::ULong bound, const ElementType &elem_tag) const
bool get_boolean_from_bitmask(CORBA::ULong index, CORBA::Boolean &value)
bool set_values_to_sequence(DDS::MemberId id, const SequenceType &value, TypeKind enum_or_bitmask, LBound lower, LBound upper)
DDS::ReturnCode_t get_uint8_value(CORBA::UInt8 &value, DDS::MemberId id)
ACE_INT32 Long
bool serialize_selected_member_xcdr2(DCPS::Serializer &ser, DDS::MemberId selected_id, DDS::ExtensibilityKind extensibility) const
bool serialize_nesting_basic_sequence_i(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound, SequenceType protoseq) const
XcdrVersion xcdr_version() const
Definition: Serializer.inl:127
ExtensibilityKind
bool serialize_structure_xcdr1(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
sequence< char > CharSeq
DDS::ReturnCode_t set_byte_values(DDS::MemberId id, const DDS::ByteSeq &value)
bool get_discriminator_value(CORBA::Long &value, const_single_iterator single_it, const_complex_iterator complex_it, const DDS::DynamicType_var &disc_type) const
DDS::ReturnCode_t set_byte_value(DDS::MemberId id, CORBA::Octet value)
bool serialize_bitmask_array_as_uint16s(DCPS::Serializer &ser, CORBA::ULong length) const
bool set_complex_to_collection(DDS::MemberId id, DDS::DynamicData_var value, TypeKind tk)
bool get_largest_index_basic_sequence(CORBA::ULong &index) const
bool serialize_complex_sequence(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t get_wstring_values(DDS::WstringSeq &value, DDS::MemberId id)
sequence< string > StringSeq
const TypeKind TK_UINT64
Definition: TypeObject.h:221
bool serialize_complex_aggregated_member_xcdr2_default(DCPS::Serializer &ser, DDS::MemberId id, const DDS::DynamicType_var &member_type, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility, DCPS::Sample::Extent ext) const
bool write_ulong_array(const ACE_CDR::ULong *x, ACE_CDR::ULong length)
Definition: Serializer.inl:750
DDS::DynamicData * interface_from_this() const
OpenDDS_Dcps_Export LogLevel log_level
unsigned char byte_[sizeof(ACE_OutputCDR::from_octet)]
bool serialized_size_nesting_basic_sequence(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id, SequenceType protoseq) const
bool serialize_bitmask_sequence(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bitbound, CORBA::ULong seqbound) const
sequence< wstring > WstringSeq
bool check_seqmem_in_sequence_and_array(DDS::MemberId id, CORBA::ULong bound, TypeKind enum_or_bitmask, LBound lower, LBound upper) const
DDS::ReturnCode_t set_char8_value(DDS::MemberId id, CORBA::Char value)
const size_t char16_cdr_size
Definition: Serializer.h:103
static bool is_valid_discriminator_type(TypeKind tk)
bool get_largest_index_basic(CORBA::ULong &index) const
void * memset(void *s, int c, size_t len)
DDS::ReturnCode_t set_int16_values(DDS::MemberId id, const DDS::Int16Seq &value)
DDS::ReturnCode_t set_uint64_value(DDS::MemberId id, CORBA::ULongLong value)
bool reconstruct_primitive_collection(CollectionType &collection, CORBA::ULong size, CORBA::ULong bound, const ElementType &elem_tag) const
bool serialized_size_sequence(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
bool reconstruct_wstring_value(CORBA::WChar *wstr) const
DDS::ReturnCode_t enum_bound(DDS::DynamicType_ptr enum_type, DDS::TypeKind &bound_kind)
Char * string_dup(const Char *str)
void serialized_size_bitmask_sequence_as_uint64s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
public boolean is_default_label
const TypeKind TK_INT64
Definition: TypeObject.h:218
DDS::ReturnCode_t set_int8_value(DDS::MemberId id, CORBA::Int8 value)
bool set_default_discriminator_value(CORBA::Long &value, const DDS::DynamicType_var &disc_type) const
bool serialize_sequence_value(DCPS::Serializer &ser, const SequenceValue &sv) const
bool serialize_complex_sequence_i(DCPS::Serializer &ser, const IndexToIdMap &index_to_id, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
bool get_value_from_enum(ValueType &value, DDS::MemberId id)
const char * retcode_to_string(DDS::ReturnCode_t value)
Definition: DCPS_Utils.cpp:29
DDS::ReturnCode_t clear_value(DDS::MemberId id)
const TypeKind TK_UINT32
Definition: TypeObject.h:220
ACE_CDR::Char Char
const TypeKind TK_ALIAS
Definition: TypeObject.h:235
unsigned char int8_[sizeof(ACE_OutputCDR::from_int8)]
bool serialize_complex_array(DCPS::Serializer &ser, CORBA::ULong length, const DDS::DynamicType_var &elem_type, DCPS::Sample::Extent ext) const
const Encoding & encoding() const
Definition: Serializer.inl:199
const ReturnCode_t RETCODE_ERROR
bool validate_discriminator(CORBA::Long disc_val, const DDS::MemberDescriptor_var &md) const
bool serialize_structure(DCPS::Serializer &ser, DCPS::Sample::Extent) const
#define SEQUENCE_VALUE_GETTERS(T)
bool get_largest_complex_index(CORBA::ULong &index) const
ACE_CDR::Octet Octet
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
bool serialized_size_generic_string_collection(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
const TypeKind TK_ANNOTATION
Definition: TypeObject.h:242
void serialized_size_bitmask_sequence_as_uint16s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
DDS::ReturnCode_t get_enumerator_name(DDS::String8_var &name, DDS::Int32 value, DDS::DynamicType_ptr type)
const TypeKind TK_ENUM
Definition: TypeObject.h:238
ACE_CDR::Int16 Int16
bool serialize_single_aggregated_member_xcdr2(DCPS::Serializer &ser, const_single_iterator it, const DDS::DynamicType_var &member_type, bool optional, bool must_understand, DDS::ExtensibilityKind extensibility) const
bool serialized_size_nested_enum_sequences(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
bool set_value_to_struct(DDS::MemberId id, const MemberType &value)
static DCPS::Sample::Extent nested(DCPS::Sample::Extent ext)
const ReturnCode_t RETCODE_OK
DDS::ReturnCode_t get_uint64_value(DDS::UInt64 &value, DDS::MemberId id)
DDS::ReturnCode_t set_int64_values(DDS::MemberId id, const DDS::Int64Seq &value)
const ReturnCode_t RETCODE_UNSUPPORTED
bool serialized_size_enum(const DCPS::Encoding &encoding, size_t &size, const DDS::DynamicType_var &enum_type) const
bool write_ushort_array(const ACE_CDR::UShort *x, ACE_CDR::ULong length)
Definition: Serializer.inl:730
DDS::ReturnCode_t set_enum_value(DDS::DynamicType_ptr enum_type, DDS::DynamicData_ptr dest, DDS::MemberId id, DDS::Int32 value)
ACE_CDR::WChar WChar
bool discriminator_selects_no_member(DDS::Int32 disc) const
sequence< boolean > BooleanSeq
DDS::MemberId find_selected_member() const
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
bool read_basic_in_complex_map(ValueType &value, DDS::MemberId id)
const TypeKind TK_UINT8
Definition: TypeObject.h:226
DDS::ReturnCode_t get_byte_values(DDS::ByteSeq &value, DDS::MemberId id)
sequence< int8 > Int8Seq
bool serialize_bitmask_array_as_uint32s(DCPS::Serializer &ser, CORBA::ULong length) const
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
bool serialize_bitmask_sequence_as_uint16s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound) const
bool serialize_enum_array_as_int8s(DCPS::Serializer &ser, CORBA::ULong length, const DDS::DynamicType_var &enum_type) const
bool set_value_to_union(DDS::MemberId id, const MemberType &value, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
void cast_to_enum_value(ACE_OutputCDR::from_int8 &dst, CORBA::Long src) const
bool serialized_size_basic_sequence(const DCPS::Encoding &encoding, size_t &size, const_sequence_iterator it) const
bool serialize_enum_sequence_as_int16s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var &enum_type) const
DDS::ReturnCode_t get_float64_value(CORBA::Double &value, DDS::MemberId id)
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
const TypeKind TK_NONE
Definition: TypeObject.h:213
void serialized_size_enum_sequence_as_int16s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool set_complex_to_struct(DDS::MemberId id, DDS::DynamicData_var value)
bool serialized_size_structure_xcdr2(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
bool serialize_enum_sequence_as_ints_i(DCPS::Serializer &ser, const DDS::Int8Seq &enumseq) const
const TypeKind TK_MAP
Definition: TypeObject.h:250
DDS::ReturnCode_t get_char16_value(CORBA::WChar &value, DDS::MemberId id)
bool serialized_size_nesting_enum_array(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id) const
void serialized_size_primitive_array(const DCPS::Encoding &encoding, size_t &size, TypeKind elem_tk, CORBA::ULong length) const
DDS::ReturnCode_t get_boolean_values(DDS::BooleanSeq &value, DDS::MemberId id)
DDS::ReturnCode_t set_float64_value(DDS::MemberId id, CORBA::Double value)
sequence< double > Float64Seq
bool serialize_enum_sequence_as_int32s(DCPS::Serializer &ser, CORBA::ULong size, CORBA::ULong bound, const DDS::DynamicType_var &enum_type) const
DDS::ReturnCode_t bitmask_bound(DDS::DynamicType_ptr type, DDS::TypeKind &bound_kind)
DDS::ReturnCode_t get_int32_value(CORBA::Long &value, DDS::MemberId id)
bool write_delimiter(size_t size)
Definition: Serializer.inl:925
bool serialize_enum_array_as_int32s(DCPS::Serializer &ser, CORBA::ULong length, const DDS::DynamicType_var &enum_type) const
DDS::ReturnCode_t set_uint8_value(DDS::MemberId id, CORBA::UInt8 value)
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
void serialized_size_sequence_member_default_value(const DCPS::Encoding &encoding, size_t &size, TypeKind elem_tk) const
bool serialized_size_basic_struct_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, DDS::MemberId id, const DDS::DynamicType_var &member_type, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total) const
bool insert_complex(DDS::MemberId id, const DDS::DynamicData_var &value)
bool serialize_union_xcdr1(DCPS::Serializer &ser, DCPS::Sample::Extent ext) const
bool enum_string_helper(char *&strInOut, MemberId id)
#define SEQUENCE_VALUE_PLACEMENT_NEW(T, N)
DDS::ReturnCode_t get_selected_union_branch(DDS::Int32 disc, bool &found_selected_member, DDS::MemberDescriptor_var &selected_md) const
DDS::ReturnCode_t get_simple_value_primitive(DCPS::Value &value, DDS::MemberId id) const
bool serialized_size_structure_xcdr1(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
ACE_CDR::UInt32 UInt32
OpenDDS_Dcps_Export void serialized_size_list_end_parameter_id(const Encoding &encoding, size_t &size, size_t &running_size)
ACE_CDR::ULong length() const
Definition: TypeObject.h:167
void serialized_size_string_common(const DCPS::Encoding &encoding, size_t &size, const char *str) const
bool serialized_size_nested_basic_sequences(const DCPS::Encoding &encoding, size_t &size, const IndexToIdMap &index_to_id, SequenceType protoseq) const
OpenDDS_Dcps_Export void primitive_serialized_size_boolean(const Encoding &encoding, size_t &size, size_t count=1)
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
DDS::ReturnCode_t set_float128_values(DDS::MemberId id, const DDS::Float128Seq &value)
bool read_discriminator(CORBA::Long &disc_val) const
DDS::ReturnCode_t get_simple_value_char(DCPS::Value &value, DDS::MemberId id) const
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
bool serialize_nested_bitmask_sequences(DCPS::Serializer &ser, const IndexToIdMap &index_to_id) const
bool write_float_array(const ACE_CDR::Float *x, ACE_CDR::ULong length)
Definition: Serializer.inl:782
bool serialized_size_array(const DCPS::Encoding &encoding, size_t &size, DCPS::Sample::Extent ext) const
DDS::ReturnCode_t set_char16_value(DDS::MemberId id, CORBA::WChar value)
const TypeKind TK_BITSET
Definition: TypeObject.h:245
bool set_default_enum_value(const DDS::DynamicType_var &dt, CORBA::Long &value) const
DDS::ReturnCode_t get_int64_values(DDS::Int64Seq &value, DDS::MemberId id)
DDS::ReturnCode_t set_char16_values(DDS::MemberId id, const DDS::WcharSeq &value)
DDS::ReturnCode_t get_float32_value(CORBA::Float &value, DDS::MemberId id)
sequence< string > StringSeq
Definition: DdsDcpsCore.idl:50
extensibility(MUTABLE) struct TypeLookup_getTypes_In
Definition: TypeLookup.idl:29
void serialized_size_enum_sequence_as_int32s(const DCPS::Encoding &encoding, size_t &size, CORBA::ULong length) const
bool serialized_size_discriminator_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, const DDS::DynamicType_var &disc_type, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total) const
bool serialized_size_single_aggregated_member_xcdr2(const DCPS::Encoding &encoding, size_t &size, const_single_iterator it, const DDS::DynamicType_var &member_type, bool optional, DDS::ExtensibilityKind extensibility, size_t &mutable_running_total) const
bool is_basic(TypeKind tk)
bool serialized_size_string(const DCPS::Encoding &encoding, size_t &size) const
ACE_CDR::UInt16 UInt16
DDS::ReturnCode_t get_string_values(DDS::StringSeq &value, DDS::MemberId id)
bool serialize_sequence_member_default_value(DCPS::Serializer &ser, TypeKind elem_tk) const
bool set_values_to_array(DDS::MemberId id, const SequenceType &value, TypeKind enum_or_bitmask, LBound lower, LBound upper)
OpenDDS_Dcps_Export bool primitive_serialized_size(const Encoding &encoding, size_t &size, const ACE_CDR::Short &value, size_t count=1)
bool serialize_nested_basic_sequences(DCPS::Serializer &ser, const IndexToIdMap &index_to_id, SequenceType protoseq) const
bool write_longdouble_array(const ACE_CDR::LongDouble *x, ACE_CDR::ULong length)
Definition: Serializer.inl:802
DDS::ReturnCode_t get_uint32_value(CORBA::ULong &value, DDS::MemberId)
const ReturnCode_t RETCODE_BAD_PARAMETER
DDS::ReturnCode_t set_wstring_value(DDS::MemberId id, const CORBA::WChar *value)