Implementation of the basic Dynamic Any datatype. More...
#include <DynAny_i.h>


Public Member Functions | |
| TAO_DynAny_i (void) | |
| Constructor. | |
| ~TAO_DynAny_i (void) | |
| Destructor. | |
| void | init (CORBA::TypeCode_ptr tc) |
| Initialize using just a TypeCode. | |
| void | init (const CORBA::Any &any) |
| Initialize using an Any. | |
| virtual void | from_any (const CORBA::Any &value) |
| virtual CORBA::Any * | to_any (void) |
| virtual CORBA::Boolean | equal (DynamicAny::DynAny_ptr dyn_any) |
| virtual void | destroy (void) |
| virtual DynamicAny::DynAny_ptr | current_component (void) |
Static Public Member Functions | |
| static TAO_DynAny_i * | _narrow (CORBA::Object_ptr obj) |
Private Member Functions | |
| void | check_typecode (CORBA::TypeCode_ptr tc) |
| Check if the typecode is acceptable. | |
| void | set_to_default_value (CORBA::TypeCode_ptr tc) |
| Used when we are created from a typecode. | |
| void | init_common (void) |
| Called by both versions of init(). | |
| TAO_DynAny_i (const TAO_DynAny_i &src) | |
| TAO_DynAny_i & | operator= (const TAO_DynAny_i &src) |
Implementation of the basic Dynamic Any datatype.
Definition at line 41 of file DynAny_i.h.
| TAO_DynAny_i::TAO_DynAny_i | ( | void | ) |
| TAO_DynAny_i::~TAO_DynAny_i | ( | void | ) |
| TAO_DynAny_i::TAO_DynAny_i | ( | const TAO_DynAny_i & | src | ) | [private] |
| TAO_DynAny_i * TAO_DynAny_i::_narrow | ( | CORBA::Object_ptr | obj | ) | [static] |
is_local member into CORBA::Object. I'll take the easier route for now. Reimplemented from CORBA::LocalObject.
Definition at line 203 of file DynAny_i.cpp.
{
if (CORBA::is_nil (_tao_objref))
{
return 0;
}
return dynamic_cast<TAO_DynAny_i *> (_tao_objref);
}
| void TAO_DynAny_i::check_typecode | ( | CORBA::TypeCode_ptr | tc | ) | [private] |
Check if the typecode is acceptable.
Definition at line 32 of file DynAny_i.cpp.
{
// Check to see if it's a simple type.
CORBA::TCKind tk = TAO_DynAnyFactory::unalias (tc);
switch (tk)
{
case CORBA::tk_null:
case CORBA::tk_void:
case CORBA::tk_short:
case CORBA::tk_long:
case CORBA::tk_ushort:
case CORBA::tk_ulong:
case CORBA::tk_float:
case CORBA::tk_double:
case CORBA::tk_longlong:
case CORBA::tk_ulonglong:
case CORBA::tk_boolean:
case CORBA::tk_char:
case CORBA::tk_wchar:
case CORBA::tk_octet:
case CORBA::tk_any:
case CORBA::tk_TypeCode:
case CORBA::tk_objref:
case CORBA::tk_string:
case CORBA::tk_wstring:
case CORBA::tk_longdouble:
break;
case CORBA::tk_sequence:
if (tc == CORBA::_tc_BooleanSeq
|| tc == CORBA::_tc_OctetSeq
|| tc == CORBA::_tc_CharSeq
|| tc == CORBA::_tc_WCharSeq
|| tc == CORBA::_tc_ShortSeq
|| tc == CORBA::_tc_UShortSeq
|| tc == CORBA::_tc_LongSeq
|| tc == CORBA::_tc_ULongSeq
|| tc == CORBA::_tc_LongLongSeq
|| tc == CORBA::_tc_ULongLongSeq
|| tc == CORBA::_tc_FloatSeq
|| tc == CORBA::_tc_DoubleSeq
|| tc == CORBA::_tc_LongDoubleSeq)
{
// Otherwise fall through.
break;
}
default:
throw DynamicAny::DynAnyFactory::InconsistentTypeCode ();
}
}
| DynamicAny::DynAny_ptr TAO_DynAny_i::current_component | ( | void | ) | [virtual] |
Definition at line 512 of file DynAny_i.cpp.
{
if (this->destroyed_)
{
throw ::CORBA::OBJECT_NOT_EXIST ();
}
throw DynamicAny::DynAny::TypeMismatch ();
}
| void TAO_DynAny_i::destroy | ( | void | ) | [virtual] |
Definition at line 497 of file DynAny_i.cpp.
{
if (this->destroyed_)
{
throw ::CORBA::OBJECT_NOT_EXIST ();
}
if (!this->ref_to_component_ || this->container_is_destroying_)
{
this->destroyed_ = 1;
}
}
| CORBA::Boolean TAO_DynAny_i::equal | ( | DynamicAny::DynAny_ptr | dyn_any | ) | [virtual] |
Definition at line 255 of file DynAny_i.cpp.
{
if (this->destroyed_)
{
throw ::CORBA::OBJECT_NOT_EXIST ();
}
TAO_DynAny_i *rhs_n = TAO_DynAny_i::_narrow (rhs);
if (rhs_n == 0)
{
return false;
}
if (!this->type_->equivalent (rhs_n->type_.in ()))
{
return false;
}
CORBA::TCKind tk = TAO_DynAnyFactory::unalias (this->type_.in ());
switch (tk)
{
case CORBA::tk_null:
case CORBA::tk_void:
return true;
case CORBA::tk_short:
{
CORBA::Short rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::Short lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_long:
{
CORBA::Long rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::Long lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_ushort:
{
CORBA::UShort rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::UShort lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_ulong:
{
CORBA::ULong rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::ULong lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_float:
{
CORBA::Float rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::Float lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_double:
{
CORBA::Double rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::Double lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_longlong:
{
CORBA::LongLong rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::LongLong lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_ulonglong:
{
CORBA::ULongLong rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::ULongLong lhs_v;
this->any_ >>= lhs_v;
return (lhs_v == rhs_v);
}
case CORBA::tk_boolean:
{
CORBA::Boolean rhs_v;
rhs_n->any_ >>= CORBA::Any::to_boolean (rhs_v);
CORBA::Boolean lhs_v;
this->any_ >>= CORBA::Any::to_boolean (lhs_v);
return (lhs_v == rhs_v);
}
case CORBA::tk_char:
{
CORBA::Char rhs_v;
rhs_n->any_ >>= CORBA::Any::to_char (rhs_v);
CORBA::Char lhs_v;
this->any_ >>= CORBA::Any::to_char (lhs_v);
return (lhs_v == rhs_v);
}
case CORBA::tk_wchar:
{
CORBA::WChar rhs_v;
rhs_n->any_ >>= CORBA::Any::to_wchar (rhs_v);
CORBA::WChar lhs_v;
this->any_ >>= CORBA::Any::to_wchar (lhs_v);
return (lhs_v == rhs_v);
}
case CORBA::tk_octet:
{
CORBA::Octet rhs_v;
rhs_n->any_ >>= CORBA::Any::to_octet (rhs_v);
CORBA::Octet lhs_v;
this->any_ >>= CORBA::Any::to_octet (lhs_v);
return (lhs_v == rhs_v);
}
case CORBA::tk_any:
{
const CORBA::Any *rhs_v;
rhs_n->any_ >>= rhs_v;
const CORBA::Any *lhs_v;
this->any_ >>= lhs_v;
DynamicAny::DynAny_var rhs_dyn =
TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
rhs_v->_tao_get_typecode (),
*rhs_v);
DynamicAny::DynAny_var lhs_dyn =
TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
lhs_v->_tao_get_typecode (),
*lhs_v);
CORBA::Boolean const b = rhs_dyn->equal (lhs_dyn.in ());
rhs_dyn->destroy ();
lhs_dyn->destroy ();
return b;
}
case CORBA::tk_TypeCode:
{
CORBA::TypeCode_ptr rhs_v;
rhs_n->any_ >>= rhs_v;
CORBA::TypeCode_ptr lhs_v;
this->any_ >>= lhs_v;
// See CORBA 2.4.2 - must use equal() here.
return lhs_v->equal (lhs_v);
}
case CORBA::tk_objref:
{
CORBA::Object_ptr rhs_v;
rhs_n->any_ >>= CORBA::Any::to_object (rhs_v);
CORBA::Object_ptr lhs_v;
this->any_ >>= CORBA::Any::to_object (lhs_v);
return lhs_v->_is_equivalent (lhs_v);
}
case CORBA::tk_string:
{
CORBA::TypeCode_var unaliased_tc =
TAO_DynAnyFactory::strip_alias (this->type_.in ());
CORBA::ULong bound =
unaliased_tc->length ();
const char *rhs_v, *lhs_v;
CORBA::Boolean rstatus, lstatus;
if (bound == 0)
{
rstatus = rhs_n->any_ >>= rhs_v;
lstatus = this->any_ >>= lhs_v;
if ((rstatus && lstatus) == 0)
{
return 0;
}
}
else
{
rstatus = rhs_n->any_ >>= CORBA::Any::to_string (rhs_v, bound);
lstatus = this->any_ >>= CORBA::Any::to_string (lhs_v, bound);
if ((rstatus && lstatus) == 0)
{
return 0;
}
}
return ACE_OS::strcmp (rhs_v, lhs_v) == 0;
}
case CORBA::tk_wstring:
{
CORBA::TypeCode_var unaliased_tc =
TAO_DynAnyFactory::strip_alias (this->type_.in ());
CORBA::ULong bound =
unaliased_tc->length ();
const CORBA::WChar *rhs_v, *lhs_v;
CORBA::Boolean rstatus, lstatus;
if (bound == 0)
{
rstatus = rhs_n->any_ >>= rhs_v;
lstatus = this->any_ >>= lhs_v;
if ((rstatus && lstatus) == 0)
{
return 0;
}
}
else
{
rstatus = rhs_n->any_ >>= CORBA::Any::to_wstring (rhs_v,
bound);
lstatus = this->any_ >>= CORBA::Any::to_wstring (lhs_v,
bound);
if ((rstatus && lstatus) == 0)
{
return 0;
}
}
return ACE_OS::wscmp (rhs_v, lhs_v) == 0;
}
default:
break; // Cannot happen...
}
return 0;
}
| void TAO_DynAny_i::from_any | ( | const CORBA::Any & | value | ) | [virtual] |
Definition at line 216 of file DynAny_i.cpp.
{
if (this->destroyed_)
{
throw ::CORBA::OBJECT_NOT_EXIST ();
}
CORBA::TypeCode_var any_tc = any.type ();
if (!this->type_->equivalent (any_tc.in ()))
{
throw DynamicAny::DynAny::TypeMismatch ();
}
// @@@ (JP) Spec also says we should check for illegal Any
// value here, and throw InvalidValue if we find one.
// Something like a null string will be caught in the constructor.
this->any_ = any;
}
| void TAO_DynAny_i::init | ( | const CORBA::Any & | any | ) |
Initialize using an Any.
Definition at line 190 of file DynAny_i.cpp.
{
this->type_ = any.type ();
this->check_typecode (this->type_.in ());
this->init_common ();
this->any_ = any;
}
| void TAO_DynAny_i::init | ( | CORBA::TypeCode_ptr | tc | ) |
Initialize using just a TypeCode.
Definition at line 178 of file DynAny_i.cpp.
{
this->check_typecode (tc);
this->set_to_default_value (tc);
this->init_common ();
this->type_ = CORBA::TypeCode::_duplicate (tc);
}
| void TAO_DynAny_i::init_common | ( | void | ) | [private] |
Called by both versions of init().
Definition at line 167 of file DynAny_i.cpp.
{
this->ref_to_component_ = false;
this->container_is_destroying_ = false;
this->has_components_ = false;
this->destroyed_ = false;
this->current_position_ = -1;
this->component_count_ = 0;
}
| TAO_DynAny_i& TAO_DynAny_i::operator= | ( | const TAO_DynAny_i & | src | ) | [private] |
| void TAO_DynAny_i::set_to_default_value | ( | CORBA::TypeCode_ptr | tc | ) | [private] |
Used when we are created from a typecode.
Definition at line 84 of file DynAny_i.cpp.
{
CORBA::TCKind tk = TAO_DynAnyFactory::unalias (tc);
switch (tk)
{
case CORBA::tk_null:
break;
case CORBA::tk_void:
this->any_._tao_set_typecode (CORBA::_tc_void);
break;
case CORBA::tk_short:
this->any_ <<= static_cast<CORBA::Short> (0);
break;
case CORBA::tk_long:
this->any_ <<= static_cast<CORBA::Long> (0);
break;
case CORBA::tk_ushort:
this->any_ <<= static_cast<CORBA::UShort> (0);
break;
case CORBA::tk_ulong:
this->any_ <<= static_cast<CORBA::ULong> (0);
break;
#if !defined (ACE_LACKS_LONGLONG_T)
case CORBA::tk_longlong:
this->any_ <<= static_cast<CORBA::LongLong> (0);
break;
case CORBA::tk_ulonglong:
this->any_ <<= static_cast<CORBA::ULongLong> (0);
break;
#endif /* ACE_LACKS_LONGLONG_T */
case CORBA::tk_boolean:
this->any_ <<= CORBA::Any::from_boolean (0);
break;
case CORBA::tk_octet:
this->any_ <<= CORBA::Any::from_octet (0);
break;
case CORBA::tk_char:
this->any_ <<= CORBA::Any::from_char (0);
break;
case CORBA::tk_wchar:
this->any_ <<= CORBA::Any::from_wchar (0);
break;
case CORBA::tk_float:
this->any_ <<= static_cast<CORBA::Float> (0);
break;
case CORBA::tk_double:
this->any_ <<= static_cast<CORBA::Double> (0);
break;
case CORBA::tk_any:
this->any_._tao_set_typecode (CORBA::_tc_null);
break;
case CORBA::tk_TypeCode:
this->any_ <<= CORBA::_tc_null;
break;
case CORBA::tk_objref:
{
TAO_OutputCDR stream;
stream << CORBA::Object::_nil ();
TAO_InputCDR in (stream);
TAO::Unknown_IDL_Type *unk = 0;
ACE_NEW (unk,
TAO::Unknown_IDL_Type (tc, in));
this->any_.replace (unk);
break;
}
case CORBA::tk_string:
this->any_ <<= "";
break;
case CORBA::tk_wstring:
{
CORBA::WChar wstr[1];
wstr[0] = 0;
this->any_ <<= wstr;
break;
}
default:
// Should never get here - check_typecode() has already been called.
break;
}
}
| CORBA::Any_ptr TAO_DynAny_i::to_any | ( | void | ) | [virtual] |
Definition at line 238 of file DynAny_i.cpp.
{
if (this->destroyed_)
{
throw ::CORBA::OBJECT_NOT_EXIST ();
}
CORBA::Any_ptr retval;
ACE_NEW_THROW_EX (retval,
CORBA::Any (this->any_),
CORBA::NO_MEMORY ());
return retval;
}
1.7.0