TAO_DynAny_i Class Reference

Implementation of the basic Dynamic Any datatype. More...

#include <DynAny_i.h>

Inheritance diagram for TAO_DynAny_i:

Inheritance graph
[legend]
Collaboration diagram for TAO_DynAny_i:

Collaboration graph
[legend]
List of all members.

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_ioperator= (const TAO_DynAny_i &src)

Detailed Description

Implementation of the basic Dynamic Any datatype.

Definition at line 41 of file DynAny_i.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_DynAny_i::TAO_DynAny_i ( void   ) 

Constructor.

Definition at line 23 of file DynAny_i.cpp.

00024 {
00025 }

TAO_DynAny_i::~TAO_DynAny_i ( void   ) 

Destructor.

Definition at line 27 of file DynAny_i.cpp.

00028 {
00029 }

TAO_DynAny_i::TAO_DynAny_i ( const TAO_DynAny_i src  )  [private]


Member Function Documentation

TAO_DynAny_i * TAO_DynAny_i::_narrow ( CORBA::Object_ptr  obj  )  [static]

Reimplemented from CORBA::LocalObject.

Definition at line 203 of file DynAny_i.cpp.

References CORBA::is_nil().

Referenced by equal().

00204 {
00205   if (CORBA::is_nil (_tao_objref))
00206     {
00207       return 0;
00208     }
00209 
00210   return dynamic_cast<TAO_DynAny_i *> (_tao_objref);
00211 }

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.

References CORBA::tk_any, CORBA::tk_boolean, CORBA::tk_char, CORBA::tk_double, CORBA::tk_float, CORBA::tk_long, CORBA::tk_longdouble, CORBA::tk_longlong, CORBA::tk_null, CORBA::tk_objref, CORBA::tk_octet, CORBA::tk_sequence, CORBA::tk_short, CORBA::tk_string, CORBA::tk_TypeCode, CORBA::tk_ulong, CORBA::tk_ulonglong, CORBA::tk_ushort, CORBA::tk_void, CORBA::tk_wchar, CORBA::tk_wstring, and TAO_DynAnyFactory::unalias().

Referenced by init().

00033 {
00034   // Check to see if it's a simple type.
00035   CORBA::TCKind tk = TAO_DynAnyFactory::unalias (tc);
00036 
00037   switch (tk)
00038   {
00039     case CORBA::tk_null:
00040     case CORBA::tk_void:
00041     case CORBA::tk_short:
00042     case CORBA::tk_long:
00043     case CORBA::tk_ushort:
00044     case CORBA::tk_ulong:
00045     case CORBA::tk_float:
00046     case CORBA::tk_double:
00047     case CORBA::tk_longlong:
00048     case CORBA::tk_ulonglong:
00049     case CORBA::tk_boolean:
00050     case CORBA::tk_char:
00051     case CORBA::tk_wchar:
00052     case CORBA::tk_octet:
00053     case CORBA::tk_any:
00054     case CORBA::tk_TypeCode:
00055     case CORBA::tk_objref:
00056     case CORBA::tk_string:
00057     case CORBA::tk_wstring:
00058     case CORBA::tk_longdouble:
00059       break;
00060     case CORBA::tk_sequence:
00061       if (tc == CORBA::_tc_BooleanSeq
00062           || tc == CORBA::_tc_OctetSeq
00063           || tc == CORBA::_tc_CharSeq
00064           || tc == CORBA::_tc_WCharSeq
00065           || tc == CORBA::_tc_ShortSeq
00066           || tc == CORBA::_tc_UShortSeq
00067           || tc == CORBA::_tc_LongSeq
00068           || tc == CORBA::_tc_ULongSeq
00069           || tc == CORBA::_tc_LongLongSeq
00070           || tc == CORBA::_tc_ULongLongSeq
00071           || tc == CORBA::_tc_FloatSeq
00072           || tc == CORBA::_tc_DoubleSeq
00073           || tc == CORBA::_tc_LongDoubleSeq)
00074         {
00075           // Otherwise fall through.
00076           break;
00077         }
00078     default:
00079       throw DynamicAny::DynAnyFactory::InconsistentTypeCode ();
00080   }
00081 }

DynamicAny::DynAny_ptr TAO_DynAny_i::current_component ( void   )  [virtual]

Definition at line 512 of file DynAny_i.cpp.

