OpenDDS  Snapshot(2023/04/07-19:43)
Classes | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
OpenDDS::XTypes::DynamicDataXcdrReadImpl Class Reference

#include <DynamicDataXcdrReadImpl.h>

Inheritance diagram for OpenDDS::XTypes::DynamicDataXcdrReadImpl:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::XTypes::DynamicDataXcdrReadImpl:
Collaboration graph
[legend]

Classes

class  ScopedChainManager
 

Public Member Functions

 DynamicDataXcdrReadImpl ()
 
 DynamicDataXcdrReadImpl (ACE_Message_Block *chain, const DCPS::Encoding &encoding, DDS::DynamicType_ptr type, DCPS::Sample::Extent ext=DCPS::Sample::Full)
 
 DynamicDataXcdrReadImpl (DCPS::Serializer &ser, DDS::DynamicType_ptr type, DCPS::Sample::Extent ext=DCPS::Sample::Full)
 
 DynamicDataXcdrReadImpl (const DynamicDataXcdrReadImpl &other)
 
DynamicDataXcdrReadImploperator= (const DynamicDataXcdrReadImpl &other)
 
 ~DynamicDataXcdrReadImpl ()
 
DDS::ReturnCode_t set_descriptor (MemberId id, DDS::MemberDescriptor *value)
 
DDS::MemberId get_member_id_at_index (ACE_CDR::ULong index)
 
ACE_CDR::ULong get_item_count ()
 
DDS::ReturnCode_t clear_all_values ()
 
DDS::ReturnCode_t clear_nonkey_values ()
 
DDS::ReturnCode_t clear_value (DDS::MemberId id)
 
DDS::DynamicData_ptr loan_value (DDS::MemberId id)
 
DDS::ReturnCode_t return_loaned_value (DDS::DynamicData_ptr value)
 
DDS::DynamicData_ptr clone ()
 
