CORBA::TypeCode_ptr DynAlias_Handler::create_typecode (const DataType &type) { DANCE_TRACE("DynAlias_Handler::create_typecode"); if (!type.alias_p ()) { DANCE_DEBUG (DANCE_LOG_TERMINAL_ERROR, (LM_ERROR, ACE_TEXT ("ERROR: Alias type description required"))); throw Config_Error (ACE_TEXT (""), ACE_TEXT ("Did not find expected alias type description, tk_kind"\ "may be wrong.")); } CORBA::TypeCode_var tc = DYNANY_HANDLER->orb ()->create_alias_tc (ACE_TEXT_ALWAYS_CHAR (type.alias ().typeId ().c_str ()), ACE_TEXT_ALWAYS_CHAR (type.alias ().name ().c_str ()), DYNANY_HANDLER->create_typecode (type.alias ().elementType ())); DYNANY_HANDLER->register_typecode (type.alias ().typeId (), tc.in ()); return tc._retn (); }
CORBA::TypeCode_ptr AliasDef_impl::type () throw(CORBA::SystemException) { DEBUG_OUTLINE ( "AliasDef_impl::type() called" ); vector < Contained_impl* > helper_seq; CORBA::TypeCode_var tc = build_recursive_type_code(helper_seq); if ( helper_seq.size() != 0 ) throw CORBA::BAD_INV_ORDER(); // Is this correct? return tc._retn(); }
CORBA::TypeCode_ptr ValueDef_impl::build_recursive_type_code ( vector < Contained_impl* >& seq ) { unsigned int i; for ( i = 0 ; i < seq.size() ; i++ ) { IR__::RepositoryId_var id2 = seq[i] -> id(); if ( strcmp ( id_, id2 ) == 0 ) return repository_ -> orb() -> create_recursive_tc ( id_ ); } seq.resize ( seq.size() + 1, NULL ); seq[seq.size() - 1] = this; CORBA::TypeCode_var concrete_base; CORBA::ValueModifier type_modifier = CORBA::VM_NONE; IR__::ValueMemberSeq members; if ( this -> is_abstract() ) type_modifier = CORBA::VM_ABSTRACT; else if ( this -> is_custom() ) type_modifier = CORBA::VM_CUSTOM; else if ( this -> is_truncatable() ) type_modifier = CORBA::VM_TRUNCATABLE; if ( base_value_impl_ ) if ( !base_value_impl_ -> is_abstract() ) concrete_base = base_value_impl_ -> build_recursive_type_code ( seq ); list < Contained_impl* >::const_iterator contained_iter; for ( contained_iter = contained_.begin(); contained_iter != contained_.end(); contained_iter++) { Contained_impl* contained = *contained_iter; if ( contained -> def_kind() == CORBA__::dk_ValueMember) { ValueMemberDef_impl* member = dynamic_cast<ValueMemberDef_impl*>(contained); if ( !member ) { DEBUG_ERRLINE ( "Fatal error: Value member cannot by casted to ValueMember_impl" ); CORBA::TypeCode::_nil(); } IR__::ValueMember value_member; value_member.name = member -> name(); value_member.id = member -> id(); value_member.version = member -> version(); value_member.access = member -> access(); value_member.type = member -> build_recursive_type_code ( seq ); members.length ( members.length() + 1 ); members[members.length() - 1] = value_member; } } // TODO: this is a hack because create_value_tc needs a sequence // from the CORBA module and we know that the both types are // exactly the same CORBA::ValueMemberSeq* members_new = (CORBA::ValueMemberSeq*)&members; CORBA::TypeCode_var tc = repository_ -> orb() -> create_value_tc ( id_, name_, type_modifier, concrete_base, *members_new ); seq.resize ( seq.size() - 1, NULL ); return tc._retn(); }