20#ifdef DISABLE_DYNLOADING
21#include <config_java.h>
29#include <unordered_map>
32#include <rtl/ustring.hxx>
33#include <rtl/ustrbuf.hxx>
34#include <osl/module.hxx>
35#include <osl/diagnose.h>
36#include <osl/mutex.hxx>
37#include <osl/interlck.h>
40#include <uno/dispatcher.h>
41#include <uno/mapping.h>
42#include <uno/lbnames.h>
43#include <uno/environment.hxx>
45#include <typelib/typedescription.h>
65 inline Mapping(
const Mapping & rMapping );
66 Mapping(Mapping && other) noexcept :
_pMapping(other._pMapping)
67 { other._pMapping =
nullptr; }
70 Mapping & operator = (
const Mapping & rMapping )
71 {
return operator = ( rMapping._pMapping ); }
72 Mapping & operator =(Mapping && other)
noexcept {
77 other._pMapping =
nullptr;
102inline Mapping::~Mapping()
128 uno_Mapping * pMapping_, uno_freeMappingFunc freeMapping_,
129 OUString aMappingName_ )
140 {
return reinterpret_cast<size_t>(pKey); }
145typedef std::unordered_map<
147typedef std::unordered_map<
159 std::set< uno_getMappingFunc >
172 static MappingsData * s_p(
new MappingsData);
196 Environment aFrom_, Environment aTo_,
197 Mapping aFrom2Uno_, Mapping aUno2To_,
208 delete static_cast< uno_Mediate_Mapping *
>(
pMapping );
213 if (1 == osl_atomic_increment(
214 &
static_cast< uno_Mediate_Mapping *
>(
pMapping )->
nRef ))
218 static_cast< uno_Mediate_Mapping *
>(
pMapping )->
aFrom.get(),
219 static_cast< uno_Mediate_Mapping *
>(
pMapping )->aTo.get(),
220 static_cast< uno_Mediate_Mapping *
>(
pMapping )->aAddPurpose.pData );
226 if (! osl_atomic_decrement(
227 &
static_cast< uno_Mediate_Mapping *
>(
pMapping )->
nRef ))
235 void ** ppOut,
void * pInterface,
236 typelib_InterfaceTypeDescription * pInterfaceTypeDescr )
238 OSL_ENSURE(
pMapping && ppOut,
"### null ptr!" );
242 uno_Mediate_Mapping * that =
static_cast< uno_Mediate_Mapping *
>(
pMapping );
245 uno_Interface * pUnoI =
nullptr;
246 (*pFrom2Uno->mapInterface)( pFrom2Uno,
reinterpret_cast<void **
>(&pUnoI), pInterface, pInterfaceTypeDescr );
247 if (
nullptr == pUnoI)
249 void *
pOut = *ppOut;
252 uno_ExtEnvironment * pTo = that->aTo.get()->pExtEnv;
253 OSL_ENSURE(
nullptr != pTo,
"### cannot release out interface: leaking!" );
255 (*pTo->releaseInterface)( pTo,
pOut );
262 (*pUno2To->mapInterface)( pUno2To, ppOut, pUnoI, pInterfaceTypeDescr );
263 (*pUnoI->release)( pUnoI );
268uno_Mediate_Mapping::uno_Mediate_Mapping(
269 Environment aFrom_, Environment aTo_,
270 Mapping aFrom2Uno_, Mapping aUno2To_,
271 OUString aAddPurpose_ )
286 const Environment & rFrom,
const Environment & rTo, std::u16string_view rAddPurpose )
289 OUString::Concat(rAddPurpose)
291 + rFrom.getTypeName()
293 + OUString::number(
reinterpret_cast< sal_IntPtr
>(rFrom.get()), 16 )
297 + OUString::number(
reinterpret_cast< sal_IntPtr
>(rTo.get()), 16 )
302 const Environment & rFrom,
const Environment & rTo, std::u16string_view rAddPurpose )
304 OUStringBuffer aBridgeName( 16 );
305 if (!rAddPurpose.empty())
307 aBridgeName.append( OUString::Concat(rAddPurpose) +
"_" );
313 return aBridgeName.makeStringAndClear();
316#ifndef DISABLE_DYNLOADING
321 std::scoped_lock aGuard( rData.aNegativeLibsMutex );
322 rData.aNegativeLibs.insert( rBridgeName );
327#ifdef DISABLE_DYNLOADING
329static uno_ext_getMappingFunc selectMapFunc(
const OUString & rBridgeName )
331 if (rBridgeName.equalsAscii( CPPU_CURRENT_LANGUAGE_BINDING_NAME
"_uno" ))
332 return CPPU_ENV_uno_ext_getMapping;
334 if (rBridgeName.equalsAscii(
"java" "_uno" ))
335 return java_uno_ext_getMapping;
343 if (rBridgeName.equalsAscii(
"affine_uno_uno" ))
344 return affine_uno_uno_ext_getMapping;
345 if (rBridgeName.equalsAscii(
"log_uno_uno" ))
346 return log_uno_uno_ext_getMapping;
353static bool loadModule(osl::Module & rModule,
const OUString & rBridgeName)
358 std::scoped_lock aGuard( rData.aNegativeLibsMutex );
359 const auto iFind( rData.aNegativeLibs.find( rBridgeName ) );
360 bNeg = (iFind != rData.aNegativeLibs.end());
386 const Environment & rFrom,
const Environment & rTo,
const OUString & rAddPurpose )
388 OSL_ASSERT( rFrom.is() && rTo.is() );
389 if (rFrom.is() && rTo.is())
391#ifdef DISABLE_DYNLOADING
393 uno_ext_getMappingFunc fpGetMapFunc = 0;
398 fpGetMapFunc = selectMapFunc(
aName );
403 fpGetMapFunc = selectMapFunc(
aName );
408 fpGetMapFunc = selectMapFunc(
aName );
420 (*fpGetMapFunc)( (
uno_Mapping **)&aExt, rFrom.get(), rTo.get() );
421 OSL_ASSERT( aExt.is() );
424 SAL_INFO(
"cppu",
"Could not load external mapping for " <<
aName);
450 uno_ext_getMappingFunc fpGetMapFunc =
451 reinterpret_cast<uno_ext_getMappingFunc
>(aModule.getSymbol( UNO_EXT_GETMAPPING ));
456 (*fpGetMapFunc)(
reinterpret_cast<uno_Mapping **
>(&aExt), rFrom.get(), rTo.get() );
457 OSL_ASSERT( aExt.is() );
474 const Environment & rFrom,
const Environment & rTo,
const OUString & rAddPurpose = OUString() )
477 OSL_ASSERT( rFrom.is() && rTo.is() );
478 if (rFrom.is() && rTo.is())
481 ClearableMutexGuard aGuard( rData.aMappingsMutex );
484 const t_OUString2Entry::const_iterator iFind( rData.aName2Entry.find(
487 if (iFind == rData.aName2Entry.end())
492 return Mapping( (*iFind).second->pMapping );
499 const Environment & rFrom,
const Environment & rTo,
500 const Mapping & rFrom2Uno,
const Mapping & rUno2To,
501 const OUString & rAddPurpose )
504 rFrom, rTo, rFrom2Uno, rUno2To, rAddPurpose );
506 &pRet,
mediate_free, rFrom.get(), rTo.get(), rAddPurpose.pData );
507 Mapping aRet( pRet );
508 (*pRet->release)( pRet );
513 const Environment & rFrom,
const Environment & rTo,
const OUString & rAddPurpose )
521 OUString aUnoEnvTypeName( UNO_LB_UNO );
522 if (rTo.getTypeName() == aUnoEnvTypeName)
539 if (!rAddPurpose.isEmpty())
546 if (! aAnUno2Uno.is())
574using namespace ::
cppu;
581 rtl_uString * pAddPurpose )
584 assert(ppMapping !=
nullptr);
585 assert(pFrom !=
nullptr);
586 assert(pTo !=
nullptr);
589 (*(*ppMapping)->release)( *ppMapping );
590 *ppMapping =
nullptr;
604 MutexGuard aGuard( rData.aMappingsMutex );
605 const t_OUString2Entry::const_iterator iFind( rData.aName2Entry.find(
607 if (iFind != rData.aName2Entry.end())
608 aRet = (*iFind).second->pMapping;
612 if (!aRet.is() && pFrom == pTo &&
aAddPurpose.isEmpty())
624 std::unique_lock aGuard(rData.aCallbacksMutex);
625 for (
const auto& rCallback : rData.aCallbacks)
627 (*rCallback)(ppMapping, pFrom, pTo,
aAddPurpose.pData);
640 (*aRet.get()->acquire)( aRet.get() );
641 *ppMapping = aRet.get();
646 uno_Mapping ** ppMapping, rtl_uString * pFrom, rtl_uString * pTo,
647 rtl_uString * pAddPurpose )
650 assert(ppMapping && pFrom && pTo &&
"### null ptr!");
653 (*(*ppMapping)->release)( *ppMapping );
654 *ppMapping =
nullptr;
659 OSL_ENSURE( pEFrom,
"### cannot get source environment!" );
664 OSL_ENSURE( pETo,
"### cannot get target environment!" );
668 (*pETo->release)( pETo );
670 (*pEFrom->release)( pEFrom );
681 ClearableMutexGuard aGuard( rData.aMappingsMutex );
683 const t_Mapping2Entry::const_iterator iFind( rData.aMapping2Entry.find( *ppMapping ) );
684 if (iFind == rData.aMapping2Entry.end())
687 getMappingName( pFrom, pTo, pAddPurpose ? OUString(pAddPurpose) : OUString() ) );
692 rData.aMapping2Entry[ *ppMapping ] = pEntry;
696 MappingEntry * pEntry = (*iFind).second;
699 if (pEntry->pMapping != *ppMapping)
701 (*pEntry->pMapping->acquire)( pEntry->pMapping );
704 (*freeMapping)( *ppMapping );
705 *ppMapping = pEntry->pMapping;
715 ClearableMutexGuard aGuard( rData.aMappingsMutex );
717 const t_Mapping2Entry::const_iterator iFind( rData.aMapping2Entry.find(
pMapping ) );
718 OSL_ASSERT( iFind != rData.aMapping2Entry.end() );
719 MappingEntry * pEntry = (*iFind).second;
720 if (! --pEntry->nRef)
722 rData.aMapping2Entry.erase( pEntry->pMapping );
723 rData.aName2Entry.erase( pEntry->aMappingName );
725 SAL_INFO(
"cppu",
"> revoking mapping " << pEntry->aMappingName);
726 (*pEntry->freeMapping)( pEntry->pMapping );
733 uno_getMappingFunc pCallback )
736 OSL_ENSURE( pCallback,
"### null ptr!" );
738 std::unique_lock aGuard( rData.aCallbacksMutex );
739 rData.aCallbacks.insert( pCallback );
743 uno_getMappingFunc pCallback )
746 OSL_ENSURE( pCallback,
"### null ptr!" );
748 std::unique_lock aGuard( rData.aCallbacksMutex );
749 rData.aCallbacks.erase( pCallback );
uno_Mapping * createIdentityMapping(uno::Environment const &rEnv)
void getCascadeMapping(uno_Mapping **ppMapping, uno_Environment *pFrom, uno_Environment *pTo, rtl_uString *pAddPurpose)
struct _uno_Environment uno_Environment
void SAL_CALL uno_getEnvironment(uno_Environment **ppEnv, rtl_uString *pEnvDcp, void *pContext) SAL_THROW_EXTERN_C()
void SAL_CALL uno_createEnvironment(uno_Environment **ppEnv, rtl_uString *pEnvDcp, void *pContext) SAL_THROW_EXTERN_C()
t_Mapping2Entry aMapping2Entry
std::set< uno_getMappingFunc > aCallbacks
uno_freeMappingFunc freeMapping
void SAL_CALL uno_getMappingByName(uno_Mapping **ppMapping, rtl_uString *pFrom, rtl_uString *pTo, rtl_uString *pAddPurpose) SAL_THROW_EXTERN_C()
std::set< OUString > aNegativeLibs
void SAL_CALL uno_getMapping(uno_Mapping **ppMapping, uno_Environment *pFrom, uno_Environment *pTo, rtl_uString *pAddPurpose) SAL_THROW_EXTERN_C()
std::mutex aCallbacksMutex
void SAL_CALL uno_registerMapping(uno_Mapping **ppMapping, uno_freeMappingFunc freeMapping, uno_Environment *pFrom, uno_Environment *pTo, rtl_uString *pAddPurpose) SAL_THROW_EXTERN_C()
std::mutex aNegativeLibsMutex
void SAL_CALL uno_revokeMapping(uno_Mapping *pMapping) SAL_THROW_EXTERN_C()
void SAL_CALL uno_registerMappingCallback(uno_getMappingFunc pCallback) SAL_THROW_EXTERN_C()
void SAL_CALL uno_revokeMappingCallback(uno_getMappingFunc pCallback) SAL_THROW_EXTERN_C()
t_OUString2Entry aName2Entry
#define SAL_INFO(area, stream)
struct _uno_Mapping uno_Mapping
rtl::OUString getTypeName(rtl::OUString const &rEnvDcp)
Get the OBI type part of an environment descriptor.
bool loadModule(osl::Module &rModule, OUString const &name)
Load a module.
static Mapping createMediateMapping(const Environment &rFrom, const Environment &rTo, const Mapping &rFrom2Uno, const Mapping &rUno2To, const OUString &rAddPurpose)
static void mediate_free(uno_Mapping *pMapping)
static void setNegativeBridge(const OUString &rBridgeName)
static void mediate_acquire(uno_Mapping *pMapping)
std::unordered_map< uno_Mapping *, MappingEntry *, FctPtrHash > t_Mapping2Entry
static Mapping getDirectMapping(const Environment &rFrom, const Environment &rTo, const OUString &rAddPurpose=OUString())
static OUString getMappingName(const Environment &rFrom, const Environment &rTo, std::u16string_view rAddPurpose)
static Mapping loadExternalMapping(const Environment &rFrom, const Environment &rTo, const OUString &rAddPurpose)
static void mediate_release(uno_Mapping *pMapping)
static bool loadModule(osl::Module &rModule, const OUString &rBridgeName)
std::unordered_map< OUString, MappingEntry * > t_OUString2Entry
static MappingsData & getMappingsData()
static OUString getBridgeName(const Environment &rFrom, const Environment &rTo, std::u16string_view rAddPurpose)
static void mediate_mapInterface(uno_Mapping *pMapping, void **ppOut, void *pInterface, typelib_InterfaceTypeDescription *pInterfaceTypeDescr)
static Mapping getMediateMapping(const Environment &rFrom, const Environment &rTo, const OUString &rAddPurpose)
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
#define SAL_THROW_EXTERN_C()