25 #include <unordered_map>
31 #include <osl/mutex.hxx>
32 #include <rtl/instance.hxx>
33 #include <rtl/strbuf.hxx>
34 #include <rtl/ustring.hxx>
36 #include <typelib/typedescription.h>
45 virtual ~Generated() {};
47 virtual std::type_info *
get()
const = 0;
50 class GeneratedPlain:
public Generated {
52 GeneratedPlain(std::unique_ptr<std::type_info> && info): info_(
std::move(info)) {};
54 std::type_info *
get()
const override {
return info_.get(); }
57 std::unique_ptr<std::type_info> info_;
60 class GeneratedPad:
public Generated {
63 GeneratedPad(std::unique_ptr<
char[]> && pad): pad_(
std::move(pad)) {};
65 ~GeneratedPad()
override {
get()->~type_info(); }
67 std::type_info *
get()
const override final
68 {
return reinterpret_cast<std::type_info *
>(pad_.get()); }
71 std::unique_ptr<char[]> pad_;
76 typedef std::unordered_map< OUString, std::type_info * > t_rtti_map;
80 std::vector<OString> m_rttiNames;
96 :
m_hApp( dlopen(
nullptr, RTLD_LAZY ) )
110 std::type_info * rtti;
112 OUString
const & unoName = OUString::unacquired(&pTypeDescr.pTypeName);
114 osl::MutexGuard guard(
m_mutex );
115 t_rtti_map::const_iterator iFind(
m_rttis.find( unoName ) );
119 OStringBuffer buf( 64 );
120 buf.append(
"_ZTIN" );
124 OUString token( unoName.getToken( 0,
'.', index ) );
125 buf.append( token.getLength() );
127 buf.append( c_token );
132 OString symName( buf.makeStringAndClear() );
134 rtti =
static_cast<std::type_info *
>(dlsym(
m_hApp, symName.getStr() ));
136 rtti =
static_cast<std::type_info *
>(dlsym( RTLD_DEFAULT, symName.getStr() ));
141 std::pair< t_rtti_map::iterator, bool > insertion (
142 m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
143 SAL_WARN_IF( !insertion.second,
"bridges",
"key " << unoName <<
" already in rtti map" );
154 char const * rttiName = symName.getStr() +4;
155 #if OSL_DEBUG_LEVEL > 1
156 fprintf( stderr,
"generated rtti for %s\n", rttiName );
158 std::unique_ptr<Generated> newRtti;
159 switch (pTypeDescr.eTypeClass) {
160 case typelib_TypeClass_EXCEPTION:
162 typelib_CompoundTypeDescription
const & ctd
164 typelib_CompoundTypeDescription
const &
>(
166 if (ctd.pBaseTypeDescription)
169 std::type_info * base_rtti = getRTTI(
170 ctd.pBaseTypeDescription->aBase);
171 m_rttiNames.emplace_back(OString(rttiName));
172 std::unique_ptr<std::type_info> info(
175 newRtti.reset(
new GeneratedPlain(std::move(info)));
180 m_rttiNames.emplace_back(OString(rttiName));
181 std::unique_ptr<std::type_info> info(
183 newRtti.reset(
new GeneratedPlain(std::move(info)));
187 case typelib_TypeClass_INTERFACE:
189 typelib_InterfaceTypeDescription
const & itd
191 typelib_InterfaceTypeDescription
const &
>(
193 std::vector<std::type_info *> bases;
194 for (sal_Int32 i = 0;
i != itd.nBaseTypes; ++
i) {
195 bases.push_back(getRTTI(itd.ppBaseTypes[i]->aBase));
197 switch (itd.nBaseTypes) {
200 m_rttiNames.emplace_back(OString(rttiName));
201 std::unique_ptr<std::type_info> info(
203 m_rttiNames.back().getStr()));
204 newRtti.reset(
new GeneratedPlain(std::move(info)));
209 m_rttiNames.emplace_back(OString(rttiName));
210 std::unique_ptr<std::type_info> info(
212 m_rttiNames.back().getStr(),
216 newRtti.reset(
new GeneratedPlain(std::move(info)));
221 m_rttiNames.emplace_back(OString(rttiName));
222 auto pad = std::make_unique<char[]>(
224 + ((itd.nBaseTypes - 1)
230 m_rttiNames.back().getStr(),
233 for (sal_Int32 i = 0;
i != itd.nBaseTypes; ++
i)
235 info->__base_info[
i].__base_type
239 info->__base_info[
i].__offset_flags
243 newRtti.reset(
new GeneratedPad(std::move(pad)));
252 rtti = newRtti->get();
256 SAL_WARN_IF( !insertion.second,
"bridges",
"key " << unoName <<
" already in generated rtti map" );
261 rtti = iFind2->second->get();
267 rtti = iFind->second;
273 struct theRttiFactory:
public rtl::Static<RTTI, theRttiFactory> {};
278 return theRttiFactory::get().getRTTI(type);
std::type_info * getRtti(typelib_TypeDescription const &type)
t_rtti_map m_generatedRttis
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
struct _typelib_TypeDescription typelib_TypeDescription
unsigned int __base_count
#define SAL_WARN_IF(condition, area, stream)