xref: /AOO41X/main/stoc/test/testiadapter.cxx (revision 647a425c57429e1e89af1c7acf2de6af6f1bb730)
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 <stdio.h>
28 
29 #include <sal/main.h>
30 #include <osl/diagnose.h>
31 
32 #include <cppuhelper/servicefactory.hxx>
33 #include <cppuhelper/weak.hxx>
34 
35 #include <test/XLanguageBindingTest.hpp>
36 #include <com/sun/star/registry/XSimpleRegistry.hpp>
37 #include <com/sun/star/registry/XImplementationRegistration.hpp>
38 #include <com/sun/star/script/XInvocation.hpp>
39 #include <com/sun/star/script/XInvocationAdapterFactory.hpp>
40 #include <com/sun/star/script/XInvocationAdapterFactory2.hpp>
41 #include <com/sun/star/lang/XComponent.hpp>
42 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
43 
44 #include <cppuhelper/implbase1.hxx>
45 
46 
47 using namespace test;
48 using namespace rtl;
49 using namespace cppu;
50 using namespace osl;
51 using namespace com::sun::star::uno;
52 using namespace com::sun::star::script;
53 using namespace com::sun::star::beans;
54 using namespace com::sun::star::lang;
55 using namespace com::sun::star::reflection;
56 using namespace com::sun::star::lang;
57 using namespace com::sun::star::registry;
58 
59 
60 //==================================================================================================
equals(const test::TestElement & rData1,const test::TestElement & rData2)61 sal_Bool equals( const test::TestElement & rData1, const test::TestElement & rData2 )
62 {
63     OSL_ENSURE( rData1.Bool == rData2.Bool, "### bool does not match!" );
64     OSL_ENSURE( rData1.Char == rData2.Char, "### char does not match!" );
65     OSL_ENSURE( rData1.Byte == rData2.Byte, "### byte does not match!" );
66     OSL_ENSURE( rData1.Short == rData2.Short, "### short does not match!" );
67     OSL_ENSURE( rData1.UShort == rData2.UShort, "### unsigned short does not match!" );
68     OSL_ENSURE( rData1.Long == rData2.Long, "### long does not match!" );
69     OSL_ENSURE( rData1.ULong == rData2.ULong, "### unsigned long does not match!" );
70     OSL_ENSURE( rData1.Hyper == rData2.Hyper, "### hyper does not match!" );
71     OSL_ENSURE( rData1.UHyper == rData2.UHyper, "### unsigned hyper does not match!" );
72     OSL_ENSURE( rData1.Float == rData2.Float, "### float does not match!" );
73     OSL_ENSURE( rData1.Double == rData2.Double, "### double does not match!" );
74     OSL_ENSURE( rData1.Enum == rData2.Enum, "### enum does not match!" );
75     OSL_ENSURE( rData1.String == rData2.String, "### string does not match!" );
76     OSL_ENSURE( rData1.Interface == rData2.Interface, "### interface does not match!" );
77     OSL_ENSURE( rData1.Any == rData2.Any, "### any does not match!" );
78 
79     return (rData1.Bool == rData2.Bool &&
80             rData1.Char == rData2.Char &&
81             rData1.Byte == rData2.Byte &&
82             rData1.Short == rData2.Short &&
83             rData1.UShort == rData2.UShort &&
84             rData1.Long == rData2.Long &&
85             rData1.ULong == rData2.ULong &&
86             rData1.Hyper == rData2.Hyper &&
87             rData1.UHyper == rData2.UHyper &&
88             rData1.Float == rData2.Float &&
89             rData1.Double == rData2.Double &&
90             rData1.Enum == rData2.Enum &&
91             rData1.String == rData2.String &&
92             rData1.Interface == rData2.Interface &&
93             rData1.Any == rData2.Any);
94 }
95 //==================================================================================================
equals(const test::TestData & rData1,const test::TestData & rData2)96 sal_Bool equals( const test::TestData & rData1, const test::TestData & rData2 )
97 {
98     sal_Int32 nLen;
99 
100     if ((rData1.Sequence == rData2.Sequence) &&
101         equals( (const test::TestElement &)rData1, (const test::TestElement &)rData2 ) &&
102         (nLen = rData1.Sequence.getLength()) == rData2.Sequence.getLength())
103     {
104         // once again by hand sequence ==
105         const test::TestElement * pElements1 = rData1.Sequence.getConstArray();
106         const test::TestElement * pElements2 = rData2.Sequence.getConstArray();
107         for ( ; nLen--; )
108         {
109             if (! equals( pElements1[nLen], pElements2[nLen] ))
110             {
111                 OSL_ENSURE( sal_False, "### sequence element did not match!" );
112                 return sal_False;
113             }
114         }
115         return sal_True;
116     }
117     return sal_False;
118 }
119 //==================================================================================================
assign(test::TestElement & rData,sal_Bool bBool,sal_Unicode cChar,sal_Int8 nByte,sal_Int16 nShort,sal_uInt16 nUShort,sal_Int32 nLong,sal_uInt32 nULong,sal_Int64 nHyper,sal_uInt64 nUHyper,float fFloat,double fDouble,test::TestEnum eEnum,const::rtl::OUString & rStr,const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xTest,const::com::sun::star::uno::Any & rAny)120 void assign( test::TestElement & rData,
121              sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
122              sal_Int16 nShort, sal_uInt16 nUShort,
123              sal_Int32 nLong, sal_uInt32 nULong,
124              sal_Int64 nHyper, sal_uInt64 nUHyper,
125              float fFloat, double fDouble,
126              test::TestEnum eEnum, const ::rtl::OUString& rStr,
127              const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
128              const ::com::sun::star::uno::Any& rAny )
129 {
130     rData.Bool = bBool;
131     rData.Char = cChar;
132     rData.Byte = nByte;
133     rData.Short = nShort;
134     rData.UShort = nUShort;
135     rData.Long = nLong;
136     rData.ULong = nULong;
137     rData.Hyper = nHyper;
138     rData.UHyper = nUHyper;
139     rData.Float = fFloat;
140     rData.Double = fDouble;
141     rData.Enum = eEnum;
142     rData.String = rStr;
143     rData.Interface = xTest;
144     rData.Any = rAny;
145 }
146 //==================================================================================================
assign(test::TestData & rData,sal_Bool bBool,sal_Unicode cChar,sal_Int8 nByte,sal_Int16 nShort,sal_uInt16 nUShort,sal_Int32 nLong,sal_uInt32 nULong,sal_Int64 nHyper,sal_uInt64 nUHyper,float fFloat,double fDouble,test::TestEnum eEnum,const::rtl::OUString & rStr,const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xTest,const::com::sun::star::uno::Any & rAny,const com::sun::star::uno::Sequence<test::TestElement> & rSequence)147 void assign( test::TestData & rData,
148              sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
149              sal_Int16 nShort, sal_uInt16 nUShort,
150              sal_Int32 nLong, sal_uInt32 nULong,
151              sal_Int64 nHyper, sal_uInt64 nUHyper,
152              float fFloat, double fDouble,
153              test::TestEnum eEnum, const ::rtl::OUString& rStr,
154              const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
155              const ::com::sun::star::uno::Any& rAny,
156              const com::sun::star::uno::Sequence< test::TestElement >& rSequence )
157 {
158     assign( (test::TestElement &)rData,
159             bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
160             eEnum, rStr, xTest, rAny );
161     rData.Sequence = rSequence;
162 }
163 
164 //==================================================================================================
165 class Test_Impl : public WeakImplHelper1< XLanguageBindingTest >
166 {
167     test::TestData _aData, _aStructData;
168 
169 public:
~Test_Impl()170     virtual ~Test_Impl()
171         { OSL_TRACE( "> scalar Test_Impl dtor <\n" ); }
172 
173     // XLBTestBase
174     virtual void SAL_CALL setValues( sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
175                                      sal_Int16 nShort, sal_uInt16 nUShort,
176                                      sal_Int32 nLong, sal_uInt32 nULong,
177                                      sal_Int64 nHyper, sal_uInt64 nUHyper,
178                                      float fFloat, double fDouble,
179                                      test::TestEnum eEnum, const ::rtl::OUString& rStr,
180                                      const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
181                                      const ::com::sun::star::uno::Any& rAny,
182                                      const ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
183                                      const test::TestData& rStruct )
184         throw(com::sun::star::uno::RuntimeException);
185 
186     virtual test::TestData SAL_CALL setValues2( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
187                                                 sal_Int16& nShort, sal_uInt16& nUShort,
188                                                 sal_Int32& nLong, sal_uInt32& nULong,
189                                                 sal_Int64& nHyper, sal_uInt64& nUHyper,
190                                                 float& fFloat, double& fDouble,
191                                                 test::TestEnum& eEnum, rtl::OUString& rStr,
192                                                 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
193                                                 ::com::sun::star::uno::Any& rAny,
194                                                 ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
195                                                 test::TestData& rStruct )
196         throw(com::sun::star::uno::RuntimeException);
197 
198     virtual test::TestData SAL_CALL getValues( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
199                                                sal_Int16& nShort, sal_uInt16& nUShort,
200                                                sal_Int32& nLong, sal_uInt32& nULong,
201                                                sal_Int64& nHyper, sal_uInt64& nUHyper,
202                                                float& fFloat, double& fDouble,
203                                                test::TestEnum& eEnum, rtl::OUString& rStr,
204                                                ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
205                                                ::com::sun::star::uno::Any& rAny,
206                                                ::com::sun::star::uno::Sequence< test::TestElement >& rSequence,
207                                                test::TestData& rStruct )
208         throw(com::sun::star::uno::RuntimeException);
209 
getBool()210     virtual sal_Bool SAL_CALL getBool() throw(com::sun::star::uno::RuntimeException)
211         { return _aData.Bool; }
getByte()212     virtual sal_Int8 SAL_CALL getByte() throw(com::sun::star::uno::RuntimeException)
213         { return _aData.Byte; }
getChar()214     virtual sal_Unicode SAL_CALL getChar() throw(com::sun::star::uno::RuntimeException)
215         { return _aData.Char; }
getShort()216     virtual sal_Int16 SAL_CALL getShort() throw(com::sun::star::uno::RuntimeException)
217         { return _aData.Short; }
getUShort()218     virtual sal_uInt16 SAL_CALL getUShort() throw(com::sun::star::uno::RuntimeException)
219         { return _aData.UShort; }
getLong()220     virtual sal_Int32 SAL_CALL getLong() throw(com::sun::star::uno::RuntimeException)
221         { return _aData.Long; }
getULong()222     virtual sal_uInt32 SAL_CALL getULong() throw(com::sun::star::uno::RuntimeException)
223         { return _aData.ULong; }
getHyper()224     virtual sal_Int64 SAL_CALL getHyper() throw(com::sun::star::uno::RuntimeException)
225         { return _aData.Hyper; }
getUHyper()226     virtual sal_uInt64 SAL_CALL getUHyper() throw(com::sun::star::uno::RuntimeException)
227         { return _aData.UHyper; }
getFloat()228     virtual float SAL_CALL getFloat() throw(com::sun::star::uno::RuntimeException)
229         { return _aData.Float; }
getDouble()230     virtual double SAL_CALL getDouble() throw(com::sun::star::uno::RuntimeException)
231         { return _aData.Double; }
getEnum()232     virtual test::TestEnum SAL_CALL getEnum() throw(com::sun::star::uno::RuntimeException)
233         { return _aData.Enum; }
getString()234     virtual rtl::OUString SAL_CALL getString() throw(com::sun::star::uno::RuntimeException)
235         { return _aData.String; }
getInterface()236     virtual com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getInterface(  ) throw(com::sun::star::uno::RuntimeException)
237         { return _aData.Interface; }
getAny()238     virtual com::sun::star::uno::Any SAL_CALL getAny() throw(com::sun::star::uno::RuntimeException)
239         { return _aData.Any; }
getSequence()240     virtual com::sun::star::uno::Sequence< test::TestElement > SAL_CALL getSequence() throw(com::sun::star::uno::RuntimeException)
241         { return _aData.Sequence; }
getStruct()242     virtual test::TestData SAL_CALL getStruct() throw(com::sun::star::uno::RuntimeException)
243         { return _aStructData; }
244 
setBool(sal_Bool _bool)245     virtual void SAL_CALL setBool( sal_Bool _bool ) throw(::com::sun::star::uno::RuntimeException)
246         { _aData.Bool = _bool; }
setByte(sal_Int8 _byte)247     virtual void SAL_CALL setByte( sal_Int8 _byte ) throw(::com::sun::star::uno::RuntimeException)
248         { _aData.Byte = _byte; }
setChar(sal_Unicode _char)249     virtual void SAL_CALL setChar( sal_Unicode _char ) throw(::com::sun::star::uno::RuntimeException)
250         { _aData.Char = _char; }
setShort(sal_Int16 _short)251     virtual void SAL_CALL setShort( sal_Int16 _short ) throw(::com::sun::star::uno::RuntimeException)
252         { _aData.Short = _short; }
setUShort(sal_uInt16 _ushort)253     virtual void SAL_CALL setUShort( sal_uInt16 _ushort ) throw(::com::sun::star::uno::RuntimeException)
254         { _aData.UShort = _ushort; }
setLong(sal_Int32 _long)255     virtual void SAL_CALL setLong( sal_Int32 _long ) throw(::com::sun::star::uno::RuntimeException)
256         { _aData.Long = _long; }
setULong(sal_uInt32 _ulong)257     virtual void SAL_CALL setULong( sal_uInt32 _ulong ) throw(::com::sun::star::uno::RuntimeException)
258         { _aData.ULong = _ulong; }
setHyper(sal_Int64 _hyper)259     virtual void SAL_CALL setHyper( sal_Int64 _hyper ) throw(::com::sun::star::uno::RuntimeException)
260         { _aData.Hyper = _hyper; }
setUHyper(sal_uInt64 _uhyper)261     virtual void SAL_CALL setUHyper( sal_uInt64 _uhyper ) throw(::com::sun::star::uno::RuntimeException)
262         { _aData.UHyper = _uhyper; }
setFloat(float _float)263     virtual void SAL_CALL setFloat( float _float ) throw(::com::sun::star::uno::RuntimeException)
264         { _aData.Float = _float; }
setDouble(double _double)265     virtual void SAL_CALL setDouble( double _double ) throw(::com::sun::star::uno::RuntimeException)
266         { _aData.Double = _double; }
setEnum(test::TestEnum _enum)267     virtual void SAL_CALL setEnum( test::TestEnum _enum ) throw(::com::sun::star::uno::RuntimeException)
268         { _aData.Enum = _enum; }
setString(const::rtl::OUString & _string)269     virtual void SAL_CALL setString( const ::rtl::OUString& _string ) throw(::com::sun::star::uno::RuntimeException)
270         { _aData.String = _string; }
setInterface(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & _interface)271     virtual void SAL_CALL setInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _interface ) throw(::com::sun::star::uno::RuntimeException)
272         { _aData.Interface = _interface; }
setAny(const::com::sun::star::uno::Any & _any)273     virtual void SAL_CALL setAny( const ::com::sun::star::uno::Any& _any ) throw(::com::sun::star::uno::RuntimeException)
274         { _aData.Any = _any; }
setSequence(const::com::sun::star::uno::Sequence<test::TestElement> & _sequence)275     virtual void SAL_CALL setSequence( const ::com::sun::star::uno::Sequence<test::TestElement >& _sequence ) throw(::com::sun::star::uno::RuntimeException)
276         { _aData.Sequence = _sequence; }
setStruct(const test::TestData & _struct)277     virtual void SAL_CALL setStruct( const test::TestData& _struct ) throw(::com::sun::star::uno::RuntimeException)
278         { _aStructData = _struct; }
279 
280     // XLanguageBindingTest
281     virtual test::TestData SAL_CALL raiseException( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte, sal_Int16& nShort, sal_uInt16& nUShort, sal_Int32& nLong, sal_uInt32& nULong, sal_Int64& nHyper, sal_uInt64& nUHyper, float& fFloat, double& fDouble, test::TestEnum& eEnum, ::rtl::OUString& aString, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInterface, ::com::sun::star::uno::Any& aAny, ::com::sun::star::uno::Sequence<test::TestElement >& aSequence,test::TestData& aStruct )
282         throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
283 
284     virtual sal_Int32 SAL_CALL getRuntimeException() throw(::com::sun::star::uno::RuntimeException);
285     virtual void SAL_CALL setRuntimeException( sal_Int32 _runtimeexception ) throw(::com::sun::star::uno::RuntimeException);
286 };
287 //==================================================================================================
288 class XLB_Invocation : public WeakImplHelper1< XInvocation >
289 {
290     Reference< XLanguageBindingTest > _xLBT;
291 
292 public:
XLB_Invocation(const Reference<XMultiServiceFactory> &,const Reference<XLanguageBindingTest> & xLBT)293     XLB_Invocation( const Reference< XMultiServiceFactory > & /*xMgr*/,
294                     const Reference< XLanguageBindingTest > & xLBT )
295         : _xLBT( xLBT )
296         {}
297 
298     // XInvocation
getIntrospection()299     virtual Reference< XIntrospectionAccess > SAL_CALL getIntrospection() throw(::com::sun::star::uno::RuntimeException)
300         { return Reference< XIntrospectionAccess >(); }
301     virtual Any SAL_CALL invoke( const OUString & rFunctionName,
302                                  const Sequence< Any > & rParams,
303                                  Sequence< sal_Int16 > & rOutParamIndex,
304                                  Sequence< Any > & rOutParam ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
305     virtual void SAL_CALL setValue( const OUString & rPropertyName, const Any & rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
306     virtual Any SAL_CALL getValue( const OUString & rPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
307     virtual sal_Bool SAL_CALL hasMethod( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException);
308     virtual sal_Bool SAL_CALL hasProperty( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException);
309 };
310 //__________________________________________________________________________________________________
invoke(const OUString & rFunctionName,const Sequence<Any> & rParams,Sequence<sal_Int16> & rOutParamIndex,Sequence<Any> & rOutParam)311 Any XLB_Invocation::invoke( const OUString & rFunctionName,
312                             const Sequence< Any > & rParams,
313                             Sequence< sal_Int16 > & rOutParamIndex,
314                             Sequence< Any > & rOutParam )
315     throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException)
316 {
317     bool bImplementedMethod = true;
318 
319     Any aRet;
320 
321     OSL_ASSERT( rOutParam.getLength() == 0 );
322     OSL_ASSERT( rOutParamIndex.getLength() == 0 );
323 
324     try
325     {
326         sal_Bool aBool;
327         sal_Unicode aChar;
328         sal_Int8 nByte;
329         sal_Int16 nShort;
330         sal_uInt16 nUShort;
331         sal_Int32 nLong;
332         sal_uInt32 nULong;
333         sal_Int64 nHyper;
334         sal_uInt64 nUHyper;
335         float fFloat;
336         double fDouble;
337         TestEnum eEnum;
338         OUString aString;
339         Reference< XInterface > xInterface;
340         Any aAny;
341         Sequence< TestElement > aSeq;
342         TestData aData;
343 
344         if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues") ))
345         {
346             OSL_ASSERT( rParams.getLength() == 17 );
347             aBool = *(sal_Bool *)rParams[0].getValue();
348             aChar = *(sal_Unicode *)rParams[1].getValue();
349             rParams[2] >>= nByte;
350             rParams[3] >>= nShort;
351             rParams[4] >>= nUShort;
352             rParams[5] >>= nLong;
353             rParams[6] >>= nULong;
354             rParams[7] >>= nHyper;
355             rParams[8] >>= nUHyper;
356             rParams[9] >>= fFloat;
357             rParams[10] >>= fDouble;
358             rParams[11] >>= eEnum;
359             rParams[12] >>= aString;
360             rParams[13] >>= xInterface;
361             rParams[14] >>= aAny;
362             rParams[15] >>= aSeq;
363             rParams[16] >>= aData;
364 
365             _xLBT->setValues( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
366                               nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
367                               aAny, aSeq, aData );
368 
369             rOutParamIndex.realloc( 0 );
370             rOutParam.realloc( 0 );
371         }
372         else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues2") ))
373         {
374             aBool = *(sal_Bool *)rParams[0].getValue();
375             aChar = *(sal_Unicode *)rParams[1].getValue();
376             rParams[2] >>= nByte;
377             rParams[3] >>= nShort;
378             rParams[4] >>= nUShort;
379             rParams[5] >>= nLong;
380             rParams[6] >>= nULong;
381             rParams[7] >>= nHyper;
382             rParams[8] >>= nUHyper;
383             rParams[9] >>= fFloat;
384             rParams[10] >>= fDouble;
385             rParams[11] >>= eEnum;
386             rParams[12] >>= aString;
387             rParams[13] >>= xInterface;
388             rParams[14] >>= aAny;
389             rParams[15] >>= aSeq;
390             rParams[16] >>= aData;
391 
392             aRet <<= _xLBT->setValues2( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
393                                         nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
394                                         aAny, aSeq, aData );
395 
396             rOutParamIndex.realloc( 17 );
397             rOutParamIndex[0] = 0;
398             rOutParamIndex[1] = 1;
399             rOutParamIndex[2] = 2;
400             rOutParamIndex[3] = 3;
401             rOutParamIndex[4] = 4;
402             rOutParamIndex[5] = 5;
403             rOutParamIndex[6] = 6;
404             rOutParamIndex[7] = 7;
405             rOutParamIndex[8] = 8;
406             rOutParamIndex[9] = 9;
407             rOutParamIndex[10] = 10;
408             rOutParamIndex[11] = 11;
409             rOutParamIndex[12] = 12;
410             rOutParamIndex[13] = 13;
411             rOutParamIndex[14] = 14;
412             rOutParamIndex[15] = 15;
413             rOutParamIndex[16] = 16;
414 
415             rOutParam.realloc( 17 );
416             rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
417             rOutParam[1].setValue( &aChar, ::getCppuCharType() );
418             rOutParam[2] <<= nByte;
419             rOutParam[3] <<= nShort;
420             rOutParam[4] <<= nUShort;
421             rOutParam[5] <<= nLong;
422             rOutParam[6] <<= nULong;
423             rOutParam[7] <<= nHyper;
424             rOutParam[8] <<= nUHyper;
425             rOutParam[9] <<= fFloat;
426             rOutParam[10] <<= fDouble;
427             rOutParam[11] <<= eEnum;
428             rOutParam[12] <<= aString;
429             rOutParam[13] <<= xInterface;
430             rOutParam[14] <<= aAny;
431             rOutParam[15] <<= aSeq;
432             rOutParam[16] <<= aData;
433         }
434         else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("getValues") ))
435         {
436             aRet <<= _xLBT->getValues( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
437                                        nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
438                                        aAny, aSeq, aData );
439 
440             rOutParamIndex.realloc( 17 );
441             rOutParamIndex[0] = 0;
442             rOutParamIndex[1] = 1;
443             rOutParamIndex[2] = 2;
444             rOutParamIndex[3] = 3;
445             rOutParamIndex[4] = 4;
446             rOutParamIndex[5] = 5;
447             rOutParamIndex[6] = 6;
448             rOutParamIndex[7] = 7;
449             rOutParamIndex[8] = 8;
450             rOutParamIndex[9] = 9;
451             rOutParamIndex[10] = 10;
452             rOutParamIndex[11] = 11;
453             rOutParamIndex[12] = 12;
454             rOutParamIndex[13] = 13;
455             rOutParamIndex[14] = 14;
456             rOutParamIndex[15] = 15;
457             rOutParamIndex[16] = 16;
458 
459             rOutParam.realloc( 17 );
460             rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
461             rOutParam[1].setValue( &aChar, ::getCppuCharType() );
462             rOutParam[2] <<= nByte;
463             rOutParam[3] <<= nShort;
464             rOutParam[4] <<= nUShort;
465             rOutParam[5] <<= nLong;
466             rOutParam[6] <<= nULong;
467             rOutParam[7] <<= nHyper;
468             rOutParam[8] <<= nUHyper;
469             rOutParam[9] <<= fFloat;
470             rOutParam[10] <<= fDouble;
471             rOutParam[11] <<= eEnum;
472             rOutParam[12] <<= aString;
473             rOutParam[13] <<= xInterface;
474             rOutParam[14] <<= aAny;
475             rOutParam[15] <<= aSeq;
476             rOutParam[16] <<= aData;
477         }
478         else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("raiseException") ))
479         {
480             aRet <<= _xLBT->raiseException( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
481                                             nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
482                                             aAny, aSeq, aData );
483 
484             rOutParamIndex.realloc( 17 );
485             rOutParamIndex[0] = 0;
486             rOutParamIndex[1] = 1;
487             rOutParamIndex[2] = 2;
488             rOutParamIndex[3] = 3;
489             rOutParamIndex[4] = 4;
490             rOutParamIndex[5] = 5;
491             rOutParamIndex[6] = 6;
492             rOutParamIndex[7] = 7;
493             rOutParamIndex[8] = 8;
494             rOutParamIndex[9] = 9;
495             rOutParamIndex[10] = 10;
496             rOutParamIndex[11] = 11;
497             rOutParamIndex[12] = 12;
498             rOutParamIndex[13] = 13;
499             rOutParamIndex[14] = 14;
500             rOutParamIndex[15] = 15;
501             rOutParamIndex[16] = 16;
502 
503             rOutParam.realloc( 17 );
504             rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
505             rOutParam[1].setValue( &aChar, ::getCppuCharType() );
506             rOutParam[2] <<= nByte;
507             rOutParam[3] <<= nShort;
508             rOutParam[4] <<= nUShort;
509             rOutParam[5] <<= nLong;
510             rOutParam[6] <<= nULong;
511             rOutParam[7] <<= nHyper;
512             rOutParam[8] <<= nUHyper;
513             rOutParam[9] <<= fFloat;
514             rOutParam[10] <<= fDouble;
515             rOutParam[11] <<= eEnum;
516             rOutParam[12] <<= aString;
517             rOutParam[13] <<= xInterface;
518             rOutParam[14] <<= aAny;
519             rOutParam[15] <<= aSeq;
520             rOutParam[16] <<= aData;
521         }
522         else
523         {
524             bImplementedMethod = false;
525         }
526     }
527     catch (IllegalArgumentException & rExc)
528     {
529         // thrown by raiseException() call
530         InvocationTargetException aExc;
531         aExc.TargetException <<= rExc;
532         throw aExc;
533     }
534     catch (Exception &)
535     {
536         OSL_ENSURE( sal_False, "### unexpected exception caught!" );
537         throw;
538     }
539 
540     if (! bImplementedMethod)
541     {
542         throw IllegalArgumentException(
543             OUString( RTL_CONSTASCII_USTRINGPARAM("not an implemented method!") ),
544             (OWeakObject *)this, 0 );
545     }
546 
547     return aRet;
548 }
549 //__________________________________________________________________________________________________
setValue(const OUString & rName,const Any & rValue)550 void XLB_Invocation::setValue( const OUString & rName, const Any & rValue )
551     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException)
552 {
553     if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ))
554         _xLBT->setBool( *(const sal_Bool *)rValue.getValue() );
555     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ))
556         _xLBT->setByte( *(const sal_Int8 *)rValue.getValue() );
557     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ))
558         _xLBT->setChar( *(const sal_Unicode *)rValue.getValue() );
559     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ))
560         _xLBT->setShort( *(const sal_Int16 *)rValue.getValue() );
561     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ))
562         _xLBT->setUShort( *(const sal_uInt16 *)rValue.getValue() );
563     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ))
564         _xLBT->setLong( *(const sal_Int32 *)rValue.getValue() );
565     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ))
566         _xLBT->setULong( *(const sal_uInt32 *)rValue.getValue() );
567     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ))
568         _xLBT->setHyper( *(const sal_Int64 *)rValue.getValue() );
569     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ))
570         _xLBT->setUHyper( *(const sal_uInt64 *)rValue.getValue() );
571     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ))
572         _xLBT->setFloat( *(const float *)rValue.getValue() );
573     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ))
574         _xLBT->setDouble( *(const double *)rValue.getValue() );
575     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ))
576         _xLBT->setEnum( *(const TestEnum *)rValue.getValue() );
577     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ))
578         _xLBT->setString( *(const OUString *)rValue.getValue() );
579     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ))
580         _xLBT->setInterface( *(const Reference< XInterface > *)rValue.getValue() );
581     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ))
582         _xLBT->setAny( rValue );
583     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ))
584         _xLBT->setSequence( *(const Sequence< TestElement > *)rValue.getValue() );
585     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ))
586         _xLBT->setStruct( *(const TestData *)rValue.getValue() );
587     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ))
588         _xLBT->setRuntimeException( *(const sal_Int32 *)rValue.getValue() );
589 }
590 //__________________________________________________________________________________________________
getValue(const OUString & rName)591 Any XLB_Invocation::getValue( const OUString & rName )
592     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
593 {
594     Any aRet;
595     if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ))
596     {
597         sal_Bool aBool = _xLBT->getBool();
598         aRet.setValue( &aBool, ::getCppuBooleanType() );
599     }
600     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ))
601         aRet <<= _xLBT->getByte();
602     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ))
603     {
604         sal_Unicode aChar = _xLBT->getChar();
605         aRet.setValue( &aChar, ::getCppuCharType() );
606     }
607     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ))
608         aRet <<= _xLBT->getShort();
609     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ))
610         aRet <<= _xLBT->getUShort();
611     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ))
612         aRet <<= _xLBT->getLong();
613     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ))
614         aRet <<= _xLBT->getULong();
615     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ))
616         aRet <<= _xLBT->getHyper();
617     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ))
618         aRet <<= _xLBT->getUHyper();
619     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ))
620         aRet <<= _xLBT->getFloat();
621     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ))
622         aRet <<= _xLBT->getDouble();
623     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ))
624         aRet <<= _xLBT->getEnum();
625     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ))
626         aRet <<= _xLBT->getString();
627     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ))
628         aRet <<= _xLBT->getInterface();
629     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ))
630         aRet <<= _xLBT->getAny();
631     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ))
632         aRet <<= _xLBT->getSequence();
633     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ))
634         aRet <<= _xLBT->getStruct();
635     else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ))
636         aRet <<= _xLBT->getRuntimeException();
637     return aRet;
638 }
639 //__________________________________________________________________________________________________
hasMethod(const OUString & rName)640 sal_Bool XLB_Invocation::hasMethod( const OUString & rName )
641     throw(::com::sun::star::uno::RuntimeException)
642 {
643     return (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("raiseException") ) ||
644             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("getValues") ) ||
645             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues2") ) ||
646             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues") ) ||
647             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("acquire") ) ||
648             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("release") ) ||
649             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("queryInterface") ));
650 }
651 //__________________________________________________________________________________________________
hasProperty(const OUString & rName)652 sal_Bool XLB_Invocation::hasProperty( const OUString & rName )
653     throw(::com::sun::star::uno::RuntimeException)
654 {
655     return (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ) ||
656             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ) ||
657             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ) ||
658             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ) ||
659             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ) ||
660             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ) ||
661             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ) ||
662             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ) ||
663             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ) ||
664             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ) ||
665             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ) ||
666             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ) ||
667             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ) ||
668             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ) ||
669             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ) ||
670             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ) ||
671             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ) ||
672             rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ) );
673 }
674 
675 //##################################################################################################
676 
677 //__________________________________________________________________________________________________
setValues(sal_Bool bBool,sal_Unicode cChar,sal_Int8 nByte,sal_Int16 nShort,sal_uInt16 nUShort,sal_Int32 nLong,sal_uInt32 nULong,sal_Int64 nHyper,sal_uInt64 nUHyper,float fFloat,double fDouble,test::TestEnum eEnum,const::rtl::OUString & rStr,const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xTest,const::com::sun::star::uno::Any & rAny,const::com::sun::star::uno::Sequence<test::TestElement> & rSequence,const test::TestData & rStruct)678 void Test_Impl::setValues( sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
679                            sal_Int16 nShort, sal_uInt16 nUShort,
680                            sal_Int32 nLong, sal_uInt32 nULong,
681                            sal_Int64 nHyper, sal_uInt64 nUHyper,
682                            float fFloat, double fDouble,
683                            test::TestEnum eEnum, const ::rtl::OUString& rStr,
684                            const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
685                            const ::com::sun::star::uno::Any& rAny,
686                            const ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
687                            const test::TestData& rStruct )
688     throw(com::sun::star::uno::RuntimeException)
689 {
690     assign( _aData,
691             bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
692             eEnum, rStr, xTest, rAny, rSequence );
693     _aStructData = rStruct;
694 }
695 //__________________________________________________________________________________________________
setValues2(sal_Bool & bBool,sal_Unicode & cChar,sal_Int8 & nByte,sal_Int16 & nShort,sal_uInt16 & nUShort,sal_Int32 & nLong,sal_uInt32 & nULong,sal_Int64 & nHyper,sal_uInt64 & nUHyper,float & fFloat,double & fDouble,test::TestEnum & eEnum,rtl::OUString & rStr,::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xTest,::com::sun::star::uno::Any & rAny,::com::sun::star::uno::Sequence<test::TestElement> & rSequence,test::TestData & rStruct)696 test::TestData Test_Impl::setValues2( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
697                                       sal_Int16& nShort, sal_uInt16& nUShort,
698                                       sal_Int32& nLong, sal_uInt32& nULong,
699                                       sal_Int64& nHyper, sal_uInt64& nUHyper,
700                                       float& fFloat, double& fDouble,
701                                       test::TestEnum& eEnum, rtl::OUString& rStr,
702                                       ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
703                                       ::com::sun::star::uno::Any& rAny,
704                                       ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
705                                       test::TestData& rStruct )
706     throw(com::sun::star::uno::RuntimeException)
707 {
708     assign( _aData,
709             bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
710             eEnum, rStr, xTest, rAny, rSequence );
711     _aStructData = rStruct;
712     return _aStructData;
713 }
714 //__________________________________________________________________________________________________
getValues(sal_Bool & bBool,sal_Unicode & cChar,sal_Int8 & nByte,sal_Int16 & nShort,sal_uInt16 & nUShort,sal_Int32 & nLong,sal_uInt32 & nULong,sal_Int64 & nHyper,sal_uInt64 & nUHyper,float & fFloat,double & fDouble,test::TestEnum & eEnum,rtl::OUString & rStr,::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & xTest,::com::sun::star::uno::Any & rAny,::com::sun::star::uno::Sequence<test::TestElement> & rSequence,test::TestData & rStruct)715 test::TestData Test_Impl::getValues( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
716                                      sal_Int16& nShort, sal_uInt16& nUShort,
717                                      sal_Int32& nLong, sal_uInt32& nULong,
718                                      sal_Int64& nHyper, sal_uInt64& nUHyper,
719                                      float& fFloat, double& fDouble,
720                                      test::TestEnum& eEnum, rtl::OUString& rStr,
721                                      ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
722                                      ::com::sun::star::uno::Any& rAny,
723                                      ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
724                                      test::TestData& rStruct )
725     throw(com::sun::star::uno::RuntimeException)
726 {
727      bBool = _aData.Bool;
728      cChar = _aData.Char;
729      nByte = _aData.Byte;
730      nShort = _aData.Short;
731      nUShort = _aData.UShort;
732      nLong = _aData.Long;
733      nULong = _aData.ULong;
734      nHyper = _aData.Hyper;
735      nUHyper = _aData.UHyper;
736      fFloat = _aData.Float;
737      fDouble = _aData.Double;
738      eEnum = _aData.Enum;
739      rStr = _aData.String;
740      xTest = _aData.Interface;
741      rAny = _aData.Any;
742      rSequence = _aData.Sequence;
743      rStruct = _aStructData;
744      return _aStructData;
745 }
746 
747 //==================================================================================================
performTest(const Reference<XLanguageBindingTest> & xLBT)748 sal_Bool performTest( const Reference<XLanguageBindingTest > & xLBT )
749 {
750     OSL_ENSURE( xLBT.is(), "### no test interface!" );
751     if (xLBT.is())
752     {
753         // this data is never ever granted access to by calls other than equals(), assign()!
754         test::TestData aData; // test against this data
755 
756         Reference<XInterface > xI( *new OWeakObject() );
757 
758         assign( (test::TestElement &)aData,
759                 sal_True, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
760                 SAL_CONST_INT64(0x123456789abcdef0),
761                 SAL_CONST_UINT64(0xfedcba9876543210),
762                 (float)17.0815, 3.1415926359, TestEnum_LOLA, OUString::createFromAscii("dumdidum"), xI,
763                 Any( &xI, ::getCppuType( (const Reference<XInterface > *)0 ) ) );
764 
765         OSL_ENSURE( aData.Any == xI, "### unexpected any!" );
766         OSL_ENSURE( !(aData.Any != xI), "### unexpected any!" );
767 
768         aData.Sequence = Sequence<test::TestElement >( (const test::TestElement *)&aData, 1 );
769         // aData complete
770         //================================================================================
771 
772         // this is a manually copy of aData for first setting...
773         test::TestData aSetData;
774 
775         assign( (test::TestElement &)aSetData,
776                 aData.Bool, aData.Char, aData.Byte, aData.Short, aData.UShort,
777                 aData.Long, aData.ULong, aData.Hyper, aData.UHyper, aData.Float, aData.Double,
778                 aData.Enum, aData.String, xI,
779                 Any( &xI, ::getCppuType( (const Reference<XInterface > *)0 ) ) );
780 
781         aSetData.Sequence = Sequence<test::TestElement >( (const test::TestElement *)&aSetData, 1 );
782 
783         xLBT->setValues(
784             aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short, aSetData.UShort,
785             aSetData.Long, aSetData.ULong, aSetData.Hyper, aSetData.UHyper, aSetData.Float, aSetData.Double,
786             aSetData.Enum, aSetData.String, aSetData.Interface, aSetData.Any, aSetData.Sequence, aSetData );
787 
788         {
789         test::TestData aRet, aRet2;
790         xLBT->getValues(
791             aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
792             aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
793             aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
794 
795         OSL_ASSERT( equals( aData, aRet ) && equals( aData, aRet2 ) );
796 
797         // set last retrieved values
798         test::TestData aSV2ret = xLBT->setValues2(
799             aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
800             aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
801             aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
802 
803         OSL_ASSERT( equals( aData, aSV2ret ) && equals( aData, aRet2 ) );
804         }
805         {
806         test::TestData aRet, aRet2;
807         test::TestData aGVret = xLBT->getValues(
808             aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
809             aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
810             aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
811 
812         OSL_ASSERT( equals( aData, aRet ) && equals( aData, aRet2 ) && equals( aData, aGVret ) );
813 
814         // set last retrieved values
815         xLBT->setBool( aRet.Bool );
816         xLBT->setChar( aRet.Char );
817         xLBT->setByte( aRet.Byte );
818         xLBT->setShort( aRet.Short );
819         xLBT->setUShort( aRet.UShort );
820         xLBT->setLong( aRet.Long );
821         xLBT->setULong( aRet.ULong );
822         xLBT->setHyper( aRet.Hyper );
823         xLBT->setUHyper( aRet.UHyper );
824         xLBT->setFloat( aRet.Float );
825         xLBT->setDouble( aRet.Double );
826         xLBT->setEnum( aRet.Enum );
827         xLBT->setString( aRet.String );
828         xLBT->setInterface( aRet.Interface );
829         xLBT->setAny( aRet.Any );
830         xLBT->setSequence( aRet.Sequence );
831         xLBT->setStruct( aRet2 );
832         }
833         {
834         test::TestData aRet, aRet2;
835         aRet.Hyper = xLBT->getHyper();
836         aRet.UHyper = xLBT->getUHyper();
837         aRet.Float = xLBT->getFloat();
838         aRet.Double = xLBT->getDouble();
839         aRet.Byte = xLBT->getByte();
840         aRet.Char = xLBT->getChar();
841         aRet.Bool = xLBT->getBool();
842         aRet.Short = xLBT->getShort();
843         aRet.UShort = xLBT->getUShort();
844         aRet.Long = xLBT->getLong();
845         aRet.ULong = xLBT->getULong();
846         aRet.Enum = xLBT->getEnum();
847         aRet.String = xLBT->getString();
848         aRet.Interface = xLBT->getInterface();
849         aRet.Any = xLBT->getAny();
850         aRet.Sequence = xLBT->getSequence();
851         aRet2 = xLBT->getStruct();
852 
853         return (equals( aData, aRet ) && equals( aData, aRet2 ));
854         }
855     }
856     return sal_False;
857 }
858 
859 //__________________________________________________________________________________________________
raiseException(sal_Bool &,sal_Unicode &,sal_Int8 &,sal_Int16 &,sal_uInt16 &,sal_Int32 &,sal_uInt32 &,sal_Int64 &,sal_uInt64 &,float &,double &,test::TestEnum &,::rtl::OUString &,::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> &,::com::sun::star::uno::Any &,::com::sun::star::uno::Sequence<test::TestElement> &,test::TestData &)860 test::TestData Test_Impl::raiseException( sal_Bool& /*bBool*/, sal_Unicode& /*cChar*/, sal_Int8& /*nByte*/, sal_Int16& /*nShort*/, sal_uInt16& /*nUShort*/, sal_Int32& /*nLong*/, sal_uInt32& /*nULong*/, sal_Int64& /*nHyper*/, sal_uInt64& /*nUHyper*/, float& /*fFloat*/, double& /*fDouble*/, test::TestEnum& /*eEnum*/, ::rtl::OUString& /*aString*/, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& /*xInterface*/, ::com::sun::star::uno::Any& /*aAny*/, ::com::sun::star::uno::Sequence< test::TestElement >& /*aSequence*/, test::TestData& /*aStruct*/ )
861     throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
862 {
863     IllegalArgumentException aExc;
864     aExc.ArgumentPosition = 5;
865     aExc.Message          = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
866     aExc.Context          = *this;
867     throw aExc;
868 }
869 //__________________________________________________________________________________________________
getRuntimeException()870 sal_Int32 Test_Impl::getRuntimeException() throw(::com::sun::star::uno::RuntimeException)
871 {
872     RuntimeException aExc;
873     aExc.Message          = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
874     aExc.Context          = *this;
875     throw aExc;
876 }
877 //__________________________________________________________________________________________________
setRuntimeException(sal_Int32)878 void Test_Impl::setRuntimeException( sal_Int32 /*_runtimeexception*/ ) throw(::com::sun::star::uno::RuntimeException)
879 {
880     RuntimeException aExc;
881     aExc.Message          = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
882     aExc.Context          = *this;
883     throw aExc;
884 }
885 
886 //==================================================================================================
raiseException(const Reference<XLanguageBindingTest> & xLBT)887 sal_Bool raiseException( const Reference<XLanguageBindingTest > & xLBT )
888 {
889     try
890     {
891         try
892         {
893             try
894             {
895                 test::TestData aRet, aRet2;
896                 xLBT->raiseException(
897                     aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
898                     aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
899                     aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
900                 return sal_False;
901             }
902             catch (IllegalArgumentException aExc)
903             {
904                 OSL_ENSURE( aExc.ArgumentPosition == 5 &&
905 //                               aExc.Context == xLBT &&
906                              aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
907                              "### unexpected exception content!" );
908 
909                 Reference<XLanguageBindingTest > xLBT2(
910                     Reference<XLanguageBindingTest >::query( aExc.Context ) );
911 
912                 OSL_ENSURE( xLBT2.is(), "### unexpected source of exception!" );
913                 if (xLBT2.is())
914                     xLBT2->getRuntimeException();
915                 else
916                     return sal_False;
917             }
918         }
919         catch (const RuntimeException & rExc)
920         {
921             OSL_ENSURE(//rExc.Context == xLBT &&
922                         rExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
923                         "### unexpected exception content!" );
924 
925             Reference<XLanguageBindingTest > xLBT2(
926                 Reference<XLanguageBindingTest >::query( rExc.Context ) );
927 
928             OSL_ENSURE( xLBT2.is(), "### unexpected source of exception!" );
929             if (xLBT2.is())
930                 xLBT2->setRuntimeException( 0xcafebabe );
931             else
932                 return sal_False;
933         }
934     }
935     catch (Exception & aExc)
936     {
937         OSL_ENSURE( //aExc.Context == xLBT &&
938                      aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
939                      "### unexpected exception content!" );
940         return (//aExc.Context == xLBT &&
941                 aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")));
942     }
943     return sal_False;
944 }
945 
946 //==================================================================================================
test_adapter(const Reference<XMultiServiceFactory> & xMgr)947 static sal_Bool test_adapter( const Reference< XMultiServiceFactory > & xMgr )
948 {
949     Reference< XInvocationAdapterFactory > xAdapFac(
950         xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.InvocationAdapterFactory") ), UNO_QUERY );
951     Reference< XInvocationAdapterFactory2 > xAdapFac2( xAdapFac, UNO_QUERY_THROW );
952 
953     Reference< XLanguageBindingTest > xOriginal( (XLanguageBindingTest *)new Test_Impl() );
954     Reference< XInvocation > xInvok( new XLB_Invocation( xMgr, xOriginal ) );
955     Reference< XLanguageBindingTest > xLBT( xAdapFac->createAdapter(
956         xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );
957     Reference< XLanguageBindingTest > xLBT2(
958         xAdapFac->createAdapter(
959             xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );
960     if (xLBT != xLBT2)
961         return sal_False;
962     Reference< XInterface > xLBT3(
963         xAdapFac->createAdapter(
964             xInvok, ::getCppuType( (const Reference< XInterface > *)0 ) ), UNO_QUERY );
965     if (xLBT != xLBT3)
966         return sal_False;
967     Type ar[ 2 ] = {
968         ::getCppuType( (const Reference< XLBTestBase > *)0 ),
969         ::getCppuType( (const Reference< XInterface > *)0 ) };
970     Reference< XInterface > xLBT4(
971         xAdapFac2->createAdapter( xInvok, Sequence< Type >( ar, 2 ) ), UNO_QUERY );
972     if (xLBT != xLBT4)
973         return sal_False;
974     Reference< XSimpleRegistry > xInvalidAdapter(
975         xAdapFac->createAdapter(
976             xInvok, ::getCppuType( (const Reference< XSimpleRegistry > *)0 ) ), UNO_QUERY );
977     if (xLBT == xInvalidAdapter)
978         return sal_False;
979 
980     try
981     {
982         xInvalidAdapter->isValid();
983         return sal_False;
984     }
985     catch (RuntimeException &)
986     {
987     }
988 
989     return (performTest( xLBT ) && raiseException( xLBT ));
990 }
991 //==================================================================================================
test_invocation(const Reference<XMultiServiceFactory> & xMgr)992 static sal_Bool test_invocation( const Reference< XMultiServiceFactory > & xMgr )
993 {
994     Reference< XInvocationAdapterFactory > xAdapFac(
995         xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.InvocationAdapterFactory") ), UNO_QUERY );
996     Reference< XSingleServiceFactory > xInvocFac(
997         xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.Invocation") ), UNO_QUERY );
998 
999     Reference< XLanguageBindingTest > xOriginal( (XLanguageBindingTest *)new Test_Impl() );
1000     Any aOriginal( &xOriginal, ::getCppuType( &xOriginal ) );
1001     Reference< XInvocation > xInvok(
1002         xInvocFac->createInstanceWithArguments( Sequence< Any >( &aOriginal, 1 ) ), UNO_REF_QUERY );
1003 
1004     Reference< XLanguageBindingTest > xLBT( xAdapFac->createAdapter(
1005         xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );
1006 
1007     return (performTest( xLBT ) && raiseException( xLBT ));
1008 }
1009 
SAL_IMPLEMENT_MAIN()1010 SAL_IMPLEMENT_MAIN()
1011 {
1012     Reference< XMultiServiceFactory > xMgr( createRegistryServiceFactory(
1013         OUString( RTL_CONSTASCII_USTRINGPARAM("stoctest.rdb") ) ) );
1014 
1015     try
1016     {
1017         Reference< XImplementationRegistration > xImplReg(
1018             xMgr->createInstance(
1019                 OUString(
1020                     RTL_CONSTASCII_USTRINGPARAM(
1021                         "com.sun.star.registry.ImplementationRegistration") ) ),
1022             UNO_QUERY );
1023         OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
1024 
1025         xImplReg->registerImplementation(
1026             OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1027             OUString::createFromAscii("invocadapt.uno" SAL_DLLEXTENSION),
1028             Reference< XSimpleRegistry >() );
1029         xImplReg->registerImplementation(
1030             OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1031             OUString::createFromAscii("stocservices.uno" SAL_DLLEXTENSION),
1032             Reference< XSimpleRegistry >() );
1033         xImplReg->registerImplementation(
1034             OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1035             OUString::createFromAscii("invocation.uno" SAL_DLLEXTENSION),
1036             Reference< XSimpleRegistry >() );
1037         xImplReg->registerImplementation(
1038             OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1039             OUString::createFromAscii("reflection.uno" SAL_DLLEXTENSION),
1040             Reference< XSimpleRegistry >() );
1041         xImplReg->registerImplementation(
1042             OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
1043             OUString::createFromAscii("introspection.uno" SAL_DLLEXTENSION),
1044             Reference< XSimpleRegistry >() );
1045 
1046         if (test_adapter( xMgr ))
1047         {
1048             fprintf( stderr, "> test_iadapter() succeeded.\n" );
1049             if (test_invocation( xMgr ))
1050             {
1051                 fprintf( stderr, "> test_invocation() succeeded.\n" );
1052             }
1053         }
1054     }
1055     catch (Exception & rExc)
1056     {
1057         fprintf( stderr, "> exception occured: " );
1058         OString aMsg( OUStringToOString( rExc.Message, RTL_TEXTENCODING_ASCII_US ) );
1059         fprintf( stderr, "%s\n", aMsg.getStr() );
1060     }
1061 
1062     Reference< XComponent >( xMgr, UNO_QUERY )->dispose();
1063 
1064     return 0;
1065 }
1066