DDS::ReturnCode_t get_int32_value (CORBA::Long &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int32_value (DDS::MemberId, CORBA::Long)
 
DDS::ReturnCode_t get_uint32_value (CORBA::ULong &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint32_value (DDS::MemberId, CORBA::ULong)
 
DDS::ReturnCode_t get_int8_value (CORBA::Int8 &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int8_value (DDS::MemberId, CORBA::Int8)
 
DDS::ReturnCode_t get_uint8_value (CORBA::UInt8 &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint8_value (DDS::MemberId, CORBA::UInt8)
 
DDS::ReturnCode_t get_int16_value (CORBA::Short &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int16_value (DDS::MemberId, CORBA::Short)
 
DDS::ReturnCode_t get_uint16_value (CORBA::UShort &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint16_value (DDS::MemberId, CORBA::UShort)
 
DDS::ReturnCode_t get_int64_value (CORBA::LongLong &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int64_value (DDS::MemberId, CORBA::LongLong)
 
DDS::ReturnCode_t get_uint64_value (CORBA::ULongLong &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint64_value (DDS::MemberId, CORBA::ULongLong)
 
DDS::ReturnCode_t get_float32_value (CORBA::Float &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float32_value (DDS::MemberId, CORBA::Float)
 
DDS::ReturnCode_t get_float64_value (CORBA::Double &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float64_value (DDS::MemberId, CORBA::Double)
 
DDS::ReturnCode_t get_float128_value (CORBA::LongDouble &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float128_value (DDS::MemberId, CORBA::LongDouble)
 
DDS::ReturnCode_t get_char8_value (CORBA::Char &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_char8_value (DDS::MemberId, CORBA::Char)
 
DDS::ReturnCode_t get_char16_value (CORBA::WChar &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_char16_value (DDS::MemberId, CORBA::WChar)
 
DDS::ReturnCode_t get_byte_value (CORBA::Octet &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_byte_value (DDS::MemberId, CORBA::Octet)
 
DDS::ReturnCode_t get_boolean_value (CORBA::Boolean &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_boolean_value (DDS::MemberId, CORBA::Boolean)
 
DDS::ReturnCode_t get_string_value (char *&value, DDS::MemberId id)
 
DDS::ReturnCode_t set_string_value (DDS::MemberId, const char *)
 
DDS::ReturnCode_t get_wstring_value (CORBA::WChar *&value, DDS::MemberId id)
 
DDS::ReturnCode_t set_wstring_value (DDS::MemberId, const CORBA::WChar *)
 
DDS::ReturnCode_t get_complex_value (DDS::DynamicData_ptr &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_complex_value (DDS::MemberId, DDS::DynamicData_ptr)
 
DDS::ReturnCode_t get_int32_values (DDS::Int32Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int32_values (DDS::MemberId, const DDS::Int32Seq &)
 
DDS::ReturnCode_t get_uint32_values (DDS::UInt32Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint32_values (DDS::MemberId, const DDS::UInt32Seq &)
 
DDS::ReturnCode_t get_int8_values (DDS::Int8Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int8_values (DDS::MemberId, const DDS::Int8Seq &)
 
DDS::ReturnCode_t get_uint8_values (DDS::UInt8Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint8_values (DDS::MemberId, const DDS::UInt8Seq &)
 
DDS::ReturnCode_t get_int16_values (DDS::Int16Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int16_values (DDS::MemberId, const DDS::Int16Seq &)
 
DDS::ReturnCode_t get_uint16_values (DDS::UInt16Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint16_values (DDS::MemberId, const DDS::UInt16Seq &)
 
DDS::ReturnCode_t get_int64_values (DDS::Int64Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_int64_values (DDS::MemberId, const DDS::Int64Seq &)
 
DDS::ReturnCode_t get_uint64_values (DDS::UInt64Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_uint64_values (DDS::MemberId, const DDS::UInt64Seq &)
 
DDS::ReturnCode_t get_float32_values (DDS::Float32Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float32_values (DDS::MemberId, const DDS::Float32Seq &)
 
DDS::ReturnCode_t get_float64_values (DDS::Float64Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float64_values (DDS::MemberId, const DDS::Float64Seq &)
 
DDS::ReturnCode_t get_float128_values (DDS::Float128Seq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_float128_values (DDS::MemberId, const DDS::Float128Seq &)
 
DDS::ReturnCode_t get_char8_values (DDS::CharSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_char8_values (DDS::MemberId, const DDS::CharSeq &)
 
DDS::ReturnCode_t get_char16_values (DDS::WcharSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_char16_values (DDS::MemberId, const DDS::WcharSeq &)
 
DDS::ReturnCode_t get_byte_values (DDS::ByteSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_byte_values (DDS::MemberId, const DDS::ByteSeq &)
 
DDS::ReturnCode_t get_boolean_values (DDS::BooleanSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_boolean_values (DDS::MemberId, const DDS::BooleanSeq &)
 
DDS::ReturnCode_t get_string_values (DDS::StringSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_string_values (DDS::MemberId, const DDS::StringSeq &)
 
DDS::ReturnCode_t get_wstring_values (DDS::WstringSeq &value, DDS::MemberId id)
 
DDS::ReturnCode_t set_wstring_values (DDS::MemberId, const DDS::WstringSeq &)
 
DDS::DynamicType_ptr type ()
 
bool check_xcdr1_mutable (DDS::DynamicType_ptr dt)
 
CORBA::Boolean equals (DDS::DynamicData_ptr other)
 
DDS::ReturnCode_t get_simple_value (DCPS::Value &value, DDS::MemberId id)
 
- Public Member Functions inherited from OpenDDS::XTypes::DynamicDataBase
 DynamicDataBase ()
 
 DynamicDataBase (DDS::DynamicType_ptr type)
 
DDS::ReturnCode_t get_descriptor (DDS::MemberDescriptor *&value, MemberId id)
 
DDS::MemberId get_member_id_by_name (const char *name)
 
- Public Member Functions inherited from DDS::DynamicData
DDS::ReturnCode_t get_descriptor (inout MemberDescriptor value, in MemberId id)
 
DDS::ReturnCode_t set_descriptor (in MemberId id, in MemberDescriptor value)
 
boolean equals (in DynamicData other)
 
MemberId get_member_id_by_name (in ObjectName name)
 
MemberId get_member_id_at_index (in unsigned long index)
 
DDS::ReturnCode_t clear_value (in MemberId id)
 
DynamicData loan_value (in MemberId id)
 
DDS::ReturnCode_t return_loaned_value (in DynamicData value)
 
DDS::ReturnCode_t get_int32_value (inout long value, in MemberId id)
 
DDS::ReturnCode_t set_int32_value (in MemberId id, in long value)
 
DDS::ReturnCode_t get_uint32_value (inout unsigned long value, in MemberId id)
 
DDS::ReturnCode_t set_uint32_value (in MemberId id, in unsigned long value)
 
DDS::ReturnCode_t get_int8_value (inout int8 value, in MemberId id)
 
DDS::ReturnCode_t set_int8_value (in MemberId id, in int8 value)
 
DDS::ReturnCode_t get_uint8_value (inout uint8 value, in MemberId id)
 
DDS::ReturnCode_t set_uint8_value (in MemberId id, in uint8 value)
 
DDS::ReturnCode_t get_int16_value (inout short value, in MemberId id)
 
DDS::ReturnCode_t set_int16_value (in MemberId id, in short value)
 
DDS::ReturnCode_t get_uint16_value (inout unsigned short value, in MemberId id)
 
DDS::ReturnCode_t set_uint16_value (in MemberId id, in unsigned short value)
 
DDS::ReturnCode_t get_int64_value (inout long long value, in MemberId id)
 
DDS::ReturnCode_t set_int64_value (in MemberId id, in long long value)
 
DDS::ReturnCode_t get_uint64_value (inout unsigned long long value, in MemberId id)
 
DDS::ReturnCode_t set_uint64_value (in MemberId id, in unsigned long long value)
 
DDS::ReturnCode_t get_float32_value (inout float value, in MemberId id)
 
DDS::ReturnCode_t set_float32_value (in MemberId id, in float value)
 
DDS::ReturnCode_t get_float64_value (inout double value, in MemberId id)
 
DDS::ReturnCode_t set_float64_value (in MemberId id, in double value)
 
DDS::ReturnCode_t get_float128_value (inout long double value, in MemberId id)
 
DDS::ReturnCode_t set_float128_value (in MemberId id, in long double value)
 
DDS::ReturnCode_t get_char8_value (inout char value, in MemberId id)
 
DDS::ReturnCode_t set_char8_value (in MemberId id, in char value)
 
DDS::ReturnCode_t get_char16_value (inout wchar value, in MemberId id)
 
DDS::ReturnCode_t set_char16_value (in MemberId id, in wchar value)
 
DDS::ReturnCode_t get_byte_value (inout octet value, in MemberId id)
 
DDS::ReturnCode_t set_byte_value (in MemberId id, in octet value)
 
DDS::ReturnCode_t get_boolean_value (inout boolean value, in MemberId id)
 
DDS::ReturnCode_t set_boolean_value (in MemberId id, in boolean value)
 
DDS::ReturnCode_t get_string_value (inout string value, in MemberId id)
 
DDS::ReturnCode_t set_string_value (in MemberId id, in string value)
 
DDS::ReturnCode_t get_wstring_value (inout wstring value, in MemberId id)
 
DDS::ReturnCode_t set_wstring_value (in MemberId id, in wstring value)
 
DDS::ReturnCode_t get_complex_value (inout DynamicData value, in MemberId id)
 
DDS::ReturnCode_t set_complex_value (in MemberId id, in DynamicData value)
 
DDS::ReturnCode_t get_int32_values (inout Int32Seq value, in MemberId id)
 
DDS::ReturnCode_t set_int32_values (in MemberId id, in Int32Seq value)
 
DDS::ReturnCode_t get_uint32_values (inout UInt32Seq value, in MemberId id)
 
DDS::ReturnCode_t set_uint32_values (in MemberId id, in UInt32Seq value)
 
DDS::ReturnCode_t get_int8_values (inout Int8Seq value, in MemberId id)
 
DDS::ReturnCode_t set_int8_values (in MemberId id, in Int8Seq value)
 
DDS::ReturnCode_t get_uint8_values (inout UInt8Seq value, in MemberId id)
 
DDS::ReturnCode_t set_uint8_values (in MemberId id, in UInt8Seq value)
 
DDS::ReturnCode_t get_int16_values (inout Int16Seq value, in MemberId id)
 
DDS::ReturnCode_t set_int16_values (in MemberId id, in Int16Seq value)
 
DDS::ReturnCode_t get_uint16_values (inout UInt16Seq value, in MemberId id)
 
DDS::ReturnCode_t set_uint16_values (in MemberId id, in UInt16Seq value)
 
DDS::ReturnCode_t get_int64_values (inout Int64Seq value, in MemberId id)
 
DDS::ReturnCode_t set_int64_values (in MemberId id, in Int64Seq value)
 
DDS::ReturnCode_t get_uint64_values (inout UInt64Seq value, in MemberId id)
 
DDS::ReturnCode_t set_uint64_values (in MemberId id, in UInt64Seq value)
 
DDS::ReturnCode_t get_float32_values (inout Float32Seq value, in MemberId id)
 
DDS::ReturnCode_t set_float32_values (in MemberId id, in Float32Seq value)
 
DDS::ReturnCode_t get_float64_values (inout Float64Seq value, in MemberId id)
 
DDS::ReturnCode_t set_float64_values (in MemberId id, in Float64Seq value)
 
DDS::ReturnCode_t get_float128_values (inout Float128Seq value, in MemberId id)
 
DDS::ReturnCode_t set_float128_values (in MemberId id, in Float128Seq value)
 
DDS::ReturnCode_t get_char8_values (inout CharSeq value, in MemberId id)
 
DDS::ReturnCode_t set_char8_values (in MemberId id, in CharSeq value)
 
DDS::ReturnCode_t get_char16_values (inout WcharSeq value, in MemberId id)
 
DDS::ReturnCode_t set_char16_values (in MemberId id, in WcharSeq value)
 
DDS::ReturnCode_t get_byte_values (inout ByteSeq value, in MemberId id)
 
DDS::ReturnCode_t set_byte_values (in MemberId id, in ByteSeq value)
 
DDS::ReturnCode_t get_boolean_values (inout BooleanSeq value, in MemberId id)
 
DDS::ReturnCode_t set_boolean_values (in MemberId id, in BooleanSeq value)
 
DDS::ReturnCode_t get_string_values (inout StringSeq value, in MemberId id)
 
DDS::ReturnCode_t set_string_values (in MemberId id, in StringSeq value)
 
DDS::ReturnCode_t get_wstring_values (inout WstringSeq value, in MemberId id)
 
DDS::ReturnCode_t set_wstring_values (in MemberId id, in WstringSeq value)
 
- Public Member Functions inherited from OpenDDS::DCPS::LocalObjectBase
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
virtual CORBA::ULong _refcount_value () const
 
- Public Member Functions inherited from CORBA::LocalObject
virtual ~LocalObject (void)
 
virtual CORBA::Boolean _non_existent (void)
 
virtual char * _repository_id (void)
 
virtual CORBA::InterfaceDef_ptr _get_interface (void)
 
virtual CORBA::Object_ptr _get_component (void)
 
virtual void _create_request (CORBA::Context_ptr ctx, const char *operation, CORBA::NVList_ptr arg_list, CORBA::NamedValue_ptr result, CORBA::Request_ptr &request, CORBA::Flags req_flags)
 
virtual void _create_request (CORBA::Context_ptr ctx, const char *operation, CORBA::NVList_ptr arg_list, CORBA::NamedValue_ptr result, CORBA::ExceptionList_ptr exclist, CORBA::ContextList_ptr ctxtlist, CORBA::Request_ptr &request, CORBA::Flags req_flags)
 
virtual CORBA::Request_ptr _request (const char *operation)
 
CORBA::Policy_ptr _get_policy (CORBA::PolicyType type)
 
CORBA::Policy_ptr _get_cached_policy (TAO_Cached_Policy_Type type)
 
CORBA::Object_ptr _set_policy_overrides (const CORBA::PolicyList &policies, CORBA::SetOverrideType set_add)
 
CORBA::PolicyList_get_policy_overrides (const CORBA::PolicyTypeSeq &types)
 
CORBA::Boolean _validate_connection (CORBA::PolicyList_out inconsistent_policies)
 
virtual CORBA::ULong _hash (CORBA::ULong maximum)
 
virtual CORBA::Boolean _is_equivalent (CORBA::Object_ptr other_obj)
 
virtual CORBA::ORB_ptr _get_orb (void)
 
virtual TAO::ObjectKey_key (void)
 
- Public Member Functions inherited from CORBA::Object
virtual ~Object (void)
 
virtual TAO_Abstract_ServantBase_servant (void) const
 
virtual CORBA::Boolean _is_collocated (void) const
 
virtual CORBA::Boolean _is_local (void) const
 
 Object (TAO_Stub *p, CORBA::Boolean collocated=false, TAO_Abstract_ServantBase *servant=0, TAO_ORB_Core *orb_core=0)
 
 Object (IOP::IOR *ior, TAO_ORB_Core *orb_core)
 
virtual TAO_Stub_stubobj (void) const
 
virtual TAO_Stub_stubobj (void)
 
virtual void _proxy_broker (TAO::Object_Proxy_Broker *proxy_broker)
 
virtual CORBA::Boolean marshal (TAO_OutputCDR &cdr)
 
CORBA::Boolean is_evaluated (void) const
 
TAO_ORB_Coreorb_core (void) const
 
IOP::IORsteal_ior (void)
 
const IOP::IORior (void) const
 
virtual bool can_convert_to_ior (void) const
 
virtual char * convert_to_ior (bool use_omg_ior_format, const char *ior_prefix) const
 
void _decr_refcount (void)
 
virtual CORBA::Boolean _is_a (const char *logical_type_id)
 
virtual const char * _interface_repository_id (void) const
 
CORBA::Policy_ptr _get_policy (CORBA::PolicyType type)
 
CORBA::Policy_ptr _get_cached_policy (TAO_Cached_Policy_Type type)
 
CORBA::Object_ptr _set_policy_overrides (const CORBA::PolicyList &policies, CORBA::SetOverrideType set_add)
 
CORBA::PolicyList_get_policy_overrides (const CORBA::PolicyTypeSeq &types)
 
CORBA::Boolean _validate_connection (CORBA::PolicyList_out inconsistent_policies)
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Private Member Functions

void copy (const DynamicDataXcdrReadImpl &other)
 
bool skip_all ()
 
void setup_stream (ACE_Message_Block *chain)
 
template<typename ValueType >
bool read_value (ValueType &value, TypeKind tk)
 
bool exclude_struct_member (MemberId id, DDS::MemberDescriptor_var &md) const
 Check if a member with a given id is excluded from struct sample. More...
 
bool exclude_union_member (MemberId id) const
 Check if a member with a given Id is excluded from a union sample. More...
 
template<TypeKind ValueTypeKind, typename ValueType >
DDS::ReturnCode_t get_single_value (ValueType &value, MemberId id, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
 
template<TypeKind CharKind, TypeKind StringKind, typename ToCharT , typename CharT >
DDS::ReturnCode_t get_char_common (CharT &value, MemberId id)
 Common method to read a single char8 or char16 value. More...
 
template<typename UIntType , TypeKind UIntTypeKind>
bool get_boolean_from_bitmask (ACE_CDR::ULong index, ACE_CDR::Boolean &value)
 
bool skip_to_struct_member (DDS::MemberDescriptor *member_desc, MemberId id)
 
bool get_from_struct_common_checks (const DDS::MemberDescriptor_var &md, MemberId id, TypeKind kind, bool is_sequence=false)
 
DDS::MemberDescriptorget_union_selected_member ()
 Return the member descriptor for the selected member from a union data or null. More...
 
DDS::MemberDescriptorget_from_union_common_checks (MemberId id, const char *func_name)
 
bool skip_to_map_element (MemberId id)
 
template<typename SequenceType >
bool read_values (SequenceType &value, TypeKind elem_tk)
 
template<TypeKind ElementTypeKind, typename SequenceType >
DDS::ReturnCode_t get_sequence_values (SequenceType &value, MemberId id, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
 Common method to read a value sequence of any type (primitive, string, wstring). More...
 
bool skip (const char *func_name, const char *description, size_t n, int size=1)
 
bool read_discriminator (const DDS::DynamicType_ptr disc_type, DDS::ExtensibilityKind union_ek, ACE_CDR::Long &label)
 
bool skip_struct_member_at_index (ACE_CDR::ULong index, ACE_CDR::ULong &num_skipped)
 
bool skip_member (DDS::DynamicType_ptr member_type)
 
bool skip_collection_member (DDS::DynamicType_ptr coll_type)
 
bool skip_aggregated_member (DDS::DynamicType_ptr type)
 Skip a member which is a structure or a union. More...
 
void release_chains ()
 
bool get_primitive_size (DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
 
bool has_optional_member (bool &has_optional) const
 
typedef OPENDDS_SET (DCPS::String) DynamicTypeNameSet
 A set of strings used to prevent infinite recursion when checking for XCDR1 Mutable. More...
 
bool check_xcdr1_mutable_i (DDS::DynamicType_ptr dt, DynamicTypeNameSet &dtns)
 
typedef OPENDDS_VECTOR (ACE_Message_Block *) IntermediateChains
 
const IntermediateChains & get_intermediate_chains () const
 
template<TypeKind MemberTypeKind, typename MemberType >
bool get_value_from_struct (MemberType &value, MemberId id, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
 
template<TypeKind MemberTypeKind, typename MemberType >
bool get_value_from_union (MemberType &value, MemberId id, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
 
template<TypeKind ElementTypeKind, typename ElementType >
bool get_value_from_collection (ElementType &value, MemberId id, TypeKind collection_tk, TypeKind enum_or_bitmask=TK_NONE, LBound lower=0, LBound upper=0)
 
bool skip_to_sequence_element (MemberId id, DDS::DynamicType_ptr coll_type=0)
 
bool skip_to_array_element (MemberId id, DDS::DynamicType_ptr coll_type=0)
 
template<TypeKind ElementTypeKind, typename SequenceType >
bool get_values_from_struct (SequenceType &value, MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper)
 
template<TypeKind ElementTypeKind, typename SequenceType >
bool get_values_from_union (SequenceType &value, MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper)
 
template<TypeKind ElementTypeKind, typename SequenceType >
bool get_values_from_sequence (SequenceType &value, MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper)
 
template<TypeKind ElementTypeKind, typename SequenceType >
bool get_values_from_array (SequenceType &value, MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper)
 
template<TypeKind ElementTypeKind, typename SequenceType >
bool get_values_from_map (SequenceType &value, MemberId id, TypeKind enum_or_bitmask, LBound lower, LBound upper)
 
bool skip_sequence_member (DDS::DynamicType_ptr type)
 
bool skip_array_member (DDS::DynamicType_ptr type)
 
bool skip_map_member (DDS::DynamicType_ptr type)
 

Private Attributes

ACE_Message_Blockchain_
 
DCPS::Encoding encoding_
 
DCPS::Sample::Extent extent_
 
bool reset_align_state_
 
DCPS::Serializer::RdState align_state_
 
DCPS::Serializer strm_
 
IntermediateChains chains_to_release
 
ACE_CDR::ULong item_count_
 Cache the number of items (i.e., members or elements) in the data it holds. More...
 

Static Private Attributes

static const ACE_CDR::ULong ITEM_COUNT_INVALID = ACE_UINT32_MAX
 

Additional Inherited Members

- Public Types inherited from OpenDDS::DCPS::LocalObject< DDS::DynamicData >
typedef DDS::DynamicData ::_ptr_type _ptr_type
 
typedef DDS::DynamicData ::_var_type _var_type
 
- Public Types inherited from CORBA::LocalObject
typedef LocalObject_ptr _ptr_type
 
typedef LocalObject_var _var_type
 
typedef LocalObject_out _out_type
 
- Public Types inherited from CORBA::Object
typedef Object_ptr _ptr_type
 
typedef Object_var _var_type
 
typedef Object_out _out_type
 
- Static Public Member Functions inherited from OpenDDS::XTypes::DynamicDataBase
static bool has_explicit_keys (DDS::DynamicType *dt)
 
static bool exclude_member (DCPS::Sample::Extent ext, bool is_key, bool has_explicit_keys)
 
static DCPS::Sample::Extent nested (DCPS::Sample::Extent ext)
 
- Static Public Member Functions inherited from OpenDDS::DCPS::LocalObject< DDS::DynamicData >
static _ptr_type _narrow (CORBA::Object_ptr obj)
 
- Static Public Member Functions inherited from CORBA::LocalObject
static LocalObject_ptr _duplicate (LocalObject_ptr obj)
 
static LocalObject_ptr _nil (void)
 
static LocalObject_ptr _narrow (CORBA::Object_ptr obj)
 
- Static Public Member Functions inherited from CORBA::Object
static CORBA::Boolean marshal (const Object_ptr x, TAO_OutputCDR &cdr)
 
static void _tao_any_destructor (void *)
 
static CORBA::Boolean is_nil_i (CORBA::Object_ptr obj)
 
static void tao_object_initialize (Object *)
 
static CORBA::Object_ptr _duplicate (CORBA::Object_ptr obj)
 
static CORBA::Object_ptr _nil (void)
 
static CORBA::Object_ptr _narrow (CORBA::Object_ptr obj)
 
- Public Attributes inherited from DDS::DynamicData
readonly attribute DynamicType type
 
- Protected Member Functions inherited from OpenDDS::XTypes::DynamicDataBase
bool is_type_supported (TypeKind tk, const char *func_name)
 
bool is_primitive (TypeKind tk) const
 
bool is_basic (TypeKind tk) const
 
bool is_complex (TypeKind tk) const
 
bool get_index_from_id (DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const
 
bool enum_string_helper (char *&strInOut, MemberId id)
 
DDS::ReturnCode_t check_member (DDS::MemberDescriptor_var &md, DDS::DynamicType_var &type, const char *method, const char *what, DDS::MemberId id, DDS::TypeKind tk)
 
DDS::DynamicDatainterface_from_this () const
 
- Protected Member Functions inherited from CORBA::LocalObject
 LocalObject (void)
 
- Protected Member Functions inherited from CORBA::Object
 Object (int dummy=0)
 
TAO::Object_Proxy_Brokerproxy_broker () const
 
- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 
- Static Protected Member Functions inherited from OpenDDS::XTypes::DynamicDataBase
static CORBA::ULong bound_total (DDS::TypeDescriptor_var descriptor)
 
static DDS::MemberId get_union_default_member (DDS::DynamicType *type)
 
static bool discriminator_selects_no_member (DDS::DynamicType *type, ACE_CDR::Long disc)
 
- Protected Attributes inherited from OpenDDS::XTypes::DynamicDataBase
DDS::DynamicType_var type_
 The actual (i.e., non-alias) DynamicType of the associated type. More...
 
- Protected Attributes inherited from CORBA::Object
ACE_Atomic_Op< TAO_SYNCH_MUTEX, unsigned long > refcount_
 

Detailed Description

Definition at line 22 of file DynamicDataXcdrReadImpl.h.

Constructor & Destructor Documentation

◆ DynamicDataXcdrReadImpl() [1/4]

OpenDDS::XTypes::DynamicDataXcdrReadImpl::DynamicDataXcdrReadImpl ( )

◆ DynamicDataXcdrReadImpl() [2/4]

OpenDDS::XTypes::DynamicDataXcdrReadImpl::DynamicDataXcdrReadImpl ( ACE_Message_Block chain,
const DCPS::Encoding encoding,
DDS::DynamicType_ptr  type,
DCPS::Sample::Extent  ext = DCPS::Sample::Full 
)

This creates a duplicated ACE_Message_Block chain from the provided chain. The duplicated chain is released when the object is destroyed. Caller is responsible for the release of the input message block chain.

Definition at line 59 of file DynamicDataXcdrReadImpl.cpp.

References encoding_, OpenDDS::DCPS::Encoding::xcdr_version(), OpenDDS::DCPS::Encoding::XCDR_VERSION_1, and OpenDDS::DCPS::Encoding::XCDR_VERSION_2.

64  , chain_(chain->duplicate())
66  , extent_(ext)
67  , reset_align_state_(false)
70 {
73  throw std::runtime_error("DynamicDataXcdrReadImpl only supports XCDR1 and XCDR2");
74  }
75 }
XcdrVersion xcdr_version() const
Definition: Serializer.inl:127
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
virtual ACE_Message_Block * duplicate(void) const
ACE_CDR::ULong item_count_
Cache the number of items (i.e., members or elements) in the data it holds.

◆ DynamicDataXcdrReadImpl() [3/4]

OpenDDS::XTypes::DynamicDataXcdrReadImpl::DynamicDataXcdrReadImpl ( DCPS::Serializer ser,
DDS::DynamicType_ptr  type,
DCPS::Sample::Extent  ext = DCPS::Sample::Full 
)

Use this when you want to pass the alignment state of a given Serializer object over. A typical use case would be when a part of the data has already been consumed from ser and you want to give the remaining to DynamicData.

Definition at line 77 of file DynamicDataXcdrReadImpl.cpp.

References align_state_, encoding_, OpenDDS::DCPS::Serializer::rdstate(), strm_, OpenDDS::DCPS::Encoding::xcdr_version(), OpenDDS::DCPS::Encoding::XCDR_VERSION_1, and OpenDDS::DCPS::Encoding::XCDR_VERSION_2.

80  , chain_(ser.current()->duplicate())
81  , encoding_(ser.encoding())
82  , extent_(ext)
83  , reset_align_state_(true)
84  , align_state_(ser.rdstate())
87 {
90  throw std::runtime_error("DynamicDataXcdrReadImpl only supports XCDR1 and XCDR2");
91  }
92 
94 }
XcdrVersion xcdr_version() const
Definition: Serializer.inl:127
ACE_CDR::ULong item_count_
Cache the number of items (i.e., members or elements) in the data it holds.

◆ DynamicDataXcdrReadImpl() [4/4]

OpenDDS::XTypes::DynamicDataXcdrReadImpl::DynamicDataXcdrReadImpl ( const DynamicDataXcdrReadImpl other)

Definition at line 96 of file DynamicDataXcdrReadImpl.cpp.

References copy().

◆ ~DynamicDataXcdrReadImpl()

OpenDDS::XTypes::DynamicDataXcdrReadImpl::~DynamicDataXcdrReadImpl ( )

Definition at line 116 of file DynamicDataXcdrReadImpl.cpp.

References chain_, and ACE_Message_Block::release().

117 {
119 }
virtual ACE_Message_Block * release(void)

Member Function Documentation

◆ check_xcdr1_mutable()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::check_xcdr1_mutable ( DDS::DynamicType_ptr  dt)

Definition at line 2059 of file DynamicDataXcdrReadImpl.cpp.

References check_xcdr1_mutable_i().

Referenced by OpenDDS::DCPS::RecorderImpl::get_dynamic_data().

2060 {
2061  DynamicTypeNameSet dtns;
2062  return check_xcdr1_mutable_i(dt, dtns);
2063 }
bool check_xcdr1_mutable_i(DDS::DynamicType_ptr dt, DynamicTypeNameSet &dtns)

◆ check_xcdr1_mutable_i()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::check_xcdr1_mutable_i ( DDS::DynamicType_ptr  dt,
DynamicTypeNameSet &  dtns 
)
private

Definition at line 2805 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, encoding_, TAO::String_var< charT >::in(), OpenDDS::DCPS::Encoding::kind(), OpenDDS::DCPS::Encoding::KIND_XCDR1, LM_NOTICE, DDS::MUTABLE, OpenDDS::DCPS::LogLevel::Notice, DDS::RETCODE_OK, and value.

Referenced by check_xcdr1_mutable().

2806 {
2807  DDS::TypeDescriptor_var descriptor;
2808  if (dt->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2809  return false;
2810  }
2811 
2812  if (dtns.find(descriptor->name()) != dtns.end()) {
2813  return true;
2814  }
2815  if (descriptor->extensibility_kind() == DDS::MUTABLE &&
2818  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::check_xcdr1_mutable: "
2819  "XCDR1 mutable is not currently supported in OpenDDS\n"));
2820  }
2821  return false;
2822  }
2823  dtns.insert(descriptor->name());
2824  for (ACE_CDR::ULong i = 0; i < dt->get_member_count(); ++i) {
2825  DDS::DynamicTypeMember_var dtm;
2826  if (dt->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
2828  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::check_xcdr1_mutable: "
2829  "Failed to get member from DynamicType\n"));
2830  }
2831  return false;
2832  }
2833  DDS::MemberDescriptor_var descriptor;
2834  if (dtm->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2835  return false;
2836  }
2837  if (!check_xcdr1_mutable_i(descriptor->type(), dtns)) {
2838  return false;
2839  }
2840  }
2841  return true;
2842 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const ReturnCode_t RETCODE_OK
bool check_xcdr1_mutable_i(DDS::DynamicType_ptr dt, DynamicTypeNameSet &dtns)
ACE_UINT32 ULong

◆ clear_all_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::clear_all_values ( )

Implements DDS::DynamicData.

Definition at line 631 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED.

632 {
634 }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ clear_nonkey_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::clear_nonkey_values ( )

Implements DDS::DynamicData.

Definition at line 636 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED.

637 {
639 }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ clear_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::clear_value ( DDS::MemberId  id)

Definition at line 641 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED.

642 {
644 }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ clone()

DDS::DynamicData_ptr OpenDDS::XTypes::DynamicDataXcdrReadImpl::clone ( void  )

◆ copy()

void OpenDDS::XTypes::DynamicDataXcdrReadImpl::copy ( const DynamicDataXcdrReadImpl other)
private

Definition at line 121 of file DynamicDataXcdrReadImpl.cpp.

References align_state_, chain_, ACE_Message_Block::duplicate(), encoding_, extent_, item_count_, ACE_Message_Block::release(), reset_align_state_, strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

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

122 {
124  chain_ = other.chain_->duplicate();
125  encoding_ = other.encoding_;
126  extent_ = other.extent_;
127  reset_align_state_ = other.reset_align_state_;
128  align_state_ = other.align_state_;
129  strm_ = other.strm_;
130  type_ = other.type_;
131  item_count_ = other.item_count_;
132 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
virtual ACE_Message_Block * release(void)
virtual ACE_Message_Block * duplicate(void) const
ACE_CDR::ULong item_count_
Cache the number of items (i.e., members or elements) in the data it holds.

◆ equals()

CORBA::Boolean OpenDDS::XTypes::DynamicDataXcdrReadImpl::equals ( DDS::DynamicData_ptr  other)

Definition at line 2065 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, and LM_ERROR.

2066 {
2067  // FUTURE: Implement this.
2068  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: DynamicDataXcdrReadImpl::equals: Not implemented\n"));
2069  return false;
2070 }
#define ACE_ERROR(X)

◆ exclude_struct_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::exclude_struct_member ( MemberId  id,
DDS::MemberDescriptor_var &  md 
) const
private

Check if a member with a given id is excluded from struct sample.

Definition at line 706 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, OpenDDS::XTypes::DynamicDataBase::exclude_member(), extent_, OpenDDS::XTypes::DynamicDataBase::has_explicit_keys(), LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, DDS::RETCODE_OK, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_struct(), and get_values_from_struct().

707 {
708  DDS::DynamicTypeMember_var dtm;
709  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
711  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::exclude_struct_member:"
712  " Failed to get DynamicTypeMember for member with ID %d\n", id));
713 
714  }
715  return false;
716  }
717  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
719  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::exclude_struct_member:"
720  " Failed to get MemberDescriptor for member with ID %d\n", id));
721  }
722  return false;
723  }
724  return exclude_member(extent_, md->is_key(), has_explicit_keys(type_));
725 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
static bool has_explicit_keys(DDS::DynamicType *dt)
static bool exclude_member(DCPS::Sample::Extent ext, bool is_key, bool has_explicit_keys)

◆ exclude_union_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::exclude_union_member ( MemberId  id) const
private

Check if a member with a given Id is excluded from a union sample.

Definition at line 848 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, OpenDDS::XTypes::DISCRIMINATOR_ID, extent_, OpenDDS::DCPS::Sample::Full, OpenDDS::DCPS::Sample::KeyOnly, LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, DDS::RETCODE_OK, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_union(), and get_values_from_union().

849 {
850  if (extent_ == DCPS::Sample::Full) {
851  return false;
852  }
853 
854  if (id != DISCRIMINATOR_ID) {
855  return true;
856  }
857 
859  // Discriminator not marked as key is not included in a KeyOnly sample.
860  DDS::DynamicTypeMember_var disc_dtm;
861  if (type_->get_member(disc_dtm, DISCRIMINATOR_ID) != DDS::RETCODE_OK) {
863  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::exclude_union_member:"
864  " Failed to get DynamicTypeMember for discriminator\n"));
865  }
866  return false;
867  }
868  DDS::MemberDescriptor_var disc_md;
869  if (disc_dtm->get_descriptor(disc_md) != DDS::RETCODE_OK) {
871  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::exclude_union_member:"
872  " Failed to get MemberDescriptor for discriminator\n"));
873  }
874  return false;
875  }
876  if (!disc_md->is_key()) {
877  return true;
878  }
879  }
880  return false;
881 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913

◆ get_boolean_from_bitmask()

template<typename UIntType , TypeKind UIntTypeKind>
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_boolean_from_bitmask ( ACE_CDR::ULong  index,
ACE_CDR::Boolean value 
)
private

Definition at line 1368 of file DynamicDataXcdrReadImpl.cpp.

References read_value().

1369 {
1370  UIntType bitmask;
1371  if (!read_value(bitmask, UIntTypeKind)) {
1372  return false;
1373  }
1374 
1375  value = ((1ULL << index) & bitmask) ? true : false;
1376  return true;
1377 }
bool read_value(ValueType &value, TypeKind tk)
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_boolean_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_boolean_value ( CORBA::Boolean value,
DDS::MemberId  id 
)

Definition at line 1379 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, extent_, OpenDDS::XTypes::DynamicDataBase::get_index_from_id(), LM_ERROR, read_value(), DDS::RETCODE_ERROR, DDS::RETCODE_OK, strm_, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_BITMASK, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, OpenDDS::XTypes::typekind_to_string(), and value.

Referenced by get_simple_value().

1380 {
1381  ScopedChainManager chain_manager(*this);
1382 
1383  const TypeKind tk = type_->get_kind();
1384  bool good = true;
1385 
1386  switch (tk) {
1387  case TK_BOOLEAN:
1389  break;
1390  case TK_BITMASK:
1391  {
1392  DDS::TypeDescriptor_var descriptor;
1393  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1394  return DDS::RETCODE_ERROR;
1395  }
1396  const LBound bit_bound = descriptor->bound()[0];
1397  ACE_CDR::ULong index;
1398  if (!get_index_from_id(id, index, bit_bound)) {
1399  if (DCPS::DCPS_debug_level >= 1) {
1400  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_boolean_value -")
1401  ACE_TEXT(" Id %d is not valid in a bitmask with bit_bound %d\n"),
1402  id, bit_bound));
1403  }
1404  good = false;
1405  break;
1406  }
1407 
1408  // Bit with index 0 is the least-significant bit of the representing integer.
1409  if (bit_bound >= 1 && bit_bound <= 8) {
1410  ACE_CDR::UInt8 bitmask;
1411  ACE_InputCDR::to_uint8 to_uint8(bitmask);
1412  if (!read_value(to_uint8, TK_UINT8)) {
1413  good = false;
1414  } else {
1415  value = ((1 << index) & bitmask) ? true : false;
1416  }
1417  } else if (bit_bound >= 9 && bit_bound <= 16) {
1418  good = get_boolean_from_bitmask<ACE_CDR::UInt16, TK_UINT16>(index, value);
1419  } else if (bit_bound >= 17 && bit_bound <= 32) {
1420  good = get_boolean_from_bitmask<ACE_CDR::UInt32, TK_UINT32>(index, value);
1421  } else {
1422  good = get_boolean_from_bitmask<ACE_CDR::UInt64, TK_UINT64>(index, value);
1423  }
1424  break;
1425  }
1426  case TK_STRUCTURE:
1427  {
1429  good = get_value_from_struct<TK_BOOLEAN>(to_bool, id, extent_);
1430  break;
1431  }
1432  case TK_UNION:
1433  {
1435  good = get_value_from_union<TK_BOOLEAN>(to_bool, id);
1436  break;
1437  }
1438  case TK_SEQUENCE:
1439  case TK_ARRAY:
1440  case TK_MAP:
1441  {
1443  good = get_value_from_collection<TK_BOOLEAN>(to_bool, id, tk);
1444  break;
1445  }
1446  default:
1447  good = false;
1448  break;
1449  }
1450 
1451  if (!good && DCPS::DCPS_debug_level >= 1) {
1452  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_boolean_value -")
1453  ACE_TEXT(" Failed to read DynamicData object of type %C\n"), typekind_to_string(tk)));
1454  }
1455  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1456 }
bool read_value(ValueType &value, TypeKind tk)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const ReturnCode_t RETCODE_ERROR
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
ACE_UINT32 ULong
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_UINT8 UInt8
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const

◆ get_boolean_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_boolean_values ( DDS::BooleanSeq value,
DDS::MemberId  id 
)

Definition at line 2035 of file DynamicDataXcdrReadImpl.cpp.

References value.

2036 {
2037  return get_sequence_values<TK_BOOLEAN>(value, id);
2038 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_byte_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_byte_value ( CORBA::Octet value,
DDS::MemberId  id 
)

Definition at line 1361 of file DynamicDataXcdrReadImpl.cpp.

Referenced by get_simple_value().

1362 {
1363  ACE_InputCDR::to_octet to_octet(value);
1364  return get_single_value<TK_BYTE>(to_octet, id);
1365 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_byte_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_byte_values ( DDS::ByteSeq value,
DDS::MemberId  id 
)

Definition at line 2030 of file DynamicDataXcdrReadImpl.cpp.

References value.

2031 {
2032  return get_sequence_values<TK_BYTE>(value, id);
2033 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_char16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_char16_value ( CORBA::WChar value,
DDS::MemberId  id 
)

Definition at line 1352 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED, and value.

Referenced by get_simple_value().

1353 {
1354 #ifdef DDS_HAS_WCHAR
1355  return get_char_common<TK_CHAR16, TK_STRING16, ACE_InputCDR::to_wchar>(value, id);
1356 #else
1357  return DDS::RETCODE_UNSUPPORTED;
1358 #endif
1359 }
const LogLevel::Value value
Definition: debug.cpp:61
const ReturnCode_t RETCODE_UNSUPPORTED

◆ get_char16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_char16_values ( DDS::WcharSeq value,
DDS::MemberId  id 
)

Definition at line 2021 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED, and value.

2022 {
2023 #ifdef DDS_HAS_WCHAR
2024  return get_sequence_values<TK_CHAR16>(value, id);
2025 #else
2026  return DDS::RETCODE_UNSUPPORTED;
2027 #endif
2028 }
const LogLevel::Value value
Definition: debug.cpp:61
const ReturnCode_t RETCODE_UNSUPPORTED

◆ get_char8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_char8_value ( CORBA::Char value,
DDS::MemberId  id 
)

Definition at line 1347 of file DynamicDataXcdrReadImpl.cpp.

References value.

Referenced by get_simple_value().

1348 {
1349  return get_char_common<TK_CHAR8, TK_STRING8, ACE_InputCDR::to_char>(value, id);
1350 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_char8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_char8_values ( DDS::CharSeq value,
DDS::MemberId  id 
)

Definition at line 2016 of file DynamicDataXcdrReadImpl.cpp.

References value.

2017 {
2018  return get_sequence_values<TK_CHAR8>(value, id);
2019 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_char_common()

template<TypeKind CharKind, TypeKind StringKind, typename ToCharT , typename CharT >
DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_char_common ( CharT &  value,
MemberId  id 
)
private

Common method to read a single char8 or char16 value.

Definition at line 1276 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, extent_, OpenDDS::XTypes::DynamicDataBase::get_index_from_id(), LM_ERROR, DDS::RETCODE_ERROR, DDS::RETCODE_OK, ACE_OS::strlen(), strm_, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1277 {
1278  ScopedChainManager chain_manager(*this);
1279 
1280  const TypeKind tk = type_->get_kind();
1281  bool good = true;
1282 
1283  switch (tk) {
1284  case CharKind:
1285  {
1286  ToCharT wrap(value);
1287  good = strm_ >> wrap;
1288  break;
1289  }
1290  case StringKind:
1291  {
1292  CharT* str;
1293  if (!(strm_ >> str)) {
1294  if (DCPS::DCPS_debug_level >= 1) {
1295  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_char_common -")
1296  ACE_TEXT(" Failed to read wstring with ID %d\n"), id));
1297  }
1298  good = false;
1299  break;
1300  }
1301  ACE_CDR::ULong index;
1302  const size_t str_len = ACE_OS::strlen(str);
1303  if (!get_index_from_id(id, index, static_cast<ACE_CDR::ULong>(str_len))) {
1304  if (DCPS::DCPS_debug_level >= 1) {
1305  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_char_common -")
1306  ACE_TEXT(" ID %d is not valid in a string (or wstring) with length %d\n"),
1307  id, str_len));
1308  }
1309  good = false;
1310  } else {
1311  value = str[index];
1312  }
1313  break;
1314  }
1315  case TK_STRUCTURE:
1316  {
1317  ToCharT wrap(value);
1318  good = get_value_from_struct<CharKind>(wrap, id, extent_);
1319  break;
1320  }
1321  case TK_UNION:
1322  {
1323  ToCharT wrap(value);
1324  good = get_value_from_union<CharKind>(wrap, id);
1325  break;
1326  }
1327  case TK_SEQUENCE:
1328  case TK_ARRAY:
1329  case TK_MAP:
1330  {
1331  ToCharT wrap(value);
1332  good = get_value_from_collection<CharKind>(wrap, id, tk);
1333  break;
1334  }
1335  default:
1336  good = false;
1337  break;
1338  }
1339 
1340  if (!good && DCPS::DCPS_debug_level >= 1) {
1341  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_char_common -")
1342  ACE_TEXT(" Failed to read DynamicData object of type %C\n"), typekind_to_string(tk)));
1343  }
1344  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1345 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
size_t strlen(const char *s)
const ReturnCode_t RETCODE_ERROR
ACE_UINT32 ULong
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const

◆ get_complex_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_complex_value ( DDS::DynamicData_ptr &  value,
DDS::MemberId  id 
)

Definition at line 1477 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DISCRIMINATOR_ID, DynamicDataXcdrReadImpl(), exclude_struct_member(), exclude_union_member(), extent_, OpenDDS::XTypes::get_base_type(), get_from_union_common_checks(), OpenDDS::DCPS::Sample::KeyOnly, LM_ERROR, LM_NOTICE, DDS::MUTABLE, OpenDDS::XTypes::DynamicDataBase::nested(), OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_parameter_id(), CORBA::release(), DDS::RETCODE_ERROR, DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip_delimiter(), skip_to_array_element(), skip_to_map_element(), skip_to_sequence_element(), skip_to_struct_member(), strm_, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1478 {
1479  ScopedChainManager chain_manager(*this);
1480 
1481  DDS::TypeDescriptor_var descriptor;
1482  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1483  return DDS::RETCODE_ERROR;
1484  }
1485 
1486  const TypeKind tk = type_->get_kind();
1487  bool good = true;
1488 
1489  switch (tk) {
1490  case TK_STRUCTURE:
1491  {
1492  DDS::MemberDescriptor_var md;
1493  if (exclude_struct_member(id, md)) {
1495  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_complex_value:"
1496  " Attempted to read an excluded member from a %C struct sample\n",
1497  extent_ == DCPS::Sample::KeyOnly ? "KeyOnly" : "NestedKeyOnly"));
1498  }
1499  good = false;
1500  break;
1501  }
1502 
1503  if (!skip_to_struct_member(md, id)) {
1504  good = false;
1505  } else {
1506  DDS::DynamicType_ptr member_type = md->type();
1507  if (!member_type) {
1508  good = false;
1509  } else {
1511  value = new DynamicDataXcdrReadImpl(strm_, member_type, nested(extent_));
1512  }
1513  }
1514  break;
1515  }
1516  case TK_UNION:
1517  {
1518  if (exclude_union_member(id)) {
1520  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_complex_value:"
1521  " Attempted to read an excluded member from a %C union sample\n",
1522  extent_ == DCPS::Sample::KeyOnly ? "KeyOnly" : "NestedKeyOnly"));
1523  }
1524  good = false;
1525  break;
1526  }
1527 
1528  if (id == DISCRIMINATOR_ID) {
1529  if (descriptor->extensibility_kind() == DDS::APPENDABLE || descriptor->extensibility_kind() == DDS::MUTABLE) {
1530  if (!strm_.skip_delimiter()) {
1531  good = false;
1532  break;
1533  }
1534  }
1535 
1536  const DDS::DynamicType_var disc_type = get_base_type(descriptor->discriminator_type());
1537  if (descriptor->extensibility_kind() == DDS::MUTABLE) {
1538  unsigned id;
1539  size_t size;
1540  bool must_understand;
1541  if (!strm_.read_parameter_id(id, size, must_understand)) {
1542  good = false;
1543  break;
1544  }
1545  }
1547  value = new DynamicDataXcdrReadImpl(strm_, disc_type, nested(extent_));
1548  break;
1549  }
1550 
1551  DDS::MemberDescriptor_var md = get_from_union_common_checks(id, "get_complex_value");
1552  if (!md) {
1553  good = false;
1554  break;
1555  }
1556 
1557  if (descriptor->extensibility_kind() == DDS::MUTABLE) {
1558  unsigned id;
1559  size_t size;
1560  bool must_understand;
1561  if (!strm_.read_parameter_id(id, size, must_understand)) {
1562  good = false;
1563  break;
1564  }
1565  }
1566  const DDS::DynamicType_ptr member_type = md->type();
1567  if (!member_type) {
1568  good = false;
1569  } else {
1571  value = new DynamicDataXcdrReadImpl(strm_, member_type, nested(extent_));
1572  }
1573  break;
1574  }
1575  case TK_SEQUENCE:
1576  case TK_ARRAY:
1577  case TK_MAP:
1578  {
1579  if ((tk == TK_SEQUENCE && !skip_to_sequence_element(id)) ||
1580  (tk == TK_ARRAY && !skip_to_array_element(id)) ||
1581  (tk == TK_MAP && !skip_to_map_element(id))) {
1582  good = false;
1583  } else {
1585  value = new DynamicDataXcdrReadImpl(strm_, descriptor->element_type(), nested(extent_));
1586  }
1587  break;
1588  }
1589  default:
1590  if (DCPS::DCPS_debug_level >= 1) {
1591  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_complex_value -")
1592  ACE_TEXT(" Called on an unsupported type (%C)\n"), typekind_to_string(tk)));
1593  }
1594  good = false;
1595  break;
1596  }
1597  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1598 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
void release(T x)
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
DDS::MemberDescriptor * get_from_union_common_checks(MemberId id, const char *func_name)
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
bool exclude_union_member(MemberId id) const
Check if a member with a given Id is excluded from a union sample.
bool exclude_struct_member(MemberId id, DDS::MemberDescriptor_var &md) const
Check if a member with a given id is excluded from struct sample.
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
bool skip_to_sequence_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
const ReturnCode_t RETCODE_ERROR
bool skip_to_struct_member(DDS::MemberDescriptor *member_desc, MemberId id)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
static DCPS::Sample::Extent nested(DCPS::Sample::Extent ext)
const char * typekind_to_string(TypeKind tk)
bool skip_to_array_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_float128_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float128_value ( CORBA::LongDouble value,
DDS::MemberId  id 
)

Definition at line 1270 of file DynamicDataXcdrReadImpl.cpp.

References value.

Referenced by get_simple_value().

1271 {
1272  return get_single_value<TK_FLOAT128>(value, id);
1273 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_float128_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float128_values ( DDS::Float128Seq value,
DDS::MemberId  id 
)

Definition at line 2011 of file DynamicDataXcdrReadImpl.cpp.

References value.

2012 {
2013  return get_sequence_values<TK_FLOAT128>(value, id);
2014 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_float32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float32_value ( CORBA::Float value,
DDS::MemberId  id 
)

Definition at line 1260 of file DynamicDataXcdrReadImpl.cpp.

References value.

Referenced by get_simple_value().

1261 {
1262  return get_single_value<TK_FLOAT32>(value, id);
1263 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_float32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float32_values ( DDS::Float32Seq value,
DDS::MemberId  id 
)

Definition at line 2001 of file DynamicDataXcdrReadImpl.cpp.

References value.

2002 {
2003  return get_sequence_values<TK_FLOAT32>(value, id);
2004 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_float64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float64_value ( CORBA::Double value,
DDS::MemberId  id 
)

Definition at line 1265 of file DynamicDataXcdrReadImpl.cpp.

References value.

Referenced by get_simple_value().

1266 {
1267  return get_single_value<TK_FLOAT64>(value, id);
1268 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_float64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_float64_values ( DDS::Float64Seq value,
DDS::MemberId  id 
)

Definition at line 2006 of file DynamicDataXcdrReadImpl.cpp.

References value.

2007 {
2008  return get_sequence_values<TK_FLOAT64>(value, id);
2009 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_from_struct_common_checks()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_from_struct_common_checks ( const DDS::MemberDescriptor_var &  md,
MemberId  id,
TypeKind  kind,
bool  is_sequence = false 
)
private

Definition at line 2205 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_DEBUG, DDS::RETCODE_OK, OpenDDS::XTypes::TK_SEQUENCE, and OpenDDS::XTypes::typekind_to_string().

Referenced by get_value_from_struct(), and get_values_from_struct().

2207 {
2208  const DDS::DynamicType_ptr member_dt = md->type();
2209  if (!member_dt) {
2210  if (DCPS::DCPS_debug_level >= 1) {
2211  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_from_struct_common_checks -")
2212  ACE_TEXT(" Could not get DynamicType for member with ID %d\n"), id));
2213  }
2214  return false;
2215  }
2216 
2217  const DDS::DynamicType_var member_type = get_base_type(member_dt);
2218  const TypeKind member_kind = member_type->get_kind();
2219 
2220  if ((!is_sequence && member_kind != kind) || (is_sequence && member_kind != TK_SEQUENCE)) {
2221  if (DCPS::DCPS_debug_level >= 1) {
2222  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_from_struct_common_checks -")
2223  ACE_TEXT(" Member with ID %d has kind %C, not %C\n"),
2224  id, typekind_to_string(member_kind),
2225  is_sequence ? typekind_to_string(TK_SEQUENCE) : typekind_to_string(kind)));
2226  }
2227  return false;
2228  }
2229 
2230  if (member_kind == TK_SEQUENCE) {
2231  DDS::TypeDescriptor_var member_td;
2232  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
2233  if (DCPS::DCPS_debug_level >= 1) {
2234  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_from_struct_common_checks -")
2235  ACE_TEXT(" Could not get type descriptor for member %d\n"),
2236  id));
2237  }
2238  return false;
2239  }
2240  const TypeKind elem_kind = get_base_type(member_td->element_type())->get_kind();
2241  if (elem_kind != kind) {
2242  if (DCPS::DCPS_debug_level >= 1) {
2243  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_from_struct_common_checks -")
2244  ACE_TEXT(" Member with ID %d is a sequence of %C, not %C\n"),
2245  id, typekind_to_string(elem_kind), typekind_to_string(kind)));
2246  }
2247  return false;
2248  }
2249  }
2250 
2251  return true;
2252 }
#define ACE_DEBUG(X)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_from_union_common_checks()

DDS::MemberDescriptor * OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_from_union_common_checks ( MemberId  id,
const char *  func_name 
)
private

Definition at line 818 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, get_union_selected_member(), LM_DEBUG, LM_ERROR, and OpenDDS::XTypes::MEMBER_ID_INVALID.

Referenced by get_complex_value(), get_value_from_union(), and get_values_from_union().

819 {
820  DDS::MemberDescriptor_var md = get_union_selected_member();
821  if (!md) {
822  if (DCPS::DCPS_debug_level >= 1) {
823  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::%C - Could not find")
824  ACE_TEXT(" MemberDescriptor for the selected union member\n"), func_name));
825  }
826  return 0;
827  }
828 
829  if (md->id() == MEMBER_ID_INVALID) {
830  if (DCPS::DCPS_debug_level >= 1) {
831  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::%C - Union has no selected member\n"), func_name));
832  }
833  return 0;
834  }
835 
836  if (md->id() != id) {
837  if (DCPS::DCPS_debug_level >= 1) {
838  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::%C -")
839  ACE_TEXT(" ID of the selected member (%d) is not the requested ID (%d)\n"),
840  func_name, md->id(), id));
841  }
842  return 0;
843  }
844 
845  return md._retn();
846 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const ACE_CDR::ULong MEMBER_ID_INVALID
Definition: TypeObject.h:911
DDS::MemberDescriptor * get_union_selected_member()
Return the member descriptor for the selected member from a union data or null.
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")

