1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_comphelper.hxx"
30 #include <comphelper/ChainablePropertySet.hxx>
31 #include <comphelper/ChainablePropertySetInfo.hxx>
32 #include <vos/mutex.hxx>
33 
34 #include <memory>       // STL auto_ptr
35 
36 
37 using namespace ::rtl;
38 using namespace ::comphelper;
39 using namespace ::com::sun::star;
40 using namespace ::com::sun::star::uno;
41 using namespace ::com::sun::star::lang;
42 using namespace ::com::sun::star::beans;
43 using ::vos::IMutex;
44 
45 ChainablePropertySet::ChainablePropertySet( comphelper::ChainablePropertySetInfo* pInfo, vos::IMutex *pMutex )
46 	throw()
47 : mpInfo ( pInfo )
48 , mpMutex ( pMutex )
49 , mxInfo ( pInfo )
50 {
51 }
52 
53 ChainablePropertySet::~ChainablePropertySet()
54 	throw()
55 {
56 }
57 
58 // XPropertySet
59 Reference< XPropertySetInfo > SAL_CALL ChainablePropertySet::getPropertySetInfo(  )
60 	throw(RuntimeException)
61 {
62 	return mxInfo;
63 }
64 
65 void ChainablePropertySet::lockMutex()
66 {
67 	if (mpMutex)
68 		mpMutex->acquire();
69 }
70 
71 void ChainablePropertySet::unlockMutex()
72 {
73 	if (mpMutex)
74 		mpMutex->release();
75 }
76 
77 void SAL_CALL ChainablePropertySet::setPropertyValue( const ::rtl::OUString& rPropertyName, const Any& rValue )
78 	throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
79 {
80     // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
81     std::auto_ptr< vos::OGuard > pMutexGuard;
82     if (mpMutex)
83         pMutexGuard.reset( new vos::OGuard(mpMutex) );
84 
85 	PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
86 
87 	if( aIter == mpInfo->maMap.end())
88 		throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
89 
90 	_preSetValues();
91 	_setSingleValue( *((*aIter).second), rValue );
92 	_postSetValues();
93 }
94 
95 Any SAL_CALL ChainablePropertySet::getPropertyValue( const ::rtl::OUString& rPropertyName )
96 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
97 {
98     // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
99     std::auto_ptr< vos::OGuard > pMutexGuard;
100     if (mpMutex)
101         pMutexGuard.reset( new vos::OGuard(mpMutex) );
102 
103 	PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
104 
105 	if( aIter == mpInfo->maMap.end())
106 		throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
107 
108 	Any aAny;
109 	_preGetValues ();
110 	_getSingleValue( *((*aIter).second), aAny );
111 	_postGetValues ();
112 
113 	return aAny;
114 }
115 
116 void SAL_CALL ChainablePropertySet::addPropertyChangeListener( const ::rtl::OUString&, const Reference< XPropertyChangeListener >& )
117 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
118 {
119 	// todo
120 }
121 
122 void SAL_CALL ChainablePropertySet::removePropertyChangeListener( const ::rtl::OUString&, const Reference< XPropertyChangeListener >& )
123 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
124 {
125 	// todo
126 }
127 
128 void SAL_CALL ChainablePropertySet::addVetoableChangeListener( const ::rtl::OUString&, const Reference< XVetoableChangeListener >& )
129 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
130 {
131 	// todo
132 }
133 
134 void SAL_CALL ChainablePropertySet::removeVetoableChangeListener( const ::rtl::OUString&, const Reference< XVetoableChangeListener >& )
135 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
136 {
137 	// todo
138 }
139 
140 // XMultiPropertySet
141 void SAL_CALL ChainablePropertySet::setPropertyValues( const Sequence< ::rtl::OUString >& aPropertyNames, const Sequence< Any >& aValues )
142 	throw(PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
143 {
144     // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
145     std::auto_ptr< vos::OGuard > pMutexGuard;
146     if (mpMutex)
147         pMutexGuard.reset( new vos::OGuard(mpMutex) );
148 
149     const sal_Int32 nCount = aPropertyNames.getLength();
150 
151 	if( nCount != aValues.getLength() )
152 		throw IllegalArgumentException();
153 
154 	if( nCount )
155 	{
156 		_preSetValues();
157 
158 		const Any * pAny = aValues.getConstArray();
159 		const OUString * pString = aPropertyNames.getConstArray();
160 		PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
161 
162 		for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pAny )
163 		{
164 			aIter = mpInfo->maMap.find ( *pString );
165 			if ( aIter == aEnd )
166 				throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
167 
168 			_setSingleValue ( *((*aIter).second), *pAny );
169 		}
170 
171 		_postSetValues();
172 	}
173 }
174 
175 Sequence< Any > SAL_CALL ChainablePropertySet::getPropertyValues( const Sequence< ::rtl::OUString >& aPropertyNames )
176 	throw(RuntimeException)
177 {
178     // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
179     std::auto_ptr< vos::OGuard > pMutexGuard;
180     if (mpMutex)
181         pMutexGuard.reset( new vos::OGuard(mpMutex) );
182 
183 	const sal_Int32 nCount = aPropertyNames.getLength();
184 
185 	Sequence < Any > aValues ( nCount );
186 
187 	if( nCount )
188 	{
189 		_preGetValues();
190 
191 		Any * pAny = aValues.getArray();
192 		const OUString * pString = aPropertyNames.getConstArray();
193 		PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
194 
195 		for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pAny )
196 		{
197 			aIter = mpInfo->maMap.find ( *pString );
198 			if ( aIter == aEnd )
199 				throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
200 
201 			_getSingleValue ( *((*aIter).second), *pAny );
202 		}
203 
204 		_postGetValues();
205 	}
206 	return aValues;
207 }
208 
209 void SAL_CALL ChainablePropertySet::addPropertiesChangeListener( const Sequence< ::rtl::OUString >&, const Reference< XPropertiesChangeListener >& )
210 	throw(RuntimeException)
211 {
212 	// todo
213 }
214 
215 void SAL_CALL ChainablePropertySet::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& )
216 	throw(RuntimeException)
217 {
218 	// todo
219 }
220 
221 void SAL_CALL ChainablePropertySet::firePropertiesChangeEvent( const Sequence< ::rtl::OUString >&, const Reference< XPropertiesChangeListener >& )
222 	throw(RuntimeException)
223 {
224 	// todo
225 }
226 
227 // XPropertyState
228 PropertyState SAL_CALL ChainablePropertySet::getPropertyState( const ::rtl::OUString& PropertyName )
229 	throw(UnknownPropertyException, RuntimeException)
230 {
231 	PropertyInfoHash::const_iterator aIter =  mpInfo->maMap.find( PropertyName );
232 	if( aIter == mpInfo->maMap.end())
233 		throw UnknownPropertyException( PropertyName, static_cast< XPropertySet* >( this ) );
234 
235 	PropertyState aState;
236 
237 	_preGetPropertyState();
238 	_getPropertyState( *((*aIter).second), aState );
239 	_postGetPropertyState();
240 
241 	return aState;
242 }
243 
244 Sequence< PropertyState > SAL_CALL ChainablePropertySet::getPropertyStates( const Sequence< ::rtl::OUString >& rPropertyNames )
245 	throw(UnknownPropertyException, RuntimeException)
246 {
247 	const sal_Int32 nCount = rPropertyNames.getLength();
248 
249 	Sequence< PropertyState > aStates( nCount );
250 	if( nCount )
251 	{
252 		PropertyState * pState = aStates.getArray();
253 		const OUString * pString = rPropertyNames.getConstArray();
254 		PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
255 		_preGetPropertyState();
256 
257 		for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pState )
258 		{
259 			aIter = mpInfo->maMap.find ( *pString );
260 			if ( aIter == aEnd )
261 				throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
262 
263 			_getPropertyState ( *((*aIter).second), *pState );
264 		}
265 		_postGetPropertyState();
266 	}
267 	return aStates;
268 }
269 
270 void SAL_CALL ChainablePropertySet::setPropertyToDefault( const ::rtl::OUString& rPropertyName )
271 	throw(UnknownPropertyException, RuntimeException)
272 {
273 	PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
274 
275 	if( aIter == mpInfo->maMap.end())
276 		throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
277 	_setPropertyToDefault( *((*aIter).second) );
278 }
279 
280 Any SAL_CALL ChainablePropertySet::getPropertyDefault( const ::rtl::OUString& rPropertyName )
281 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
282 {
283 	PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
284 
285 	if( aIter == mpInfo->maMap.end())
286 		throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
287 	return _getPropertyDefault( *((*aIter).second) );
288 }
289 
290 void ChainablePropertySet::_preGetPropertyState ()
291 	throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException )
292 {
293 	OSL_ENSURE( sal_False, "you have to implement this yourself!");
294 }
295 
296 void ChainablePropertySet::_getPropertyState( const comphelper::PropertyInfo&, PropertyState& )
297 	throw(UnknownPropertyException )
298 {
299 	OSL_ENSURE( sal_False, "you have to implement this yourself!");
300 }
301 
302 void ChainablePropertySet::_postGetPropertyState ()
303 	throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException )
304 {
305 	OSL_ENSURE( sal_False, "you have to implement this yourself!");
306 }
307 
308 void ChainablePropertySet::_setPropertyToDefault( const comphelper::PropertyInfo& )
309 	throw(UnknownPropertyException )
310 {
311 	OSL_ENSURE( sal_False, "you have to implement this yourself!");
312 }
313 
314 Any ChainablePropertySet::_getPropertyDefault( const comphelper::PropertyInfo& )
315 	throw(UnknownPropertyException, WrappedTargetException )
316 {
317 	OSL_ENSURE( sal_False, "you have to implement this yourself!");
318 
319 	Any aAny;
320 	return aAny;
321 }
322