| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_extensions.hxx" |
| |
| #include <atlbase.h> |
| |
| CComModule _Module; |
| #include<atlcom.h> |
| #include <comdef.h> |
| |
| #include "axhost.hxx" |
| |
| #include <stdio.h> |
| #include "typelib/typedescription.hxx" |
| #include <com/sun/star/bridge/oleautomation/Date.hpp> |
| #include <com/sun/star/bridge/oleautomation/Currency.hpp> |
| #include <com/sun/star/bridge/oleautomation/Decimal.hpp> |
| #include <com/sun/star/bridge/oleautomation/SCode.hpp> |
| #include <com/sun/star/bridge/oleautomation/NamedArgument.hpp> |
| #include <com/sun/star/bridge/oleautomation/PropertyPutArgument.hpp> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/script/XInvocation.hpp> |
| //#include <oletest/XCallback.hpp> |
| #include <com/sun/star/uno/Reference.h> |
| #include <cppuhelper/servicefactory.hxx> |
| #include <rtl/string.h> |
| |
| #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) |
| BEGIN_OBJECT_MAP(ObjectMap) |
| END_OBJECT_MAP() |
| |
| using namespace com::sun::star::lang; |
| using namespace com::sun::star::uno; |
| using namespace com::sun::star::script; |
| using namespace com::sun::star::bridge::oleautomation; |
| using namespace cppu; |
| using namespace rtl; |
| |
| |
| |
| Reference<XInvocation> convertComObject( IUnknown* pUnk); |
| Reference<XInvocation> getComObject( OUString progId); |
| bool checkOutArgs(const Sequence<Any> & outArgs, |
| const Sequence<sal_Int16> & indices, const Sequence<Any> & values); |
| |
| bool doSimpleTest(const Reference<XInvocation> & inv); |
| bool doSimpleSequenceTest(const Reference<XInvocation> & inv); |
| bool doParameterTest(const Reference<XInvocation> & inv); |
| bool doPropertyWithArgumentTest(const Reference<XInvocation> & inv); |
| bool equalSequences(const Any& orig, const Any& returned); |
| HRESULT doTest(); |
| HRESULT doTest2( Reference<XInvocation> &); |
| Reference<XInvocation> getComObject(OUString& ); |
| |
| HRESULT InitializeParameter(); |
| void printResultVariantArray( VARIANT & var); |
| void printVariant( VARIANT & var); |
| void printSequence( Sequence<Any>& val); |
| |
| extern "C" int __cdecl main( int , char **) |
| { |
| HRESULT hr; |
| if( FAILED( hr=CoInitialize(NULL))) |
| { |
| _tprintf(_T("CoInitialize failed \n")); |
| return -1; |
| } |
| |
| |
| _Module.Init( ObjectMap, GetModuleHandle( NULL)); |
| |
| if( FAILED(hr=doTest())) |
| { |
| _com_error err( hr); |
| const TCHAR * errMsg= err.ErrorMessage(); |
| MessageBox( NULL, errMsg, "Test failed", MB_ICONERROR); |
| } |
| else |
| { |
| MessageBox( NULL,NULL , "Test succeeded", MB_ICONINFORMATION); |
| } |
| |
| |
| _Module.Term(); |
| CoUninitialize(); |
| return 0; |
| } |
| //Also supports named args |
| |
| bool doParameterTest(const Reference<XInvocation> & inv) |
| { |
| Sequence< sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| |
| Any arArgs[2]; |
| Any arValue[2]; |
| Any arArgs1[4]; |
| |
| NamedArgument arg1(OUString(L"val1"), makeAny((sal_Int32) 123)); |
| NamedArgument arg2(OUString(L"val2"), makeAny((sal_Int32) 456)); |
| NamedArgument arg3(OUString(L"val3"), makeAny((sal_Int32) 0xff)); |
| NamedArgument arg4(OUString(L"val4"), makeAny((sal_Int32) 0xffff)); |
| |
| NamedArgument argOut1(OUString(L"val1"), Any()); |
| NamedArgument argOut2(OUString(L"val2"), Any()); |
| Sequence<Any> seqNoArgs; |
| arArgs[0] <<= (sal_Int32) 0; |
| arArgs[1] <<= (sal_Int32) 0; |
| Sequence<Any> seqPositional0(arArgs, 2); |
| |
| |
| arArgs[0] <<= arg1; |
| arArgs[1] <<= arg2; |
| Sequence<Any> seqNamed(arArgs, 2); |
| arArgs[0] <<= arg2; |
| arArgs[1] <<= arg1; |
| Sequence<Any> seqNamed2(arArgs, 2); |
| arArgs[0] <<= argOut1; |
| arArgs[1] <<= argOut2; |
| Sequence<Any> seqNamed3(arArgs, 2); |
| arArgs[0] <<= argOut2; |
| arArgs[1] <<= argOut1; |
| Sequence<Any> seqNamed4(arArgs, 2); |
| |
| arArgs[0] <<= arg1; |
| Sequence<Any> seqNamed5(arArgs, 1); |
| arArgs[0] <<= arg2; |
| Sequence<Any> seqNamed6(arArgs, 1); |
| |
| arArgs[0] <<= (sal_Int32) 123; |
| arArgs[1] <<= (sal_Int32) 456; |
| Sequence<Any> seqPositional(arArgs, 2); |
| arArgs[0] <<= (sal_Int32) 123; |
| Sequence<Any> seqPositional2(arArgs, 1); |
| |
| arArgs[0] <<= Any(); |
| arArgs[1] <<= Any(); |
| Sequence<Any> seqPositional3(arArgs, 2); |
| |
| arArgs[0] <<= (sal_Int32) 123; |
| arArgs[1] <<= SCode(DISP_E_PARAMNOTFOUND); |
| Sequence<Any> seqOutOpt1(arArgs, 2); |
| |
| arArgs[0] <<= SCode(DISP_E_PARAMNOTFOUND); |
| arArgs[1] <<= SCode(DISP_E_PARAMNOTFOUND); |
| Sequence<Any> seqOutOpt2(arArgs, 2); |
| |
| arArgs[0] <<= SCode(DISP_E_PARAMNOTFOUND); |
| arArgs[1] <<= (sal_Int32) 456; |
| Sequence<Any> seqOutOpt3(arArgs, 2); |
| |
| arArgs1[0] <<= (sal_Int32) 0; |
| arArgs1[1] <<= (sal_Int32) 0; |
| arArgs1[2] <<= (sal_Int32) 0; |
| arArgs1[3] <<= (sal_Int32) 0; |
| Sequence<Any> seqMix0(arArgs1, 4); |
| |
| arArgs1[0] <<= (sal_Int32) 123; |
| arArgs1[1] <<= (sal_Int32) 456; |
| arArgs1[2] <<= arg3; |
| arArgs1[3] <<= arg4; |
| Sequence<Any> seqMix(arArgs1, 4); |
| |
| arArgs1[0] <<= Any(); |
| arArgs1[1] <<= (sal_Int32) 456; |
| arArgs1[2] <<= arg4; |
| Sequence<Any> seqMix2(arArgs1, 3); |
| |
| arArgs1[0] <<= SCode(DISP_E_PARAMNOTFOUND); |
| arArgs1[1] <<= (sal_Int32) 456; |
| arArgs1[2] <<= SCode(DISP_E_PARAMNOTFOUND); |
| arArgs1[3] <<= arg4.Value; |
| Sequence<Any> seqMixOut(arArgs1, 4); |
| |
| arArgs1[0] <<= SCode(DISP_E_PARAMNOTFOUND); |
| arArgs1[1] <<= Any(); |
| arArgs1[2] <<= arg4; |
| Sequence<Any> seqMix2Out(arArgs1, 3); |
| |
| |
| |
| //in args + out, optional, positional----------------------------------------- |
| //first general test |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqPositional)) |
| return false; |
| |
| //2 optional args, 1 provided |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional2, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt1)) |
| return false; |
| |
| //2 optional args, 0 provided |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNoArgs, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional3, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt2)) |
| return false; |
| |
| //named args -------------------------------------------- |
| |
| // 2 named args, correct position |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional0, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqPositional)) |
| return false; |
| |
| // 2named args, position differs |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed2, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqPositional)) |
| return false; |
| |
| //named out args, 2 named args with correct position |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqIndices.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqNamed3, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqNamed )) |
| return false; |
| |
| //named out args, 2 named args with different position |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqIndices.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqNamed4, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqNamed2 )) |
| return false; |
| |
| |
| //2 args, 1 provided (correct order) |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed5, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt1)) |
| return false; |
| //2 args, 1 provided (incorrect order) |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional3"), seqNamed6, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt3)) |
| return false; |
| |
| //2position + 2 2named args, correct order |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional6"), seqMix0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional6"), seqMix, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional7"), seqMix, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqMix)) |
| return false; |
| |
| // 4 in args, 1 positional, 1 named, 1 positional omitted |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional6"), seqMix0, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional6"), seqMix2, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional7"), seqMix0, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqMixOut)) |
| return false; |
| |
| // 4 out args, 1 positional, 1 named, 1 positional omitted |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional6"), seqMix2, seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"optional7"), seqMix2Out, seqIndices, seqOut); |
| if ( ! checkOutArgs(seqOut, seqIndices, seqMix2Out)) |
| return false; |
| |
| |
| return true; |
| } |
| bool doPropertyTest(const Reference<XInvocation> & inv) |
| { |
| Sequence< sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| |
| Any inBool, outBool; |
| Any inByte, outByte; |
| Any inShort, outShort; |
| Any inLong, outLong; |
| Any inString, outString; |
| Any inFloat, outFloat; |
| Any inDouble, outDouble; |
| Any inVariant, outVariant; |
| Any inObject, outObject; |
| Any inUnknown, outUnknown; |
| Any inCY, outCY; |
| Any inDate, outDate; |
| Any inDecimal, outDecimal; |
| Any inSCode, outSCode; |
| Any inrefLong, outrefLong; |
| Any inrefVariant, outrefVariant; |
| Any inrefDecimal, outrefDecimal; |
| Any inParamsLong, outParamsLong; |
| Reference<XInterface> xintUnknown(getComObject(L"AxTestComponents.Foo")); |
| |
| inBool <<= (sal_Bool) sal_True; |
| inv->setValue(OUString(L"prpBool"), inBool); |
| outBool = inv->getValue(OUString(L"prpBool")); |
| |
| inByte <<= (sal_Int8) 100; |
| inv->setValue(OUString(L"prpByte"), inByte); |
| outByte = inv->getValue(OUString(L"prpByte")); |
| |
| inShort <<= static_cast<sal_Int16>( -1); |
| inv->setValue(OUString(L"prpShort"), inShort); |
| outShort = inv->getValue(OUString(L"prpShort")); |
| |
| inLong <<= ( sal_Int32) 1234567; |
| inv->setValue(OUString(L"prpLong"), inLong // TODO: Add your implementation code here |
| ); |
| outLong = inv->getValue(OUString(L"prpLong")); |
| |
| inString <<= OUString(L" this is clientTest.exe"); |
| inv->setValue(OUString(L"prpString"), inString); |
| outString = inv->getValue(OUString(L"prpString")); |
| |
| inFloat <<= 3.14f; |
| inv->setValue(OUString(L"prpFloat"), inFloat); |
| outFloat = inv->getValue(OUString(L"prpFloat")); |
| |
| inDouble <<= ( double) 3.145; |
| inv->setValue(OUString(L"prpDouble"), inDouble); |
| outDouble = inv->getValue(OUString(L"prpDouble")); |
| |
| inVariant <<= OUString(L"A string in an any"); |
| inv->setValue(OUString(L"prpVariant"), inVariant); |
| outVariant = inv->getValue(OUString(L"prpVariant")); |
| |
| inObject <<= inv; |
| inv->setValue(OUString(L"prpObject"), inObject); |
| outObject = inv->getValue(OUString(L"prpObject")); |
| |
| inUnknown <<= xintUnknown; |
| inv->setValue(OUString(L"prpUnknown"), inUnknown); |
| outUnknown = inv->getValue(OUString(L"prpUnknown")); |
| |
| Currency cur(99999); |
| inCY <<= cur; |
| inv->setValue(OUString(L"prpCurrency"), inCY); |
| outCY = inv->getValue(OUString(L"prpCurrency")); |
| |
| Date d(37889.0); |
| inDate <<= d; |
| inv->setValue(OUString(L"prpDate"), inDate); |
| outDate = inv->getValue(OUString(L"prpDate")); |
| |
| Decimal dec(20, 0, 0xffffffff, 0xffffffff, 0x0fffffff); |
| inDecimal <<= dec; |
| inv->setValue(OUString(L"prpDecimal"), inDecimal); |
| outDecimal = inv->getValue(OUString(L"prpDecimal")); |
| |
| SCode code(DISP_E_BADVARTYPE); |
| inSCode <<= code; |
| inv->setValue(OUString(L"prpSCode"), inSCode); |
| outSCode = inv->getValue(OUString(L"prpSCode")); |
| |
| inrefLong <<= (sal_Int32) 123456; |
| inv->setValue(OUString(L"prprefLong"), inrefLong); |
| outrefLong = inv->getValue(OUString(L"prprefLong")); |
| |
| inrefVariant <<= OUString(L"A string in an any"); |
| inv->setValue(OUString(L"prprefVariant"), inrefVariant); |
| outrefVariant = inv->getValue(OUString(L"prprefVariant")); |
| |
| Decimal decref(20, 0, 0xffffffff, 0xffffffff, 0x0fffffff); |
| inrefDecimal <<= decref; |
| inv->setValue(OUString(L"prprefDecimal"), inrefDecimal); |
| outrefDecimal = inv->getValue(OUString(L"prprefDecimal")); |
| |
| if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong |
| || inFloat != outFloat || inDouble != outDouble || inString != outString |
| || inVariant != outVariant || inObject != outObject |
| || inUnknown != outUnknown || inCY != outCY |
| || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode |
| || inrefLong != outrefLong ||inrefVariant != outrefVariant |
| || inrefDecimal != outrefDecimal) |
| return false; |
| return true; |
| } |
| |
| bool doPropertyWithArgumentTest(const Reference<XInvocation> & inv) |
| { |
| Sequence< sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| |
| Any arMultiArgs[3]; |
| arMultiArgs[0] <<= makeAny((sal_Int32) 0); |
| arMultiArgs[1] <<= makeAny((sal_Int32) 0); |
| arMultiArgs[2] <<= PropertyPutArgument(makeAny((sal_Int32) 0)); |
| Sequence<Any> seqMultiArgPut0(arMultiArgs, 3); |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 1); |
| arMultiArgs[1] <<= makeAny((sal_Int32) 2); |
| arMultiArgs[2] <<= PropertyPutArgument(makeAny((sal_Int32) 3)); |
| Sequence<Any> seqMultiArgPut1(arMultiArgs, 3); |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 1); |
| arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 3)); |
| Sequence<Any> seqMultiArgPut2(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= NamedArgument(OUString(L"val2"), makeAny((sal_Int32) 1)); |
| arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 3)); |
| Sequence<Any> seqMultiArgPut3(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= NamedArgument(OUString(L"val2"), makeAny((sal_Int32) 1)); |
| arMultiArgs[1] <<= NamedArgument(OUString(L"val3"), makeAny((sal_Int32) 3)); |
| Sequence<Any> seqMultiArgPut4(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 0); |
| arMultiArgs[1] <<= makeAny((sal_Int32) 0); |
| Sequence<Any> seqMultiArgGet0(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 1); |
| arMultiArgs[1] <<= makeAny((sal_Int32) 2); |
| Sequence<Any> seqMultiArgGet1(arMultiArgs, 2); |
| Sequence<Any> seqMultiArgGet2(arMultiArgs, 1); |
| |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 0); |
| arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 0)); |
| Sequence<Any> seqMultiArgPut5(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= makeAny((sal_Int32) 1); |
| arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 2)); |
| Sequence<Any> seqMultiArgPut6(arMultiArgs, 2); |
| |
| arMultiArgs[0] <<= Any(); |
| arMultiArgs[1] <<= Any(); |
| Sequence<Any> seqMultiVoid(arMultiArgs, 2); |
| |
| arMultiArgs[0] = makeAny((sal_Int32) 0); |
| arMultiArgs[1] = makeAny((sal_Int32) 0); |
| Sequence<Any> seqMultiVoid2(arMultiArgs, 2); |
| |
| //[propput, ...] HRESULT prpMultiArg1([in,out,optional] VARIANT* val1, [in,out,optional] VARIANT* val2, [in] VARIANT* newVal); |
| //[propget, ...] HRESULT prpMultiArg1([in,out,optional] VARIANT* val1, [in,out,optional] VARIANT* val2, [out, optional, retval] VARIANT* pVal); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut1, seqIndices, seqOut); |
| //check in/out args |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| Any anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0, |
| seqIndices, seqOut); |
| |
| if (anyRet != ((PropertyPutArgument const *)seqMultiArgPut1[2].getValue())->Value |
| || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(seqMultiArgPut1.getArray(), 2))) |
| { |
| return false; |
| } |
| // test optional (one arg omitted |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut2, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0, |
| seqIndices, seqOut); |
| |
| arMultiArgs[0] = makeAny((sal_Int32) 1); |
| arMultiArgs[1] = makeAny((SCode(DISP_E_PARAMNOTFOUND))); |
| |
| if (anyRet != ((PropertyPutArgument const *) seqMultiArgPut2[1].getValue())->Value |
| || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(arMultiArgs, 2))) |
| { |
| return false; |
| } |
| |
| //test one named arg and one omitted |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut3, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0, |
| seqIndices, seqOut); |
| |
| arMultiArgs[0] = makeAny((SCode(DISP_E_PARAMNOTFOUND))); |
| arMultiArgs[1] = ((NamedArgument const*) seqMultiArgPut3[0].getValue())->Value; |
| if (anyRet != ((PropertyPutArgument const*) seqMultiArgPut3[1].getValue())->Value |
| || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(arMultiArgs, 2))) |
| { |
| return false; |
| } |
| |
| // [propget,...] HRESULT prpMultiArg2([in] VARIANT val1, [out, retval] VARIANT* pVal); |
| // [propput,...] HRESULT prpMultiArg2([in] VARIANT val1, [in] VARIANT newVal); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg2"), seqMultiArgPut5, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg2GetValues"), seqMultiVoid, seqIndices, seqOut); |
| |
| if ( ! checkOutArgs(seqOut, seqIndices, seqMultiVoid2)) |
| return false; |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| anyRet = inv->invoke(OUString(L"prpMultiArg2"), seqMultiArgPut6, |
| seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| anyRet = inv->invoke(OUString(L"prpMultiArg2GetValues"), seqMultiVoid, |
| seqIndices, seqOut); |
| |
| // [propget,...] HRESULT prpMultiArg3([in,out] LONG* val1, [out, retval] LONG* pVal); |
| // [propput,...] HRESULT prpMultiArg3([in,out] LONG* val1, [in] LONG newVal); |
| |
| if ( ! checkOutArgs(seqOut, seqIndices, seqMultiArgGet1 )) |
| return false; |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgPut5, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgPut6, seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| anyRet = inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgGet2, seqIndices, seqOut); |
| |
| if ( anyRet != ((PropertyPutArgument const*) seqMultiArgPut6[1].getValue())->Value |
| || !checkOutArgs(seqOut, seqIndices, seqMultiArgGet2)) |
| return false; |
| |
| |
| //hasProperty, hasMethod |
| if (inv->hasProperty(OUSTR("prpMultiArg1"))) |
| return false; |
| if ( ! inv->hasMethod(OUSTR("prpMultiArg1"))) |
| return false; |
| if ( ! inv->hasProperty(OUSTR("prprefLong"))) |
| return false; |
| if (inv->hasMethod(OUSTR("prprefLong"))) |
| return false; |
| if ( ! inv->hasMethod(OUSTR("inLong"))) |
| return false; |
| |
| return true; |
| } |
| bool doSimpleTest(const Reference<XInvocation> & inv) |
| { |
| Sequence< sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| |
| Any inBool, outBool; |
| Any inByte, outByte; |
| Any inShort, outShort; |
| Any inLong, outLong; |
| Any inString, outString; |
| Any inFloat, outFloat; |
| Any inDouble, outDouble; |
| Any inVariant, outVariant; |
| Any inObject, outObject; |
| Any inUnknown, outUnknown; |
| Any inCY, outCY; |
| Any inDate, outDate; |
| Any inDecimal, outDecimal; |
| Any inSCode, outSCode; |
| Any inrefLong, outrefLong; |
| Any inrefVariant, outrefVariant; |
| Any inrefDecimal, outrefDecimal; |
| |
| Reference<XInterface> xIntFoo(getComObject(L"AxTestComponents.Foo")); |
| //################################################################################### |
| // in and out parameter |
| //################################################################################### |
| sal_Bool aBool = sal_True; |
| inBool.setValue(&aBool, getCppuBooleanType()); |
| inv->invoke(OUString(L"inBool"), Sequence< Any > ( &inBool, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outBool"), Sequence< Any > ( & outBool, 1), seqIndices, seqOut); |
| outBool <<= seqOut[0]; |
| |
| inByte <<= (sal_Int8) 127; |
| inv->invoke(OUString(L"inByte"), Sequence< Any > ( & inByte, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outByte"), Sequence< Any > ( & outByte, 1), seqIndices, seqOut); |
| outByte <<= seqOut[0]; |
| |
| inShort <<= static_cast<sal_Int16>(-1); |
| inv->invoke(OUString(L"inShort"), Sequence< Any > ( & inShort, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outShort"), Sequence< Any > ( & outShort, 1), seqIndices, seqOut); |
| outShort <<= seqOut[0]; |
| |
| inLong <<= ( sal_Int32) 1234567; |
| inv->invoke(OUString(L"inLong"), Sequence< Any > ( & inLong, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outLong"), Sequence< Any > ( & outLong, 1 ), seqIndices, seqOut); |
| outLong <<= seqOut[0]; |
| |
| inString <<= OUString(L" this is clientTest.exe"); |
| inv->invoke(OUString(L"inString"), Sequence< Any > ( & inString, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outString"), Sequence< Any > ( & outString, 1 ), seqIndices, seqOut); |
| outString <<= seqOut[0]; |
| |
| inFloat <<= 3.14f; |
| inv->invoke(OUString(L"inFloat"), Sequence< Any > ( & inFloat, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outFloat"), Sequence< Any > ( & outFloat, 1 ), seqIndices, seqOut); |
| outFloat <<= seqOut[0]; |
| |
| inDouble <<= ( double) 3.145; |
| inv->invoke(OUString(L"inDouble"), Sequence< Any > ( & inDouble, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outDouble"), Sequence< Any > ( & outDouble, 1 ), seqIndices, seqOut); |
| outDouble <<= seqOut[0]; |
| |
| inVariant <<= OUString(L" A string in an any"); |
| inv->invoke(OUString(L"inVariant"), Sequence< Any > ( & inVariant, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outVariant"), Sequence< Any > (&outVariant, 1), seqIndices, seqOut); |
| outVariant <<= seqOut[0]; |
| |
| inObject <<= inv; |
| inv->invoke(OUString(L"inObject"), Sequence< Any > ( & inObject, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outObject"), Sequence< Any > (& outObject, 1), seqIndices, seqOut); |
| outObject <<= seqOut[0]; |
| |
| inUnknown <<= xIntFoo; |
| inv->invoke(OUString(L"inUnknown"), Sequence< Any > ( & inUnknown, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outUnknown"), Sequence< Any > (& outUnknown, 1), seqIndices, seqOut); |
| outUnknown <<= seqOut[0]; |
| |
| Currency cur(999999); |
| inCY <<= cur; |
| inv->invoke(OUString(L"inCurrency"), Sequence<Any>( & inCY, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outCurrency"), Sequence< Any > (& outCY, 1), seqIndices, seqOut); |
| outCY <<= seqOut[0]; |
| |
| Date dDate(37889.0); |
| inDate <<= dDate; |
| inv->invoke(OUString(L"inDate"), Sequence<Any>( & inDate, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outDate"), Sequence< Any > (& outDate, 1), seqIndices, seqOut); |
| outDate <<= seqOut[0]; |
| |
| Decimal dec(3, 0, 0xffffffff, 0xffffffff, 0xfffffff0); |
| inDecimal <<= dec; |
| inv->invoke(OUString(L"inDecimal"), Sequence<Any>( & inDecimal, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outDecimal"), Sequence< Any > (& outDecimal, 1), seqIndices, seqOut); |
| outDecimal <<= seqOut[0]; |
| |
| SCode code(DISP_E_BADVARTYPE); |
| inSCode <<= code; |
| inv->invoke(OUString(L"inSCode"), Sequence<Any>( & inSCode, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSCode"), Sequence< Any > (& outSCode, 1), seqIndices, seqOut); |
| outSCode <<= seqOut[0]; |
| |
| if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong |
| || inFloat != outFloat || inDouble != outDouble || inString != outString |
| || inVariant != outVariant || inObject != outObject || inUnknown != outUnknown |
| || inCY != outCY |
| || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode) |
| return false; |
| //################################################################################### |
| // in/out parameter |
| //################################################################################### |
| outBool = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutBool"), Sequence< Any > ( & inBool, 1), seqIndices, seqOut); |
| outBool <<= seqOut[0]; |
| |
| outByte = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutByte"), Sequence< Any > ( & inByte, 1), seqIndices, seqOut); |
| outByte <<= seqOut[0]; |
| |
| outShort = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutShort"), Sequence< Any > ( & inShort, 1), seqIndices, seqOut); |
| outShort <<= seqOut[0]; |
| |
| outLong = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutLong"), Sequence< Any > ( & inLong, 1), seqIndices, seqOut); |
| outLong <<= seqOut[0]; |
| |
| outString = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutString"), Sequence< Any > ( & inString, 1), seqIndices, seqOut); |
| outString <<= seqOut[0]; |
| |
| outFloat = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutFloat"), Sequence< Any > ( & inFloat, 1), seqIndices, seqOut); |
| outFloat <<= seqOut[0]; |
| |
| outDouble = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutDouble"), Sequence< Any > ( &inDouble, 1), seqIndices, seqOut); |
| outDouble <<= seqOut[0]; |
| |
| outVariant = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutVariant"), Sequence< Any > ( & inVariant, 1), seqIndices, seqOut); |
| outVariant <<= seqOut[0]; |
| |
| outObject = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutObject"), Sequence< Any > ( & inObject, 1), seqIndices, seqOut); |
| outObject <<= seqOut[0]; |
| |
| outCY = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutCurrency"), Sequence< Any > ( & inCY, 1), seqIndices, seqOut); |
| outCY <<= seqOut[0]; |
| |
| outDate = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutDate"), Sequence< Any > ( & inDate, 1), seqIndices, seqOut); |
| outDate <<= seqOut[0]; |
| |
| outDecimal = Any(); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutDecimal"), Sequence< Any > (& inDecimal, 1), seqIndices, seqOut); |
| outDecimal <<= seqOut[0]; |
| |
| outSCode = Any(); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutSCode"), Sequence< Any > (& inSCode, 1), seqIndices, seqOut); |
| outSCode <<= seqOut[0]; |
| |
| if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong |
| || inFloat != outFloat || inDouble != outDouble || inString != outString |
| || inVariant != outVariant || inObject != outObject || inCY != outCY |
| || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode) |
| return false; |
| |
| //################################################################################### |
| // in byref parameters |
| //################################################################################### |
| |
| inrefLong <<= (sal_Int32) 1234; |
| inv->invoke(OUString(L"inrefLong"), Sequence<Any>( & inrefLong, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outLong"), Sequence< Any > (& outrefLong, 1), seqIndices, seqOut); |
| outrefLong <<= seqOut[0]; |
| |
| inrefVariant <<= OUString(L" A string in an any"); |
| inv->invoke(OUString(L"inrefVariant"), Sequence< Any > ( & inrefVariant, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outVariant"), Sequence< Any > (&outrefVariant, 1), seqIndices, seqOut); |
| outrefVariant <<= seqOut[0]; |
| |
| Decimal refdec(5, 1, 0xffff, 0xff, 0x1); |
| inrefDecimal <<= refdec; |
| inv->invoke(OUString(L"inrefDecimal"), Sequence< Any > ( & inrefDecimal, 1), seqIndices, seqOut); |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outDecimal"), Sequence< Any > (&outrefDecimal, 1), seqIndices, seqOut); |
| outrefDecimal <<= seqOut[0]; |
| |
| if (inrefLong != outrefLong || inrefVariant != outrefVariant |
| || inrefDecimal != outrefDecimal) |
| return false; |
| |
| |
| //################################################################################### |
| // mixed parameter |
| //################################################################################### |
| // mixed1 |
| seqIndices.realloc( 0); |
| seqOut.realloc(0); |
| Any param[3]; |
| param[0] = inByte; |
| param[1] = inFloat; |
| param[2] = inVariant; |
| inv->invoke(OUString(L"mixed1"), Sequence< Any >(param, 3), seqIndices, seqOut); |
| |
| if (seqOut.getLength() != 3 || inByte != seqOut[0] || inFloat != seqOut[1] |
| || inVariant != seqOut[2]) |
| return false; |
| return true; |
| } |
| |
| bool doSimpleSequenceTest(const Reference<XInvocation> & inv) |
| { |
| bool ret = true; |
| Sequence<sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| Any voidAny; |
| Any inArAny; |
| Any outArray; |
| Any inArBool, outArBool; |
| Any inArByte, outArByte; |
| Any inArShort, outArShort; |
| Any inArLong, outArLong; |
| Any inArString, outArString; |
| Any inArFloat, outArFloat; |
| Any inArDouble, outArDouble; |
| Any inArObject, outArObject; |
| Any outVariant; |
| |
| //Initialize arrays |
| OUString arStr[]= {L"string0", L"string1", L"string2"}; |
| Sequence<OUString> seq( arStr, 3); |
| inArString <<= seq; |
| |
| Any arAnyStrTmp[3]; |
| arAnyStrTmp[0]<<= arStr[0]; |
| arAnyStrTmp[1]<<= arStr[1]; |
| arAnyStrTmp[2]<<= arStr[2]; |
| Sequence<Any> seq_1( arAnyStrTmp, 3); |
| inArAny <<= seq_1; |
| //################################################################################### |
| // in, out Sequences |
| //################################################################################### |
| //Test sequence containing Anys of Strings |
| inv->invoke(OUString(L"inArray"), Sequence< Any > ( & inArAny, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outArray"), Sequence<Any>( & voidAny, 1), seqIndices, seqOut); |
| if (inArAny != seqOut[0]) |
| return false; |
| |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"outArray"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArray <<= seqOut[0]; |
| |
| sal_Int8 arByte[]={1,2,3}; |
| Sequence<sal_Int8> seqByte(arByte, 3); |
| inArByte <<= seqByte; |
| inv->invoke(OUString(L"inSequenceByte"),Sequence<Any>( & inArByte, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceByte"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArByte <<= seqOut[0]; |
| |
| sal_Int16 arShort[]={4,5,6}; |
| Sequence<sal_Int16> seqShort(arShort, 3); |
| inArShort<<= seqShort; |
| inv->invoke(OUString(L"inSequenceShort"),Sequence< Any >( & inArShort, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceShort"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArShort <<= seqOut[0]; |
| |
| sal_Int32 arLong[] = {7,8,9}; |
| Sequence<sal_Int32> seqLong(arLong, 3); |
| inArLong <<= seqLong; |
| inv->invoke(OUString(L"inSequenceLong"),Sequence< Any > ( & inArLong, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceLong"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArLong <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inSequenceLong"),Sequence< Any > ( & inArLong, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceLong"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArLong <<= seqOut[0]; |
| |
| inv->invoke( OUString(L"inSequenceString"),Sequence< Any > ( & inArString, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceString"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArString <<= seqOut[0]; |
| |
| float arFloat[]={3.14f, 31.4f, 314.f}; |
| Sequence<float> seqFloat( arFloat, 3); |
| inArFloat <<= seqFloat; |
| inv->invoke( OUString(L"inSequenceFloat"),Sequence< Any > ( & inArFloat, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceFloat"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArFloat <<= seqOut[0]; |
| |
| double arDouble[]={3.145, 31.45, 3145.}; |
| Sequence<double> seqDouble( arDouble, 3); |
| inArDouble <<= seqDouble; |
| inv->invoke(OUString(L"inSequenceDouble"),Sequence< Any >( & inArDouble, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceDouble"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArDouble <<= seqOut[0]; |
| |
| Sequence<Reference<XInvocation> > seqObj(2); |
| seqObj[0]= getComObject(L"AxTestComponents.Basic"); |
| seqObj[1]= getComObject(L"AxTestComponents.Basic"); |
| inArObject <<= seqObj; |
| inv->invoke(OUString(L"inSequenceObject"),Sequence< Any >( & inArObject, 1), seqIndices, seqOut); |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"outSequenceObject"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut); |
| outArObject <<= seqOut[0]; |
| |
| if ( ! equalSequences(inArByte, outArByte) || ! equalSequences(inArShort, outArShort) |
| || ! equalSequences(inArLong, outArLong) || ! equalSequences(inArString, outArray) |
| || ! equalSequences(inArFloat, outArFloat) || ! equalSequences(inArDouble, outArDouble) |
| || ! equalSequences(inArString, outArString) || ! equalSequences(inArObject, outArObject)) |
| return false; |
| |
| //################################################################################### |
| // in/out Sequences |
| //################################################################################### |
| seqIndices.realloc(0); |
| seqOut.realloc(0); |
| inv->invoke(OUString(L"inoutArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut); |
| outArray <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceByte"), Sequence<Any>( & inArByte, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceByte"), Sequence<Any>( & inArByte, 1), seqIndices, seqOut); |
| outArByte <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceShort"), Sequence<Any>( & inArShort, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceShort"), Sequence<Any>( & inArShort, 1), seqIndices, seqOut); |
| outArShort <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceLong"), Sequence<Any>( & inArLong, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceLong"), Sequence< Any >( & inArLong, 1), seqIndices, seqOut); |
| outArLong <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceString"), Sequence<Any>( & inArString, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceString"), Sequence<Any>( & inArString, 1), seqIndices, seqOut); |
| outArString <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceFloat"), Sequence<Any>( & inArFloat, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceFloat"), Sequence<Any>( & inArFloat, 1), seqIndices, seqOut); |
| outArFloat <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceDouble"), Sequence<Any>( & inArDouble, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceDouble"), Sequence<Any>( & inArDouble, 1), seqIndices, seqOut); |
| outArDouble <<= seqOut[0]; |
| |
| inv->invoke(OUString(L"inoutSequenceObject"), Sequence<Any>( & inArObject, 1), seqIndices, seqOut); |
| inv->invoke(OUString(L"inoutSequenceObject"), Sequence<Any>( & inArObject, 1), seqIndices, seqOut); |
| outArObject <<= seqOut[0]; |
| |
| if ( ! equalSequences(inArByte, outArByte) || ! equalSequences(inArShort, outArShort) |
| || ! equalSequences(inArLong, outArLong) || ! equalSequences(inArString, outArray) |
| || ! equalSequences(inArFloat, outArFloat) || ! equalSequences(inArDouble, outArDouble) |
| || ! equalSequences(inArString, outArString) || ! equalSequences(inArObject, outArObject)) |
| return false; |
| |
| return ret; |
| } |
| |
| HRESULT doTest() |
| { |
| HRESULT hr= S_OK; |
| USES_CONVERSION; |
| Reference<XInvocation> inv= getComObject( L"AxTestComponents.Basic"); |
| |
| HostWin* pWin= new HostWin( L"MFCCONTROL.MfcControlCtrl.1"); |
| CComPtr<IUnknown> spUnk= pWin->GetHostedControl(); |
| Reference<XInvocation> invMfc= convertComObject( spUnk.p); |
| |
| Sequence< sal_Int16> seqIndices; |
| Sequence<Any> seqOut; |
| |
| Any aAny; |
| Any anyOut; |
| char buff[1024]; |
| Any seqAny; |
| |
| if (! doSimpleTest(inv)) |
| { |
| fprintf(stdout, "### Test failed!\n"); |
| return E_FAIL; |
| } |
| |
| if (! doPropertyTest(inv)) |
| { |
| fprintf(stdout, "### Test failed!\n"); |
| return E_FAIL; |
| } |
| |
| if ( ! doSimpleSequenceTest(inv)) |
| { |
| fprintf(stdout, "### Test failed! \n"); |
| return E_FAIL; |
| } |
| |
| if ( ! doParameterTest(inv)) |
| { |
| fprintf(stdout, "### Test failed! \n"); |
| return E_FAIL; |
| } |
| |
| if ( ! doPropertyWithArgumentTest(inv)) |
| { |
| fprintf(stdout, "### Test failed! \n"); |
| return E_FAIL; |
| } |
| |
| |
| |
| |
| |
| // |
| // //################################################################################### |
| // // in multi Sequences |
| // //################################################################################### |
| // // inMulDimArrayLong |
| sal_Int32 arLongi[]={1,2,3}; |
| sal_Int32 arLongi2[]={4,5,6,7}; |
| sal_Int32 arLongi3[]={8,9,10,11,12}; |
| |
| Sequence<sal_Int32> seqLongi1( arLongi, 3); |
| Sequence<sal_Int32> seqLongi2( arLongi2, 4); |
| Sequence<sal_Int32> seqLongi3( arLongi3, 5); |
| |
| Sequence< Sequence< sal_Int32 > > seq2i(3); |
| seq2i[0]= seqLongi1; |
| seq2i[1]= seqLongi2; |
| seq2i[2]= seqLongi3; |
| seqAny<<= seq2i; |
| // dimension length 3,5 |
| inv->invoke( OUString(L"inMulDimArrayLong"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut); |
| // |
| //inMulDimArrayVariant |
| inv->invoke( OUString(L"inMulDimArrayVariant"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut); |
| |
| //inMulDimArrayLong2 |
| sal_Int32 arLongii1[]={1,2,3}; |
| sal_Int32 arLongii2[]={4,5,6,7}; |
| sal_Int32 arLongii3[]={8,9,10,11,12}; |
| sal_Int32 arLongii4[]={13,14,15,16}; |
| sal_Int32 arLongii5[]={17,18,19}; |
| |
| Sequence<sal_Int32> seqLongii1( arLongii1, 3); |
| Sequence<sal_Int32> seqLongii2( arLongii2, 4); |
| Sequence<sal_Int32> seqLongii3( arLongii3, 5); |
| Sequence<sal_Int32> seqLongii4( arLongii4, 4); |
| Sequence<sal_Int32> seqLongii5( arLongii5, 3); |
| |
| Sequence< Sequence< sal_Int32 > > seq2ii(3); |
| Sequence< Sequence< sal_Int32> > seq2ii2(2); |
| seq2ii[0]= seqLongii1; |
| seq2ii[1]= seqLongii2; |
| seq2ii[2]= seqLongii3; |
| |
| seq2ii2[0]= seqLongii4; |
| seq2ii2[1]= seqLongii5; |
| |
| Sequence< Sequence< Sequence< sal_Int32> > > seq3ii(2); |
| seq3ii[0]=seq2ii; |
| seq3ii[1]=seq2ii2; |
| seqAny<<= seq3ii; |
| inv->invoke( OUString(L"inMulDimArrayLong2"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut); |
| |
| // inMulDimArrayByte2 |
| sal_Int8 arByteii1[]={1,2,3}; |
| sal_Int8 arByteii2[]={4,5,6,7}; |
| sal_Int8 arByteii3[]={8,9,10,11,12}; |
| sal_Int8 arByteii4[]={13,14,15,16}; |
| sal_Int8 arByteii5[]={17,18,19}; |
| |
| Sequence<sal_Int8> seqByteii1( arByteii1, 3); |
| Sequence<sal_Int8> seqByteii2( arByteii2, 4); |
| Sequence<sal_Int8> seqByteii3( arByteii3, 5); |
| Sequence<sal_Int8> seqByteii4( arByteii4, 4); |
| Sequence<sal_Int8> seqByteii5( arByteii5, 3); |
| |
| Sequence< Sequence< sal_Int8 > > seq2Byteii(3); |
| Sequence< Sequence< sal_Int8> > seq2Byteii2(2); |
| seq2Byteii[0]= seqByteii1; |
| seq2Byteii[1]= seqByteii2; |
| seq2Byteii[2]= seqByteii3; |
| |
| seq2Byteii2[0]= seqByteii4; |
| seq2Byteii2[1]= seqByteii5; |
| |
| Sequence< Sequence< Sequence< sal_Int8> > > seq3Byteii(2); |
| seq3Byteii[0]=seq2Byteii; |
| seq3Byteii[1]=seq2Byteii2; |
| seqAny<<= seq3Byteii; |
| inv->invoke( OUString(L"inMulDimArrayByte2"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut); |
| |
| |
| |
| //################################################################################### |
| //################################################################################### |
| //################################################################################### |
| // Tests with a MFC ActiveX control, ( pure dispinterface) |
| //################################################################################### |
| |
| //################################################################################### |
| // in parameter MFC ActiveX |
| //################################################################################### |
| // unsigned char is not supported by MFC |
| // aAny <<= ( sal_Int8) 127; |
| // invMfc->invoke( OUString(L"inByte"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| if ( ! invMfc.is()) |
| return hr; |
| aAny <<= static_cast<sal_Int16>(-1); |
| aAny= invMfc->invoke( OUString(L"inShort"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| |
| // |
| aAny <<= ( sal_Int32) 1234567; |
| aAny=invMfc->invoke( OUString(L"inLong"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| sal_Int32 retLong= *(sal_Int32*)aAny.getValue(); |
| |
| OUString str_1(L" this is clientTest.exe"); |
| aAny <<= str_1; |
| aAny=invMfc->invoke( OUString(L"inString"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| aAny>>= str_1; |
| |
| aAny <<= ( float) 3.14; |
| aAny=invMfc->invoke( OUString(L"inFloat"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| |
| aAny <<= ( double) 3.145; |
| aAny=invMfc->invoke( OUString(L"inDouble"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| |
| aAny <<= OUString( L" A string in an any"); |
| aAny=invMfc->invoke( OUString(L"inVariant"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| |
| // Tests with Sequences later. |
| // OUString arStr4[]= {L"string0", L"string1", L"string2"}; |
| // Sequence<OUString> seqStr4( arStr4, 3); |
| // aAny <<= seqStr4; |
| // invMfc->invoke( OUString(L"inArray"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| |
| |
| Reference < XInvocation > inv5= getComObject(L"AxTestComponents.Basic"); |
| Any anyVal4; |
| anyVal4 <<= OUString(L"this is the value of prpString"); |
| inv5->setValue( OUString(L"prpString"), anyVal4); |
| aAny <<= inv5; |
| aAny=invMfc->invoke( OUString(L"inObject"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| // |
| // //################################################################################### |
| // // out parameter MFC ActiveX |
| // //################################################################################### |
| // |
| // // outShort |
| aAny= invMfc->invoke( OUString(L"outShort"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outShort %d", *(sal_Int16*)anyOut.getValue()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outLong |
| aAny= invMfc->invoke( OUString(L"outLong"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outLong %d", *(sal_Int32*)anyOut.getValue()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outString |
| aAny= invMfc->invoke( OUString(L"outString"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outString %S", ((OUString*)anyOut.getValue())->getStr()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outFloat |
| aAny= invMfc->invoke( OUString(L"outFloat"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outFloat %f", *(float*)anyOut.getValue()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outDouble |
| aAny= invMfc->invoke( OUString(L"outDouble"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outFloat %f", *(double*)anyOut.getValue()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outVariant |
| // we expect a string!! ( VT_BSTR) |
| aAny= invMfc->invoke( OUString(L"outVariant"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| anyOut<<= seqOut[0]; |
| sprintf(buff, "MFC outVariant %S", ((OUString*)anyOut.getValue())->getStr()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| // outDouble |
| aAny= invMfc->invoke( OUString(L"outObject"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut); |
| Reference<XInvocation> invOut5; |
| seqOut[0]>>= invOut5; |
| // we assume that an object of AxTestControls.Basic is being returned. |
| anyOut= invOut5->getValue( OUString(L"prpString")); |
| OUString tmpStr; |
| anyOut>>=tmpStr; |
| sprintf(buff, "MFC outObject, property: %S", tmpStr.getStr()); |
| MessageBox( NULL, buff, _T("clientTest"), MB_OK); |
| |
| |
| //################################################################################### |
| // Sequence parameter MFC ActiveX |
| //################################################################################### |
| // Sequences are not directly supported. |
| |
| |
| delete pWin; |
| return hr; |
| |
| } |
| |
| |
| |
| //VARIANT_TRUE VT_UI1 |
| |
| |