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_comphelper.hxx"
26 #include <comphelper/ChainablePropertySet.hxx>
27 #include <comphelper/ChainablePropertySetInfo.hxx>
28 #include <vos/mutex.hxx>
29
30 #include <memory> // STL auto_ptr
31
32
33 using namespace ::rtl;
34 using namespace ::comphelper;
35 using namespace ::com::sun::star;
36 using namespace ::com::sun::star::uno;
37 using namespace ::com::sun::star::lang;
38 using namespace ::com::sun::star::beans;
39 using ::vos::IMutex;
40
ChainablePropertySet(comphelper::ChainablePropertySetInfo * pInfo,vos::IMutex * pMutex)41 ChainablePropertySet::ChainablePropertySet( comphelper::ChainablePropertySetInfo* pInfo, vos::IMutex *pMutex )
42 throw()
43 : mpInfo ( pInfo )
44 , mpMutex ( pMutex )
45 , mxInfo ( pInfo )
46 {
47 }
48
~ChainablePropertySet()49 ChainablePropertySet::~ChainablePropertySet()
50 throw()
51 {
52 }
53
54 // XPropertySet
getPropertySetInfo()55 Reference< XPropertySetInfo > SAL_CALL ChainablePropertySet::getPropertySetInfo( )
56 throw(RuntimeException)
57 {
58 return mxInfo;
59 }
60
lockMutex()61 void ChainablePropertySet::lockMutex()
62 {
63 if (mpMutex)
64 mpMutex->acquire();
65 }
66
unlockMutex()67 void ChainablePropertySet::unlockMutex()
68 {
69 if (mpMutex)
70 mpMutex->release();
71 }
72
setPropertyValue(const::rtl::OUString & rPropertyName,const Any & rValue)73 void SAL_CALL ChainablePropertySet::setPropertyValue( const ::rtl::OUString& rPropertyName, const Any& rValue )
74 throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
75 {
76 // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
77 std::auto_ptr< vos::OGuard > pMutexGuard;
78 if (mpMutex)
79 pMutexGuard.reset( new vos::OGuard(mpMutex) );
80
81 PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
82
83 if( aIter == mpInfo->maMap.end())
84 throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
85
86 _preSetValues();
87 _setSingleValue( *((*aIter).second), rValue );
88 _postSetValues();
89 }
90
getPropertyValue(const::rtl::OUString & rPropertyName)91 Any SAL_CALL ChainablePropertySet::getPropertyValue( const ::rtl::OUString& rPropertyName )
92 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
93 {
94 // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
95 std::auto_ptr< vos::OGuard > pMutexGuard;
96 if (mpMutex)
97 pMutexGuard.reset( new vos::OGuard(mpMutex) );
98
99 PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
100
101 if( aIter == mpInfo->maMap.end())
102 throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
103
104 Any aAny;
105 _preGetValues ();
106 _getSingleValue( *((*aIter).second), aAny );
107 _postGetValues ();
108
109 return aAny;
110 }
111
addPropertyChangeListener(const::rtl::OUString &,const Reference<XPropertyChangeListener> &)112 void SAL_CALL ChainablePropertySet::addPropertyChangeListener( const ::rtl::OUString&, const Reference< XPropertyChangeListener >& )
113 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
114 {
115 // todo
116 }
117
removePropertyChangeListener(const::rtl::OUString &,const Reference<XPropertyChangeListener> &)118 void SAL_CALL ChainablePropertySet::removePropertyChangeListener( const ::rtl::OUString&, const Reference< XPropertyChangeListener >& )
119 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
120 {
121 // todo
122 }
123
addVetoableChangeListener(const::rtl::OUString &,const Reference<XVetoableChangeListener> &)124 void SAL_CALL ChainablePropertySet::addVetoableChangeListener( const ::rtl::OUString&, const Reference< XVetoableChangeListener >& )
125 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
126 {
127 // todo
128 }
129
removeVetoableChangeListener(const::rtl::OUString &,const Reference<XVetoableChangeListener> &)130 void SAL_CALL ChainablePropertySet::removeVetoableChangeListener( const ::rtl::OUString&, const Reference< XVetoableChangeListener >& )
131 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
132 {
133 // todo
134 }
135
136 // XMultiPropertySet
setPropertyValues(const Sequence<::rtl::OUString> & aPropertyNames,const Sequence<Any> & aValues)137 void SAL_CALL ChainablePropertySet::setPropertyValues( const Sequence< ::rtl::OUString >& aPropertyNames, const Sequence< Any >& aValues )
138 throw(PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
139 {
140 // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
141 std::auto_ptr< vos::OGuard > pMutexGuard;
142 if (mpMutex)
143 pMutexGuard.reset( new vos::OGuard(mpMutex) );
144
145 const sal_Int32 nCount = aPropertyNames.getLength();
146
147 if( nCount != aValues.getLength() )
148 throw IllegalArgumentException();
149
150 if( nCount )
151 {
152 _preSetValues();
153
154 const Any * pAny = aValues.getConstArray();
155 const OUString * pString = aPropertyNames.getConstArray();
156 PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
157
158 for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pAny )
159 {
160 aIter = mpInfo->maMap.find ( *pString );
161 if ( aIter == aEnd )
162 throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
163
164 _setSingleValue ( *((*aIter).second), *pAny );
165 }
166
167 _postSetValues();
168 }
169 }
170
getPropertyValues(const Sequence<::rtl::OUString> & aPropertyNames)171 Sequence< Any > SAL_CALL ChainablePropertySet::getPropertyValues( const Sequence< ::rtl::OUString >& aPropertyNames )
172 throw(RuntimeException)
173 {
174 // acquire mutex in c-tor and releases it in the d-tor (exception safe!).
175 std::auto_ptr< vos::OGuard > pMutexGuard;
176 if (mpMutex)
177 pMutexGuard.reset( new vos::OGuard(mpMutex) );
178
179 const sal_Int32 nCount = aPropertyNames.getLength();
180
181 Sequence < Any > aValues ( nCount );
182
183 if( nCount )
184 {
185 _preGetValues();
186
187 Any * pAny = aValues.getArray();
188 const OUString * pString = aPropertyNames.getConstArray();
189 PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
190
191 for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pAny )
192 {
193 aIter = mpInfo->maMap.find ( *pString );
194 if ( aIter == aEnd )
195 throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
196
197 _getSingleValue ( *((*aIter).second), *pAny );
198 }
199
200 _postGetValues();
201 }
202 return aValues;
203 }
204
addPropertiesChangeListener(const Sequence<::rtl::OUString> &,const Reference<XPropertiesChangeListener> &)205 void SAL_CALL ChainablePropertySet::addPropertiesChangeListener( const Sequence< ::rtl::OUString >&, const Reference< XPropertiesChangeListener >& )
206 throw(RuntimeException)
207 {
208 // todo
209 }
210
removePropertiesChangeListener(const Reference<XPropertiesChangeListener> &)211 void SAL_CALL ChainablePropertySet::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& )
212 throw(RuntimeException)
213 {
214 // todo
215 }
216
firePropertiesChangeEvent(const Sequence<::rtl::OUString> &,const Reference<XPropertiesChangeListener> &)217 void SAL_CALL ChainablePropertySet::firePropertiesChangeEvent( const Sequence< ::rtl::OUString >&, const Reference< XPropertiesChangeListener >& )
218 throw(RuntimeException)
219 {
220 // todo
221 }
222
223 // XPropertyState
getPropertyState(const::rtl::OUString & PropertyName)224 PropertyState SAL_CALL ChainablePropertySet::getPropertyState( const ::rtl::OUString& PropertyName )
225 throw(UnknownPropertyException, RuntimeException)
226 {
227 PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find( PropertyName );
228 if( aIter == mpInfo->maMap.end())
229 throw UnknownPropertyException( PropertyName, static_cast< XPropertySet* >( this ) );
230
231 PropertyState aState;
232
233 _preGetPropertyState();
234 _getPropertyState( *((*aIter).second), aState );
235 _postGetPropertyState();
236
237 return aState;
238 }
239
getPropertyStates(const Sequence<::rtl::OUString> & rPropertyNames)240 Sequence< PropertyState > SAL_CALL ChainablePropertySet::getPropertyStates( const Sequence< ::rtl::OUString >& rPropertyNames )
241 throw(UnknownPropertyException, RuntimeException)
242 {
243 const sal_Int32 nCount = rPropertyNames.getLength();
244
245 Sequence< PropertyState > aStates( nCount );
246 if( nCount )
247 {
248 PropertyState * pState = aStates.getArray();
249 const OUString * pString = rPropertyNames.getConstArray();
250 PropertyInfoHash::const_iterator aEnd = mpInfo->maMap.end(), aIter;
251 _preGetPropertyState();
252
253 for ( sal_Int32 i = 0; i < nCount; ++i, ++pString, ++pState )
254 {
255 aIter = mpInfo->maMap.find ( *pString );
256 if ( aIter == aEnd )
257 throw UnknownPropertyException( *pString, static_cast< XPropertySet* >( this ) );
258
259 _getPropertyState ( *((*aIter).second), *pState );
260 }
261 _postGetPropertyState();
262 }
263 return aStates;
264 }
265
setPropertyToDefault(const::rtl::OUString & rPropertyName)266 void SAL_CALL ChainablePropertySet::setPropertyToDefault( const ::rtl::OUString& rPropertyName )
267 throw(UnknownPropertyException, RuntimeException)
268 {
269 PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
270
271 if( aIter == mpInfo->maMap.end())
272 throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
273 _setPropertyToDefault( *((*aIter).second) );
274 }
275
getPropertyDefault(const::rtl::OUString & rPropertyName)276 Any SAL_CALL ChainablePropertySet::getPropertyDefault( const ::rtl::OUString& rPropertyName )
277 throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
278 {
279 PropertyInfoHash::const_iterator aIter = mpInfo->maMap.find ( rPropertyName );
280
281 if( aIter == mpInfo->maMap.end())
282 throw UnknownPropertyException( rPropertyName, static_cast< XPropertySet* >( this ) );
283 return _getPropertyDefault( *((*aIter).second) );
284 }
285
_preGetPropertyState()286 void ChainablePropertySet::_preGetPropertyState ()
287 throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException )
288 {
289 OSL_ENSURE( sal_False, "you have to implement this yourself!");
290 }
291
_getPropertyState(const comphelper::PropertyInfo &,PropertyState &)292 void ChainablePropertySet::_getPropertyState( const comphelper::PropertyInfo&, PropertyState& )
293 throw(UnknownPropertyException )
294 {
295 OSL_ENSURE( sal_False, "you have to implement this yourself!");
296 }
297
_postGetPropertyState()298 void ChainablePropertySet::_postGetPropertyState ()
299 throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException )
300 {
301 OSL_ENSURE( sal_False, "you have to implement this yourself!");
302 }
303
_setPropertyToDefault(const comphelper::PropertyInfo &)304 void ChainablePropertySet::_setPropertyToDefault( const comphelper::PropertyInfo& )
305 throw(UnknownPropertyException )
306 {
307 OSL_ENSURE( sal_False, "you have to implement this yourself!");
308 }
309
_getPropertyDefault(const comphelper::PropertyInfo &)310 Any ChainablePropertySet::_getPropertyDefault( const comphelper::PropertyInfo& )
311 throw(UnknownPropertyException, WrappedTargetException )
312 {
313 OSL_ENSURE( sal_False, "you have to implement this yourself!");
314
315 Any aAny;
316 return aAny;
317 }
318