00001
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
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
00312
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
00352
00353
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
00361
00362
00363
00364
00365 if (ACE_OS::strcmp (value_id, my_id) != 0)
00366 {
00367 throw DynamicAny::DynAny::TypeMismatch ();
00368 }
00369 }
00370
00371
00372
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
00480
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
00608
00609
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
00657
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
00708 TAO::Unknown_IDL_Type *unk =
00709 dynamic_cast<TAO::Unknown_IDL_Type *> (any_impl);
00710
00711
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
00860
00861
00862
00863
00864
00865 good_type = value->_is_a (my_id);
00866 }
00867 }
00868 }
00869
00870 if (good_type)
00871 {
00872 TAO_OutputCDR out;
00873
00874
00875
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
00928 TAO::Unknown_IDL_Type *unk =
00929 dynamic_cast<TAO::Unknown_IDL_Type *> (any_impl);
00930
00931
00932 TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00933
00934
00935
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
01198
01199
01200
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