◆ get_int16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int16_value ( CORBA::Short value,
DDS::MemberId  id 
)

Definition at line 1240 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM, and value.

Referenced by get_simple_value().

1241 {
1242  return get_single_value<TK_INT16>(value, id, TK_ENUM, 9, 16);
1243 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_int16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int16_values ( DDS::Int16Seq value,
DDS::MemberId  id 
)

Definition at line 1981 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM, and value.

1982 {
1983  return get_sequence_values<TK_INT16>(value, id, TK_ENUM, 9, 16);
1984 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_int32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int32_value ( CORBA::Long value,
DDS::MemberId  id 
)

Definition at line 1216 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM, and value.

Referenced by get_simple_value().

1217 {
1218  return get_single_value<TK_INT32>(value, id, TK_ENUM,
1219  static_cast<LBound>(17), static_cast<LBound>(32));
1220 }
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_int32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int32_values ( DDS::Int32Seq value,
DDS::MemberId  id 
)

Definition at line 1961 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM, and value.

1962 {
1963  return get_sequence_values<TK_INT32>(value, id, TK_ENUM, 17, 32);
1964 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_int64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int64_value ( CORBA::LongLong value,
DDS::MemberId  id 
)

Definition at line 1250 of file DynamicDataXcdrReadImpl.cpp.

References value.

Referenced by get_simple_value().

1251 {
1252  return get_single_value<TK_INT64>(value, id);
1253 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_int64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int64_values ( DDS::Int64Seq value,
DDS::MemberId  id 
)

Definition at line 1991 of file DynamicDataXcdrReadImpl.cpp.

References value.

1992 {
1993  return get_sequence_values<TK_INT64>(value, id);
1994 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_int8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int8_value ( CORBA::Int8 value,
DDS::MemberId  id 
)

Definition at line 1228 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM.

Referenced by get_simple_value().

1229 {
1230  ACE_InputCDR::to_int8 to_int8(value);
1231  return get_single_value<TK_INT8>(to_int8, id, TK_ENUM, 1, 8);
1232 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_int8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_int8_values ( DDS::Int8Seq value,
DDS::MemberId  id 
)

Definition at line 1971 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_ENUM, and value.

1972 {
1973  return get_sequence_values<TK_INT8>(value, id, TK_ENUM, 1, 8);
1974 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_ENUM
Definition: TypeObject.h:238

◆ get_intermediate_chains()

const IntermediateChains& OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_intermediate_chains ( ) const
inlineprivate

Definition at line 537 of file DynamicDataXcdrReadImpl.h.

Referenced by skip_aggregated_member().

◆ get_item_count()

ACE_CDR::ULong OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_item_count ( )

Implements DDS::DynamicData.

Definition at line 373 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::XTypes::DynamicTypeMembersByIdImpl::begin(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DISCRIMINATOR_ID, OpenDDS::XTypes::DynamicTypeMembersByIdImpl::end(), extent_, DDS::FINAL, OpenDDS::DCPS::Sample::Full, OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::has_explicit_keys(), has_optional_member(), OpenDDS::XTypes::DynamicDataBase::is_primitive(), item_count_, ITEM_COUNT_INVALID, OpenDDS::DCPS::Sample::KeyOnly, OpenDDS::XTypes::Sequence< T >::length(), LM_DEBUG, DDS::MUTABLE, OpenDDS::DCPS::Serializer::read_delimiter(), read_discriminator(), OpenDDS::DCPS::Serializer::read_parameter_id(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::rpos(), OpenDDS::DCPS::Serializer::skip(), OpenDDS::DCPS::Serializer::skip_delimiter(), skip_member(), skip_sequence_member(), skip_struct_member_at_index(), strm_, struct_has_explicit_keys(), OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_BITMASK, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

Referenced by get_member_id_at_index().

374 {
376  return item_count_;
377  }
378 
379  ScopedChainManager chain_manager(*this);
380 
381  DDS::TypeDescriptor_var descriptor;
382  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
383  return 0;
384  }
385 
386  const TypeKind tk = type_->get_kind();
387  switch (tk) {
388  case TK_BOOLEAN:
389  case TK_BYTE:
390  case TK_INT16:
391  case TK_INT32:
392  case TK_INT64:
393  case TK_UINT16:
394  case TK_UINT32:
395  case TK_UINT64:
396  case TK_FLOAT32:
397  case TK_FLOAT64:
398  case TK_FLOAT128:
399  case TK_INT8:
400  case TK_UINT8:
401  case TK_CHAR8:
402  case TK_CHAR16:
403  case TK_ENUM:
404  return 1;
405  case TK_STRING8:
406  case TK_STRING16:
407  {
408  ACE_CDR::ULong bytes;
409  if (!(strm_ >> bytes)) {
410  return 0;
411  }
412  return (type_->get_kind() == TK_STRING8) ? bytes : bytes/2;
413  }
414  case TK_BITMASK:
415  return descriptor->bound()[0];
416  case TK_STRUCTURE:
417  {
418  bool has_optional;
419  if (!has_optional_member(has_optional)) {
420  return 0;
421  }
422 
423  if (extent_ != DCPS::Sample::Full) {
425  if (struct_has_explicit_keys) {
426  ACE_CDR::ULong num_explicit_keys = 0;
427  for (ACE_CDR::ULong i = 0; i < type_->get_member_count(); ++i) {
428  DDS::DynamicTypeMember_var dtm;
429  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
430  return 0;
431  }
432  DDS::MemberDescriptor_var md;
433  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
434  return 0;
435  }
436  if (md->is_key()) {
437  ++num_explicit_keys;
438  }
439  }
440  return num_explicit_keys;
441  } else if (extent_ == DCPS::Sample::KeyOnly) {
442  return 0;
443  }
444  }
445 
446  // Full sample or NestedKeyOnly sample with no explicit key.
447  if (!has_optional) {
448  return type_->get_member_count();
449  }
450 
451  // Optional members can be omitted, so we need to count members one by one.
452  ACE_CDR::ULong actual_count = 0;
453  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
454  if (ek == DDS::FINAL || ek == DDS::APPENDABLE) {
455  if (ek == DDS::APPENDABLE) {
456  if (!strm_.skip_delimiter()) {
457  return 0;
458  }
459  }
460  for (ACE_CDR::ULong i = 0; i < type_->get_member_count(); ++i) {
461  ACE_CDR::ULong num_skipped;
462  if (!skip_struct_member_at_index(i, num_skipped)) {
463  actual_count = 0;
464  break;
465  }
466  actual_count += num_skipped;
467  }
468  } else { // Mutable
469  size_t dheader = 0;
470  if (!strm_.read_delimiter(dheader)) {
471  return 0;
472  }
473 
474  const size_t end_of_sample = strm_.rpos() + dheader;
475  while (strm_.rpos() < end_of_sample) {
476  ACE_CDR::ULong member_id;
477  size_t member_size;
478  bool must_understand;
479  if (!strm_.read_parameter_id(member_id, member_size, must_understand)) {
480  actual_count = 0;
481  break;
482  }
483 
484  DDS::DynamicTypeMember_var dtm;
485  if (type_->get_member(dtm, member_id) != DDS::RETCODE_OK) {
486  actual_count = 0;
487  break;
488  }
489  DDS::MemberDescriptor_var descriptor;
490  if (dtm->get_descriptor(descriptor) != DDS::RETCODE_OK) {
491  actual_count = 0;
492  break;
493  }
494  const DDS::DynamicType_ptr mt = descriptor->type();
495  if (!mt) {
496  actual_count = 0;
497  break;
498  }
499  const DDS::DynamicType_var member = get_base_type(mt);
500  if (member->get_kind() == TK_SEQUENCE) {
501  if (!skip_sequence_member(member)) {
502  actual_count = 0;
503  break;
504  }
505  } else if (!strm_.skip(member_size)) {
506  actual_count = 0;
507  break;
508  }
509  ++actual_count;
510  }
511  }
512  return actual_count;
513  }
514  case TK_UNION:
515  {
517  DDS::DynamicTypeMember_var disc_dtm;
518  if (type_->get_member(disc_dtm, DISCRIMINATOR_ID) != DDS::RETCODE_OK) {
519  return 0;
520  }
521  DDS::MemberDescriptor_var disc_md;
522  if (disc_dtm->get_descriptor(disc_md) != DDS::RETCODE_OK) {
523  return 0;
524  }
525  if (!disc_md->is_key()) {
526  return 0;
527  }
528  }
529  if (extent_ != DCPS::Sample::Full) {
530  return 1;
531  }
532 
533  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
534  if (ek == DDS::APPENDABLE || ek == DDS::MUTABLE) {
535  if (!strm_.skip_delimiter()) {
536  return 0;
537  }
538  }
539  const DDS::DynamicType_var disc_type = get_base_type(descriptor->discriminator_type());
540  const DDS::ExtensibilityKind extend = descriptor->extensibility_kind();
541  ACE_CDR::Long label;
542  if (!read_discriminator(disc_type, extend, label)) {
543  return 0;
544  }
545 
546  DDS::DynamicTypeMembersById_var members;
547  if (type_->get_all_members(members) != DDS::RETCODE_OK) {
548  return 0;
549  }
550  DynamicTypeMembersByIdImpl* members_impl = dynamic_cast<DynamicTypeMembersByIdImpl*>(members.in());
551  if (!members_impl) {
552  return 0;
553  }
554  for (DynamicTypeMembersByIdImpl::const_iterator it = members_impl->begin(); it != members_impl->end(); ++it) {
555  DDS::MemberDescriptor_var md;
556  if (it->second->get_descriptor(md) != DDS::RETCODE_OK) {
557  return 0;
558  }
559  if (md->is_default_label()) {
560  return 2;
561  }
562  const DDS::UnionCaseLabelSeq& labels = md->label();
563  for (ACE_CDR::ULong i = 0; i < labels.length(); ++i) {
564  if (label == labels[i]) {
565  return 2;
566  }
567  }
568  }
569  return 1;
570  }
571  case TK_SEQUENCE:
572  {
573  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
574  if (!is_primitive(elem_type->get_kind())) {
575  if (!strm_.skip_delimiter()) {
576  return 0;
577  }
578  }
579  ACE_CDR::ULong length;
580  if (!(strm_ >> length)) {
581  return 0;
582  }
583  return length;
584  }
585  case TK_ARRAY:
586  {
587  ACE_CDR::ULong length = 1;
588  for (ACE_CDR::ULong i = 0; i < descriptor->bound().length(); ++i) {
589  length *= descriptor->bound()[i];
590  }
591  return length;
592  }
593  case TK_MAP:
594  {
595  const DDS::DynamicType_var key_type = get_base_type(descriptor->key_element_type());
596  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
597  if (is_primitive(key_type->get_kind()) &&
598  is_primitive(elem_type->get_kind())) {
599  ACE_CDR::ULong length;
600  if (!(strm_ >> length)) {
601  return 0;
602  }
603  return length;
604  }
605 
606  size_t dheader;
607  if (!strm_.read_delimiter(dheader)) {
608  return 0;
609  }
610  const size_t end_of_map = strm_.rpos() + dheader;
611 
612  ACE_CDR::ULong length = 0;
613  while (strm_.rpos() < end_of_map) {
614  if (!skip_member(key_type) || !skip_member(elem_type)) {
615  length = 0;
616  break;
617  }
618  ++length;
619  }
620  return length;
621  }
622  }
623 
624  if (DCPS::DCPS_debug_level >= 1) {
625  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_item_count -")
626  ACE_TEXT(" Calling on an unexpected type %C\n"), typekind_to_string(tk)));
627  }
628  return 0;
629 }
bool skip_struct_member_at_index(ACE_CDR::ULong index, ACE_CDR::ULong &num_skipped)
#define ACE_DEBUG(X)
const TypeKind TK_INT8
Definition: TypeObject.h:225
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
bool read_delimiter(size_t &size)
Definition: Serializer.inl:912
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
const TypeKind TK_INT32
Definition: TypeObject.h:217
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_STRING16
Definition: TypeObject.h:232
static bool has_explicit_keys(DDS::DynamicType *dt)
ACE_CDR::ULong length() const
Definition: TypeObject.h:167
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const TypeKind TK_UINT16
Definition: TypeObject.h:219
bool struct_has_explicit_keys(AST_Structure *node)
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_STRING8
Definition: TypeObject.h:231
ACE_UINT32 ULong
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
const TypeKind TK_ENUM
Definition: TypeObject.h:238
ACE_TEXT("TCP_Factory")
bool is_primitive(TypeKind tk) const
ACE_INT32 Long
ACE_CDR::ULong item_count_
Cache the number of items (i.e., members or elements) in the data it holds.
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
bool read_discriminator(const DDS::DynamicType_ptr disc_type, DDS::ExtensibilityKind union_ek, ACE_CDR::Long &label)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_UINT64
Definition: TypeObject.h:221
size_t rpos() const
Examine the logical reading position of the stream.
Definition: Serializer.h:475
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
bool skip_sequence_member(DDS::DynamicType_ptr type)
const TypeKind TK_MAP
Definition: TypeObject.h:250
bool has_optional_member(bool &has_optional) const
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
ExtensibilityKind

◆ get_member_id_at_index()

DDS::MemberId OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_member_id_at_index ( ACE_CDR::ULong  index)

Definition at line 164 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DISCRIMINATOR_ID, OpenDDS::XTypes::DynamicDataBase::exclude_member(), extent_, DDS::FINAL, OpenDDS::DCPS::Sample::Full, OpenDDS::XTypes::get_base_type(), get_item_count(), get_union_selected_member(), OpenDDS::XTypes::DynamicDataBase::has_explicit_keys(), has_optional_member(), item_count_, ITEM_COUNT_INVALID, OpenDDS::DCPS::Sample::KeyOnly, LM_DEBUG, LM_NOTICE, OpenDDS::XTypes::MEMBER_ID_INVALID, DDS::MUTABLE, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_parameter_id(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip(), OpenDDS::DCPS::Serializer::skip_delimiter(), skip_sequence_member(), skip_struct_member_at_index(), strm_, struct_has_explicit_keys(), OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_BITMASK, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

165 {
167  get_item_count();
168  }
169  if (index >= item_count_) {
170  return MEMBER_ID_INVALID;
171  }
172 
173  ScopedChainManager chain_manager(*this);
174 
175  const TypeKind tk = type_->get_kind();
176  switch (tk) {
177  case TK_BOOLEAN:
178  case TK_BYTE:
179  case TK_INT16:
180  case TK_INT32:
181  case TK_INT64:
182  case TK_UINT16:
183  case TK_UINT32:
184  case TK_UINT64:
185  case TK_FLOAT32:
186  case TK_FLOAT64:
187  case TK_FLOAT128:
188  case TK_INT8:
189  case TK_UINT8:
190  case TK_CHAR8:
191 #ifdef DDS_HAS_WCHAR
192  case TK_CHAR16:
193 #endif
194  case TK_ENUM:
195  // Value of enum or primitive types can be indicated by Id MEMBER_ID_INVALID
196  // or by index 0 (Section 7.5.2.11.1).
197  if (index != 0 && DCPS::log_level >= DCPS::LogLevel::Notice) {
198  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_member_id_at_index:"
199  " Received invalid index (%d) for type %C\n", index, typekind_to_string(tk)));
200  }
201  return MEMBER_ID_INVALID;
202  case TK_STRING8:
203 #ifdef DDS_HAS_WCHAR
204  case TK_STRING16:
205 #endif
206  case TK_BITMASK:
207  case TK_SEQUENCE:
208  case TK_ARRAY:
209  case TK_MAP:
210  return index;
211  case TK_STRUCTURE:
212  {
213  DDS::TypeDescriptor_var descriptor;
214  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
215  return MEMBER_ID_INVALID;
216  }
217  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
218  if (ek == DDS::APPENDABLE || ek == DDS::MUTABLE) {
219  if (!strm_.skip_delimiter()) {
220  return MEMBER_ID_INVALID;
221  }
222  }
223 
224  if (ek == DDS::FINAL || ek == DDS::APPENDABLE) {
225  bool has_optional;
226  if (!has_optional_member(has_optional)) {
227  return MEMBER_ID_INVALID;
228  }
229 
230  if (extent_ != DCPS::Sample::Full) {
232  if (struct_has_explicit_keys) {
233  // All and only explicit keys will be present in the binary stream.
234  // Index of the next member in the binary stream.
235  ACE_CDR::ULong curr_index = 0;
236  for (ACE_CDR::ULong i = 0; i < type_->get_member_count(); ++i) {
237  DDS::DynamicTypeMember_var dtm;
238  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
239  return MEMBER_ID_INVALID;
240  }
241  DDS::MemberDescriptor_var md;
242  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
243  return MEMBER_ID_INVALID;
244  }
245  if (exclude_member(extent_, md->is_key(), struct_has_explicit_keys)) {
246  continue;
247  }
248  if (curr_index == index) {
249  return md->id();
250  }
251  ++curr_index;
252  }
253  // Should never reach here!
254  return MEMBER_ID_INVALID;
255  } else if (extent_ == DCPS::Sample::KeyOnly) {
256  return MEMBER_ID_INVALID;
257  }
258  }
259 
260  // A Full sample or a NestedKeyOnly sample with no explicit key.
261  if (!has_optional) {
262  DDS::DynamicTypeMember_var member;
263  if (type_->get_member_by_index(member, index) != DDS::RETCODE_OK) {
264  return MEMBER_ID_INVALID;
265  }
266  return member->get_id();
267  } else {
269  ACE_CDR::ULong total_skipped = 0;
270  for (ACE_CDR::ULong i = 0; i < type_->get_member_count(); ++i) {
271  ACE_CDR::ULong num_skipped;
272  if (!skip_struct_member_at_index(i, num_skipped)) {
273  break;
274  }
275  total_skipped += num_skipped;
276  if (total_skipped == index + 1) {
277  DDS::DynamicTypeMember_var member;
278  if (type_->get_member_by_index(member, i) == DDS::RETCODE_OK) {
279  id = member->get_id();
280  }
281  break;
282  }
283  }
284  return id;
285  }
286  } else { // Mutable
287  ACE_CDR::ULong member_id;
288  size_t member_size;
289  bool must_understand;
290  bool good = true;
291  for (unsigned i = 0; i < index; ++i) {
292  if (!strm_.read_parameter_id(member_id, member_size, must_understand)) {
293  good = false;
294  break;
295  }
296 
297  DDS::DynamicTypeMember_var dtm;
298  if (type_->get_member(dtm, member_id) != DDS::RETCODE_OK) {
299  good = false;
300  break;
301  }
302  DDS::MemberDescriptor_var descriptor;
303  if (dtm->get_descriptor(descriptor) != DDS::RETCODE_OK) {
304  good = false;
305  break;
306  }
307  const DDS::DynamicType_ptr mt = descriptor->type();
308  if (!mt) {
309  good = false;
310  break;
311  }
312  const DDS::DynamicType_var member = get_base_type(mt);
313  if (member->get_kind() == TK_SEQUENCE) {
314  if (!skip_sequence_member(member)) {
315  good = false;
316  break;
317  }
318  } else if (!strm_.skip(member_size)) {
319  good = false;
320  break;
321  }
322  }
323 
324  if (!good || !strm_.read_parameter_id(member_id, member_size, must_understand)) {
325  member_id = MEMBER_ID_INVALID;
326  }
327  return member_id;
328  }
329  }
330  case TK_UNION:
331  {
333  DDS::DynamicTypeMember_var disc_dtm;
334  if (type_->get_member(disc_dtm, DISCRIMINATOR_ID) != DDS::RETCODE_OK) {
335  return MEMBER_ID_INVALID;
336  }
337  DDS::MemberDescriptor_var disc_md;
338  if (disc_dtm->get_descriptor(disc_md) != DDS::RETCODE_OK) {
339  return MEMBER_ID_INVALID;
340  }
341  if (!disc_md->is_key()) {
342  // The sample is empty.
343  return MEMBER_ID_INVALID;
344  }
345  }
346 
347  if (index == 0) {
348  return DISCRIMINATOR_ID;
349  }
350 
351  if (extent_ != DCPS::Sample::Full) {
352  // KeyOnly or NestedKeyOnly sample can only contain discriminator.
353  return MEMBER_ID_INVALID;
354  }
355 
356  // Get the Id of the selected member.
357  DDS::MemberDescriptor_var selected_md = get_union_selected_member();
358  if (!selected_md) {
359  return MEMBER_ID_INVALID;
360  }
361 
362  return selected_md->id();
363  }
364  }
365 
366  if (DCPS::DCPS_debug_level >= 1) {
367  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_member_id_at_index -")
368  ACE_TEXT(" Calling on an unexpected type %C\n"), typekind_to_string(tk)));
369  }
370  return MEMBER_ID_INVALID;
371 }
OpenDDS_Dcps_Export LogLevel log_level
bool skip_struct_member_at_index(ACE_CDR::ULong index, ACE_CDR::ULong &num_skipped)
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
ACE_CDR::ULong MemberId
Definition: TypeObject.h:910
const TypeKind TK_INT8
Definition: TypeObject.h:225
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
const TypeKind TK_INT32
Definition: TypeObject.h:217
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_STRING16
Definition: TypeObject.h:232
static bool has_explicit_keys(DDS::DynamicType *dt)
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const TypeKind TK_UINT16
Definition: TypeObject.h:219
const ACE_CDR::ULong MEMBER_ID_INVALID
Definition: TypeObject.h:911
DDS::MemberDescriptor * get_union_selected_member()
Return the member descriptor for the selected member from a union data or null.
bool struct_has_explicit_keys(AST_Structure *node)
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_STRING8
Definition: TypeObject.h:231
ACE_UINT32 ULong
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
const TypeKind TK_ENUM
Definition: TypeObject.h:238
ACE_TEXT("TCP_Factory")
ACE_CDR::ULong item_count_
Cache the number of items (i.e., members or elements) in the data it holds.
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_UINT64
Definition: TypeObject.h:221
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
bool skip_sequence_member(DDS::DynamicType_ptr type)
static bool exclude_member(DCPS::Sample::Extent ext, bool is_key, bool has_explicit_keys)
const TypeKind TK_MAP
Definition: TypeObject.h:250
bool has_optional_member(bool &has_optional) const
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
ExtensibilityKind

