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 #if !defined(OSL_DEBUG_LEVEL) || OSL_DEBUG_LEVEL == 0
25 # undef OSL_DEBUG_LEVEL
26 # define OSL_DEBUG_LEVEL 2
27 #endif
28 
29 // MARKER(update_precomp.py): autogen include statement, do not remove
30 #include "precompiled_cppuhelper.hxx"
31 
32 #include <stdio.h>
33 
34 #include <cppuhelper/implbase1.hxx>
35 #include <cppuhelper/implbase2.hxx>
36 #include <cppuhelper/implbase3.hxx>
37 #include <cppuhelper/implbase4.hxx>
38 #include <cppuhelper/implbase5.hxx>
39 #include <cppuhelper/implbase6.hxx>
40 #include <cppuhelper/implbase7.hxx>
41 #include <cppuhelper/implbase8.hxx>
42 #include <cppuhelper/implbase9.hxx>
43 #include <cppuhelper/implbase10.hxx>
44 #include <cppuhelper/implbase11.hxx>
45 #include <cppuhelper/implbase12.hxx>
46 
47 #include <cppuhelper/compbase1.hxx>
48 #include <cppuhelper/compbase2.hxx>
49 #include <cppuhelper/compbase3.hxx>
50 #include <cppuhelper/compbase4.hxx>
51 #include <cppuhelper/compbase5.hxx>
52 #include <cppuhelper/compbase6.hxx>
53 #include <cppuhelper/compbase7.hxx>
54 #include <cppuhelper/compbase8.hxx>
55 #include <cppuhelper/compbase9.hxx>
56 #include <cppuhelper/compbase10.hxx>
57 #include <cppuhelper/compbase11.hxx>
58 #include <cppuhelper/compbase12.hxx>
59 
60 #include <osl/diagnose.h>
61 #include <cppuhelper/servicefactory.hxx>
62 #include <cppuhelper/implbase4.hxx>
63 #include <cppuhelper/compbase4.hxx>
64 #include <cppuhelper/exc_hlp.hxx>
65 
66 #include <test/A.hpp>
67 #include <test/BA.hpp>
68 #include <test/CA.hpp>
69 #include <test/DBA.hpp>
70 #include <test/E.hpp>
71 #include <test/FE.hpp>
72 #include <test/G.hpp>
73 #include <test/H.hpp>
74 #include <test/I.hpp>
75 
76 #include <com/sun/star/lang/IllegalAccessException.hpp>
77 
78 using namespace test;
79 using namespace rtl;
80 using namespace osl;
81 using namespace cppu;
82 using namespace com::sun::star;
83 using namespace com::sun::star::uno;
84 
85 //==================================================================================================
86 struct TestImpl : public ImplHelper4< CA, DBA, FE, G >
87 {
88 	sal_Int32 nRef;
89 
~TestImplTestImpl90 	virtual ~TestImpl()
91 		{ OSL_TRACE( "> TestImpl dtor called... <\n" ); }
92 
queryInterfaceTestImpl93     virtual Any SAL_CALL queryInterface( const Type & rType ) throw(RuntimeException)
94 		{ return ImplHelper4< CA, DBA, FE, G >::queryInterface( rType ); }
acquireTestImpl95     virtual void SAL_CALL acquire(  ) throw()
96 		{ ++nRef; }
releaseTestImpl97     virtual void SAL_CALL release(  ) throw()
98 		{ if (! --nRef) delete this; }
99 
100 	// A
aTestImpl101 	virtual OUString SAL_CALL a() throw(RuntimeException)
102 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
103 	// BA
baTestImpl104 	virtual OUString SAL_CALL ba() throw(RuntimeException)
105 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
106 	// CA
caTestImpl107 	virtual OUString SAL_CALL ca() throw(RuntimeException)
108 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
109 	// DBA
dbaTestImpl110 	virtual OUString SAL_CALL dba() throw(RuntimeException)
111 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
112 	// E
eTestImpl113 	virtual OUString SAL_CALL e() throw(RuntimeException)
114 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
115 	// FE
feTestImpl116 	virtual OUString SAL_CALL fe() throw(RuntimeException)
117 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
118 	// G
gTestImpl119 	virtual OUString SAL_CALL g() throw(RuntimeException)
120 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
121 };
122 
123 //==================================================================================================
124 struct TestWeakAggImpl : public WeakAggImplHelper4< CA, DBA, FE, G >
125 {
~TestWeakAggImplTestWeakAggImpl126 	virtual ~TestWeakAggImpl()
127 		{ OSL_TRACE( "> TestWeakAggImpl dtor called... <\n" ); }
128 
129 	// A
aTestWeakAggImpl130 	virtual OUString SAL_CALL a() throw(RuntimeException)
131 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
132 	// BA
baTestWeakAggImpl133 	virtual OUString SAL_CALL ba() throw(RuntimeException)
134 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
135 	// CA
caTestWeakAggImpl136 	virtual OUString SAL_CALL ca() throw(RuntimeException)
137 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
138 	// DBA
dbaTestWeakAggImpl139 	virtual OUString SAL_CALL dba() throw(RuntimeException)
140 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
141 	// E
eTestWeakAggImpl142 	virtual OUString SAL_CALL e() throw(RuntimeException)
143 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
144 	// FE
feTestWeakAggImpl145 	virtual OUString SAL_CALL fe() throw(RuntimeException)
146 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
147 	// G
gTestWeakAggImpl148 	virtual OUString SAL_CALL g() throw(RuntimeException)
149 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
150 };
151 
152 //==================================================================================================
153 struct TestWeakImpl : public WeakImplHelper4< CA, DBA, FE, G >
154 {
TestWeakImplTestWeakImpl155     TestWeakImpl() {}
156 
~TestWeakImplTestWeakImpl157 	virtual ~TestWeakImpl()
158 		{ OSL_TRACE( "> TestWeakImpl dtor called... <\n" ); }
159 
160 	// A
aTestWeakImpl161 	virtual OUString SAL_CALL a() throw(RuntimeException)
162 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
163 	// BA
baTestWeakImpl164 	virtual OUString SAL_CALL ba() throw(RuntimeException)
165 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
166 	// CA
caTestWeakImpl167 	virtual OUString SAL_CALL ca() throw(RuntimeException)
168 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
169 	// DBA
dbaTestWeakImpl170 	virtual OUString SAL_CALL dba() throw(RuntimeException)
171 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
172 	// E
eTestWeakImpl173 	virtual OUString SAL_CALL e() throw(RuntimeException)
174 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
175 	// FE
feTestWeakImpl176 	virtual OUString SAL_CALL fe() throw(RuntimeException)
177 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
178 	// G
gTestWeakImpl179 	virtual OUString SAL_CALL g() throw(RuntimeException)
180 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
181 
182 protected:
TestWeakImplTestWeakImpl183     TestWeakImpl(int) {}
184 
TestWeakImplTestWeakImpl185     TestWeakImpl(int, int) {}
186 
TestWeakImplTestWeakImpl187     TestWeakImpl(int, int, int) {}
188 
TestWeakImplTestWeakImpl189     TestWeakImpl(int, int, int, int) {}
190 
TestWeakImplTestWeakImpl191     TestWeakImpl(int, int, int, int, int) {}
192 
TestWeakImplTestWeakImpl193     TestWeakImpl(int, int, int, int, int, int, int = 0) {}
194 };
195 
196 //==================================================================================================
197 struct TestWeakComponentImpl : public WeakComponentImplHelper4< CA, DBA, FE, G >
198 {
199 	Mutex m;
TestWeakComponentImplTestWeakComponentImpl200 	TestWeakComponentImpl()
201 		: WeakComponentImplHelper4< CA, DBA, FE, G >( m )
202 		{}
~TestWeakComponentImplTestWeakComponentImpl203 	virtual ~TestWeakComponentImpl()
204 		{ OSL_TRACE( "> TestWeakComponentImpl dtor called... <\n" ); }
205 
disposingTestWeakComponentImpl206 	void SAL_CALL disposing()
207 		{ OSL_TRACE( "> TestWeakComponentImpl disposing called... <\n" ); }
208 
209 	// A
aTestWeakComponentImpl210 	virtual OUString SAL_CALL a() throw(RuntimeException)
211 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
212 	// BA
baTestWeakComponentImpl213 	virtual OUString SAL_CALL ba() throw(RuntimeException)
214 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
215 	// CA
caTestWeakComponentImpl216 	virtual OUString SAL_CALL ca() throw(RuntimeException)
217 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
218 	// DBA
dbaTestWeakComponentImpl219 	virtual OUString SAL_CALL dba() throw(RuntimeException)
220 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
221 	// E
eTestWeakComponentImpl222 	virtual OUString SAL_CALL e() throw(RuntimeException)
223 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
224 	// FE
feTestWeakComponentImpl225 	virtual OUString SAL_CALL fe() throw(RuntimeException)
226 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
227 	// G
gTestWeakComponentImpl228 	virtual OUString SAL_CALL g() throw(RuntimeException)
229 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
230 };
231 
232 //==================================================================================================
233 struct TestWeakAggComponentImpl : public WeakAggComponentImplHelper4< CA, DBA, FE, G >
234 {
235 	Mutex m;
TestWeakAggComponentImplTestWeakAggComponentImpl236 	TestWeakAggComponentImpl()
237 		: WeakAggComponentImplHelper4< CA, DBA, FE, G >( m )
238 		{}
~TestWeakAggComponentImplTestWeakAggComponentImpl239 	virtual ~TestWeakAggComponentImpl()
240 		{ OSL_TRACE( "> TestWeakAggComponentImpl dtor called... <\n" ); }
241 
disposingTestWeakAggComponentImpl242 	void SAL_CALL disposing()
243 		{ OSL_TRACE( "> TestWeakAggComponentImpl disposing called... <\n" ); }
244 
245 	// A
aTestWeakAggComponentImpl246 	virtual OUString SAL_CALL a() throw(RuntimeException)
247 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
248 	// BA
baTestWeakAggComponentImpl249 	virtual OUString SAL_CALL ba() throw(RuntimeException)
250 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
251 	// CA
caTestWeakAggComponentImpl252 	virtual OUString SAL_CALL ca() throw(RuntimeException)
253 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
254 	// DBA
dbaTestWeakAggComponentImpl255 	virtual OUString SAL_CALL dba() throw(RuntimeException)
256 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
257 	// E
eTestWeakAggComponentImpl258 	virtual OUString SAL_CALL e() throw(RuntimeException)
259 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
260 	// FE
feTestWeakAggComponentImpl261 	virtual OUString SAL_CALL fe() throw(RuntimeException)
262 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
263 	// G
gTestWeakAggComponentImpl264 	virtual OUString SAL_CALL g() throw(RuntimeException)
265 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
266 };
267 
268 //==================================================================================================
269 struct TestImplInh : public ImplInheritanceHelper2< TestWeakImpl, H, I >
270 {
TestImplInhTestImplInh271     TestImplInh() {}
272 
TestImplInhTestImplInh273     explicit TestImplInh(int):
274         ImplInheritanceHelper2< TestWeakImpl, H, I >(1) {}
275 
TestImplInhTestImplInh276     TestImplInh(int, int):
277         ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2) {}
278 
TestImplInhTestImplInh279     TestImplInh(int, int, int):
280         ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3) {}
281 
TestImplInhTestImplInh282     TestImplInh(int, int, int, int):
283         ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4) {}
284 
TestImplInhTestImplInh285     TestImplInh(int, int, int, int, int):
286         ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4, 5) {}
287 
TestImplInhTestImplInh288     TestImplInh(int, int, int, int, int, int):
289         ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4, 5, 6) {}
290 
~TestImplInhTestImplInh291 	virtual ~TestImplInh()
292 		{ OSL_TRACE( "> TestWeakImplInh dtor called... <\n" ); }
293 
294 	// H
hTestImplInh295 	virtual OUString SAL_CALL h() throw(RuntimeException)
296 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("h") ); }
297 	// I
iTestImplInh298 	virtual OUString SAL_CALL i() throw(RuntimeException)
299 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("i") ); }
300 };
301 
302 //==================================================================================================
303 struct TestAggImplInh : public AggImplInheritanceHelper2< TestWeakAggImpl, H, I >
304 {
~TestAggImplInhTestAggImplInh305 	virtual ~TestAggImplInh()
306 		{ OSL_TRACE( "> TestAggImplInh dtor called... <\n" ); }
307 
308 	// H
hTestAggImplInh309 	virtual OUString SAL_CALL h() throw(RuntimeException)
310 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("h2") ); }
311 	// I
iTestAggImplInh312 	virtual OUString SAL_CALL i() throw(RuntimeException)
313 		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("i2") ); }
314 };
315 
316 
isIn(Sequence<Type> const & rTypes,char const * name)317 static bool isIn( Sequence< Type > const & rTypes, char const * name )
318 {
319     OUString str( OUString::createFromAscii( name ) );
320     Type const * pTypes = rTypes.getConstArray();
321     for ( sal_Int32 nPos = rTypes.getLength(); nPos--; )
322     {
323         if (pTypes[ nPos ].getTypeName().equals( str ))
324             return true;
325     }
326     return false;
327 }
328 
329 //==================================================================================================
dotest(const Reference<XInterface> & xOriginal)330 static void dotest( const Reference< XInterface > & xOriginal )
331 {
332     Reference< lang::XTypeProvider > xTP( xOriginal, UNO_QUERY );
333     Sequence< sal_Int8 > id( xTP->getImplementationId() );
334     Sequence< Type > types( xTP->getTypes() );
335     ::fprintf( stderr, "> supported types: " );
336     long n = 0;
337     for ( ; n < types.getLength(); ++n )
338     {
339         OString str( OUStringToOString( types[ n ].getTypeName(), RTL_TEXTENCODING_ASCII_US ) );
340         ::fprintf( stderr, (n < (types.getLength()-1)) ? "%s, " : "%s; type-id=\n", str.getStr() );
341     }
342     for ( n = 0; n < 16; ++n )
343     {
344         ::fprintf( stderr, n < 15 ? "%x " : "%x \n", id[ n ] );
345     }
346 
347 	Reference< A > xa( xOriginal, UNO_QUERY );
348 	OSL_ENSURE( xa->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### A failed!" );
349 	Reference< BA > xba( xa, UNO_QUERY );
350 	OSL_ENSURE( xba->ba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ba") ), "### BA failed!" );
351 	OSL_ENSURE( xba->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### BA failed!" );
352 	Reference< CA > xca( xba, UNO_QUERY );
353 	OSL_ENSURE( xca->ca().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ca") ), "### CA failed!" );
354 	OSL_ENSURE( xca->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### CA failed!" );
355 	Reference< DBA > xdba( xca, UNO_QUERY );
356 	OSL_ENSURE( xdba->dba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("dba") ), "### DBA failed!" );
357 	OSL_ENSURE( xdba->ba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ba") ), "### DBA failed!" );
358 	OSL_ENSURE( xdba->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### DBA failed!" );
359 	Reference< E > xe( xdba, UNO_QUERY );
360 	OSL_ENSURE( xe->e().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("e") ), "### E failed!" );
361 	Reference< FE > xfe( xe, UNO_QUERY );
362 	OSL_ENSURE( xfe->fe().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("fe") ), "### FE failed!" );
363 	Reference< G > xg( xfe, UNO_QUERY );
364 	OSL_ENSURE( xg->g().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("g") ), "### G failed!" );
365 	OSL_ENSURE( xg->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### G failed!" );
366 
367 	// type provider
368 	Reference< lang::XTypeProvider > xProv( xg, UNO_QUERY );
369 	Sequence< Type > aTypes( xProv->getTypes() );
370 
371 	// CA, DBA, FE, G, XTypeProvider
372 	OSL_ASSERT( isIn( aTypes, "test.CA" ) );
373 	OSL_ASSERT( isIn( aTypes, "test.DBA" ) );
374 	OSL_ASSERT( isIn( aTypes, "test.FE") );
375 	OSL_ASSERT( isIn( aTypes, "test.G") );
376 	OSL_ASSERT( isIn( aTypes, "com.sun.star.lang.XTypeProvider") );
377 
378 	Reference< XWeak > xWeak( xg, UNO_QUERY );
379     if (xWeak.is())
380     {
381         OSL_ASSERT( isIn( aTypes, "com.sun.star.uno.XWeak") );
382     }
383 	Reference< lang::XComponent > xComp( xg, UNO_QUERY );
384 	if (xComp.is())
385 	{
386         OSL_ASSERT( isIn( aTypes, "com.sun.star.lang.XComponent") );
387     }
388 
389 	Reference< XAggregation > xAgg( xg, UNO_QUERY );
390     if (xAgg.is())
391     {
392         OSL_ASSERT( isIn( aTypes, "com.sun.star.uno.XAggregation") );
393 	}
394     Reference< H > xH( xg, UNO_QUERY );
395     if (xH.is())
396     {
397         OSL_ASSERT( isIn( aTypes, "test.H") );
398     }
399     Reference< I > xI( xg, UNO_QUERY );
400     if (xI.is())
401     {
402         OSL_ASSERT( isIn( aTypes, "test.I") );
403     }
404 
405 	OSL_ENSURE( xg == xOriginal, "### root!" );
406 }
407 
rethrow()408 void rethrow()
409 {
410     throw;
411 }
412 
throw_one(lang::IllegalAccessException exc)413 void throw_one(
414     lang::IllegalAccessException exc )
415 {
416     try
417     {
418         throw exc;
419     }
420     catch (...)
421     {
422         rethrow();
423     }
424 }
425 
426 
427 //==================================================================================================
test_ImplHelper(const Reference<lang::XMultiServiceFactory> &)428 void test_ImplHelper( const Reference< lang::XMultiServiceFactory > & /*xSF*/ )
429 {
430 	Reference< XInterface > xImpl( (lang::XTypeProvider *)new TestImpl() );
431     Reference< lang::XTypeProvider > xTP1( xImpl, UNO_QUERY );
432 	Reference< XInterface > xWeakImpl( (OWeakObject *)new TestWeakImpl() );
433     Reference< lang::XTypeProvider > xTP2( xWeakImpl, UNO_QUERY );
434 	Reference< XInterface > xWeakAggImpl( (OWeakObject *)new TestWeakAggImpl() );
435     Reference< lang::XTypeProvider > xTP3( xWeakAggImpl, UNO_QUERY );
436 	Reference< XInterface > xWeakComponentImpl( (OWeakObject *)new TestWeakComponentImpl() );
437     Reference< lang::XTypeProvider > xTP4( xWeakComponentImpl, UNO_QUERY );
438 	Reference< XInterface > xWeakAggComponentImpl( (OWeakObject *)new TestWeakAggComponentImpl() );
439     Reference< lang::XTypeProvider > xTP5( xWeakAggComponentImpl, UNO_QUERY );
440 	//
441     OSL_ASSERT(
442         xTP1->getImplementationId() != xTP2->getImplementationId() &&
443         xTP1->getImplementationId() != xTP3->getImplementationId() &&
444         xTP1->getImplementationId() != xTP4->getImplementationId() &&
445         xTP1->getImplementationId() != xTP5->getImplementationId() &&
446         xTP2->getImplementationId() != xTP3->getImplementationId() &&
447         xTP2->getImplementationId() != xTP4->getImplementationId() &&
448         xTP2->getImplementationId() != xTP5->getImplementationId() &&
449         xTP3->getImplementationId() != xTP4->getImplementationId() &&
450         xTP3->getImplementationId() != xTP5->getImplementationId() &&
451         xTP4->getImplementationId() != xTP5->getImplementationId() );
452     //
453 
454 	dotest( xImpl );
455 	dotest( xWeakImpl );
456 	dotest( xWeakAggImpl );
457 	dotest( xWeakComponentImpl );
458 	dotest( xWeakAggComponentImpl );
459 
460 	xWeakImpl = (OWeakObject *)new TestImplInh();
461     Reference< lang::XTypeProvider > xTP6( xWeakImpl, UNO_QUERY );
462     dotest( xWeakImpl );
463     Reference< H > xH( xWeakImpl, UNO_QUERY );
464     Reference< I > xI( xH, UNO_QUERY );
465     OSL_ASSERT( xH->h().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("h") ) );
466     OSL_ASSERT( xI->i().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("i") ) );
467 
468 	xWeakAggImpl = (OWeakObject *)new TestAggImplInh();
469     Reference< lang::XTypeProvider > xTP7( xWeakAggImpl, UNO_QUERY );
470     dotest( xWeakAggImpl );
471     xH.set( xWeakAggImpl, UNO_QUERY );
472     xI.set( xH, UNO_QUERY );
473     OSL_ASSERT( xH->h().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("h2") ) );
474     OSL_ASSERT( xI->i().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("i2") ) );
475 
476     //
477     OSL_ASSERT(
478         xTP6->getImplementationId() != xTP1->getImplementationId() &&
479         xTP6->getImplementationId() != xTP2->getImplementationId() &&
480         xTP6->getImplementationId() != xTP3->getImplementationId() &&
481         xTP6->getImplementationId() != xTP4->getImplementationId() &&
482         xTP6->getImplementationId() != xTP5->getImplementationId() &&
483         xTP6->getImplementationId() != xTP7->getImplementationId() &&
484         xTP7->getImplementationId() != xTP1->getImplementationId() &&
485         xTP7->getImplementationId() != xTP2->getImplementationId() &&
486         xTP7->getImplementationId() != xTP3->getImplementationId() &&
487         xTP7->getImplementationId() != xTP4->getImplementationId() &&
488         xTP7->getImplementationId() != xTP5->getImplementationId() );
489     //
490 
491     bool exc_succ = false;
492     lang::IllegalAccessException exc(
493         OUString( RTL_CONSTASCII_USTRINGPARAM("testtest") ),
494         xWeakAggImpl );
495 	// exception helper tests
496     try
497     {
498         throw exc;
499     }
500     catch (Exception &)
501     {
502         Any a( getCaughtException() );
503         OSL_ASSERT( a == exc );
504 
505         try
506         {
507             throwException( a );
508         }
509         catch (lang::IllegalAccessException & e)
510         {
511             OSL_ASSERT( exc.Message == e.Message && exc.Context == e.Context );
512 
513             try
514             {
515                 throw_one( exc );
516             }
517             catch (Exception &)
518             {
519                 Any a2( getCaughtException() );
520                 OSL_ASSERT( (a2 == a) && (a2 == exc) );
521 
522                 try
523                 {
524                     throw_one( exc );
525                 }
526                 catch (lang::IllegalAccessException &)
527                 {
528                     Any a3( getCaughtException() );
529                     OSL_ASSERT( (a3 == a) && (a3 == a2) && (a3 == exc) );
530                     exc_succ = true;
531                 }
532             }
533         }
534     }
535     OSL_ASSERT( exc_succ );
536 
537 	try
538 	{
539 		throwException( makeAny( RuntimeException(
540 			OUString( RTL_CONSTASCII_USTRINGPARAM("runtime exc") ), xImpl ) ) );
541 	}
542 	catch (RuntimeException & rExc)
543 	{
544 		OSL_ENSURE( rExc.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("runtime exc") ) && rExc.Context == xImpl,
545 					 "### unexpected exception content!" );
546 		try
547 		{
548 			throwException( makeAny( Exception(
549 				OUString( RTL_CONSTASCII_USTRINGPARAM("exc") ), rExc.Context ) ) );
550 		}
551 		catch (lang::IllegalAccessException &)
552 		{
553 			OSL_ENSURE( sal_False, "### unexpected IllegalAccessException exception caught!" );
554 		}
555 		catch (Exception & rExc2)
556 		{
557 			OSL_ENSURE( rExc2.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("exc") ) && rExc2.Context == xImpl,
558 						 "### unexpected exception content!" );
559 			try
560 			{
561 				throwException( makeAny( lang::IllegalAccessException(
562 					OUString( RTL_CONSTASCII_USTRINGPARAM("axxess exc") ), rExc2.Context ) ) );
563 			}
564 			catch (lang::IllegalAccessException & rExc3)
565 			{
566 				OSL_ENSURE( rExc3.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("axxess exc") ) && rExc3.Context == xImpl,
567 							 "### unexpected exception content!" );
568 				return;
569 			}
570 		}
571 	}
572 	catch (...)
573 	{
574 	}
575 	OSL_ENSURE( sal_False, "### exception test failed!" );
576 }
577 
578