DynCommon.cpp

Go to the documentation of this file.
00001 // $Id: DynCommon.cpp 78012 2007-04-13 19:56:11Z dai_y $
00002 
00003 #include "tao/DynamicAny/DynCommon.h"
00004 
00005 #include "tao/DynamicAny/DynAnyFactory.h"
00006 #include "tao/DynamicAny/DynAny_i.h"
00007 #include "tao/DynamicAny/DynArray_i.h"
00008 #include "tao/DynamicAny/DynEnum_i.h"
00009 #include "tao/DynamicAny/DynSequence_i.h"
00010 #include "tao/DynamicAny/DynStruct_i.h"
00011 #include "tao/DynamicAny/DynUnion_i.h"
00012 #include "tao/DynamicAny/DynAnyUtils_T.h"
00013 
00014 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00015 #include "tao/AnyTypeCode/AnyTypeCode_methods.h"
00016 
00017 #include "tao/CDR.h"
00018 
00019 #include "ace/OS_NS_wchar.h"
00020 #include "ace/OS_NS_string.h"
00021 
00022 ACE_RCSID (DynamicAny,
00023            DynCommon,
00024            "$Id: DynCommon.cpp 78012 2007-04-13 19:56:11Z dai_y $")
00025 
00026 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00027 
00028 TAO_DynCommon::TAO_DynCommon (void)
00029 {
00030 }
00031 
00032 TAO_DynCommon::~TAO_DynCommon (void)
00033 {
00034 }
00035 
00036 CORBA::TypeCode_ptr
00037 TAO_DynCommon::type (void)
00038 {
00039   if (this->destroyed_)
00040     {
00041       throw ::CORBA::OBJECT_NOT_EXIST ();
00042     }
00043 
00044   return CORBA::TypeCode::_duplicate (this->type_.in ());
00045 }
00046 
00047 void
00048 TAO_DynCommon::assign (DynamicAny::DynAny_ptr dyn_any)
00049 {
00050   if (this->destroyed_)
00051     {
00052       throw ::CORBA::OBJECT_NOT_EXIST ();
00053     }
00054 
00055   CORBA::TypeCode_var tc = dyn_any->type ();
00056 
00057   CORBA::Boolean const equivalent = this->type_.in ()->equivalent (tc.in ());
00058 
00059   if (equivalent)
00060     {
00061       CORBA::Any_var any = dyn_any->to_any ();
00062 
00063       this->from_any (any.in ());
00064     }
00065   else
00066     {
00067       throw DynamicAny::DynAny::TypeMismatch ();
00068     }
00069 }
00070 
00071 void
00072 TAO_DynCommon::insert_boolean (CORBA::Boolean value)
00073 {
00074   TAO::DynAnyBasicTypeUtils<CORBA::Boolean>::insert_value (value, this);
00075 }
00076 
00077 void
00078 TAO_DynCommon::insert_octet (CORBA::Octet value)
00079 {
00080   TAO::DynAnyBasicTypeUtils<CORBA::Octet>::insert_value (value, this);
00081 }
00082 
00083 void
00084 TAO_DynCommon::insert_char (CORBA::Char value)
00085 {
00086   TAO::DynAnyBasicTypeUtils<CORBA::Char>::insert_value (value, this);
00087 }
00088 
00089 void
00090 TAO_DynCommon::insert_short (CORBA::Short value)
00091 {
00092   TAO::DynAnyBasicTypeUtils<CORBA::Short>::insert_value (value, this);
00093 }
00094 
00095 void
00096 TAO_DynCommon::insert_ushort (CORBA::UShort value)
00097 {
00098   TAO::DynAnyBasicTypeUtils<CORBA::UShort>::insert_value (value, this);
00099 }
00100 
00101 void
00102 TAO_DynCommon::insert_long (CORBA::Long value)
00103 {
00104   TAO::DynAnyBasicTypeUtils<CORBA::Long>::insert_value (value, this);
00105 }
00106 
00107 void
00108 TAO_DynCommon::insert_ulong (CORBA::ULong value)
00109 {
00110   TAO::DynAnyBasicTypeUtils<CORBA::ULong>::insert_value (value, this);
00111 }
00112 
00113 void
00114 TAO_DynCommon::insert_float (CORBA::Float value)
00115 {
00116   TAO::DynAnyBasicTypeUtils<CORBA::Float>::insert_value (value, this);
00117 }
00118 
00119 void
00120 TAO_DynCommon::insert_double (CORBA::Double value)
00121 {
00122   TAO::DynAnyBasicTypeUtils<CORBA::Double>::insert_value (value, this);
00123 }
00124 
00125 void
00126 TAO_DynCommon::insert_string (const char * value)
00127 {
00128   if (this->destroyed_)
00129     {
00130       throw ::CORBA::OBJECT_NOT_EXIST ();
00131     }
00132 
00133   if (this->has_components_)
00134     {
00135       DynamicAny::DynAny_var cc =
00136         this->check_component ();
00137 
00138       cc->insert_string (value);
00139     }
00140   else
00141     {
00142       CORBA::TypeCode_var unaliased_tc =
00143         TAO_DynAnyFactory::strip_alias (this->type_.in ());
00144 
00145       CORBA::TCKind const kind =
00146         unaliased_tc->kind ();
00147 
00148       if (kind != CORBA::tk_string)
00149         {
00150           throw DynamicAny::DynAny::TypeMismatch ();
00151         }
00152 
00153       CORBA::ULong const bound =
00154         unaliased_tc->length ();
00155 
00156       if (bound > 0 && bound < ACE_OS::strlen (value))
00157         {
00158           throw DynamicAny::DynAny::InvalidValue ();
00159         }
00160 
00161       this->any_ <<= CORBA::Any::from_string (const_cast<char *> (value),
00162                                               bound);
00163     }
00164 }
00165 
00166 void
00167 TAO_DynCommon::insert_reference (CORBA::Object_ptr value)
00168 {
00169   if (this->destroyed_)
00170     {
00171       throw ::CORBA::OBJECT_NOT_EXIST ();
00172     }
00173 
00174   if (this->has_components_)
00175     {
00176       DynamicAny::DynAny_var cc =
00177         this->check_component ();
00178 
00179       cc->insert_reference (value);
00180     }
00181   else
00182     {
00183       CORBA::Boolean good_type = true;
00184       CORBA::TCKind const kind =
00185         TAO_DynAnyFactory::unalias (this->type_.in ());
00186 
00187       if (kind != CORBA::tk_objref)
00188         {
00189           good_type = false;
00190         }
00191       else if (!CORBA::is_nil (value))
00192         {
00193           const char *value_id = value->_interface_repository_id ();
00194 
00195           if (ACE_OS::strcmp (value_id, "IDL:omg.org/CORBA/Object:1.0") != 0)
00196             {
00197               const char *my_id =
00198                 this->type_->id ();
00199 
00200               if (ACE_OS::strcmp (value_id, my_id) != 0)
00201                 {
00202                   good_type = value->_is_a (my_id);
00203                 }
00204             }
00205         }
00206 
00207       if (good_type)
00208         {
00209           TAO_OutputCDR cdr;
00210 
00211           if (CORBA::is_nil (value))
00212             {
00213               // Empty type hint, no profile.
00214               cdr.write_ulong (1);
00215               cdr.write_char ('\0');
00216               cdr.write_ulong (0);
00217             }
00218           else
00219             {
00220               if (!value->marshal (cdr))
00221                 {
00222                   throw DynamicAny::DynAny::InvalidValue ();
00223                 }
00224             }
00225 
00226           TAO_InputCDR in (cdr);
00227           TAO::Unknown_IDL_Type *unk = 0;
00228           ACE_NEW (unk,
00229                    TAO::Unknown_IDL_Type (this->type_.in (),
00230                                           in));
00231           this->any_.replace (unk);
00232         }
00233       else
00234         {
00235           throw DynamicAny::DynAny::TypeMismatch ();
00236         }
00237     }
00238 }
00239 
00240 void
00241 TAO_DynCommon::insert_typecode (CORBA::TypeCode_ptr value)
00242 {
00243   TAO::DynAnyBasicTypeUtils<CORBA::TypeCode_ptr>::insert_value (value, this);
00244 }
00245 
00246 void
00247 TAO_DynCommon::insert_longlong (CORBA::LongLong value)
00248 {
00249   TAO::DynAnyBasicTypeUtils<CORBA::LongLong>::insert_value (value, this);
00250 }
00251 
00252 void
00253 TAO_DynCommon::insert_ulonglong (CORBA::ULongLong value)
00254 {
00255   TAO::DynAnyBasicTypeUtils<CORBA::ULongLong>::insert_value (value, this);
00256 }
00257 
00258 void
00259 TAO_DynCommon::insert_longdouble (CORBA::LongDouble value)
00260 {
00261   TAO::DynAnyBasicTypeUtils<CORBA::LongDouble>::insert_value (value,
00262                                                               this);
00263 }
00264 
00265 void
00266 TAO_DynCommon::insert_wchar (CORBA::WChar value)
00267 {
00268   TAO::DynAnyBasicTypeUtils<CORBA::WChar>::insert_value (value,
00269                                                          this);
00270 }
00271 
00272 void
00273 TAO_DynCommon::insert_wstring (const CORBA::WChar * value)
00274 {
00275   if (this->destroyed_)
00276     {
00277       throw ::CORBA::OBJECT_NOT_EXIST ();
00278     }
00279 
00280   if (this->has_components_)
00281     {
00282       DynamicAny::DynAny_var cc =
00283         this->check_component ();
00284 
00285       cc->insert_wstring (value);
00286     }
00287   else
00288     {
00289       CORBA::TypeCode_var unaliased_tc =
00290         this->check_type_and_unalias (CORBA::_tc_wstring);
00291 
00292       CORBA::ULong const bound = unaliased_tc->length ();
00293 
00294       if (bound > 0 && bound < ACE_OS::wslen (value))
00295         {
00296           throw DynamicAny::DynAny::InvalidValue ();
00297         }
00298 
00299       this->any_ <<= CORBA::Any::from_wstring (const_cast<CORBA::WChar *> (value),
00300                                                bound);
00301     }
00302 }
00303 
00304 void
00305 TAO_DynCommon::insert_any (const CORBA::Any &value)
00306 {
00307   TAO::DynAnyBasicTypeUtils<CORBA::Any>::insert_value (value,
00308                                                        this);
00309 }
00310 
00311 // @@@ (JP) TODO - optimize - this version was intended by the OMG to
00312 // have fewer Any/DynAny conversions than insert_any, not more.
00313 void
00314 TAO_DynCommon::insert_dyn_any (DynamicAny::DynAny_ptr value)
00315 {
00316   if (this->destroyed_)
00317     {
00318       throw ::CORBA::OBJECT_NOT_EXIST ();
00319     }
00320 
00321   CORBA::Any_var any = value->to_any ();
00322 
00323   this->insert_any (any.in ());
00324 }
00325 
00326 void
00327 TAO_DynCommon::insert_val (CORBA::ValueBase *value)
00328 {
00329   if (this->destroyed_)
00330     {
00331       throw ::CORBA::OBJECT_NOT_EXIST ();
00332     }
00333 
00334   if (this->has_components_)
00335     {
00336       DynamicAny::DynAny_var cc =
00337         this->check_component ();
00338 
00339       cc->insert_val (value);
00340     }
00341   else
00342     {
00343       CORBA::TCKind kind =
00344         TAO_DynAnyFactory::unalias (this->type_.in ());
00345 
00346       if (kind != CORBA::tk_value)
00347         {
00348           throw DynamicAny::DynAny::TypeMismatch ();
00349         }
00350 
00351       // If the arg is 0 we can't do this kind of type checking,
00352       // and the call to _tao_marshal() below will handle the
00353       // null value correctly.
00354       if (value != 0)
00355         {
00356           const char *value_id = value->_tao_obv_repository_id ();
00357           const char *my_id =
00358             this->type_->id ();
00359 
00360           // Valuetypes, unlike interfaces, don't have a virtual
00361           // method to check for a more derived type when the
00362           // repo ids don't match. Valuetypes have only
00363           // a static _downcast() method, which can't be used
00364           // here, so if the repo ids don't match, we're hosed.
00365           if (ACE_OS::strcmp (value_id, my_id) != 0)
00366             {
00367               throw DynamicAny::DynAny::TypeMismatch ();
00368             }
00369         }
00370 
00371       // This will handle null values correctly, or otherwise
00372       // make a virtual call to marshal the state.
00373       TAO_OutputCDR out;
00374       CORBA::Boolean const good_insert =
00375         CORBA::ValueBase::_tao_marshal (out, value);
00376 
00377       if (!good_insert)
00378         {
00379           throw DynamicAny::DynAny::InvalidValue ();
00380         }
00381 
00382       TAO_InputCDR in (out);
00383       TAO::Unknown_IDL_Type *unk = 0;
00384       ACE_NEW (unk,
00385                TAO::Unknown_IDL_Type (this->type_.in (), in));
00386       this->any_.replace (unk);
00387     }
00388 }
00389 
00390 // ****************************************************************
00391 
00392 CORBA::Boolean
00393 TAO_DynCommon::get_boolean (void)
00394 {
00395   return TAO::DynAnyBasicTypeUtils<CORBA::Boolean>::get_value (this);
00396 }
00397 
00398 CORBA::Octet
00399 TAO_DynCommon::get_octet (void)
00400 {
00401   return TAO::DynAnyBasicTypeUtils<CORBA::Octet>::get_value (this);
00402 }
00403 
00404 CORBA::Char
00405 TAO_DynCommon::get_char (void)
00406 {
00407   return TAO::DynAnyBasicTypeUtils<CORBA::Char>::get_value (this);
00408 }
00409 
00410 CORBA::Short
00411 TAO_DynCommon::get_short (void)
00412 {
00413   return TAO::DynAnyBasicTypeUtils<CORBA::Short>::get_value (this);
00414 }
00415 
00416 CORBA::UShort
00417 TAO_DynCommon::get_ushort (void)
00418 {
00419   return TAO::DynAnyBasicTypeUtils<CORBA::UShort>::get_value (this);
00420 }
00421 
00422 CORBA::Long
00423 TAO_DynCommon::get_long (void)
00424 {
00425   return TAO::DynAnyBasicTypeUtils<CORBA::Long>::get_value (this);
00426 }
00427 
00428 CORBA::ULong
00429 TAO_DynCommon::get_ulong (void)
00430 {
00431   return TAO::DynAnyBasicTypeUtils<CORBA::ULong>::get_value (this);
00432 }
00433 
00434 CORBA::Float
00435 TAO_DynCommon::get_float (void)
00436 {
00437   return TAO::DynAnyBasicTypeUtils<CORBA::Float>::get_value (this);
00438 }
00439 
00440 CORBA::Double
00441 TAO_DynCommon::get_double (void)
00442 {
00443   return TAO::DynAnyBasicTypeUtils<CORBA::Double>::get_value (this);
00444 }
00445 
00446 char *
00447 TAO_DynCommon::get_string (void)
00448 {
00449   if (this->destroyed_)
00450     {
00451       throw ::CORBA::OBJECT_NOT_EXIST ();
00452     }
00453 
00454   if (this->has_components_)
00455     {
00456       DynamicAny::DynAny_var cc =
00457         this->check_component ();
00458 
00459       return cc->get_string ();
00460     }
00461   else
00462     {
00463       CORBA::TypeCode_var unaliased_tc =
00464         TAO_DynAnyFactory::strip_alias (this->type_.in ());
00465 
00466       CORBA::TCKind kind =
00467         unaliased_tc->kind ();
00468 
00469       if (kind != CORBA::tk_string)
00470         {
00471           throw DynamicAny::DynAny::TypeMismatch ();
00472         }
00473 
00474       char *retval = 0;
00475 
00476       CORBA::ULong const bound =
00477         unaliased_tc->length ();
00478 
00479       // We will have caught a type mismatch above, so if this fails,
00480       // it must be for some other reason.
00481       if ((this->any_ >>= CORBA::Any::to_string (retval, bound)) == 0)
00482         {
00483           throw DynamicAny::DynAny::InvalidValue ();
00484         }
00485 
00486       return CORBA::string_dup (retval);
00487     }
00488 }
00489 
00490 CORBA::Object_ptr
00491 TAO_DynCommon::get_reference (void)
00492 {
00493   if (this->destroyed_)
00494     {
00495       throw ::CORBA::OBJECT_NOT_EXIST ();
00496     }
00497 
00498   if (this->has_components_)
00499     {
00500       DynamicAny::DynAny_var cc =
00501         this->check_component ();
00502 
00503       return cc->get_reference ();
00504     }
00505   else
00506     {
00507       CORBA::Object_var retval;
00508 
00509       if ((this->any_ >>= CORBA::Any::to_object (retval.inout ())) == 0)
00510         {
00511           throw DynamicAny::DynAny::TypeMismatch ();
00512         }
00513 
00514       return retval._retn ();
00515     }
00516 }
00517 
00518 CORBA::TypeCode_ptr
00519 TAO_DynCommon::get_typecode (void)
00520 {
00521   if (this->destroyed_)
00522     {
00523       throw ::CORBA::OBJECT_NOT_EXIST ();
00524     }
00525 
00526   if (this->has_components_)
00527     {
00528       DynamicAny::DynAny_var cc = this->check_component ();
00529 
00530       return cc->get_typecode ();
00531     }
00532   else
00533     {
00534       CORBA::TypeCode_ptr retval;
00535 
00536       if ((this->any_ >>= retval) == 0)
00537         {
00538           throw DynamicAny::DynAny::TypeMismatch ();
00539         }
00540 
00541       return CORBA::TypeCode::_duplicate (retval);
00542     }
00543 }
00544 
00545 CORBA::LongLong
00546 TAO_DynCommon::get_longlong (void)
00547 {
00548   return TAO::DynAnyBasicTypeUtils<CORBA::LongLong>::get_value (this);
00549 }
00550 
00551 CORBA::ULongLong
00552 TAO_DynCommon::get_ulonglong (void)
00553 {
00554   return TAO::DynAnyBasicTypeUtils<CORBA::ULongLong>::get_value (this);
00555 }
00556 
00557 CORBA::LongDouble
00558 TAO_DynCommon::get_longdouble (void)
00559 {
00560   return TAO::DynAnyBasicTypeUtils<CORBA::LongDouble>::get_value (this);
00561 }
00562 
00563 CORBA::WChar
00564 TAO_DynCommon::get_wchar (void)
00565 {
00566   if (this->destroyed_)
00567     {
00568       throw ::CORBA::OBJECT_NOT_EXIST ();
00569     }
00570 
00571   if (this->has_components_)
00572     {
00573       DynamicAny::DynAny_var cc = this->check_component ();
00574 
00575       return cc->get_wchar ();
00576     }
00577   else
00578     {
00579       CORBA::WChar retval;
00580 
00581       if ((this->any_ >>= CORBA::Any::to_wchar (retval)) == 0)
00582         {
00583           throw DynamicAny::DynAny::TypeMismatch ();
00584         }
00585 
00586       return retval;
00587     }
00588 }
00589 
00590 CORBA::WChar *
00591 TAO_DynCommon::get_wstring (void)
00592 {
00593   if (this->destroyed_)
00594     {
00595       throw ::CORBA::OBJECT_NOT_EXIST ();
00596     }
00597 
00598   if (this->has_components_)
00599     {
00600       DynamicAny::DynAny_var cc =
00601         this->check_component ();
00602 
00603       return cc->get_wstring ();
00604     }
00605   else
00606     {
00607       // @@@ (JP) Someday try to find a way to avoid checking for
00608       // type code equivalence twice without risking a throw of
00609       // BadKind.
00610       CORBA::TypeCode_var unaliased_tc =
00611         this->check_type_and_unalias (CORBA::_tc_wstring);
00612 
00613       CORBA::WChar *retval = 0;
00614 
00615       CORBA::ULong bound =
00616         unaliased_tc->length ();
00617 
00618       (void) (this->any_ >>= CORBA::Any::to_wstring (retval, bound));
00619 
00620       return CORBA::wstring_dup (retval);
00621     }
00622 }
00623 
00624 CORBA::Any_ptr
00625 TAO_DynCommon::get_any (void)
00626 {
00627   if (this->destroyed_)
00628     {
00629       throw ::CORBA::OBJECT_NOT_EXIST ();
00630     }
00631 
00632   if (this->has_components_)
00633     {
00634       DynamicAny::DynAny_var cc =
00635         this->check_component ();
00636 
00637       return cc->get_any ();
00638     }
00639   else
00640     {
00641       const CORBA::Any *tmp = 0;
00642 
00643       if ((this->any_ >>= tmp) == 0)
00644         {
00645           throw DynamicAny::DynAny::TypeMismatch ();
00646         }
00647 
00648       CORBA::Any *retval = 0;
00649       ACE_NEW_RETURN (retval,
00650                       CORBA::Any (*tmp),
00651                       0);
00652       return retval;
00653     }
00654 }
00655 
00656 // @@@ (JP) TODO - optimize - this version was intended by the OMG to
00657 // have fewer Any/DynAny conversions than get_any, not more.
00658 DynamicAny::DynAny_ptr
00659 TAO_DynCommon::get_dyn_any (void)
00660 {
00661   if (this->destroyed_)
00662     {
00663       throw ::CORBA::OBJECT_NOT_EXIST ();
00664     }
00665 
00666   CORBA::Any_var any = this->get_any ();
00667 
00668   return
00669     TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
00670       any.in ()._tao_get_typecode (),
00671       any.in ());
00672 }
00673 
00674 CORBA::ValueBase *
00675 TAO_DynCommon::get_val (void)
00676 {
00677   if (this->destroyed_)
00678     {
00679       throw ::CORBA::OBJECT_NOT_EXIST ();
00680     }
00681 
00682   if (this->has_components_)
00683     {
00684       DynamicAny::DynAny_var cc =
00685         this->check_component ();
00686 
00687       return cc->get_val ();
00688     }
00689   else
00690     {
00691       CORBA::TCKind kind =
00692         TAO_DynAnyFactory::unalias (this->type_.in ());
00693 
00694       if (kind != CORBA::tk_value)
00695         {
00696           throw DynamicAny::DynAny::TypeMismatch ();
00697         }
00698 
00699       CORBA::ValueBase_var retval;
00700       TAO::Any_Impl *any_impl = this->any_.impl ();
00701 
00702       if (any_impl == 0)
00703         {
00704           throw DynamicAny::DynAny::InvalidValue ();
00705         }
00706 
00707       // This should always be non-zero for dynamic anys.
00708       TAO::Unknown_IDL_Type *unk =
00709         dynamic_cast<TAO::Unknown_IDL_Type *> (any_impl);
00710 
00711       // Demarshal from a copy so we can retain ownership of our contents.
00712       TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00713 
00714       CORBA::Boolean good_extract =
00715         CORBA::ValueBase::_tao_unmarshal (for_reading,
00716                                           retval.inout ());
00717 
00718       if (!good_extract)
00719         {
00720           throw DynamicAny::DynAny::InvalidValue ();
00721         }
00722 
00723       return retval._retn ();
00724     }
00725 }
00726 
00727 // ****************************************************************
00728 
00729 CORBA::Boolean
00730 TAO_DynCommon::seek (CORBA::Long slot
00731                      )
00732 {
00733   if (this->destroyed_)
00734     {
00735       throw ::CORBA::OBJECT_NOT_EXIST ();
00736     }
00737 
00738   if (this->has_components_ == 0)
00739     {
00740       ACE_UNUSED_ARG (slot);
00741       this->current_position_ = -1;
00742       return false;
00743     }
00744   else if (slot < 0 || slot >= static_cast<CORBA::Long> (this->component_count_))
00745     {
00746       this->current_position_ = -1;
00747       return false;
00748     }
00749   else
00750     {
00751       this->current_position_ = slot;
00752       return true;
00753     }
00754 }
00755 
00756 void
00757 TAO_DynCommon::rewind (void)
00758 {
00759   if (this->destroyed_)
00760     {
00761       throw ::CORBA::OBJECT_NOT_EXIST ();
00762     }
00763 
00764   (void) this->seek (0);
00765 }
00766 
00767 CORBA::Boolean
00768 TAO_DynCommon::next (void)
00769 {
00770   if (this->destroyed_)
00771     {
00772       throw ::CORBA::OBJECT_NOT_EXIST ();
00773     }
00774 
00775   CORBA::Long component_count = static_cast<CORBA::Long> (this->component_count_);
00776 
00777   if (this->has_components_ == 0
00778       || this->current_position_ + 1 >= component_count)
00779     {
00780       this->current_position_ = -1;
00781       return false;
00782     }
00783   else
00784     {
00785       ++this->current_position_;
00786       return true;
00787     }
00788 }
00789 
00790 DynamicAny::DynAny_ptr
00791 TAO_DynCommon::copy (void)
00792 {
00793   if (this->destroyed_)
00794     {
00795       throw ::CORBA::OBJECT_NOT_EXIST ();
00796     }
00797 
00798   CORBA::Any_var any = this->to_any ();
00799 
00800   DynamicAny::DynAny_ptr retval =
00801     TAO::MakeDynAnyUtils::make_dyn_any_t<const CORBA::Any&> (
00802       any.in ()._tao_get_typecode (),
00803       any.in ());
00804 
00805   return retval;
00806 }
00807 
00808 CORBA::ULong
00809 TAO_DynCommon::component_count (void)
00810 {
00811   if (this->destroyed_)
00812     {
00813       throw ::CORBA::OBJECT_NOT_EXIST ();
00814     }
00815 
00816   return this->component_count_;
00817 }
00818 
00819 // ****************************************************************
00820 
00821 void
00822 TAO_DynCommon::insert_abstract (CORBA::AbstractBase_ptr value)
00823 {
00824   if (this->destroyed_)
00825     {
00826       throw ::CORBA::OBJECT_NOT_EXIST ();
00827     }
00828 
00829   if (this->has_components_)
00830     {
00831       DynamicAny::DynAny_var cc =
00832         this->check_component ();
00833 
00834       cc->insert_abstract (value);
00835     }
00836   else
00837     {
00838       CORBA::Boolean good_type = true;
00839       CORBA::TCKind kind =
00840         TAO_DynAnyFactory::unalias (this->type_.in ());
00841 
00842       if (kind != CORBA::tk_abstract_interface)
00843         {
00844           good_type = false;
00845         }
00846       else if (!CORBA::is_nil (value))
00847         {
00848           const char *value_id = value->_interface_repository_id ();
00849           int cmp =
00850             ACE_OS::strcmp (value_id, "IDL:omg.org/CORBA/AbstractBase:1.0");
00851 
00852           if (cmp != 0)
00853             {
00854               const char *my_id =
00855                 this->type_->id ();
00856 
00857               if (ACE_OS::strcmp (value_id, my_id) != 0)
00858                 {
00859                   // If 'value' is an objref, this will be a virtual
00860                   // call. If not, it will just compare to the repo id
00861                   // above, which we already know won't match. We see
00862                   // in insert_val() (see comment there) that there
00863                   // is no way to check for derived valuetypes w/o
00864                   // type knowledge at compile time.
00865                   good_type = value->_is_a (my_id);
00866                 }
00867             }
00868         }
00869 
00870       if (good_type)
00871         {
00872           TAO_OutputCDR out;
00873 
00874           // The CDR insertion operator for AbstractBase handles
00875           // all cases - nil, objref and valuetype - polymorphically.
00876           if (!(out << value))
00877             {
00878               throw DynamicAny::DynAny::InvalidValue ();
00879             }
00880 
00881           TAO_InputCDR in (out);
00882           TAO::Unknown_IDL_Type *unk = 0;
00883           ACE_NEW (unk,
00884                    TAO::Unknown_IDL_Type (this->type_.in (), in));
00885           this->any_.replace (unk);
00886         }
00887       else
00888         {
00889           throw DynamicAny::DynAny::TypeMismatch ();
00890         }
00891     }
00892 }
00893 
00894 CORBA::AbstractBase_ptr
00895 TAO_DynCommon::get_abstract (void)
00896 {
00897   if (this->destroyed_)
00898     {
00899       throw ::CORBA::OBJECT_NOT_EXIST ();
00900     }
00901 
00902   if (this->has_components_)
00903     {
00904       DynamicAny::DynAny_var cc =
00905         this->check_component ();
00906 
00907       return cc->get_abstract ();
00908     }
00909   else
00910     {
00911       CORBA::TCKind kind =
00912         TAO_DynAnyFactory::unalias (this->type_.in ());
00913 
00914       if (kind != CORBA::tk_abstract_interface)
00915         {
00916           throw DynamicAny::DynAny::TypeMismatch ();
00917         }
00918 
00919       CORBA::AbstractBase_var retval;
00920       TAO::Any_Impl *any_impl = this->any_.impl ();
00921 
00922       if (any_impl == 0)
00923         {
00924           throw DynamicAny::DynAny::InvalidValue ();
00925         }
00926 
00927       // This should always be non-zero for dynamic anys.
00928       TAO::Unknown_IDL_Type *unk =
00929         dynamic_cast<TAO::Unknown_IDL_Type *> (any_impl);
00930 
00931       // Make a copy to extract from so we retain ownership of contents.
00932       TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00933 
00934       // The CDR extraction operator for AbstractBase handles
00935       // all cases.
00936       if (!(for_reading >> retval.inout ()))
00937         {
00938           throw DynamicAny::DynAny::InvalidValue ();
00939         }
00940 
00941       return retval._retn ();
00942     }
00943 }
00944 
00945 // ****************************************************************
00946 
00947 void
00948 TAO_DynCommon::insert_boolean_seq (const CORBA::BooleanSeq &value)
00949 {
00950   TAO::DynAnyBasicTypeUtils<CORBA::BooleanSeq>::insert_value (value, this);
00951 }
00952 
00953 void
00954 TAO_DynCommon::insert_octet_seq (const CORBA::OctetSeq &value)
00955 {
00956   TAO::DynAnyBasicTypeUtils<CORBA::OctetSeq>::insert_value (value, this);
00957 }
00958 
00959 void
00960 TAO_DynCommon::insert_char_seq (const CORBA::CharSeq &value)
00961 {
00962   TAO::DynAnyBasicTypeUtils<CORBA::CharSeq>::insert_value (value, this);
00963 }
00964 
00965 void
00966 TAO_DynCommon::insert_short_seq (const CORBA::ShortSeq &value)
00967 {
00968   TAO::DynAnyBasicTypeUtils<CORBA::ShortSeq>::insert_value (value, this);
00969 }
00970 
00971 void
00972 TAO_DynCommon::insert_ushort_seq (const CORBA::UShortSeq &value)
00973 {
00974   TAO::DynAnyBasicTypeUtils<CORBA::UShortSeq>::insert_value (value, this);
00975 }
00976 
00977 void
00978 TAO_DynCommon::insert_long_seq (const CORBA::LongSeq &value)
00979 {
00980   TAO::DynAnyBasicTypeUtils<CORBA::LongSeq>::insert_value (value, this);
00981 }
00982 
00983 void
00984 TAO_DynCommon::insert_ulong_seq (const CORBA::ULongSeq &value)
00985 {
00986   TAO::DynAnyBasicTypeUtils<CORBA::ULongSeq>::insert_value (value, this);
00987 }
00988 
00989 void
00990 TAO_DynCommon::insert_float_seq (const CORBA::FloatSeq &value)
00991 {
00992   TAO::DynAnyBasicTypeUtils<CORBA::FloatSeq>::insert_value (value, this);
00993 }
00994 
00995 void
00996 TAO_DynCommon::insert_double_seq (const CORBA::DoubleSeq &value)
00997 {
00998   TAO::DynAnyBasicTypeUtils<CORBA::DoubleSeq>::insert_value (value, this);
00999 }
01000 
01001 void
01002 TAO_DynCommon::insert_longlong_seq (const CORBA::LongLongSeq &value)
01003 {
01004   TAO::DynAnyBasicTypeUtils<CORBA::LongLongSeq>::insert_value (value, this);
01005 }
01006 
01007 void
01008 TAO_DynCommon::insert_ulonglong_seq (const CORBA::ULongLongSeq &value)
01009 {
01010   TAO::DynAnyBasicTypeUtils<CORBA::ULongLongSeq>::insert_value (value, this);
01011 }
01012 
01013 void
01014 TAO_DynCommon::insert_longdouble_seq (const CORBA::LongDoubleSeq &value)
01015 {
01016   TAO::DynAnyBasicTypeUtils<CORBA::LongDoubleSeq>::insert_value (value, this);
01017 }
01018 
01019 void
01020 TAO_DynCommon::insert_wchar_seq (const CORBA::WCharSeq &value)
01021 {
01022   TAO::DynAnyBasicTypeUtils<CORBA::WCharSeq>::insert_value (value, this);
01023 }
01024 
01025 // ****************************************************************
01026 
01027 CORBA::BooleanSeq *
01028 TAO_DynCommon::get_boolean_seq (void)
01029 {
01030   CORBA::BooleanSeq *owned =
01031     TAO::DynAnyBasicTypeUtils<CORBA::BooleanSeq>::get_value (this);
01032   return new CORBA::BooleanSeq (*owned);
01033 }
01034 
01035 CORBA::OctetSeq *
01036 TAO_DynCommon::get_octet_seq (void)
01037 {
01038   CORBA::OctetSeq *owned =
01039     TAO::DynAnyBasicTypeUtils<CORBA::OctetSeq>::get_value (this);
01040   return new CORBA::OctetSeq (*owned);
01041 }
01042 
01043 CORBA::CharSeq *
01044 TAO_DynCommon::get_char_seq (void)
01045 {
01046   CORBA::CharSeq *owned =
01047     TAO::DynAnyBasicTypeUtils<CORBA::CharSeq>::get_value (this);
01048   return new CORBA::CharSeq (*owned);
01049 }
01050 
01051 CORBA::ShortSeq *
01052 TAO_DynCommon::get_short_seq (void)
01053 {
01054   CORBA::ShortSeq *owned =
01055     TAO::DynAnyBasicTypeUtils<CORBA::ShortSeq>::get_value (this);
01056   return new CORBA::ShortSeq (*owned);
01057 }
01058 
01059 CORBA::UShortSeq *
01060 TAO_DynCommon::get_ushort_seq (void)
01061 {
01062   CORBA::UShortSeq *owned =
01063     TAO::DynAnyBasicTypeUtils<CORBA::UShortSeq>::get_value (this);
01064   return new CORBA::UShortSeq (*owned);
01065 }
01066 
01067 CORBA::LongSeq *
01068 TAO_DynCommon::get_long_seq (void)
01069 {
01070   CORBA::LongSeq *owned =
01071     TAO::DynAnyBasicTypeUtils<CORBA::LongSeq>::get_value (this);
01072   return new CORBA::LongSeq (*owned);
01073 }
01074 
01075 CORBA::ULongSeq *
01076 TAO_DynCommon::get_ulong_seq (void)
01077 {
01078   CORBA::ULongSeq *owned =
01079     TAO::DynAnyBasicTypeUtils<CORBA::ULongSeq>::get_value (this);
01080   return new CORBA::ULongSeq (*owned);
01081 }
01082 
01083 CORBA::FloatSeq *
01084 TAO_DynCommon::get_float_seq (void)
01085 {
01086   CORBA::FloatSeq *owned =
01087     TAO::DynAnyBasicTypeUtils<CORBA::FloatSeq>::get_value (this);
01088   return new CORBA::FloatSeq (*owned);
01089 }
01090 
01091 CORBA::DoubleSeq *
01092 TAO_DynCommon::get_double_seq (void)
01093 {
01094   CORBA::DoubleSeq *owned =
01095     TAO::DynAnyBasicTypeUtils<CORBA::DoubleSeq>::get_value (this);
01096   return new CORBA::DoubleSeq (*owned);
01097 }
01098 
01099 CORBA::LongLongSeq *
01100 TAO_DynCommon::get_longlong_seq (void)
01101 {
01102   CORBA::LongLongSeq *owned =
01103     TAO::DynAnyBasicTypeUtils<CORBA::LongLongSeq>::get_value (this);
01104   return new CORBA::LongLongSeq (*owned);
01105 }
01106 
01107 CORBA::ULongLongSeq *
01108 TAO_DynCommon::get_ulonglong_seq (void)
01109 {
01110   CORBA::ULongLongSeq *owned =
01111     TAO::DynAnyBasicTypeUtils<CORBA::ULongLongSeq>::get_value (this);
01112   return new CORBA::ULongLongSeq (*owned);
01113 }
01114 
01115 CORBA::LongDoubleSeq *
01116 TAO_DynCommon::get_longdouble_seq (void)
01117 {
01118   CORBA::LongDoubleSeq *owned =
01119     TAO::DynAnyBasicTypeUtils<CORBA::LongDoubleSeq>::get_value (this);
01120   return new CORBA::LongDoubleSeq (*owned);
01121 }
01122 
01123 CORBA::WCharSeq *
01124 TAO_DynCommon::get_wchar_seq (void)
01125 {
01126   CORBA::WCharSeq *owned =
01127     TAO::DynAnyBasicTypeUtils<CORBA::WCharSeq>::get_value (this);
01128   return new CORBA::WCharSeq (*owned);
01129 }
01130 
01131 // ****************************************************************
01132 
01133 void
01134 TAO_DynCommon::set_flag (DynamicAny::DynAny_ptr component,
01135                          CORBA::Boolean destroying)
01136 {
01137   CORBA::TypeCode_var tc = component->type ();
01138 
01139   CORBA::TCKind tk = TAO_DynAnyFactory::unalias (tc.in ());
01140 
01141   switch (tk)
01142   {
01143     case CORBA::tk_array:
01144       TAO::DynAnyFlagUtils<TAO_DynArray_i>::set_flag_t (component,
01145                                                         destroying);
01146       break;
01147     case CORBA::tk_enum:
01148       TAO::DynAnyFlagUtils<TAO_DynEnum_i>::set_flag_t (component,
01149                                                        destroying);
01150       break;
01151     case CORBA::tk_sequence:
01152       if (TAO_DynCommon::is_basic_type_seq (tc.in ()))
01153         {
01154           TAO::DynAnyFlagUtils<TAO_DynAny_i>::set_flag_t (component,
01155                                                           destroying);
01156         }
01157       else
01158         {
01159           TAO::DynAnyFlagUtils<TAO_DynSequence_i>::set_flag_t (component,
01160                                                                destroying);
01161         }
01162       break;
01163     case CORBA::tk_struct:
01164       TAO::DynAnyFlagUtils<TAO_DynStruct_i>::set_flag_t (component,
01165                                                          destroying);
01166       break;
01167     case CORBA::tk_union:
01168       TAO::DynAnyFlagUtils<TAO_DynUnion_i>::set_flag_t (component,
01169                                                         destroying);
01170       break;
01171     case CORBA::tk_fixed:
01172     case CORBA::tk_value:
01173     case CORBA::tk_value_box:
01174       throw ::CORBA::NO_IMPLEMENT ();
01175     default:
01176       TAO::DynAnyFlagUtils<TAO_DynAny_i>::set_flag_t (component,
01177                                                       destroying);
01178       break;
01179   }
01180 }
01181 
01182 DynamicAny::DynAny_ptr
01183 TAO_DynCommon::check_component (void)
01184 {
01185   if (this->current_position_ == -1)
01186     {
01187       throw DynamicAny::DynAny::InvalidValue ();
01188     }
01189 
01190   DynamicAny::DynAny_var cc =
01191     this->current_component ();
01192 
01193   CORBA::TypeCode_var tc = cc->type ();
01194 
01195   CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ());
01196 
01197   // We are here because we are a component that is the target of
01198   // an insert_*() call on our container. It is
01199   // illegal to insert anything into a component that itself has
01200   // components.
01201   switch (kind)
01202   {
01203     case CORBA::tk_array:
01204     case CORBA::tk_except:
01205     case CORBA::tk_struct:
01206     case CORBA::tk_union:
01207       throw DynamicAny::DynAny::TypeMismatch ();
01208     case CORBA::tk_sequence:
01209       if (TAO_DynCommon::is_basic_type_seq (tc.in ()))
01210         {
01211           return cc._retn ();
01212         }
01213       else
01214         {
01215           throw DynamicAny::DynAny::TypeMismatch ();
01216         }
01217     default:
01218       return cc._retn ();
01219   }
01220 }
01221 
01222 void
01223 TAO_DynCommon::check_type (CORBA::TypeCode_ptr tc)
01224 {
01225   CORBA::Boolean const equivalent =
01226     this->type_->equivalent (tc);
01227 
01228   if (!equivalent)
01229     {
01230       throw DynamicAny::DynAny::TypeMismatch ();
01231     }
01232 }
01233 
01234 bool
01235 TAO_DynCommon::is_basic_type_seq (CORBA::TypeCode_ptr tc)
01236 {
01237   return (tc == CORBA::_tc_BooleanSeq
01238           || tc == CORBA::_tc_OctetSeq
01239           || tc == CORBA::_tc_CharSeq
01240           || tc == CORBA::_tc_WCharSeq
01241           || tc == CORBA::_tc_ShortSeq
01242           || tc == CORBA::_tc_UShortSeq
01243           || tc == CORBA::_tc_LongSeq
01244           || tc == CORBA::_tc_ULongSeq
01245           || tc == CORBA::_tc_LongLongSeq
01246           || tc == CORBA::_tc_ULongLongSeq
01247           || tc == CORBA::_tc_FloatSeq
01248           || tc == CORBA::_tc_DoubleSeq
01249           || tc == CORBA::_tc_LongDoubleSeq);
01250 }
01251 
01252 CORBA::Boolean
01253 TAO_DynCommon::has_components (void) const
01254 {
01255   return this->has_components_;
01256 }
01257 
01258 CORBA::Boolean
01259 TAO_DynCommon::destroyed (void) const
01260 {
01261   return this->destroyed_;
01262 }
01263 
01264 CORBA::Any &
01265 TAO_DynCommon::the_any (void)
01266 {
01267   return this->any_;
01268 }
01269 
01270 void
01271 TAO_DynCommon::container_is_destroying (CORBA::Boolean val)
01272 {
01273   this->container_is_destroying_ = val;
01274 }
01275 
01276 void
01277 TAO_DynCommon::ref_to_component (CORBA::Boolean val)
01278 {
01279   this->ref_to_component_ = val;
01280 }
01281 
01282 CORBA::TypeCode_ptr
01283 TAO_DynCommon::check_type_and_unalias (CORBA::TypeCode_ptr tc)
01284 {
01285   this->check_type (tc);
01286 
01287   return TAO_DynAnyFactory::strip_alias (tc);
01288 }
01289 
01290 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:43:10 2010 for TAO_DynamicAny by  doxygen 1.4.7