summaryrefslogtreecommitdiff
path: root/TAO/tao
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao')
-rw-r--r--TAO/tao/DynamicAny/DynStruct_i.cpp115
-rw-r--r--TAO/tao/DynamicAny/DynStruct_i.h5
-rw-r--r--TAO/tao/DynamicAny/DynUnion_i.cpp45
-rw-r--r--TAO/tao/DynamicAny/DynUnion_i.h5
-rw-r--r--TAO/tao/PortableServer/POA.cpp16
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;
}