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