00513 {
00514   if (this->destroyed_)
00515     {
00516       throw ::CORBA::OBJECT_NOT_EXIST ();
00517     }
00518 
00519   throw DynamicAny::DynAny::TypeMismatch ();
00520 }

void TAO_DynAny_i::destroy ( void   )  [virtual]

Definition at line 497 of file DynAny_i.cpp.

References TAO_DynCommon::destroyed_.

00498 {
00499   if (this->destroyed_)
00500     {
00501       throw ::CORBA::OBJECT_NOT_EXIST ();
00502     }
00503 
00504   if (!this->ref_to_component_ || this->container_is_destroying_)
00505     {
00506       this->destroyed_ = 1;
00507     }
00508 }

CORBA::Boolean TAO_DynAny_i::equal ( DynamicAny::DynAny_ptr  dyn_any  )  [virtual]

Definition at line 255 of file DynAny_i.cpp.

References CORBA::Object::_is_equivalent(), _narrow(), TAO_DynCommon::any_, TAO_Pseudo_Var_T< T >::in(), ACE_OS::strcmp(), TAO_DynAnyFactory::strip_alias(), CORBA::tk_any, CORBA::tk_boolean, CORBA::tk_char, CORBA::tk_double, CORBA::tk_float, CORBA::tk_long, CORBA::tk_longlong, CORBA::tk_null, CORBA::tk_objref, CORBA::tk_octet, CORBA::tk_short, CORBA::tk_string, CORBA::tk_TypeCode, CORBA::tk_ulong, CORBA::tk_ulonglong, CORBA::tk_ushort, CORBA::tk_void, CORBA::tk_wchar, CORBA::tk_wstring, TAO_DynCommon::type_, TAO_DynAnyFactory::unalias(), and ACE_OS::wscmp().

