CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq * TAO_Service_Type_Repository:: list_types (const CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes &which_types) { ACE_READ_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ()); CORBA::ULong i = 0; CORBA::ULong length = static_cast<CORBA::ULong> (this->type_map_.current_size ()); CosTrading::ServiceTypeName *types = CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq::allocbuf (length); if (types == 0) return 0; int all = which_types._d () == CosTradingRepos::ServiceTypeRepository::all; CosTradingRepos::ServiceTypeRepository::IncarnationNumber num = which_types.incarnation (); for (Service_Type_Map_Iterator itr (this->type_map_); itr.done () == 0; itr++) { Type_Info* type_info = (*itr).int_id_; const char* type_name = (*itr).ext_id_.in (); if (all || num < type_info->type_struct_.incarnation) { CORBA::string_free (types[i]); types[i++] = CORBA::string_dup (type_name); } } CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq *tmp = 0; ACE_NEW_RETURN (tmp, CosTradingRepos::ServiceTypeRepository:: ServiceTypeNameSeq (length, i, types, 1), 0); return tmp; }
CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq * TAO_Service_Type_Repository:: list_types (const CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes &which_types) { ACE_READ_GUARD_THROW_EX (ACE_Lock, ace_mon, *this->lock_, CORBA::INTERNAL ()); CORBA::ULong const length = static_cast<CORBA::ULong>(this->type_map_.current_size ()); CORBA::ULong found = 0; // Initial allocate a result seq for maximum expected results. CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq_var types; ACE_NEW_RETURN (types, CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq(length), 0); types->length(length); bool const all = which_types._d () == CosTradingRepos::ServiceTypeRepository::all; // FIXME: && (which_types.all_ () == true) ? CosTradingRepos::ServiceTypeRepository::IncarnationNumber num = which_types.incarnation (); for (Service_Type_Map_Iterator itr (this->type_map_); itr.done () == 0; itr++) { Type_Info* type_info = (*itr).int_id_; const char* type_name = (*itr).ext_id_.in (); if (all || num < type_info->type_struct_.incarnation) { (*types)[found++] = CORBA::string_dup (type_name); } } // Truncate to results we have found. types->length(found); return types._retn(); }