diff options
20 files changed, 808 insertions, 195 deletions
diff --git a/TAO/TAOACE.dsw b/TAO/TAOACE.dsw index c123287a4c9..bfd69242f4e 100644 --- a/TAO/TAOACE.dsw +++ b/TAO/TAOACE.dsw @@ -459,9 +459,6 @@ Package=<5> Package=<4>
{{{
Begin Project Dependency
- Project_Dep_Name TypeCodeFactory_DLL
- End Project Dependency
- Begin Project Dependency
Project_Dep_Name Svc Utils
End Project Dependency
Begin Project Dependency
diff --git a/TAO/examples/TypeCode_Creation/main.cpp b/TAO/examples/TypeCode_Creation/main.cpp index 079fb85fdea..52112b176e0 100644 --- a/TAO/examples/TypeCode_Creation/main.cpp +++ b/TAO/examples/TypeCode_Creation/main.cpp @@ -16,37 +16,68 @@ int main(int argc, char *argv[]) ACE_TRY_ENV); ACE_TRY_CHECK; - CORBA::TypeCode_ptr iface_tc = + CORBA::TypeCode_var iface_tc = orb->create_interface_tc (CORBA::string_dup ("IDL:iface:1.0"), CORBA::string_dup ("iface"), ACE_TRY_ENV); ACE_TRY_CHECK; - CORBA::ULong length = 2; + CORBA::ULong length = 5; - CORBA::StructMemberSeq foo_members (length); + CORBA::UnionMemberSeq foo_members (length); foo_members.length (length); + // The first three members are multiple case labels for a + // single string member. The label values are not in order + // or consecutive. + foo_members[0].name = CORBA::string_dup ("foo_str_member"); + + // The type member of the UnionMember takes ownership. foo_members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_string); // Not needed for ORB-created typecodes // (see CORBA 2.4.2 section 10.7.3). foo_members[0].type_def = CORBA::IDLType::_nil (); + CORBA::Short label_value = -3; + foo_members[0].label <<= label_value; - foo_members[1].name = CORBA::string_dup ("foo_iface_member"); - - // StructMember.type takes ownership. - foo_members[1].type = iface_tc; - + foo_members[1].name = CORBA::string_dup ("foo_str_member"); + foo_members[1].type = CORBA::TypeCode::_duplicate (CORBA::_tc_string); foo_members[1].type_def = CORBA::IDLType::_nil (); - - CORBA::TypeCode_ptr foo_tc = orb->create_struct_tc ("IDL:foo:1.0", + label_value = 4; + foo_members[1].label <<= label_value; + + foo_members[2].name = CORBA::string_dup ("foo_str_member"); + foo_members[2].type = CORBA::TypeCode::_duplicate (CORBA::_tc_string); + foo_members[2].type_def = CORBA::IDLType::_nil (); + label_value = -1; + foo_members[2].label <<= label_value; + + // The default member. + foo_members[3].name = CORBA::string_dup ("foo_iface_member"); + foo_members[3].type = CORBA::TypeCode::_duplicate (iface_tc.in ()); + foo_members[3].type_def = CORBA::IDLType::_nil (); + CORBA::Octet default_label_value = 0; + foo_members[3].label <<= CORBA::Any::from_octet (default_label_value); + + // The last member is the same type as the previous one, but has + // a different name. + foo_members[4].name = CORBA::string_dup ("foo_iface_member2"); + foo_members[4].type = CORBA::TypeCode::_duplicate (iface_tc.in ()); + foo_members[4].type_def = CORBA::IDLType::_nil (); + label_value = 0; + foo_members[4].label <<= label_value; + + CORBA::TypeCode_ptr foo_tc = orb->create_union_tc ("IDL:foo:1.0", "foo", + CORBA::_tc_short, foo_members, ACE_TRY_ENV); ACE_TRY_CHECK; + length = 2; + CORBA::StructMemberSeq bar_members (length); bar_members.length (length); diff --git a/TAO/examples/TypeCode_Creation/test.idl b/TAO/examples/TypeCode_Creation/test.idl index 2ad83b62f14..5633d769d46 100644 --- a/TAO/examples/TypeCode_Creation/test.idl +++ b/TAO/examples/TypeCode_Creation/test.idl @@ -10,10 +10,13 @@ interface iface {}; -struct foo +union foo switch (short) { - string foo_str_member; - iface foo_iface_member; + case -3: + case 4: + case -1: string foo_str_member; + default: iface foo_iface_member; + case 0: iface foo_iface_member2; }; struct bar diff --git a/TAO/orbsvcs/IFR_Service/AttributeDef_i.cpp b/TAO/orbsvcs/IFR_Service/AttributeDef_i.cpp index c7d4f41c91e..790b8a069a5 100644 --- a/TAO/orbsvcs/IFR_Service/AttributeDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/AttributeDef_i.cpp @@ -133,7 +133,7 @@ TAO_AttributeDef_i::type_def_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (CORBA_IDLType::_nil ()); CORBA_IDLType_var retval = CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (CORBA_IDLType::_nil ()); return retval._retn (); @@ -486,7 +486,7 @@ TAO_AttributeDef_i::get_exceptions (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[i] = CORBA_ExceptionDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); } @@ -563,7 +563,7 @@ TAO_AttributeDef_i::put_exceptions (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[i] = CORBA_ExceptionDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); } diff --git a/TAO/orbsvcs/IFR_Service/ConstantDef_i.cpp b/TAO/orbsvcs/IFR_Service/ConstantDef_i.cpp index 8aa673eadd7..f2b9bb6ad69 100644 --- a/TAO/orbsvcs/IFR_Service/ConstantDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/ConstantDef_i.cpp @@ -158,7 +158,7 @@ TAO_ConstantDef_i::type_def_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (CORBA_IDLType::_nil ()); return CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } void diff --git a/TAO/orbsvcs/IFR_Service/Contained_i.cpp b/TAO/orbsvcs/IFR_Service/Contained_i.cpp index f60be2f5df2..1417f706ea3 100644 --- a/TAO/orbsvcs/IFR_Service/Contained_i.cpp +++ b/TAO/orbsvcs/IFR_Service/Contained_i.cpp @@ -319,7 +319,7 @@ TAO_Contained_i::defined_in_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (CORBA_Container::_nil ()); CORBA_Container_var retval = CORBA_Container::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (CORBA_Container::_nil ()); return retval._retn (); diff --git a/TAO/orbsvcs/IFR_Service/Container_i.cpp b/TAO/orbsvcs/IFR_Service/Container_i.cpp index 0d72676fb29..93fa3561470 100644 --- a/TAO/orbsvcs/IFR_Service/Container_i.cpp +++ b/TAO/orbsvcs/IFR_Service/Container_i.cpp @@ -382,7 +382,7 @@ TAO_Container_i::lookup_i (const char *search_name, ACE_CHECK_RETURN (CORBA_Contained::_nil ()); return CORBA_Contained::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_ContainedSeq * @@ -516,7 +516,7 @@ TAO_Container_i::contents_i (CORBA::DefinitionKind limit_type, CORBA_Contained_var next_cont = CORBA_Contained::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); retval[j] = next_cont._retn (); @@ -588,7 +588,7 @@ TAO_Container_i::lookup_name_i (const char *search_name, CORBA_Contained_var next_cont = CORBA_Contained::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); retval[i] = next_cont._retn (); @@ -756,7 +756,7 @@ TAO_Container_i::create_module_i (const char *id, ACE_CHECK_RETURN (CORBA_ModuleDef::_nil ()); return CORBA_ModuleDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_ConstantDef_ptr @@ -873,7 +873,7 @@ TAO_Container_i::create_constant_i (const char *id, ACE_CHECK_RETURN (CORBA_ConstantDef::_nil ()); return CORBA_ConstantDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_StructDef_ptr @@ -993,7 +993,7 @@ TAO_Container_i::create_struct_i (const char *id, ACE_CHECK_RETURN (CORBA_StructDef::_nil ()); return CORBA_StructDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_UnionDef_ptr @@ -1133,7 +1133,7 @@ TAO_Container_i::create_union_i (const char *id, ACE_CHECK_RETURN (CORBA_UnionDef::_nil ()); return CORBA_UnionDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_EnumDef_ptr @@ -1234,7 +1234,7 @@ TAO_Container_i::create_enum_i (const char *id, ACE_CHECK_RETURN (CORBA_EnumDef::_nil ()); return CORBA_EnumDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_AliasDef_ptr @@ -1315,7 +1315,7 @@ TAO_Container_i::create_alias_i (const char *id, ACE_CHECK_RETURN (CORBA_AliasDef::_nil ()); return CORBA_AliasDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_InterfaceDef_ptr @@ -1414,7 +1414,7 @@ TAO_Container_i::create_interface_i (const char *id, ACE_CHECK_RETURN (CORBA_InterfaceDef::_nil ()); return CORBA_InterfaceDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_ValueDef_ptr @@ -1542,7 +1542,7 @@ TAO_Container_i::create_value_box_i (const char *id, ACE_CHECK_RETURN (CORBA_ValueBoxDef::_nil ()); return CORBA_ValueBoxDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_ExceptionDef_ptr @@ -1649,7 +1649,7 @@ TAO_Container_i::create_exception_i (const char *id, ACE_CHECK_RETURN (CORBA_ExceptionDef::_nil ()); return CORBA_ExceptionDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_NativeDef_ptr @@ -1714,7 +1714,7 @@ TAO_Container_i::create_native_i (const char *id, ACE_CHECK_RETURN (CORBA_NativeDef::_nil ()); return CORBA_NativeDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_AbstractInterfaceDef_ptr @@ -1819,7 +1819,7 @@ TAO_Container_i::create_abstract_interface_i ( ACE_CHECK_RETURN (CORBA_AbstractInterfaceDef::_nil ()); return CORBA_AbstractInterfaceDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_LocalInterfaceDef_ptr @@ -1922,7 +1922,7 @@ TAO_Container_i::create_local_interface_i ( ACE_CHECK_RETURN (CORBA_LocalInterfaceDef::_nil ()); return CORBA_LocalInterfaceDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA::Boolean diff --git a/TAO/orbsvcs/IFR_Service/ExceptionDef_i.cpp b/TAO/orbsvcs/IFR_Service/ExceptionDef_i.cpp index 2f79e6f6d83..cb6db156611 100644 --- a/TAO/orbsvcs/IFR_Service/ExceptionDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/ExceptionDef_i.cpp @@ -244,7 +244,7 @@ TAO_ExceptionDef_i::members_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[k].type_def = CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); this->repo_->config ()->expand_path (this->repo_->root_key (), diff --git a/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp b/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp index 03f3f0eb849..346c0932bdb 100644 --- a/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp @@ -224,7 +224,7 @@ TAO_InterfaceDef_i::base_interfaces_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[i] = CORBA_InterfaceDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); } @@ -739,7 +739,7 @@ TAO_InterfaceDef_i::create_attribute_i ( CORBA_AttributeDef_var retval = CORBA_AttributeDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); return retval._retn (); @@ -939,7 +939,7 @@ TAO_InterfaceDef_i::create_operation_i (const char *id, CORBA_OperationDef_var retval = CORBA_OperationDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); return retval._retn (); diff --git a/TAO/orbsvcs/IFR_Service/OperationDef_i.cpp b/TAO/orbsvcs/IFR_Service/OperationDef_i.cpp index f3db32824e9..80c674f66f5 100644 --- a/TAO/orbsvcs/IFR_Service/OperationDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/OperationDef_i.cpp @@ -133,7 +133,7 @@ TAO_OperationDef_i::result_def_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (CORBA_IDLType::_nil ()); return CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } void @@ -281,7 +281,7 @@ TAO_OperationDef_i::params_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[i].type_def = CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); } @@ -596,7 +596,7 @@ TAO_OperationDef_i::exceptions_i (CORBA::Environment &ACE_TRY_ENV ) ACE_CHECK_RETURN (0); retval[i] = CORBA_ExceptionDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); } diff --git a/TAO/orbsvcs/IFR_Service/Repository_i.cpp b/TAO/orbsvcs/IFR_Service/Repository_i.cpp index d590e317b47..74473273697 100644 --- a/TAO/orbsvcs/IFR_Service/Repository_i.cpp +++ b/TAO/orbsvcs/IFR_Service/Repository_i.cpp @@ -414,7 +414,7 @@ TAO_Repository_i::get_primitive (CORBA::PrimitiveKind kind, ACE_CHECK_RETURN (CORBA_PrimitiveDef::_nil ()); return CORBA_PrimitiveDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_StringDef_ptr @@ -473,7 +473,7 @@ TAO_Repository_i::create_string_i (CORBA::ULong bound, ACE_CHECK_RETURN (CORBA_StringDef::_nil ()); return CORBA_StringDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_WstringDef_ptr @@ -532,7 +532,7 @@ TAO_Repository_i::create_wstring_i (CORBA::ULong bound, ACE_CHECK_RETURN (CORBA_WstringDef::_nil ()); return CORBA_WstringDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_SequenceDef_ptr @@ -610,7 +610,7 @@ TAO_Repository_i::create_sequence_i (CORBA::ULong bound, ACE_CHECK_RETURN (CORBA_SequenceDef::_nil ()); return CORBA_SequenceDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_ArrayDef_ptr @@ -688,7 +688,7 @@ TAO_Repository_i::create_array_i (CORBA::ULong length, ACE_CHECK_RETURN (CORBA_ArrayDef::_nil ()); return CORBA_ArrayDef::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); } CORBA_FixedDef_ptr diff --git a/TAO/orbsvcs/IFR_Service/UnionDef_i.cpp b/TAO/orbsvcs/IFR_Service/UnionDef_i.cpp index b7d559d5b51..c1aa94e2243 100644 --- a/TAO/orbsvcs/IFR_Service/UnionDef_i.cpp +++ b/TAO/orbsvcs/IFR_Service/UnionDef_i.cpp @@ -307,7 +307,7 @@ TAO_UnionDef_i::members_i (CORBA::Environment &ACE_TRY_ENV) ACE_CHECK_RETURN (0); retval[k].type_def = CORBA_IDLType::_narrow (obj.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK_RETURN (0); impl = diff --git a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor.cpp b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor.cpp index bd7d334fa8b..a8765ff316d 100644 --- a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor.cpp +++ b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor.cpp @@ -434,7 +434,7 @@ ifr_adding_visitor::visit_interface (AST_Interface *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK return 0; @@ -521,7 +521,7 @@ ifr_adding_visitor::visit_interface (AST_Interface *node) { this->ir_current_ = CORBA_InterfaceDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; if (CORBA::is_nil (this->ir_current_.in ())) @@ -619,7 +619,7 @@ ifr_adding_visitor::visit_interface_fwd (AST_InterfaceFwd *node) // the current IR object holder. this->ir_current_ = CORBA_InterfaceDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this interface's repo id from already being @@ -706,7 +706,7 @@ ifr_adding_visitor::visit_structure (AST_Structure *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this struct's repo id from already being @@ -818,7 +818,7 @@ ifr_adding_visitor::visit_enum (AST_Enum *node) // the current IR object holder. this->ir_current_ = CORBA_EnumDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this enum's repo id from already being @@ -929,7 +929,7 @@ ifr_adding_visitor::visit_attribute (AST_Attribute *node) this->ir_current_ = CORBA_IDLType::_narrow (prev_type_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; } else @@ -956,7 +956,9 @@ ifr_adding_visitor::visit_attribute (AST_Attribute *node) if (be_global->ifr_scopes ().top (current_scope) == 0) { CORBA_InterfaceDef_var iface = - CORBA_InterfaceDef::_narrow (current_scope); + CORBA_InterfaceDef::_narrow (current_scope, + ACE_TRY_ENV); + ACE_TRY_CHECK; new_def = iface->create_attribute (node->repoID (), @@ -982,7 +984,7 @@ ifr_adding_visitor::visit_attribute (AST_Attribute *node) { new_def = CORBA_AttributeDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this attribute's repo id from already being @@ -1046,7 +1048,7 @@ ifr_adding_visitor::visit_union (AST_Union *node) { this->ir_current_ = CORBA_UnionDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this union's repo id from already being @@ -1135,7 +1137,7 @@ ifr_adding_visitor::visit_constant (AST_Constant *node) { CORBA_ConstantDef_var const_def = CORBA_ConstantDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; if (CORBA::is_nil (const_def.in ())) @@ -1362,7 +1364,7 @@ ifr_adding_visitor::visit_typedef (AST_Typedef *node) // the current IR object holder. this->ir_current_ = CORBA_TypedefDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this typedef's repo id from already being @@ -1405,7 +1407,7 @@ ifr_adding_visitor::visit_root (AST_Root *node) { CORBA_Container_var new_scope = CORBA_Container::_narrow (be_global->repository (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; if (be_global->ifr_scopes ().push (new_scope.in ()) != 0) @@ -1496,7 +1498,7 @@ ifr_adding_visitor::visit_native (AST_Native *node) { this->ir_current_ = CORBA_NativeDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this native type's repo id from already being @@ -1748,7 +1750,7 @@ ifr_adding_visitor::element_type (AST_Type *base_type, } this->ir_current_ = CORBA_IDLType::_narrow (contained.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_CHECK; } } diff --git a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_exception.cpp b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_exception.cpp index aa5b2d02444..7c6516ad8fe 100644 --- a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_exception.cpp +++ b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_exception.cpp @@ -80,7 +80,7 @@ ifr_adding_visitor_exception::visit_scope (UTL_Scope *node) // IfR method create_exception does not use this - it just needs // to be non-null for marshaling. this->members_[i].type = - CORBA::TypeCode::_duplicate (CORBA::_tc_null); + CORBA::TypeCode::_duplicate (CORBA::_tc_void); this->members_[i].type_def = CORBA_IDLType::_duplicate (this->ir_current_.in ()); @@ -116,7 +116,7 @@ ifr_adding_visitor_exception::visit_structure (AST_Structure *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing ExceptionDef hasn't been created @@ -134,7 +134,7 @@ ifr_adding_visitor_exception::visit_structure (AST_Structure *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this struct's repo id from already being @@ -187,7 +187,7 @@ ifr_adding_visitor_exception::visit_exception (AST_Exception *node) { CORBA_ExceptionDef_var except_def = CORBA_ExceptionDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this exception's repo id from already being @@ -255,7 +255,7 @@ ifr_adding_visitor_exception::visit_exception (AST_Exception *node) CORBA_Container_var new_container = CORBA_Container::_narrow (new_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; for (size_t i = 0; i < size; ++i) @@ -336,7 +336,7 @@ ifr_adding_visitor_exception::visit_enum (AST_Enum *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (this->ir_current_.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; this->move_queue_.enqueue_tail (tmp); @@ -347,7 +347,7 @@ ifr_adding_visitor_exception::visit_enum (AST_Enum *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this enum's repo id from already being @@ -412,7 +412,7 @@ ifr_adding_visitor_exception::visit_union (AST_Union *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing ExceptionDef hasn't been created @@ -430,7 +430,7 @@ ifr_adding_visitor_exception::visit_union (AST_Union *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this union's repo id from already being diff --git a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_operation.cpp b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_operation.cpp index 275f567fdda..0e64701a78c 100644 --- a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_operation.cpp +++ b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_operation.cpp @@ -91,7 +91,7 @@ ifr_adding_visitor_operation::visit_operation (AST_Operation *node) ACE_TRY_CHECK; exceptions[i++] = CORBA_ExceptionDef::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; ex_iter.next (); @@ -146,7 +146,7 @@ ifr_adding_visitor_operation::visit_operation (AST_Operation *node) ACE_TRY_CHECK; this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; } else @@ -180,7 +180,7 @@ ifr_adding_visitor_operation::visit_operation (AST_Operation *node) { CORBA_InterfaceDef_var iface = CORBA_InterfaceDef::_narrow (current_scope, - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; CORBA_OperationDef_var new_def = @@ -247,7 +247,7 @@ ifr_adding_visitor_operation::visit_argument (AST_Argument *node) ACE_TRY_CHECK; this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; } else diff --git a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_structure.cpp b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_structure.cpp index be05c04ea5c..775279b15cf 100644 --- a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_structure.cpp +++ b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_structure.cpp @@ -97,7 +97,7 @@ ifr_adding_visitor_structure::visit_scope (UTL_Scope *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; this->move_queue_.enqueue_tail (tmp); @@ -106,7 +106,7 @@ ifr_adding_visitor_structure::visit_scope (UTL_Scope *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; } } @@ -131,7 +131,7 @@ ifr_adding_visitor_structure::visit_scope (UTL_Scope *node) // IfR method create_struct does not use this - it just needs // to be non-null for marshaling. this->members_[i].type = - CORBA::TypeCode::_duplicate (CORBA::_tc_null); + CORBA::TypeCode::_duplicate (CORBA::_tc_void); this->members_[i].type_def = CORBA_IDLType::_duplicate (this->ir_current_.in ()); @@ -223,7 +223,7 @@ ifr_adding_visitor_structure::visit_structure (AST_Structure *node) CORBA_Container_var new_container = CORBA_Container::_narrow (this->ir_current_.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; for (size_t i = 0; i < size; ++i) @@ -249,7 +249,7 @@ ifr_adding_visitor_structure::visit_structure (AST_Structure *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this struct's repo id from already being @@ -333,7 +333,7 @@ ifr_adding_visitor_structure::visit_enum (AST_Enum *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (this->ir_current_.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing StructDef hasn't been created @@ -348,7 +348,7 @@ ifr_adding_visitor_structure::visit_enum (AST_Enum *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this enum's repo id from already being @@ -413,7 +413,7 @@ ifr_adding_visitor_structure::visit_union (AST_Union *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing StructDef hasn't been created @@ -431,7 +431,7 @@ ifr_adding_visitor_structure::visit_union (AST_Union *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this union's repo id from already being diff --git a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_union.cpp b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_union.cpp index f64b49000f6..55583669c89 100644 --- a/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_union.cpp +++ b/TAO/orbsvcs/IFR_Service/ifr_adding_visitor_union.cpp @@ -100,7 +100,7 @@ ifr_adding_visitor_union::visit_scope (UTL_Scope *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; this->move_queue_.enqueue_tail (tmp); @@ -109,7 +109,7 @@ ifr_adding_visitor_union::visit_scope (UTL_Scope *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; } } @@ -201,7 +201,7 @@ ifr_adding_visitor_union::visit_scope (UTL_Scope *node) // IfR method create_union does not use this - it just needs // to be non-null for marshaling. this->members_[index].type = - CORBA::TypeCode::_duplicate (CORBA::_tc_null); + CORBA::TypeCode::_duplicate (CORBA::_tc_void); this->members_[index++].type_def = CORBA_IDLType::_duplicate (this->ir_current_.in ()); @@ -249,7 +249,7 @@ ifr_adding_visitor_union::visit_structure (AST_Structure *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (visitor.ir_current (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing UnionDef hasn't been created @@ -267,7 +267,7 @@ ifr_adding_visitor_union::visit_structure (AST_Structure *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this struct's repo id from already being @@ -349,7 +349,7 @@ ifr_adding_visitor_union::visit_enum (AST_Enum *node) CORBA_Contained_ptr tmp = CORBA_Contained::_narrow (this->ir_current_.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Since the enclosing UnionDef hasn't been created @@ -364,7 +364,7 @@ ifr_adding_visitor_union::visit_enum (AST_Enum *node) // the current IR object holder. this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this enum's repo id from already being @@ -442,7 +442,7 @@ ifr_adding_visitor_union::visit_union (AST_Union *node) CORBA_IDLType_var idl_def = CORBA_IDLType::_narrow (disc_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; this->disc_tc_ = idl_def->type (ACE_TRY_ENV); @@ -521,7 +521,7 @@ ifr_adding_visitor_union::visit_union (AST_Union *node) CORBA_Container_var new_container = CORBA_Container::_narrow (this->ir_current_.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; for (size_t i = 0; i < size; ++i) @@ -547,7 +547,7 @@ ifr_adding_visitor_union::visit_union (AST_Union *node) { this->ir_current_ = CORBA_IDLType::_narrow (prev_def.in (), - ACE_TRY_ENV); + ACE_TRY_ENV); ACE_TRY_CHECK; // Nothing prevents this union's repo id from already being diff --git a/TAO/orbsvcs/tests/InterfaceRepo/IFR_Test/Admin_Client.cpp b/TAO/orbsvcs/tests/InterfaceRepo/IFR_Test/Admin_Client.cpp index 65da895a675..3489ececfa3 100644 --- a/TAO/orbsvcs/tests/InterfaceRepo/IFR_Test/Admin_Client.cpp +++ b/TAO/orbsvcs/tests/InterfaceRepo/IFR_Test/Admin_Client.cpp @@ -871,15 +871,13 @@ Admin_Client::struct_test (CORBA::Environment &ACE_TRY_ENV) members[0].type_def = this->repo_->get_primitive (CORBA::pk_string, ACE_TRY_ENV); ACE_CHECK; - members[0].type = members[0].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); members[1].name = CORBA::string_dup ("bd_string"); members[1].type_def = this->repo_->create_string (5, ACE_TRY_ENV); ACE_CHECK; - members[1].type = members[1].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + members[1].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); CORBA::EnumMemberSeq e_members (2); e_members.length (2); @@ -895,8 +893,7 @@ Admin_Client::struct_test (CORBA::Environment &ACE_TRY_ENV) ACE_TRY_ENV); ACE_CHECK; members[2].type_def = CORBA::EnumDef::_duplicate (e_var.in ()); - members[2].type = members[2].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + members[2].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); CORBA::StructDef_var svar = this->repo_->create_struct ("IDL:my_struct:1.0", "my_struct", @@ -968,16 +965,14 @@ Admin_Client::struct_test (CORBA::Environment &ACE_TRY_ENV) members[0].type_def = this->repo_->get_primitive (CORBA::pk_long, ACE_TRY_ENV); ACE_CHECK; - members[0].type = members[0].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); members[1].name = CORBA::string_dup ("array_mem"); members[1].type_def = this->repo_->create_array (5, members[0].type_def.in (), ACE_TRY_ENV); ACE_CHECK; - members[1].type = members[1].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + members[1].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); svar->members (members, ACE_TRY_ENV); @@ -1288,8 +1283,7 @@ Admin_Client::union_test (CORBA::Environment &ACE_TRY_ENV) s_members[0].type_def = this->repo_->create_string (6, ACE_TRY_ENV); ACE_CHECK; - s_members[0].type = s_members[0].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + s_members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); CORBA::StructDef_var s_var = this->repo_->create_struct ("IDL:struct_in_union:1.0", @@ -1306,8 +1300,7 @@ Admin_Client::union_test (CORBA::Environment &ACE_TRY_ENV) u_members[0].type_def = this->repo_->get_primitive (CORBA::pk_long, ACE_TRY_ENV); ACE_CHECK; - u_members[0].type = u_members[0].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + u_members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); CORBA::TypeCode_var d_type = d_var->type (ACE_TRY_ENV); ACE_CHECK; TAO_OutputCDR maker2; @@ -1322,8 +1315,7 @@ Admin_Client::union_test (CORBA::Environment &ACE_TRY_ENV) u_members[1].type_def = this->repo_->get_primitive (CORBA::pk_long, ACE_TRY_ENV); ACE_CHECK; - u_members[1].type = u_members[1].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + u_members[1].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); TAO_OutputCDR maker0; maker0.write_ulong (2); // TWO CORBA::Any any0 (d_type.in (), @@ -1334,8 +1326,8 @@ Admin_Client::union_test (CORBA::Environment &ACE_TRY_ENV) u_members[2].name = CORBA::string_dup ("structval"); u_members[2].type_def = CORBA::StructDef::_duplicate (s_var.in ()); - u_members[2].type = u_members[2].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + u_members[2].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); + TAO_OutputCDR maker1; maker1.write_ulong (0); // ZERO CORBA::Any any1 (d_type.in (), @@ -1348,8 +1340,7 @@ Admin_Client::union_test (CORBA::Environment &ACE_TRY_ENV) u_members[3].type_def = this->repo_->create_string (17, ACE_TRY_ENV); ACE_CHECK; - u_members[3].type = u_members[3].type_def->type (ACE_TRY_ENV); - ACE_CHECK; + u_members[3].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); u_members[3].label <<= CORBA::Any::from_octet (0); // default case (ONE) CORBA::UnionDef_var u_var = this->repo_->create_union ("IDL:my_union:1.0", diff --git a/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.cpp b/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.cpp index 4ba813fe871..60cdf6c13b5 100644 --- a/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.cpp +++ b/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.cpp @@ -59,37 +59,11 @@ TAO_TypeCodeFactory_i::create_struct_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_OutputCDR cdr; - - cdr << TAO_ENCAP_BYTE_ORDER; - - cdr << id; - - cdr << name; - - // Number of members.. - CORBA::ULong len = members.length (); - cdr << len; - - for (CORBA::ULong index = 0; index < len; ++index) - { - cdr << members[index].name; - - cdr << members[index].type.in (); - } - - CORBA::TypeCode_ptr struct_typecode = - CORBA::TypeCode::_nil (); - ACE_NEW_THROW_EX (struct_typecode, - CORBA_TypeCode (CORBA::tk_struct, - cdr.total_length (), - cdr.buffer (), - 0, - 0), - CORBA::NO_MEMORY ()); - ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); - - return struct_typecode; + return this->struct_except_tc_common (id, + name, + members, + CORBA::tk_struct, + ACE_TRY_ENV); } CORBA::TypeCode_ptr @@ -102,54 +76,179 @@ TAO_TypeCodeFactory_i::create_union_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_OutputCDR cdr; - - cdr << TAO_ENCAP_BYTE_ORDER; + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } - cdr << id; + if (id != 0 && !this->valid_id (id)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } - cdr << name; + CORBA::Boolean good_disc_type = + this->valid_disc_type (discriminator_type, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); - cdr << discriminator_type; + if (!good_disc_type) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (20, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } CORBA::ULong len = members.length (); CORBA::ULong dups = 0; + CORBA::ULong raw_default_index = ACE_UINT32_MAX; CORBA::Long default_index = -1; - CORBA::Long raw_default_index = -1; CORBA::Octet value = ACE_OCTET_MAX; - + CORBA::TypeCode_ptr tc_holder = CORBA::TypeCode::_nil (); + CORBA::Boolean valid_member = 1; + const char *member_name = 0; + ACE_Hash_Map_Manager<ACE_CString, int, ACE_Null_Mutex> map; + + // No getting around iterating over the members twice. We have + // to do it once *before* the overall length is written to the + // CDR stream, to know by how much, if any, the number of members + // differs from the number of labels. for (CORBA::ULong i = 0; i < len; ++i) { + member_name = members[i].name; + int trybind_status = 0; + if (i > 0) { // Is this a duplicate case label? If so, we have to adjust // the 'length' we encode - a member gets encoded only once. - if (ACE_OS::strcmp (members[i].name, + if (ACE_OS::strcmp (member_name, members[i - 1].name) == 0) { - ++dups; + CORBA::Boolean equiv = + members[i].type.in ()->equivalent (members[i - 1].type.in (), + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + // If adjacent names are the same and their types are equivalent, + // then they are duplicate case labels. If the types are not + // equivalent, then they are separate members with the same name, + // which is not allowed. + if (equiv) + { + ++dups; + } + else + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (17, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + } + else + { + // Only if we do not have a duplicate case label do we + // check for a duplicate member name. + ACE_CString ext_id (member_name); + int int_id = 0; + + trybind_status = map.trybind (ext_id, int_id); } } + else + { + ACE_CString ext_id (member_name); + int int_id = 0; + + trybind_status = map.trybind (ext_id, int_id); + } + + // Duplicate member name? + if (trybind_status != 0) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (17, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + tc_holder = members[i].type.in (); + + // Valid member type? + valid_member = this->valid_content_type (tc_holder, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_member) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } // Reset the default index, if we have a default case label. if ((members[i].label >>= CORBA::Any::to_octet (value)) == 1) { if (value == 0) { - raw_default_index = ACE_static_cast (CORBA::Long, i); + raw_default_index = i; // Only the multiple labels that come before the // default label affect its adjusted value. default_index = ACE_static_cast (CORBA::Long, i - dups); } } + else + { + // Else check that the label type is equivalent to the + // given discriminator type. + CORBA::TypeCode_var tmp = members[i].label.type (); + + CORBA::Boolean equiv = + discriminator_type->equivalent (tmp.in (), + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!equiv) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (19, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + } + } + + CORBA::Boolean unique_labels = + this->unique_label_values (members, + discriminator_type, + raw_default_index, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!unique_labels) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (18, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); } + TAO_OutputCDR cdr; + + cdr << TAO_ENCAP_BYTE_ORDER; + + cdr << id; + + cdr << name; + + cdr << discriminator_type; + cdr << default_index; cdr << len - dups; - for (CORBA::ULong index = 0; index < len; index++) + for (CORBA::ULong index = 0; index < len; ++index) { if (index > 0) { @@ -163,8 +262,7 @@ TAO_TypeCodeFactory_i::create_union_tc ( } } - if (raw_default_index >= 0 - && index == ACE_static_cast (CORBA::ULong, raw_default_index)) + if (raw_default_index >= 0 && index == raw_default_index) { // This is the default label - we have to find a legal value. CORBA::TCKind kind = discriminator_type->kind (ACE_TRY_ENV); @@ -218,6 +316,20 @@ TAO_TypeCodeFactory_i::create_enum_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + if (id != 0 && !this->valid_id (id)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -230,8 +342,21 @@ TAO_TypeCodeFactory_i::create_enum_tc ( cdr << len; + ACE_Hash_Map_Manager<ACE_CString, int, ACE_Null_Mutex> map; + for (CORBA::ULong index = 0; index < len; ++index) { + ACE_CString ext_id (members[index]); + int int_id = 0; + + // Is there a duplicate member name? + if (map.trybind (ext_id, int_id) != 0) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (17, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + cdr << members[index]; } @@ -258,6 +383,32 @@ TAO_TypeCodeFactory_i::create_alias_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + if (id != 0 && !this->valid_id (id)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + CORBA::Boolean valid_content = + this->valid_content_type (original_type, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_content) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -292,40 +443,11 @@ TAO_TypeCodeFactory_i::create_exception_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { - TAO_OutputCDR cdr; - - cdr << TAO_ENCAP_BYTE_ORDER; - - cdr << id; - - cdr << name; - - // Number of members.. - CORBA::ULong len = members.length (); - cdr << len; - - for (CORBA::ULong index = 0; index < len; ++index) - { - // Get the first member which is a string.. - CORBA_StructMember struct_member = members[index]; - - cdr << struct_member.name; - - cdr << struct_member.type.in (); - } - - CORBA::TypeCode_ptr exception_typecode = - CORBA::TypeCode::_nil (); - ACE_NEW_THROW_EX (exception_typecode, - CORBA_TypeCode (CORBA::tk_except, - cdr.total_length (), - cdr.buffer (), - 0, - 0), - CORBA::NO_MEMORY ()); - ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); - - return exception_typecode; + return this->struct_except_tc_common (id, + name, + members, + CORBA::tk_except, + ACE_TRY_ENV); } CORBA::TypeCode_ptr @@ -416,6 +538,18 @@ TAO_TypeCodeFactory_i::create_sequence_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + CORBA::Boolean valid_element = + this->valid_content_type (element_type, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_element) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -446,6 +580,18 @@ TAO_TypeCodeFactory_i::create_array_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + CORBA::Boolean valid_element = + this->valid_content_type (element_type, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_element) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -492,6 +638,33 @@ TAO_TypeCodeFactory_i::create_value_box_tc ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + // Repo id may not be null for valueboxtype. + if (id == 0 || !this->valid_id (id)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + CORBA::Boolean valid_content = + this->valid_content_type (boxed_type, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_content) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -636,7 +809,6 @@ TAO_TypeCodeFactory_i::compute_default_label ( #endif /* ACE_LACKS_LONGLONG_T */ dv.enum_val = 0; - CORBA::ULong len = members.length (); int success = 0; @@ -789,6 +961,21 @@ TAO_TypeCodeFactory_i::create_tc_common ( ) ACE_THROW_SPEC ((CORBA::SystemException)) { + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + // Repo id may not be null for object or native type. + if (id == 0 || !this->valid_id (id)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + TAO_OutputCDR cdr; cdr << TAO_ENCAP_BYTE_ORDER; @@ -812,3 +999,381 @@ TAO_TypeCodeFactory_i::create_tc_common ( return result; } +CORBA::TypeCode_ptr +TAO_TypeCodeFactory_i::struct_except_tc_common ( + const char *id, + const char *name, + const CORBA_StructMemberSeq &members, + CORBA::TCKind kind, + CORBA::Environment &ACE_TRY_ENV + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (name != 0 && !this->valid_name (name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + // Repo id may not be null for an exception. + if ((id == 0 && kind == CORBA::tk_except) + || (id != 0 && !this->valid_id (id))) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (16, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + TAO_OutputCDR cdr; + + cdr << TAO_ENCAP_BYTE_ORDER; + + cdr << id; + + cdr << name; + + // Number of members.. + CORBA::ULong len = members.length (); + + cdr << len; + + CORBA::TypeCode_ptr tc_holder = CORBA::TypeCode::_nil (); + CORBA::Boolean valid_member = 1; + const char *member_name = 0; + ACE_Hash_Map_Manager<ACE_CString, int, ACE_Null_Mutex> map; + + for (CORBA::ULong index = 0; index < len; ++index) + { + // Valid member type? + tc_holder = members[index].type.in (); + + valid_member = this->valid_content_type (tc_holder, + ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + if (!valid_member) + { + ACE_THROW_RETURN (CORBA::BAD_TYPECODE (2, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + member_name = members[index].name; + + if (member_name == 0 || !this->valid_name (member_name)) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (15, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + ACE_CString ext_id (member_name); + int int_id = 0; + + // Is there a duplicate member name? + if (map.trybind (ext_id, int_id) != 0) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (17, + CORBA::COMPLETED_NO), + CORBA::TypeCode::_nil ()); + } + + cdr << member_name; + + cdr << tc_holder; + } + + CORBA::TypeCode_ptr new_typecode = + CORBA::TypeCode::_nil (); + ACE_NEW_THROW_EX (new_typecode, + CORBA_TypeCode (kind, + cdr.total_length (), + cdr.buffer (), + 0, + 0), + CORBA::NO_MEMORY ()); + ACE_CHECK_RETURN (CORBA::TypeCode::_nil ()); + + return new_typecode; +} + +CORBA::Boolean +TAO_TypeCodeFactory_i::valid_name (const char *name) +{ + if (!isalpha (*name)) + { + return 0; + } + + const char *tmp = name + 1; + + for (; *tmp; ++tmp) + { + if (isalnum (*tmp) || *tmp == '_') + { + continue; + } + else + { + return 0; + } + } + + return 1; +} + +CORBA::Boolean +TAO_TypeCodeFactory_i::valid_id (const char *id) +{ + ACE_CString safety (id); + + int pos = safety.find (':'); + + if (pos == ACE_CString::npos) + { + return 0; + } + + ACE_CString format (safety.substr (0, pos)); + + if (format == "IDL" + || format == "RMI" + || format == "DCE" + || format == "LOCAL") + { + return 1; + } + + return 0; +} + +CORBA::Boolean +TAO_TypeCodeFactory_i::valid_content_type (CORBA::TypeCode_ptr tc, + CORBA::Environment &ACE_TRY_ENV) +{ + CORBA::TCKind kind = tc->kind (ACE_TRY_ENV); + ACE_CHECK_RETURN (0); + + if (kind == CORBA::tk_null + || kind == CORBA::tk_void + || kind == CORBA::tk_except) + { + return 0; + } + + return 1; +} + +CORBA::Boolean +TAO_TypeCodeFactory_i::unique_label_values (const CORBA_UnionMemberSeq &members, + CORBA::TypeCode_ptr disc_tc, + CORBA::ULong default_index_slot, + CORBA::Environment &ACE_TRY_ENV) +{ + CORBA::TCKind disc_kind = disc_tc->kind (ACE_TRY_ENV); + ACE_CHECK_RETURN (0); + + CORBA::ULong length = members.length (); + + // We have already checked for valid discriminator type + // and valid label types, so we won't check for any of that here. + + struct label_types + { + CORBA::Char char_val; + CORBA::WChar wchar_val; + CORBA::Boolean bool_val; + CORBA::Short short_val; + CORBA::UShort ushort_val; + CORBA::Long long_val; + CORBA::ULong ulong_val; + CORBA::ULong enum_val; + // TODO - handle (u)longlong types + } s; + + s.char_val = 0; + s.wchar_val = 0; + s.bool_val = 0; + s.short_val = 0; + s.ushort_val = 0; + s.long_val = 0; + s.ulong_val = 0; + s.enum_val = 0; + + // Two cases - one for signed and one for unsigned discriminator types. + if (disc_kind == CORBA::tk_long + || disc_kind == CORBA::tk_short) + { + ACE_Bounded_Set<CORBA::Long> checker (length); + + for (CORBA::ULong i = 0; i < length; ++i) + { + if (i == default_index_slot) + { + continue; + } + + switch (disc_kind) + { + case CORBA::tk_long: + members[i].label >>= s.long_val; + + if (checker.insert (s.long_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_short: + members[i].label >>= s.short_val; + + if (checker.insert (s.short_val) != 0) + { + return 0; + } + + break; + default: + break; + } + } + } + else + { + ACE_Bounded_Set<CORBA::ULong> checker (length); + + for (CORBA::ULong i = 0; i < length; ++i) + { + if (i == default_index_slot) + { + continue; + } + + switch (disc_kind) + { + case CORBA::tk_boolean: + members[i].label >>= CORBA::Any::to_boolean (s.bool_val); + + if (checker.insert (s.bool_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_char: + members[i].label >>= CORBA::Any::to_char (s.char_val); + + if (checker.insert (s.char_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_wchar: + members[i].label >>= CORBA::Any::to_wchar (s.wchar_val); + + if (checker.insert (s.wchar_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_ushort: + members[i].label >>= s.ushort_val; + + if (checker.insert (s.short_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_ulong: + members[i].label >>= s.ulong_val; + + if (checker.insert (s.ulong_val) != 0) + { + return 0; + } + + break; + case CORBA::tk_enum: + { + TAO_InputCDR cdr (members[i].label._tao_get_cdr (), + members[i].label._tao_byte_order ()); + cdr.read_ulong (s.enum_val); + + if (checker.insert (s.enum_val) != 0) + { + return 0; + } + + break; + } + default: + break; + } + } + } + + return 1; +} + +CORBA::Boolean +TAO_TypeCodeFactory_i::valid_disc_type (CORBA::TypeCode_ptr tc, + CORBA::Environment &ACE_TRY_ENV) +{ + CORBA::TCKind kind = tc->kind (ACE_TRY_ENV); + ACE_CHECK_RETURN (0); + + if (kind == CORBA::tk_enum + || kind == CORBA::tk_ulong + || kind == CORBA::tk_long + || kind == CORBA::tk_ushort + || kind == CORBA::tk_short + || kind == CORBA::tk_char + || kind == CORBA::tk_wchar + || kind == CORBA::tk_boolean + || kind == CORBA::tk_longlong + || kind == CORBA::tk_ulonglong) + { + return 1; + } + + return 0; +} + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + +template class ACE_Hash_Map_Entry<ACE_CString, int>; +template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Iterator_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; +template class ACE_Equal_To<ACE_CString>; +template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; +template class ACE_Hash<ACE_CString>; +template class ACE_Hash_Map_Manager_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Manager<ACE_CString, int, ACE_Null_Mutex>; +template class ACE_Hash_Map_With_Allocator<ACE_CString, int>; +template class ACE_Bounded_Set<CORBA::Long>; +template class ACE_Bounded_Set<CORBA::ULong>; +template class ACE_Bounded_Set_Iterator<CORBA::Long>; +template class ACE_Bounded_Set_Iterator<CORBA::ULong>; + +#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) + +#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, int> +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> +#pragma instantiate ACE_Equal_To<ACE_CString> +#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash<ACE_CString> +#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, int, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Manager<ACE_CString, int, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_With_Allocator<ACE_CString, int> +#pragma instantiate ACE_Bounded_Set<CORBA::Long> +#pragma instantiate ACE_Bounded_Set<CORBA::ULong> +#pragma instantiate ACE_Bounded_Set_Iterator<CORBA::Long> +#pragma instantiate ACE_Bounded_Set_Iterator<CORBA::ULong> + +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ + diff --git a/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.h b/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.h index f11fe316ac5..13ec6d1d76b 100644 --- a/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.h +++ b/TAO/tao/TypeCodeFactory/TypeCodeFactory_i.h @@ -231,6 +231,30 @@ private: ) ACE_THROW_SPEC ((CORBA::SystemException)); + /// Code for structs and unions is identical except for TCKind. + CORBA::TypeCode_ptr struct_except_tc_common ( + const char *id, + const char *name, + const CORBA_StructMemberSeq &members, + CORBA::TCKind kind, + CORBA::Environment &ACE_TRY_ENV = + TAO_default_environment () + ) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// If any of these fail, we raise a spec-defined minor code + /// of BAD_PARAM or BAD_TYPECODE. + CORBA::Boolean valid_name (const char *name); + CORBA::Boolean valid_id (const char *id); + CORBA::Boolean valid_content_type (CORBA::TypeCode_ptr tc, + CORBA::Environment &ACE_TRY_ENV); + CORBA::Boolean unique_label_values (const CORBA_UnionMemberSeq &members, + CORBA::TypeCode_ptr disc_tc, + CORBA::ULong default_index_slot, + CORBA::Environment &ACE_TRY_ENV); + CORBA::Boolean valid_disc_type (CORBA::TypeCode_ptr tc, + CORBA::Environment &ACE_TRY_ENV); + /// Prohibited TAO_TypeCodeFactory_i (const TAO_TypeCodeFactory_i &src); TAO_TypeCodeFactory_i &operator= (const TAO_TypeCodeFactory_i &src); |