23#include <osl/diagnose.h>
25#include <uno/lbnames.h>
28#include <typelib/typedescription.h>
29#include <osl/interlck.h>
37 uno_freeProxyFunc freeProxy,
39 typelib_InterfaceTypeDescription * pTypeDescr);
48 typelib_InterfaceTypeDescription *);
50 void *** pppInterfaces,
52 uno_memAlloc memAlloc);
75 void registerProxyInterface (
void ** ppProxy,
76 uno_freeProxyFunc freeProxy,
78 typelib_InterfaceTypeDescription * pTypeDescr);
79 void revokeInterface (
void * pInterface);
80 void getObjectIdentifier (
void * pInterface,
82 void getRegisteredInterface (
void **,
84 typelib_InterfaceTypeDescription *);
85 void getRegisteredInterfaces(
void ***,
87 uno_memAlloc memAlloc);
88 void computeObjectIdentifier(
void * pInterface,
90 void acquireInterface (
void * pInterface);
91 void releaseInterface (
void * pInterface);
93 virtual void v_enter()
override;
94 virtual void v_leave()
override;
95 virtual void v_callInto_v(uno_EnvCallee * pCallee, va_list * pParam)
override;
96 virtual void v_callOut_v (uno_EnvCallee * pCallee, va_list * pParam)
override;
97 virtual bool v_isValid (OUString * pReason)
override;
100 oslInterlockedCount
m_nRef;
102 std::unique_ptr<cppu::Enterable> m_pEnterable;
119 virtual ~Base()
override;
127 Base * pBase =
static_cast<Base *
>(pEnv->pReserved);
133 Base * pBase =
static_cast<Base *
>(pEnv->pReserved);
139 Base * pBase =
static_cast<Base *
>(pEnv->pReserved);
140 pBase->harden(ppHardEnv);
145 Base * pBase =
static_cast<Base *
>(pEnv->pReserved);
146 pBase->acquireWeak();
151 Base * pBase =
static_cast<Base *
>(pEnv->pReserved);
152 pBase->releaseWeak();
158 uno_freeProxyFunc freeProxy,
160 typelib_InterfaceTypeDescription * pTypeDescr)
162 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
163 pBase->registerProxyInterface(ppProxy, freeProxy, pOId, pTypeDescr);
168 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
169 pBase->revokeInterface(pInterface);
173 rtl_uString ** ppOId,
176 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
177 pBase->getObjectIdentifier(pInterface,
reinterpret_cast<OUString *
>(ppOId));
183 typelib_InterfaceTypeDescription * pTypeDescr)
185 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
186 pBase->getRegisteredInterface(ppInterface, pOId, pTypeDescr);
190 void *** pppInterface,
192 uno_memAlloc memAlloc)
194 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
195 pBase->getRegisteredInterfaces(pppInterface, pnLen, memAlloc);
199 rtl_uString ** ppOId,
202 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
203 pBase->computeObjectIdentifier(pInterface,
reinterpret_cast<OUString *
>(ppOId));
207 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
208 pBase->acquireInterface(pInterface);
212 Base * pBase =
static_cast<Base *
>(pExtEnv->aBase.pReserved);
213 pBase->releaseInterface(pInterface);
221 m_pEnterable (pEnterable),
222 m_env_acquire (pEnv->acquire),
223 m_env_release (pEnv->release),
224 m_env_harden (pEnv->harden),
225 m_env_acquireWeak(pEnv->acquireWeak),
226 m_env_releaseWeak(pEnv->releaseWeak),
227 m_env_registerProxyInterface (pEnv->pExtEnv->registerProxyInterface),
228 m_env_revokeInterface (pEnv->pExtEnv->revokeInterface),
229 m_env_getObjectIdentifier (pEnv->pExtEnv->getObjectIdentifier),
230 m_env_getRegisteredInterface (pEnv->pExtEnv->getRegisteredInterface),
231 m_env_getRegisteredInterfaces(pEnv->pExtEnv->getRegisteredInterfaces),
232 m_env_computeObjectIdentifier(pEnv->pExtEnv->computeObjectIdentifier),
233 m_env_acquireInterface (pEnv->pExtEnv->acquireInterface),
234 m_env_releaseInterface (pEnv->pExtEnv->releaseInterface)
236 SAL_INFO(
"cppu.purpenv",
"LIFE: cppu::helper::purpenv::Base::Base(uno_Environment * pEnv) -> " <<
this);
238 rtl_ustr_ascii_compare_WithLength(pEnv->pTypeName->buffer, rtl_str_getLength(UNO_LB_UNO), UNO_LB_UNO)
240 "### wrong environment type!");
257 pEnv->pReserved =
this;
262 SAL_INFO(
"cppu.purpenv",
"LIFE: cppu::helper::purpenv::Base::~Base() -> " <<
this);
264 m_pEnv->acquire = m_env_acquire;
265 m_pEnv->release = m_env_release;
266 m_pEnv->harden = m_env_harden;
267 m_pEnv->acquireWeak = m_env_acquireWeak;
268 m_pEnv->releaseWeak = m_env_releaseWeak;
270 m_pEnv->pReserved =
nullptr;
272 m_pEnterable.reset();
273 m_pEnv->release(m_pEnv);
278 m_env_acquire(m_pEnv);
280 osl_atomic_increment(&m_nRef);
285 if (osl_atomic_decrement(&m_nRef) == 0)
289 m_env_release(m_pEnv);
294 m_env_harden(ppHardEnv, m_pEnv);
295 osl_atomic_increment(&m_nRef);
298void Base::acquireWeak()
300 m_env_acquireWeak(m_pEnv);
303void Base::releaseWeak()
305 m_env_releaseWeak(m_pEnv);
311 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
312 void ** ppProxy = va_arg(*pParam,
void **);
313 uno_freeProxyFunc freeProxy = va_arg(*pParam, uno_freeProxyFunc);
314 rtl_uString * pOId = va_arg(*pParam, rtl_uString *);
315 typelib_InterfaceTypeDescription * pTypeDescr = va_arg(*pParam, typelib_InterfaceTypeDescription *);
319 pRegisterProxyInterface(pExtEnv, ppProxy, freeProxy, pOId, pTypeDescr);
322void Base::registerProxyInterface(
void ** ppProxy,
323 uno_freeProxyFunc freeProxy,
324 OUString
const & oid,
325 typelib_InterfaceTypeDescription * pTypeDescr)
334 m_env_registerProxyInterface);
340 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
341 void * pInterface = va_arg(*pParam,
void *);
344 pRevokeInterface(pExtEnv, pInterface);
347void Base::revokeInterface(
void * pInterface)
353 m_env_revokeInterface);
359 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
360 void * pInterface = va_arg(*pParam,
void *);
361 OUString * pOId = va_arg(*pParam, OUString *);
365 pGetObjectIdentifier(pExtEnv,
reinterpret_cast<rtl_uString **
>(pOId), pInterface);
368void Base::getObjectIdentifier(
void * pInterface, OUString * pOid)
375 m_env_getObjectIdentifier);
381 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
382 void ** ppInterface = va_arg(*pParam,
void **);
383 rtl_uString * pOId = va_arg(*pParam, rtl_uString *);
384 typelib_InterfaceTypeDescription * pTypeDescr = va_arg(*pParam, typelib_InterfaceTypeDescription *);
388 pGetRegisteredInterface(pExtEnv, ppInterface, pOId, pTypeDescr);
391void Base::getRegisteredInterface(
void ** ppInterface,
392 OUString
const & oid,
393 typelib_InterfaceTypeDescription * pTypeDescr)
401 m_env_getRegisteredInterface);
407 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
408 void *** pppInterface = va_arg(*pParam,
void ***);
409 sal_Int32 * pnLen = va_arg(*pParam, sal_Int32 *);
410 uno_memAlloc memAlloc = va_arg(*pParam, uno_memAlloc);
414 pGetRegisteredInterfaces(pExtEnv, pppInterface, pnLen, memAlloc);
417void Base::getRegisteredInterfaces(
void *** pppInterface,
419 uno_memAlloc memAlloc)
427 m_env_getRegisteredInterfaces);
433 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
434 void * pInterface = va_arg(*pParam,
void *);
435 OUString * pOId = va_arg(*pParam, OUString *);
439 pComputeObjectIdentifier(pExtEnv,
reinterpret_cast<rtl_uString **
>(pOId), pInterface);
442void Base::computeObjectIdentifier(
void * pInterface, OUString * pOid)
449 m_env_computeObjectIdentifier);
455 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
456 void * pInterface = va_arg(*pParam,
void *);
460 pAcquireInterface(pExtEnv, pInterface);
463void Base::acquireInterface(
void * pInterface)
471 uno_ExtEnvironment * pExtEnv = va_arg(*pParam, uno_ExtEnvironment *);
472 void * pInterface = va_arg(*pParam,
void *);
476 pReleaseInterface(pExtEnv, pInterface);
479void Base::releaseInterface(
void * pInterface)
485 m_env_releaseInterface);
490 m_pEnterable->enter();
495 m_pEnterable->leave();
498void Base::v_callInto_v(uno_EnvCallee * pCallee, va_list * pParam)
500 m_pEnterable->callInto_v(pCallee, pParam);
503void Base::v_callOut_v(uno_EnvCallee * pCallee, va_list * pParam)
505 m_pEnterable->callOut_v(pCallee, pParam);
508bool Base::v_isValid(OUString * pReason)
510 return m_pEnterable->isValid(pReason);
517 new Base(pEnvironment, pEnterable);
void SAL_CALL uno_Environment_invoke(uno_Environment *pEnv, uno_EnvCallee *pCallee,...) SAL_THROW_EXTERN_C()
C++ wrapper for binary C Enterable (http://wiki.openoffice.org/wiki/Uno/Cpp/Spec/Environment_Stack)
virtual bool v_isValid(rtl::OUString *pReason)=0
virtual void v_callOut_v(uno_EnvCallee *pCallee, va_list *pParam)=0
virtual void v_callInto_v(uno_EnvCallee *pCallee, va_list *pParam)=0
struct _uno_Environment uno_Environment
static void s_registerProxyInterface_v(va_list *pParam)
static void s_computeObjectIdentifier_v(va_list *pParam)
static void s_acquireInterface(uno_ExtEnvironment *pExtEnv, void *pInterface)
static void s_harden(uno_Environment **ppHardEnv, uno_Environment *pEnv) SAL_THROW_EXTERN_C()
void ExtEnv_acquireInterface(uno_ExtEnvironment *, void *pInterface)
static void s_acquire(uno_Environment *pEnv)
static void s_revokeInterface(uno_ExtEnvironment *pExtEnv, void *pInterface)
static void s_computeObjectIdentifier(uno_ExtEnvironment *pExtEnv, rtl_uString **ppOId, void *pInterface)
void ExtEnv_getRegisteredInterface(uno_ExtEnvironment *, void **, rtl_uString *, typelib_InterfaceTypeDescription *)
static void s_releaseInterface(uno_ExtEnvironment *pExtEnv, void *pInterface)
static void s_getRegisteredInterfaces(uno_ExtEnvironment *pExtEnv, void ***pppInterface, sal_Int32 *pnLen, uno_memAlloc memAlloc)
static void s_getRegisteredInterface_v(va_list *pParam)
void ExtEnv_getRegisteredInterfaces(uno_ExtEnvironment *, void ***pppInterfaces, sal_Int32 *pnLen, uno_memAlloc memAlloc)
static void s_acquireInterface_v(va_list *pParam)
static void s_getRegisteredInterfaces_v(va_list *pParam)
void ExtEnv_revokeInterface(uno_ExtEnvironment *, void *pInterface)
static void s_registerProxyInterface(uno_ExtEnvironment *pExtEnv, void **ppProxy, uno_freeProxyFunc freeProxy, rtl_uString *pOId, typelib_InterfaceTypeDescription *pTypeDescr)
static void s_getRegisteredInterface(uno_ExtEnvironment *pExtEnv, void **ppInterface, rtl_uString *pOId, typelib_InterfaceTypeDescription *pTypeDescr)
void ExtEnv_releaseInterface(uno_ExtEnvironment *, void *pInterface)
void ExtEnv_getObjectIdentifier(uno_ExtEnvironment *, rtl_uString **, void *)
static void s_release(uno_Environment *pEnv) SAL_THROW_EXTERN_C()
static void s_revokeInterface_v(va_list *pParam)
static void s_getObjectIdentifier(uno_ExtEnvironment *pExtEnv, rtl_uString **ppOId, void *pInterface)
static void s_acquireWeak(uno_Environment *pEnv) SAL_THROW_EXTERN_C()
void EnvFun_PP_P(uno_Environment **ppHardEnv, uno_Environment *)
void ExtEnv_registerProxyInterface(uno_ExtEnvironment *, void **ppProxy, uno_freeProxyFunc freeProxy, rtl_uString *pOId, typelib_InterfaceTypeDescription *pTypeDescr)
static void s_releaseWeak(uno_Environment *pEnv) SAL_THROW_EXTERN_C()
static void s_getObjectIdentifier_v(va_list *pParam)
static void s_releaseInterface_v(va_list *pParam)
void ExtEnv_computeObjectIdentifier(uno_ExtEnvironment *, rtl_uString **ppOId, void *pInterface)
void EnvFun_P(uno_Environment *)
oslInterlockedCount m_nRef
#define SAL_INFO(area, stream)
void Environment_initWithEnterable(uno_Environment *pEnvironment, cppu::Enterable *pEnterable)
C++ helper for implementing Purpose Environments.
#define SAL_THROW_EXTERN_C()