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, ¶m);
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