◆ get_primitive_size()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_primitive_size ( DDS::DynamicType_ptr  dt,
ACE_CDR::ULong size 
) const
private

Definition at line 2769 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, and OpenDDS::XTypes::TK_UINT8.

Referenced by skip_array_member(), skip_map_member(), skip_sequence_member(), skip_to_array_element(), skip_to_map_element(), and skip_to_sequence_element().

2770 {
2771  size = 0;
2772 
2773  switch (dt->get_kind()) {
2774  case TK_BOOLEAN:
2775  case TK_BYTE:
2776  case TK_INT8:
2777  case TK_UINT8:
2778  case TK_CHAR8:
2779  size = 1;
2780  break;
2781  case TK_INT16:
2782  case TK_UINT16:
2783  case TK_CHAR16:
2784  size = 2;
2785  break;
2786  case TK_INT32:
2787  case TK_UINT32:
2788  case TK_FLOAT32:
2789  size = 4;
2790  break;
2791  case TK_INT64:
2792  case TK_UINT64:
2793  case TK_FLOAT64:
2794  size = 8;
2795  break;
2796  case TK_FLOAT128:
2797  size = 16;
2798  break;
2799  default:
2800  return false;
2801  }
2802  return true;
2803 }
const TypeKind TK_INT8
Definition: TypeObject.h:225
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_UINT16
Definition: TypeObject.h:219
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221

◆ get_sequence_values()

template<TypeKind ElementTypeKind, typename SequenceType >
DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_sequence_values ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask = TK_NONE,
LBound  lower = 0,
LBound  upper = 0 
)
private

Common method to read a value sequence of any type (primitive, string, wstring).

Definition at line 1916 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DynamicDataBase::is_type_supported(), LM_ERROR, DDS::RETCODE_ERROR, DDS::RETCODE_OK, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, OpenDDS::XTypes::typekind_to_string(), and value.

1918 {
1919  if (!is_type_supported(ElementTypeKind, "get_sequence_values")) {
1920  return DDS::RETCODE_ERROR;
1921  }
1922 
1923  ScopedChainManager chain_manager(*this);
1924 
1925  const TypeKind tk = type_->get_kind();
1926  bool good = true;
1927 
1928  switch (tk) {
1929  case TK_STRUCTURE:
1930  good = get_values_from_struct<ElementTypeKind>(value, id, enum_or_bitmask, lower, upper);
1931  break;
1932  case TK_UNION:
1933  good = get_values_from_union<ElementTypeKind>(value, id, enum_or_bitmask, lower, upper);
1934  break;
1935  case TK_SEQUENCE:
1936  good = get_values_from_sequence<ElementTypeKind>(value, id, enum_or_bitmask, lower, upper);
1937  break;
1938  case TK_ARRAY:
1939  good = get_values_from_array<ElementTypeKind>(value, id, enum_or_bitmask, lower, upper);
1940  break;
1941  case TK_MAP:
1942  good = get_values_from_map<ElementTypeKind>(value, id, enum_or_bitmask, lower, upper);
1943  break;
1944  default:
1945  if (DCPS::DCPS_debug_level >= 1) {
1946  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_sequence_values -")
1947  ACE_TEXT(" A sequence<%C> can't be read as a member of type %C"),
1948  typekind_to_string(ElementTypeKind), typekind_to_string(tk)));
1949  }
1950  return DDS::RETCODE_ERROR;
1951  }
1952 
1953  if (!good && DCPS::DCPS_debug_level >= 1) {
1954  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_sequence_values -")
1955  ACE_TEXT(" Failed to read sequence<%C> from a DynamicData object of type %C\n"),
1956  typekind_to_string(ElementTypeKind), typekind_to_string(tk)));
1957  }
1958  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1959 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const ReturnCode_t RETCODE_ERROR
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
bool is_type_supported(TypeKind tk, const char *func_name)

◆ get_simple_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_simple_value ( DCPS::Value value,
DDS::MemberId  id 
)
virtual

Implements OpenDDS::XTypes::DynamicDataBase.

Definition at line 2881 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::get_base_type(), get_boolean_value(), get_byte_value(), get_char16_value(), get_char8_value(), get_float128_value(), get_float32_value(), get_float64_value(), get_int16_value(), get_int32_value(), get_int64_value(), get_int8_value(), get_string_value(), get_uint16_value(), get_uint32_value(), get_uint64_value(), get_uint8_value(), get_wstring_value(), OpenDDS::XTypes::print_member(), DDS::RETCODE_ERROR, DDS::RETCODE_OK, DDS::RETCODE_UNSUPPORTED, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, and OpenDDS::XTypes::DynamicDataBase::type_.

2882 {
2883  DDS::DynamicTypeMember_var dtm;
2884  if (type_->get_member(dtm, id) != DDS::RETCODE_OK) {
2885  return DDS::RETCODE_ERROR;
2886  }
2887  DDS::MemberDescriptor_var md;
2888  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
2889  return DDS::RETCODE_ERROR;
2890  }
2891  DDS::DynamicType_var member_type = get_base_type(md->type());
2892  const TypeKind member_kind = member_type->get_kind();
2893  switch (member_kind) {
2894  case TK_BOOLEAN:
2895  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_boolean_value);
2896  case TK_BYTE:
2897  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_byte_value);
2898  case TK_INT16:
2899  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int16_value);
2900  case TK_INT32:
2901  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int32_value);
2902  case TK_INT64:
2903  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int64_value);
2904  case TK_UINT16:
2905  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint16_value);
2906  case TK_UINT32:
2907  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint32_value);
2908  case TK_UINT64:
2909  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint64_value);
2910  case TK_FLOAT32:
2911  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float32_value);
2912  case TK_FLOAT64:
2913  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float64_value);
2914  case TK_FLOAT128:
2915  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_float128_value);
2916  case TK_INT8:
2917  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_int8_value);
2918  case TK_UINT8:
2919  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_uint8_value);
2920  case TK_CHAR8:
2921  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_char8_value);
2922  case TK_CHAR16:
2923  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_char16_value);
2924  case TK_ENUM:
2925  case TK_STRING8:
2926  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_string_value);
2927  case TK_STRING16:
2928  return get_some_value(value, id, *this, &DynamicDataXcdrReadImpl::get_wstring_value);
2929  default:
2930  return DDS::RETCODE_UNSUPPORTED;
2931  }
2932 }
const TypeKind TK_INT8
Definition: TypeObject.h:225
const LogLevel::Value value
Definition: debug.cpp:61
DDS::ReturnCode_t get_char16_value(CORBA::WChar &value, DDS::MemberId id)
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
DDS::ReturnCode_t get_uint64_value(CORBA::ULongLong &value, DDS::MemberId id)
DDS::ReturnCode_t get_int8_value(CORBA::Int8 &value, DDS::MemberId id)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
DDS::ReturnCode_t get_uint32_value(CORBA::ULong &value, DDS::MemberId id)
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
DDS::ReturnCode_t get_boolean_value(CORBA::Boolean &value, DDS::MemberId id)
const TypeKind TK_STRING16
Definition: TypeObject.h:232
DDS::ReturnCode_t get_wstring_value(CORBA::WChar *&value, DDS::MemberId id)
DDS::ReturnCode_t get_int64_value(CORBA::LongLong &value, DDS::MemberId id)
DDS::ReturnCode_t get_uint16_value(CORBA::UShort &value, DDS::MemberId id)
const TypeKind TK_UINT16
Definition: TypeObject.h:219
DDS::ReturnCode_t get_float64_value(CORBA::Double &value, DDS::MemberId id)
DDS::ReturnCode_t get_char8_value(CORBA::Char &value, DDS::MemberId id)
DDS::ReturnCode_t get_float128_value(CORBA::LongDouble &value, DDS::MemberId id)
DDS::ReturnCode_t get_uint8_value(CORBA::UInt8 &value, DDS::MemberId id)
DDS::ReturnCode_t get_byte_value(CORBA::Octet &value, DDS::MemberId id)
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const ReturnCode_t RETCODE_ERROR
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
DDS::ReturnCode_t get_int16_value(CORBA::Short &value, DDS::MemberId id)
const TypeKind TK_STRING8
Definition: TypeObject.h:231
const TypeKind TK_ENUM
Definition: TypeObject.h:238
const TypeKind TK_UINT32
Definition: TypeObject.h:220
DDS::ReturnCode_t get_string_value(char *&value, DDS::MemberId id)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221
DDS::ReturnCode_t get_float32_value(CORBA::Float &value, DDS::MemberId id)
DDS::ReturnCode_t get_int32_value(CORBA::Long &value, DDS::MemberId id)
const ReturnCode_t RETCODE_UNSUPPORTED
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_single_value()

template<TypeKind ValueTypeKind, typename ValueType >
DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_single_value ( ValueType &  value,
MemberId  id,
TypeKind  enum_or_bitmask = TK_NONE,
LBound  lower = 0,
LBound  upper = 0 
)
private

Read a single value of type primitive (except char8, char16, and boolean), string, or wstring.

Definition at line 1161 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DynamicDataBase::is_primitive(), OpenDDS::XTypes::DynamicDataBase::is_type_supported(), LM_ERROR, read_value(), DDS::RETCODE_ERROR, DDS::RETCODE_OK, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::DynamicDataBase::type_, OpenDDS::XTypes::typekind_to_string(), and value.

