Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <rtl/strbuf.hxx>
21 : :
22 : : #include <com/sun/star/reflection/XIdlField.hpp>
23 : : #include <com/sun/star/reflection/XIdlField2.hpp>
24 : : #include "com/sun/star/uno/TypeClass.hpp"
25 : :
26 : : #include "base.hxx"
27 : :
28 : :
29 : : namespace stoc_corefl
30 : : {
31 : :
32 : : //==================================================================================================
33 [ - + ]: 60 : class IdlCompFieldImpl
34 : : : public IdlMemberImpl
35 : : , public XIdlField
36 : : , public XIdlField2
37 : : {
38 : : sal_Int32 _nOffset;
39 : :
40 : : public:
41 : 1060 : IdlCompFieldImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName,
42 : : typelib_TypeDescription * pTypeDescr, typelib_TypeDescription * pDeclTypeDescr,
43 : : sal_Int32 nOffset )
44 : : : IdlMemberImpl( pReflection, rName, pTypeDescr, pDeclTypeDescr )
45 : 1060 : , _nOffset( nOffset )
46 : 1060 : {}
47 : :
48 : : // XInterface
49 : : virtual Any SAL_CALL queryInterface( const Type & rType ) throw (::com::sun::star::uno::RuntimeException);
50 : : virtual void SAL_CALL acquire() throw ();
51 : : virtual void SAL_CALL release() throw ();
52 : :
53 : : // XTypeProvider
54 : : virtual Sequence< Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException);
55 : : virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (::com::sun::star::uno::RuntimeException);
56 : :
57 : : // XIdlMember
58 : : virtual Reference< XIdlClass > SAL_CALL getDeclaringClass() throw(::com::sun::star::uno::RuntimeException);
59 : : virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
60 : : // XIdlField
61 : : virtual Reference< XIdlClass > SAL_CALL getType() throw(::com::sun::star::uno::RuntimeException);
62 : : virtual FieldAccessMode SAL_CALL getAccessMode() throw(::com::sun::star::uno::RuntimeException);
63 : : virtual Any SAL_CALL get( const Any & rObj ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
64 : : virtual void SAL_CALL set( const Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
65 : : // XIdlField2: getType, getAccessMode and get are equal to XIdlField
66 : : virtual void SAL_CALL set( Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
67 : : };
68 : :
69 : : // XInterface
70 : : //__________________________________________________________________________________________________
71 : 56412 : Any IdlCompFieldImpl::queryInterface( const Type & rType )
72 : : throw(::com::sun::star::uno::RuntimeException)
73 : : {
74 : : Any aRet( ::cppu::queryInterface( rType,
75 : : static_cast< XIdlField * >( this ),
76 [ + - ]: 56412 : static_cast< XIdlField2 * >( this ) ) );
77 [ + + ][ + - ]: 56412 : return (aRet.hasValue() ? aRet : IdlMemberImpl::queryInterface( rType ));
78 : : }
79 : : //__________________________________________________________________________________________________
80 : 217285 : void IdlCompFieldImpl::acquire() throw()
81 : : {
82 : 217285 : IdlMemberImpl::acquire();
83 : 217285 : }
84 : : //__________________________________________________________________________________________________
85 : 216255 : void IdlCompFieldImpl::release() throw()
86 : : {
87 : 216255 : IdlMemberImpl::release();
88 : 216255 : }
89 : :
90 : : // XTypeProvider
91 : : //__________________________________________________________________________________________________
92 : 0 : Sequence< Type > IdlCompFieldImpl::getTypes()
93 : : throw (::com::sun::star::uno::RuntimeException)
94 : : {
95 : : static OTypeCollection * s_pTypes = 0;
96 [ # # ]: 0 : if (! s_pTypes)
97 : : {
98 [ # # ][ # # ]: 0 : MutexGuard aGuard( getMutexAccess() );
99 [ # # ]: 0 : if (! s_pTypes)
100 : : {
101 : : static OTypeCollection s_aTypes(
102 [ # # ]: 0 : ::getCppuType( (const Reference< XIdlField2 > *)0 ),
103 [ # # ]: 0 : ::getCppuType( (const Reference< XIdlField > *)0 ),
104 [ # # ][ # # ]: 0 : IdlMemberImpl::getTypes() );
[ # # ][ # # ]
[ # # ][ # # ]
105 : 0 : s_pTypes = &s_aTypes;
106 [ # # ]: 0 : }
107 : : }
108 : 0 : return s_pTypes->getTypes();
109 : : }
110 : : //__________________________________________________________________________________________________
111 : 0 : Sequence< sal_Int8 > IdlCompFieldImpl::getImplementationId()
112 : : throw (::com::sun::star::uno::RuntimeException)
113 : : {
114 : : static OImplementationId * s_pId = 0;
115 [ # # ]: 0 : if (! s_pId)
116 : : {
117 [ # # ][ # # ]: 0 : MutexGuard aGuard( getMutexAccess() );
118 [ # # ]: 0 : if (! s_pId)
119 : : {
120 [ # # ][ # # ]: 0 : static OImplementationId s_aId;
121 : 0 : s_pId = &s_aId;
122 [ # # ]: 0 : }
123 : : }
124 : 0 : return s_pId->getImplementationId();
125 : : }
126 : :
127 : : // XIdlMember
128 : : //__________________________________________________________________________________________________
129 : 0 : Reference< XIdlClass > IdlCompFieldImpl::getDeclaringClass()
130 : : throw(::com::sun::star::uno::RuntimeException)
131 : : {
132 [ # # ]: 0 : if (! _xDeclClass.is())
133 : : {
134 [ # # ][ # # ]: 0 : MutexGuard aGuard( getMutexAccess() );
135 [ # # ]: 0 : if (! _xDeclClass.is())
136 : : {
137 : : typelib_CompoundTypeDescription * pTD =
138 : 0 : (typelib_CompoundTypeDescription *)getDeclTypeDescr();
139 [ # # ]: 0 : while (pTD)
140 : : {
141 : 0 : typelib_TypeDescriptionReference ** ppTypeRefs = pTD->ppTypeRefs;
142 [ # # ]: 0 : for ( sal_Int32 nPos = pTD->nMembers; nPos--; )
143 : : {
144 [ # # ]: 0 : if (td_equals( (typelib_TypeDescription *)getTypeDescr(), ppTypeRefs[nPos] ))
145 : : {
146 [ # # ][ # # ]: 0 : _xDeclClass = getReflection()->forType( (typelib_TypeDescription *)pTD );
147 : 0 : return _xDeclClass;
148 : : }
149 : : }
150 : 0 : pTD = pTD->pBaseTypeDescription;
151 : : }
152 [ # # ][ # # ]: 0 : }
153 : : }
154 : 0 : return _xDeclClass;
155 : : }
156 : : //__________________________________________________________________________________________________
157 : 1060 : OUString IdlCompFieldImpl::getName()
158 : : throw(::com::sun::star::uno::RuntimeException)
159 : : {
160 : 1060 : return IdlMemberImpl::getName();
161 : : }
162 : :
163 : : // XIdlField
164 : : //__________________________________________________________________________________________________
165 : 1060 : Reference< XIdlClass > IdlCompFieldImpl::getType()
166 : : throw(::com::sun::star::uno::RuntimeException)
167 : : {
168 : 1060 : return getReflection()->forType( getTypeDescr() );
169 : : }
170 : : //__________________________________________________________________________________________________
171 : 1060 : FieldAccessMode IdlCompFieldImpl::getAccessMode()
172 : : throw(::com::sun::star::uno::RuntimeException)
173 : : {
174 : 1060 : return FieldAccessMode_READWRITE;
175 : : }
176 : : //__________________________________________________________________________________________________
177 : 46989 : Any IdlCompFieldImpl::get( const Any & rObj )
178 : : throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
179 : : {
180 [ - + # # ]: 46989 : if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
[ + - ]
181 : 0 : rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
182 : : {
183 : 46989 : typelib_TypeDescription * pObjTD = 0;
184 [ + - ][ - + ]: 46989 : TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() );
[ + - ][ - + ]
[ # # ]
185 : :
186 : 46989 : typelib_TypeDescription * pTD = pObjTD;
187 : 46989 : typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
188 [ + - ][ - + ]: 46989 : while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
[ - + ]
189 : 0 : pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
190 : :
191 : : OSL_ENSURE( pTD, "### illegal object type!" );
192 [ + - ]: 46989 : if (pTD)
193 : : {
194 [ + - ][ - + ]: 46989 : TYPELIB_DANGER_RELEASE( pObjTD );
195 : 46989 : Any aRet;
196 : : uno_any_destruct(
197 : 46989 : &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
198 : : uno_any_construct(
199 : 46989 : &aRet, (char *)rObj.getValue() + _nOffset, getTypeDescr(),
200 : 93978 : reinterpret_cast< uno_AcquireFunc >(cpp_acquire) );
201 : 46989 : return aRet;
202 : : }
203 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pObjTD );
204 : : }
205 : : throw IllegalArgumentException(
206 : : OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!") ),
207 [ # # ][ # # ]: 0 : (XWeak *)(OWeakObject *)this, 0 );
[ # # ]
208 : : }
209 : : //__________________________________________________________________________________________________
210 : 0 : void IdlCompFieldImpl::set( const Any & rObj, const Any & rValue )
211 : : throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
212 : : {
213 [ # # # # ]: 0 : if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
[ # # ]
214 : 0 : rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
215 : : {
216 : 0 : typelib_TypeDescription * pObjTD = 0;
217 [ # # ][ # # ]: 0 : TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() );
[ # # ][ # # ]
[ # # ]
218 : :
219 : 0 : typelib_TypeDescription * pTD = pObjTD;
220 : 0 : typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
221 [ # # ][ # # ]: 0 : while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
[ # # ]
222 : 0 : pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
223 : :
224 : : OSL_ENSURE( pTD, "### illegal object type!" );
225 [ # # ]: 0 : if (pTD)
226 : : {
227 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pObjTD );
228 [ # # ][ # # ]: 0 : if (coerce_assign( (char *)rObj.getValue() + _nOffset, getTypeDescr(), rValue, getReflection() ))
229 : : {
230 : 0 : return;
231 : : }
232 : : else
233 : : {
234 : : throw IllegalArgumentException(
235 : : OUString( RTL_CONSTASCII_USTRINGPARAM("illegal value given!") ),
236 [ # # ][ # # ]: 0 : (XWeak *)(OWeakObject *)this, 1 );
[ # # ]
237 : : }
238 : : }
239 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pObjTD );
240 : : }
241 : : throw IllegalArgumentException(
242 : : OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!") ),
243 [ # # ][ # # ]: 0 : (XWeak *)(OWeakObject *)this, 0 );
[ # # ]
244 : : }
245 : :
246 : : //__________________________________________________________________________________________________
247 : 55352 : void IdlCompFieldImpl::set( Any & rObj, const Any & rValue )
248 : : throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
249 : : {
250 [ - + # # ]: 55352 : if (rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_STRUCT ||
[ + - ]
251 : 0 : rObj.getValueTypeClass() == com::sun::star::uno::TypeClass_EXCEPTION)
252 : : {
253 : 55352 : typelib_TypeDescription * pObjTD = 0;
254 [ + - ][ - + ]: 55352 : TYPELIB_DANGER_GET( &pObjTD, rObj.getValueTypeRef() );
[ + - ][ - + ]
[ # # ]
255 : :
256 : 55352 : typelib_TypeDescription * pTD = pObjTD;
257 : 55352 : typelib_TypeDescription * pDeclTD = getDeclTypeDescr();
258 [ + - ][ - + ]: 55352 : while (pTD && !typelib_typedescription_equals( pTD, pDeclTD ))
[ - + ]
259 : 0 : pTD = (typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pTD)->pBaseTypeDescription;
260 : :
261 : : OSL_ENSURE( pTD, "### illegal object type!" );
262 [ + - ]: 55352 : if (pTD)
263 : : {
264 [ + - ][ - + ]: 55352 : TYPELIB_DANGER_RELEASE( pObjTD );
265 [ + - ][ - + ]: 55352 : if (coerce_assign( (char *)rObj.getValue() + _nOffset, getTypeDescr(), rValue, getReflection() ))
266 : : {
267 : 55352 : return;
268 : : }
269 : : else
270 : : {
271 : : throw IllegalArgumentException(
272 : : OUString( RTL_CONSTASCII_USTRINGPARAM("illegal value given!") ),
273 [ # # ][ # # ]: 0 : (XWeak *)(OWeakObject *)this, 1 );
[ # # ]
274 : : }
275 : : }
276 [ # # ][ # # ]: 55352 : TYPELIB_DANGER_RELEASE( pObjTD );
277 : : }
278 : : throw IllegalArgumentException(
279 : : OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!") ),
280 [ # # ][ # # ]: 0 : (XWeak *)(OWeakObject *)this, 0 );
[ # # ]
281 : : }
282 : :
283 : : //##################################################################################################
284 : : //##################################################################################################
285 : : //##################################################################################################
286 : :
287 : :
288 : : //__________________________________________________________________________________________________
289 [ + - ]: 134 : CompoundIdlClassImpl::~CompoundIdlClassImpl()
290 : : {
291 [ + + ][ + - ]: 134 : delete _pFields;
292 [ - + ]: 268 : }
293 : :
294 : : //__________________________________________________________________________________________________
295 : 14763 : sal_Bool CompoundIdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType )
296 : : throw(::com::sun::star::uno::RuntimeException)
297 : : {
298 [ + - ]: 14763 : if (xType.is())
299 : : {
300 : 14763 : TypeClass eTC = xType->getTypeClass();
301 [ - + ][ + + ]: 14763 : if (eTC == TypeClass_STRUCT || eTC == TypeClass_EXCEPTION)
302 : : {
303 [ + - ]: 4629 : if (equals( xType ))
304 : 4629 : return sal_True;
305 : : else
306 : : {
307 : 0 : const Sequence< Reference< XIdlClass > > & rSeq = xType->getSuperclasses();
308 [ # # ]: 0 : if (rSeq.getLength())
309 : : {
310 : : OSL_ENSURE( rSeq.getLength() == 1, "### unexpected len of super classes!" );
311 [ # # ]: 0 : return isAssignableFrom( rSeq[0] );
312 [ # # ]: 0 : }
313 : : }
314 : : }
315 : : }
316 : 14763 : return sal_False;
317 : : }
318 : : //__________________________________________________________________________________________________
319 : 0 : Sequence< Reference< XIdlClass > > CompoundIdlClassImpl::getSuperclasses()
320 : : throw(::com::sun::star::uno::RuntimeException)
321 : : {
322 [ # # ]: 0 : if (! _xSuperClass.is())
323 : : {
324 [ # # ][ # # ]: 0 : MutexGuard aGuard( getMutexAccess() );
325 [ # # ]: 0 : if (! _xSuperClass.is())
326 : : {
327 : 0 : typelib_CompoundTypeDescription * pCompTypeDescr = getTypeDescr()->pBaseTypeDescription;
328 [ # # ]: 0 : if (pCompTypeDescr)
329 [ # # ][ # # ]: 0 : _xSuperClass = getReflection()->forType( (typelib_TypeDescription *)pCompTypeDescr );
330 [ # # ]: 0 : }
331 : : }
332 [ # # ]: 0 : if (_xSuperClass.is())
333 : 0 : return Sequence< Reference< XIdlClass > >( &_xSuperClass, 1 );
334 : : else
335 : 0 : return Sequence< Reference< XIdlClass > >();
336 : : }
337 : : //__________________________________________________________________________________________________
338 : 0 : Reference< XIdlField > CompoundIdlClassImpl::getField( const OUString & rName )
339 : : throw(::com::sun::star::uno::RuntimeException)
340 : : {
341 [ # # ]: 0 : if (! _pFields)
342 [ # # ][ # # ]: 0 : getFields(); // init fields
343 : :
344 [ # # ]: 0 : const OUString2Field::const_iterator iFind( _aName2Field.find( rName ) );
345 [ # # ][ # # ]: 0 : if (iFind != _aName2Field.end())
346 [ # # ][ # # ]: 0 : return Reference< XIdlField >( (*iFind).second );
347 : : else
348 : 0 : return Reference< XIdlField >();
349 : : }
350 : : //__________________________________________________________________________________________________
351 : 270 : Sequence< Reference< XIdlField > > CompoundIdlClassImpl::getFields()
352 : : throw(::com::sun::star::uno::RuntimeException)
353 : : {
354 [ + - ][ + - ]: 270 : MutexGuard aGuard( getMutexAccess() );
355 [ + - ]: 270 : if (! _pFields)
356 : : {
357 : 270 : sal_Int32 nAll = 0;
358 : 270 : typelib_CompoundTypeDescription * pCompTypeDescr = getTypeDescr();
359 [ + + ]: 658 : for ( ; pCompTypeDescr; pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
360 : 388 : nAll += pCompTypeDescr->nMembers;
361 : :
362 : : Sequence< Reference< XIdlField > > * pFields =
363 [ + - ]: 270 : new Sequence< Reference< XIdlField > >( nAll );
364 [ + - ]: 270 : Reference< XIdlField > * pSeq = pFields->getArray();
365 : :
366 [ + + ]: 658 : for ( pCompTypeDescr = getTypeDescr(); pCompTypeDescr;
367 : : pCompTypeDescr = pCompTypeDescr->pBaseTypeDescription )
368 : : {
369 : 388 : typelib_TypeDescriptionReference ** ppTypeRefs = pCompTypeDescr->ppTypeRefs;
370 : 388 : rtl_uString ** ppNames = pCompTypeDescr->ppMemberNames;
371 : 388 : sal_Int32 * pMemberOffsets = pCompTypeDescr->pMemberOffsets;
372 : :
373 [ + + ]: 1448 : for ( sal_Int32 nPos = pCompTypeDescr->nMembers; nPos--; )
374 : : {
375 : 1060 : typelib_TypeDescription * pTD = 0;
376 [ + - ][ - + ]: 1060 : TYPELIB_DANGER_GET( &pTD, ppTypeRefs[nPos] );
[ + - ][ - + ]
[ # # ]
377 : : OSL_ENSURE( pTD, "### cannot get field in struct!" );
378 [ + - ]: 1060 : if (pTD)
379 : : {
380 : 1060 : OUString aName( ppNames[nPos] );
381 [ + - ]: 1060 : _aName2Field[aName] = pSeq[--nAll] = new IdlCompFieldImpl(
382 [ + - ][ + - ]: 2120 : getReflection(), aName, pTD, IdlClassImpl::getTypeDescr(), pMemberOffsets[nPos] );
[ + - ][ + - ]
383 [ + - ][ - + ]: 1060 : TYPELIB_DANGER_RELEASE( pTD );
384 : : }
385 : : }
386 : : }
387 : :
388 : 270 : _pFields = pFields;
389 : : }
390 [ + - ][ + - ]: 270 : return *_pFields;
391 : : }
392 : :
393 : : }
394 : :
395 : :
396 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|