Previous Table of Contents Next


9.3 Usage in C++ Language

   9.3.1 Dynamic Creation of CORBA::Any values

   9.3.1.1 Creating an any that contains a struct

   Consider the following IDL definition:

   // IDL

   struct MyStruct { long member1; boolean member2;

   };

   The following example illustrates how a CORBA::Any value may be constructed on the fly containing a value of type MyStruct:

   // C++CORBA::ORB_var orb = ...;DynamicAny::DynAnyFactory_var dafact

   = orb->resolve_initial_references(“DynAnyFactory?); CORBA::StructMemberSeq mems(2); CORBA::Any_var result; CORBA::Long value1 = 99; CORBA::Boolean value2 = 1; mems.length(2); mems[0].name = CORBA::string_dup(“member1?); mems[0].type = CORBA::TypeCode::_duplicate(CORBA::_tc_long); mems[1].name = CORBA::string_dup(“member2?); mems[1].type

   = CORBA::TypeCode::_duplicate(CORBA::_tc_boolean);

   CORBA::TypeCode_var new_tc = orb->create_struct_tc( “IDL:MyStruct:1.0?, “MyStruct?, mems

   );

   // Construct the DynStruct object. Values for members are// the value1 and value2 variables

   DynamicAny::DynAny_ptr dyn_any= dafact->create_dyn_any(new_tc);DynamicAny::DynStruct_ptr dyn_struct

   = DynamicAny::DynStruct::_narrow(dyn_any);CORBA::release(dyn_any);dyn_struct->insert_long(value1);

   dyn_struct->next();dyn_struct->insert_boolean(value2);result = dyn_struct->to_any();dyn_struct->destroy();CORBA::release(dyn_struct);

   9.3.2 Dynamic Interpretation of CORBA::Any values

   9.3.2.1 Filtering of events

   Suppose there is a CORBA object that receives events and prints all those events, which correspond to a data structure containing a member called is_urgent whose value is true.

   The following fragment of code corresponds to a method that determines if an event should be printed or not. Note that the program allows several struct events to be filtered with respect to some common member.

   // C++

   CORBA::Boolean Tester::eval_filter(DynamicAny::DynAnyFactory_ptr dafact,const CORBA::Any & event

   )

   {CORBA::Boolean success = FALSE;DynamicAny::DynAny_var;try {

   // First, convert the event to a DynAny.// Then attempt to narrow it to a DynStruct.// The _narrow only returns a reference// if the event is a struct.dyn_var = dafact->create_dyn_any(event);DynamicAny::DynStruct_var dyn_struct

   = DynamicAny::DynStruct::_narrow(dyn_any);

   if (!CORBA::is_nil(dyn_struct)) {CORBA::Boolean found = FALSE;do {

   CORBA::String_var member_name= dyn_struct->current_member_name();

   found = (strcmp(member_name, "is_urgent") == 0);} while (!found && dyn_struct->next());if (found) {

   // We only create a DynAny object for the member// we were looking for:DynamicAny::DynAny_var dyn_member

   = dyn_struct->current_component();success = dyn_member->get_boolean();}

   }}catch(...) {};if (!CORBA::is_nil(dyn_var))

   dyn_var->destroy();return success;}