xref: /AOO41X/main/cppu/inc/uno/environment.hxx (revision c6ed87c9b37761ea466ee21111c4a4a314092829)
1*c6ed87c9SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c6ed87c9SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c6ed87c9SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c6ed87c9SAndrew Rist  * distributed with this work for additional information
6*c6ed87c9SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c6ed87c9SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c6ed87c9SAndrew Rist  * "License"); you may not use this file except in compliance
9*c6ed87c9SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*c6ed87c9SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*c6ed87c9SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c6ed87c9SAndrew Rist  * software distributed under the License is distributed on an
15*c6ed87c9SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c6ed87c9SAndrew Rist  * KIND, either express or implied.  See the License for the
17*c6ed87c9SAndrew Rist  * specific language governing permissions and limitations
18*c6ed87c9SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*c6ed87c9SAndrew Rist  *************************************************************/
21*c6ed87c9SAndrew Rist 
22*c6ed87c9SAndrew Rist 
23cdf0e10cSrcweir #ifndef _UNO_ENVIRONMENT_HXX_
24cdf0e10cSrcweir #define _UNO_ENVIRONMENT_HXX_
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <rtl/alloc.h>
27cdf0e10cSrcweir #include <rtl/ustring.hxx>
28cdf0e10cSrcweir #include <uno/environment.h>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include "uno/lbnames.h"
31cdf0e10cSrcweir 
32cdf0e10cSrcweir /** */ //for docpp
33cdf0e10cSrcweir namespace com
34cdf0e10cSrcweir {
35cdf0e10cSrcweir /** */ //for docpp
36cdf0e10cSrcweir namespace sun
37cdf0e10cSrcweir {
38cdf0e10cSrcweir /** */ //for docpp
39cdf0e10cSrcweir namespace star
40cdf0e10cSrcweir {
41cdf0e10cSrcweir /** */ //for docpp
42cdf0e10cSrcweir namespace uno
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 
45cdf0e10cSrcweir /** C++ wrapper for binary C uno_Environment.
46cdf0e10cSrcweir 
47cdf0e10cSrcweir     @see uno_Environment
48cdf0e10cSrcweir */
49cdf0e10cSrcweir class Environment
50cdf0e10cSrcweir {
51cdf0e10cSrcweir 	/** binary C uno_Environment
52cdf0e10cSrcweir 	*/
53cdf0e10cSrcweir 	uno_Environment * _pEnv;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir public:
56cdf0e10cSrcweir     /** Returns the current Environment.
57cdf0e10cSrcweir 
58cdf0e10cSrcweir         @param env_type   the optional type of the Environment, falls back to "uno" in case being empty,
59cdf0e10cSrcweir 	                      respectively to current C++ Environment.
60cdf0e10cSrcweir         @since UDK 3.2.7
61cdf0e10cSrcweir     */
62cdf0e10cSrcweir     inline static Environment getCurrent(rtl::OUString const & typeName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(CPPU_STRINGIFY(CPPU_ENV)))) SAL_THROW( () );
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	// these are here to force memory de/allocation to sal lib.
65cdf0e10cSrcweir     /** @internal */
operator new(size_t nSize)66cdf0e10cSrcweir 	inline static void * SAL_CALL operator new ( size_t nSize ) SAL_THROW( () )
67cdf0e10cSrcweir 		{ return ::rtl_allocateMemory( nSize ); }
68cdf0e10cSrcweir     /** @internal */
operator delete(void * pMem)69cdf0e10cSrcweir 	inline static void SAL_CALL operator delete ( void * pMem ) SAL_THROW( () )
70cdf0e10cSrcweir 		{ ::rtl_freeMemory( pMem ); }
71cdf0e10cSrcweir     /** @internal */
operator new(size_t,void * pMem)72cdf0e10cSrcweir 	inline static void * SAL_CALL operator new ( size_t, void * pMem ) SAL_THROW( () )
73cdf0e10cSrcweir 		{ return pMem; }
74cdf0e10cSrcweir     /** @internal */
operator delete(void *,void *)75cdf0e10cSrcweir 	inline static void SAL_CALL operator delete ( void *, void * ) SAL_THROW( () )
76cdf0e10cSrcweir 		{}
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 	/** Constructor: acquires given environment
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 		@param pEnv environment
81cdf0e10cSrcweir 	*/
82cdf0e10cSrcweir 	inline Environment( uno_Environment * pEnv = 0 ) SAL_THROW( () );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	/** Gets a specific environment. If the specified environment does not exist, then a default one
85cdf0e10cSrcweir 		is created and registered.
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 		@param envDcp           descriptor of the environment
88cdf0e10cSrcweir 		@param pContext         context pointer
89cdf0e10cSrcweir 	*/
90cdf0e10cSrcweir 	inline explicit Environment( rtl::OUString const & envDcp, void * pContext = NULL ) SAL_THROW( () );
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	/** Copy constructor: acquires given environment
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 		@param rEnv another environment
96cdf0e10cSrcweir 	*/
97cdf0e10cSrcweir 	inline Environment( const Environment & rEnv ) SAL_THROW( () );
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 	/** Destructor: releases a set environment.
100cdf0e10cSrcweir 	*/
101cdf0e10cSrcweir 	inline ~Environment() SAL_THROW( () );
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	/** Sets a given environment, i.e. acquires given one and releases a set one.
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 		@param pEnv another environment
106cdf0e10cSrcweir 		@return this environment
107cdf0e10cSrcweir 	*/
108cdf0e10cSrcweir 	inline Environment & SAL_CALL operator = ( uno_Environment * pEnv ) SAL_THROW( () );
109cdf0e10cSrcweir 	/** Sets a given environment, i.e. acquires given one and releases a set one.
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 		@param rEnv another environment
112cdf0e10cSrcweir 		@return this environment
113cdf0e10cSrcweir 	*/
operator =(const Environment & rEnv)114cdf0e10cSrcweir 	inline Environment & SAL_CALL operator = ( const Environment & rEnv ) SAL_THROW( () )
115cdf0e10cSrcweir 		{ return operator = ( rEnv._pEnv ); }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	/** Provides UNacquired pointer to the set C environment.
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 		@return UNacquired pointer to the C environment struct
120cdf0e10cSrcweir 	*/
get() const121cdf0e10cSrcweir 	inline uno_Environment * SAL_CALL get() const SAL_THROW( () )
122cdf0e10cSrcweir 		{ return _pEnv; }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir 	/** Gets type name of set environment.
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 		@return type name of set environment
127cdf0e10cSrcweir 	*/
getTypeName() const128cdf0e10cSrcweir 	inline ::rtl::OUString SAL_CALL getTypeName() const SAL_THROW( () )
129cdf0e10cSrcweir 		{ return _pEnv->pTypeName; }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	/** Gets free context pointer of set environment.
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 		@return free context pointer of set environment
134cdf0e10cSrcweir 	*/
getContext() const135cdf0e10cSrcweir 	inline void * SAL_CALL getContext() const SAL_THROW( () )
136cdf0e10cSrcweir 		{ return _pEnv->pContext; }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 	/** Tests if a environment is set.
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 		@return true, if a environment is set, false otherwise
141cdf0e10cSrcweir 	*/
is() const142cdf0e10cSrcweir 	inline sal_Bool SAL_CALL is() const SAL_THROW( () )
143cdf0e10cSrcweir 		{ return (_pEnv != 0); }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	/** Releases a set environment.
146cdf0e10cSrcweir 	*/
147cdf0e10cSrcweir 	inline void SAL_CALL clear() SAL_THROW( () );
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 	/** Invoke the passed function in this environment.
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 		@param pCallee  the function to call
152cdf0e10cSrcweir 		@param pParam   the parameter pointer to be passed to the function
153cdf0e10cSrcweir         @since UDK 3.2.7
154cdf0e10cSrcweir 	*/
155cdf0e10cSrcweir 	inline void SAL_CALL invoke_v(uno_EnvCallee * pCallee, va_list * pParam) const SAL_THROW( () );
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	/** Invoke the passed function in this environment.
158cdf0e10cSrcweir 
159cdf0e10cSrcweir         @param pCallee  the function to call
160cdf0e10cSrcweir         @param ...      the parameters to be passed to the function
161cdf0e10cSrcweir         @since UDK 3.2.7
162cdf0e10cSrcweir 	*/
163cdf0e10cSrcweir 	inline void SAL_CALL invoke(uno_EnvCallee * pCallee, ...) const SAL_THROW( () );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     /** Enter this environment explicitly.
166cdf0e10cSrcweir 
167cdf0e10cSrcweir         @since UDK 3.2.7
168cdf0e10cSrcweir 	*/
169cdf0e10cSrcweir 	inline void SAL_CALL enter() const SAL_THROW( () );
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     /** Checks, if it is valid to currently call objects
172cdf0e10cSrcweir         belonging to this environment.
173cdf0e10cSrcweir 
174cdf0e10cSrcweir         @since UDK 3.2.7
175cdf0e10cSrcweir     */
176cdf0e10cSrcweir 	inline int  SAL_CALL isValid(rtl::OUString * pReason) const SAL_THROW( () );
177cdf0e10cSrcweir };
178cdf0e10cSrcweir //__________________________________________________________________________________________________
Environment(uno_Environment * pEnv)179cdf0e10cSrcweir inline Environment::Environment( uno_Environment * pEnv ) SAL_THROW( () )
180cdf0e10cSrcweir 	: _pEnv( pEnv )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir 	if (_pEnv)
183cdf0e10cSrcweir 		(*_pEnv->acquire)( _pEnv );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir //__________________________________________________________________________________________________
Environment(rtl::OUString const & rEnvDcp,void * pContext)186cdf0e10cSrcweir inline Environment::Environment( rtl::OUString const & rEnvDcp, void * pContext ) SAL_THROW( () )
187cdf0e10cSrcweir 	: _pEnv(NULL)
188cdf0e10cSrcweir {
189cdf0e10cSrcweir 	uno_getEnvironment(&_pEnv, rEnvDcp.pData, pContext);
190cdf0e10cSrcweir }
191cdf0e10cSrcweir //__________________________________________________________________________________________________
Environment(const Environment & rEnv)192cdf0e10cSrcweir inline Environment::Environment( const Environment & rEnv ) SAL_THROW( () )
193cdf0e10cSrcweir 	: _pEnv( rEnv._pEnv )
194cdf0e10cSrcweir {
195cdf0e10cSrcweir 	if (_pEnv)
196cdf0e10cSrcweir 		(*_pEnv->acquire)( _pEnv );
197cdf0e10cSrcweir }
198cdf0e10cSrcweir //__________________________________________________________________________________________________
~Environment()199cdf0e10cSrcweir inline Environment::~Environment() SAL_THROW( () )
200cdf0e10cSrcweir {
201cdf0e10cSrcweir 	if (_pEnv)
202cdf0e10cSrcweir 		(*_pEnv->release)( _pEnv );
203cdf0e10cSrcweir }
204cdf0e10cSrcweir //__________________________________________________________________________________________________
clear()205cdf0e10cSrcweir inline void Environment::clear() SAL_THROW( () )
206cdf0e10cSrcweir {
207cdf0e10cSrcweir 	if (_pEnv)
208cdf0e10cSrcweir 	{
209cdf0e10cSrcweir 		(*_pEnv->release)( _pEnv );
210cdf0e10cSrcweir 		_pEnv = 0;
211cdf0e10cSrcweir 	}
212cdf0e10cSrcweir }
213cdf0e10cSrcweir //__________________________________________________________________________________________________
operator =(uno_Environment * pEnv)214cdf0e10cSrcweir inline Environment & Environment::operator = ( uno_Environment * pEnv ) SAL_THROW( () )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir 	if (pEnv != _pEnv)
217cdf0e10cSrcweir 	{
218cdf0e10cSrcweir 		if (pEnv)
219cdf0e10cSrcweir 			(*pEnv->acquire)( pEnv );
220cdf0e10cSrcweir 		if (_pEnv)
221cdf0e10cSrcweir 			(*_pEnv->release)( _pEnv );
222cdf0e10cSrcweir 		_pEnv = pEnv;
223cdf0e10cSrcweir 	}
224cdf0e10cSrcweir 	return *this;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir //__________________________________________________________________________________________________
invoke_v(uno_EnvCallee * pCallee,va_list * pParam) const227cdf0e10cSrcweir inline void SAL_CALL Environment::invoke_v(uno_EnvCallee * pCallee, va_list * pParam) const SAL_THROW( () )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir 	if (_pEnv)
230cdf0e10cSrcweir 		uno_Environment_invoke_v(_pEnv, pCallee, pParam);
231cdf0e10cSrcweir }
232cdf0e10cSrcweir //__________________________________________________________________________________________________
invoke(uno_EnvCallee * pCallee,...) const233cdf0e10cSrcweir inline void SAL_CALL Environment::invoke(uno_EnvCallee * pCallee, ...) const SAL_THROW( () )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir 	if (_pEnv)
236cdf0e10cSrcweir 	{
237cdf0e10cSrcweir 		va_list param;
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 		va_start(param, pCallee);
240cdf0e10cSrcweir 		uno_Environment_invoke_v(_pEnv, pCallee, &param);
241cdf0e10cSrcweir 		va_end(param);
242cdf0e10cSrcweir 	}
243cdf0e10cSrcweir 
244cdf0e10cSrcweir }
245cdf0e10cSrcweir //__________________________________________________________________________________________________
enter() const246cdf0e10cSrcweir inline void SAL_CALL Environment::enter() const SAL_THROW( () )
247cdf0e10cSrcweir {
248cdf0e10cSrcweir 	uno_Environment_enter(_pEnv);
249cdf0e10cSrcweir }
250cdf0e10cSrcweir //__________________________________________________________________________________________________
isValid(rtl::OUString * pReason) const251cdf0e10cSrcweir inline int  SAL_CALL Environment::isValid(rtl::OUString * pReason) const SAL_THROW( () )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir 	return uno_Environment_isValid(_pEnv, (rtl_uString **)pReason);
254cdf0e10cSrcweir }
255cdf0e10cSrcweir //__________________________________________________________________________________________________
getCurrent(rtl::OUString const & typeName)256cdf0e10cSrcweir inline Environment Environment::getCurrent(rtl::OUString const & typeName) SAL_THROW( () )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir 	Environment environment;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	uno_Environment * pEnv = NULL;
261cdf0e10cSrcweir 	uno_getCurrentEnvironment(&pEnv, typeName.pData);
262cdf0e10cSrcweir 	environment = pEnv;
263cdf0e10cSrcweir 	if (pEnv)
264cdf0e10cSrcweir 		pEnv->release(pEnv);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 	return environment;
267cdf0e10cSrcweir }
268cdf0e10cSrcweir 
269cdf0e10cSrcweir }
270cdf0e10cSrcweir }
271cdf0e10cSrcweir }
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir #endif
275