1163 {
1164  if (!is_type_supported(ValueTypeKind, "get_single_value")) {
1165  return DDS::RETCODE_ERROR;
1166  }
1167 
1168  ScopedChainManager chain_manager(*this);
1169 
1170  const TypeKind tk = type_->get_kind();
1171  bool good = true;
1172 
1173  // This is an extension to the XTypes spec where the value of a bitmask DynamicData
1174  // can be read as a whole as a unsigned integer.
1175  if (tk == enum_or_bitmask) {
1176  // Per XTypes spec, the value of a DynamicData object of primitive type or TK_ENUM is
1177  // accessed with MEMBER_ID_INVALID Id. However, there is only a single value in such
1178  // a DynamicData object, and checking for MEMBER_ID_INVALID from the input is perhaps
1179  // unnecessary. So, we read the value immediately here.
1180  DDS::TypeDescriptor_var descriptor;
1181  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1182  return DDS::RETCODE_ERROR;
1183  }
1184  const LBound bit_bound = descriptor->bound()[0];
1185  good = bit_bound >= lower && bit_bound <= upper && read_value(value, ValueTypeKind);
1186  } else {
1187  switch (tk) {
1188  case ValueTypeKind:
1189  good = is_primitive(tk) && read_value(value, ValueTypeKind);
1190  break;
1191  case TK_STRUCTURE:
1192  good = get_value_from_struct<ValueTypeKind>(value, id, enum_or_bitmask, lower, upper);
1193  break;
1194  case TK_UNION:
1195  good = get_value_from_union<ValueTypeKind>(value, id, enum_or_bitmask, lower, upper);
1196  break;
1197  case TK_SEQUENCE:
1198  case TK_ARRAY:
1199  case TK_MAP:
1200  good = get_value_from_collection<ValueTypeKind>(value, id, tk, enum_or_bitmask, lower, upper);
1201  break;
1202  default:
1203  good = false;
1204  break;
1205  }
1206  }
1207 
1208  if (!good && DCPS::DCPS_debug_level >= 1) {
1209  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_single_value -")
1210  ACE_TEXT(" Failed to read a value of %C from a DynamicData object of type %C\n"),
1211  typekind_to_string(ValueTypeKind), typekind_to_string(tk)));
1212  }
1213  return good ? DDS::RETCODE_OK : DDS::RETCODE_ERROR;
1214 }
bool read_value(ValueType &value, TypeKind tk)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const ReturnCode_t RETCODE_ERROR
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
bool is_primitive(TypeKind tk) const
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
bool is_type_supported(TypeKind tk, const char *func_name)

◆ get_string_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_string_value ( char *&  value,
DDS::MemberId  id 
)

Definition at line 1458 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::DynamicDataBase::enum_string_helper(), DDS::RETCODE_OK, CORBA::string_free(), and value.

Referenced by get_simple_value().

1459 {
1460  if (enum_string_helper(value, id)) {
1461  return DDS::RETCODE_OK;
1462  }
1464  return get_single_value<TK_STRING8>(value, id);
1465 }
const LogLevel::Value value
Definition: debug.cpp:61
const ReturnCode_t RETCODE_OK
void string_free(char *)
bool enum_string_helper(char *&strInOut, MemberId id)

◆ get_string_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_string_values ( DDS::StringSeq value,
DDS::MemberId  id 
)

Definition at line 2040 of file DynamicDataXcdrReadImpl.cpp.

References value.

2041 {
2042  return get_sequence_values<TK_STRING8>(value, id);
2043 }
const LogLevel::Value value
Definition: debug.cpp:61

◆ get_uint16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint16_value ( CORBA::UShort value,
DDS::MemberId  id 
)

Definition at line 1245 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

Referenced by get_simple_value().

1246 {
1247  return get_single_value<TK_UINT16>(value, id, TK_BITMASK, 9, 16);
1248 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint16_values ( DDS::UInt16Seq value,
DDS::MemberId  id 
)

Definition at line 1986 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

1987 {
1988  return get_sequence_values<TK_UINT16>(value, id, TK_BITMASK, 9, 16);
1989 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint32_value ( CORBA::ULong value,
DDS::MemberId  id 
)

Definition at line 1222 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

Referenced by get_simple_value().

1223 {
1224  return get_single_value<TK_UINT32>(value, id, TK_BITMASK,
1225  static_cast<LBound>(17), static_cast<LBound>(32));
1226 }
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint32_values ( DDS::UInt32Seq value,
DDS::MemberId  id 
)

Definition at line 1966 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

1967 {
1968  return get_sequence_values<TK_UINT32>(value, id, TK_BITMASK, 17, 32);
1969 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint64_value ( CORBA::ULongLong value,
DDS::MemberId  id 
)

Definition at line 1255 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

Referenced by get_simple_value().

1256 {
1257  return get_single_value<TK_UINT64>(value, id, TK_BITMASK, 33, 64);
1258 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint64_values ( DDS::UInt64Seq value,
DDS::MemberId  id 
)

Definition at line 1996 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

1997 {
1998  return get_sequence_values<TK_UINT64>(value, id, TK_BITMASK, 33, 64);
1999 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint8_value ( CORBA::UInt8 value,
DDS::MemberId  id 
)

Definition at line 1234 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK.

Referenced by get_simple_value().

1235 {
1236  ACE_InputCDR::to_uint8 to_uint8(value);
1237  return get_single_value<TK_UINT8>(to_uint8, id, TK_BITMASK, 1, 8);
1238 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_uint8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_uint8_values ( DDS::UInt8Seq value,
DDS::MemberId  id 
)

Definition at line 1976 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::TK_BITMASK, and value.

1977 {
1978  return get_sequence_values<TK_UINT8>(value, id, TK_BITMASK, 1, 8);
1979 }
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_BITMASK
Definition: TypeObject.h:239

◆ get_union_selected_member()

DDS::MemberDescriptor * OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_union_selected_member ( )
private

Return the member descriptor for the selected member from a union data or null.

Definition at line 761 of file DynamicDataXcdrReadImpl.cpp.

References DDS::APPENDABLE, OpenDDS::XTypes::DynamicTypeMembersByIdImpl::begin(), OpenDDS::XTypes::DynamicTypeMembersByIdImpl::end(), OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::Sequence< T >::length(), DDS::MUTABLE, read_discriminator(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip_delimiter(), strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_from_union_common_checks(), and get_member_id_at_index().

762 {
763  DDS::TypeDescriptor_var descriptor;
764  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
765  return 0;
766  }
767 
768  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
769  if (ek == DDS::APPENDABLE || ek == DDS::MUTABLE) {
770  if (!strm_.skip_delimiter()) {
771  return 0;
772  }
773  }
774 
775  const DDS::DynamicType_var disc_type = get_base_type(descriptor->discriminator_type());
776  ACE_CDR::Long label;
777  if (!read_discriminator(disc_type, ek, label)) {
778  return 0;
779  }
780 
781  DDS::DynamicTypeMembersById_var members;
782  if (type_->get_all_members(members) != DDS::RETCODE_OK) {
783  return 0;
784  }
785  DynamicTypeMembersByIdImpl* members_impl = dynamic_cast<DynamicTypeMembersByIdImpl*>(members.in());
786  if (!members_impl) {
787  return 0;
788  }
789 
790  bool has_default = false;
791  DDS::MemberDescriptor_var default_member;
792  for (DynamicTypeMembersByIdImpl::const_iterator it = members_impl->begin(); it != members_impl->end(); ++it) {
793  DDS::MemberDescriptor_var md;
794  if (it->second->get_descriptor(md) != DDS::RETCODE_OK) {
795  return 0;
796  }
797  const DDS::UnionCaseLabelSeq& labels = md->label();
798  for (ACE_CDR::ULong i = 0; i < labels.length(); ++i) {
799  if (label == labels[i]) {
800  return md._retn();
801  }
802  }
803 
804  if (md->is_default_label()) {
805  has_default = true;
806  default_member = md;
807  }
808  }
809 
810  if (has_default) {
811  return default_member._retn();;
812  }
813 
814  // The union has no selected member.
815  return 0;
816 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
ACE_CDR::ULong length() const
Definition: TypeObject.h:167
ACE_UINT32 ULong
ACE_INT32 Long
bool read_discriminator(const DDS::DynamicType_ptr disc_type, DDS::ExtensibilityKind union_ek, ACE_CDR::Long &label)
ExtensibilityKind

◆ get_value_from_collection()

template<TypeKind ElementTypeKind, typename ElementType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_value_from_collection ( ElementType &  value,
MemberId  id,
TypeKind  collection_tk,
TypeKind  enum_or_bitmask = TK_NONE,
LBound  lower = 0,
LBound  upper = 0 
)
private

Reading a value of type primitive, string, or wstring as a member of a struct, union, or a collection (sequence, array, map). TK_ENUM should be passed to enum_or_bitmask if is a 8-bit, 16-bit, or 32-bit signed integer type. In that case, and should be set to form the bit_bound range of the enum type that matches the number of bits of value. For instance, if we are reading a 8-bit integer, then is TK_ENUM, lower is 1 and upper is 8. This allows reading an enum with a particular bit bound as an integer with the matching size. Similarly, if we are reading an unsigned integer, set enum_or_bitmask to TK_BITMASK, and lower and upper to form a corresponding range for the bitmask's bit bound.

Definition at line 1097 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_ERROR, read_value(), DDS::RETCODE_OK, skip_to_array_element(), skip_to_map_element(), skip_to_sequence_element(), OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1099 {
1100  DDS::TypeDescriptor_var descriptor;
1101  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1102  return false;
1103  }
1104 
1105  DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
1106  const TypeKind elem_tk = elem_type->get_kind();
1107 
1108  if (elem_tk != ElementTypeKind && elem_tk != enum_or_bitmask) {
1109  if (DCPS::DCPS_debug_level >= 1) {
1110  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_value_from_collection -")
1111  ACE_TEXT(" Could not read a value of type %C from %C with element type %C\n"),
1112  typekind_to_string(ElementTypeKind), typekind_to_string(collection_tk),
1113  typekind_to_string(elem_tk)));
1114  }
1115  return false;
1116  }
1117 
1118  if (elem_tk == enum_or_bitmask) {
1119  DDS::TypeDescriptor_var td;
1120  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1121  return false;
1122  }
1123  const LBound bit_bound = td->bound()[0];
1124  if (bit_bound < lower || bit_bound > upper) {
1125  return false;
1126  }
1127  }
1128 
1129  switch (collection_tk) {
1130  case TK_SEQUENCE:
1131  if (!skip_to_sequence_element(id)) {
1132  return false;
1133  }
1134  break;
1135  case TK_ARRAY:
1136  if (!skip_to_array_element(id)) {
1137  return false;
1138  }
1139  break;
1140  case TK_MAP:
1141  if (!skip_to_map_element(id)) {
1142  return false;
1143  }
1144  break;
1145  default:
1146  return false;
1147  }
1148 
1149  return read_value(value, ElementTypeKind);
1150 }
bool read_value(ValueType &value, TypeKind tk)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool skip_to_sequence_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
bool skip_to_array_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_value_from_struct()

template<TypeKind MemberTypeKind, typename MemberType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_value_from_struct ( MemberType &  value,
MemberId  id,
TypeKind  enum_or_bitmask = TK_NONE,
LBound  lower = 0,
LBound  upper = 0 
)
private

Reading a value of type primitive, string, or wstring as a member of a struct, union, or a collection (sequence, array, map). TK_ENUM should be passed to enum_or_bitmask if is a 8-bit, 16-bit, or 32-bit signed integer type. In that case, and should be set to form the bit_bound range of the enum type that matches the number of bits of value. For instance, if we are reading a 8-bit integer, then is TK_ENUM, lower is 1 and upper is 8. This allows reading an enum with a particular bit bound as an integer with the matching size. Similarly, if we are reading an unsigned integer, set enum_or_bitmask to TK_BITMASK, and lower and upper to form a corresponding range for the bitmask's bit bound.

Definition at line 728 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, exclude_struct_member(), extent_, OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::get_descriptor(), get_from_struct_common_checks(), OpenDDS::DCPS::Sample::KeyOnly, LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, read_value(), DDS::RETCODE_OK, and skip_to_struct_member().

730 {
731  DDS::MemberDescriptor_var md;
732  if (exclude_struct_member(id, md)) {
734  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_value_from_struct:"
735  " Attempted to read an excluded member from a %C sample\n",
736  extent_ == DCPS::Sample::KeyOnly ? "KeyOnly" : "NestedKeyOnly"));
737  }
738  return false;
739  }
740 
741  if (get_from_struct_common_checks(md, id, MemberTypeKind)) {
742  return skip_to_struct_member(md, id) && read_value(value, MemberTypeKind);
743  }
744 
745  if (get_from_struct_common_checks(md, id, enum_or_bitmask)) {
746  const DDS::DynamicType_ptr member_type = md->type();
747  if (member_type) {
748  DDS::TypeDescriptor_var td;
749  if (get_base_type(member_type)->get_descriptor(td) != DDS::RETCODE_OK) {
750  return false;
751  }
752  const LBound bit_bound = td->bound()[0];
753  return bit_bound >= lower && bit_bound <= upper &&
754  skip_to_struct_member(md, id) && read_value(value, MemberTypeKind);
755  }
756  }
757 
758  return false;
759 }
OpenDDS_Dcps_Export LogLevel log_level
bool read_value(ValueType &value, TypeKind tk)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool exclude_struct_member(MemberId id, DDS::MemberDescriptor_var &md) const
Check if a member with a given id is excluded from struct sample.
DDS::ReturnCode_t get_descriptor(DDS::MemberDescriptor *&value, MemberId id)
bool get_from_struct_common_checks(const DDS::MemberDescriptor_var &md, MemberId id, TypeKind kind, bool is_sequence=false)
bool skip_to_struct_member(DDS::MemberDescriptor *member_desc, MemberId id)

◆ get_value_from_union()

template<TypeKind MemberTypeKind, typename MemberType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_value_from_union ( MemberType &  value,
MemberId  id,
TypeKind  enum_or_bitmask = TK_NONE,
LBound  lower = 0,
LBound  upper = 0 
)
private

Reading a value of type primitive, string, or wstring as a member of a struct, union, or a collection (sequence, array, map). TK_ENUM should be passed to enum_or_bitmask if is a 8-bit, 16-bit, or 32-bit signed integer type. In that case, and should be set to form the bit_bound range of the enum type that matches the number of bits of value. For instance, if we are reading a 8-bit integer, then is TK_ENUM, lower is 1 and upper is 8. This allows reading an enum with a particular bit bound as an integer with the matching size. Similarly, if we are reading an unsigned integer, set enum_or_bitmask to TK_BITMASK, and lower and upper to form a corresponding range for the bitmask's bit bound.

Definition at line 884 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DISCRIMINATOR_ID, exclude_union_member(), OpenDDS::XTypes::get_base_type(), get_from_union_common_checks(), LM_DEBUG, LM_ERROR, LM_NOTICE, DDS::MUTABLE, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_parameter_id(), read_value(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip_delimiter(), strm_, type(), OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

886 {
887  if (exclude_union_member(id)) {
889  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_value_from_union::"
890  " Reading an excluded member with Id %u\n", id));
891  }
892  return false;
893  }
894 
895  DDS::TypeDescriptor_var descriptor;
896  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
897  return false;
898  }
899 
900  DDS::DynamicType_var member_type;
901  if (id == DISCRIMINATOR_ID) {
902  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
903  if (ek == DDS::APPENDABLE || ek == DDS::MUTABLE) {
904  if (!strm_.skip_delimiter()) {
905  return false;
906  }
907  }
908  member_type = get_base_type(descriptor->discriminator_type());
909  } else {
910  DDS::MemberDescriptor_var md = get_from_union_common_checks(id, "get_value_from_union");
911  if (!md) {
912  return false;
913  }
914 
915  const DDS::DynamicType_ptr type = md->type();
916  if (!type) {
917  if (DCPS::DCPS_debug_level >= 1) {
918  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_value_from_union -")
919  ACE_TEXT(" Could not get DynamicType of the selected member\n")));
920  }
921  return false;
922  }
923  member_type = get_base_type(type);
924  }
925 
926  const TypeKind member_tk = member_type->get_kind();
927  if (member_tk != MemberTypeKind && member_tk != enum_or_bitmask) {
928  if (DCPS::DCPS_debug_level >= 1) {
929  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_value_from_union -")
930  ACE_TEXT(" Could not read a value of type %C from type %C\n"),
931  typekind_to_string(MemberTypeKind), typekind_to_string(member_tk)));
932  }
933  return false;
934  }
935 
936  if (descriptor->extensibility_kind() == DDS::MUTABLE) {
937  unsigned member_id;
938  size_t member_size;
939  bool must_understand;
940  if (!strm_.read_parameter_id(member_id, member_size, must_understand)) {
941  return false;
942  }
943  }
944 
945  if (member_tk == MemberTypeKind) {
946  return read_value(value, MemberTypeKind);
947  }
948 
949  DDS::TypeDescriptor_var td;
950  if (member_type->get_descriptor(td) != DDS::RETCODE_OK) {
951  return false;
952  }
953  const LBound bit_bound = td->bound()[0];
954  return bit_bound >= lower && bit_bound <= upper &&
955  read_value(value, MemberTypeKind);
956 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_DEBUG(X)
bool read_value(ValueType &value, TypeKind tk)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
DDS::MemberDescriptor * get_from_union_common_checks(MemberId id, const char *func_name)
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
bool exclude_union_member(MemberId id) const
Check if a member with a given Id is excluded from a union sample.
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
ExtensibilityKind

◆ get_values_from_array()

template<TypeKind ElementTypeKind, typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_values_from_array ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask,
LBound  lower,
LBound  upper 
)
private

Templates for reading a sequence of primitives, strings or wstrings as a member (or an element) of a given containing type. See get_value_from_struct and the similar methods for the use of enum_or_bitmask, lower, upper.

Definition at line 1826 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_ERROR, read_values(), DDS::RETCODE_OK, skip_to_array_element(), OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1828 {
1829  DDS::TypeDescriptor_var descriptor;
1830  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1831  return false;
1832  }
1833 
1834  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
1835  if (elem_type->get_kind() != TK_SEQUENCE) {
1836  if (DCPS::DCPS_debug_level >= 1) {
1837  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_array -")
1838  ACE_TEXT(" Could not read a sequence of %C from an array of %C\n"),
1839  typekind_to_string(ElementTypeKind), typekind_to_string(elem_type->get_kind())));
1840  }
1841  return false;
1842  }
1843 
1844  DDS::TypeDescriptor_var td;
1845  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1846  return false;
1847  }
1848  const DDS::DynamicType_var nested_elem_type = get_base_type(td->element_type());
1849  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
1850  if (nested_elem_tk == ElementTypeKind) {
1851  return skip_to_array_element(id) && read_values(value, nested_elem_tk);
1852  } else if (nested_elem_tk == enum_or_bitmask) {
1853  DDS::TypeDescriptor_var td;
1854  if (nested_elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1855  return false;
1856  }
1857  const LBound bit_bound = td->bound()[0];
1858  return bit_bound >= lower && bit_bound <= upper &&
1859  skip_to_array_element(id) && read_values(value, nested_elem_tk);
1860  }
1861 
1862  if (DCPS::DCPS_debug_level >= 1) {
1863  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_array -")
1864  ACE_TEXT(" Could not read a sequence of %C from an array of sequence of %C\n"),
1865  typekind_to_string(ElementTypeKind), typekind_to_string(nested_elem_tk)));
1866  }
1867  return false;
1868 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool read_values(SequenceType &value, TypeKind elem_tk)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
bool skip_to_array_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_values_from_map()

template<TypeKind ElementTypeKind, typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_values_from_map ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask,
LBound  lower,
LBound  upper 
)
private

Templates for reading a sequence of primitives, strings or wstrings as a member (or an element) of a given containing type. See get_value_from_struct and the similar methods for the use of enum_or_bitmask, lower, upper.

Definition at line 1871 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_ERROR, read_values(), DDS::RETCODE_OK, skip_to_map_element(), OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1873 {
1874  DDS::TypeDescriptor_var descriptor;
1875  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1876  return false;
1877  }
1878 
1879  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
1880  if (elem_type->get_kind() != TK_SEQUENCE) {
1881  if (DCPS::DCPS_debug_level >= 1) {
1882  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_map -")
1883  ACE_TEXT(" Getting sequence<%C> from a map with element type of %C\n"),
1884  typekind_to_string(ElementTypeKind), typekind_to_string(elem_type->get_kind())));
1885  }
1886  return false;
1887  }
1888 
1889  DDS::TypeDescriptor_var td;
1890  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1891  return false;
1892  }
1893  const DDS::DynamicType_var nested_elem_type = get_base_type(td->element_type());
1894  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
1895  if (nested_elem_tk == ElementTypeKind) {
1896  return skip_to_map_element(id) && read_values(value, nested_elem_tk);
1897  } else if (nested_elem_tk == enum_or_bitmask) {
1898  DDS::TypeDescriptor_var td;
1899  if (nested_elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1900  return false;
1901  }
1902  const LBound bit_bound = td->bound()[0];
1903  return bit_bound >= lower && bit_bound <= upper &&
1904  skip_to_map_element(id) && read_values(value, nested_elem_tk);
1905  }
1906 
1907  if (DCPS::DCPS_debug_level >= 1) {
1908  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_map -")
1909  ACE_TEXT(" Could not read a sequence of %C from a map with element type sequence of %C\n"),
1910  typekind_to_string(ElementTypeKind), typekind_to_string(nested_elem_tk)));
1911  }
1912  return false;
1913 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool read_values(SequenceType &value, TypeKind elem_tk)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_values_from_sequence()

template<TypeKind ElementTypeKind, typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_values_from_sequence ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask,
LBound  lower,
LBound  upper 
)
private

Templates for reading a sequence of primitives, strings or wstrings as a member (or an element) of a given containing type. See get_value_from_struct and the similar methods for the use of enum_or_bitmask, lower, upper.

