diff options
Diffstat (limited to 'ACE/TAO/examples/TypeCode_Creation/main.cpp')
-rw-r--r-- | ACE/TAO/examples/TypeCode_Creation/main.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/ACE/TAO/examples/TypeCode_Creation/main.cpp b/ACE/TAO/examples/TypeCode_Creation/main.cpp new file mode 100644 index 00000000000..d89a688bec2 --- /dev/null +++ b/ACE/TAO/examples/TypeCode_Creation/main.cpp @@ -0,0 +1,110 @@ +// $Id$ + +#include "testC.h" +#include "tao/IFR_Client/IFR_BasicC.h" +#include "tao/TypeCodeFactory/TypeCodeFactory_Adapter_Impl.h" + +ACE_RCSID(TypeCode_Creation, main, "$Id$") + +int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv); + + CORBA::TypeCode_var iface_tc = + orb->create_interface_tc (CORBA::string_dup ("IDL:iface:1.0"), + CORBA::string_dup ("iface")); + + CORBA::ULong length = 5; + + 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_str_member"); + foo_members[1].type = CORBA::TypeCode::_duplicate (CORBA::_tc_string); + foo_members[1].type_def = CORBA::IDLType::_nil (); + 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); + + length = 2; + + CORBA::StructMemberSeq bar_members (length); + bar_members.length (length); + + bar_members[0].name = CORBA::string_dup ("bar_long_member"); + bar_members[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_long); + + bar_members[0].type_def = CORBA::IDLType::_nil (); + + bar_members[1].name = CORBA::string_dup ("bar_foo_member"); + + bar_members[1].type = foo_tc; + + bar_members[1].type_def = CORBA::IDLType::_nil (); + + CORBA::TypeCode_var bar_tc = orb->create_struct_tc ("IDL:bar:1.0", + "bar", + bar_members); + + // Check for equality with the typecode created by the IDL compiler. + CORBA::Boolean eq = bar_tc->equal (_tc_bar); + + if (!eq) + { + ACE_ERROR_RETURN ((LM_ERROR, + "ORB-created typecode not correct!\n"), + -1); + + } + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("exception:"); + return 1; + } + + return 0; +} + |