00256 {
00257   if (this->destroyed_)
00258     {
00259       throw ::CORBA::OBJECT_NOT_EXIST ();
00260     }
00261 
00262   TAO_DynAny_i *rhs_n = TAO_DynAny_i::_narrow (rhs);
00263 
00264   if (rhs_n == 0)
00265     {
00266       return false;
00267     }
00268 
00269   if (!this->type_->equivalent (rhs_n->type_.in ()))
00270     {
00271       return false;
00272     }
00273 
00274   CORBA::TCKind tk = TAO_DynAnyFactory::unalias (this->type_.in ());
00275 
00276   switch (tk)
00277     {
00278     case CORBA::tk_null:
00279     case CORBA::tk_void:
00280       return true;
00281     case CORBA::tk_short:
00282       {
00283         CORBA::Short rhs_v;
00284         rhs_n->any_ >>= rhs_v;
00285         CORBA::Short lhs_v;
00286         this->any_ >>= lhs_v;
00287         return (lhs_v == rhs_v);
00288       }
00289     case CORBA::tk_long:
00290       {
00291         CORBA::Long rhs_v;
00292         rhs_n->any_ >>= rhs_v;
00293         CORBA::Long lhs_v;
00294         this->any_ >>= lhs_v;
00295         return (lhs_v == rhs_v);
00296       }
00297     case CORBA::tk_ushort:
00298       {
00299         CORBA::UShort rhs_v;
00300         rhs_n->any_ >>= rhs_v;
00301         CORBA::UShort lhs_v;
00302         this->any_ >>= lhs_v;
00303         return (lhs_v == rhs_v);
00304       }
00305     case CORBA::tk_ulong:
00306       {
00307         CORBA::ULong rhs_v;
00308         rhs_n->any_ >>= rhs_v;
00309         CORBA::ULong lhs_v;
00310         this->any_ >>= lhs_v;
00311         return (lhs_v == rhs_v);
00312       }
00313     case CORBA::tk_float:
00314       {
00315         CORBA::Float rhs_v;
00316         rhs_n->any_ >>= rhs_v;
00317         CORBA::Float lhs_v;
00318         this->any_ >>= lhs_v;
00319         return (lhs_v == rhs_v);
00320       }
00321     case CORBA::tk_double:
00322       {
00323         CORBA::Double rhs_v;
00324         rhs_n->any_ >>= rhs_v;
00325         CORBA::Double lhs_v;
00326         this->any_ >>= lhs_v;
00327         return (lhs_v == rhs_v);
00328       }
00329     case CORBA::tk_longlong:
00330       {
00331         CORBA::LongLong rhs_v;
00332         rhs_n->any_ >>= rhs_v;
00333         CORBA::LongLong lhs_v;
00334         this->any_ >>= lhs_v;
00335         return (lhs_v == rhs_v);
00336       }
00337     case CORBA::tk_ulonglong:
00338       {
00339         CORBA::ULongLong rhs_v;
00340         rhs_n->any_ >>= rhs_v;
00341         CORBA::ULongLong lhs_v;
00342         this->any_ >>= lhs_v;
00343         return (lhs_v == rhs_v);
00344       }
00345     case CORBA::tk_boolean:
00346       {
00347         CORBA::Boolean rhs_v;
00348         rhs_n->any_ >>= CORBA::Any::to_boolean (rhs_v);
00349         CORBA::Boolean lhs_v;
00350         this->any_ >>= CORBA::Any::to_boolean (lhs_v);
00351         return (lhs_v == rhs_v);
00352       }
00353     case CORBA::tk_char:
00354       {
00355         CORBA::Char rhs_v;
00356         rhs_n->any_ >>= CORBA::Any::to_char (rhs_v);
00357         CORBA::Char lhs_v;
00358         this->any_ >>= CORBA::Any::to_char (lhs_v);
00359         return (lhs_v == rhs_v);
00360       }
00361     case CORBA::tk_wchar:
00362       {
00363         CORBA::WChar rhs_v;
00364         rhs_n->any_ >>= CORBA::Any::to_wchar (rhs_v);
00365         CORBA::WChar lhs_v;
00366         this->any_ >>= CORBA::Any::to_wchar (lhs_v);
00367         return (lhs_v == rhs_v);
00368       }
00369     case CORBA::tk_octet:
00370       {
00371         CORBA::Octet rhs_v;
00372         rhs_n->any_ >>= CORBA::Any::to_octet (rhs_v);
00373         CORBA::Octet lhs_v;
00374         this->any_ >>= CORBA::Any::to_octet (lhs_v);
00375         return (lhs_v == rhs_v);
00376       }
00377     case CORBA::tk_any:
00378       {
00379         const CORBA::Any *rhs_v;
00380         rhs_n->any_ >>= rhs_v;
00381         const CORBA::Any *lhs_v;
00382         this->any_ >>= lhs_v;
00383 
00384         DynamicAny::DynAny_var rhs_dyn =
00385           TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
00386             rhs_v->_tao_get_typecode (),
00387             *rhs_v);
00388 
00389         DynamicAny::DynAny_var lhs_dyn =
00390           TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
00391             lhs_v->_tao_get_typecode (),
00392             *lhs_v);
00393 
00394         CORBA::Boolean const b = rhs_dyn->equal (lhs_dyn.in ());
00395 
00396         rhs_dyn->destroy ();
00397 
00398         lhs_dyn->destroy ();
00399 
00400         return b;
00401       }
00402     case CORBA::tk_TypeCode:
00403       {
00404         CORBA::TypeCode_ptr rhs_v;
00405         rhs_n->any_ >>= rhs_v;
00406         CORBA::TypeCode_ptr lhs_v;
00407         this->any_ >>= lhs_v;
00408         // See CORBA 2.4.2 - must use equal() here.
00409         return lhs_v->equal (lhs_v);
00410       }
00411     case CORBA::tk_objref:
00412       {
00413         CORBA::Object_ptr rhs_v;
00414         rhs_n->any_ >>= CORBA::Any::to_object (rhs_v);
00415         CORBA::Object_ptr lhs_v;
00416         this->any_ >>= CORBA::Any::to_object (lhs_v);
00417         return lhs_v->_is_equivalent (lhs_v);
00418       }
00419     case CORBA::tk_string:
00420       {
00421         CORBA::TypeCode_var unaliased_tc =
00422           TAO_DynAnyFactory::strip_alias (this->type_.in ());
00423 
00424         CORBA::ULong bound =
00425           unaliased_tc->length ();
00426 
00427         const char *rhs_v, *lhs_v;
00428         CORBA::Boolean rstatus, lstatus;
00429 
00430         if (bound == 0)
00431           {
00432             rstatus = rhs_n->any_ >>= rhs_v;
00433             lstatus = this->any_ >>= lhs_v;
00434 
00435             if ((rstatus && lstatus) == 0)
00436               {
00437                 return 0;
00438               }
00439           }
00440         else
00441           {
00442             rstatus = rhs_n->any_ >>= CORBA::Any::to_string (rhs_v, bound);
00443             lstatus = this->any_ >>= CORBA::Any::to_string (lhs_v, bound);
00444 
00445             if ((rstatus && lstatus) == 0)
00446               {
00447                 return 0;
00448               }
00449           }
00450 
00451         return ACE_OS::strcmp (rhs_v, lhs_v) == 0;
00452       }
00453     case CORBA::tk_wstring:
00454       {
00455         CORBA::TypeCode_var unaliased_tc =
00456           TAO_DynAnyFactory::strip_alias (this->type_.in ());
00457 
00458         CORBA::ULong bound =
00459           unaliased_tc->length ();
00460 
00461         const CORBA::WChar *rhs_v, *lhs_v;
00462         CORBA::Boolean rstatus, lstatus;
00463 
00464         if (bound == 0)
00465           {
00466             rstatus = rhs_n->any_ >>= rhs_v;
00467             lstatus = this->any_ >>= lhs_v;
00468 
00469             if ((rstatus && lstatus) == 0)
00470               {
00471                 return 0;
00472               }
00473           }
00474         else
00475           {
00476             rstatus = rhs_n->any_ >>= CORBA::Any::to_wstring (rhs_v,
00477                                                               bound);
00478             lstatus = this->any_ >>= CORBA::Any::to_wstring (lhs_v,
00479                                                              bound);
00480 
00481             if ((rstatus && lstatus) == 0)
00482               {
00483                 return 0;
00484               }
00485           }
00486 
00487         return ACE_OS::wscmp (rhs_v, lhs_v) == 0;
00488       }
00489     default:
00490       break; // Cannot happen...
00491     }
00492 
00493   return 0;
00494 }

