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 //================================================================================================== 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 //================================================================================================== 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 //================================================================================================== 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 //================================================================================================== 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: 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 210 virtual sal_Bool SAL_CALL getBool() throw(com::sun::star::uno::RuntimeException) 211 { return _aData.Bool; } 212 virtual sal_Int8 SAL_CALL getByte() throw(com::sun::star::uno::RuntimeException) 213 { return _aData.Byte; } 214 virtual sal_Unicode SAL_CALL getChar() throw(com::sun::star::uno::RuntimeException) 215 { return _aData.Char; } 216 virtual sal_Int16 SAL_CALL getShort() throw(com::sun::star::uno::RuntimeException) 217 { return _aData.Short; } 218 virtual sal_uInt16 SAL_CALL getUShort() throw(com::sun::star::uno::RuntimeException) 219 { return _aData.UShort; } 220 virtual sal_Int32 SAL_CALL getLong() throw(com::sun::star::uno::RuntimeException) 221 { return _aData.Long; } 222 virtual sal_uInt32 SAL_CALL getULong() throw(com::sun::star::uno::RuntimeException) 223 { return _aData.ULong; } 224 virtual sal_Int64 SAL_CALL getHyper() throw(com::sun::star::uno::RuntimeException) 225 { return _aData.Hyper; } 226 virtual sal_uInt64 SAL_CALL getUHyper() throw(com::sun::star::uno::RuntimeException) 227 { return _aData.UHyper; } 228 virtual float SAL_CALL getFloat() throw(com::sun::star::uno::RuntimeException) 229 { return _aData.Float; } 230 virtual double SAL_CALL getDouble() throw(com::sun::star::uno::RuntimeException) 231 { return _aData.Double; } 232 virtual test::TestEnum SAL_CALL getEnum() throw(com::sun::star::uno::RuntimeException) 233 { return _aData.Enum; } 234 virtual rtl::OUString SAL_CALL getString() throw(com::sun::star::uno::RuntimeException) 235 { return _aData.String; } 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; } 238 virtual com::sun::star::uno::Any SAL_CALL getAny() throw(com::sun::star::uno::RuntimeException) 239 { return _aData.Any; } 240 virtual com::sun::star::uno::Sequence< test::TestElement > SAL_CALL getSequence() throw(com::sun::star::uno::RuntimeException) 241 { return _aData.Sequence; } 242 virtual test::TestData SAL_CALL getStruct() throw(com::sun::star::uno::RuntimeException) 243 { return _aStructData; } 244 245 virtual void SAL_CALL setBool( sal_Bool _bool ) throw(::com::sun::star::uno::RuntimeException) 246 { _aData.Bool = _bool; } 247 virtual void SAL_CALL setByte( sal_Int8 _byte ) throw(::com::sun::star::uno::RuntimeException) 248 { _aData.Byte = _byte; } 249 virtual void SAL_CALL setChar( sal_Unicode _char ) throw(::com::sun::star::uno::RuntimeException) 250 { _aData.Char = _char; } 251 virtual void SAL_CALL setShort( sal_Int16 _short ) throw(::com::sun::star::uno::RuntimeException) 252 { _aData.Short = _short; } 253 virtual void SAL_CALL setUShort( sal_uInt16 _ushort ) throw(::com::sun::star::uno::RuntimeException) 254 { _aData.UShort = _ushort; } 255 virtual void SAL_CALL setLong( sal_Int32 _long ) throw(::com::sun::star::uno::RuntimeException) 256 { _aData.Long = _long; } 257 virtual void SAL_CALL setULong( sal_uInt32 _ulong ) throw(::com::sun::star::uno::RuntimeException) 258 { _aData.ULong = _ulong; } 259 virtual void SAL_CALL setHyper( sal_Int64 _hyper ) throw(::com::sun::star::uno::RuntimeException) 260 { _aData.Hyper = _hyper; } 261 virtual void SAL_CALL setUHyper( sal_uInt64 _uhyper ) throw(::com::sun::star::uno::RuntimeException) 262 { _aData.UHyper = _uhyper; } 263 virtual void SAL_CALL setFloat( float _float ) throw(::com::sun::star::uno::RuntimeException) 264 { _aData.Float = _float; } 265 virtual void SAL_CALL setDouble( double _double ) throw(::com::sun::star::uno::RuntimeException) 266 { _aData.Double = _double; } 267 virtual void SAL_CALL setEnum( test::TestEnum _enum ) throw(::com::sun::star::uno::RuntimeException) 268 { _aData.Enum = _enum; } 269 virtual void SAL_CALL setString( const ::rtl::OUString& _string ) throw(::com::sun::star::uno::RuntimeException) 270 { _aData.String = _string; } 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; } 273 virtual void SAL_CALL setAny( const ::com::sun::star::uno::Any& _any ) throw(::com::sun::star::uno::RuntimeException) 274 { _aData.Any = _any; } 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; } 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: 293 XLB_Invocation( const Reference< XMultiServiceFactory > & /*xMgr*/, 294 const Reference< XLanguageBindingTest > & xLBT ) 295 : _xLBT( xLBT ) 296 {} 297 298 // XInvocation 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //================================================================================================== 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //__________________________________________________________________________________________________ 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 //================================================================================================== 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 //================================================================================================== 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 //================================================================================================== 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 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