00001
00002
00003 #include "tao/DynamicAny/DynArray_i.h"
00004 #include "tao/DynamicAny/DynAnyFactory.h"
00005 #include "tao/AnyTypeCode/Marshal.h"
00006 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00007 #include "tao/CDR.h"
00008
00009 ACE_RCSID (DynamicAny,
00010 DynArray_i,
00011 "DynArray_i.cpp,v 1.31 2006/03/10 07:19:07 jtc Exp")
00012
00013 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00014
00015 TAO_DynArray_i::TAO_DynArray_i (void)
00016 {
00017 }
00018
00019 TAO_DynArray_i::~TAO_DynArray_i (void)
00020 {
00021 }
00022
00023 void
00024 TAO_DynArray_i::init_common (void)
00025 {
00026 this->ref_to_component_ = 0;
00027 this->container_is_destroying_ = 0;
00028 this->has_components_ = 1;
00029 this->destroyed_ = 0;
00030 this->current_position_ = 0;
00031 this->component_count_ = static_cast<CORBA::ULong> (this->da_members_.size ());
00032 }
00033
00034 void
00035 TAO_DynArray_i::init (const CORBA::Any & any
00036 ACE_ENV_ARG_DECL)
00037 {
00038 CORBA::TypeCode_var tc = any.type ();
00039
00040 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
00041 ACE_ENV_ARG_PARAMETER);
00042 ACE_CHECK;
00043
00044 if (kind != CORBA::tk_array)
00045 {
00046 ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
00047 }
00048
00049 this->type_ = tc;
00050
00051 CORBA::ULong numfields = this->get_tc_length (tc.in ()
00052 ACE_ENV_ARG_PARAMETER);
00053 ACE_CHECK;
00054
00055 this->da_members_.size (numfields);
00056
00057 this->init_common ();
00058
00059
00060 TAO::Any_Impl *impl = any.impl ();
00061 TAO_OutputCDR out;
00062 TAO_InputCDR cdr (static_cast<ACE_Message_Block *> (0));
00063
00064 if (impl->encoded ())
00065 {
00066 TAO::Unknown_IDL_Type *unk =
00067 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00068
00069 cdr = unk->_tao_get_cdr ();
00070 }
00071 else
00072 {
00073 impl->marshal_value (out);
00074 TAO_InputCDR tmp_in (out);
00075 cdr = tmp_in;
00076 }
00077
00078 CORBA::TypeCode_var field_tc =
00079 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00080 ACE_CHECK;
00081
00082 for (CORBA::ULong i = 0; i < numfields; ++i)
00083 {
00084 CORBA::Any field_any;
00085 TAO::Unknown_IDL_Type *field_unk = 0;
00086 TAO_InputCDR unk_in (cdr);
00087 ACE_NEW (field_unk,
00088 TAO::Unknown_IDL_Type (field_tc.in (),
00089 unk_in));
00090 field_any.replace (field_unk);
00091
00092
00093
00094 this->da_members_[i] =
00095 TAO_DynAnyFactory::make_dyn_any (field_any
00096 ACE_ENV_ARG_PARAMETER);
00097 ACE_CHECK;
00098
00099
00100 (void) TAO_Marshal_Object::perform_skip (field_tc.in (),
00101 &cdr
00102 ACE_ENV_ARG_PARAMETER);
00103 ACE_CHECK;
00104 }
00105 }
00106
00107 void
00108 TAO_DynArray_i::init (CORBA::TypeCode_ptr tc
00109 ACE_ENV_ARG_DECL)
00110 {
00111 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc
00112 ACE_ENV_ARG_PARAMETER);
00113 ACE_CHECK;
00114
00115 if (kind != CORBA::tk_array)
00116 {
00117 ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
00118 }
00119
00120 this->type_ = CORBA::TypeCode::_duplicate (tc);
00121
00122 CORBA::ULong numfields = this->get_tc_length (tc
00123 ACE_ENV_ARG_PARAMETER);
00124 ACE_CHECK;
00125
00126
00127 this->da_members_.size (numfields);
00128
00129 this->init_common ();
00130
00131 CORBA::TypeCode_var elemtype =
00132 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00133 ACE_CHECK;
00134
00135 for (CORBA::ULong i = 0; i < numfields; ++i)
00136 {
00137
00138 this->da_members_[i] =
00139 TAO_DynAnyFactory::make_dyn_any (elemtype.in ()
00140 ACE_ENV_ARG_PARAMETER);
00141 ACE_CHECK;
00142 }
00143 }
00144
00145 CORBA::TypeCode_ptr
00146 TAO_DynArray_i::get_element_type (ACE_ENV_SINGLE_ARG_DECL)
00147 {
00148 CORBA::TypeCode_var element_type =
00149 CORBA::TypeCode::_duplicate (this->type_.in ());
00150
00151
00152 CORBA::TCKind kind = element_type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
00153 ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
00154
00155 while (kind != CORBA::tk_array)
00156 {
00157 element_type =
00158 element_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00159 ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
00160
00161 kind = element_type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
00162 ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
00163 }
00164
00165
00166 CORBA::TypeCode_ptr retval =
00167 element_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00168 ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
00169
00170 return retval;
00171 }
00172
00173
00174 CORBA::ULong
00175 TAO_DynArray_i::get_tc_length (CORBA::TypeCode_ptr tc
00176 ACE_ENV_ARG_DECL)
00177 {
00178 CORBA::TypeCode_var tctmp = CORBA::TypeCode::_duplicate (tc);
00179 CORBA::TCKind kind = tctmp->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
00180 ACE_CHECK_RETURN (0);
00181
00182 while (kind == CORBA::tk_alias)
00183 {
00184 tctmp = tctmp->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00185 ACE_CHECK_RETURN (0);
00186 kind = tctmp->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
00187 ACE_CHECK_RETURN (0);
00188 }
00189
00190 CORBA::ULong retval = tctmp->length (ACE_ENV_SINGLE_ARG_PARAMETER);
00191 ACE_CHECK_RETURN (0);
00192
00193 return retval;
00194 }
00195
00196
00197
00198 TAO_DynArray_i *
00199 TAO_DynArray_i::_narrow (CORBA::Object_ptr _tao_objref
00200 ACE_ENV_ARG_DECL_NOT_USED)
00201 {
00202 if (CORBA::is_nil (_tao_objref))
00203 {
00204 return 0;
00205 }
00206
00207 return dynamic_cast<TAO_DynArray_i *> (_tao_objref);
00208 }
00209
00210
00211
00212 DynamicAny::AnySeq *
00213 TAO_DynArray_i::get_elements (ACE_ENV_SINGLE_ARG_DECL)
00214 ACE_THROW_SPEC ((
00215 CORBA::SystemException
00216 ))
00217 {
00218 if (this->destroyed_)
00219 {
00220 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00221 0);
00222 }
00223
00224 CORBA::ULong length = static_cast<CORBA::ULong> (this->da_members_.size ());
00225
00226 DynamicAny::AnySeq *elements = 0;
00227 ACE_NEW_THROW_EX (elements,
00228 DynamicAny::AnySeq (length),
00229 CORBA::NO_MEMORY ());
00230 ACE_CHECK_RETURN (0);
00231
00232 elements->length (length);
00233 DynamicAny::AnySeq_var safe_retval (elements);
00234
00235 CORBA::Any_var tmp;
00236
00237
00238 for (CORBA::ULong i = 0; i < length; i++)
00239 {
00240 tmp = this->da_members_[i]->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00241 ACE_CHECK_RETURN (0);
00242
00243 safe_retval[i] = tmp.in ();
00244 }
00245
00246 return safe_retval._retn ();
00247 }
00248
00249 void
00250 TAO_DynArray_i::set_elements (const DynamicAny::AnySeq & value
00251 ACE_ENV_ARG_DECL)
00252 ACE_THROW_SPEC ((
00253 CORBA::SystemException,
00254 DynamicAny::DynAny::TypeMismatch,
00255 DynamicAny::DynAny::InvalidValue
00256 ))
00257 {
00258 if (this->destroyed_)
00259 {
00260 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00261 }
00262
00263 CORBA::ULong length = value.length ();
00264
00265 if (length != this->da_members_.size ())
00266 {
00267 ACE_THROW (DynamicAny::DynAny::InvalidValue ());
00268 }
00269
00270 CORBA::TypeCode_var value_tc;
00271 CORBA::TypeCode_var element_type =
00272 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00273 ACE_CHECK;
00274
00275 for (CORBA::ULong i = 0; i < length; i++)
00276 {
00277
00278 value_tc = value[i].type ();
00279 CORBA::Boolean equivalent =
00280 value_tc->equivalent (element_type.in ()
00281 ACE_ENV_ARG_PARAMETER);
00282 ACE_CHECK;
00283
00284 if (equivalent)
00285 {
00286 this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00287 ACE_CHECK;
00288
00289 this->da_members_[i] =
00290 TAO_DynAnyFactory::make_dyn_any (value[i]
00291 ACE_ENV_ARG_PARAMETER);
00292 ACE_CHECK;
00293 }
00294 else
00295 {
00296 ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
00297 }
00298 }
00299 }
00300
00301 DynamicAny::DynAnySeq *
00302 TAO_DynArray_i::get_elements_as_dyn_any (ACE_ENV_SINGLE_ARG_DECL)
00303 ACE_THROW_SPEC ((
00304 CORBA::SystemException
00305 ))
00306 {
00307 if (this->destroyed_)
00308 {
00309 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00310 0);
00311 }
00312
00313 DynamicAny::DynAnySeq *retval = 0;
00314 ACE_NEW_THROW_EX (retval,
00315 DynamicAny::DynAnySeq (this->component_count_),
00316 CORBA::NO_MEMORY ());
00317 ACE_CHECK_RETURN (0);
00318
00319 retval->length (this->component_count_);
00320 DynamicAny::DynAnySeq_var safe_retval (retval);
00321
00322 for (CORBA::ULong i = 0; i < this->component_count_; ++i)
00323 {
00324
00325
00326 this->set_flag (this->da_members_[i].in (),
00327 0
00328 ACE_ENV_ARG_PARAMETER);
00329 ACE_CHECK_RETURN (0);
00330
00331 safe_retval[i] =
00332 DynamicAny::DynAny::_duplicate (this->da_members_[i].in ());
00333 ACE_CHECK_RETURN (0);
00334 }
00335
00336 return safe_retval._retn ();
00337 }
00338
00339 void
00340 TAO_DynArray_i::set_elements_as_dyn_any (
00341 const DynamicAny::DynAnySeq & values
00342 ACE_ENV_ARG_DECL
00343 )
00344 ACE_THROW_SPEC ((
00345 CORBA::SystemException,
00346 DynamicAny::DynAny::TypeMismatch,
00347 DynamicAny::DynAny::InvalidValue
00348 ))
00349 {
00350 if (this->destroyed_)
00351 {
00352 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00353 }
00354
00355 CORBA::ULong length = static_cast<CORBA::ULong> (this->da_members_.size ());
00356
00357 if (values.length () != length)
00358 {
00359 ACE_THROW (DynamicAny::DynAny::InvalidValue ());
00360 }
00361
00362 CORBA::TypeCode_var element_type =
00363 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00364 ACE_CHECK;
00365
00366 CORBA::TypeCode_var val_type;
00367 CORBA::Boolean equivalent;
00368
00369 for (CORBA::ULong i = 0; i < length; ++i)
00370 {
00371 val_type = values[i]->type (ACE_ENV_SINGLE_ARG_PARAMETER);
00372 ACE_CHECK;
00373
00374 equivalent = val_type->equivalent (element_type.in ()
00375 ACE_ENV_ARG_PARAMETER);
00376
00377 ACE_CHECK;
00378
00379 if (equivalent)
00380 {
00381 this->da_members_[i] =
00382 values[i]->copy (ACE_ENV_SINGLE_ARG_PARAMETER);
00383 ACE_CHECK;
00384 }
00385 else
00386 {
00387 ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
00388 }
00389 }
00390 }
00391
00392
00393
00394 void
00395 TAO_DynArray_i::from_any (const CORBA::Any& any
00396 ACE_ENV_ARG_DECL)
00397 ACE_THROW_SPEC ((
00398 CORBA::SystemException,
00399 DynamicAny::DynAny::TypeMismatch,
00400 DynamicAny::DynAny::InvalidValue
00401 ))
00402 {
00403 if (this->destroyed_)
00404 {
00405 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00406 }
00407
00408 CORBA::TypeCode_var tc = any.type ();
00409 CORBA::Boolean equivalent =
00410 this->type_.in ()->equivalent (tc.in ()
00411 ACE_ENV_ARG_PARAMETER);
00412 ACE_CHECK;
00413
00414 if (equivalent)
00415 {
00416
00417 TAO::Any_Impl *impl = any.impl ();
00418 TAO_OutputCDR out;
00419 TAO_InputCDR cdr (static_cast<ACE_Message_Block *> (0));
00420
00421 if (impl->encoded ())
00422 {
00423 TAO::Unknown_IDL_Type *unk =
00424 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00425
00426 cdr = unk->_tao_get_cdr ();
00427 }
00428 else
00429 {
00430 impl->marshal_value (out);
00431 TAO_InputCDR tmp_in (out);
00432 cdr = tmp_in;
00433 }
00434
00435 CORBA::ULong length = static_cast<CORBA::ULong> (this->da_members_.size ());
00436 CORBA::ULong arg_length = this->get_tc_length (tc.in ()
00437 ACE_ENV_ARG_PARAMETER);
00438 ACE_CHECK;
00439
00440 if (length != arg_length)
00441 {
00442 ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
00443 }
00444
00445 CORBA::TypeCode_var field_tc =
00446 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00447 ACE_CHECK;
00448
00449 for (CORBA::ULong i = 0; i < arg_length; ++i)
00450 {
00451 CORBA::Any field_any;
00452 TAO_InputCDR unk_in (cdr);
00453 TAO::Unknown_IDL_Type *field_unk = 0;
00454 ACE_NEW (field_unk,
00455 TAO::Unknown_IDL_Type (field_tc.in (),
00456 unk_in));
00457 field_any.replace (field_unk);
00458
00459 this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00460 ACE_CHECK;
00461
00462 this->da_members_[i] =
00463 TAO_DynAnyFactory::make_dyn_any (field_any
00464 ACE_ENV_ARG_PARAMETER);
00465 ACE_CHECK;
00466
00467
00468 (void) TAO_Marshal_Object::perform_skip (field_tc.in (),
00469 &cdr
00470 ACE_ENV_ARG_PARAMETER);
00471 ACE_CHECK;
00472 }
00473
00474 this->current_position_ = arg_length ? 0 : -1;
00475 }
00476 else
00477 {
00478 ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
00479 }
00480 }
00481
00482 CORBA::Any_ptr
00483 TAO_DynArray_i::to_any (ACE_ENV_SINGLE_ARG_DECL)
00484 ACE_THROW_SPEC ((
00485 CORBA::SystemException
00486 ))
00487 {
00488 if (this->destroyed_)
00489 {
00490 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00491 0);
00492 }
00493
00494 CORBA::TypeCode_var field_tc =
00495 this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00496 ACE_CHECK_RETURN (0);
00497
00498 TAO_OutputCDR out_cdr;
00499 CORBA::Any_var field_any;
00500 size_t length = this->da_members_.size ();
00501
00502 for (size_t i = 0; i < length; ++i)
00503 {
00504
00505 field_any =
00506 this->da_members_[i]->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00507 ACE_CHECK_RETURN (0);
00508
00509 TAO::Any_Impl *field_impl = field_any->impl ();
00510 TAO_OutputCDR field_out;
00511 TAO_InputCDR field_cdr (static_cast<ACE_Message_Block *> (0));
00512
00513 if (field_impl->encoded ())
00514 {
00515 TAO::Unknown_IDL_Type *field_unk =
00516 dynamic_cast<TAO::Unknown_IDL_Type *> (field_impl);
00517
00518 field_cdr = field_unk->_tao_get_cdr ();
00519 }
00520 else
00521 {
00522 field_impl->marshal_value (field_out);
00523 TAO_InputCDR tmp_in (field_out);
00524 field_cdr = tmp_in;
00525 }
00526
00527 (void) TAO_Marshal_Object::perform_append (field_tc.in (),
00528 &field_cdr,
00529 &out_cdr
00530 ACE_ENV_ARG_PARAMETER);
00531 ACE_CHECK_RETURN (0);
00532 }
00533
00534 TAO_InputCDR in_cdr (out_cdr);
00535
00536 CORBA::Any_ptr retval = 0;
00537 ACE_NEW_THROW_EX (retval,
00538 CORBA::Any,
00539 CORBA::NO_MEMORY ());
00540 ACE_CHECK_RETURN (0);
00541
00542 TAO::Unknown_IDL_Type *unk = 0;
00543 ACE_NEW_THROW_EX (unk,
00544 TAO::Unknown_IDL_Type (this->type_.in (),
00545 in_cdr),
00546 CORBA::NO_MEMORY ());
00547 ACE_CHECK_RETURN (0);
00548
00549 retval->replace (unk);
00550 return retval;
00551 }
00552
00553 CORBA::Boolean
00554 TAO_DynArray_i::equal (DynamicAny::DynAny_ptr rhs
00555 ACE_ENV_ARG_DECL)
00556 ACE_THROW_SPEC ((
00557 CORBA::SystemException
00558 ))
00559 {
00560 if (this->destroyed_)
00561 {
00562 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00563 0);
00564 }
00565
00566 CORBA::TypeCode_var tc = rhs->type (ACE_ENV_SINGLE_ARG_PARAMETER);
00567 ACE_CHECK_RETURN (0);
00568
00569 CORBA::Boolean equivalent = tc->equivalent (this->type_.in ()
00570 ACE_ENV_ARG_PARAMETER);
00571 ACE_CHECK_RETURN (0);
00572
00573 if (!equivalent)
00574 {
00575 return 0;
00576 }
00577
00578 DynamicAny::DynAny_var tmp;
00579 CORBA::Boolean member_equal;
00580
00581 for (CORBA::ULong i = 0; i < this->component_count_; ++i)
00582 {
00583 rhs->seek (static_cast<CORBA::Long> (i)
00584 ACE_ENV_ARG_PARAMETER);
00585 ACE_CHECK_RETURN (0);
00586
00587 tmp = rhs->current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
00588 ACE_CHECK_RETURN (0);
00589
00590
00591 member_equal = tmp->equal (this->da_members_[i].in ()
00592 ACE_ENV_ARG_PARAMETER);
00593 ACE_CHECK_RETURN (0);
00594
00595 if (!member_equal)
00596 {
00597 return 0;
00598 }
00599 }
00600
00601 return 1;
00602 }
00603
00604 void
00605 TAO_DynArray_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
00606 ACE_THROW_SPEC ((
00607 CORBA::SystemException
00608 ))
00609 {
00610 if (this->destroyed_)
00611 {
00612 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00613 }
00614
00615 if (!this->ref_to_component_ || this->container_is_destroying_)
00616 {
00617
00618 for (CORBA::ULong i = 0; i < this->component_count_; ++i)
00619 {
00620 this->set_flag (da_members_[i].in (),
00621 1
00622 ACE_ENV_ARG_PARAMETER);
00623 ACE_CHECK;
00624
00625 this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
00626 ACE_CHECK;
00627 }
00628
00629 this->destroyed_ = 1;
00630 }
00631 }
00632
00633 DynamicAny::DynAny_ptr
00634 TAO_DynArray_i::current_component (ACE_ENV_SINGLE_ARG_DECL)
00635 ACE_THROW_SPEC ((
00636 CORBA::SystemException,
00637 DynamicAny::DynAny::TypeMismatch
00638 ))
00639 {
00640 if (this->destroyed_)
00641 {
00642 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00643 DynamicAny::DynAny::_nil ());
00644 }
00645
00646 if (this->current_position_ == -1)
00647 {
00648 return DynamicAny::DynAny::_nil ();
00649 }
00650
00651 CORBA::ULong index = static_cast<CORBA::ULong> (this->current_position_);
00652
00653 this->set_flag (this->da_members_[index].in (),
00654 0
00655 ACE_ENV_ARG_PARAMETER);
00656 ACE_CHECK_RETURN (DynamicAny::DynAny::_nil ());
00657
00658 return DynamicAny::DynAny::_duplicate (
00659 this->da_members_[index].in ()
00660 );
00661 }
00662
00663 TAO_END_VERSIONED_NAMESPACE_DECL