void TAO_DynAny_i::from_any ( const CORBA::Any &  value  )  [virtual]

Definition at line 216 of file DynAny_i.cpp.

References TAO_DynCommon::any_, and TAO_Pseudo_Var_T< T >::in().

00217 {
00218   if (this->destroyed_)
00219     {
00220       throw ::CORBA::OBJECT_NOT_EXIST ();
00221     }
00222 
00223   CORBA::TypeCode_var any_tc = any.type ();
00224 
00225   if (!this->type_->equivalent (any_tc.in ()))
00226     {
00227       throw DynamicAny::DynAny::TypeMismatch ();
00228     }
00229 
00230 // @@@ (JP) Spec also says we should check for illegal Any
00231 // value here, and throw InvalidValue if we find one.
00232 // Something like a null string will be caught in the constructor.
00233 
00234   this->any_ = any;
00235 }

void TAO_DynAny_i::init ( const CORBA::Any &  any  ) 

Initialize using an Any.

Definition at line 190 of file DynAny_i.cpp.

References TAO_DynCommon::any_, check_typecode(), init_common(), and TAO_DynCommon::type_.

00191 {
00192   this->type_ = any.type ();
00193   this->check_typecode (this->type_.in ());
00194 
00195   this->init_common ();
00196 
00197   this->any_ = any;
00198 }

void TAO_DynAny_i::init ( CORBA::TypeCode_ptr  tc  ) 

Initialize using just a TypeCode.

Definition at line 178 of file DynAny_i.cpp.

References check_typecode(), init_common(), set_to_default_value(), and TAO_DynCommon::type_.

00179 {
00180   this->check_typecode (tc);
00181 
00182   this->set_to_default_value (tc);
00183 
00184   this->init_common ();
00185 
00186   this->type_ = CORBA::TypeCode::_duplicate (tc);
00187 }

void TAO_DynAny_i::init_common ( void   )  [private]

Called by both versions of init().

Definition at line 167 of file DynAny_i.cpp.

References TAO_DynCommon::component_count_, TAO_DynCommon::container_is_destroying_, TAO_DynCommon::current_position_, TAO_DynCommon::destroyed_, TAO_DynCommon::has_components_, and TAO_DynCommon::ref_to_component_.

Referenced by init().

00168 {
00169   this->ref_to_component_ = false;
00170   this->container_is_destroying_ = false;
00171   this->has_components_ = false;
00172   this->destroyed_ = false;
00173   this->current_position_ = -1;
00174   this->component_count_ = 0;
00175 }

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.

