Previous | Table of Contents | Next |
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;}