1*129fa3d1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*129fa3d1SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*129fa3d1SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*129fa3d1SAndrew Rist  * distributed with this work for additional information
6*129fa3d1SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*129fa3d1SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*129fa3d1SAndrew Rist  * "License"); you may not use this file except in compliance
9*129fa3d1SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*129fa3d1SAndrew Rist  *
11*129fa3d1SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*129fa3d1SAndrew Rist  *
13*129fa3d1SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*129fa3d1SAndrew Rist  * software distributed under the License is distributed on an
15*129fa3d1SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*129fa3d1SAndrew Rist  * KIND, either express or implied.  See the License for the
17*129fa3d1SAndrew Rist  * specific language governing permissions and limitations
18*129fa3d1SAndrew Rist  * under the License.
19*129fa3d1SAndrew Rist  *
20*129fa3d1SAndrew Rist  *************************************************************/
21*129fa3d1SAndrew Rist 
22*129fa3d1SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_cppu.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "cppu/helper/purpenv/Environment.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "osl/diagnose.h"
30cdf0e10cSrcweir #include "uno/lbnames.h"
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "typelib/typedescription.h"
33cdf0e10cSrcweir #include "osl/interlck.h"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #ifdef debug
36cdf0e10cSrcweir # define LOG_LIFECYCLE_cppu_helper_purpenv_Base
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #ifdef LOG_LIFECYCLE_cppu_helper_purpenv_Base
40cdf0e10cSrcweir #  include <iostream>
41cdf0e10cSrcweir #  define LOG_LIFECYCLE_cppu_helper_purpenv_Base_emit(x) x
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #else
44cdf0e10cSrcweir #  define LOG_LIFECYCLE_cppu_helper_purpenv_Base_emit(x)
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #endif
47cdf0e10cSrcweir 
48cdf0e10cSrcweir 
49cdf0e10cSrcweir extern "C" {
50cdf0e10cSrcweir typedef void SAL_CALL EnvFun_P   (uno_Environment *);
51cdf0e10cSrcweir typedef void SAL_CALL EnvFun_PP_P(uno_Environment ** ppHardEnv, uno_Environment *);
52cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_registerProxyInterface (uno_ExtEnvironment                 *,
53cdf0e10cSrcweir                                                      void                              ** ppProxy,
54cdf0e10cSrcweir                                                      uno_freeProxyFunc                    freeProxy,
55cdf0e10cSrcweir                                                      rtl_uString * pOId,
56cdf0e10cSrcweir                                                      typelib_InterfaceTypeDescription   * pTypeDescr);
57cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_revokeInterface        (uno_ExtEnvironment                 *,
58cdf0e10cSrcweir                                                      void                               * pInterface);
59cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_getObjectIdentifier    (uno_ExtEnvironment                 *,
60cdf0e10cSrcweir                                                      rtl_uString                       **,
61cdf0e10cSrcweir                                                      void                               *);
62cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_getRegisteredInterface (uno_ExtEnvironment                 *,
63cdf0e10cSrcweir                                                      void                              **,
64cdf0e10cSrcweir                                                      rtl_uString                        *,
65cdf0e10cSrcweir                                                      typelib_InterfaceTypeDescription   *);
66cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_getRegisteredInterfaces(uno_ExtEnvironment                 *,
67cdf0e10cSrcweir                                                      void                             *** pppInterfaces,
68cdf0e10cSrcweir                                                      sal_Int32                          * pnLen,
69cdf0e10cSrcweir                                                      uno_memAlloc                         memAlloc);
70cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_computeObjectIdentifier(uno_ExtEnvironment                 *,
71cdf0e10cSrcweir                                                      rtl_uString                       ** ppOId,
72cdf0e10cSrcweir                                                      void                               * pInterface);
73cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_acquireInterface       (uno_ExtEnvironment                 *,
74cdf0e10cSrcweir                                                      void                               * pInterface);
75cdf0e10cSrcweir typedef void SAL_CALL ExtEnv_releaseInterface       (uno_ExtEnvironment                 *,
76cdf0e10cSrcweir                                                      void                               * pInterface);
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir class Base : public cppu::Enterable
80cdf0e10cSrcweir {
81cdf0e10cSrcweir public:
82cdf0e10cSrcweir 	explicit Base(uno_Environment * pEnv, cppu::Enterable * pEnterable);
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	void acquireWeak(void);
85cdf0e10cSrcweir 	void releaseWeak(void);
86cdf0e10cSrcweir 	void harden     (uno_Environment ** ppHardEnv);
87cdf0e10cSrcweir 	void acquire    (void);
88cdf0e10cSrcweir 	void release    (void);
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 	void registerProxyInterface (void                                  ** ppProxy,
91cdf0e10cSrcweir 								 uno_freeProxyFunc                        freeProxy,
92cdf0e10cSrcweir 								 rtl::OUString                    const & oid,
93cdf0e10cSrcweir 								 typelib_InterfaceTypeDescription       * pTypeDescr);
94cdf0e10cSrcweir 	void revokeInterface        (void                                   * pInterface);
95cdf0e10cSrcweir 	void getObjectIdentifier    (void                                   * pInterface,
96cdf0e10cSrcweir 								 rtl::OUString                          * pOid);
97cdf0e10cSrcweir 	void getRegisteredInterface (void                                  **,
98cdf0e10cSrcweir 								 rtl::OUString                    const & oid,
99cdf0e10cSrcweir 								 typelib_InterfaceTypeDescription       *);
100cdf0e10cSrcweir 	void getRegisteredInterfaces(void                                 ***,
101cdf0e10cSrcweir 								 sal_Int32                              * pnLen,
102cdf0e10cSrcweir 								 uno_memAlloc                             memAlloc);
103cdf0e10cSrcweir 	void computeObjectIdentifier(void                                   * pInterface,
104cdf0e10cSrcweir 								 rtl::OUString                          * pOid);
105cdf0e10cSrcweir 	void acquireInterface       (void                                   * pInterface);
106cdf0e10cSrcweir 	void releaseInterface       (void                                   * pInterface);
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 	virtual void v_enter     (void);
109cdf0e10cSrcweir 	virtual void v_leave     (void);
110cdf0e10cSrcweir 	virtual void v_callInto_v(uno_EnvCallee * pCallee, va_list * pParam);
111cdf0e10cSrcweir 	virtual void v_callOut_v (uno_EnvCallee * pCallee, va_list * pParam);
112cdf0e10cSrcweir 	virtual int  v_isValid   (rtl::OUString * pReason);
113cdf0e10cSrcweir 
114cdf0e10cSrcweir protected:
115cdf0e10cSrcweir     oslInterlockedCount    m_nRef;
116cdf0e10cSrcweir 	uno_Environment      * m_pEnv;
117cdf0e10cSrcweir     cppu::Enterable      * m_pEnterable;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	EnvFun_P    * m_env_acquire;
120cdf0e10cSrcweir 	EnvFun_P    * m_env_release;
121cdf0e10cSrcweir 	EnvFun_PP_P * m_env_harden;
122cdf0e10cSrcweir 	EnvFun_P    * m_env_acquireWeak;
123cdf0e10cSrcweir 	EnvFun_P    * m_env_releaseWeak;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	ExtEnv_registerProxyInterface  * m_env_registerProxyInterface;
126cdf0e10cSrcweir 	ExtEnv_revokeInterface         * m_env_revokeInterface;
127cdf0e10cSrcweir 	ExtEnv_getObjectIdentifier     * m_env_getObjectIdentifier;
128cdf0e10cSrcweir 	ExtEnv_getRegisteredInterface  * m_env_getRegisteredInterface;
129cdf0e10cSrcweir 	ExtEnv_getRegisteredInterfaces * m_env_getRegisteredInterfaces;
130cdf0e10cSrcweir 	ExtEnv_computeObjectIdentifier * m_env_computeObjectIdentifier;
131cdf0e10cSrcweir 	ExtEnv_acquireInterface        * m_env_acquireInterface;
132cdf0e10cSrcweir 	ExtEnv_releaseInterface        * m_env_releaseInterface;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	virtual  ~Base();
135cdf0e10cSrcweir };
136cdf0e10cSrcweir 
137cdf0e10cSrcweir extern "C" {
s_acquire(uno_Environment * pEnv)138cdf0e10cSrcweir static void SAL_CALL s_acquire(uno_Environment * pEnv) //SAL_THROW_EXTERN_C()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pEnv->pReserved);
141cdf0e10cSrcweir 	pBase->acquire();
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
s_release(uno_Environment * pEnv)144cdf0e10cSrcweir static void SAL_CALL s_release(uno_Environment * pEnv) SAL_THROW_EXTERN_C()
145cdf0e10cSrcweir {
146cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pEnv->pReserved);
147cdf0e10cSrcweir 	pBase->release();
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
s_harden(uno_Environment ** ppHardEnv,uno_Environment * pEnv)150cdf0e10cSrcweir static void SAL_CALL s_harden(uno_Environment ** ppHardEnv, uno_Environment * pEnv) SAL_THROW_EXTERN_C()
151cdf0e10cSrcweir {
152cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pEnv->pReserved);
153cdf0e10cSrcweir 	pBase->harden(ppHardEnv);
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
s_acquireWeak(uno_Environment * pEnv)156cdf0e10cSrcweir static void SAL_CALL s_acquireWeak(uno_Environment * pEnv) SAL_THROW_EXTERN_C()
157cdf0e10cSrcweir {
158cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pEnv->pReserved);
159cdf0e10cSrcweir 	pBase->acquireWeak();
160cdf0e10cSrcweir }
161cdf0e10cSrcweir 
s_releaseWeak(uno_Environment * pEnv)162cdf0e10cSrcweir static void SAL_CALL s_releaseWeak(uno_Environment * pEnv) SAL_THROW_EXTERN_C()
163cdf0e10cSrcweir {
164cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pEnv->pReserved);
165cdf0e10cSrcweir 	pBase->releaseWeak();
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 
s_registerProxyInterface(uno_ExtEnvironment * pExtEnv,void ** ppProxy,uno_freeProxyFunc freeProxy,rtl_uString * pOId,typelib_InterfaceTypeDescription * pTypeDescr)169cdf0e10cSrcweir static void SAL_CALL s_registerProxyInterface(uno_ExtEnvironment                * pExtEnv,
170cdf0e10cSrcweir                                                          void                             ** ppProxy,
171cdf0e10cSrcweir                                                          uno_freeProxyFunc                   freeProxy,
172cdf0e10cSrcweir                                                          rtl_uString                       * pOId,
173cdf0e10cSrcweir                                                          typelib_InterfaceTypeDescription  * pTypeDescr)
174cdf0e10cSrcweir {
175cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
176cdf0e10cSrcweir 	pBase->registerProxyInterface(ppProxy, freeProxy, pOId, pTypeDescr);
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
s_revokeInterface(uno_ExtEnvironment * pExtEnv,void * pInterface)179cdf0e10cSrcweir static void SAL_CALL s_revokeInterface(uno_ExtEnvironment * pExtEnv, void * pInterface)
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
182cdf0e10cSrcweir 	pBase->revokeInterface(pInterface);
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
s_getObjectIdentifier(uno_ExtEnvironment * pExtEnv,rtl_uString ** ppOId,void * pInterface)185cdf0e10cSrcweir static void SAL_CALL s_getObjectIdentifier(uno_ExtEnvironment *  pExtEnv,
186cdf0e10cSrcweir                                                       rtl_uString        ** ppOId,
187cdf0e10cSrcweir                                                       void               *  pInterface)
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
190cdf0e10cSrcweir 	pBase->getObjectIdentifier(pInterface, reinterpret_cast<rtl::OUString *>(ppOId));
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
s_getRegisteredInterface(uno_ExtEnvironment * pExtEnv,void ** ppInterface,rtl_uString * pOId,typelib_InterfaceTypeDescription * pTypeDescr)193cdf0e10cSrcweir static void SAL_CALL s_getRegisteredInterface(uno_ExtEnvironment *  pExtEnv,
194cdf0e10cSrcweir                                                          void               ** ppInterface,
195cdf0e10cSrcweir                                                          rtl_uString        *  pOId,
196cdf0e10cSrcweir                                                          typelib_InterfaceTypeDescription * pTypeDescr)
197cdf0e10cSrcweir {
198cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
199cdf0e10cSrcweir 	pBase->getRegisteredInterface(ppInterface, pOId, pTypeDescr);
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
s_getRegisteredInterfaces(uno_ExtEnvironment * pExtEnv,void *** pppInterface,sal_Int32 * pnLen,uno_memAlloc memAlloc)202cdf0e10cSrcweir static void SAL_CALL s_getRegisteredInterfaces(uno_ExtEnvironment   * pExtEnv,
203cdf0e10cSrcweir                                                           void               *** pppInterface,
204cdf0e10cSrcweir                                                           sal_Int32            * pnLen,
205cdf0e10cSrcweir                                                           uno_memAlloc           memAlloc)
206cdf0e10cSrcweir {
207cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
208cdf0e10cSrcweir 	pBase->getRegisteredInterfaces(pppInterface, pnLen, memAlloc);
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
s_computeObjectIdentifier(uno_ExtEnvironment * pExtEnv,rtl_uString ** ppOId,void * pInterface)211cdf0e10cSrcweir static void SAL_CALL s_computeObjectIdentifier(uno_ExtEnvironment *  pExtEnv,
212cdf0e10cSrcweir                                                           rtl_uString        ** ppOId,
213cdf0e10cSrcweir                                                           void               *  pInterface)
214cdf0e10cSrcweir {
215cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
216cdf0e10cSrcweir 	pBase->computeObjectIdentifier(pInterface, reinterpret_cast<rtl::OUString *>(ppOId));
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
s_acquireInterface(uno_ExtEnvironment * pExtEnv,void * pInterface)219cdf0e10cSrcweir static void SAL_CALL s_acquireInterface(uno_ExtEnvironment * pExtEnv, void * pInterface) {
220cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
221cdf0e10cSrcweir 	pBase->acquireInterface(pInterface);
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
s_releaseInterface(uno_ExtEnvironment * pExtEnv,void * pInterface)224cdf0e10cSrcweir static void SAL_CALL s_releaseInterface(uno_ExtEnvironment * pExtEnv, void * pInterface) {
225cdf0e10cSrcweir 	Base * pBase = static_cast<Base *>(pExtEnv->aBase.pReserved);
226cdf0e10cSrcweir 	pBase->releaseInterface(pInterface);
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
Base(uno_Environment * pEnv,cppu::Enterable * pEnterable)231cdf0e10cSrcweir Base::Base(uno_Environment * pEnv, cppu::Enterable * pEnterable)
232cdf0e10cSrcweir 	:m_nRef(1),
233cdf0e10cSrcweir 	 m_pEnv(pEnv),
234cdf0e10cSrcweir      m_pEnterable     (pEnterable),
235cdf0e10cSrcweir 	 m_env_acquire    (pEnv->acquire),
236cdf0e10cSrcweir 	 m_env_release    (pEnv->release),
237cdf0e10cSrcweir 	 m_env_harden     (pEnv->harden),
238cdf0e10cSrcweir 	 m_env_acquireWeak(pEnv->acquireWeak),
239cdf0e10cSrcweir 	 m_env_releaseWeak(pEnv->releaseWeak),
240cdf0e10cSrcweir 	 m_env_registerProxyInterface (pEnv->pExtEnv->registerProxyInterface),
241cdf0e10cSrcweir 	 m_env_revokeInterface        (pEnv->pExtEnv->revokeInterface),
242cdf0e10cSrcweir 	 m_env_getObjectIdentifier    (pEnv->pExtEnv->getObjectIdentifier),
243cdf0e10cSrcweir 	 m_env_getRegisteredInterface (pEnv->pExtEnv->getRegisteredInterface),
244cdf0e10cSrcweir 	 m_env_getRegisteredInterfaces(pEnv->pExtEnv->getRegisteredInterfaces),
245cdf0e10cSrcweir 	 m_env_computeObjectIdentifier(pEnv->pExtEnv->computeObjectIdentifier),
246cdf0e10cSrcweir 	 m_env_acquireInterface       (pEnv->pExtEnv->acquireInterface),
247cdf0e10cSrcweir 	 m_env_releaseInterface       (pEnv->pExtEnv->releaseInterface)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir 	LOG_LIFECYCLE_cppu_helper_purpenv_Base_emit(fprintf(stderr, "LIFE: %s -> %p\n", "cppu::helper::purpenv::Base::Base(uno_Environment * pEnv)", this));
250cdf0e10cSrcweir 	OSL_ENSURE(
251cdf0e10cSrcweir 		rtl_ustr_ascii_compare_WithLength(pEnv->pTypeName->buffer, rtl_str_getLength(UNO_LB_UNO), UNO_LB_UNO)
252cdf0e10cSrcweir 			== 0,
253cdf0e10cSrcweir 			"### wrong environment type!");
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 	pEnv->acquire     = s_acquire;
256cdf0e10cSrcweir 	pEnv->release     = s_release;
257cdf0e10cSrcweir 	pEnv->harden      = s_harden;
258cdf0e10cSrcweir 	pEnv->acquireWeak = s_acquireWeak;
259cdf0e10cSrcweir 	pEnv->releaseWeak = s_releaseWeak;
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 	pEnv->pExtEnv->registerProxyInterface  = s_registerProxyInterface;
262cdf0e10cSrcweir 	pEnv->pExtEnv->revokeInterface         = s_revokeInterface;
263cdf0e10cSrcweir 	pEnv->pExtEnv->getObjectIdentifier     = s_getObjectIdentifier;
264cdf0e10cSrcweir 	pEnv->pExtEnv->getRegisteredInterface  = s_getRegisteredInterface;
265cdf0e10cSrcweir 	pEnv->pExtEnv->getRegisteredInterfaces = s_getRegisteredInterfaces;
266cdf0e10cSrcweir 	pEnv->pExtEnv->computeObjectIdentifier = s_computeObjectIdentifier;
267cdf0e10cSrcweir 	pEnv->pExtEnv->acquireInterface        = s_acquireInterface;
268cdf0e10cSrcweir 	pEnv->pExtEnv->releaseInterface        = s_releaseInterface;
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 	pEnv->pReserved = this;
271cdf0e10cSrcweir }
272cdf0e10cSrcweir 
~Base()273cdf0e10cSrcweir Base::~Base()
274cdf0e10cSrcweir {
275cdf0e10cSrcweir 	LOG_LIFECYCLE_cppu_helper_purpenv_Base_emit(fprintf(stderr, "LIFE: %s -> %p\n", "cppu::helper::purpenv::Base::~Base()", this));
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	m_pEnv->acquire     = m_env_acquire;
278cdf0e10cSrcweir 	m_pEnv->release     = m_env_release;
279cdf0e10cSrcweir 	m_pEnv->harden      = m_env_harden;
280cdf0e10cSrcweir 	m_pEnv->acquireWeak = m_env_acquireWeak;
281cdf0e10cSrcweir 	m_pEnv->releaseWeak = m_env_releaseWeak;
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	m_pEnv->pReserved = NULL;
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     delete m_pEnterable;
286cdf0e10cSrcweir 	m_pEnv->release(m_pEnv);
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
acquire(void)289cdf0e10cSrcweir void Base::acquire(void)
290cdf0e10cSrcweir {
291cdf0e10cSrcweir 	m_env_acquire(m_pEnv);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     osl_incrementInterlockedCount(&m_nRef);
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
release(void)296cdf0e10cSrcweir void Base::release(void)
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     if (osl_decrementInterlockedCount(&m_nRef) == 0)
299cdf0e10cSrcweir 		delete this;
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	else
302cdf0e10cSrcweir 		m_env_release(m_pEnv);
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
harden(uno_Environment ** ppHardEnv)305cdf0e10cSrcweir void Base::harden(uno_Environment ** ppHardEnv)
306cdf0e10cSrcweir {
307cdf0e10cSrcweir 	m_env_harden(ppHardEnv, m_pEnv);
308cdf0e10cSrcweir     osl_incrementInterlockedCount(&m_nRef);
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
acquireWeak(void)311cdf0e10cSrcweir void Base::acquireWeak(void)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	m_env_acquireWeak(m_pEnv);
314cdf0e10cSrcweir }
315cdf0e10cSrcweir 
releaseWeak(void)316cdf0e10cSrcweir void Base::releaseWeak(void)
317cdf0e10cSrcweir {
318cdf0e10cSrcweir 	m_env_releaseWeak(m_pEnv);
319cdf0e10cSrcweir }
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 
s_registerProxyInterface_v(va_list * pParam)322cdf0e10cSrcweir extern "C" { static void s_registerProxyInterface_v(va_list * pParam)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	uno_ExtEnvironment                   * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
325cdf0e10cSrcweir 	void                                ** ppProxy    = va_arg(*pParam, void **);
326cdf0e10cSrcweir 	uno_freeProxyFunc                      freeProxy  = va_arg(*pParam, uno_freeProxyFunc);
327cdf0e10cSrcweir 	rtl_uString                          * pOId       = va_arg(*pParam, rtl_uString *);
328cdf0e10cSrcweir 	typelib_InterfaceTypeDescription     * pTypeDescr = va_arg(*pParam, typelib_InterfaceTypeDescription *);
329cdf0e10cSrcweir 	ExtEnv_registerProxyInterface  * pRegisterProxyInterface
330cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_registerProxyInterface *);
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	pRegisterProxyInterface(pExtEnv, ppProxy, freeProxy, pOId, pTypeDescr);
333cdf0e10cSrcweir }}
334cdf0e10cSrcweir 
registerProxyInterface(void ** ppProxy,uno_freeProxyFunc freeProxy,rtl::OUString const & oid,typelib_InterfaceTypeDescription * pTypeDescr)335cdf0e10cSrcweir void Base::registerProxyInterface(void                                  ** ppProxy,
336cdf0e10cSrcweir 								  uno_freeProxyFunc                        freeProxy,
337cdf0e10cSrcweir 								  rtl::OUString                    const & oid,
338cdf0e10cSrcweir 								  typelib_InterfaceTypeDescription       * pTypeDescr)
339cdf0e10cSrcweir {
340cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
341cdf0e10cSrcweir 						   s_registerProxyInterface_v,
342cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
343cdf0e10cSrcweir 						   ppProxy,
344cdf0e10cSrcweir 						   freeProxy,
345cdf0e10cSrcweir 						   oid.pData,
346cdf0e10cSrcweir 						   pTypeDescr,
347cdf0e10cSrcweir 						   m_env_registerProxyInterface);
348cdf0e10cSrcweir }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 
s_revokeInterface_v(va_list * pParam)351cdf0e10cSrcweir extern "C" { static void s_revokeInterface_v(va_list * pParam)
352cdf0e10cSrcweir {
353cdf0e10cSrcweir 	uno_ExtEnvironment * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
354cdf0e10cSrcweir 	void               * pInterface = va_arg(*pParam, void *);
355cdf0e10cSrcweir 	ExtEnv_revokeInterface * pRevokeInterface = va_arg(*pParam, ExtEnv_revokeInterface *);
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 	pRevokeInterface(pExtEnv, pInterface);
358cdf0e10cSrcweir }}
359cdf0e10cSrcweir 
revokeInterface(void * pInterface)360cdf0e10cSrcweir void Base::revokeInterface(void * pInterface)
361cdf0e10cSrcweir {
362cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
363cdf0e10cSrcweir 						   s_revokeInterface_v,
364cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
365cdf0e10cSrcweir 						   pInterface,
366cdf0e10cSrcweir 						   m_env_revokeInterface);
367cdf0e10cSrcweir }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir 
s_getObjectIdentifier_v(va_list * pParam)370cdf0e10cSrcweir extern "C" { static void s_getObjectIdentifier_v(va_list * pParam)
371cdf0e10cSrcweir {
372cdf0e10cSrcweir 	uno_ExtEnvironment * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
373cdf0e10cSrcweir 	void               * pInterface = va_arg(*pParam, void *);
374cdf0e10cSrcweir 	rtl::OUString      * pOId       = va_arg(*pParam, rtl::OUString *);
375cdf0e10cSrcweir 	ExtEnv_getObjectIdentifier * pGetObjectIdentifier
376cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_getObjectIdentifier *);
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	pGetObjectIdentifier(pExtEnv, reinterpret_cast<rtl_uString **>(pOId), pInterface);
379cdf0e10cSrcweir }}
380cdf0e10cSrcweir 
getObjectIdentifier(void * pInterface,rtl::OUString * pOid)381cdf0e10cSrcweir void Base::getObjectIdentifier(void * pInterface, rtl::OUString * pOid)
382cdf0e10cSrcweir {
383cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
384cdf0e10cSrcweir 						   s_getObjectIdentifier_v,
385cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
386cdf0e10cSrcweir 						   pInterface,
387cdf0e10cSrcweir 						   pOid,
388cdf0e10cSrcweir 						   m_env_getObjectIdentifier);
389cdf0e10cSrcweir }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir 
s_getRegisteredInterface_v(va_list * pParam)392cdf0e10cSrcweir extern "C" { static void s_getRegisteredInterface_v(va_list * pParam)
393cdf0e10cSrcweir {
394cdf0e10cSrcweir 	uno_ExtEnvironment                   * pExtEnv     = va_arg(*pParam, uno_ExtEnvironment *);
395cdf0e10cSrcweir 	void                                ** ppInterface = va_arg(*pParam, void **);
396cdf0e10cSrcweir 	rtl_uString                          * pOId        = va_arg(*pParam, rtl_uString *);
397cdf0e10cSrcweir 	typelib_InterfaceTypeDescription     * pTypeDescr  = va_arg(*pParam, typelib_InterfaceTypeDescription *);
398cdf0e10cSrcweir 	ExtEnv_getRegisteredInterface  * pGetRegisteredInterface
399cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_getRegisteredInterface *);
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 	pGetRegisteredInterface(pExtEnv, ppInterface, pOId, pTypeDescr);
402cdf0e10cSrcweir }}
403cdf0e10cSrcweir 
getRegisteredInterface(void ** ppInterface,rtl::OUString const & oid,typelib_InterfaceTypeDescription * pTypeDescr)404cdf0e10cSrcweir void Base::getRegisteredInterface(void ** ppInterface,
405cdf0e10cSrcweir 								  rtl::OUString const & oid,
406cdf0e10cSrcweir 								  typelib_InterfaceTypeDescription * pTypeDescr)
407cdf0e10cSrcweir {
408cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
409cdf0e10cSrcweir 						   s_getRegisteredInterface_v,
410cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
411cdf0e10cSrcweir 						   ppInterface,
412cdf0e10cSrcweir 						   oid.pData,
413cdf0e10cSrcweir 						   pTypeDescr,
414cdf0e10cSrcweir 						   m_env_getRegisteredInterface);
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 
s_getRegisteredInterfaces_v(va_list * pParam)418cdf0e10cSrcweir extern "C" { static void s_getRegisteredInterfaces_v(va_list * pParam)
419cdf0e10cSrcweir {
420cdf0e10cSrcweir 	uno_ExtEnvironment   * pExtEnv      = va_arg(*pParam, uno_ExtEnvironment *);
421cdf0e10cSrcweir 	void               *** pppInterface = va_arg(*pParam, void ***);
422cdf0e10cSrcweir 	sal_Int32            * pnLen        = va_arg(*pParam, sal_Int32 *);
423cdf0e10cSrcweir 	uno_memAlloc           memAlloc     = va_arg(*pParam, uno_memAlloc);
424cdf0e10cSrcweir 	ExtEnv_getRegisteredInterfaces * pGetRegisteredInterfaces
425cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_getRegisteredInterfaces *);
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 	pGetRegisteredInterfaces(pExtEnv, pppInterface, pnLen, memAlloc);
428cdf0e10cSrcweir }}
429cdf0e10cSrcweir 
getRegisteredInterfaces(void *** pppInterface,sal_Int32 * pnLen,uno_memAlloc memAlloc)430cdf0e10cSrcweir void Base::getRegisteredInterfaces(void         *** pppInterface,
431cdf0e10cSrcweir 								   sal_Int32      * pnLen,
432cdf0e10cSrcweir 								   uno_memAlloc     memAlloc)
433cdf0e10cSrcweir {
434cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
435cdf0e10cSrcweir 						   s_getRegisteredInterfaces_v,
436cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
437cdf0e10cSrcweir 						   pppInterface,
438cdf0e10cSrcweir 						   pnLen,
439cdf0e10cSrcweir 						   memAlloc,
440cdf0e10cSrcweir 						   m_env_getRegisteredInterfaces);
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 
s_computeObjectIdentifier_v(va_list * pParam)444cdf0e10cSrcweir extern "C" { static void s_computeObjectIdentifier_v(va_list * pParam)
445cdf0e10cSrcweir {
446cdf0e10cSrcweir 	uno_ExtEnvironment * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
447cdf0e10cSrcweir 	void               * pInterface = va_arg(*pParam, void *);
448cdf0e10cSrcweir 	rtl::OUString      * pOId       = va_arg(*pParam, rtl::OUString *);
449cdf0e10cSrcweir 	ExtEnv_computeObjectIdentifier * pComputeObjectIdentifier
450cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_computeObjectIdentifier *);
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 	pComputeObjectIdentifier(pExtEnv, reinterpret_cast<rtl_uString **>(pOId), pInterface);
453cdf0e10cSrcweir }}
454cdf0e10cSrcweir 
computeObjectIdentifier(void * pInterface,rtl::OUString * pOid)455cdf0e10cSrcweir void Base::computeObjectIdentifier(void * pInterface, rtl::OUString * pOid)
456cdf0e10cSrcweir {
457cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
458cdf0e10cSrcweir 						   s_computeObjectIdentifier_v,
459cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
460cdf0e10cSrcweir 						   pInterface,
461cdf0e10cSrcweir 						   pOid,
462cdf0e10cSrcweir 						   m_env_computeObjectIdentifier);
463cdf0e10cSrcweir }
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 
s_acquireInterface_v(va_list * pParam)466cdf0e10cSrcweir extern "C" { static void s_acquireInterface_v(va_list * pParam)
467cdf0e10cSrcweir {
468cdf0e10cSrcweir 	uno_ExtEnvironment * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
469cdf0e10cSrcweir 	void               * pInterface = va_arg(*pParam, void *);
470cdf0e10cSrcweir 	ExtEnv_acquireInterface * pAcquireInterface
471cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_acquireInterface *);
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 	pAcquireInterface(pExtEnv, pInterface);
474cdf0e10cSrcweir }}
475cdf0e10cSrcweir 
acquireInterface(void * pInterface)476cdf0e10cSrcweir void Base::acquireInterface(void * pInterface)
477cdf0e10cSrcweir {
478cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv, s_acquireInterface_v, m_pEnv->pExtEnv, pInterface, m_env_acquireInterface);
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 
s_releaseInterface_v(va_list * pParam)482cdf0e10cSrcweir extern "C" { static void s_releaseInterface_v(va_list * pParam)
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	uno_ExtEnvironment * pExtEnv    = va_arg(*pParam, uno_ExtEnvironment *);
485cdf0e10cSrcweir 	void               * pInterface = va_arg(*pParam, void *);
486cdf0e10cSrcweir 	ExtEnv_releaseInterface * pReleaseInterface
487cdf0e10cSrcweir 		= va_arg(*pParam, ExtEnv_releaseInterface *);
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 	pReleaseInterface(pExtEnv, pInterface);
490cdf0e10cSrcweir }}
491cdf0e10cSrcweir 
releaseInterface(void * pInterface)492cdf0e10cSrcweir void Base::releaseInterface(void * pInterface)
493cdf0e10cSrcweir {
494cdf0e10cSrcweir  	uno_Environment_invoke(m_pEnv,
495cdf0e10cSrcweir 						   s_releaseInterface_v,
496cdf0e10cSrcweir 						   m_pEnv->pExtEnv,
497cdf0e10cSrcweir 						   pInterface,
498cdf0e10cSrcweir 						   m_env_releaseInterface);
499cdf0e10cSrcweir }
500cdf0e10cSrcweir 
v_enter(void)501cdf0e10cSrcweir void Base::v_enter(void)
502cdf0e10cSrcweir {
503cdf0e10cSrcweir     m_pEnterable->enter();
504cdf0e10cSrcweir }
505cdf0e10cSrcweir 
v_leave(void)506cdf0e10cSrcweir void Base::v_leave(void)
507cdf0e10cSrcweir {
508cdf0e10cSrcweir     m_pEnterable->leave();
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
v_callInto_v(uno_EnvCallee * pCallee,va_list * pParam)511cdf0e10cSrcweir void Base::v_callInto_v(uno_EnvCallee * pCallee, va_list * pParam)
512cdf0e10cSrcweir {
513cdf0e10cSrcweir     m_pEnterable->callInto_v(pCallee, pParam);
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
v_callOut_v(uno_EnvCallee * pCallee,va_list * pParam)516cdf0e10cSrcweir void Base::v_callOut_v(uno_EnvCallee * pCallee, va_list * pParam)
517cdf0e10cSrcweir {
518cdf0e10cSrcweir     m_pEnterable->callOut_v(pCallee, pParam);
519cdf0e10cSrcweir }
520cdf0e10cSrcweir 
v_isValid(rtl::OUString * pReason)521cdf0e10cSrcweir int Base::v_isValid(rtl::OUString * pReason)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir     return m_pEnterable->isValid(pReason);
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir namespace cppu { namespace helper { namespace purpenv {
527cdf0e10cSrcweir 
Environment_initWithEnterable(uno_Environment * pEnvironment,cppu::Enterable * pEnterable)528cdf0e10cSrcweir void Environment_initWithEnterable(uno_Environment * pEnvironment, cppu::Enterable * pEnterable)
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     new Base(pEnvironment, pEnterable);
531cdf0e10cSrcweir }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir }}}
534