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