CORBA::TypeCode_ptr TAO_Repository_i::get_canonical_typecode_i (CORBA::TypeCode_ptr tc) { CORBA::TCKind kind = tc->kind (); switch (kind) { // For all the TCKinds not covered below, no change is needed. default: return CORBA::TypeCode::_duplicate (tc); case CORBA::tk_fixed: throw CORBA::NO_IMPLEMENT (); case CORBA::tk_array: { CORBA::ULong length = tc->length (); CORBA::TypeCode_var ctype = tc->content_type (); CORBA::TypeCode_var canon_ctype = this->get_canonical_typecode_i (ctype.in ()); return this->tc_factory ()->create_array_tc (length, canon_ctype.in ()); } case CORBA::tk_sequence: { CORBA::ULong length = tc->length (); CORBA::TypeCode_var ctype = tc->content_type (); CORBA::TypeCode_var canon_ctype = this->get_canonical_typecode_i (ctype.in ()); return this->tc_factory ()->create_sequence_tc (length, canon_ctype.in ()); } case CORBA::tk_alias: case CORBA::tk_objref: case CORBA::tk_struct: case CORBA::tk_union: case CORBA::tk_enum: case CORBA::tk_except: case CORBA::tk_value: case CORBA::tk_value_box: case CORBA::tk_native: case CORBA::tk_abstract_interface: case CORBA::tk_component: case CORBA::tk_home: { CORBA::String_var id = tc->id (); ACE_TString path; int status = this->config ()->get_string_value (this->repo_ids_key (), id.in (), path); // TODO - something in case the repo id is an empty string, // or if it is not found in this repository if (status != 0) { return CORBA::TypeCode::_nil (); } ACE_Configuration_Section_Key key; this->config ()->expand_path (this->root_key (), path, key, 0); // An ExceptionDef is not an IDLType. if (kind == CORBA::tk_except) { TAO_ExceptionDef_i impl (this->repo_); impl.section_key (key); return impl.type_i (); } else { TAO_IDLType_i *impl = TAO_IFR_Service_Utils::path_to_idltype (path, this); impl->section_key (key); return impl->type_i (); } } } }
void TAO_ArrayDef_i::destroy_element_type ( ) { ACE_TString element_path; this->repo_->config ()->get_string_value (this->section_key_, "element_path", element_path); ACE_Configuration_Section_Key element_key; this->repo_->config ()->expand_path (this->repo_->root_key (), element_path, element_key, 0); u_int kind = 0; this->repo_->config ()->get_integer_value (element_key, ACE_TEXT("def_kind"), kind); CORBA::DefinitionKind def_kind = TAO_IFR_Service_Utils::path_to_def_kind (element_path, this->repo_); switch (def_kind) { // These exist only as our elements, so the type should // be destroyed when we are destroyed, or when our element type // is mutated. case CORBA::dk_String: case CORBA::dk_Wstring: case CORBA::dk_Fixed: case CORBA::dk_Array: case CORBA::dk_Sequence: { TAO_IDLType_i *impl = this->repo_->select_idltype (def_kind); impl->section_key (element_key); impl->destroy_i (); break; } default: break; } }
TAO_IDLType_i * TAO_IFR_Service_Utils::path_to_idltype (ACE_TString &path, TAO_Repository_i *repo) { CORBA::DefinitionKind def_kind = TAO_IFR_Service_Utils::path_to_def_kind (path, repo); TAO_IDLType_i *retval = repo->select_idltype (def_kind); if (retval == 0) { ORBSVCS_DEBUG ((LM_DEBUG, "path_to_idltype - not an IDLType: '%s'\n", path.c_str ())); return 0; } retval->section_key (TAO_IFR_Service_Utils::tmp_key_); return retval; }