24#include <uno/dispatcher.h>
25#include <typelib/typedescription.hxx>
32 switch (pTypeDescr->eTypeClass)
35 case typelib_TypeClass_SEQUENCE:
37 switch (
reinterpret_cast<typelib_IndirectTypeDescription *
>(pTypeDescr)->pType->eTypeClass)
39 case typelib_TypeClass_INTERFACE:
40 case typelib_TypeClass_ANY:
42 case typelib_TypeClass_SEQUENCE:
43 case typelib_TypeClass_STRUCT:
44 case typelib_TypeClass_EXCEPTION:
47 TYPELIB_DANGER_GET( &pTD,
reinterpret_cast<typelib_IndirectTypeDescription *
>(pTypeDescr)->pType );
49 TYPELIB_DANGER_RELEASE( pTD );
57 case typelib_TypeClass_STRUCT:
58 case typelib_TypeClass_EXCEPTION:
61 typelib_CompoundTypeDescription * pComp =
reinterpret_cast<typelib_CompoundTypeDescription *
>(pTypeDescr);
62 typelib_TypeDescriptionReference ** pTypes = pComp->ppTypeRefs;
63 for ( sal_Int32
nPos = pComp->nMembers;
nPos--; )
65 switch (pTypes[
nPos]->eTypeClass)
67 case typelib_TypeClass_INTERFACE:
68 case typelib_TypeClass_ANY:
71 case typelib_TypeClass_SEQUENCE:
72 case typelib_TypeClass_STRUCT:
73 case typelib_TypeClass_EXCEPTION:
76 TYPELIB_DANGER_GET( &pTD, pTypes[
nPos] );
78 TYPELIB_DANGER_RELEASE( pTD );
87 if (pComp->pBaseTypeDescription)
91 case typelib_TypeClass_ANY:
92 case typelib_TypeClass_INTERFACE:
102 uno_Interface * pUnoI,
111 typelib_MethodParameter param;
112 sal_Int32 nParams = 0;
113 typelib_MethodParameter * pParams =
nullptr;
114 typelib_TypeDescriptionReference * pReturnTypeRef =
nullptr;
117 switch (pMemberType->eTypeClass)
119 case typelib_TypeClass_INTERFACE_ATTRIBUTE:
123 reinterpret_cast<typelib_InterfaceAttributeTypeDescription
const *
>(
124 pMemberType)->pAttributeTypeRef;
130 param.pTypeRef =
reinterpret_cast<typelib_InterfaceAttributeTypeDescription
const *
>(
131 pMemberType)->pAttributeTypeRef;
138 case typelib_TypeClass_INTERFACE_METHOD:
140 typelib_InterfaceMethodTypeDescription
const * method_td =
141 reinterpret_cast<typelib_InterfaceMethodTypeDescription
const *
>(pMemberType);
142 pReturnTypeRef = method_td->pReturnTypeRef;
143 nParams = method_td->nParams;
144 pParams = method_td->pParams;
148 OSL_FAIL(
"### illegal member typeclass!" );
163 Proxy * pThis =
static_cast<Proxy *
>(
static_cast<uno_Interface *
>(pProxy));
182 uno_Interface * pUnoI = va_arg(*pParam, uno_Interface *);
183 rtl_uString * pOid = va_arg(*pParam, rtl_uString *);
184 typelib_InterfaceTypeDescription * pTypeDescr = va_arg(*pParam, typelib_InterfaceTypeDescription *);
185 uno_ExtEnvironment * pEnv = va_arg(*pParam, uno_ExtEnvironment *);
187 pUnoI->acquire(pUnoI);
188 pEnv->registerInterface(pEnv,
reinterpret_cast<void **
>(&pUnoI), pOid, pTypeDescr);
195 uno_Interface * pUnoI,
196 typelib_InterfaceTypeDescription * pTypeDescr,
197 OUString
const & rOId,
204 m_from_to (pFrom, pTo),
205 m_to_from (
std::move(to_from)),
209 m_probeFun (probeFun),
210 m_pProbeContext(pProbeContext)
212 SAL_INFO(
"cppu.purpenv",
"LIFE: Proxy::Proxy(<>) -> " <<
this);
218 OSL_ENSURE(
m_pTypeDescr->aBase.bComplete,
"### type is incomplete!");
230 uno_ExtEnvironment * pEnv = va_arg(*pParam, uno_ExtEnvironment *);
231 uno_Interface * pUnoI = va_arg(*pParam, uno_Interface *);
233 pEnv->revokeInterface(pEnv, pUnoI);
234 pUnoI->release(pUnoI);
239 SAL_INFO(
"cppu.purpenv",
"LIFE: Proxy::~Proxy() -> " <<
this);
248 typelib_TypeDescriptionReference * type_XInterface =
252 TYPELIB_DANGER_GET (&pTXInterfaceDescr, type_XInterface);
253 uno::TypeDescription acquire(
254 reinterpret_cast< typelib_InterfaceTypeDescription *
>(
255 pTXInterfaceDescr)->ppAllMembers[1]);
256 TYPELIB_DANGER_RELEASE(pTXInterfaceDescr);
263 typelib_TypeDescriptionReference * type_XInterface =
267 TYPELIB_DANGER_GET (&pTXInterfaceDescr, type_XInterface);
268 uno::TypeDescription release(
269 reinterpret_cast< typelib_InterfaceTypeDescription *
>(
270 pTXInterfaceDescr)->ppAllMembers[2]);
271 TYPELIB_DANGER_RELEASE(pTXInterfaceDescr);
293 if (osl_atomic_increment(&
m_nRef) == 1)
297 m_from.get()->pExtEnv->registerProxyInterface(
m_from.get()->pExtEnv,
302 OSL_ASSERT(pThis ==
this);
336 if (osl_atomic_decrement(&
m_nRef) == 0)
337 m_from.get()->pExtEnv->revokeInterface(
m_from.get()->pExtEnv,
this);
357 void * ret = va_arg(*pParam,
void *);
358 typelib_TypeDescriptionReference * pReturnTypeRef = va_arg(*pParam, typelib_TypeDescriptionReference *);
365 uno_Interface * pUnoI = va_arg(*pParam, uno_Interface *);
367 void * pReturn = va_arg(*pParam,
void *);
368 void ** pArgs = va_arg(*pParam,
void **);
371 pUnoI->pDispatcher(pUnoI, pMemberType, pReturn, pArgs, ppException);
376 typelib_MethodParameter * pParams,
395 void **
args =
static_cast<void **
>(alloca(
sizeof (
void *) * nParams ));
398 void * ret = pReturn;
401 TYPELIB_DANGER_GET(&return_td, pReturnTypeRef);
404 ret = alloca(return_td->nSize);
406 TYPELIB_DANGER_RELEASE(return_td);
411 typelib_MethodParameter
const & param = pParams[
nPos];
413 TYPELIB_DANGER_GET( &td, param.pTypeRef );
426 TYPELIB_DANGER_RELEASE( td );
441 typelib_MethodParameter
const & param = pParams[
nPos];
466 *ppException =
nullptr;
474 typelib_MethodParameter
const & param = pParams[
nPos];
void SAL_CALL uno_Environment_invoke(uno_Environment *pEnv, uno_EnvCallee *pCallee,...) SAL_THROW_EXTERN_C()
void SAL_CALL uno_type_any_constructAndConvert(uno_Any *pDest, void *pSource, typelib_TypeDescriptionReference *pType, uno_Mapping *mapping) SAL_THROW_EXTERN_C()
void SAL_CALL uno_any_destruct(uno_Any *pValue, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
typelib_InterfaceTypeDescription * m_pTypeDescr
css::uno::Mapping m_to_from
css::uno::Mapping m_from_to
css::uno::Environment m_to
cppu::helper::purpenv::ProbeFun * m_probeFun
void dispatch(typelib_TypeDescriptionReference *pReturnTypeRef, typelib_MethodParameter *pParams, sal_Int32 nParams, typelib_TypeDescription const *pMemberType, void *pReturn, void *pArgs[], uno_Any **ppException)
css::uno::Environment m_from
oslInterlockedCount m_nRef
Proxy(css::uno::Mapping to_from, uno_Environment *pTo, uno_Environment *pFrom, uno_Interface *pUnoI, typelib_InterfaceTypeDescription *pTypeDescr, OUString const &rOId, cppu::helper::purpenv::ProbeFun *probeFun, void *pProbeContext)
void SAL_CALL uno_type_destructData(void *pValue, typelib_TypeDescriptionReference *pType, uno_ReleaseFunc release) SAL_THROW_EXTERN_C()
void SAL_CALL uno_type_copyAndConvertData(void *pDest, void *pSource, typelib_TypeDescriptionReference *pType, uno_Mapping *mapping) SAL_THROW_EXTERN_C()
void SAL_CALL uno_copyAndConvertData(void *pDest, void *pSource, typelib_TypeDescription *pTypeDescr, uno_Mapping *mapping) SAL_THROW_EXTERN_C()
struct _uno_Environment uno_Environment
static void s_Proxy_release(uno_Interface *pUnoI) SAL_THROW_EXTERN_C()
void Proxy_free(SAL_UNUSED_PARAMETER uno_ExtEnvironment *, void *pProxy) SAL_THROW_EXTERN_C()
static bool relatesToInterface(typelib_TypeDescription *pTypeDescr)
static uno::TypeDescription s_releaseMethod(getReleaseMethod())
static void s_Proxy_acquire(uno_Interface *pUnoI) SAL_THROW_EXTERN_C()
static uno::TypeDescription getAcquireMethod()
static void s_type_destructData_v(va_list *pParam)
static void s_Proxy_dispatch(uno_Interface *pUnoI, typelib_TypeDescription const *pMemberType, void *pReturn, void *pArgs[], uno_Any **ppException) SAL_THROW_EXTERN_C()
static uno::TypeDescription getReleaseMethod()
static void s_dispatcher_v(va_list *pParam)
static void s_acquireAndRegister_v(va_list *pParam)
static uno::TypeDescription s_acquireMethod(getAcquireMethod())
static void s_releaseAndRevoke_v(va_list *pParam)
oslInterlockedCount m_nRef
typelib_InterfaceTypeDescription * m_pTypeDescr
#define SAL_INFO(area, stream)
struct _typelib_TypeDescription typelib_TypeDescription
void ProbeFun(bool pre, void *pThis, void *pContext, typelib_TypeDescriptionReference *pReturnTypeRef, typelib_MethodParameter *pParams, sal_Int32 nParams, typelib_TypeDescription const *pMemberType, void *pReturn, void *pArgs[], uno_Any **ppException)
C++ helper for implementing Purpose Environments.
typelib_TypeDescriptionReference **SAL_CALL typelib_static_type_getByTypeClass(typelib_TypeClass eTypeClass) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_release(typelib_TypeDescription *pTD) SAL_THROW_EXTERN_C()
sal_Bool SAL_CALL typelib_typedescription_complete(typelib_TypeDescription **ppTypeDescr) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_acquire(typelib_TypeDescription *pTypeDescription) SAL_THROW_EXTERN_C()
#define SAL_THROW_EXTERN_C()