Definition at line 1774 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_ERROR, read_values(), DDS::RETCODE_OK, skip_to_sequence_element(), OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1776 {
1777  DDS::TypeDescriptor_var descriptor;
1778  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1779  return false;
1780  }
1781 
1782  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
1783  const TypeKind elem_tk = elem_type->get_kind();
1784 
1785  if (elem_tk == ElementTypeKind) {
1786  return read_values(value, ElementTypeKind);
1787  } else if (elem_tk == enum_or_bitmask) {
1788  // Read from a sequence of enums or bitmasks.
1789  DDS::TypeDescriptor_var td;
1790  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1791  return false;
1792  }
1793  const LBound bit_bound = td->bound()[0];
1794  return bit_bound >= lower && bit_bound <= upper && read_values(value, enum_or_bitmask);
1795  } else if (elem_tk == TK_SEQUENCE) {
1796  DDS::TypeDescriptor_var td;
1797  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1798  return false;
1799  }
1800  const DDS::DynamicType_var nested_elem_type = get_base_type(td->element_type());
1801  const TypeKind nested_elem_tk = nested_elem_type->get_kind();
1802  if (nested_elem_tk == ElementTypeKind) {
1803  // Read from a sequence of sequences of ElementTypeKind.
1804  return skip_to_sequence_element(id) && read_values(value, ElementTypeKind);
1805  } else if (nested_elem_tk == enum_or_bitmask) {
1806  // Read from a sequence of sequences of enums or bitmasks.
1807  DDS::TypeDescriptor_var td;
1808  if (nested_elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1809  return false;
1810  }
1811  const LBound bit_bound = td->bound()[0];
1812  return bit_bound >= lower && bit_bound <= upper &&
1813  skip_to_sequence_element(id) && read_values(value, enum_or_bitmask);
1814  }
1815  }
1816 
1817  if (DCPS::DCPS_debug_level >= 1) {
1818  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_sequence -")
1819  ACE_TEXT(" Could not read a sequence of %C from an incompatible type\n"),
1820  typekind_to_string(ElementTypeKind)));
1821  }
1822  return false;
1823 }
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool read_values(SequenceType &value, TypeKind elem_tk)
bool skip_to_sequence_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_values_from_struct()

template<TypeKind ElementTypeKind, typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_values_from_struct ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask,
LBound  lower,
LBound  upper 
)
private

Templates for reading a sequence of primitives, strings or wstrings as a member (or an element) of a given containing type. See get_value_from_struct and the similar methods for the use of enum_or_bitmask, lower, upper.

Definition at line 1649 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, exclude_struct_member(), extent_, OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::get_descriptor(), get_from_struct_common_checks(), OpenDDS::DCPS::Sample::KeyOnly, LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, read_values(), DDS::RETCODE_OK, and skip_to_struct_member().

1651 {
1652  DDS::MemberDescriptor_var md;
1653  if (exclude_struct_member(id, md)) {
1655  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_values_from_struct:"
1656  " Attempted to read a member not included in a %C sample\n",
1657  extent_ == DCPS::Sample::KeyOnly ? "KeyOnly" : "NestedKeyOnly"));
1658  }
1659  return false;
1660  }
1661 
1662  if (get_from_struct_common_checks(md, id, ElementTypeKind, true)) {
1663  return skip_to_struct_member(md, id) && read_values(value, ElementTypeKind);
1664  }
1665 
1666  if (get_from_struct_common_checks(md, id, enum_or_bitmask, true)) {
1667  const DDS::DynamicType_ptr member_type = md->type();
1668  if (member_type) {
1669  DDS::TypeDescriptor_var td;
1670  if (get_base_type(member_type)->get_descriptor(td) != DDS::RETCODE_OK) {
1671  return false;
1672  }
1673  DDS::TypeDescriptor_var etd;
1674  if (get_base_type(td->element_type())->get_descriptor(etd) != DDS::RETCODE_OK) {
1675  return false;
1676  }
1677  const LBound bit_bound = etd->bound()[0];
1678  return bit_bound >= lower && bit_bound <= upper &&
1679  skip_to_struct_member(md, id) && read_values(value, enum_or_bitmask);
1680  }
1681  }
1682 
1683  return false;
1684 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool read_values(SequenceType &value, TypeKind elem_tk)
bool exclude_struct_member(MemberId id, DDS::MemberDescriptor_var &md) const
Check if a member with a given id is excluded from struct sample.
DDS::ReturnCode_t get_descriptor(DDS::MemberDescriptor *&value, MemberId id)
bool get_from_struct_common_checks(const DDS::MemberDescriptor_var &md, MemberId id, TypeKind kind, bool is_sequence=false)
bool skip_to_struct_member(DDS::MemberDescriptor *member_desc, MemberId id)

◆ get_values_from_union()

template<TypeKind ElementTypeKind, typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_values_from_union ( SequenceType &  value,
MemberId  id,
TypeKind  enum_or_bitmask,
LBound  lower,
LBound  upper 
)
private

Templates for reading a sequence of primitives, strings or wstrings as a member (or an element) of a given containing type. See get_value_from_struct and the similar methods for the use of enum_or_bitmask, lower, upper.

Definition at line 1687 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DISCRIMINATOR_ID, exclude_union_member(), OpenDDS::XTypes::get_base_type(), get_from_union_common_checks(), LM_DEBUG, LM_ERROR, LM_NOTICE, DDS::MUTABLE, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_parameter_id(), read_values(), DDS::RETCODE_OK, strm_, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::DynamicDataBase::type_, and OpenDDS::XTypes::typekind_to_string().

1689 {
1690  if (id == DISCRIMINATOR_ID) {
1692  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_values_from_union:"
1693  " Attempted to read discriminator as a sequence\n"));
1694  }
1695  return false;
1696  }
1697 
1698  if (exclude_union_member(id)) {
1700  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::get_values_from_union:"
1701  " Attempted to read an excluded member with Id %u\n", id));
1702  }
1703  return false;
1704  }
1705 
1706  DDS::MemberDescriptor_var md = get_from_union_common_checks(id, "get_values_from_union");
1707  if (!md) {
1708  return false;
1709  }
1710 
1711  const DDS::DynamicType_ptr member_type = md->type();
1712  if (!member_type) {
1713  if (DCPS::DCPS_debug_level >= 1) {
1714  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_union -")
1715  ACE_TEXT(" Could not get DynamicType of the selected member\n")));
1716  }
1717  return false;
1718  }
1719 
1720  DDS::DynamicType_var selected_type = get_base_type(member_type);
1721  const TypeKind selected_tk = selected_type->get_kind();
1722  if (selected_tk != TK_SEQUENCE) {
1723  if (DCPS::DCPS_debug_level >= 1) {
1724  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_union -")
1725  ACE_TEXT(" The selected member is not a sequence, but %C\n"),
1726  typekind_to_string(selected_tk)));
1727  }
1728  return false;
1729  }
1730 
1731  DDS::TypeDescriptor_var td;
1732  if (selected_type->get_descriptor(td) != DDS::RETCODE_OK) {
1733  return false;
1734  }
1735  const DDS::DynamicType_var elem_type = get_base_type(td->element_type());
1736  const TypeKind elem_tk = elem_type->get_kind();
1737  if (elem_tk != ElementTypeKind && elem_tk != enum_or_bitmask) {
1738  if (DCPS::DCPS_debug_level >= 1) {
1739  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::get_values_from_union -")
1740  ACE_TEXT(" Could not read a sequence of %C from a sequence of %C\n"),
1741  typekind_to_string(ElementTypeKind), typekind_to_string(elem_tk)));
1742  }
1743  return false;
1744  }
1745 
1746  DDS::TypeDescriptor_var descriptor;
1747  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1748  return false;
1749  }
1750 
1751  if (descriptor->extensibility_kind() == DDS::MUTABLE) {
1752  unsigned member_id;
1753  size_t member_size;
1754  bool must_understand;
1755  if (!strm_.read_parameter_id(member_id, member_size, must_understand)) {
1756  return false;
1757  }
1758  }
1759 
1760  if (elem_tk == ElementTypeKind) {
1761  return read_values(value, ElementTypeKind);
1762  }
1763 
1764  // Reset.
1765  td = 0;
1766  if (elem_type->get_descriptor(td) != DDS::RETCODE_OK) {
1767  return false;
1768  }
1769  const LBound bit_bound = td->bound()[0];
1770  return bit_bound >= lower && bit_bound <= upper && read_values(value, enum_or_bitmask);
1771 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const LogLevel::Value value
Definition: debug.cpp:61
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
ACE_CDR::ULong LBound
Definition: TypeObject.h:312
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
DDS::MemberDescriptor * get_from_union_common_checks(MemberId id, const char *func_name)
const ACE_CDR::ULong DISCRIMINATOR_ID
Implementation specific sentinel for a union discriminator used in DynamicData.
Definition: TypeObject.h:913
bool exclude_union_member(MemberId id) const
Check if a member with a given Id is excluded from a union sample.
bool read_values(SequenceType &value, TypeKind elem_tk)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ get_wstring_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_wstring_value ( CORBA::WChar *&  value,
DDS::MemberId  id 
)

Definition at line 1467 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED, value, and CORBA::wstring_free().

Referenced by get_simple_value().

1468 {
1469 #ifdef DDS_HAS_WCHAR
1471  return get_single_value<TK_STRING16>(value, id);
1472 #else
1473  return DDS::RETCODE_UNSUPPORTED;
1474 #endif
1475 }
const LogLevel::Value value
Definition: debug.cpp:61
void wstring_free(WChar *const)
const ReturnCode_t RETCODE_UNSUPPORTED

◆ get_wstring_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::get_wstring_values ( DDS::WstringSeq value,
DDS::MemberId  id 
)

Definition at line 2045 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED, and value.

2046 {
2047 #ifdef DDS_HAS_WCHAR
2048  return get_sequence_values<TK_STRING16>(value, id);
2049 #else
2050  return DDS::RETCODE_UNSUPPORTED;
2051 #endif
2052 }
const LogLevel::Value value
Definition: debug.cpp:61
const ReturnCode_t RETCODE_UNSUPPORTED

◆ has_optional_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::has_optional_member ( bool &  has_optional) const
private

Definition at line 139 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_OK, OpenDDS::XTypes::TK_STRUCTURE, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_item_count(), and get_member_id_at_index().

140 {
141  if (type_->get_kind() != TK_STRUCTURE) {
142  return false;
143  }
144 
145  const ACE_CDR::ULong count = type_->get_member_count();
146  for (unsigned i = 0; i < count; ++i) {
147  DDS::DynamicTypeMember_var member;
148  if (type_->get_member_by_index(member, i) != DDS::RETCODE_OK) {
149  return false;
150  }
151  DDS::MemberDescriptor_var descriptor;
152  if (member->get_descriptor(descriptor) != DDS::RETCODE_OK) {
153  return false;
154  }
155  if (descriptor->is_optional()) {
156  has_optional = true;
157  return true;
158  }
159  }
160  has_optional = false;
161  return true;
162 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
ACE_UINT32 ULong

◆ loan_value()

DDS::DynamicData_ptr OpenDDS::XTypes::DynamicDataXcdrReadImpl::loan_value ( DDS::MemberId  id)

Definition at line 646 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, and LM_ERROR.

647 {
648  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: DynamicDataXcdrReadImpl::loan_value: Not implemented\n"));
649  return 0;
650 }
#define ACE_ERROR(X)

◆ OPENDDS_SET()

typedef OpenDDS::XTypes::DynamicDataXcdrReadImpl::OPENDDS_SET ( DCPS::String  )
private

A set of strings used to prevent infinite recursion when checking for XCDR1 Mutable.

◆ OPENDDS_VECTOR()

typedef OpenDDS::XTypes::DynamicDataXcdrReadImpl::OPENDDS_VECTOR ( ACE_Message_Block )
private

◆ operator=()

DynamicDataXcdrReadImpl & OpenDDS::XTypes::DynamicDataXcdrReadImpl::operator= ( const DynamicDataXcdrReadImpl other)

Definition at line 108 of file DynamicDataXcdrReadImpl.cpp.

References copy().

109 {
110  if (this != &other) {
111  copy(other);
112  }
113  return *this;
114 }
void copy(const DynamicDataXcdrReadImpl &other)

◆ read_discriminator()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::read_discriminator ( const DDS::DynamicType_ptr  disc_type,
DDS::ExtensibilityKind  union_ek,
ACE_CDR::Long label 
)
private

Definition at line 2552 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, LM_ERROR, DDS::MUTABLE, OpenDDS::DCPS::Serializer::read_parameter_id(), DDS::RETCODE_OK, strm_, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::typekind_to_string(), and value.

Referenced by get_item_count(), get_union_selected_member(), and skip_all().

2553 {
2554  if (union_ek == DDS::MUTABLE) {
2555  unsigned id;
2556  size_t size;
2557  bool must_understand;
2558  if (!strm_.read_parameter_id(id, size, must_understand)) { return false; }
2559  }
2560 
2561  const TypeKind disc_tk = disc_type->get_kind();
2562  switch (disc_tk) {
2563  case TK_BOOLEAN:
2564  {
2566  if (!(strm_ >> ACE_InputCDR::to_boolean(value))) { return false; }
2567  label = static_cast<ACE_CDR::Long>(value);
2568  return true;
2569  }
2570  case TK_BYTE:
2571  {
2573  if (!(strm_ >> ACE_InputCDR::to_octet(value))) { return false; }
2574  label = static_cast<ACE_CDR::Long>(value);
2575  return true;
2576  }
2577  case TK_CHAR8:
2578  {
2580  if (!(strm_ >> ACE_InputCDR::to_char(value))) { return false; }
2581  label = static_cast<ACE_CDR::Long>(value);
2582  return true;
2583  }
2584  case TK_CHAR16:
2585  {
2587  if (!(strm_ >> ACE_InputCDR::to_wchar(value))) { return false; }
2588  label = static_cast<ACE_CDR::Long>(value);
2589  return true;
2590  }
2591  case TK_INT8:
2592  {
2594  if (!(strm_ >> ACE_InputCDR::to_int8(value))) { return false; }
2595  label = static_cast<ACE_CDR::Long>(value);
2596  return true;
2597  }
2598  case TK_UINT8:
2599  {
2601  if (!(strm_ >> ACE_InputCDR::to_uint8(value))) { return false; }
2602  label = static_cast<ACE_CDR::Long>(value);
2603  return true;
2604  }
2605  case TK_INT16:
2606  {
2608  if (!(strm_ >> value)) { return false; }
2609  label = static_cast<ACE_CDR::Long>(value);
2610  return true;
2611  }
2612  case TK_UINT16:
2613  {
2615  if (!(strm_ >> value)) { return false; }
2616  label = static_cast<ACE_CDR::Long>(value);
2617  return true;
2618  }
2619  case TK_INT32:
2620  return strm_ >> label;
2621  case TK_UINT32:
2622  {
2624  if (!(strm_ >> value)) { return false; }
2625  label = static_cast<ACE_CDR::Long>(value);
2626  return true;
2627  }
2628  case TK_INT64:
2629  {
2631  if (!(strm_ >> value)) { return false; }
2632  label = static_cast<ACE_CDR::Long>(value);
2633  return true;
2634  }
2635  case TK_UINT64:
2636  {
2638  if (!(strm_ >> value)) { return false; }
2639  label = static_cast<ACE_CDR::Long>(value);
2640  return true;
2641  }
2642  case TK_ENUM:
2643  {
2644  DDS::TypeDescriptor_var disc_td;
2645  if (disc_type->get_descriptor(disc_td) != DDS::RETCODE_OK) {
2646  return false;
2647  }
2648  const ACE_CDR::ULong bit_bound = disc_td->bound()[0];
2649  if (bit_bound >= 1 && bit_bound <= 8) {
2651  if (!(strm_ >> ACE_InputCDR::to_int8(value))) { return false; }
2652  label = static_cast<ACE_CDR::Long>(value);
2653  } else if (bit_bound >= 9 && bit_bound <= 16) {
2655  if (!(strm_ >> value)) { return false; }
2656  label = static_cast<ACE_CDR::Long>(value);
2657  } else {
2658  return strm_ >> label;
2659  }
2660  return true;
2661  }
2662  default:
2663  if (DCPS::DCPS_debug_level >= 1) {
2664  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::read_discriminator - Union has")
2665  ACE_TEXT(" unsupported discriminator type (%C)\n"), typekind_to_string(disc_tk)));
2666  }
2667  return false;
2668  }
2669 }
ACE_Byte Octet
#define ACE_ERROR(X)
const TypeKind TK_INT8
Definition: TypeObject.h:225
ACE_INT64 LongLong
const LogLevel::Value value
Definition: debug.cpp:61
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
const ReturnCode_t RETCODE_OK
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
ACE_UINT64 ULongLong
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_UINT16
Definition: TypeObject.h:219
ACE_INT16 Short
const TypeKind TK_INT64
Definition: TypeObject.h:218
char Char
const TypeKind TK_UINT8
Definition: TypeObject.h:226
ACE_UINT16 UShort
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
ACE_UINT32 ULong
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_ENUM
Definition: TypeObject.h:238
ACE_TEXT("TCP_Factory")
ACE_INT32 Long
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221
ACE_INT8 Int8
ACE_WCHAR_T WChar
bool Boolean
ACE_UINT8 UInt8
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ read_value()

template<typename ValueType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::read_value ( ValueType &  value,
TypeKind  tk 
)
private

Reading a single value as a given type. For instance, an enum with bit bound of 32 is read as an 32-bit integer and thus TK_INT32 should be passed to tk.

Definition at line 665 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, LM_NOTICE, OpenDDS::DCPS::log_level, OpenDDS::DCPS::LogLevel::Notice, strm_, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, and OpenDDS::XTypes::typekind_to_string().

Referenced by get_boolean_from_bitmask(), get_boolean_value(), get_single_value(), get_value_from_collection(), get_value_from_struct(), and get_value_from_union().

666 {
667  switch (tk) {
668  case TK_INT32:
669  case TK_UINT32:
670  case TK_INT16:
671  case TK_UINT16:
672  case TK_INT64:
673  case TK_UINT64:
674  case TK_FLOAT32:
675  case TK_FLOAT64:
676  case TK_FLOAT128:
677  case TK_INT8:
678  case TK_UINT8:
679  case TK_CHAR8:
680  case TK_CHAR16:
681  case TK_BYTE:
682  case TK_BOOLEAN:
683  case TK_STRING8:
684  case TK_STRING16:
685  if (strm_ >> value) {
686  return true;
687  }
688  break;
689  default:
690  if (log_level >= LogLevel::Notice) {
691  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::read_value: "
692  "Calling on an unexpected type %C\n", typekind_to_string(tk)));
693  }
694  return false;
695  }
696 
697  if (log_level >= LogLevel::Notice) {
698  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::read_value: "
699  "failed to deserialize type %C\n", typekind_to_string(tk)));
700  }
701  return false;
702 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const TypeKind TK_INT8
Definition: TypeObject.h:225
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_STRING16
Definition: TypeObject.h:232
const TypeKind TK_UINT16
Definition: TypeObject.h:219
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_STRING8
Definition: TypeObject.h:231
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221

◆ read_values()

template<typename SequenceType >
bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::read_values ( SequenceType &  value,
TypeKind  elem_tk 
)
private

Read a sequence with element type elem_tk and store the result in value, which is a sequence of primitives or strings or wstrings. Sequence of enums or bitmasks are read as a sequence of signed and unsigned integers, respectively. In that case, elem_tk is set to TK_ENUM or TK_BITMASK.

Definition at line 1601 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, LM_NOTICE, OpenDDS::DCPS::log_level, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::skip_delimiter(), strm_, OpenDDS::XTypes::TK_BITMASK, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::typekind_to_string(), and value.

Referenced by get_values_from_array(), get_values_from_map(), get_values_from_sequence(), get_values_from_struct(), and get_values_from_union().

1602 {
1603  using OpenDDS::DCPS::operator>>;
1604 
1605  switch(elem_tk) {
1606  case TK_INT32:
1607  case TK_UINT32:
1608  case TK_INT16:
1609  case TK_UINT16:
1610  case TK_INT64:
1611  case TK_UINT64:
1612  case TK_FLOAT32:
1613  case TK_FLOAT64:
1614  case TK_FLOAT128:
1615  case TK_INT8:
1616  case TK_UINT8:
1617  case TK_CHAR8:
1618  case TK_CHAR16:
1619  case TK_BYTE:
1620  case TK_BOOLEAN:
1621  case TK_STRING8:
1622  case TK_STRING16:
1623  if (strm_ >> value) {
1624  return true;
1625  }
1626  break;
1627  case TK_ENUM:
1628  case TK_BITMASK:
1629  if (strm_.skip_delimiter() && strm_ >> value) {
1630  return true;
1631  }
1632  break;
1633  default:
1634  if (log_level >= LogLevel::Notice) {
1635  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::read_values: "
1636  "Calling on an unexpected element type %C\n", typekind_to_string(elem_tk)));
1637  }
1638  return false;
1639  }
1640 
1641  if (log_level >= LogLevel::Notice) {
1642  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::read_values: "
1643  "failed to deserialize element type %C\n", typekind_to_string(elem_tk)));
1644  }
1645  return false;
1646 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
const TypeKind TK_INT8
Definition: TypeObject.h:225
const LogLevel::Value value
Definition: debug.cpp:61
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_STRING16
Definition: TypeObject.h:232
const TypeKind TK_UINT16
Definition: TypeObject.h:219
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_STRING8
Definition: TypeObject.h:231
const TypeKind TK_ENUM
Definition: TypeObject.h:238
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221

◆ release_chains()

void OpenDDS::XTypes::DynamicDataXcdrReadImpl::release_chains ( )
private

Definition at line 2544 of file DynamicDataXcdrReadImpl.cpp.

References chains_to_release, and ACE_Message_Block::release().

2545 {
2546  for (ACE_CDR::ULong i = 0; i < chains_to_release.size(); ++i) {
2548  }
2549  chains_to_release.clear();
2550 }
virtual ACE_Message_Block * release(void)
ACE_UINT32 ULong

◆ return_loaned_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::return_loaned_value ( DDS::DynamicData_ptr  value)

Definition at line 652 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, LM_ERROR, and DDS::RETCODE_UNSUPPORTED.

653 {
654  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: DynamicDataXcdrReadImpl::return_loaned_value: Not implemented\n"));
656 }
#define ACE_ERROR(X)
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_boolean_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_boolean_value ( DDS::MemberId  ,
CORBA::Boolean   
)
inline

Definition at line 171 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

