xref: /aoo42x/main/stoc/test/testintrosp.cxx (revision 86e1cf34)
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_stoc.hxx"
26 
27 #include <sal/main.h>
28 #include <cppuhelper/implbase1.hxx>
29 #include <cppuhelper/implbase4.hxx>
30 #include <cppuhelper/servicefactory.hxx>
31 #include <osl/diagnose.h>
32 
33 //#include <vos/dynload.hxx>
34 
35 #include <ModuleA/XIntroTest.hpp>
36 #include <com/sun/star/beans/XPropertySet.hpp>
37 #include <com/sun/star/beans/XIntrospection.hpp>
38 #include <com/sun/star/beans/PropertyAttribute.hpp>
39 #include <com/sun/star/beans/PropertyConcept.hpp>
40 #include <com/sun/star/beans/MethodConcept.hpp>
41 #include <com/sun/star/beans/XExactName.hpp>
42 #include <com/sun/star/container/XElementAccess.hpp>
43 #include <com/sun/star/container/XNameAccess.hpp>
44 #include <com/sun/star/container/XIndexAccess.hpp>
45 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
46 #include <com/sun/star/reflection/XIdlReflection.hpp>
47 //#include <com/sun/star/registry/XSimpleRegistry.hpp>
48 #include <com/sun/star/registry/XImplementationRegistration.hpp>
49 #include <com/sun/star/lang/XComponent.hpp>
50 
51 #include <stdio.h>
52 #include <string.h>
53 
54 
55 using namespace rtl;
56 using namespace cppu;
57 //using namespace vos;
58 using namespace ModuleA;
59 //using namespace ModuleB;
60 //using namespace ModuleC;
61 //using namespace ModuleA::ModuleB;
62 using namespace com::sun::star::uno;
63 using namespace com::sun::star::lang;
64 using namespace com::sun::star::beans;
65 using namespace com::sun::star::registry;
66 using namespace com::sun::star::reflection;
67 using namespace com::sun::star::container;
68 using namespace com::sun::star::beans::PropertyAttribute;
69 
70 
71 typedef WeakImplHelper4< XIntroTest, XPropertySet, XNameAccess, XIndexAccess > ImplIntroTestHelper;
72 typedef WeakImplHelper1< XPropertySetInfo > ImplPropertySetInfoHelper;
73 
74 
75 #define DEFAULT_INDEX_ACCESS_COUNT	10
76 #define DEFAULT_NAME_ACCESS_COUNT	5
77 
78 #if OSL_DEBUG_LEVEL > 0
79 #define TEST_ENSHURE(c, m)   OSL_ENSURE(c, m)
80 #else
81 #define TEST_ENSHURE(c, m)   OSL_VERIFY(c)
82 #endif
83 
84 //class IntroTestWritelnOutput;
85 
86 
87 
88 //**************************************************************
89 //*** Hilfs-Funktion, um vom Type eine XIdlClass zu bekommen ***
90 //**************************************************************
TypeToIdlClass(const Type & rType,const Reference<XMultiServiceFactory> & xMgr)91 Reference<XIdlClass> TypeToIdlClass( const Type& rType, const Reference< XMultiServiceFactory > & xMgr )
92 {
93 	static Reference< XIdlReflection > xRefl;
94 
95 	// void als Default-Klasse eintragen
96 	Reference<XIdlClass> xRetClass;
97 	typelib_TypeDescription * pTD = 0;
98 	rType.getDescription( &pTD );
99 	if( pTD )
100 	{
101 		OUString sOWName( pTD->pTypeName );
102 		if( !xRefl.is() )
103 		{
104 			xRefl = Reference< XIdlReflection >( xMgr->createInstance(
105 				OUString::createFromAscii("com.sun.star.reflection.CoreReflection") ), UNO_QUERY );
106 			OSL_ENSURE( xRefl.is(), "### no corereflection!" );
107 		}
108 		xRetClass = xRefl->forName( sOWName );
109 	}
110 	return xRetClass;
111 }
112 
113 
114 //****************************************************
115 //*** Hilfs-Funktion, um Any als UString auszugeben ***
116 //****************************************************
117 // ACHTUNG: Kann mal an eine zentrale Stelle uebernommen werden
118 // Wird zunaechst nur fuer einfache Datentypen ausgefuehrt
119 
AnyToString(const Any & aValue,sal_Bool bIncludeType,const Reference<XMultiServiceFactory> & xMgr)120 OUString AnyToString( const Any& aValue, sal_Bool bIncludeType, const Reference< XMultiServiceFactory > & xMgr )
121 {
122 	Type aValType = aValue.getValueType();
123 	TypeClass eType = aValType.getTypeClass();
124 	char pBuffer[50];
125 
126 	OUString aRetStr;
127 	switch( eType )
128 	{
129 		case TypeClass_TYPE:			aRetStr = OUString::createFromAscii("TYPE TYPE");				break;
130 		case TypeClass_INTERFACE:		aRetStr = OUString::createFromAscii("TYPE INTERFACE");		break;
131 		case TypeClass_SERVICE:			aRetStr = OUString::createFromAscii("TYPE SERVICE");			break;
132 		case TypeClass_STRUCT:			aRetStr = OUString::createFromAscii("TYPE STRUCT");			break;
133 		case TypeClass_TYPEDEF:			aRetStr = OUString::createFromAscii("TYPE TYPEDEF");			break;
134 		case TypeClass_UNION:			aRetStr = OUString::createFromAscii("TYPE UNION");			break;
135 		case TypeClass_ENUM:			aRetStr = OUString::createFromAscii("TYPE ENUM");				break;
136 		case TypeClass_EXCEPTION:		aRetStr = OUString::createFromAscii("TYPE EXCEPTION");		break;
137 		case TypeClass_ARRAY:			aRetStr = OUString::createFromAscii("TYPE ARRAY");			break;
138 		case TypeClass_SEQUENCE:		aRetStr = OUString::createFromAscii("TYPE SEQUENCE");			break;
139 		case TypeClass_VOID:			aRetStr = OUString::createFromAscii("TYPE void");				break;
140 		case TypeClass_ANY:				aRetStr = OUString::createFromAscii("TYPE any");				break;
141 		case TypeClass_UNKNOWN:			aRetStr = OUString::createFromAscii("TYPE unknown");			break;
142 		case TypeClass_BOOLEAN:
143 		{
144 			sal_Bool b = *(sal_Bool*)aValue.getValue();
145 			//aRet.setValue( &b, getCppuBooleanType() );
146 			//aValue >>= b;
147 			aRetStr = OUString::valueOf( b );
148 			break;
149 		}
150 		case TypeClass_CHAR:
151 		{
152 			sal_Unicode c = *(sal_Unicode*)aValue.getValue();
153 			//aValue >>= c;
154 			//getCppuCharType()
155 			aRetStr = OUString::valueOf( c );
156 			break;
157 		}
158 		case TypeClass_STRING:
159 		{
160 			aValue >>= aRetStr;
161 			break;
162 		}
163 		case TypeClass_FLOAT:
164 		{
165 			float f(0.0);
166 			aValue >>= f;
167             snprintf( pBuffer, sizeof( pBuffer ), "%f", f );
168 			aRetStr = OUString( pBuffer, strlen( pBuffer ), RTL_TEXTENCODING_ASCII_US );
169 			break;
170 		}
171 		case TypeClass_DOUBLE:
172 		{
173 			double d(0.0);
174 			aValue >>= d;
175             snprintf( pBuffer, sizeof( pBuffer ), "%f", d );
176 			aRetStr = OUString( pBuffer, strlen( pBuffer ), RTL_TEXTENCODING_ASCII_US );
177 			break;
178 		}
179 		case TypeClass_BYTE:
180 		{
181 			sal_Int8 n(0);
182 			aValue >>= n;
183 			aRetStr = OUString::valueOf( (sal_Int32) n );
184 			break;
185 		}
186 		case TypeClass_SHORT:
187 		{
188 			sal_Int16 n(0);
189 			aValue >>= n;
190 			aRetStr = OUString::valueOf( (sal_Int32) n );
191 			break;
192 		}
193 		case TypeClass_LONG:
194 		{
195 			sal_Int32 n(0);
196 			aValue >>= n;
197 			aRetStr = OUString::valueOf( n );
198 			break;
199 		}
200 		/*
201 		case TypeClass_HYPER:
202 		{
203 			aRetStr = L"TYPE HYPER";
204 			break;
205 		}
206 		case TypeClass_UNSIGNED_SHORT:
207 		{
208 			aRetStr = StringToUString(WSString(aValue.getUINT16()), CHARSET_SYSTEM);
209 			break;
210 		}
211 		case TypeClass_UNSIGNED_LONG:
212 		{
213 			aRetStr = StringToUString(WSString(aValue.getUINT32()), CHARSET_SYSTEM);
214 			break;
215 		}
216 		case TypeClass_UNSIGNED_HYPER:
217 		{
218 			aRetStr = L"TYPE UNSIGNED_HYPER";
219 			break;
220 		}
221 		*/
222 	default: ;
223 	}
224 
225 	if( bIncludeType )
226 	{
227 		Reference< XIdlClass > xIdlClass = TypeToIdlClass( aValType, xMgr );
228 		aRetStr = aRetStr + OUString( OUString::createFromAscii(" (Typ: ") ) + xIdlClass->getName() + OUString::createFromAscii(")");
229 	}
230 	return aRetStr;
231 }
232 
233 /*
234 // Hilfs-Funktion, um ein UString in einen Any zu konvertieren
235 UsrAny StringToAny( UString aStr, TypeClass eTargetType )
236 {
237 	UsrAny aRetAny;
238 	switch( eTargetType )
239 	{
240 		case TypeClass_INTERFACE:		break;
241 		case TypeClass_SERVICE:			break;
242 		case TypeClass_STRUCT:			break;
243 		case TypeClass_TYPEDEF:			break;
244 		case TypeClass_UNION:			break;
245 		case TypeClass_ENUM:			break;
246 		case TypeClass_EXCEPTION:		break;
247 		case TypeClass_ARRAY:			break;
248 		case TypeClass_SEQUENCE:		break;
249 		case TypeClass_VOID:			break;
250 		case TypeClass_ANY:				break;
251 		case TypeClass_UNKNOWN:			break;
252 		case TypeClass_BOOLEAN:			aRetAny.setBOOL( short(aStr)!=0 );	break;
253 		case TypeClass_CHAR:			aRetAny.setChar( char(aStr) );		break;
254 		case TypeClass_STRING:			aRetAny.setString( aStr );			break;
255 		case TypeClass_FLOAT:			aRetAny.setFloat( (float)strtod( aStr.GetStr(), NULL ) );	break;
256 		case TypeClass_DOUBLE:			aRetAny.setDouble( strtod( aStr.GetStr(), NULL ) );	break;
257 		case TypeClass_BYTE:			aRetAny.setBYTE( BYTE(short(aStr)) );	break;
258 		case TypeClass_SHORT:			aRetAny.setINT16( short(aStr) );	break;
259 		case TypeClass_LONG:			aRetAny.setINT32( long(aStr) );		break;
260 		case TypeClass_HYPER:			break;
261 		case TypeClass_UNSIGNED_SHORT:	aRetAny.setUINT16( USHORT(aStr) );	break;
262 		case TypeClass_UNSIGNED_LONG:	aRetAny.setUINT32( ULONG(aStr) );	break;
263 		case TypeClass_UNSIGNED_HYPER:	break;
264 	}
265 	return aRetAny;
266 }
267 */
268 
269 
270 //*****************************************
271 //*** XPropertySetInfo fuer Test-Klasse ***
272 //*****************************************
273 
274 class ImplPropertySetInfo : public ImplPropertySetInfoHelper
275 {
276  	friend class ImplIntroTest;
277 
278   	Reference< XMultiServiceFactory > mxMgr;
279 
280 public:
ImplPropertySetInfo(const Reference<XMultiServiceFactory> & xMgr)281 	ImplPropertySetInfo( const Reference< XMultiServiceFactory > & xMgr )
282 		: mxMgr( xMgr ) {}
283 		//: mxMgr( xMgr ), ImplPropertySetInfoHelper( xMgr ) {}
284 
285 /*
286 	// Methoden von XInterface
287 	virtual sal_Bool	SAL_CALL queryInterface( const Uik & rUik, Any & ifc ) throw( RuntimeException );
288 	virtual void		SAL_CALL acquire() throw() { OWeakObject::acquire(); }
289 	virtual void		SAL_CALL release() throw() { OWeakObject::release(); }
290 	//ALT: sal_Bool queryInterface( Uik aUik, Reference<XInterface> & rOut );
291 */
292 
293     // Methods of XPropertySetInfo
294     virtual Sequence< Property > SAL_CALL getProperties(  )
295 		throw(RuntimeException);
296     virtual Property SAL_CALL getPropertyByName( const OUString& aName )
297 		throw(UnknownPropertyException, RuntimeException);
298     virtual sal_Bool SAL_CALL hasPropertyByName( const OUString& Name )
299 		throw(RuntimeException);
300     //virtual Sequence< Property > SAL_CALL getProperties(void) throw( RuntimeException );
301     //virtual Property SAL_CALL getPropertyByName(const OUString& Name) throw( RuntimeException );
302     //virtual sal_Bool SAL_CALL hasPropertyByName(const OUString& Name) throw( RuntimeException );
303 };
304 
305 
306 /*
307 // Methoden von XInterface
308 sal_Bool SAL_CALL ImplPropertySetInfo::queryInterface( const Uik & rUik, Any & ifc )
309 	throw( RuntimeException )
310 {
311 	// PropertySet-Implementation
312 	if( com::sun::star::uno::queryInterface( rUik, ifc,
313 											 SAL_STATIC_CAST(XPropertySetInfo*, this) ) )
314 		return sal_True;
315 
316 	return OWeakObject::queryInterface( rUik, ifc );
317 }
318 
319 sal_Bool ImplPropertySetInfo::queryInterface( Uik aUik, Reference<XInterface> & rOut )
320 {
321 	if( aUik == XPropertySetInfo::getSmartUik() )
322 		rOut = (XPropertySetInfo *)this;
323 	else
324 		UsrObject::queryInterface( aUik, rOut );
325 	return rOut.is();
326 }
327 */
328 
getProperties(void)329 Sequence< Property > ImplPropertySetInfo::getProperties(void)
330 	throw( RuntimeException )
331 {
332 	static Sequence<Property> * pSeq = NULL;
333 
334 	if( !pSeq )
335 	{
336 		// die Informationen f�r die Properties "Width", "Height" und "Name" anlegen
337 		pSeq = new Sequence<Property>( 3 );
338 		Property * pAry = pSeq->getArray();
339 
340 		pAry[0].Name = OUString::createFromAscii("Factor");
341 		pAry[0].Handle = -1;
342 		pAry[0].Type = getCppuType( (double*) NULL );
343 		//pAry[0].Type = TypeToIdlClass( getCppuType( (double*) NULL ), mxMgr );
344 		//pAry[0].Type = Double_getReflection()->getIdlClass();
345 		pAry[0].Attributes = BOUND | TRANSIENT;
346 
347 		pAry[1].Name = OUString::createFromAscii("MyCount");
348 		pAry[1].Handle = -1;
349 		pAry[1].Type = getCppuType( (sal_Int32*) NULL );
350 		//pAry[1].Type = TypeToIdlClass( getCppuType( (sal_Int32*) NULL ), mxMgr );
351 		//pAry[1].Type = INT32_getReflection()->getIdlClass();
352 		pAry[1].Attributes = BOUND | TRANSIENT;
353 
354 		pAry[2].Name = OUString::createFromAscii("Info");
355 		pAry[2].Handle = -1;
356 		pAry[2].Type = getCppuType( (OUString*) NULL );
357 		//pAry[2].Type = TypeToIdlClass( getCppuType( (OUString*) NULL ), mxMgr );
358 		//pAry[2].Type = OUString_getReflection()->getIdlClass();
359 		pAry[2].Attributes = TRANSIENT;
360 	}
361 	// Die Information �ber alle drei Properties liefern.
362 	return *pSeq;
363 }
364 
getPropertyByName(const OUString & Name)365 Property ImplPropertySetInfo::getPropertyByName(const OUString& Name)
366 	throw( UnknownPropertyException, RuntimeException )
367 {
368 	Sequence<Property> aSeq = getProperties();
369 	const Property * pAry = aSeq.getConstArray();
370 
371 	for( sal_Int32 i = aSeq.getLength(); i--; )
372 	{
373 		if( pAry[i].Name == Name )
374 			return pAry[i];
375 	}
376 	// Property unbekannt, also leere liefern
377 	return Property();
378 }
379 
hasPropertyByName(const OUString & Name)380 sal_Bool ImplPropertySetInfo::hasPropertyByName(const OUString& Name)
381 	throw( RuntimeException )
382 {
383 	Sequence<Property> aSeq = getProperties();
384 	const Property * pAry = aSeq.getConstArray();
385 
386 	for( sal_Int32 i = aSeq.getLength(); i--; )
387 	{
388 		if( pAry[i].Name == Name )
389 			return sal_True;
390 	}
391 	// Property unbekannt, also leere liefern
392 	return sal_False;
393 }
394 
395 
396 
397 
398 //*****************************************************************
399 
400 
401 
402 class ImplIntroTest : public ImplIntroTestHelper
403 {
404   	Reference< XMultiServiceFactory > mxMgr;
405 
406 	friend class ImplPropertySetInfo;
407 
408 	// Properties fuer das PropertySet
409 	Any aAnyArray[10];
410 
411 	// Optionale Schnittstelle fuer die writeln-Ausgabe
412 	//IntroTestWritelnOutput* m_pOutput;
413 
414 	Reference< XPropertySetInfo > m_xMyInfo;
415 
416 	OUString m_ObjectName;
417 
418 	sal_Int16 m_nMarkusAge;
419 	sal_Int16 m_nMarkusChildrenCount;
420 
421 	long m_lDroenk;
422 	sal_Int16 m_nBla;
423 	sal_Int16 m_nBlub;
424 	sal_Int16 m_nGulp;
425 	sal_Int16 m_nLaber;
426 	TypeClass eTypeClass;
427 	Sequence< OUString > aStringSeq;
428 	Sequence< Sequence< Sequence< sal_Int16 > > > aMultSeq;
429 	Reference< XIntroTest > m_xIntroTest;
430 
431 	// Daten fuer NameAccess
432 	Reference< XIntroTest >* pNameAccessTab;
433 
434 	// Daten fuer IndexAccess
435 	Reference< XIntroTest >* pIndexAccessTab;
436 	sal_Int16 iIndexAccessCount;
437 
438 	// struct-Properties
439     Property m_aFirstStruct;
440     PropertyValue m_aSecondStruct;
441 
442 	// Listener merken (zunaechst einfach, nur einen pro Property)
443 	Reference< XPropertyChangeListener > aPropChangeListener;
444 	OUString aPropChangeListenerStr;
445 	Reference< XVetoableChangeListener > aVetoPropChangeListener;
446 	OUString aVetoPropChangeListenerStr;
447 
448 	void Init( void );
449 
450 public:
ImplIntroTest(const Reference<XMultiServiceFactory> & xMgr)451 	ImplIntroTest( const Reference< XMultiServiceFactory > & xMgr )
452 		: mxMgr( xMgr )
453 		//: mxMgr( xMgr ), ImplIntroTestHelper( xMgr )
454 	{
455 		Init();
456 	}
457 
458 	/*
459 	ImplIntroTest( IntroTestWritelnOutput* pOutput_ )
460 	{
461 		Init();
462 		m_pOutput = pOutput_;
463 	}
464 	*/
465 
466 	//SMART_UNO_DECLARATION(ImplIntroTest,UsrObject);
467 
468 	//BOOL queryInterface( Uik aUik, Reference< XInterface > & rOut );
469 	//Reference< XIdlClass > getIdlClass();
470 
471 	// Trotz virtual inline, um Schreibarbeit zu sparen (nur fuer Testzwecke)
472 	// XPropertySet
473     virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo(  )
474 		throw(RuntimeException);
475     virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue )
476 		throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException);
477     virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName )
478 		throw(UnknownPropertyException, WrappedTargetException, RuntimeException);
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)479     virtual void SAL_CALL addPropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*xListener*/ )
480 		throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
481 			{}
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)482     virtual void SAL_CALL removePropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*aListener*/ )
483 		throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
484 			{}
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)485     virtual void SAL_CALL addVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ )
486 		throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
487 			{}
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)488     virtual void SAL_CALL removeVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ )
489 		throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
490 			{}
491 
492 	/*
493     virtual void setIndexedPropertyValue(const OUString& aPropertyName, INT32 nIndex, const Any& aValue) {}
494     virtual Any getIndexedPropertyValue(const UString& aPropertyName, INT32 nIndex) const { return Any(); }
495     virtual void addPropertyChangeListener(const UString& aPropertyName, const XPropertyChangeListenerRef& aListener)
496 		THROWS( (UnknownPropertyException, WrappedTargetException, UsrSystemException) ) {}
497     virtual void removePropertyChangeListener(const UString& aPropertyName, const XPropertyChangeListenerRef& aListener)
498 		THROWS( (UnknownPropertyException, WrappedTargetException, UsrSystemException) ) {}
499     virtual void addVetoableChangeListener(const UString& aPropertyName, const XVetoableChangeListenerRef& aListener)
500 		THROWS( (UnknownPropertyException, WrappedTargetException, UsrSystemException) ) {}
501     virtual void removeVetoableChangeListener(const UString& aPropertyName, const XVetoableChangeListenerRef& aListener)
502 		THROWS( (UnknownPropertyException, WrappedTargetException, UsrSystemException) ) {}
503 		*/
504 
505 	// XIntroTest-Methoden
506     // Attributes
getObjectName()507     virtual OUString SAL_CALL getObjectName() throw(RuntimeException)
508 		{ return m_ObjectName; }
setObjectName(const OUString & _objectname)509     virtual void SAL_CALL setObjectName( const OUString& _objectname ) throw(RuntimeException)
510 		{ m_ObjectName = _objectname; }
511     virtual OUString SAL_CALL getFirstName()
512 		throw(RuntimeException);
getLastName()513     virtual OUString SAL_CALL getLastName() throw(RuntimeException)
514 		{ return OUString( OUString::createFromAscii("Meyer") ); }
getAge()515     virtual sal_Int16 SAL_CALL getAge() throw(RuntimeException)
516 		{ return m_nMarkusAge; }
getChildrenCount()517     virtual sal_Int16 SAL_CALL getChildrenCount() throw(RuntimeException)
518 		{ return m_nMarkusChildrenCount; }
setChildrenCount(sal_Int16 _childrencount)519     virtual void SAL_CALL setChildrenCount( sal_Int16 _childrencount ) throw(RuntimeException)
520 		{ m_nMarkusChildrenCount = _childrencount; }
getFirstStruct()521     virtual Property SAL_CALL getFirstStruct() throw(RuntimeException)
522 		{ return m_aFirstStruct; }
setFirstStruct(const Property & _firststruct)523     virtual void SAL_CALL setFirstStruct( const Property& _firststruct ) throw(RuntimeException)
524 		{ m_aFirstStruct = _firststruct; }
getSecondStruct()525     virtual PropertyValue SAL_CALL getSecondStruct() throw(RuntimeException)
526 		{ return m_aSecondStruct; }
setSecondStruct(const PropertyValue & _secondstruct)527     virtual void SAL_CALL setSecondStruct( const PropertyValue& _secondstruct ) throw(RuntimeException)
528 		{ m_aSecondStruct = _secondstruct; }
529 
530     // Methods
531     virtual void SAL_CALL writeln( const OUString& Text )
532 		throw(RuntimeException);
getDroenk()533     virtual sal_Int32 SAL_CALL getDroenk(  ) throw(RuntimeException)
534 		{ return m_lDroenk; }
535     virtual Reference< ::ModuleA::XIntroTest > SAL_CALL getIntroTest(  ) throw(RuntimeException);
getUps(sal_Int32 l)536     virtual sal_Int32 SAL_CALL getUps( sal_Int32 l ) throw(RuntimeException)
537 		{ return 2*l; }
setDroenk(sal_Int32 l)538     virtual void SAL_CALL setDroenk( sal_Int32 l ) throw(RuntimeException)
539 		{ m_lDroenk = l; }
getBla()540     virtual sal_Int16 SAL_CALL getBla(  ) throw(RuntimeException)
541 		{ return m_nBla; }
setBla(sal_Int32 n)542     virtual void SAL_CALL setBla( sal_Int32 n ) throw(RuntimeException)
543 		{ m_nBla = (sal_Int16)n; }
getBlub()544     virtual sal_Int16 SAL_CALL getBlub(  ) throw(RuntimeException)
545 		{ return m_nBlub; }
setBlub(sal_Int16 n)546     virtual void SAL_CALL setBlub( sal_Int16 n ) throw(RuntimeException)
547 		{ m_nBlub = n; }
getGulp()548     virtual sal_Int16 SAL_CALL getGulp(  ) throw(RuntimeException)
549 		{ return m_nGulp; }
setGulp(sal_Int16 n)550     virtual sal_Int16 SAL_CALL setGulp( sal_Int16 n ) throw(RuntimeException)
551 		{ m_nGulp = n; return 1; }
getTypeClass(sal_Int16)552     virtual TypeClass SAL_CALL getTypeClass( sal_Int16 /*n*/ ) throw(RuntimeException)
553 		{ return eTypeClass; }
setTypeClass(TypeClass t,double,double)554     virtual void SAL_CALL setTypeClass( TypeClass t, double /*d1*/, double /*d2*/ ) throw(RuntimeException)
555 		{ eTypeClass = t; }
getStrings()556     virtual Sequence< OUString > SAL_CALL getStrings(  ) throw(RuntimeException)
557 		{ return aStringSeq; }
setStrings(const Sequence<OUString> & Strings)558     virtual void SAL_CALL setStrings( const Sequence< OUString >& Strings ) throw(RuntimeException)
559 		{ aStringSeq = Strings; }
setStringsPerMethod(const Sequence<OUString> & Strings,sal_Int16)560     virtual void SAL_CALL setStringsPerMethod( const Sequence< OUString >& Strings, sal_Int16 /*n*/ ) throw(RuntimeException)
561 		{ aStringSeq = Strings; }
getMultiSequence()562     virtual Sequence< Sequence< Sequence< sal_Int16 > > > SAL_CALL getMultiSequence(  ) throw(RuntimeException)
563 		{ return aMultSeq; }
setMultiSequence(const Sequence<Sequence<Sequence<sal_Int16>>> & Seq)564     virtual void SAL_CALL setMultiSequence( const Sequence< Sequence< Sequence< sal_Int16 > > >& Seq ) throw(RuntimeException)
565 		{ aMultSeq = Seq; }
566     virtual void SAL_CALL addPropertiesChangeListener( const Sequence< OUString >& PropertyNames, const Reference< XPropertiesChangeListener >& Listener )
567 		throw(RuntimeException);
568     virtual void SAL_CALL removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& Listener )
569 		throw(RuntimeException);
570 
571 
572     // Methods of XElementAccess
573     virtual Type SAL_CALL getElementType(  )
574 		throw(RuntimeException);
575     virtual sal_Bool SAL_CALL hasElements(  )
576 		throw(RuntimeException);
577     //virtual XIdlClassRef getElementType(void) constTHROWS( (UsrSystemException) );
578     //virtual BOOL hasElements(void) const THROWS( (UsrSystemException) );
579 
580 	// XNameAccess-Methoden
581     // Methods
582     virtual Any SAL_CALL getByName( const OUString& aName )
583 		throw(NoSuchElementException, WrappedTargetException, RuntimeException);
584     virtual Sequence< OUString > SAL_CALL getElementNames(  )
585 		throw(RuntimeException);
586     virtual sal_Bool SAL_CALL hasByName( const OUString& aName )
587 		throw(RuntimeException);
588     //virtual Any getByName(const UString& Name) const
589 		//THROWS( (NoSuchElementException, WrappedTargetException, UsrSystemException) );
590     //virtual Sequence<UString> getElementNames(void) const THROWS( (UsrSystemException) );
591     //virtual BOOL hasByName(const UString& Name) const THROWS( (UsrSystemException) );
592 
593 	// XIndexAccess-Methoden
594     // Methods
595     virtual sal_Int32 SAL_CALL getCount(  )
596 		throw(RuntimeException);
597     virtual Any SAL_CALL getByIndex( sal_Int32 Index )
598 		throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException);
599     //virtual INT32 getCount(void) const THROWS( (UsrSystemException) );
600     //virtual Any getByIndex(INT32 Index) const
601 		//THROWS( (IndexOutOfBoundsException, WrappedTargetException, UsrSystemException) );
602 };
603 
604 //SMART_UNO_IMPLEMENTATION(ImplIntroTest,UsrObject)
605 
Init(void)606 void ImplIntroTest::Init( void )
607 {
608 	// Eindeutigen Namen verpassen
609 	static sal_Int32 nObjCount = 0;
610 	OUString aName( OUString::createFromAscii("IntroTest-Obj Nr. ") );
611 	aName += OUString::valueOf( nObjCount );
612 	setObjectName( aName );
613 
614 	// Properties initialisieren
615 	aAnyArray[0] <<= 3.14;
616 	aAnyArray[1] <<= (sal_Int32)42;
617 	aAnyArray[2] <<= OUString( OUString::createFromAscii("Hallo") );
618 
619 	// Output-Interface
620 	//m_pOutput = NULL;
621 
622 	// Einmal fuer den internen Gebrauch die PropertySetInfo abholen
623 	m_xMyInfo = getPropertySetInfo();
624 	m_xMyInfo->acquire();		// sonst raucht es am Programm-Ende ab
625 
626 	m_nMarkusAge = 33;
627 	m_nMarkusChildrenCount = 2;
628 
629 	m_lDroenk = 314;
630 	m_nBla = 42;
631 	m_nBlub = 111;
632 	m_nGulp = 99;
633 	m_nLaber = 1;
634 	eTypeClass = TypeClass_INTERFACE;
635 
636 	// String-Sequence intitialisieren
637 	aStringSeq.realloc( 3 );
638 	OUString* pStr = aStringSeq.getArray();
639 	pStr[ 0 ] = OUString( OUString::createFromAscii("String 0") );
640 	pStr[ 1 ] = OUString( OUString::createFromAscii("String 1") );
641 	pStr[ 2 ] = OUString( OUString::createFromAscii("String 2") );
642 
643     // structs initialisieren
644     m_aFirstStruct.Name = OUString::createFromAscii("FirstStruct-Name");
645     m_aFirstStruct.Handle = 77777;
646     //XIdlClassRef Type;
647     m_aFirstStruct.Attributes = -222;
648 
649     //XInterfaceRef Source;
650 	Any Value;
651 	Value <<= 2.718281828459;
652     m_aSecondStruct.Value = Value;
653     //XIdlClassRef ListenerType;
654     m_aSecondStruct.State = PropertyState_DIRECT_VALUE;
655 
656 	// IndexAccess
657 	iIndexAccessCount = DEFAULT_INDEX_ACCESS_COUNT;
658 	pIndexAccessTab = NULL;
659 	pNameAccessTab = NULL;
660 }
661 
662 /*
663 BOOL ImplIntroTest::queryInterface( Uik aUik, XInterfaceRef & rOut )
664 {
665 	if( aUik == XIntroTest::getSmartUik() )
666 		rOut = (XIntroTest*)this;
667 	else if( aUik == XPropertySet::getSmartUik() )
668 		rOut = (XPropertySet*)this;
669 	else if( aUik == XNameAccess::getSmartUik() )
670 		rOut = (XNameAccess*)this;
671 	else if( aUik == XIndexAccess::getSmartUik() )
672 		rOut = (XIndexAccess*)this;
673 	else if( aUik == ((XElementAccess*)NULL)->getSmartUik() )
674 		rOut = (XElementAccess*)(XIndexAccess *)this;
675 	else
676 		UsrObject::queryInterface( aUik, rOut );
677 	return rOut.is();
678 }
679 
680 XIdlClassRef ImplIntroTest::getIdlClass()
681 {
682 	static XIdlClassRef xClass = createStandardClass( L"ImplIntroTest",
683 		UsrObject::getUsrObjectIdlClass(), 4,
684 			XIntroTest_getReflection(),
685 			XPropertySet_getReflection(),
686 			XNameAccess_getReflection(),
687 			XIndexAccess_getReflection() );
688 	return xClass;
689 }
690 */
691 
getPropertySetInfo()692 Reference< XPropertySetInfo > ImplIntroTest::getPropertySetInfo()
693 	throw(RuntimeException)
694 {
695 	static ImplPropertySetInfo aInfo( mxMgr );
696 	// Alle Objekt haben die gleichen Properties, deshalb kann
697 	// die Info f�r alle gleich sein
698 	return &aInfo;
699 
700 	//if( m_xMyInfo == NULL )
701 	//	((ImplIntroTest*)this)->m_xMyInfo = new ImplPropertySetInfo( this );
702 	//return m_xMyInfo;
703 }
704 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)705 void ImplIntroTest::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
706 	throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
707 //void ImplIntroTest::setPropertyValue( const UString& aPropertyName, const Any& aValue )
708 //	THROWS( (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, UsrSystemException) )
709 {
710 	if( aPropChangeListener.is() && aPropertyName == aPropChangeListenerStr )
711 	{
712 		PropertyChangeEvent aEvt;
713 		aEvt.Source = (OWeakObject*)this;
714 		aEvt.PropertyName = aPropertyName;
715 		aEvt.PropertyHandle = 0L;
716 		//aEvt.OldValue;
717 		//aEvt.NewValue;
718 		//aEvt.PropagationId;
719 		aPropChangeListener->propertyChange( aEvt );
720 	}
721 	if( aVetoPropChangeListener.is() && aPropertyName == aVetoPropChangeListenerStr )
722 	{
723 		PropertyChangeEvent aEvt;
724 		aEvt.Source = (OWeakObject*)this;
725 		aEvt.PropertyName = aVetoPropChangeListenerStr;
726 		aEvt.PropertyHandle = 0L;
727 		//aEvt.OldValue;
728 		//aEvt.NewValue;
729 		//aEvt.PropagationId;
730 		aVetoPropChangeListener->vetoableChange( aEvt );
731 	}
732 
733 	Sequence<Property> aPropSeq = m_xMyInfo->getProperties();
734 	sal_Int32 nLen = aPropSeq.getLength();
735 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
736 	{
737 		Property aProp = aPropSeq.getArray()[ i ];
738 		if( aProp.Name == aPropertyName )
739 			aAnyArray[i] = aValue;
740 	}
741 }
742 
getPropertyValue(const OUString & PropertyName)743 Any ImplIntroTest::getPropertyValue( const OUString& PropertyName )
744 	throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
745 //Any ImplIntroTest::getPropertyValue(const UString& aPropertyName) const
746 	//THROWS( (UnknownPropertyException, WrappedTargetException, UsrSystemException) )
747 {
748 	Sequence<Property> aPropSeq = m_xMyInfo->getProperties();
749 	sal_Int32 nLen = aPropSeq.getLength();
750 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
751 	{
752 		Property aProp = aPropSeq.getArray()[ i ];
753 		if( aProp.Name == PropertyName )
754 			return aAnyArray[i];
755 	}
756 	return Any();
757 }
758 
getFirstName(void)759 OUString ImplIntroTest::getFirstName(void)
760 	throw(RuntimeException)
761 {
762 	return OUString( OUString::createFromAscii("Markus") );
763 }
764 
writeln(const OUString & Text)765 void ImplIntroTest::writeln( const OUString& Text )
766 	throw(RuntimeException)
767 {
768 	OString aStr( Text.getStr(), Text.getLength(), RTL_TEXTENCODING_ASCII_US );
769 
770 	// Haben wir ein Output?
771 	//if( m_pOutput )
772 	//{
773 		//m_pOutput->doWriteln( TextStr );
774 	//}
775 	// Sonst einfach rausbraten
776 	//else
777 	{
778 		printf( "%s", aStr.getStr() );
779 	}
780 }
781 
getIntroTest()782 Reference< XIntroTest > ImplIntroTest::getIntroTest()
783 	throw(RuntimeException)
784 //XIntroTestRef ImplIntroTest::getIntroTest(void) THROWS( (UsrSystemException) )
785 {
786 	if( !m_xIntroTest.is() )
787 		m_xIntroTest = new ImplIntroTest( mxMgr );
788 	return m_xIntroTest;
789 }
790 
791 // Methoden von XElementAccess
getElementType()792 Type ImplIntroTest::getElementType(  )
793 	throw(RuntimeException)
794 //XIdlClassRef ImplIntroTest::getElementType(void) const THROWS( (UsrSystemException) )
795 {
796 	// TODO
797 	Type aRetType;
798 	return aRetType;
799 	//return Reference< XIdlClass >();
800 	//return Void_getReflection()->getIdlClass();
801 }
802 
hasElements()803 sal_Bool ImplIntroTest::hasElements(  )
804 	throw(RuntimeException)
805 //BOOL ImplIntroTest::hasElements(void) const THROWS( (UsrSystemException) )
806 {
807 	return sal_True;
808 }
809 
810 // XNameAccess-Methoden
getIndexForName(const OUString & ItemName)811 sal_Int32 getIndexForName( const OUString& ItemName )
812 {
813 	OUString aLeftStr = ItemName.copy( 0, 4 );
814 	if( aLeftStr == OUString::createFromAscii("Item") )
815 	{
816 		// TODO
817 		OUString aNumStr = ItemName.copy( 4 );
818 		//sal_Int32 iIndex = (INT32)UStringToString( aNumStr, CHARSET_SYSTEM );
819 		//if( iIndex < DEFAULT_NAME_ACCESS_COUNT )
820 			//return iIndex;
821 	}
822 	return -1;
823 }
824 
825 
getByName(const OUString & aName)826 Any ImplIntroTest::getByName( const OUString& aName )
827 	throw(NoSuchElementException, WrappedTargetException, RuntimeException)
828 //Any ImplIntroTest::getByName(const UString& Name) const
829 	//THROWS( (NoSuchElementException, WrappedTargetException, UsrSystemException) )
830 {
831 	Any aRetAny;
832 
833 	if( !pNameAccessTab  )
834 		((ImplIntroTest*)this)->pNameAccessTab  = new Reference< XIntroTest >[ DEFAULT_NAME_ACCESS_COUNT ];
835 
836 	sal_Int32 iIndex = getIndexForName( aName );
837 	if( iIndex != -1 )
838 	{
839 		if( !pNameAccessTab[iIndex].is() )
840 		{
841 			ImplIntroTest* p = new ImplIntroTest( mxMgr );
842 			OUString aName2( OUString::createFromAscii("IntroTest by Name-Access, Index = ") );
843 			aName2 += OUString::valueOf( iIndex );
844 			//aName2 = aName2 + StringToUString( String( iIndex ), CHARSET_SYSTEM );
845 			p->setObjectName( aName2 );
846 			pNameAccessTab[iIndex] = p;
847 		}
848 
849 		Reference< XIntroTest > xRet = pNameAccessTab[iIndex];
850 		aRetAny = makeAny( xRet );
851 
852 		//aRetAny.set( &xRet, XIntroTest_getReflection() );
853 		//return (UsrObject*)(XIntroTest*)pNameAccessTab[iIndex];
854 	}
855 	return aRetAny;
856 }
857 
getElementNames()858 Sequence< OUString > ImplIntroTest::getElementNames(  )
859 	throw(RuntimeException)
860 //Sequence<UString> ImplIntroTest::getElementNames(void) const THROWS( (UsrSystemException) )
861 {
862 	Sequence<OUString> aStrSeq( DEFAULT_NAME_ACCESS_COUNT );
863 	OUString* pStr = aStrSeq.getArray();
864 	for( sal_Int32 i = 0 ; i < DEFAULT_NAME_ACCESS_COUNT ; i++ )
865 	{
866 		OUString aName( OUString::createFromAscii("Item") );
867 		aName += OUString::valueOf( i );
868 		//aName = aName + StringToUString( i, CHARSET_SYSTEM );
869 		pStr[i] = aName;
870 	}
871 	return aStrSeq;
872 }
873 
hasByName(const OUString & aName)874 sal_Bool ImplIntroTest::hasByName( const OUString& aName )
875 	throw(RuntimeException)
876 //BOOL ImplIntroTest::hasByName(const UString& Name) const THROWS( (UsrSystemException) )
877 {
878 	return ( getIndexForName( aName ) != -1 );
879 }
880 
881 // XIndexAccess-Methoden
getCount()882 sal_Int32 ImplIntroTest::getCount(  )
883 	throw(RuntimeException)
884 //sal_Int32 ImplIntroTest::getCount(void) const THROWS( (UsrSystemException) )
885 {
886 	return iIndexAccessCount;
887 }
888 
getByIndex(sal_Int32 Index)889 Any ImplIntroTest::getByIndex( sal_Int32 Index )
890 	throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
891 //Any ImplIntroTest::getByIndex( sal_Int32 Index ) const
892 	//THROWS( (IndexOutOfBoundsException, WrappedTargetException, UsrSystemException) )
893 {
894 	Any aRetAny;
895 
896 	if( !pIndexAccessTab )
897 		((ImplIntroTest*)this)->pIndexAccessTab = new Reference< XIntroTest >[ iIndexAccessCount ];
898 
899 	if( Index < iIndexAccessCount )
900 	{
901 		if( !pNameAccessTab[Index].is() )
902 		{
903 			ImplIntroTest* p = new ImplIntroTest( mxMgr );
904 			OUString aName( OUString::createFromAscii("IntroTest by Index-Access, Index = ") );
905 			aName += OUString::valueOf( Index );
906 			//aName = aName + StringToUString( String( iIndex ), CHARSET_SYSTEM );
907 			p->setObjectName( aName );
908 			pIndexAccessTab[Index] = p;
909 		}
910 		Reference< XIntroTest > xRet = pIndexAccessTab[Index];
911 		aRetAny = makeAny( xRet );
912 	}
913 	return aRetAny;
914 }
915 
addPropertiesChangeListener(const Sequence<OUString> &,const Reference<XPropertiesChangeListener> &)916 void ImplIntroTest::addPropertiesChangeListener( const Sequence< OUString >& /*PropertyNames*/,
917 												 const Reference< XPropertiesChangeListener >& /*Listener*/ )
918 		throw(RuntimeException)
919 //void ImplIntroTest::addPropertiesChangeListener
920 //(const Sequence< UString >& PropertyNames, const XPropertiesChangeListenerRef& Listener)
921 	//THROWS( (UsrSystemException) )
922 {
923 }
924 
removePropertiesChangeListener(const Reference<XPropertiesChangeListener> &)925 void ImplIntroTest::removePropertiesChangeListener
926 ( const Reference< XPropertiesChangeListener >& /*Listener*/ )
927 		throw(RuntimeException)
928 //void ImplIntroTest::removePropertiesChangeListener(const XPropertiesChangeListenerRef& Listener)
929 	//THROWS( (UsrSystemException) )
930 {
931 }
932 
933 
934 
935 struct DefItem
936 {
937 	char const * pName;
938 	sal_Int32 nConcept;
939 };
940 
941 // Spezial-Wert fuer Method-Concept, um "normale" Funktionen kennzeichnen zu koennen
942 #define  MethodConcept_NORMAL_IMPL		0x80000000
943 
944 
945 // Test-Objekt liefern
getIntrospectionTestObject(const Reference<XMultiServiceFactory> & xMgr)946 Any getIntrospectionTestObject( const Reference< XMultiServiceFactory > & xMgr )
947 {
948 	Any aObjAny;
949 	Reference< XIntroTest > xTestObj = new ImplIntroTest( xMgr );
950 	aObjAny.setValue( &xTestObj, ::getCppuType( (const Reference< XIntroTest > *)0 ) );
951 	return aObjAny;
952 }
953 
test_introsp(Reference<XMultiServiceFactory> xMgr,Reference<XIdlReflection>,Reference<XIntrospection> xIntrospection)954 static sal_Bool test_introsp( Reference< XMultiServiceFactory > xMgr,
955 							  Reference< XIdlReflection > /*xRefl*/, Reference< XIntrospection > xIntrospection )
956 {
957 	DefItem pPropertyDefs[] =
958 	{
959 		{ "Factor", PropertyConcept::PROPERTYSET },
960 		{ "MyCount", PropertyConcept::PROPERTYSET },
961 		{ "Info", PropertyConcept::PROPERTYSET },
962 		{ "ObjectName", PropertyConcept::ATTRIBUTES },
963 		{ "FirstName", PropertyConcept::ATTRIBUTES },
964 		{ "LastName", PropertyConcept::ATTRIBUTES },
965 		{ "Age", PropertyConcept::ATTRIBUTES },
966 		{ "ChildrenCount", PropertyConcept::ATTRIBUTES },
967 		{ "FirstStruct", PropertyConcept::ATTRIBUTES },
968 		{ "SecondStruct", PropertyConcept::ATTRIBUTES },
969 		{ "Droenk", PropertyConcept::METHODS },
970 		{ "IntroTest", PropertyConcept::METHODS },
971 		{ "Bla", PropertyConcept::METHODS },
972 		{ "Blub", PropertyConcept::METHODS },
973 		{ "Gulp", PropertyConcept::METHODS },
974 		{ "Strings", PropertyConcept::METHODS },
975 		{ "MultiSequence", PropertyConcept::METHODS },
976 		{ "PropertySetInfo", PropertyConcept::METHODS },
977 		{ "ElementType", PropertyConcept::METHODS },
978 		{ "ElementNames", PropertyConcept::METHODS },
979 		{ "Count", PropertyConcept::METHODS },
980 		{ "Types", PropertyConcept::METHODS },
981 		{ "ImplementationId", PropertyConcept::METHODS },
982 		{ NULL, 0 }
983 	};
984 
985 	// Tabelle der Property-Namen, die gefunden werden muessen
986 // 	char* pDemandedPropNames[] =
987 // 	{
988 // 		"Factor",
989 // 		"MyCount",
990 // 		"Info",
991 // 		"ObjectName",
992 // 		"FirstName",
993 // 		"LastName",
994 // 		"Age",
995 // 		"ChildrenCount",
996 // 		"FirstStruct",
997 // 		"SecondStruct",
998 // 		"Droenk",
999 // 		"IntroTest",
1000 // 		"Bla",
1001 // 		"Blub",
1002 // 		"Gulp",
1003 // 		"Strings",
1004 // 		"MultiSequence",
1005 // 		"PropertySetInfo",
1006 // 		"ElementType",
1007 // 		"ElementNames",
1008 // 		"Count",
1009 // 		"Types"
1010 // 		"ImplementationId"
1011 // 	};
1012 
1013 	char const * pDemandedPropVals[] =
1014 	{
1015 		"3.140000",
1016 		"42",
1017 		"Hallo",
1018 		"IntroTest-Obj Nr. 0",
1019 		"Markus",
1020 		"Meyer",
1021 		"33",
1022 		"2",
1023 		"TYPE STRUCT",
1024 		"TYPE STRUCT",
1025 		"314",
1026 		"TYPE INTERFACE",
1027 		"42",
1028 		"111",
1029 		"99",
1030 		"TYPE SEQUENCE",
1031 		"TYPE SEQUENCE",
1032 		"TYPE INTERFACE",
1033 		"TYPE TYPE",
1034 		"TYPE SEQUENCE",
1035 		"10",
1036 		"TYPE SEQUENCE",
1037 		"TYPE SEQUENCE",
1038 	};
1039 
1040 	char const * pDemandedModifiedPropVals[] =
1041 	{
1042 		"4.140000",
1043 		"43",
1044 		"Hallo (Modified!)",
1045 		"IntroTest-Obj Nr. 0 (Modified!)",
1046 		"Markus",
1047 		"Meyer",
1048 		"33",
1049 		"3",
1050 		"Wert wurde nicht modifiziert",
1051 		"Wert wurde nicht modifiziert",
1052 		"315",
1053 		"Wert wurde nicht modifiziert",
1054 		"42",
1055 		"112",
1056 		"99",
1057 		"Wert wurde nicht modifiziert",
1058 		"Wert wurde nicht modifiziert",
1059 		"Wert wurde nicht modifiziert",
1060 		"Wert wurde nicht modifiziert",
1061 		"Wert wurde nicht modifiziert",
1062 		"10",
1063 		"Wert wurde nicht modifiziert"
1064 		"Wert wurde nicht modifiziert"
1065 	};
1066 
1067 	char const * pDemandedPropTypes[] =
1068 	{
1069 		"double",
1070 		"long",
1071 		"string",
1072 		"string",
1073 		"string",
1074 		"string",
1075 		"short",
1076 		"short",
1077 		"com.sun.star.beans.Property",
1078 		"com.sun.star.beans.PropertyValue",
1079 		"long",
1080 		"ModuleA.XIntroTest",
1081 		"short",
1082 		"short",
1083 		"short",
1084 		"[]string",
1085 		"[][][]short",
1086 		"com.sun.star.beans.XPropertySetInfo",
1087 		"type",
1088 		"[]string",
1089 		"long",
1090 		"[]type",
1091 		"[]byte",
1092 	};
1093 	//is() nDemandedPropCount = 22;
1094 
1095 
1096 	DefItem pMethodDefs[] =
1097 	{
1098 		{ "queryInterface", MethodConcept_NORMAL_IMPL },
1099 		{ "acquire", MethodConcept::DANGEROUS },
1100 		{ "release", MethodConcept::DANGEROUS },
1101 		{ "writeln", MethodConcept_NORMAL_IMPL },
1102 		{ "getDroenk", MethodConcept::PROPERTY },
1103 		{ "getIntroTest", MethodConcept::PROPERTY },
1104 		{ "getUps", MethodConcept_NORMAL_IMPL },
1105 		{ "setDroenk", MethodConcept::PROPERTY },
1106 		{ "getBla", MethodConcept::PROPERTY },
1107 		{ "setBla", MethodConcept_NORMAL_IMPL },
1108 		{ "getBlub", MethodConcept::PROPERTY },
1109 		{ "setBlub", MethodConcept::PROPERTY },
1110 		{ "getGulp", MethodConcept::PROPERTY },
1111 		{ "setGulp", MethodConcept_NORMAL_IMPL },
1112 		{ "getTypeClass", MethodConcept_NORMAL_IMPL },
1113 		{ "setTypeClass", MethodConcept_NORMAL_IMPL },
1114 		{ "getStrings", MethodConcept::PROPERTY },
1115 		{ "setStrings", MethodConcept::PROPERTY },
1116 		{ "setStringsPerMethod", MethodConcept_NORMAL_IMPL },
1117 		{ "getMultiSequence", MethodConcept::PROPERTY },
1118 		{ "setMultiSequence", MethodConcept::PROPERTY },
1119 		{ "addPropertiesChangeListener", MethodConcept::LISTENER },
1120 		{ "removePropertiesChangeListener", MethodConcept::LISTENER },
1121 		{ "getPropertySetInfo", MethodConcept::PROPERTY },
1122 		{ "setPropertyValue", MethodConcept_NORMAL_IMPL },
1123 		{ "getPropertyValue", MethodConcept_NORMAL_IMPL },
1124 		{ "addPropertyChangeListener", MethodConcept::LISTENER },
1125 		{ "removePropertyChangeListener", MethodConcept::LISTENER },
1126 		{ "addVetoableChangeListener", MethodConcept::LISTENER },
1127 		{ "removeVetoableChangeListener", MethodConcept::LISTENER },
1128 		{ "getElementType", MethodConcept::PROPERTY | MethodConcept::NAMECONTAINER| MethodConcept::INDEXCONTAINER | MethodConcept::ENUMERATION  },
1129 		{ "hasElements", MethodConcept::NAMECONTAINER | MethodConcept::INDEXCONTAINER | MethodConcept::ENUMERATION },
1130 		{ "getByName", MethodConcept::NAMECONTAINER },
1131 		{ "getElementNames", MethodConcept::PROPERTY | MethodConcept::NAMECONTAINER },
1132 		{ "hasByName", MethodConcept::NAMECONTAINER },
1133 		{ "getCount", MethodConcept::PROPERTY | MethodConcept::INDEXCONTAINER },
1134 		{ "getByIndex", MethodConcept::INDEXCONTAINER },
1135 		{ "getTypes", MethodConcept::PROPERTY },
1136 		{ "getImplementationId", MethodConcept::PROPERTY },
1137 		{ "queryAdapter", MethodConcept_NORMAL_IMPL },
1138 		{ NULL, 0 }
1139 	};
1140 
1141 	OString aErrorStr;
1142 
1143 	//******************************************************
1144 
1145 	// Test-Objekt anlegen
1146 	Any aObjAny = getIntrospectionTestObject( xMgr );
1147 
1148 	// Introspection-Service holen
1149 	//Reference< XMultiServiceFactory > xServiceManager(getProcessServiceManager(), USR_QUERY);
1150 	//Reference< XIntrospection > xIntrospection( xMgr->createInstance(L"com.sun.star.beans.Introspection"), UNO_QUERY );
1151 	//TEST_ENSHURE( xIntrospection.is(), "Creation of introspection instance failed" );
1152 	//if( !xIntrospection.is() )
1153 		//return sal_False;
1154 
1155 	// und unspecten
1156 	Reference< XIntrospectionAccess > xAccess = xIntrospection->inspect( aObjAny );
1157 	xAccess = xIntrospection->inspect( aObjAny );
1158 	xAccess = xIntrospection->inspect( aObjAny );
1159 	TEST_ENSHURE( xAccess.is(), "introspection failed, no XIntrospectionAccess returned" );
1160 	if( !xAccess.is() )
1161 		return sal_False;
1162 
1163 	// Ergebnis der Introspection pruefen
1164 
1165 	// XPropertySet-UIK ermitteln
1166 	Type aType = getCppuType( (Reference< XPropertySet >*) NULL );
1167 	//typelib_InterfaceTypeDescription* pTypeDesc = NULL;
1168 	//aType.getDescription( (typelib_TypeDescription**)&pTypeDesc );
1169 	//Uik aPropertySetUik = *(Uik*)&pTypeDesc->aUik;
1170 	//typelib_typedescription_release( (typelib_TypeDescription*)pTypeDesc );
1171 
1172 	Reference< XInterface > xPropSetIface = xAccess->queryAdapter( aType );
1173 	//Reference< XInterface > xPropSetIface = xAccess->queryAdapter( aPropertySetUik );
1174 	Reference< XPropertySet > xPropSet( xPropSetIface, UNO_QUERY );
1175 	//XPropertySetRef xPropSet = (XPropertySet*)xPropSetIface->
1176 	//	queryInterface( XPropertySet::getSmartUik() );
1177 	TEST_ENSHURE( xPropSet.is(), "Could not get XPropertySet by queryAdapter()" );
1178 
1179 	// XExactName
1180 	Reference< XExactName > xExactName( xAccess, UNO_QUERY );
1181 	TEST_ENSHURE( xExactName.is(), "Introspection unterstuetzt kein ExactName" );
1182 
1183 	// Schleife ueber alle Kombinationen von Concepts
1184 	for( sal_Int32 nConcepts = 0 ; nConcepts < 16 ; nConcepts++ )
1185 	{
1186 //printf( "*******************************************************\n" );
1187 //printf( "nConcepts = %ld\n", nConcepts );
1188 
1189 		// Wieviele Properties sollten es sein
1190 		sal_Int32 nDemandedPropCount = 0;
1191 		sal_Int32 iList = 0;
1192 		while( pPropertyDefs[ iList ].pName )
1193 		{
1194 			if( pPropertyDefs[ iList ].nConcept & nConcepts )
1195 				nDemandedPropCount++;
1196 			iList++;
1197 		}
1198 
1199 		if( xPropSet.is() )
1200 		{
1201 			Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
1202 			//Sequence<Property> aRetSeq = xPropSetInfo->getProperties();
1203 			Sequence<Property> aRetSeq = xAccess->getProperties( nConcepts );
1204 
1205 			sal_Int32 nLen = aRetSeq.getLength();
1206 
1207 			aErrorStr  = "Expected to find ";
1208 			aErrorStr += OString::valueOf( nDemandedPropCount );
1209 			aErrorStr += " properties but found ";
1210 			aErrorStr += OString::valueOf( nLen );
1211 			TEST_ENSHURE( nLen == nDemandedPropCount, aErrorStr.getStr() );
1212 
1213 			// cout << "**********************************\n";
1214 			// cout << "*** Ergebnis der Introspection ***\n";
1215 			// cout << "**********************************\n";
1216 			// cout << "\nIntrospection hat " << nLen << " Properties gefunden:\n";
1217 
1218 			const Property* pProps = aRetSeq.getConstArray();
1219 			Any aPropVal;
1220 			sal_Int32 i;
1221 			iList = 0;
1222 			for( i = 0 ; i < nLen ; i++ )
1223 			{
1224 				const Property aProp = pProps[ i ];
1225 
1226 				// Naechste Passende Methode in der Liste suchen
1227 				while( pPropertyDefs[ iList ].pName )
1228 				{
1229 					if( pPropertyDefs[ iList ].nConcept & nConcepts )
1230 						break;
1231 					iList++;
1232 				}
1233 				sal_Int32 iDemanded = iList;
1234 				iList++;
1235 
1236 				OUString aPropName = aProp.Name;
1237 				OString aNameStr( aPropName.getStr(), aPropName.getLength(), RTL_TEXTENCODING_ASCII_US );
1238 					//UStringToString(aPropName, CHARSET_SYSTEM);
1239 
1240 //printf( "Property = %s\n", aNameStr.getStr() );
1241 
1242 				OString aDemandedName = pPropertyDefs[ iDemanded ].pName;
1243 				//OString aDemandedName = pDemandedPropNames[ i ];
1244 				aErrorStr  = "Expected property \"";
1245 				aErrorStr += aDemandedName;
1246 				aErrorStr += "\", found \"";
1247 				aErrorStr += aNameStr;
1248 				aErrorStr += "\"";
1249 				TEST_ENSHURE( aNameStr == aDemandedName, aErrorStr.getStr() );
1250 				// cout << "Property " << (i+1) << ": \"" << (const char*)UStringToString(aPropName, CHARSET_SYSTEM) << "\"";
1251 
1252 
1253 				Type aPropType = aProp.Type;
1254 				OString aTypeNameStr( OUStringToOString(aPropType.getTypeName(), RTL_TEXTENCODING_ASCII_US) );
1255 				//Reference< XIdlClass > xPropType = aProp.Type;
1256 				//OString aTypeNameStr( xPropType->getName(), xPropType->getName().getLength(), RTL_TEXTENCODING_ASCII_US );
1257 				OString aDemandedTypeNameStr = pDemandedPropTypes[ iDemanded ];
1258 				//OString aDemandedTypeNameStr = pDemandedPropTypes[ i ];
1259 				aErrorStr  = "Property \"";
1260 				aErrorStr += aDemandedName;
1261 				aErrorStr += "\", expected type >";
1262 				aErrorStr += aDemandedTypeNameStr;
1263 				aErrorStr += "< found type >";
1264 				aErrorStr += aTypeNameStr;
1265 				aErrorStr += "<";
1266 				TEST_ENSHURE( aTypeNameStr == aDemandedTypeNameStr, aErrorStr.getStr() );
1267 				// cout << " (Prop-Typ: " << (const char*)UStringToString(xPropType->getName(), CHARSET_SYSTEM) << ")";
1268 
1269 				// Wert des Property lesen und ausgeben
1270 				aPropVal = xPropSet->getPropertyValue( aPropName );
1271 				// cout << "\n\tWert = " << (const char*)UStringToString(AnyToString( aPropVal, sal_True ), CHARSET_SYSTEM);
1272 
1273 				OString aValStr = OUStringToOString( AnyToString( aPropVal, sal_False, xMgr ), RTL_TEXTENCODING_ASCII_US );
1274 				OString aDemandedValStr = pDemandedPropVals[ iDemanded ];
1275 				//OString aDemandedValStr = pDemandedPropVals[ i ];
1276 				aErrorStr  = "Property \"";
1277 				aErrorStr += aDemandedName;
1278 				aErrorStr += "\", expected val >";
1279 				aErrorStr += aDemandedValStr;
1280 				aErrorStr += "< found val >";
1281 				aErrorStr += aValStr;
1282 				aErrorStr += "<";
1283 				TEST_ENSHURE( aValStr == aDemandedValStr, aErrorStr.getStr() );
1284 
1285 				// Wert pruefen und typgerecht modifizieren
1286 				TypeClass eType = aPropVal.getValueType().getTypeClass();
1287 				//Reference< XIdlClass > xIdlClass = aPropVal.getReflection()->getIdlClass();
1288 				//TypeClass eType = xIdlClass->getTypeClass();
1289 				Any aNewVal;
1290 				sal_Bool bModify = sal_True;
1291 				switch( eType )
1292 				{
1293 					case TypeClass_STRING:
1294 					{
1295 						OUString aStr;
1296 						aPropVal >>= aStr;
1297 						//OString aStr = aPropVal.getString();
1298 						aStr = aStr + OUString::createFromAscii(" (Modified!)");
1299 						aNewVal <<= aStr;
1300 						break;
1301 					}
1302 					case TypeClass_DOUBLE:
1303 					{
1304 						double d(0.0);
1305 						aPropVal >>= d;
1306 						aNewVal <<= d + 1.0;
1307 						break;
1308 					}
1309 					case TypeClass_SHORT:
1310 					{
1311 						sal_Int16 n(0);
1312 						aPropVal >>= n;
1313 						aNewVal <<= sal_Int16( n + 1 );
1314 						break;
1315 					}
1316 					case TypeClass_LONG:
1317 					{
1318 						sal_Int32 n(0);
1319 						aPropVal >>= n;
1320 						aNewVal <<= sal_Int32( n + 1 );
1321 						break;
1322 					}
1323 					default:
1324 						bModify = sal_False;
1325 						break;
1326 				}
1327 
1328 				// Modifizieren nur beim letzten Durchlauf
1329 				if( nConcepts == 15 )
1330 				{
1331 					// XExactName pruefen, dafuer alles gross machen
1332 					// (Introspection ist mit LowerCase implementiert, also anders machen)
1333 					OUString aUpperUStr = aPropName.toAsciiUpperCase();
1334 					OUString aExactName = xExactName->getExactName( aUpperUStr );
1335 					if( aExactName != aPropName )
1336 					{
1337 						aErrorStr  = "Property \"";
1338 						aErrorStr += OUStringToOString( aPropName, RTL_TEXTENCODING_ASCII_US );
1339 						aErrorStr += "\", not found as \"";
1340 						aErrorStr += OUStringToOString(aUpperUStr, RTL_TEXTENCODING_ASCII_US );
1341 						aErrorStr += "\" using XExactName";
1342 						TEST_ENSHURE( sal_False, aErrorStr.getStr() );
1343 					}
1344 				}
1345 				else
1346 				{
1347 					bModify = sal_False;
1348 				}
1349 
1350 				// Neuen Wert setzen, wieder lesen und ausgeben
1351 				if( bModify )
1352 				{
1353 					// cout.flush();
1354 
1355 					// 1.7.1999, UnknownPropertyException bei ReadOnly-Properties abfangen
1356 					try
1357 					{
1358 						xPropSet->setPropertyValue( aPropName, aNewVal );
1359 					}
1360 					catch(UnknownPropertyException e1)
1361 					{
1362 					}
1363 
1364 					aPropVal = xPropSet->getPropertyValue( aPropName );
1365 					// cout << "\n\tModifizierter Wert = " << (const char*) UStringToString(AnyToString( aPropVal, sal_True ), CHARSET_SYSTEM) << "\n";
1366 
1367 					OUString aStr = AnyToString( aPropVal, sal_False, xMgr );
1368 					OString aModifiedValStr = OUStringToOString( aStr, RTL_TEXTENCODING_ASCII_US );
1369 					OString aDemandedModifiedValStr = pDemandedModifiedPropVals[ i ];
1370 					aErrorStr  = "Property \"";
1371 					aErrorStr += aDemandedName;
1372 					aErrorStr += "\", expected modified val >";
1373 					aErrorStr += aDemandedModifiedValStr;
1374 					aErrorStr += "< found val >";
1375 					aErrorStr += aModifiedValStr;
1376 					aErrorStr += "<";
1377 					TEST_ENSHURE( aModifiedValStr == aDemandedModifiedValStr, aErrorStr.getStr() );
1378 				}
1379 				else
1380 				{
1381 					// cout << "\n\tWert wurde nicht modifiziert\n";
1382 				}
1383 
1384 				// Checken, ob alle Properties auch einzeln gefunden werden
1385 				aErrorStr  = "property \"";
1386 				aErrorStr += aDemandedName;
1387 				aErrorStr += "\" not found with hasProperty()";
1388 				OUString aWDemandedName = OStringToOUString(aDemandedName, RTL_TEXTENCODING_ASCII_US );
1389 				sal_Bool bProperty = xAccess->hasProperty( aWDemandedName, nConcepts );
1390 				//sal_Bool bProperty = xAccess->hasProperty( aWDemandedName, PropertyConcept::ALL - PropertyConcept::DANGEROUS );
1391 				TEST_ENSHURE( bProperty, aErrorStr.getStr() );
1392 
1393 				aErrorStr  = "property \"";
1394 				aErrorStr += aDemandedName;
1395 				aErrorStr += "\" not equal to same Property in sequence returned by getProperties()";
1396 				try
1397 				{
1398 					Property aGetProp = xAccess->getProperty( aWDemandedName, nConcepts );
1399 					//Property aGetProp = xAccess->getProperty( aWDemandedName, PropertyConcept::ALL );
1400 					//TEST_ENSHURE( aGetProp == aProp , aErrorStr.getStr() );
1401 				}
1402 				catch (RuntimeException e1)
1403 				{
1404 					aErrorStr  = "property \"";
1405 					aErrorStr += aDemandedName;
1406 					aErrorStr += "\", exception was thrown when trying getProperty()";
1407 					TEST_ENSHURE( sal_False, aErrorStr.getStr() );
1408 				}
1409 
1410 			}
1411 		}
1412 	}
1413 
1414 	// Schleife ueber alle Kombinationen von Concepts
1415 	for( sal_Int32 nConcepts = 0 ; nConcepts < 128 ; nConcepts++ )
1416 	{
1417 //printf( "*******************************************************\n" );
1418 //printf( "nConcepts = %ld\n", nConcepts );
1419 
1420 		// Das 2^6-Bit steht fuer "den Rest"
1421 		sal_Int32 nRealConcepts = nConcepts;
1422 		if( nConcepts & 0x40 )
1423 			nRealConcepts |= (0xFFFFFFFF - 0x3F);
1424 
1425 		// Wieviele Methoden sollten es sein
1426 		sal_Int32 nDemandedMethCount = 0;
1427 		sal_Int32 iList = 0;
1428 		while( pMethodDefs[ iList ].pName )
1429 		{
1430 			if( pMethodDefs[ iList ].nConcept & nRealConcepts )
1431 				nDemandedMethCount++;
1432 			iList++;
1433 		}
1434 
1435 		// Methoden-Array ausgeben
1436 		//aMethodSeq = xAccess->getMethods
1437 		Sequence< Reference< XIdlMethod > > aMethodSeq = xAccess->getMethods( nRealConcepts );
1438 		//Sequence<XIdlMethodRef> aMethodSeq = xAccess->getMethods
1439 		//	( MethodConcept::ALL - MethodConcept::DANGEROUS - MethodConcept::PROPERTY );
1440 		sal_Int32 nLen = aMethodSeq.getLength();
1441 		// cout << "\n\n*** Methoden ***\n";
1442 		// cout << "Introspection hat " << nLen << " Methoden gefunden:\n";
1443 
1444 		aErrorStr  = "Expected to find ";
1445 		aErrorStr += OString::valueOf( nDemandedMethCount );
1446 		aErrorStr += " methods but found ";
1447 		aErrorStr += OString::valueOf( nLen );
1448 		TEST_ENSHURE( nLen == nDemandedMethCount, aErrorStr.getStr() );
1449 
1450 		const Reference< XIdlMethod >* pMethods = aMethodSeq.getConstArray();
1451 		sal_Int32 i;
1452 		iList = 0;
1453 
1454 		for( i = 0 ; i < nLen ; i++ )
1455 		{
1456 			// Methode ansprechen
1457 			const Reference< XIdlMethod >& rxMethod = pMethods[i];
1458 
1459 			// Methode ausgeben
1460 			OUString aMethName = rxMethod->getName();
1461 			OString aNameStr = OUStringToOString(aMethName, RTL_TEXTENCODING_ASCII_US );
1462 
1463 //printf( "Method = %s\n", aNameStr.getStr() );
1464 
1465 			// Naechste Passende Methode in der Liste suchen
1466 			while( pMethodDefs[ iList ].pName )
1467 			{
1468 				if( pMethodDefs[ iList ].nConcept & nRealConcepts )
1469 					break;
1470 				iList++;
1471 			}
1472 			OString aDemandedName = pMethodDefs[ iList ].pName;
1473 			iList++;
1474 
1475 			//OString aDemandedName = pDemandedMethNames[ i ];
1476 			aErrorStr  = "Expected method \"";
1477 			aErrorStr += aDemandedName;
1478 			aErrorStr += "\", found \"";
1479 			aErrorStr += aNameStr;
1480 			aErrorStr += "\"";
1481 			TEST_ENSHURE( aNameStr == aDemandedName, aErrorStr.getStr() );
1482 			// cout << "Methode " << (i+1) << ": " << (const char*) UStringToString(rxMethod->getReturnType()->getName(), CHARSET_SYSTEM)
1483 			//	 << " " << (const char*) UStringToString(rxMethod->getName(), CHARSET_SYSTEM) << "( ";
1484 
1485 			// Checken, ob alle Methoden auch einzeln gefunden werden
1486 			aErrorStr  = "method \"";
1487 			aErrorStr += aDemandedName;
1488 			aErrorStr += "\" not found with hasMethod()";
1489 			OUString aWDemandedName = OStringToOUString(aDemandedName, RTL_TEXTENCODING_ASCII_US );
1490 			sal_Bool bMethod = xAccess->hasMethod( aWDemandedName, nRealConcepts );
1491 			//sal_Bool bMethod = xAccess->hasMethod( aWDemandedName, MethodConcept::ALL );
1492 			TEST_ENSHURE( bMethod, aErrorStr.getStr() );
1493 
1494 			aErrorStr  = "method \"";
1495 			aErrorStr += aDemandedName;
1496 			aErrorStr += "\" not equal to same method in sequence returned by getMethods()";
1497 			try
1498 			{
1499 				Reference< XIdlMethod > xGetMethod = xAccess->getMethod( aWDemandedName, nRealConcepts );
1500 				//XIdlMethodRef xGetMethod = xAccess->getMethod( aWDemandedName, MethodConcept::ALL );
1501 				TEST_ENSHURE( xGetMethod == rxMethod , aErrorStr.getStr() );
1502 			}
1503 			catch (RuntimeException e1)
1504 			{
1505 				aErrorStr  = "method \"";
1506 				aErrorStr += aDemandedName;
1507 				aErrorStr += "\", exception was thrown when trying getMethod()";
1508 				TEST_ENSHURE( sal_False, aErrorStr.getStr() );
1509 			}
1510 		}
1511 	}
1512 
1513 	// Listener-Klassen ausgeben
1514 	Sequence< Type > aClassSeq = xAccess->getSupportedListeners();
1515 	sal_Int32 nLen = aClassSeq.getLength();
1516 	// cout << "\n\n*** Anmeldbare Listener ***\n";
1517 	// cout << "Introspection hat " << nLen << " Listener gefunden:\n";
1518 
1519 	const Type* pListeners = aClassSeq.getConstArray();
1520 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
1521 	{
1522 		// Methode ansprechen
1523 		const Type& aListenerType = pListeners[i];
1524 
1525 		// Namen besorgen
1526 		OUString aListenerClassName = aListenerType.getTypeName();
1527 		// cout << "Listener " << (i+1) << ": " << (const char*)UStringToString(aListenerClassName, CHARSET_SYSTEM) << "\n";
1528 	}
1529 
1530 
1531 	// Performance bei hasMethod testen.
1532 	//CheckMethodPerformance( xAccess, "queryInterface", 100000 );
1533 	//CheckMethodPerformance( xAccess, "getIdlClasses", 100000 );
1534 
1535 	// cout.flush();
1536 
1537 
1538 
1539 
1540 	return sal_True;
1541 }
1542 
1543 
SAL_IMPLEMENT_MAIN()1544 SAL_IMPLEMENT_MAIN()
1545 {
1546 	Reference< XMultiServiceFactory > xMgr( createRegistryServiceFactory( OUString::createFromAscii("stoctest.rdb") ) );
1547 
1548 	sal_Bool bSucc = sal_False;
1549 	try
1550 	{
1551 		Reference< XImplementationRegistration > xImplReg(
1552 			xMgr->createInstance( OUString::createFromAscii("com.sun.star.registry.ImplementationRegistration") ), UNO_QUERY );
1553 		OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
1554 
1555 		// Register services
1556 		OUString libName( RTL_CONSTASCII_USTRINGPARAM(
1557                               "reflection.uno" SAL_DLLEXTENSION) );
1558 //  		ORealDynamicLoader::computeLibraryName( OUString::createFromAscii("corefl"), libName);
1559 		fprintf(stderr, "1\n" );
1560 		xImplReg->registerImplementation(OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1561 										 libName, Reference< XSimpleRegistry >() );
1562 		fprintf(stderr, "2\n" );
1563 		Reference< XIdlReflection > xRefl( xMgr->createInstance( OUString::createFromAscii("com.sun.star.reflection.CoreReflection") ), UNO_QUERY );
1564 		OSL_ENSURE( xRefl.is(), "### no corereflection!" );
1565 
1566 		// Introspection
1567 		libName = OUString::createFromAscii(
1568             "introspection.uno" SAL_DLLEXTENSION);
1569 //  		ORealDynamicLoader::computeLibraryName( OUString::createFromAscii("insp"), libName);
1570 		fprintf(stderr, "3\n" );
1571 		xImplReg->registerImplementation(OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1572 										 libName, Reference< XSimpleRegistry >() );
1573 		fprintf(stderr, "4\n" );
1574 		Reference< XIntrospection > xIntrosp( xMgr->createInstance( OUString::createFromAscii("com.sun.star.beans.Introspection") ), UNO_QUERY );
1575 		OSL_ENSURE( xRefl.is(), "### no corereflection!" );
1576 
1577 		fprintf(stderr, "before test_introsp\n" );
1578 		bSucc = test_introsp( xMgr, xRefl, xIntrosp );
1579 		fprintf(stderr, "after test_introsp\n" );
1580 		//bSucc = test_corefl( xRefl );
1581 	}
1582 	catch (Exception & rExc)
1583 	{
1584 		OSL_ENSURE( sal_False, "### exception occurred!" );
1585 		OString aMsg( OUStringToOString( rExc.Message, RTL_TEXTENCODING_ASCII_US ) );
1586 		OSL_TRACE( "### exception occurred: " );
1587 		OSL_TRACE( aMsg.getStr() );
1588 		OSL_TRACE( "\n" );
1589 	}
1590 
1591 	Reference< XComponent >( xMgr, UNO_QUERY )->dispose();
1592 
1593 	printf( "testintrosp %s !\n", (bSucc ? "succeeded" : "failed") );
1594 	return (bSucc ? 0 : -1);
1595 }
1596 
1597 
1598 
1599 
1600 
1601 
1602 
1603 //*****************************
1604 //*** TEST-Implementationen ***
1605 //*****************************
1606 // Bleibt auf Dauer nicht drin, dient als exportierbare Test-Klasse
1607 // z.B. fuer Basic-Anbindung
1608 
1609 
1610 
1611 
1612 
1613 
1614