OpenDDS  Snapshot(2023/04/28-20:55)
DynamicDataAdapter.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 #include "DynamicDataAdapter.h"
9 
10 #include <dds/DCPS/debug.h>
11 #include <dds/DCPS/DCPS_Utils.h>
12 
13 #if OPENDDS_HAS_DYNAMIC_DATA_ADAPTER
14 
16 
17 namespace OpenDDS {
18 namespace XTypes {
19 
20 using DCPS::LogLevel;
21 using DCPS::log_level;
23 
25 {
26  const TypeKind tk = type_->get_kind();
27  switch (tk) {
28  case TK_BOOLEAN:
29  case TK_BYTE:
30  case TK_UINT8:
31  case TK_UINT16:
32  case TK_UINT32:
33  case TK_UINT64:
34  case TK_INT8:
35  case TK_INT16:
36  case TK_INT32:
37  case TK_INT64:
38  case TK_FLOAT32:
39  case TK_FLOAT64:
40  case TK_FLOAT128:
41  case TK_CHAR8:
42  case TK_CHAR16:
43  case TK_ENUM:
44  return 1;
45  case TK_UNION:
46  {
47  bool branch_active;
48  DDS::MemberDescriptor_var active_branch;
49  DDS::ReturnCode_t rc = get_selected_union_branch(branch_active, active_branch);
50  if (rc != DDS::RETCODE_OK) {
52  const CORBA::String_var type_name = type_->get_name();
53  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::item: "
54  "get_selected_union_branch returned %C\n",
55  type_name.in(), retcode_to_string(rc)));
56  }
57  return MEMBER_ID_INVALID;
58  }
59  return branch_active ? 2 : 1;
60  }
61  break;
62  case TK_STRING8:
63  case TK_STRING16:
64  case TK_SEQUENCE:
65  case TK_BITMASK:
66  case TK_ARRAY:
67  case TK_STRUCTURE:
68  case TK_MAP:
69  case TK_BITSET:
70  if (log_level >= LogLevel::Error) {
71  const CORBA::String_var type_name = type_->get_name();
72  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: DynamicDataAdapterImpl<%C>::get_item_count: "
73  "this %C should have implemented get_item_count\n",
74  type_name.in(), typekind_to_string(tk)));
75  }
76  return 0;
77  case TK_ALIAS:
78  case TK_ANNOTATION:
79  default:
81  const CORBA::String_var type_name = type_->get_name();
82  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_item_count: "
83  "unexpected type %C\n", type_name.in(), typekind_to_string(tk)));
84  }
85  return 0;
86  }
87 }
88 
90 {
91  DDS::DynamicTypeMember_var dtm;
92  if (type_->get_member_by_name(dtm, name) != DDS::RETCODE_OK) {
93  return MEMBER_ID_INVALID;
94  }
95  return dtm->get_id();
96 }
97 
99 {
100  OPENDDS_ASSERT(false);
101  return MEMBER_ID_INVALID;
102 }
103 
105 {
107  const TypeKind tk = type_->get_kind();
108  switch (tk) {
109  case TK_STRUCTURE:
110  {
111  DDS::DynamicTypeMember_var dtm;
112  rc = type_->get_member_by_index(dtm, index);
113  if (rc != DDS::RETCODE_OK) {
115  const CORBA::String_var type_name = type_->get_name();
116  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
117  "get_member_by_index returned %C\n",
118  type_name.in(), retcode_to_string(rc)));
119  }
120  return MEMBER_ID_INVALID;
121  }
122  return dtm->get_id();
123  }
124  case TK_UNION:
125  {
126  if (index == 0) {
127  return DISCRIMINATOR_ID;
128  } else if (index == 1) {
129  bool branch_active;
130  DDS::MemberDescriptor_var active_branch;
131  DDS::ReturnCode_t rc = get_selected_union_branch(branch_active, active_branch);
132  if (rc != DDS::RETCODE_OK) {
134  const CORBA::String_var type_name = type_->get_name();
135  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
136  "get_selected_union_branch returned %C\n",
137  type_name.in(), retcode_to_string(rc)));
138  }
139  return MEMBER_ID_INVALID;
140  }
141  if (branch_active) {
142  return active_branch->id();
144  const CORBA::String_var type_name = type_->get_name();
145  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
146  "union doesn't have an active branch, so index 1 is invalid\n",
147  type_name.in()));
148  }
150  const CORBA::String_var type_name = type_->get_name();
151  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
152  "index %u is invalid for unions\n",
153  type_name.in(), index));
154  }
155  return MEMBER_ID_INVALID;
156  }
157  case TK_SEQUENCE:
158  return get_member_id_at_index_impl(index);
159  case TK_ARRAY:
160  {
161  DDS::ReturnCode_t rc = check_index("get_member_id_at_index", index, bound_total(type_desc_));
162  if (rc != DDS::RETCODE_OK) {
164  const CORBA::String_var type_name = type_->get_name();
165  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
166  "check_index returned %C\n",
167  type_name.in(), retcode_to_string(rc)));
168  }
169  return MEMBER_ID_INVALID;
170  }
171  return index;
172  }
173  default:
175  const CORBA::String_var type_name = type_->get_name();
176  ACE_ERROR((LM_WARNING, "(%P|%t) WARNING: DynamicDataAdapterImpl<%C>::get_member_id_at_index: "
177  "not supported for %C\n",
178  type_name.in(), typekind_to_string(tk)));
179  }
180  return MEMBER_ID_INVALID;
181  }
182 }
183 
185 {
186  return unsupported_method("DynamicDataAdapater::clear_all_values");
187 }
188 
190 {
191  return unsupported_method("DynamicDataAdapater::clear_nonkey_values");
192 }
193 
195 {
196  return unsupported_method("DynamicDataAdapater::clear_value");
197 }
198 
199 DDS::DynamicData_ptr DynamicDataAdapter::clone()
200 {
201  unsupported_method("DynamicDataAdapater::clone");
202  return 0;
203 }
204 
206 {
208  const CORBA::String_var type_name = type_->get_name();
209  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataAdapterImpl<%C>::%C: invalid member id %u\n",
210  type_name.in(), method, id));
211  }
213 }
214 
216 {
218  const CORBA::String_var type_name = type_->get_name();
219  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataAdapterImpl<%C>::%C: "
220  "member id %u doesn't have a DynamicDataAdapterImpl\n",
221  type_name.in(), method, id));
222  }
224 }
225 
227 {
228  if (read_only_) {
230  const CORBA::String_var type_name = type_->get_name();
231  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataAdapterImpl<%C>::%C: "
232  "can't set values as this DynamicDataAdapter is read only\n",
233  type_name.in(), method));
234  }
236  }
237  return DDS::RETCODE_OK;
238 }
239 
241  const char* method, DDS::UInt32 index, DDS::UInt32 size) const
242 {
243  if (index >= size) {
245  const CORBA::String_var type_name = type_->get_name();
246  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataAdapterImpl<%C>::%C: "
247  "index %u is larger or equal to than the size (%u)\n",
248  type_name.in(), method, index, size));
249  }
251  }
252  return DDS::RETCODE_OK;
253 }
254 
256  DDS::DynamicType_var& member_type, const char* method, DDS::TypeKind tk, DDS::MemberId id)
257 {
258  return DynamicDataBase::check_member(member_type, method, "access", id, tk);
259 }
260 
262  const char* method, DDS::TypeKind tk, DDS::MemberId id)
263 {
264  DDS::DynamicType_var member_type;
265  return check_member(member_type, method, tk, id);
266 }
267 
269  const char* method, void* dest, DDS::TypeKind tk, const char* source, DDS::MemberId id)
270 {
271  const DDS::ReturnCode_t rc = check_member(method, tk, id);
272  if (rc != DDS::RETCODE_OK) {
273  return rc;
274  }
275  char*& dest_value = *static_cast<char**>(dest);
276  CORBA::string_free(dest_value);
277  dest_value = CORBA::string_dup(source);
278  return rc;
279 }
280 
282  const char* method, char*& dest, DDS::MemberId id, const void* source, DDS::TypeKind tk)
283 {
284  const DDS::ReturnCode_t rc = check_member(method, tk, id);
285  if (rc != DDS::RETCODE_OK) {
286  return rc;
287  }
288  CORBA::string_free(dest);
289  dest = CORBA::string_dup(static_cast<const char*>(source));
290  return rc;
291 }
292 
294  const char* method, void* dest, DDS::TypeKind tk,
295  const std::string& source, DDS::MemberId id)
296 {
297  const DDS::ReturnCode_t rc = check_member(method, tk, id);
298  if (rc != DDS::RETCODE_OK) {
299  return rc;
300  }
301  char*& dest_value = *static_cast<char**>(dest);
302  CORBA::string_free(dest_value);
303  dest_value = CORBA::string_dup(source.c_str());
304  return rc;
305 }
306 
308  const char* method, std::string& dest, DDS::MemberId id,
309  const void* source, DDS::TypeKind tk)
310 {
311  const DDS::ReturnCode_t rc = check_member(method, tk, id);
312  if (rc == DDS::RETCODE_OK) {
313  dest = static_cast<const char*>(source);
314  }
315  return rc;
316 }
317 
319  const char* method, void* dest, DDS::TypeKind tk,
320  const DDS::Char16* source, DDS::MemberId id)
321 {
322  const DDS::ReturnCode_t rc = check_member(method, tk, id);
323  if (rc != DDS::RETCODE_OK) {
324  return rc;
325  }
326  DDS::Char16*& dest_value = *static_cast<DDS::Char16**>(dest);
327  CORBA::wstring_free(dest_value);
328  dest_value = CORBA::wstring_dup(source);
329  return rc;
330 }
331 
333  const char* method, DDS::Char16*& dest, DDS::MemberId id,
334  const void* source, DDS::TypeKind tk)
335 {
336  const DDS::ReturnCode_t rc = check_member(method, tk, id);
337  if (rc != DDS::RETCODE_OK) {
338  return rc;
339  }
340  CORBA::wstring_free(dest);
341  dest = CORBA::wstring_dup(static_cast<const DDS::Char16*>(source));
342  return rc;
343 }
344 
346  const char* method, void* dest, DDS::TypeKind tk,
347  const std::wstring& source, DDS::MemberId id)
348 {
349  const DDS::ReturnCode_t rc = check_member(method, tk, id);
350  if (rc != DDS::RETCODE_OK) {
351  return rc;
352  }
353  DDS::Char16*& dest_value = *static_cast<DDS::Char16**>(dest);
354  CORBA::wstring_free(dest_value);
355  dest_value = CORBA::wstring_dup(source.c_str());
356  return rc;
357 }
358 
360  const char* method, std::wstring& dest, DDS::MemberId id,
361  const void* source, DDS::TypeKind tk)
362 {
363  const DDS::ReturnCode_t rc = check_member(method, tk, id);
364  if (rc == DDS::RETCODE_OK) {
365  dest = static_cast<const DDS::Char16*>(source);
366  }
367  return rc;
368 }
369 
370 } // namespace XTypes
371 } // namespace OpenDDS
372 
374 
375 #endif // OPENDDS_HAS_DYNAMIC_DATA_ADAPTER
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
#define ACE_ERROR(X)
ACE_CDR::ULong MemberId
Definition: TypeObject.h:910
DDS::ReturnCode_t set_cpp11_s8_raw_value(const char *method, std::string &dest, DDS::MemberId id, const void *source, DDS::TypeKind tk)
const TypeKind TK_INT32
Definition: TypeObject.h:217
DDS::ReturnCode_t check_index(const char *method, DDS::UInt32 index, DDS::UInt32 size) const
DDS::ReturnCode_t unsupported_method(const char *method_name, bool warning=false) const
const TypeKind TK_STRING16
Definition: TypeObject.h:232
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const TypeKind TK_BYTE
Definition: TypeObject.h:215
void wstring_free(WChar *const)
virtual DDS::MemberId get_member_id_at_index_impl(DDS::UInt32)
const TypeKind TK_UNION
Definition: TypeObject.h:244
DDS::ReturnCode_t get_s8_raw_value(const char *method, void *dest, DDS::TypeKind tk, const char *source, DDS::MemberId id)
DDS::ReturnCode_t check_member(DDS::DynamicType_var &member_type, const char *method, DDS::TypeKind tk, DDS::MemberId id)
const TypeKind TK_INT16
Definition: TypeObject.h:216
DDS::ReturnCode_t get_cpp11_s16_raw_value(const char *method, void *dest, DDS::TypeKind tk, const std::wstring &source, DDS::MemberId id)
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
const TypeKind TK_UINT16
Definition: TypeObject.h:219
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:72
DDS::TypeDescriptor_var type_desc_
const TypeKind TK_INT8
Definition: TypeObject.h:225
DDS::ReturnCode_t get_cpp11_s8_raw_value(const char *method, void *dest, DDS::TypeKind tk, const std::string &source, DDS::MemberId id)
DDS::ReturnCode_t clear_value(DDS::MemberId)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
char * string_dup(const char *)
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
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)
WChar * wstring_dup(const WChar *const)
LM_NOTICE
DDS::UInt32 bound_total(DDS::TypeDescriptor_var descriptor)
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
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.
const ReturnCode_t RETCODE_ILLEGAL_OPERATION
void string_free(char *)
LM_WARNING
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
DDS::MemberId get_member_id_at_index(DDS::UInt32 index)
const char *const name
Definition: debug.cpp:60
DDS::ReturnCode_t invalid_id(const char *method, DDS::MemberId id) const
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
DDS::ReturnCode_t missing_dda(const char *method, DDS::MemberId id) const
const TypeKind TK_STRING8
Definition: TypeObject.h:231
const TypeKind TK_UINT64
Definition: TypeObject.h:221
OpenDDS_Dcps_Export LogLevel log_level
const TypeKind TK_INT64
Definition: TypeObject.h:218
const char * retcode_to_string(DDS::ReturnCode_t value)
Definition: DCPS_Utils.cpp:29
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const TypeKind TK_ALIAS
Definition: TypeObject.h:235
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
const TypeKind TK_ANNOTATION
Definition: TypeObject.h:242
DDS::MemberId get_member_id_by_name(const char *name)
const TypeKind TK_ENUM
Definition: TypeObject.h:238
DDS::ReturnCode_t get_s16_raw_value(const char *method, void *dest, DDS::TypeKind tk, const DDS::Char16 *source, DDS::MemberId id)
const ReturnCode_t RETCODE_OK
wchar Char16
Definition: DdsDcpsCore.idl:45
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_UINT8
Definition: TypeObject.h:226
DDS::ReturnCode_t set_s16_raw_value(const char *method, DDS::Char16 *&dest, DDS::MemberId id, const void *source, DDS::TypeKind tk)
const character_type * in(void) const
DDS::ReturnCode_t set_cpp11_s16_raw_value(const char *method, std::wstring &dest, DDS::MemberId id, const void *source, DDS::TypeKind tk)
const TypeKind TK_MAP
Definition: TypeObject.h:250
LM_ERROR
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
DDS::ReturnCode_t set_s8_raw_value(const char *method, char *&dest, DDS::MemberId id, const void *source, DDS::TypeKind tk)
DDS::ReturnCode_t get_selected_union_branch(DDS::Int32 disc, bool &found_selected_member, DDS::MemberDescriptor_var &selected_md) const
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_BITSET
Definition: TypeObject.h:245
DDS::ReturnCode_t assert_mutable(const char *method) const
const ReturnCode_t RETCODE_BAD_PARAMETER