173  {
175  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_boolean_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_boolean_values ( DDS::MemberId  ,
const DDS::BooleanSeq  
)
inline

Definition at line 315 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

317  {
319  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_byte_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_byte_value ( DDS::MemberId  ,
CORBA::Octet   
)
inline

Definition at line 163 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

165  {
167  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_byte_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_byte_values ( DDS::MemberId  ,
const DDS::ByteSeq  
)
inline

Definition at line 307 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

309  {
311  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_char16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_char16_value ( DDS::MemberId  ,
CORBA::WChar   
)
inline

Definition at line 155 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

157  {
159  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_char16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_char16_values ( DDS::MemberId  ,
const DDS::WcharSeq  
)
inline

Definition at line 299 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

301  {
303  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_char8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_char8_value ( DDS::MemberId  ,
CORBA::Char   
)
inline

Definition at line 147 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

149  {
151  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_char8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_char8_values ( DDS::MemberId  ,
const DDS::CharSeq  
)
inline

Definition at line 291 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

293  {
295  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_complex_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_complex_value ( DDS::MemberId  ,
DDS::DynamicData_ptr   
)
inline

Definition at line 195 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

197  {
199  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_descriptor()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_descriptor ( MemberId  id,
DDS::MemberDescriptor value 
)

Definition at line 134 of file DynamicDataXcdrReadImpl.cpp.

References DDS::RETCODE_UNSUPPORTED.

135 {
137 }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float128_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float128_value ( DDS::MemberId  ,
CORBA::LongDouble   
)
inline

Definition at line 139 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

141  {
143  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float128_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float128_values ( DDS::MemberId  ,
const DDS::Float128Seq  
)
inline

Definition at line 283 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

285  {
287  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float32_value ( DDS::MemberId  ,
CORBA::Float   
)
inline

Definition at line 123 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

125  {
127  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float32_values ( DDS::MemberId  ,
const DDS::Float32Seq  
)
inline

Definition at line 267 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

269  {
271  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float64_value ( DDS::MemberId  ,
CORBA::Double   
)
inline

Definition at line 131 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

133  {
135  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_float64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_float64_values ( DDS::MemberId  ,
const DDS::Float64Seq  
)
inline

Definition at line 275 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

277  {
279  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int16_value ( DDS::MemberId  ,
CORBA::Short   
)
inline

Definition at line 91 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

93  {
95  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int16_values ( DDS::MemberId  ,
const DDS::Int16Seq  
)
inline

Definition at line 235 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

237  {
239  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int32_value ( DDS::MemberId  ,
CORBA::Long   
)
inline

Definition at line 59 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

61  {
63  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int32_values ( DDS::MemberId  ,
const DDS::Int32Seq  
)
inline

Definition at line 203 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

205  {
207  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int64_value ( DDS::MemberId  ,
CORBA::LongLong   
)
inline

Definition at line 107 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

109  {
111  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int64_values ( DDS::MemberId  ,
const DDS::Int64Seq  
)
inline

Definition at line 251 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

253  {
255  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int8_value ( DDS::MemberId  ,
CORBA::Int8   
)
inline

Definition at line 75 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

77  {
79  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_int8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_int8_values ( DDS::MemberId  ,
const DDS::Int8Seq  
)
inline

Definition at line 219 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

221  {
223  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_string_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_string_value ( DDS::MemberId  ,
const char *   
)
inline

Definition at line 179 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

181  {
183  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_string_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_string_values ( DDS::MemberId  ,
const DDS::StringSeq  
)
inline

Definition at line 323 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

325  {
327  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint16_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint16_value ( DDS::MemberId  ,
CORBA::UShort   
)
inline

Definition at line 99 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

101  {
103  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint16_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint16_values ( DDS::MemberId  ,
const DDS::UInt16Seq  
)
inline

Definition at line 243 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

245  {
247  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint32_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint32_value ( DDS::MemberId  ,
CORBA::ULong   
)
inline

Definition at line 67 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

69  {
71  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint32_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint32_values ( DDS::MemberId  ,
const DDS::UInt32Seq  
)
inline

Definition at line 211 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

213  {
215  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint64_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint64_value ( DDS::MemberId  ,
CORBA::ULongLong   
)
inline

Definition at line 115 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

117  {
119  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint64_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint64_values ( DDS::MemberId  ,
const DDS::UInt64Seq  
)
inline

Definition at line 259 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

261  {
263  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint8_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint8_value ( DDS::MemberId  ,
CORBA::UInt8   
)
inline

Definition at line 83 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

85  {
87  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_uint8_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_uint8_values ( DDS::MemberId  ,
const DDS::UInt8Seq  
)
inline

Definition at line 227 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

229  {
231  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_wstring_value()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_wstring_value ( DDS::MemberId  ,
const CORBA::WChar  
)
inline

Definition at line 187 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

189  {
191  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ set_wstring_values()

DDS::ReturnCode_t OpenDDS::XTypes::DynamicDataXcdrReadImpl::set_wstring_values ( DDS::MemberId  ,
const DDS::WstringSeq  
)
inline

Definition at line 331 of file DynamicDataXcdrReadImpl.h.

References DDS::RETCODE_UNSUPPORTED.

333  {
335  }
const ReturnCode_t RETCODE_UNSUPPORTED

◆ setup_stream()

void OpenDDS::XTypes::DynamicDataXcdrReadImpl::setup_stream ( ACE_Message_Block chain)
private

Setup the strm_ object so that it has the correct alignment state.

Definition at line 1152 of file DynamicDataXcdrReadImpl.cpp.

References align_state_, encoding_, OpenDDS::DCPS::Serializer::rdstate(), reset_align_state_, and strm_.

◆ skip()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip ( const char *  func_name,
const char *  description,
size_t  n,
int  size = 1 
)
private

Definition at line 2758 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, LM_ERROR, OpenDDS::DCPS::Serializer::skip(), and strm_.

Referenced by skip_all(), skip_array_member(), skip_collection_member(), skip_map_member(), skip_member(), and skip_sequence_member().

2759 {
2760  if (!strm_.skip(n, size)) {
2761  if (DCPS::DCPS_debug_level >= 1) {
2762  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::%C - %C\n"), func_name, description));
2763  }
2764  return false;
2765  }
2766  return true;
2767 }
#define ACE_ERROR(X)
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")

◆ skip_aggregated_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_aggregated_member ( DDS::DynamicType_ptr  type)
private

Skip a member which is a structure or a union.

Definition at line 2524 of file DynamicDataXcdrReadImpl.cpp.

References chains_to_release, OpenDDS::DCPS::Serializer::current(), ACE_Message_Block::duplicate(), encoding_, get_intermediate_chains(), OpenDDS::DCPS::Serializer::rdstate(), skip_all(), and strm_.

Referenced by skip_member().

2525 {
2526  DynamicDataXcdrReadImpl nested_data(strm_, member_type);
2527  if (!nested_data.skip_all()) {
2528  return false;
2529  }
2530 
2531  // Collect the intermediate message block chains that were created recursively
2532  // when skipping nested_data.
2533  const IntermediateChains& chains = nested_data.get_intermediate_chains();
2534  chains_to_release.insert(chains_to_release.end(), chains.begin(), chains.end());
2535 
2536  ACE_Message_Block* const result_chain = nested_data.strm_.current()->duplicate();
2537  strm_ = DCPS::Serializer(result_chain, encoding_);
2538  const DCPS::Serializer::RdState curr_state = nested_data.strm_.rdstate();
2539  strm_.rdstate(curr_state);
2540  chains_to_release.push_back(result_chain);
2541  return true;
2542 }
virtual ACE_Message_Block * duplicate(void) const

◆ skip_all()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_all ( )
private

Skip the whole data corresponding to this type if it is a struct or union. This is called by a containing type when it wants to skip a member which is an object of this type.

Definition at line 2671 of file DynamicDataXcdrReadImpl.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::XTypes::DynamicTypeMembersByIdImpl::begin(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::Serializer::encoding(), OpenDDS::XTypes::DynamicTypeMembersByIdImpl::end(), OpenDDS::XTypes::extensibility(), OpenDDS::XTypes::get_base_type(), OpenDDS::DCPS::Encoding::kind(), OpenDDS::DCPS::Encoding::KIND_XCDR2, OpenDDS::XTypes::Sequence< T >::length(), LM_DEBUG, LM_ERROR, DDS::MUTABLE, OpenDDS::DCPS::Serializer::read_delimiter(), read_discriminator(), DDS::RETCODE_OK, skip(), skip_member(), skip_struct_member_at_index(), strm_, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UNION, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by skip_aggregated_member(), skip_to_array_element(), and skip_to_sequence_element().

2672 {
2673  DDS::TypeDescriptor_var descriptor;
2674  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2675  return false;
2676  }
2677 
2678  const TypeKind tk = type_->get_kind();
2679  if (tk != TK_STRUCTURE && tk != TK_UNION) {
2680  return false;
2681  }
2682 
2683  const DDS::ExtensibilityKind extensibility = descriptor->extensibility_kind();
2684  if (strm_.encoding().kind() == DCPS::Encoding::KIND_XCDR2 && (extensibility == DDS::APPENDABLE || extensibility == DDS::MUTABLE)) {
2685  size_t dheader;
2686  if (!strm_.read_delimiter(dheader)) {
2687  if (DCPS::DCPS_debug_level >= 1) {
2688  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_all - Failed to read")
2689  ACE_TEXT(" DHEADER of the DynamicData object\n")));
2690  }
2691  return false;
2692  }
2693  return skip("skip_all", "Failed to skip the whole DynamicData object\n", dheader);
2694  } else {
2695  if (tk == TK_STRUCTURE) {
2696  const ACE_CDR::ULong member_count = type_->get_member_count();
2697  bool good = true;
2698  for (ACE_CDR::ULong i = 0; i < member_count; ++i) {
2699  ACE_CDR::ULong num_skipped;
2700  if (!skip_struct_member_at_index(i, num_skipped)) {
2701  good = false;
2702  break;
2703  }
2704  }
2705  return good;
2706  } else { // Union
2707  const DDS::DynamicType_var disc_type = get_base_type(descriptor->discriminator_type());
2708  ACE_CDR::Long label;
2709  if (!read_discriminator(disc_type, extensibility, label)) {
2710  return false;
2711  }
2712 
2713  DDS::DynamicTypeMembersById_var members;
2714  if (type_->get_all_members(members) != DDS::RETCODE_OK) {
2715  return false;
2716  }
2717  DynamicTypeMembersByIdImpl* members_impl = dynamic_cast<DynamicTypeMembersByIdImpl*>(members.in());
2718  if (!members_impl) {
2719  return false;
2720  }
2721 
2722  bool has_default = false;
2723  DDS::MemberDescriptor_var default_member;
2724  for (DynamicTypeMembersByIdImpl::const_iterator it = members_impl->begin(); it != members_impl->end(); ++it) {
2725  DDS::MemberDescriptor_var md;
2726  if (it->second->get_descriptor(md) != DDS::RETCODE_OK) {
2727  return false;
2728  }
2729  const DDS::UnionCaseLabelSeq& labels = md->label();
2730  for (ACE_CDR::ULong i = 0; i < labels.length(); ++i) {
2731  if (label == labels[i]) {
2732  const DDS::DynamicType_ptr selected_member = md->type();
2733  bool good = selected_member && skip_member(selected_member);
2734  return good;
2735  }
2736  }
2737 
2738  if (md->is_default_label()) {
2739  has_default = true;
2740  default_member = md;
2741  }
2742  }
2743 
2744  if (has_default) {
2745  const DDS::DynamicType_ptr default_dt = default_member->type();
2746  bool good = default_dt && skip_member(default_dt);
2747  return good;
2748  }
2749  if (DCPS::DCPS_debug_level >= 1) {
2750  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_all - Skip a union with no")
2751  ACE_TEXT(" selected member and a discriminator with value %d\n"), label));
2752  }
2753  return true;
2754  }
2755  }
2756 }
bool skip_struct_member_at_index(ACE_CDR::ULong index, ACE_CDR::ULong &num_skipped)
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
bool read_delimiter(size_t &size)
Definition: Serializer.inl:912
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
ACE_CDR::ULong length() const
Definition: TypeObject.h:167
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
ACE_UINT32 ULong
bool skip(const char *func_name, const char *description, size_t n, int size=1)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")
ACE_INT32 Long
bool read_discriminator(const DDS::DynamicType_ptr disc_type, DDS::ExtensibilityKind union_ek, ACE_CDR::Long &label)
const TypeKind TK_UNION
Definition: TypeObject.h:244
const Encoding & encoding() const
Definition: Serializer.inl:199
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210
extensibility(MUTABLE) struct TypeLookup_getTypes_In
Definition: TypeLookup.idl:29
ExtensibilityKind

◆ skip_array_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_array_member ( DDS::DynamicType_ptr  type)
private

Skip a member which is a sequence, array, or map.

Definition at line 2431 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::get_base_type(), get_primitive_size(), DDS::RETCODE_OK, skip(), and skip_collection_member().

Referenced by skip_member().

2432 {
2433  DDS::TypeDescriptor_var descriptor;
2434  if (array_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2435  return false;
2436  }
2437  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
2438 
2439  ACE_CDR::ULong primitive_size = 0;
2440  if (get_primitive_size(elem_type, primitive_size)) {
2441  const DDS::BoundSeq& bounds = descriptor->bound();
2442  ACE_CDR::ULong num_elems = 1;
2443  for (unsigned i = 0; i < bounds.length(); ++i) {
2444  num_elems *= bounds[i];
2445  }
2446 
2447  return skip("skip_array_member", "Failed to skip a primitive array member",
2448  num_elems, primitive_size);
2449  } else {
2450  return skip_collection_member(array_type);
2451  }
2452 }
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
sequence< unsigned long > BoundSeq
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
bool skip(const char *func_name, const char *description, size_t n, int size=1)
bool skip_collection_member(DDS::DynamicType_ptr coll_type)

◆ skip_collection_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_collection_member ( DDS::DynamicType_ptr  coll_type)
private

Skip a non-primitive collection member. That is, a sequence or an array of non-primitive elements, or a map with at least either key type or value type is non-primitive.

Definition at line 2491 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::Serializer::encoding(), OpenDDS::DCPS::Encoding::kind(), OpenDDS::DCPS::Encoding::KIND_XCDR2, LM_ERROR, LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_delimiter(), skip(), skip_to_array_element(), skip_to_sequence_element(), strm_, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, and OpenDDS::XTypes::typekind_to_string().

Referenced by skip_array_member(), skip_map_member(), and skip_sequence_member().

2492 {
2493  const TypeKind kind = coll_type->get_kind();
2494  if (kind == TK_SEQUENCE || kind == TK_ARRAY || kind == TK_MAP) {
2495  const char* kind_str = typekind_to_string(kind);
2497  size_t dheader;
2498  if (!strm_.read_delimiter(dheader)) {
2499  if (DCPS::DCPS_debug_level >= 1) {
2500  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_collection_member -")
2501  ACE_TEXT(" Failed to deserialize DHEADER of a non-primitive %C member\n"),
2502  kind_str));
2503  }
2504  return false;
2505  }
2506  const DCPS::String err_msg = DCPS::String("Failed to skip a non-primitive ") + kind_str + " member";
2507  return skip("skip_collection_member", err_msg.c_str(), dheader);
2508  } else if (kind == TK_SEQUENCE) {
2509  return skip_to_sequence_element(0, coll_type);
2510  } else if (kind == TK_ARRAY) {
2511  return skip_to_array_element(0, coll_type);
2512  } else if (kind == TK_MAP) {
2514  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::skip_collection_member: "
2515  "DynamicData does not currently support XCDR1 maps\n"));
2516  }
2517  return false;
2518  }
2519  }
2520 
2521  return false;
2522 }
OpenDDS_Dcps_Export LogLevel log_level
#define ACE_ERROR(X)
bool read_delimiter(size_t &size)
Definition: Serializer.inl:912
bool skip_to_sequence_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
bool skip(const char *func_name, const char *description, size_t n, int size=1)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
const char * typekind_to_string(TypeKind tk)
bool skip_to_array_element(MemberId id, DDS::DynamicType_ptr coll_type=0)
std::string String
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const TypeKind TK_MAP
Definition: TypeObject.h:250
const Encoding & encoding() const
Definition: Serializer.inl:199
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ skip_map_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_map_member ( DDS::DynamicType_ptr  type)
private

Skip a member which is a sequence, array, or map.

Definition at line 2454 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), get_primitive_size(), LM_ERROR, DDS::RETCODE_OK, skip(), skip_collection_member(), and strm_.

Referenced by skip_member().

2455 {
2456  DDS::TypeDescriptor_var descriptor;
2457  if (map_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2458  return false;
2459  }
2460  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
2461  const DDS::DynamicType_var key_type = get_base_type(descriptor->key_element_type());
2462 
2463  ACE_CDR::ULong key_primitive_size = 0, elem_primitive_size = 0;
2464  if (get_primitive_size(key_type, key_primitive_size) &&
2465  get_primitive_size(elem_type, elem_primitive_size)) {
2466  ACE_CDR::ULong length;
2467  if (!(strm_ >> length)) {
2468  if (DCPS::DCPS_debug_level >= 1) {
2469  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_map_member -")
2470  ACE_TEXT(" Failed to deserialize length of a primitive map member\n")));
2471  }
2472  return false;
2473  }
2474 
2475  for (unsigned i = 0; i < length; ++i) {
2476  if (!skip("skip_map_member", "Failed to skip a key of a primitive map member",
2477  1, key_primitive_size)) {
2478  return false;
2479  }
2480  if (!skip("skip_map_member", "Failed to skip an element of a primitive map member",
2481  1, elem_primitive_size)) {
2482  return false;
2483  }
2484  }
2485  return true;
2486  } else {
2487  return skip_collection_member(map_type);
2488  }
2489 }
#define ACE_ERROR(X)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
bool skip(const char *func_name, const char *description, size_t n, int size=1)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
bool skip_collection_member(DDS::DynamicType_ptr coll_type)
ACE_TEXT("TCP_Factory")

◆ skip_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_member ( DDS::DynamicType_ptr  member_type)
private

Skip a member with the given type. The member can be a part of any containing type, such as a member in a struct or union, an element in a sequence or array, etc. Note that this assumes any header preceding this type, e.g. EMHEADER if this is a member of a mutable struct, is already consumed, and the read pointer is pointing to the actual data of the member.

Definition at line 2286 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), LM_ERROR, DDS::RETCODE_OK, skip(), skip_aggregated_member(), skip_array_member(), skip_map_member(), skip_sequence_member(), strm_, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::TK_BITMASK, OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_MAP, OpenDDS::XTypes::TK_SEQUENCE, OpenDDS::XTypes::TK_STRING16, OpenDDS::XTypes::TK_STRING8, OpenDDS::XTypes::TK_STRUCTURE, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, OpenDDS::XTypes::TK_UINT8, OpenDDS::XTypes::TK_UNION, and OpenDDS::XTypes::typekind_to_string().

Referenced by get_item_count(), skip_all(), skip_struct_member_at_index(), skip_to_array_element(), skip_to_map_element(), and skip_to_sequence_element().

2287 {
2288  const DDS::DynamicType_var member_type = get_base_type(type);
2289  const TypeKind member_kind = member_type->get_kind();
2290 
2291  switch (member_kind) {
2292  case TK_BOOLEAN:
2293  case TK_BYTE:
2294  case TK_INT8:
2295  case TK_UINT8:
2296  case TK_CHAR8:
2297  if (!skip("skip_member", "Failed to skip a member of size 1 byte", 1, 1)) {
2298  return false;
2299  }
2300  break;
2301  case TK_INT16:
2302  case TK_UINT16:
2303  case TK_CHAR16:
2304  if (!skip("skip_member", "Failed to skip a member of size 2 bytes", 1, 2)) {
2305  return false;
2306  }
2307  break;
2308  case TK_INT32:
2309  case TK_UINT32:
2310  case TK_FLOAT32:
2311  if (!skip("skip_member", "Failed to skip a member of size 4 bytes", 1, 4)) {
2312  return false;
2313  }
2314  break;
2315  case TK_INT64:
2316  case TK_UINT64:
2317  case TK_FLOAT64:
2318  if (!skip("skip_member", "Failed to skip a member of size 8 bytes", 1, 8)) {
2319  return false;
2320  }
2321  break;
2322  case TK_FLOAT128:
2323  if (!skip("skip_member", "Failed to skip a member of size 16 bytes", 1, 16)) {
2324  return false;
2325  }
2326  break;
2327  case TK_STRING8:
2328  case TK_STRING16:
2329  {
2330  const char* str_kind = member_kind == TK_STRING8 ? "string" : "wstring";
2331  ACE_CDR::ULong bytes;
2332  if (!(strm_ >> bytes)) {
2333  if (DCPS::DCPS_debug_level >= 1) {
2334  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_member -")
2335  ACE_TEXT(" Failed to read length of a %C member\n"), str_kind));
2336  }
2337  return false;
2338  }
2339 
2340  const DCPS::String err_msg = DCPS::String("Failed to skip a ") + str_kind + " member";
2341  if (!skip("skip_member", err_msg.c_str(), bytes)) {
2342  return false;
2343  }
2344  break;
2345  }
2346  case TK_ENUM:
2347  case TK_BITMASK:
2348  {
2349  DDS::TypeDescriptor_var member_td;
2350  if (member_type->get_descriptor(member_td) != DDS::RETCODE_OK) {
2351  return false;
2352  }
2353  const ACE_CDR::ULong bit_bound = member_td->bound()[0];
2354  const char* err_msg = member_kind == TK_ENUM ?
2355  "Failed to skip an enum member" : "Failed to skip a bitmask member";
2356 
2357  if (bit_bound >= 1 && bit_bound <= 8) {
2358  if (!skip("skip_member", err_msg, 1, 1)) {
2359  return false;
2360  }
2361  } else if (bit_bound >= 9 && bit_bound <= 16) {
2362  if (!skip("skip_member", err_msg, 1, 2)) {
2363  return false;
2364  }
2365  } else if (bit_bound >= 17 && bit_bound <= 32) {
2366  if (!skip("skip_member", err_msg, 1, 4)) {
2367  return false;
2368  }
2369  } else if (bit_bound >= 33 && bit_bound <= 64 && member_kind == TK_BITMASK) {
2370  if (!skip("skip_member", err_msg, 1, 8)) {
2371  return false;
2372  }
2373  } else {
2374  if (DCPS::DCPS_debug_level >= 1) {
2375  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_member - Found a%C")
2376  ACE_TEXT(" member with bit bound %d\n"),
2377  member_kind == TK_ENUM ? "n enum" : " bitmask", bit_bound));
2378  }
2379  return false;
2380  }
2381  break;
2382  }
2383  case TK_STRUCTURE:
2384  case TK_UNION:
2385  return skip_aggregated_member(member_type);
2386  case TK_SEQUENCE:
2387  return skip_sequence_member(member_type);
2388  case TK_ARRAY:
2389  return skip_array_member(member_type);
2390  case TK_MAP:
2391  return skip_map_member(member_type);
2392  default:
2393  {
2394  if (DCPS::DCPS_debug_level >= 1) {
2395  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_member -")
2396  ACE_TEXT(" Found a member of kind %C\n"), typekind_to_string(member_kind)));
2397  }
2398  return false;
2399  }
2400  }
2401 
2402  return true;
2403 }
#define ACE_ERROR(X)
const TypeKind TK_INT8
Definition: TypeObject.h:225
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
bool skip_array_member(DDS::DynamicType_ptr type)
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
const TypeKind TK_STRING16
Definition: TypeObject.h:232
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
const TypeKind TK_UINT16
Definition: TypeObject.h:219
const TypeKind TK_INT64
Definition: TypeObject.h:218
const TypeKind TK_BITMASK
Definition: TypeObject.h:239
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_STRING8
Definition: TypeObject.h:231
ACE_UINT32 ULong
bool skip(const char *func_name, const char *description, size_t n, int size=1)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
const TypeKind TK_ENUM
Definition: TypeObject.h:238
ACE_TEXT("TCP_Factory")
const TypeKind TK_UINT32
Definition: TypeObject.h:220
bool skip_aggregated_member(DDS::DynamicType_ptr type)
Skip a member which is a structure or a union.
const char * typekind_to_string(TypeKind tk)
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UNION
Definition: TypeObject.h:244
const TypeKind TK_UINT64
Definition: TypeObject.h:221
std::string String
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
bool skip_sequence_member(DDS::DynamicType_ptr type)
const TypeKind TK_MAP
Definition: TypeObject.h:250
ACE_CDR::Octet TypeKind
Definition: TypeObject.h:210

◆ skip_sequence_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_sequence_member ( DDS::DynamicType_ptr  type)
private

Skip a member which is a sequence, array, or map.

Definition at line 2405 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::get_base_type(), get_primitive_size(), LM_ERROR, DDS::RETCODE_OK, skip(), skip_collection_member(), and strm_.

Referenced by get_item_count(), get_member_id_at_index(), skip_member(), and skip_to_struct_member().

2406 {
2407  DDS::TypeDescriptor_var descriptor;
2408  if (seq_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2409  return false;
2410  }
2411  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
2412 
2413  ACE_CDR::ULong primitive_size = 0;
2414  if (get_primitive_size(elem_type, primitive_size)) {
2415  ACE_CDR::ULong length;
2416  if (!(strm_ >> length)) {
2417  if (DCPS::DCPS_debug_level >= 1) {
2418  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_sequence_member -")
2419  ACE_TEXT(" Failed to deserialize a primitive sequence member\n")));
2420  }
2421  return false;
2422  }
2423 
2424  return skip("skip_sequence_member", "Failed to skip a primitive sequence member",
2425  length, primitive_size);
2426  } else {
2427  return skip_collection_member(seq_type);
2428  }
2429 }
#define ACE_ERROR(X)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
bool skip(const char *func_name, const char *description, size_t n, int size=1)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
bool skip_collection_member(DDS::DynamicType_ptr coll_type)
ACE_TEXT("TCP_Factory")

◆ skip_struct_member_at_index()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_struct_member_at_index ( ACE_CDR::ULong  index,
ACE_CDR::ULong num_skipped 
)
private

Skip a member of a final or appendable struct at the given index.

Definition at line 2254 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::Serializer::encoding(), OpenDDS::DCPS::Encoding::kind(), OpenDDS::DCPS::Encoding::KIND_XCDR2, LM_ERROR, DDS::RETCODE_OK, skip_member(), strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_item_count(), get_member_id_at_index(), skip_all(), and skip_to_struct_member().

2255 {
2256  DDS::DynamicTypeMember_var member;
2257  if (type_->get_member_by_index(member, index) != DDS::RETCODE_OK) {
2258  if (DCPS::DCPS_debug_level >= 1) {
2259  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_struct_member_at_index -")
2260  ACE_TEXT(" Failed to get DynamicTypeMember for member index %d\n"), index));
2261  }
2262  return false;
2263  }
2264 
2265  DDS::MemberDescriptor_var md;
2266  if (member->get_descriptor(md) != DDS::RETCODE_OK) {
2267  return false;
2268  }
2269  if (strm_.encoding().kind() == DCPS::Encoding::KIND_XCDR2 && md->is_optional()) {
2270  ACE_CDR::Boolean present;
2271  if (!(strm_ >> ACE_InputCDR::to_boolean(present))) {
2272  return false;
2273  }
2274  // Optional member that is omitted is not counted as a skipped member.
2275  if (!present) {
2276  num_skipped = 0;
2277  return true;
2278  }
2279  }
2280 
2281  num_skipped = 1;
2282  const DDS::DynamicType_ptr member_type = md->type();
2283  return member_type && skip_member(member_type);
2284 }
#define ACE_ERROR(X)
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")
bool Boolean
const Encoding & encoding() const
Definition: Serializer.inl:199

◆ skip_to_array_element()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_to_array_element ( MemberId  id,
DDS::DynamicType_ptr  coll_type = 0 
)
private

Skip to an element with a given ID in a sequence or array, or skip the entire collection.

Definition at line 1002 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::get_index_from_id(), get_primitive_size(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip(), skip_all(), OpenDDS::DCPS::Serializer::skip_delimiter(), skip_member(), strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_collection(), get_values_from_array(), and skip_collection_member().

1003 {
1004  DDS::TypeDescriptor_var descriptor;
1005  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1006  return false;
1007  }
1008 
1009  DDS::DynamicType_var elem_type;
1010  bool skip_all = false;
1011  DDS::TypeDescriptor_var coll_descriptor;
1012 
1013  if (!coll_type) {
1014  elem_type = get_base_type(descriptor->element_type());
1015  coll_type = type_;
1016  if (coll_type->get_descriptor(coll_descriptor) != DDS::RETCODE_OK) {
1017  return false;
1018  }
1019  } else {
1020  if (coll_type->get_descriptor(coll_descriptor) != DDS::RETCODE_OK) {
1021  return false;
1022  }
1023  elem_type = get_base_type(coll_descriptor->element_type());
1024  skip_all = true;
1025  }
1026 
1027  ACE_CDR::ULong length = 1;
1028  for (ACE_CDR::ULong i = 0; i < coll_descriptor->bound().length(); ++i) {
1029  length *= coll_descriptor->bound()[i];
1030  }
1031 
1032  ACE_CDR::ULong size;
1033  if (get_primitive_size(elem_type, size)) {
1034  ACE_CDR::ULong index;
1035  return get_index_from_id(id, index, length) && strm_.skip(index, size);
1036  } else {
1037  if (!strm_.skip_delimiter()) {
1038  return false;
1039  }
1040  ACE_CDR::ULong index;
1041  if (skip_all) {
1042  index = length;
1043  } else if (!get_index_from_id(id, index, length)) {
1044  return false;
1045  }
1046  for (ACE_CDR::ULong i = 0; i < index; ++i) {
1047  if (!skip_member(elem_type)) {
1048  return false;
1049  }
1050  }
1051  return true;
1052  }
1053 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const

◆ skip_to_map_element()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_to_map_element ( MemberId  id)
private

Skip to an element with a given ID in a map. The key associated with that element is also skipped.

Definition at line 1055 of file DynamicDataXcdrReadImpl.cpp.

References ACE_UINT32_MAX, OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::get_index_from_id(), get_primitive_size(), OpenDDS::DCPS::Serializer::read_delimiter(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::rpos(), OpenDDS::DCPS::Serializer::skip(), skip_member(), strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_collection(), and get_values_from_map().

1056 {
1057  DDS::TypeDescriptor_var descriptor;
1058  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
1059  return false;
1060  }
1061 
1062  const DDS::DynamicType_var key_type = get_base_type(descriptor->key_element_type());
1063  const DDS::DynamicType_var elem_type = get_base_type(descriptor->element_type());
1064  ACE_CDR::ULong key_size, elem_size;
1065 
1066  if (get_primitive_size(key_type, key_size) &&
1067  get_primitive_size(elem_type, elem_size)) {
1068  ACE_CDR::ULong length, index;
1069  if (!(strm_ >> length) || !get_index_from_id(id, index, length)) {
1070  return false;
1071  }
1072 
1073  for (ACE_CDR::ULong i = 0; i < index; ++i) {
1074  if (!strm_.skip(1, key_size) || !strm_.skip(1, elem_size)) {
1075  return false;
1076  }
1077  }
1078  return strm_.skip(1, key_size);
1079  } else {
1080  size_t dheader;
1081  ACE_CDR::ULong index;
1082  if (!strm_.read_delimiter(dheader) || !get_index_from_id(id, index, ACE_UINT32_MAX)) {
1083  return false;
1084  }
1085  const size_t end_of_map = strm_.rpos() + dheader;
1086 
1087  for (ACE_CDR::ULong i = 0; i < index; ++i) {
1088  if (strm_.rpos() >= end_of_map || !skip_member(key_type) || !skip_member(elem_type)) {
1089  return false;
1090  }
1091  }
1092  return (strm_.rpos() < end_of_map) && skip_member(key_type);
1093  }
1094 }
bool read_delimiter(size_t &size)
Definition: Serializer.inl:912
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
size_t rpos() const
Examine the logical reading position of the stream.
Definition: Serializer.h:475
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const

◆ skip_to_sequence_element()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_to_sequence_element ( MemberId  id,
DDS::DynamicType_ptr  coll_type = 0 
)
private

Skip to an element with a given ID in a sequence or array, or skip the entire collection.

Definition at line 958 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::get_index_from_id(), get_primitive_size(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::skip(), skip_all(), OpenDDS::DCPS::Serializer::skip_delimiter(), skip_member(), strm_, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_collection(), get_values_from_sequence(), and skip_collection_member().

959 {
960  DDS::TypeDescriptor_var descriptor;
961  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
962  return false;
963  }
964 
965  DDS::DynamicType_var elem_type;
966  bool skip_all = false;
967  if (!coll_type) {
968  elem_type = get_base_type(descriptor->element_type());
969  } else {
970  DDS::TypeDescriptor_var descriptor;
971  if (coll_type->get_descriptor(descriptor) != DDS::RETCODE_OK) {
972  return false;
973  }
974  elem_type = get_base_type(descriptor->element_type());
975  skip_all = true;
976  }
977  ACE_CDR::ULong size;
978  if (get_primitive_size(elem_type, size)) {
979  ACE_CDR::ULong length, index;
980  return (strm_ >> length) &&
981  get_index_from_id(id, index, length) &&
982  strm_.skip(index, size);
983  } else {
984  ACE_CDR::ULong length, index;
985  if (!strm_.skip_delimiter() || !(strm_ >> length)) {
986  return false;
987  }
988  if (skip_all) {
989  index = length;
990  } else if (!get_index_from_id(id, index, length)) {
991  return false;
992  }
993  for (ACE_CDR::ULong i = 0; i < index; ++i) {
994  if (!skip_member(elem_type)) {
995  return false;
996  }
997  }
998  return true;
999  }
1000 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
bool skip_member(DDS::DynamicType_ptr member_type)
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
bool get_primitive_size(DDS::DynamicType_ptr dt, ACE_CDR::ULong &size) const
ACE_UINT32 ULong
bool get_index_from_id(DDS::MemberId id, ACE_CDR::ULong &index, ACE_CDR::ULong bound) const

◆ skip_to_struct_member()

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::skip_to_struct_member ( DDS::MemberDescriptor member_desc,
MemberId  id 
)
private

Skip to a member with a given ID in a struct.

Definition at line 2072 of file DynamicDataXcdrReadImpl.cpp.

References ACE_ERROR, ACE_TEXT(), DDS::APPENDABLE, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::XTypes::DynamicDataBase::exclude_member(), extent_, DDS::FINAL, OpenDDS::XTypes::get_base_type(), OpenDDS::XTypes::DynamicDataBase::has_explicit_keys(), DDS::MemberDescriptor::index, LM_ERROR, LM_NOTICE, OpenDDS::DCPS::LogLevel::Notice, OpenDDS::DCPS::Serializer::read_delimiter(), OpenDDS::DCPS::Serializer::read_parameter_id(), DDS::RETCODE_OK, OpenDDS::DCPS::Serializer::rpos(), OpenDDS::DCPS::Serializer::skip(), OpenDDS::DCPS::Serializer::skip_delimiter(), skip_sequence_member(), skip_struct_member_at_index(), strm_, OpenDDS::XTypes::TK_SEQUENCE, and OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_complex_value(), get_value_from_struct(), and get_values_from_struct().

2073 {
2074  DDS::TypeDescriptor_var descriptor;
2075  if (type_->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2076  return false;
2077  }
2078 
2079  const DDS::ExtensibilityKind ek = descriptor->extensibility_kind();
2080  if (ek == DDS::FINAL || ek == DDS::APPENDABLE) {
2081  if (ek == DDS::APPENDABLE) {
2082  if (!strm_.skip_delimiter()) {
2083  if (DCPS::DCPS_debug_level >= 1) {
2084  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2085  ACE_TEXT(" Failed to read DHEADER for member ID %d\n"), id));
2086  }
2087  return false;
2088  }
2089  }
2090 
2091  for (ACE_CDR::ULong i = 0; i < member_desc->index(); ++i) {
2092  DDS::DynamicTypeMember_var dtm;
2093  if (type_->get_member_by_index(dtm, i) != DDS::RETCODE_OK) {
2095  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::skip_to_struct_member:"
2096  " Failed to get DynamicTypeMember for member at index %d\n", i));
2097  }
2098  return false;
2099  }
2100  DDS::MemberDescriptor_var md;
2101  if (dtm->get_descriptor(md) != DDS::RETCODE_OK) {
2103  ACE_ERROR((LM_NOTICE, "(%P|%t) NOTICE: DynamicDataXcdrReadImpl::skip_to_struct_member:"
2104  " Failed to get MemberDescriptor for member at index %d\n", i));
2105  }
2106  return false;
2107  }
2108  if (exclude_member(extent_, md->is_key(), has_explicit_keys(type_))) {
2109  // This member is not present in the sample, don't need to do anything.
2110  continue;
2111  }
2112 
2113  ACE_CDR::ULong num_skipped;
2114  if (!skip_struct_member_at_index(i, num_skipped)) {
2115  if (DCPS::DCPS_debug_level >= 1) {
2116  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2117  ACE_TEXT(" Failed to skip member at index %d\n"), i));
2118  }
2119  return false;
2120  }
2121  }
2122  return true;
2123  } else {
2124  size_t dheader = 0;
2125  if (!strm_.read_delimiter(dheader)) {
2126  if (DCPS::DCPS_debug_level >= 1) {
2127  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2128  ACE_TEXT(" Failed to read DHEADER for member ID %d\n"), id));
2129  }
2130  return false;
2131  }
2132 
2133  const size_t end_of_sample = strm_.rpos() + dheader;
2134  while (true) {
2135  if (strm_.rpos() >= end_of_sample) {
2136  if (DCPS::DCPS_debug_level >= 1) {
2137  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2138  ACE_TEXT(" Could not find a member with ID %d\n"), id));
2139  }
2140  return false;
2141  }
2142 
2143  ACE_CDR::ULong member_id;
2144  size_t member_size;
2145  bool must_understand;
2146  if (!strm_.read_parameter_id(member_id, member_size, must_understand)) {
2147  if (DCPS::DCPS_debug_level >= 1) {
2148  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2149  ACE_TEXT(" Failed to read EMHEADER while finding member ID %d\n"), id));
2150  }
2151  return false;
2152  }
2153 
2154  if (member_id == id) {
2155  return true;
2156  }
2157 
2158  DDS::DynamicTypeMember_var dtm;
2159  if (type_->get_member(dtm, member_id) != DDS::RETCODE_OK) {
2160  if (DCPS::DCPS_debug_level >= 1) {
2161  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2162  ACE_TEXT(" Failed to get DynamicTypeMember at ID %d\n"), member_id));
2163  }
2164  return false;
2165  }
2166  DDS::MemberDescriptor_var descriptor;
2167  if (dtm->get_descriptor(descriptor) != DDS::RETCODE_OK) {
2168  if (DCPS::DCPS_debug_level >= 1) {
2169  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2170  ACE_TEXT(" Failed to get member descriptor at ID %d\n"), member_id));
2171  }
2172  return false;
2173  }
2174  const DDS::DynamicType_ptr mt = descriptor->type();
2175  if (!mt) {
2176  if (DCPS::DCPS_debug_level >= 1) {
2177  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2178  ACE_TEXT(" Failed to get DynamicType for member at ID %d\n"), member_id));
2179  }
2180  return false;
2181  }
2182  const DDS::DynamicType_var member = get_base_type(mt);
2183  if (member->get_kind() == TK_SEQUENCE) {
2184  // Sequence is a special case where the NEXTINT header can also be used for
2185  // the length of the sequence (when LC is 5, 6, or 7). And thus skipping such a
2186  // sequence member using member_size can be incorrect.
2187  if (!skip_sequence_member(member)) {
2188  if (DCPS::DCPS_debug_level >= 1) {
2189  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2190  ACE_TEXT(" Failed to skip a sequence member at ID %d\n"), member_id));
2191  }
2192  return false;
2193  }
2194  } else if (!strm_.skip(member_size)) {
2195  if (DCPS::DCPS_debug_level >= 1) {
2196  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) DynamicDataXcdrReadImpl::skip_to_struct_member -")
2197  ACE_TEXT(" Failed to skip a member with ID %d\n"), member_id));
2198  }
2199  return false;
2200  }
2201  }
2202  }
2203 }
OpenDDS_Dcps_Export LogLevel log_level
bool skip_struct_member_at_index(ACE_CDR::ULong index, ACE_CDR::ULong &num_skipped)
#define ACE_ERROR(X)
bool read_parameter_id(unsigned &id, size_t &size, bool &must_understand)
Definition: Serializer.cpp:707
bool read_delimiter(size_t &size)
Definition: Serializer.inl:912
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.
const ReturnCode_t RETCODE_OK
DDS::DynamicType_var get_base_type(DDS::DynamicType_ptr type)
bool skip(size_t n, int size=1)
Definition: Serializer.inl:443
static bool has_explicit_keys(DDS::DynamicType *dt)
ACE_UINT32 ULong
public unsigned long index
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
ACE_TEXT("TCP_Factory")
size_t rpos() const
Examine the logical reading position of the stream.
Definition: Serializer.h:475
bool skip_sequence_member(DDS::DynamicType_ptr type)
static bool exclude_member(DCPS::Sample::Extent ext, bool is_key, bool has_explicit_keys)
ExtensibilityKind