References CORBA::Object::_nil(), ACE_NEW, TAO_DynCommon::any_, CORBA::tk_any, CORBA::tk_boolean, CORBA::tk_char, CORBA::tk_double, CORBA::tk_float, CORBA::tk_long, CORBA::tk_longlong, CORBA::tk_null, CORBA::tk_objref, CORBA::tk_octet, CORBA::tk_short, CORBA::tk_string, CORBA::tk_TypeCode, CORBA::tk_ulong, CORBA::tk_ulonglong, CORBA::tk_ushort, CORBA::tk_void, CORBA::tk_wchar, CORBA::tk_wstring, and TAO_DynAnyFactory::unalias().

Referenced by init().

00085 {
00086   CORBA::TCKind tk = TAO_DynAnyFactory::unalias (tc);
00087 
00088   switch (tk)
00089   {
00090     case CORBA::tk_null:
00091       break;
00092     case CORBA::tk_void:
00093       this->any_._tao_set_typecode (CORBA::_tc_void);
00094       break;
00095     case CORBA::tk_short:
00096       this->any_ <<= static_cast<CORBA::Short> (0);
00097       break;
00098     case CORBA::tk_long:
00099       this->any_ <<= static_cast<CORBA::Long> (0);
00100       break;
00101     case CORBA::tk_ushort:
00102       this->any_ <<= static_cast<CORBA::UShort> (0);
00103       break;
00104     case CORBA::tk_ulong:
00105       this->any_ <<= static_cast<CORBA::ULong> (0);
00106       break;
00107 #if !defined (ACE_LACKS_LONGLONG_T)
00108     case CORBA::tk_longlong:
00109       this->any_ <<= static_cast<CORBA::LongLong> (0);
00110       break;
00111     case CORBA::tk_ulonglong:
00112       this->any_ <<= static_cast<CORBA::ULongLong> (0);
00113       break;
00114 #endif /* ACE_LACKS_LONGLONG_T */
00115     case CORBA::tk_boolean:
00116       this->any_ <<= CORBA::Any::from_boolean (0);
00117       break;
00118     case CORBA::tk_octet:
00119       this->any_ <<= CORBA::Any::from_octet (0);
00120       break;
00121     case CORBA::tk_char:
00122       this->any_ <<= CORBA::Any::from_char (0);
00123       break;
00124     case CORBA::tk_wchar:
00125       this->any_ <<= CORBA::Any::from_wchar (0);
00126       break;
00127     case CORBA::tk_float:
00128       this->any_ <<= static_cast<CORBA::Float> (0);
00129       break;
00130     case CORBA::tk_double:
00131       this->any_ <<= static_cast<CORBA::Double> (0);
00132       break;
00133     case CORBA::tk_any:
00134       this->any_._tao_set_typecode (CORBA::_tc_null);
00135       break;
00136     case CORBA::tk_TypeCode:
00137       this->any_ <<= CORBA::_tc_null;
00138       break;
00139     case CORBA::tk_objref:
00140       {
00141         TAO_OutputCDR stream;
00142         stream << CORBA::Object::_nil ();
00143         TAO_InputCDR in (stream);
00144         TAO::Unknown_IDL_Type *unk = 0;
00145         ACE_NEW (unk,
00146                  TAO::Unknown_IDL_Type (tc, in));
00147         this->any_.replace (unk);
00148         break;
00149       }
00150     case CORBA::tk_string:
00151       this->any_ <<= "";
00152       break;
00153     case CORBA::tk_wstring:
00154       {
00155         CORBA::WChar wstr[1];
00156         wstr[0] = 0;
00157         this->any_ <<= wstr;
00158         break;
00159       }
00160     default:
00161       // Should never get here - check_typecode() has already been called.
00162       break;
00163   }
00164 }

CORBA::Any_ptr TAO_DynAny_i::to_any ( void   )  [virtual]

Definition at line 238 of file DynAny_i.cpp.

References ACE_NEW_THROW_EX.

00239 {
00240   if (this->destroyed_)
00241     {
00242       throw ::CORBA::OBJECT_NOT_EXIST ();
00243     }
00244 
00245   CORBA::Any_ptr retval;
00246 
00247   ACE_NEW_THROW_EX (retval,
00248                     CORBA::Any (this->any_),
00249                     CORBA::NO_MEMORY ());
00250 
00251   return retval;
00252 }


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:43:14 2010 for TAO_DynamicAny by  doxygen 1.4.7