diff options
Diffstat (limited to 'TAO/tao')
-rw-r--r-- | TAO/tao/DynamicAny/DynStruct_i.cpp | 115 | ||||
-rw-r--r-- | TAO/tao/DynamicAny/DynStruct_i.h | 5 | ||||
-rw-r--r-- | TAO/tao/DynamicAny/DynUnion_i.cpp | 45 | ||||
-rw-r--r-- | TAO/tao/DynamicAny/DynUnion_i.h | 5 | ||||
-rw-r--r-- | TAO/tao/PortableServer/POA.cpp | 16 |
5 files changed, 93 insertions, 93 deletions
diff --git a/TAO/tao/DynamicAny/DynStruct_i.cpp b/TAO/tao/DynamicAny/DynStruct_i.cpp index 4d01be3991b..bca822faeeb 100644 --- a/TAO/tao/DynamicAny/DynStruct_i.cpp +++ b/TAO/tao/DynamicAny/DynStruct_i.cpp @@ -54,8 +54,25 @@ TAO_DynStruct_i::init (const CORBA::Any& any this->type_ = tc; - // Member_count works with aliased type codes. - CORBA::ULong numfields = this->type_->member_count (ACE_ENV_SINGLE_ARG_PARAMETER); + this->set_from_any (any + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; +} + + +// This code is common to from_any() and the init() overload that takes +// an Any argument. +void +TAO_DynStruct_i::set_from_any (const CORBA::Any & any + ACE_ENV_ARG_DECL) +{ + // member_type() does not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (any.type () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + CORBA::ULong numfields = unaliased_tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK; // Resize the array. @@ -70,7 +87,7 @@ TAO_DynStruct_i::init (const CORBA::Any& any any._tao_byte_order ()); // If we have an exception type, unmarshal the repository ID. - CORBA::TCKind kind = TAO_DynAnyFactory::unalias (this->type_.in () + CORBA::TCKind kind = TAO_DynAnyFactory::unalias (any.type () ACE_ENV_ARG_PARAMETER); ACE_CHECK; @@ -80,12 +97,6 @@ TAO_DynStruct_i::init (const CORBA::Any& any cdr >> str.out (); } - // member_type() does not work with aliased type codes. - CORBA::TypeCode_var unaliased_tc = - TAO_DynAnyFactory::strip_alias (this->type_.in () - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - for (CORBA::ULong i = 0; i < numfields; i++) { CORBA::TypeCode_var field_tc = @@ -134,10 +145,15 @@ TAO_DynStruct_i::init (CORBA::TypeCode_ptr tc CORBA::TypeCode_var mtype; + // member_type() does not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (this->type_.in () + ACE_ENV_ARG_PARAMETER); + for (CORBA::ULong i = 0; i < numfields; i++) { - mtype = tc->member_type (i - ACE_ENV_ARG_PARAMETER); + mtype = unaliased_tc->member_type (i + ACE_ENV_ARG_PARAMETER); ACE_CHECK; // Recursively initialize each member. @@ -214,10 +230,14 @@ TAO_DynStruct_i::current_member_name (ACE_ENV_SINGLE_ARG_DECL) 0); } - // Member_name works with aliased type codes. + // member_name() does not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (this->type_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; const char *name = - this->type_->member_name (this->current_position_ - ACE_ENV_ARG_PARAMETER); + unaliased_tc->member_name (this->current_position_ + ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (0); return CORBA::string_dup (name); @@ -251,9 +271,14 @@ TAO_DynStruct_i::current_member_kind (ACE_ENV_SINGLE_ARG_DECL) CORBA::tk_null); } - CORBA::TypeCode_var tc = - this->type_.in ()->member_type (this->current_position_ + // member_type() does not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (this->type_.in () ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + CORBA::TypeCode_var tc = + unaliased_tc->member_type (this->current_position_ + ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (CORBA::tk_null); CORBA::TCKind retval = TAO_DynAnyFactory::unalias (tc.in () @@ -387,11 +412,17 @@ TAO_DynStruct_i::get_members_as_dyn_any (ACE_ENV_SINGLE_ARG_DECL) DynamicAny::NameDynAnyPairSeq_var safe_retval = members; + // member_name() does not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (this->type_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + // Assign name and value to each pearl on the string. for (CORBA::ULong i = 0; i < this->component_count_; ++i) { safe_retval[i].id = - CORBA::string_dup (this->type_.in ()->member_name (i)); + CORBA::string_dup (unaliased_tc->member_name (i)); // A deep copy is made only by copy() (CORBA 2.4.2 section 9.2.3.6). // Set the flag so the caller can't destroy. @@ -486,7 +517,6 @@ TAO_DynStruct_i::from_any (const CORBA::Any & any { ACE_THROW (CORBA::OBJECT_NOT_EXIST ()); } - CORBA::TypeCode_var tc = any.type (); CORBA::Boolean equivalent = this->type_->equivalent (tc.in () ACE_ENV_ARG_PARAMETER); @@ -494,56 +524,11 @@ TAO_DynStruct_i::from_any (const CORBA::Any & any if (equivalent) { - // Get the CDR stream of the argument. - ACE_Message_Block* mb = any._tao_get_cdr (); - TAO_InputCDR cdr (mb, - any._tao_byte_order ()); - - // If we have an exception type, unmarshal the repository ID. - CORBA::TCKind kind = TAO_DynAnyFactory::unalias (this->type_.in () - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - if (kind == CORBA::tk_except) - { - CORBA::String_var str; - cdr >> str.out (); - } - - CORBA::TypeCode_var field_tc; - - for (CORBA::ULong i = 0; i < this->component_count_; ++i) - { - field_tc = this->type_.in ()->member_type (i - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - // This Any constructor is a TAO extension. - CORBA::Any field_any (field_tc.in (), - 0, - cdr.byte_order (), - cdr.start ()); - - this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - this->da_members_[i] = - TAO_DynAnyFactory::make_dyn_any (field_any - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - // Move to the next field in the CDR stream. - (void) TAO_Marshal_Object::perform_skip (field_tc.in (), - &cdr - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - } - - this->current_position_ = this->component_count_ ? 0 : -1; + this->set_from_any (any ACE_ENV_ARG_PARAMETER); } else { - ACE_THROW (DynamicAny::DynAny::InvalidValue ()); + ACE_THROW (DynamicAny::DynAny::TypeMismatch ()); } } diff --git a/TAO/tao/DynamicAny/DynStruct_i.h b/TAO/tao/DynamicAny/DynStruct_i.h index 84a509df9fb..6ec359b8cb1 100644 --- a/TAO/tao/DynamicAny/DynStruct_i.h +++ b/TAO/tao/DynamicAny/DynStruct_i.h @@ -168,6 +168,11 @@ private: void check_typecode (CORBA::TypeCode_ptr tc ACE_ENV_ARG_DECL); + // Code common to the constructor from an Any arg and the member + // function from_any(). + void set_from_any (const CORBA::Any &any + ACE_ENV_SINGLE_ARG_DECL); + // Called by both versions of init(). void init_common (void); diff --git a/TAO/tao/DynamicAny/DynUnion_i.cpp b/TAO/tao/DynamicAny/DynUnion_i.cpp index 61374ebafd9..720d5c37e0b 100644 --- a/TAO/tao/DynamicAny/DynUnion_i.cpp +++ b/TAO/tao/DynamicAny/DynUnion_i.cpp @@ -48,11 +48,18 @@ TAO_DynUnion_i::init (const CORBA::Any& any this->init_common (); - // Set the from_factory arg to TRUE, so any problems will throw - // InconsistentTypeCode. - this->set_from_any (any, - 1 - ACE_ENV_ARG_PARAMETER); + // Map TypeMismatch to InconsistentTypeCode.2 + ACE_TRY + { + this->set_from_any (any + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + ACE_CATCH(DynamicAny::DynAny::TypeMismatch, ex) + { + ACE_TRY_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ()); + } + ACE_ENDTRY; ACE_CHECK; } @@ -74,7 +81,11 @@ TAO_DynUnion_i::init (CORBA::TypeCode_ptr tc this->init_common (); - CORBA::Any_var first_label = tc->member_label (this->current_position_ + // member_type()/member_label() do not work with aliased type codes. + CORBA::TypeCode_var unaliased_tc = + TAO_DynAnyFactory::strip_alias (this->type_.in () + ACE_ENV_ARG_PARAMETER); + CORBA::Any_var first_label = unaliased_tc->member_label (this->current_position_ ACE_ENV_ARG_PARAMETER); ACE_CHECK; @@ -84,8 +95,8 @@ TAO_DynUnion_i::init (CORBA::TypeCode_ptr tc ACE_ENV_ARG_PARAMETER); ACE_CHECK; - CORBA::TypeCode_var first_type = tc->member_type (this->current_position_ - ACE_ENV_ARG_PARAMETER); + CORBA::TypeCode_var first_type = unaliased_tc->member_type (this->current_position_ + ACE_ENV_ARG_PARAMETER); ACE_CHECK; // Recursively initialize the member to its default value. @@ -135,8 +146,7 @@ TAO_DynUnion_i::_tao_QueryInterface (ptr_arith_t type) // This code is common to from_any() and the init() overload that takes // an Any argument. void -TAO_DynUnion_i::set_from_any (const CORBA::Any & any, - CORBA::Boolean from_factory +TAO_DynUnion_i::set_from_any (const CORBA::Any & any ACE_ENV_ARG_DECL) ACE_THROW_SPEC (( CORBA::SystemException, @@ -243,14 +253,7 @@ TAO_DynUnion_i::set_from_any (const CORBA::Any & any, if (default_index == -1) { - if (from_factory) - { - ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ()); - } - else - { - ACE_THROW (DynamicAny::DynAny::TypeMismatch ()); - } + set_to_no_active_member (ACE_ENV_SINGLE_ARG_PARAMETER); } else { @@ -704,10 +707,7 @@ TAO_DynUnion_i::from_any (const CORBA::Any& any // May be changed in set_from_any(). this->component_count_ = 2; - // Set the from_factory arg to FALSE, so any problems will throw - // TypeMismatch. - this->set_from_any (any, - 0 + this->set_from_any (any ACE_ENV_ARG_PARAMETER); ACE_CHECK; } @@ -1017,4 +1017,3 @@ TAO_DynUnion_i::label_match (const CORBA::Any &my_any, return 0; } } - diff --git a/TAO/tao/DynamicAny/DynUnion_i.h b/TAO/tao/DynamicAny/DynUnion_i.h index c5038b1bf9a..76d79ccd726 100644 --- a/TAO/tao/DynamicAny/DynUnion_i.h +++ b/TAO/tao/DynamicAny/DynUnion_i.h @@ -180,9 +180,8 @@ public: private: // Code common to the constructor from an Any arg and the member // function from_any(). - void set_from_any (const CORBA::Any &any, - CORBA::Boolean from_factory - ACE_ENV_ARG_DECL_WITH_DEFAULTS) + void set_from_any (const CORBA::Any &any + ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC (( CORBA::SystemException, DynamicAny::DynAny::TypeMismatch, diff --git a/TAO/tao/PortableServer/POA.cpp b/TAO/tao/PortableServer/POA.cpp index d64877ec69d..151fe38f16e 100644 --- a/TAO/tao/PortableServer/POA.cpp +++ b/TAO/tao/PortableServer/POA.cpp @@ -318,8 +318,20 @@ TAO_POA::TAO_POA (const TAO_POA::String &name, { int temp = this->use_imr_; this->use_imr_ = 0; - this->imr_notify_startup (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; + ACE_TRY + { + this->imr_notify_startup (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + } + ACE_CATCHANY + { + this->poa_manager_.remove_poa (this); + this->object_adapter ().unbind_poa (this, + this->folded_name_, + this->system_name_); + ACE_RE_THROW; + } + ACE_ENDTRY; this->use_imr_ = temp; } |