◆ type()

DDS::DynamicType_ptr OpenDDS::XTypes::DynamicDataXcdrReadImpl::type ( void  )

Definition at line 2054 of file DynamicDataXcdrReadImpl.cpp.

References OpenDDS::XTypes::DynamicDataBase::type_.

Referenced by get_value_from_union(), OpenDDS::XTypes::print_dynamic_data(), OpenDDS::XTypes::print_struct(), and OpenDDS::XTypes::print_union().

2055 {
2056  return DDS::DynamicType::_duplicate(type_);
2057 }
DDS::DynamicType_var type_
The actual (i.e., non-alias) DynamicType of the associated type.

Member Data Documentation

◆ align_state_

DCPS::Serializer::RdState OpenDDS::XTypes::DynamicDataXcdrReadImpl::align_state_
private

The alignment state that a Serializer object associated with this DynamicData object will be set to.

Definition at line 552 of file DynamicDataXcdrReadImpl.h.

Referenced by copy(), DynamicDataXcdrReadImpl(), and setup_stream().

◆ chain_

ACE_Message_Block* OpenDDS::XTypes::DynamicDataXcdrReadImpl::chain_
private

A duplicate of the original message block chain passed from the constructor. This is released in the destructor.

Definition at line 541 of file DynamicDataXcdrReadImpl.h.

Referenced by clone(), copy(), and ~DynamicDataXcdrReadImpl().

◆ chains_to_release

IntermediateChains OpenDDS::XTypes::DynamicDataXcdrReadImpl::chains_to_release
private

Message block chains created during each get_*_value or get_*_values method's execution that need to be released when the method ends. Those chains are created when the method skips a nested aggregated type (i.e., struct and union) by calling skip_aggregated_member().

Definition at line 562 of file DynamicDataXcdrReadImpl.h.

Referenced by release_chains(), and skip_aggregated_member().

◆ encoding_

DCPS::Encoding OpenDDS::XTypes::DynamicDataXcdrReadImpl::encoding_
private

◆ extent_

DCPS::Sample::Extent OpenDDS::XTypes::DynamicDataXcdrReadImpl::extent_
private

◆ item_count_

ACE_CDR::ULong OpenDDS::XTypes::DynamicDataXcdrReadImpl::item_count_
private

Cache the number of items (i.e., members or elements) in the data it holds.

Definition at line 567 of file DynamicDataXcdrReadImpl.h.

Referenced by copy(), get_item_count(), and get_member_id_at_index().

◆ ITEM_COUNT_INVALID

const ACE_CDR::ULong OpenDDS::XTypes::DynamicDataXcdrReadImpl::ITEM_COUNT_INVALID = ACE_UINT32_MAX
staticprivate

Definition at line 564 of file DynamicDataXcdrReadImpl.h.

Referenced by get_item_count(), and get_member_id_at_index().

◆ reset_align_state_

bool OpenDDS::XTypes::DynamicDataXcdrReadImpl::reset_align_state_
private

Indicate whether the alignment state of a Serializer object associated with this DynamicData needs to be reset.

Definition at line 548 of file DynamicDataXcdrReadImpl.h.

Referenced by copy(), and setup_stream().

◆ strm_

DCPS::Serializer OpenDDS::XTypes::DynamicDataXcdrReadImpl::strm_
private

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