1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_extensions.hxx"
30 
31 #include <atlbase.h>
32 
33 CComModule _Module;
34 #include<atlcom.h>
35 #include <comdef.h>
36 
37 #include "axhost.hxx"
38 
39 #include <stdio.h>
40 #include "typelib/typedescription.hxx"
41 #include <com/sun/star/bridge/oleautomation/Date.hpp>
42 #include <com/sun/star/bridge/oleautomation/Currency.hpp>
43 #include <com/sun/star/bridge/oleautomation/Decimal.hpp>
44 #include <com/sun/star/bridge/oleautomation/SCode.hpp>
45 #include <com/sun/star/bridge/oleautomation/NamedArgument.hpp>
46 #include <com/sun/star/bridge/oleautomation/PropertyPutArgument.hpp>
47 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
48 #include <com/sun/star/script/XInvocation.hpp>
49 //#include <oletest/XCallback.hpp>
50 #include <com/sun/star/uno/Reference.h>
51 #include <cppuhelper/servicefactory.hxx>
52 #include <rtl/string.h>
53 
54 #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
55 BEGIN_OBJECT_MAP(ObjectMap)
56 END_OBJECT_MAP()
57 
58 using namespace com::sun::star::lang;
59 using namespace com::sun::star::uno;
60 using namespace com::sun::star::script;
61 using namespace com::sun::star::bridge::oleautomation;
62 using namespace cppu;
63 using namespace rtl;
64 
65 
66 
67 Reference<XInvocation> convertComObject( IUnknown* pUnk);
68 Reference<XInvocation> getComObject( OUString progId);
69 bool checkOutArgs(const Sequence<Any> & outArgs,
70                   const Sequence<sal_Int16> & indices, const Sequence<Any> & values);
71 
72 bool doSimpleTest(const Reference<XInvocation> & inv);
73 bool doSimpleSequenceTest(const Reference<XInvocation> & inv);
74 bool doParameterTest(const Reference<XInvocation> & inv);
75 bool doPropertyWithArgumentTest(const Reference<XInvocation> & inv);
76 bool equalSequences(const Any& orig, const Any& returned);
77 HRESULT doTest();
78 HRESULT doTest2( Reference<XInvocation> &);
79 Reference<XInvocation> getComObject(OUString& );
80 
81 HRESULT InitializeParameter();
82 void printResultVariantArray( VARIANT & var);
83 void printVariant( VARIANT & var);
84 void printSequence( Sequence<Any>& val);
85 
86 extern "C" int __cdecl main( int , char **)
87 {
88 	HRESULT hr;
89 	if( FAILED( hr=CoInitialize(NULL)))
90 	{
91 		_tprintf(_T("CoInitialize failed \n"));
92 		return -1;
93 	}
94 
95 
96 	_Module.Init( ObjectMap, GetModuleHandle( NULL));
97 
98 	if( FAILED(hr=doTest()))
99 	{
100 		_com_error err( hr);
101 		const TCHAR * errMsg= err.ErrorMessage();
102 		MessageBox( NULL, errMsg, "Test failed", MB_ICONERROR);
103 	}
104 	else
105 	{
106 		MessageBox( NULL,NULL , "Test succeeded", MB_ICONINFORMATION);
107 	}
108 
109 
110 	_Module.Term();
111 	CoUninitialize();
112 	return 0;
113 }
114 //Also supports named args
115 
116 bool doParameterTest(const Reference<XInvocation> & inv)
117 {
118 	Sequence< sal_Int16> seqIndices;
119 	Sequence<Any> seqOut;
120 
121     Any arArgs[2];
122     Any arValue[2];
123     Any arArgs1[4];
124 
125     NamedArgument arg1(OUString(L"val1"), makeAny((sal_Int32) 123));
126     NamedArgument arg2(OUString(L"val2"), makeAny((sal_Int32) 456));
127     NamedArgument arg3(OUString(L"val3"), makeAny((sal_Int32) 0xff));
128     NamedArgument arg4(OUString(L"val4"), makeAny((sal_Int32) 0xffff));
129 
130     NamedArgument argOut1(OUString(L"val1"), Any());
131     NamedArgument argOut2(OUString(L"val2"), Any());
132     Sequence<Any> seqNoArgs;
133     arArgs[0] <<= (sal_Int32) 0;
134     arArgs[1] <<= (sal_Int32) 0;
135     Sequence<Any> seqPositional0(arArgs, 2);
136 
137 
138     arArgs[0] <<= arg1;
139     arArgs[1] <<= arg2;
140     Sequence<Any> seqNamed(arArgs, 2);
141     arArgs[0] <<= arg2;
142     arArgs[1] <<= arg1;
143     Sequence<Any> seqNamed2(arArgs, 2);
144     arArgs[0] <<= argOut1;
145     arArgs[1] <<= argOut2;
146     Sequence<Any> seqNamed3(arArgs, 2);
147     arArgs[0] <<= argOut2;
148     arArgs[1] <<= argOut1;
149     Sequence<Any> seqNamed4(arArgs, 2);
150 
151     arArgs[0] <<= arg1;
152     Sequence<Any> seqNamed5(arArgs, 1);
153     arArgs[0] <<= arg2;
154     Sequence<Any> seqNamed6(arArgs, 1);
155 
156     arArgs[0] <<= (sal_Int32) 123;
157     arArgs[1] <<= (sal_Int32) 456;
158     Sequence<Any> seqPositional(arArgs, 2);
159     arArgs[0] <<= (sal_Int32) 123;
160     Sequence<Any> seqPositional2(arArgs, 1);
161 
162     arArgs[0] <<= Any();
163     arArgs[1] <<= Any();
164     Sequence<Any> seqPositional3(arArgs, 2);
165 
166     arArgs[0] <<= (sal_Int32) 123;
167     arArgs[1] <<= SCode(DISP_E_PARAMNOTFOUND);
168     Sequence<Any> seqOutOpt1(arArgs, 2);
169 
170     arArgs[0] <<= SCode(DISP_E_PARAMNOTFOUND);
171     arArgs[1] <<= SCode(DISP_E_PARAMNOTFOUND);
172     Sequence<Any> seqOutOpt2(arArgs, 2);
173 
174     arArgs[0] <<= SCode(DISP_E_PARAMNOTFOUND);
175     arArgs[1] <<= (sal_Int32) 456;
176     Sequence<Any> seqOutOpt3(arArgs, 2);
177 
178     arArgs1[0] <<= (sal_Int32) 0;
179     arArgs1[1] <<= (sal_Int32) 0;
180     arArgs1[2] <<= (sal_Int32) 0;
181     arArgs1[3] <<= (sal_Int32) 0;
182     Sequence<Any> seqMix0(arArgs1, 4);
183 
184     arArgs1[0] <<= (sal_Int32) 123;
185     arArgs1[1] <<= (sal_Int32) 456;
186     arArgs1[2] <<= arg3;
187     arArgs1[3] <<= arg4;
188     Sequence<Any> seqMix(arArgs1, 4);
189 
190     arArgs1[0] <<= Any();
191     arArgs1[1] <<= (sal_Int32) 456;
192     arArgs1[2] <<= arg4;
193     Sequence<Any> seqMix2(arArgs1, 3);
194 
195     arArgs1[0] <<= SCode(DISP_E_PARAMNOTFOUND);
196     arArgs1[1] <<= (sal_Int32) 456;
197     arArgs1[2] <<= SCode(DISP_E_PARAMNOTFOUND);
198     arArgs1[3] <<= arg4.Value;
199     Sequence<Any> seqMixOut(arArgs1, 4);
200 
201     arArgs1[0] <<= SCode(DISP_E_PARAMNOTFOUND);
202     arArgs1[1] <<= Any();
203     arArgs1[2] <<= arg4;
204     Sequence<Any> seqMix2Out(arArgs1, 3);
205 
206 
207 
208     //in args + out, optional, positional-----------------------------------------
209     //first general test
210     seqIndices.realloc(0);
211     seqOut.realloc(0);
212     inv->invoke(OUString(L"optional3"), seqPositional, seqIndices, seqOut);
213 	seqIndices.realloc(0);
214 	seqOut.realloc(0);
215     inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut);
216     if ( ! checkOutArgs(seqOut, seqIndices, seqPositional))
217         return false;
218 
219     //2 optional args, 1 provided
220     seqIndices.realloc(0);
221     seqOut.realloc(0);
222     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
223     seqIndices.realloc(0);
224     seqOut.realloc(0);
225     inv->invoke(OUString(L"optional3"), seqPositional2, seqIndices, seqOut);
226 	seqIndices.realloc(0);
227 	seqOut.realloc(0);
228     inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut);
229     if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt1))
230         return false;
231 
232 	//2 optional args, 0 provided
233     seqIndices.realloc(0);
234     seqOut.realloc(0);
235     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
236     seqIndices.realloc(0);
237     seqOut.realloc(0);
238     inv->invoke(OUString(L"optional3"), seqNoArgs, seqIndices, seqOut);
239 	seqIndices.realloc(0);
240 	seqOut.realloc(0);
241     inv->invoke(OUString(L"optional5"), seqPositional3, seqIndices, seqOut);
242     if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt2))
243         return false;
244 
245     //named args --------------------------------------------
246 
247     // 2 named args, correct position
248     seqIndices.realloc(0);
249     seqOut.realloc(0);
250     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
251     seqIndices.realloc(0);
252 	seqOut.realloc(0);
253     inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut);
254 	seqIndices.realloc(0);
255 	seqOut.realloc(0);
256     inv->invoke(OUString(L"optional5"), seqPositional0, seqIndices, seqOut);
257     if ( ! checkOutArgs(seqOut, seqIndices, seqPositional))
258         return false;
259 
260     // 2named args, position differs
261     seqIndices.realloc(0);
262     seqOut.realloc(0);
263     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
264 	seqIndices.realloc(0);
265 	seqOut.realloc(0);
266     inv->invoke(OUString(L"optional3"), seqNamed2, seqIndices, seqOut);
267 	seqIndices.realloc(0);
268 	seqOut.realloc(0);
269     inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut);
270     if ( ! checkOutArgs(seqOut, seqIndices, seqPositional))
271         return false;
272 
273     //named out args, 2 named args with correct position
274     seqIndices.realloc(0);
275     seqOut.realloc(0);
276     inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut);
277     seqIndices.realloc(0);
278     seqIndices.realloc(0);
279     inv->invoke(OUString(L"optional5"), seqNamed3, seqIndices, seqOut);
280     if ( ! checkOutArgs(seqOut, seqIndices, seqNamed ))
281         return false;
282 
283     //named out args, 2 named args with different position
284     seqIndices.realloc(0);
285     seqOut.realloc(0);
286     inv->invoke(OUString(L"optional3"), seqNamed, seqIndices, seqOut);
287     seqIndices.realloc(0);
288     seqIndices.realloc(0);
289     inv->invoke(OUString(L"optional5"), seqNamed4, seqIndices, seqOut);
290     if ( ! checkOutArgs(seqOut, seqIndices, seqNamed2 ))
291         return false;
292 
293 
294     //2 args, 1 provided (correct order)
295     seqIndices.realloc(0);
296     seqOut.realloc(0);
297     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
298 	seqIndices.realloc(0);
299 	seqOut.realloc(0);
300     inv->invoke(OUString(L"optional3"), seqNamed5, seqIndices, seqOut);
301 	seqIndices.realloc(0);
302 	seqOut.realloc(0);
303     inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut);
304     if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt1))
305         return false;
306     //2 args, 1 provided (incorrect order)
307     seqIndices.realloc(0);
308     seqOut.realloc(0);
309     inv->invoke(OUString(L"optional3"), seqPositional0, seqIndices, seqOut);
310 	seqIndices.realloc(0);
311 	seqOut.realloc(0);
312     inv->invoke(OUString(L"optional3"), seqNamed6, seqIndices, seqOut);
313 	seqIndices.realloc(0);
314 	seqOut.realloc(0);
315     inv->invoke(OUString(L"optional5"), seqPositional, seqIndices, seqOut);
316     if ( ! checkOutArgs(seqOut, seqIndices, seqOutOpt3))
317         return false;
318 
319     //2position + 2 2named args, correct order
320     seqIndices.realloc(0);
321     seqOut.realloc(0);
322     inv->invoke(OUString(L"optional6"), seqMix0, seqIndices, seqOut);
323 	seqIndices.realloc(0);
324 	seqOut.realloc(0);
325     inv->invoke(OUString(L"optional6"), seqMix, seqIndices, seqOut);
326 	seqIndices.realloc(0);
327 	seqOut.realloc(0);
328     inv->invoke(OUString(L"optional7"), seqMix, seqIndices, seqOut);
329     if ( ! checkOutArgs(seqOut, seqIndices, seqMix))
330          return false;
331 
332     // 4 in args, 1 positional, 1 named, 1 positional omitted
333     seqIndices.realloc(0);
334     seqOut.realloc(0);
335     inv->invoke(OUString(L"optional6"), seqMix0, seqIndices, seqOut);
336 	seqIndices.realloc(0);
337 	seqOut.realloc(0);
338     inv->invoke(OUString(L"optional6"), seqMix2, seqIndices, seqOut);
339 	seqIndices.realloc(0);
340 	seqOut.realloc(0);
341     inv->invoke(OUString(L"optional7"), seqMix0, seqIndices, seqOut);
342     if ( ! checkOutArgs(seqOut, seqIndices, seqMixOut))
343          return false;
344 
345 	// 4 out args, 1 positional, 1 named, 1 positional omitted
346     seqIndices.realloc(0);
347     seqOut.realloc(0);
348     inv->invoke(OUString(L"optional6"), seqMix2, seqIndices, seqOut);
349 	seqIndices.realloc(0);
350 	seqOut.realloc(0);
351     inv->invoke(OUString(L"optional7"), seqMix2Out, seqIndices, seqOut);
352     if ( ! checkOutArgs(seqOut, seqIndices, seqMix2Out))
353          return false;
354 
355 
356     return true;
357 }
358 bool doPropertyTest(const Reference<XInvocation> & inv)
359 {
360 	Sequence< sal_Int16> seqIndices;
361 	Sequence<Any> seqOut;
362 
363 	Any inBool, outBool;
364 	Any inByte, outByte;
365 	Any inShort, outShort;
366 	Any inLong,  outLong;
367 	Any inString,  outString;
368 	Any inFloat, outFloat;
369 	Any inDouble, outDouble;
370 	Any inVariant, outVariant;
371 	Any inObject, outObject;
372     Any inUnknown, outUnknown;
373     Any inCY, outCY;
374     Any inDate, outDate;
375 	Any inDecimal, outDecimal;
376     Any inSCode, outSCode;
377     Any inrefLong, outrefLong;
378     Any inrefVariant, outrefVariant;
379     Any inrefDecimal, outrefDecimal;
380     Any inParamsLong, outParamsLong;
381     Reference<XInterface> xintUnknown(getComObject(L"AxTestComponents.Foo"));
382 
383 	inBool <<= (sal_Bool) sal_True;
384 	inv->setValue(OUString(L"prpBool"), inBool);
385 	outBool = inv->getValue(OUString(L"prpBool"));
386 
387     inByte <<= (sal_Int8) 100;
388     inv->setValue(OUString(L"prpByte"), inByte);
389     outByte = inv->getValue(OUString(L"prpByte"));
390 
391     inShort <<= static_cast<sal_Int16>( -1);
392 	inv->setValue(OUString(L"prpShort"), inShort);
393 	outShort = inv->getValue(OUString(L"prpShort"));
394 
395 	inLong <<= ( sal_Int32) 1234567;
396 	inv->setValue(OUString(L"prpLong"), inLong	// TODO: Add your implementation code here
397 );
398 	outLong = inv->getValue(OUString(L"prpLong"));
399 
400 	inString <<= OUString(L" this is clientTest.exe");
401 	inv->setValue(OUString(L"prpString"), inString);
402 	outString = inv->getValue(OUString(L"prpString"));
403 
404 	inFloat <<=  3.14f;
405 	inv->setValue(OUString(L"prpFloat"), inFloat);
406 	outFloat = inv->getValue(OUString(L"prpFloat"));
407 
408 	inDouble <<= ( double) 3.145;
409 	inv->setValue(OUString(L"prpDouble"), inDouble);
410 	outDouble = inv->getValue(OUString(L"prpDouble"));
411 
412 	inVariant <<= OUString(L"A string in an any");
413 	inv->setValue(OUString(L"prpVariant"), inVariant);
414 	outVariant = inv->getValue(OUString(L"prpVariant"));
415 
416 	inObject <<= inv;
417 	inv->setValue(OUString(L"prpObject"), inObject);
418 	outObject = inv->getValue(OUString(L"prpObject"));
419 
420     inUnknown <<= xintUnknown;
421 	inv->setValue(OUString(L"prpUnknown"), inUnknown);
422 	outUnknown = inv->getValue(OUString(L"prpUnknown"));
423 
424     Currency cur(99999);
425     inCY <<= cur;
426     inv->setValue(OUString(L"prpCurrency"), inCY);
427     outCY = inv->getValue(OUString(L"prpCurrency"));
428 
429     Date d(37889.0);
430     inDate <<= d;
431     inv->setValue(OUString(L"prpDate"), inDate);
432     outDate = inv->getValue(OUString(L"prpDate"));
433 
434 	Decimal dec(20, 0, 0xffffffff, 0xffffffff, 0x0fffffff);
435 	inDecimal <<= dec;
436 	inv->setValue(OUString(L"prpDecimal"), inDecimal);
437 	outDecimal = inv->getValue(OUString(L"prpDecimal"));
438 
439     SCode code(DISP_E_BADVARTYPE);
440     inSCode <<= code;
441     inv->setValue(OUString(L"prpSCode"), inSCode);
442     outSCode = inv->getValue(OUString(L"prpSCode"));
443 
444     inrefLong <<= (sal_Int32) 123456;
445     inv->setValue(OUString(L"prprefLong"), inrefLong);
446     outrefLong = inv->getValue(OUString(L"prprefLong"));
447 
448 	inrefVariant <<= OUString(L"A string in an any");
449 	inv->setValue(OUString(L"prprefVariant"), inrefVariant);
450 	outrefVariant = inv->getValue(OUString(L"prprefVariant"));
451 
452 	Decimal decref(20, 0, 0xffffffff, 0xffffffff, 0x0fffffff);
453 	inrefDecimal <<= decref;
454 	inv->setValue(OUString(L"prprefDecimal"), inrefDecimal);
455 	outrefDecimal = inv->getValue(OUString(L"prprefDecimal"));
456 
457     if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong
458  		|| inFloat != outFloat || inDouble != outDouble || inString != outString
459  		|| inVariant != outVariant || inObject != outObject
460         || inUnknown != outUnknown || inCY != outCY
461         || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode
462         || inrefLong != outrefLong ||inrefVariant != outrefVariant
463         || inrefDecimal != outrefDecimal)
464         return false;
465     return true;
466 }
467 
468 bool doPropertyWithArgumentTest(const Reference<XInvocation> & inv)
469 {
470     Sequence< sal_Int16> seqIndices;
471 	Sequence<Any> seqOut;
472 
473     Any arMultiArgs[3];
474     arMultiArgs[0] <<= makeAny((sal_Int32) 0);
475     arMultiArgs[1] <<= makeAny((sal_Int32) 0);
476     arMultiArgs[2] <<= PropertyPutArgument(makeAny((sal_Int32) 0));
477     Sequence<Any> seqMultiArgPut0(arMultiArgs, 3);
478 
479     arMultiArgs[0] <<= makeAny((sal_Int32) 1);
480     arMultiArgs[1] <<= makeAny((sal_Int32) 2);
481     arMultiArgs[2] <<= PropertyPutArgument(makeAny((sal_Int32) 3));
482     Sequence<Any> seqMultiArgPut1(arMultiArgs, 3);
483 
484     arMultiArgs[0] <<= makeAny((sal_Int32) 1);
485     arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 3));
486     Sequence<Any> seqMultiArgPut2(arMultiArgs, 2);
487 
488     arMultiArgs[0] <<= NamedArgument(OUString(L"val2"), makeAny((sal_Int32) 1));
489     arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 3));
490     Sequence<Any> seqMultiArgPut3(arMultiArgs, 2);
491 
492     arMultiArgs[0] <<= NamedArgument(OUString(L"val2"), makeAny((sal_Int32) 1));
493     arMultiArgs[1] <<= NamedArgument(OUString(L"val3"), makeAny((sal_Int32) 3));
494     Sequence<Any> seqMultiArgPut4(arMultiArgs, 2);
495 
496     arMultiArgs[0] <<= makeAny((sal_Int32) 0);
497     arMultiArgs[1] <<= makeAny((sal_Int32) 0);
498     Sequence<Any> seqMultiArgGet0(arMultiArgs, 2);
499 
500     arMultiArgs[0] <<= makeAny((sal_Int32) 1);
501     arMultiArgs[1] <<= makeAny((sal_Int32) 2);
502     Sequence<Any> seqMultiArgGet1(arMultiArgs, 2);
503     Sequence<Any> seqMultiArgGet2(arMultiArgs, 1);
504 
505 
506     arMultiArgs[0] <<= makeAny((sal_Int32) 0);
507     arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 0));
508     Sequence<Any> seqMultiArgPut5(arMultiArgs, 2);
509 
510     arMultiArgs[0] <<= makeAny((sal_Int32) 1);
511     arMultiArgs[1] <<= PropertyPutArgument(makeAny((sal_Int32) 2));
512     Sequence<Any> seqMultiArgPut6(arMultiArgs, 2);
513 
514     arMultiArgs[0] <<= Any();
515     arMultiArgs[1] <<= Any();
516     Sequence<Any> seqMultiVoid(arMultiArgs, 2);
517 
518     arMultiArgs[0] = makeAny((sal_Int32) 0);
519     arMultiArgs[1] = makeAny((sal_Int32) 0);
520     Sequence<Any> seqMultiVoid2(arMultiArgs, 2);
521 
522     //[propput, ...] HRESULT prpMultiArg1([in,out,optional] VARIANT* val1, [in,out,optional] VARIANT* val2, [in] VARIANT* newVal);
523     //[propget, ...] HRESULT prpMultiArg1([in,out,optional] VARIANT* val1, [in,out,optional] VARIANT* val2, [out, optional, retval] VARIANT* pVal);
524     seqIndices.realloc( 0);
525  	seqOut.realloc(0);
526     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut);
527  	seqIndices.realloc( 0);
528  	seqOut.realloc(0);
529     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut1, seqIndices, seqOut);
530     //check in/out args
531    	seqIndices.realloc( 0);
532 	seqOut.realloc(0);
533  	Any anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0,
534                              seqIndices, seqOut);
535 
536     if (anyRet != ((PropertyPutArgument const *)seqMultiArgPut1[2].getValue())->Value
537         || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(seqMultiArgPut1.getArray(), 2)))
538     {
539        return false;
540     }
541     // test optional (one arg omitted
542     seqIndices.realloc( 0);
543  	seqOut.realloc(0);
544     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut);
545  	seqIndices.realloc( 0);
546  	seqOut.realloc(0);
547     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut2, seqIndices, seqOut);
548    	seqIndices.realloc( 0);
549 	seqOut.realloc(0);
550  	anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0,
551                              seqIndices, seqOut);
552 
553     arMultiArgs[0] = makeAny((sal_Int32) 1);
554     arMultiArgs[1] = makeAny((SCode(DISP_E_PARAMNOTFOUND)));
555 
556     if (anyRet != ((PropertyPutArgument const *) seqMultiArgPut2[1].getValue())->Value
557         || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(arMultiArgs, 2)))
558     {
559        return false;
560     }
561 
562     //test one named arg and one omitted
563     seqIndices.realloc( 0);
564  	seqOut.realloc(0);
565     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut0, seqIndices, seqOut);
566  	seqIndices.realloc( 0);
567  	seqOut.realloc(0);
568     inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgPut3, seqIndices, seqOut);
569    	seqIndices.realloc( 0);
570 	seqOut.realloc(0);
571  	anyRet = inv->invoke(OUString(L"prpMultiArg1"), seqMultiArgGet0,
572                              seqIndices, seqOut);
573 
574     arMultiArgs[0] = makeAny((SCode(DISP_E_PARAMNOTFOUND)));
575     arMultiArgs[1] = ((NamedArgument const*) seqMultiArgPut3[0].getValue())->Value;
576     if (anyRet !=  ((PropertyPutArgument const*) seqMultiArgPut3[1].getValue())->Value
577         || ! checkOutArgs(seqOut, seqIndices, Sequence<Any>(arMultiArgs, 2)))
578     {
579        return false;
580     }
581 
582 //    [propget,...] HRESULT prpMultiArg2([in] VARIANT val1, [out, retval] VARIANT* pVal);
583 //    [propput,...] HRESULT prpMultiArg2([in] VARIANT val1, [in] VARIANT newVal);
584     seqIndices.realloc( 0);
585  	seqOut.realloc(0);
586     inv->invoke(OUString(L"prpMultiArg2"), seqMultiArgPut5, seqIndices, seqOut);
587  	seqIndices.realloc( 0);
588  	seqOut.realloc(0);
589     inv->invoke(OUString(L"prpMultiArg2GetValues"), seqMultiVoid, seqIndices, seqOut);
590 
591     if ( ! checkOutArgs(seqOut, seqIndices, seqMultiVoid2))
592         return false;
593    	seqIndices.realloc( 0);
594 	seqOut.realloc(0);
595  	anyRet = inv->invoke(OUString(L"prpMultiArg2"), seqMultiArgPut6,
596                              seqIndices, seqOut);
597    	seqIndices.realloc( 0);
598 	seqOut.realloc(0);
599  	anyRet = inv->invoke(OUString(L"prpMultiArg2GetValues"), seqMultiVoid,
600                              seqIndices, seqOut);
601 
602 // [propget,...] HRESULT prpMultiArg3([in,out] LONG* val1, [out, retval] LONG* pVal);
603 // [propput,...] HRESULT prpMultiArg3([in,out] LONG* val1, [in] LONG newVal);
604 
605     if ( ! checkOutArgs(seqOut, seqIndices, seqMultiArgGet1 ))
606          return false;
607     seqIndices.realloc( 0);
608  	seqOut.realloc(0);
609     inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgPut5, seqIndices, seqOut);
610  	seqIndices.realloc( 0);
611  	seqOut.realloc(0);
612     inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgPut6, seqIndices, seqOut);
613  	seqIndices.realloc( 0);
614  	seqOut.realloc(0);
615     anyRet = inv->invoke(OUString(L"prpMultiArg3"), seqMultiArgGet2, seqIndices, seqOut);
616 
617     if ( anyRet !=  ((PropertyPutArgument const*) seqMultiArgPut6[1].getValue())->Value
618          || !checkOutArgs(seqOut, seqIndices, seqMultiArgGet2))
619         return false;
620 
621 
622     //hasProperty, hasMethod
623     if (inv->hasProperty(OUSTR("prpMultiArg1")))
624         return false;
625     if ( ! inv->hasMethod(OUSTR("prpMultiArg1")))
626         return false;
627     if ( ! inv->hasProperty(OUSTR("prprefLong")))
628         return false;
629     if (inv->hasMethod(OUSTR("prprefLong")))
630         return false;
631     if ( ! inv->hasMethod(OUSTR("inLong")))
632         return false;
633 
634 	return true;
635 }
636 bool doSimpleTest(const Reference<XInvocation> & inv)
637 {
638 	Sequence< sal_Int16> seqIndices;
639 	Sequence<Any> seqOut;
640 
641 	Any inBool, outBool;
642 	Any inByte, outByte;
643 	Any inShort, outShort;
644 	Any inLong,  outLong;
645 	Any inString,  outString;
646 	Any inFloat, outFloat;
647 	Any inDouble, outDouble;
648 	Any inVariant, outVariant;
649 	Any inObject, outObject;
650 	Any inUnknown, outUnknown;
651     Any inCY, outCY;
652     Any inDate, outDate;
653     Any inDecimal, outDecimal;
654     Any inSCode, outSCode;
655     Any inrefLong, outrefLong;
656     Any inrefVariant, outrefVariant;
657     Any inrefDecimal, outrefDecimal;
658 
659 	Reference<XInterface> xIntFoo(getComObject(L"AxTestComponents.Foo"));
660 	//###################################################################################
661 	//	in and out parameter
662 	//###################################################################################
663 	sal_Bool aBool = sal_True;
664 	inBool.setValue(&aBool, getCppuBooleanType());
665 	inv->invoke(OUString(L"inBool"), Sequence< Any > ( &inBool, 1), seqIndices, seqOut);
666 	seqIndices.realloc(0);
667 	seqOut.realloc(0);
668 	inv->invoke(OUString(L"outBool"), Sequence< Any > ( & outBool, 1), seqIndices, seqOut);
669 	outBool <<= seqOut[0];
670 
671 	inByte <<= (sal_Int8) 127;
672 	inv->invoke(OUString(L"inByte"), Sequence< Any > ( & inByte, 1), seqIndices, seqOut);
673 	seqIndices.realloc( 0);
674 	seqOut.realloc(0);
675 	inv->invoke(OUString(L"outByte"), Sequence< Any > ( & outByte, 1), seqIndices, seqOut);
676 	outByte <<= seqOut[0];
677 
678 	inShort <<= static_cast<sal_Int16>(-1);
679 	inv->invoke(OUString(L"inShort"), Sequence< Any > ( & inShort, 1), seqIndices, seqOut);
680 	seqIndices.realloc( 0);
681 	seqOut.realloc(0);
682 	inv->invoke(OUString(L"outShort"), Sequence< Any > ( & outShort, 1), seqIndices, seqOut);
683 	outShort <<= seqOut[0];
684 
685 	inLong <<= ( sal_Int32) 1234567;
686 	inv->invoke(OUString(L"inLong"), Sequence< Any > ( & inLong, 1), seqIndices, seqOut);
687 	seqIndices.realloc( 0);
688 	seqOut.realloc(0);
689 	inv->invoke(OUString(L"outLong"), Sequence< Any > ( & outLong, 1 ), seqIndices, seqOut);
690 	outLong <<= seqOut[0];
691 
692 	inString <<= OUString(L" this is clientTest.exe");
693 	inv->invoke(OUString(L"inString"), Sequence< Any > ( & inString, 1), seqIndices, seqOut);
694 	seqIndices.realloc( 0);
695 	seqOut.realloc(0);
696 	inv->invoke(OUString(L"outString"), Sequence< Any > ( & outString, 1 ), seqIndices, seqOut);
697 	outString <<= seqOut[0];
698 
699 	inFloat <<=  3.14f;
700 	inv->invoke(OUString(L"inFloat"), Sequence< Any > ( & inFloat, 1), seqIndices, seqOut);
701 	seqIndices.realloc( 0);
702 	seqOut.realloc(0);
703 	inv->invoke(OUString(L"outFloat"), Sequence< Any > ( & outFloat, 1 ), seqIndices, seqOut);
704 	outFloat <<= seqOut[0];
705 
706 	inDouble <<= ( double) 3.145;
707 	inv->invoke(OUString(L"inDouble"), Sequence< Any > ( & inDouble, 1), seqIndices, seqOut);
708 	seqIndices.realloc( 0);
709 	seqOut.realloc(0);
710 	inv->invoke(OUString(L"outDouble"), Sequence< Any > ( & outDouble, 1 ), seqIndices, seqOut);
711 	outDouble <<= seqOut[0];
712 
713 	inVariant <<= OUString(L" A string in an any");
714 	inv->invoke(OUString(L"inVariant"), Sequence< Any > ( & inVariant, 1), seqIndices, seqOut);
715 	seqIndices.realloc( 0);
716 	seqOut.realloc(0);
717 	inv->invoke(OUString(L"outVariant"), Sequence< Any > (&outVariant, 1), seqIndices, seqOut);
718 	outVariant <<= seqOut[0];
719 
720 	inObject <<= inv;
721 	inv->invoke(OUString(L"inObject"), Sequence< Any > ( & inObject, 1), seqIndices, seqOut);
722 	seqIndices.realloc( 0);
723 	seqOut.realloc(0);
724 	inv->invoke(OUString(L"outObject"), Sequence< Any > (& outObject, 1), seqIndices, seqOut);
725 	outObject <<= seqOut[0];
726 
727 	inUnknown <<= xIntFoo;
728 	inv->invoke(OUString(L"inUnknown"), Sequence< Any > ( & inUnknown, 1), seqIndices, seqOut);
729 	seqIndices.realloc( 0);
730 	seqOut.realloc(0);
731 	inv->invoke(OUString(L"outUnknown"), Sequence< Any > (& outUnknown, 1), seqIndices, seqOut);
732 	outUnknown <<= seqOut[0];
733 
734     Currency cur(999999);
735     inCY <<= cur;
736     inv->invoke(OUString(L"inCurrency"), Sequence<Any>( & inCY, 1), seqIndices, seqOut);
737 	seqIndices.realloc( 0);
738 	seqOut.realloc(0);
739     inv->invoke(OUString(L"outCurrency"), Sequence< Any > (& outCY, 1), seqIndices, seqOut);
740     outCY <<= seqOut[0];
741 
742     Date dDate(37889.0);
743     inDate <<= dDate;
744     inv->invoke(OUString(L"inDate"), Sequence<Any>( & inDate, 1), seqIndices, seqOut);
745 	seqIndices.realloc( 0);
746 	seqOut.realloc(0);
747     inv->invoke(OUString(L"outDate"), Sequence< Any > (& outDate, 1), seqIndices, seqOut);
748     outDate <<= seqOut[0];
749 
750     Decimal dec(3, 0, 0xffffffff, 0xffffffff, 0xfffffff0);
751     inDecimal <<= dec;
752     inv->invoke(OUString(L"inDecimal"), Sequence<Any>( & inDecimal, 1), seqIndices, seqOut);
753 	seqIndices.realloc( 0);
754 	seqOut.realloc(0);
755     inv->invoke(OUString(L"outDecimal"), Sequence< Any > (& outDecimal, 1), seqIndices, seqOut);
756     outDecimal <<= seqOut[0];
757 
758     SCode code(DISP_E_BADVARTYPE);
759     inSCode <<= code;
760     inv->invoke(OUString(L"inSCode"), Sequence<Any>( & inSCode, 1), seqIndices, seqOut);
761 	seqIndices.realloc( 0);
762 	seqOut.realloc(0);
763     inv->invoke(OUString(L"outSCode"), Sequence< Any > (& outSCode, 1), seqIndices, seqOut);
764     outSCode <<= seqOut[0];
765 
766     if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong
767 		|| inFloat != outFloat || inDouble != outDouble || inString != outString
768 		|| inVariant != outVariant || inObject != outObject || inUnknown != outUnknown
769 		|| inCY != outCY
770         || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode)
771 		return false;
772 	//###################################################################################
773 	//	in/out parameter
774 	//###################################################################################
775 	outBool = Any();
776 	seqIndices.realloc( 0);
777 	seqOut.realloc(0);
778 	inv->invoke(OUString(L"inoutBool"), Sequence< Any > ( & inBool, 1), seqIndices, seqOut);
779 	outBool <<= seqOut[0];
780 
781 	outByte = Any();
782 	seqIndices.realloc( 0);
783 	seqOut.realloc(0);
784 	inv->invoke(OUString(L"inoutByte"), Sequence< Any > ( & inByte, 1), seqIndices, seqOut);
785 	outByte <<= seqOut[0];
786 
787 	outShort = Any();
788 	seqIndices.realloc( 0);
789 	seqOut.realloc(0);
790 	inv->invoke(OUString(L"inoutShort"), Sequence< Any > ( & inShort, 1), seqIndices, seqOut);
791 	outShort <<= seqOut[0];
792 
793 	outLong = Any();
794 	seqIndices.realloc( 0);
795 	seqOut.realloc(0);
796 	inv->invoke(OUString(L"inoutLong"), Sequence< Any > ( & inLong, 1), seqIndices, seqOut);
797 	outLong <<= seqOut[0];
798 
799 	outString = Any();
800 	seqIndices.realloc( 0);
801 	seqOut.realloc(0);
802 	inv->invoke(OUString(L"inoutString"), Sequence< Any > ( & inString, 1), seqIndices, seqOut);
803 	outString <<= seqOut[0];
804 
805 	outFloat = Any();
806 	seqIndices.realloc( 0);
807 	seqOut.realloc(0);
808 	inv->invoke(OUString(L"inoutFloat"), Sequence< Any > ( & inFloat, 1), seqIndices, seqOut);
809 	outFloat <<= seqOut[0];
810 
811 	outDouble = Any();
812 	seqIndices.realloc( 0);
813 	seqOut.realloc(0);
814 	inv->invoke(OUString(L"inoutDouble"), Sequence< Any > ( &inDouble, 1), seqIndices, seqOut);
815 	outDouble <<= seqOut[0];
816 
817 	outVariant = Any();
818 	seqIndices.realloc( 0);
819 	seqOut.realloc(0);
820 	inv->invoke(OUString(L"inoutVariant"), Sequence< Any > ( & inVariant, 1), seqIndices, seqOut);
821 	outVariant <<= seqOut[0];
822 
823 	outObject = Any();
824 	seqIndices.realloc( 0);
825 	seqOut.realloc(0);
826 	inv->invoke(OUString(L"inoutObject"), Sequence< Any > ( & inObject, 1), seqIndices, seqOut);
827 	outObject <<= seqOut[0];
828 
829 	outCY = Any();
830 	seqIndices.realloc( 0);
831 	seqOut.realloc(0);
832 	inv->invoke(OUString(L"inoutCurrency"), Sequence< Any > ( & inCY, 1), seqIndices, seqOut);
833 	outCY <<= seqOut[0];
834 
835     outDate = Any();
836 	seqIndices.realloc( 0);
837 	seqOut.realloc(0);
838 	inv->invoke(OUString(L"inoutDate"), Sequence< Any > ( & inDate, 1), seqIndices, seqOut);
839 	outDate <<= seqOut[0];
840 
841     outDecimal = Any();
842 	seqIndices.realloc( 0);
843 	seqOut.realloc(0);
844     inv->invoke(OUString(L"inoutDecimal"), Sequence< Any > (& inDecimal, 1), seqIndices, seqOut);
845     outDecimal <<= seqOut[0];
846 
847     outSCode = Any();
848     seqIndices.realloc(0);
849     seqOut.realloc(0);
850     inv->invoke(OUString(L"inoutSCode"), Sequence< Any > (& inSCode, 1), seqIndices, seqOut);
851     outSCode <<= seqOut[0];
852 
853 	if (inBool != outBool || inByte != outByte || inShort != outShort || inLong != outLong
854 		|| inFloat != outFloat || inDouble != outDouble || inString != outString
855 		|| inVariant != outVariant || inObject != outObject || inCY != outCY
856         || inDate != outDate || inDecimal != outDecimal || inSCode != outSCode)
857 		return false;
858 
859     //###################################################################################
860 	//	in byref parameters
861 	//###################################################################################
862 
863     inrefLong <<= (sal_Int32) 1234;
864     inv->invoke(OUString(L"inrefLong"), Sequence<Any>( & inrefLong, 1), seqIndices, seqOut);
865 	seqIndices.realloc( 0);
866 	seqOut.realloc(0);
867     inv->invoke(OUString(L"outLong"), Sequence< Any > (& outrefLong, 1), seqIndices, seqOut);
868     outrefLong <<= seqOut[0];
869 
870 	inrefVariant <<= OUString(L" A string in an any");
871 	inv->invoke(OUString(L"inrefVariant"), Sequence< Any > ( & inrefVariant, 1), seqIndices, seqOut);
872 	seqIndices.realloc( 0);
873 	seqOut.realloc(0);
874 	inv->invoke(OUString(L"outVariant"), Sequence< Any > (&outrefVariant, 1), seqIndices, seqOut);
875 	outrefVariant <<= seqOut[0];
876 
877     Decimal refdec(5, 1, 0xffff, 0xff, 0x1);
878     inrefDecimal <<= refdec;
879 	inv->invoke(OUString(L"inrefDecimal"), Sequence< Any > ( & inrefDecimal, 1), seqIndices, seqOut);
880 	seqIndices.realloc( 0);
881 	seqOut.realloc(0);
882 	inv->invoke(OUString(L"outDecimal"), Sequence< Any > (&outrefDecimal, 1), seqIndices, seqOut);
883 	outrefDecimal <<= seqOut[0];
884 
885     if (inrefLong != outrefLong || inrefVariant != outrefVariant
886         || inrefDecimal != outrefDecimal)
887         return false;
888 
889 
890     //###################################################################################
891 	//	mixed parameter
892 	//###################################################################################
893 	// mixed1
894 	seqIndices.realloc( 0);
895 	seqOut.realloc(0);
896 	Any param[3];
897 	param[0] = inByte;
898 	param[1] = inFloat;
899 	param[2] = inVariant;
900 	inv->invoke(OUString(L"mixed1"), Sequence< Any >(param, 3), seqIndices, seqOut);
901 
902 	if (seqOut.getLength() != 3 || inByte != seqOut[0] || inFloat != seqOut[1]
903 		|| inVariant != seqOut[2])
904 			return false;
905 	return true;
906 }
907 
908 bool doSimpleSequenceTest(const Reference<XInvocation> & inv)
909 {
910 	bool ret = true;
911 	Sequence<sal_Int16> seqIndices;
912 	Sequence<Any> seqOut;
913 	Any voidAny;
914 	Any inArAny;
915 	Any outArray;
916 	Any inArBool, outArBool;
917 	Any inArByte, outArByte;
918 	Any inArShort, outArShort;
919 	Any inArLong, outArLong;
920 	Any inArString, outArString;
921 	Any inArFloat, outArFloat;
922 	Any inArDouble, outArDouble;
923 	Any inArObject, outArObject;
924 	Any outVariant;
925 
926 	//Initialize arrays
927 	OUString arStr[]= {L"string0", L"string1", L"string2"};
928 	Sequence<OUString> seq( arStr, 3);
929 	inArString <<= seq;
930 
931 	Any arAnyStrTmp[3];
932 	arAnyStrTmp[0]<<= arStr[0];
933 	arAnyStrTmp[1]<<= arStr[1];
934 	arAnyStrTmp[2]<<= arStr[2];
935 	Sequence<Any> seq_1( arAnyStrTmp, 3);
936 	inArAny <<= seq_1;
937 	//###################################################################################
938 	//	in, out Sequences
939 	//###################################################################################
940 	//Test sequence containing Anys of Strings
941 	inv->invoke(OUString(L"inArray"), Sequence< Any > ( & inArAny, 1), seqIndices, seqOut);
942 	seqIndices.realloc(0);
943 	seqOut.realloc(0);
944 	inv->invoke(OUString(L"outArray"), Sequence<Any>( & voidAny, 1), seqIndices, seqOut);
945 	if (inArAny != seqOut[0])
946 		return false;
947 
948 	seqIndices.realloc(0);
949 	seqOut.realloc(0);
950 	inv->invoke(OUString(L"inArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut);
951 	inv->invoke(OUString(L"outArray"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
952 	outArray <<= seqOut[0];
953 
954 	sal_Int8 arByte[]={1,2,3};
955 	Sequence<sal_Int8> seqByte(arByte, 3);
956 	inArByte <<= seqByte;
957 	inv->invoke(OUString(L"inSequenceByte"),Sequence<Any>( & inArByte, 1), seqIndices, seqOut);
958 	seqIndices.realloc(0);
959 	seqOut.realloc(0);
960 	inv->invoke(OUString(L"outSequenceByte"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
961 	outArByte <<= seqOut[0];
962 
963 	sal_Int16 arShort[]={4,5,6};
964 	Sequence<sal_Int16> seqShort(arShort, 3);
965 	inArShort<<= seqShort;
966 	inv->invoke(OUString(L"inSequenceShort"),Sequence< Any >( & inArShort, 1), seqIndices, seqOut);
967 	seqIndices.realloc(0);
968 	seqOut.realloc(0);
969 	inv->invoke(OUString(L"outSequenceShort"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
970 	outArShort <<= seqOut[0];
971 
972 	sal_Int32 arLong[] = {7,8,9};
973 	Sequence<sal_Int32> seqLong(arLong, 3);
974 	inArLong <<= seqLong;
975 	inv->invoke(OUString(L"inSequenceLong"),Sequence< Any > ( & inArLong, 1), seqIndices, seqOut);
976 	seqIndices.realloc(0);
977 	seqOut.realloc(0);
978 	inv->invoke(OUString(L"outSequenceLong"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
979 	outArLong <<= seqOut[0];
980 
981 	inv->invoke(OUString(L"inSequenceLong"),Sequence< Any > ( & inArLong, 1), seqIndices, seqOut);
982 	seqIndices.realloc(0);
983 	seqOut.realloc(0);
984 	inv->invoke(OUString(L"outSequenceLong"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
985 	outArLong <<= seqOut[0];
986 
987 	inv->invoke( OUString(L"inSequenceString"),Sequence< Any > ( & inArString, 1), seqIndices, seqOut);
988 	seqIndices.realloc(0);
989 	seqOut.realloc(0);
990 	inv->invoke(OUString(L"outSequenceString"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
991 	outArString <<= seqOut[0];
992 
993 	float arFloat[]={3.14f, 31.4f, 314.f};
994 	Sequence<float> seqFloat( arFloat, 3);
995 	inArFloat <<= seqFloat;
996 	inv->invoke( OUString(L"inSequenceFloat"),Sequence< Any > ( & inArFloat, 1), seqIndices, seqOut);
997 	seqIndices.realloc(0);
998 	seqOut.realloc(0);
999 	inv->invoke(OUString(L"outSequenceFloat"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
1000 	outArFloat <<= seqOut[0];
1001 
1002 	double arDouble[]={3.145, 31.45, 3145.};
1003 	Sequence<double> seqDouble( arDouble, 3);
1004 	inArDouble <<= seqDouble;
1005 	inv->invoke(OUString(L"inSequenceDouble"),Sequence< Any >( & inArDouble, 1), seqIndices, seqOut);
1006 	seqIndices.realloc(0);
1007 	seqOut.realloc(0);
1008 	inv->invoke(OUString(L"outSequenceDouble"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
1009 	outArDouble <<= seqOut[0];
1010 
1011 	Sequence<Reference<XInvocation> > seqObj(2);
1012 	seqObj[0]= 	getComObject(L"AxTestComponents.Basic");
1013 	seqObj[1]= 	getComObject(L"AxTestComponents.Basic");
1014 	inArObject <<= seqObj;
1015 	inv->invoke(OUString(L"inSequenceObject"),Sequence< Any >( & inArObject, 1), seqIndices, seqOut);
1016 	seqIndices.realloc(0);
1017 	seqOut.realloc(0);
1018 	inv->invoke(OUString(L"outSequenceObject"), Sequence< Any >( & voidAny, 1), seqIndices, seqOut);
1019 	outArObject <<= seqOut[0];
1020 
1021 	if ( ! equalSequences(inArByte, outArByte) || ! equalSequences(inArShort, outArShort)
1022 		|| ! equalSequences(inArLong, outArLong) || ! equalSequences(inArString, outArray)
1023 		|| ! equalSequences(inArFloat, outArFloat) || ! equalSequences(inArDouble, outArDouble)
1024 		|| ! equalSequences(inArString, outArString)  || ! equalSequences(inArObject, outArObject))
1025 		return false;
1026 
1027 	//###################################################################################
1028 	//	in/out Sequences
1029 	//###################################################################################
1030 	seqIndices.realloc(0);
1031 	seqOut.realloc(0);
1032 	inv->invoke(OUString(L"inoutArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut);
1033 	inv->invoke(OUString(L"inoutArray"), Sequence< Any >( & inArString, 1), seqIndices, seqOut);
1034 	outArray <<= seqOut[0];
1035 
1036 	inv->invoke(OUString(L"inoutSequenceByte"), Sequence<Any>( & inArByte, 1), seqIndices, seqOut);
1037 	inv->invoke(OUString(L"inoutSequenceByte"), Sequence<Any>( & inArByte, 1), seqIndices, seqOut);
1038 	outArByte <<= seqOut[0];
1039 
1040 	inv->invoke(OUString(L"inoutSequenceShort"), Sequence<Any>( & inArShort, 1), seqIndices, seqOut);
1041 	inv->invoke(OUString(L"inoutSequenceShort"), Sequence<Any>( & inArShort, 1), seqIndices, seqOut);
1042 	outArShort <<= seqOut[0];
1043 
1044 	inv->invoke(OUString(L"inoutSequenceLong"), Sequence<Any>( & inArLong, 1), seqIndices, seqOut);
1045 	inv->invoke(OUString(L"inoutSequenceLong"), Sequence< Any >( & inArLong, 1), seqIndices, seqOut);
1046 	outArLong <<= seqOut[0];
1047 
1048 	inv->invoke(OUString(L"inoutSequenceString"), Sequence<Any>( & inArString, 1), seqIndices, seqOut);
1049 	inv->invoke(OUString(L"inoutSequenceString"), Sequence<Any>( & inArString, 1), seqIndices, seqOut);
1050 	outArString <<= seqOut[0];
1051 
1052 	inv->invoke(OUString(L"inoutSequenceFloat"), Sequence<Any>( & inArFloat, 1), seqIndices, seqOut);
1053 	inv->invoke(OUString(L"inoutSequenceFloat"), Sequence<Any>( & inArFloat, 1), seqIndices, seqOut);
1054 	outArFloat <<= seqOut[0];
1055 
1056 	inv->invoke(OUString(L"inoutSequenceDouble"), Sequence<Any>( & inArDouble, 1), seqIndices, seqOut);
1057 	inv->invoke(OUString(L"inoutSequenceDouble"), Sequence<Any>( & inArDouble, 1), seqIndices, seqOut);
1058 	outArDouble <<= seqOut[0];
1059 
1060 	inv->invoke(OUString(L"inoutSequenceObject"), Sequence<Any>( & inArObject, 1), seqIndices, seqOut);
1061 	inv->invoke(OUString(L"inoutSequenceObject"), Sequence<Any>( & inArObject, 1), seqIndices, seqOut);
1062 	outArObject <<= seqOut[0];
1063 
1064 	if ( ! equalSequences(inArByte, outArByte) || ! equalSequences(inArShort, outArShort)
1065 		|| ! equalSequences(inArLong, outArLong) || ! equalSequences(inArString, outArray)
1066 		|| ! equalSequences(inArFloat, outArFloat) || ! equalSequences(inArDouble, outArDouble)
1067 		|| ! equalSequences(inArString, outArString)  || ! equalSequences(inArObject, outArObject))
1068 		return false;
1069 
1070 	return ret;
1071 }
1072 
1073 HRESULT doTest()
1074 {
1075 	HRESULT hr= S_OK;
1076 	USES_CONVERSION;
1077 	Reference<XInvocation> inv= getComObject( L"AxTestComponents.Basic");
1078 
1079 	HostWin* pWin= new HostWin( L"MFCCONTROL.MfcControlCtrl.1");
1080 	CComPtr<IUnknown> spUnk= pWin->GetHostedControl();
1081 	Reference<XInvocation> invMfc= convertComObject( spUnk.p);
1082 
1083 	Sequence< sal_Int16> seqIndices;
1084 	Sequence<Any> seqOut;
1085 
1086 	Any aAny;
1087 	Any anyOut;
1088 	char buff[1024];
1089 	Any seqAny;
1090 
1091 	if (! doSimpleTest(inv))
1092 	{
1093 		fprintf(stdout, "### Test failed!\n");
1094 		return E_FAIL;
1095 	}
1096 
1097     if (! doPropertyTest(inv))
1098     {
1099         fprintf(stdout, "### Test failed!\n");
1100 		return E_FAIL;
1101     }
1102 
1103 	if ( ! doSimpleSequenceTest(inv))
1104 	{
1105 		fprintf(stdout, "### Test failed! \n");
1106 		return E_FAIL;
1107 	}
1108 
1109     if ( ! doParameterTest(inv))
1110 	{
1111 		fprintf(stdout, "### Test failed! \n");
1112 		return E_FAIL;
1113 	}
1114 
1115     if ( ! doPropertyWithArgumentTest(inv))
1116     {
1117         fprintf(stdout, "### Test failed! \n");
1118 		return E_FAIL;
1119     }
1120 
1121 
1122 
1123 
1124 
1125 //
1126 //	//###################################################################################
1127 //	//	in multi Sequences
1128 //	//###################################################################################
1129 //	// inMulDimArrayLong
1130 	sal_Int32 arLongi[]={1,2,3};
1131 	sal_Int32 arLongi2[]={4,5,6,7};
1132 	sal_Int32 arLongi3[]={8,9,10,11,12};
1133 
1134 	Sequence<sal_Int32> seqLongi1( arLongi, 3);
1135 	Sequence<sal_Int32> seqLongi2( arLongi2, 4);
1136 	Sequence<sal_Int32> seqLongi3( arLongi3, 5);
1137 
1138 	Sequence< Sequence< sal_Int32 > > seq2i(3);
1139 	seq2i[0]= seqLongi1;
1140 	seq2i[1]= seqLongi2;
1141 	seq2i[2]= seqLongi3;
1142 	seqAny<<= seq2i;
1143 	// dimension length 3,5
1144 	inv->invoke( OUString(L"inMulDimArrayLong"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut);
1145 //
1146 	//inMulDimArrayVariant
1147 	inv->invoke( OUString(L"inMulDimArrayVariant"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut);
1148 
1149 	//inMulDimArrayLong2
1150 	sal_Int32 arLongii1[]={1,2,3};
1151 	sal_Int32 arLongii2[]={4,5,6,7};
1152 	sal_Int32 arLongii3[]={8,9,10,11,12};
1153 	sal_Int32 arLongii4[]={13,14,15,16};
1154 	sal_Int32 arLongii5[]={17,18,19};
1155 
1156 	Sequence<sal_Int32> seqLongii1( arLongii1, 3);
1157 	Sequence<sal_Int32> seqLongii2( arLongii2, 4);
1158 	Sequence<sal_Int32> seqLongii3( arLongii3, 5);
1159 	Sequence<sal_Int32> seqLongii4( arLongii4, 4);
1160 	Sequence<sal_Int32> seqLongii5( arLongii5, 3);
1161 
1162 	Sequence< Sequence< sal_Int32 > > seq2ii(3);
1163 	Sequence< Sequence< sal_Int32> > seq2ii2(2);
1164 	seq2ii[0]= seqLongii1;
1165 	seq2ii[1]= seqLongii2;
1166 	seq2ii[2]= seqLongii3;
1167 
1168 	seq2ii2[0]= seqLongii4;
1169 	seq2ii2[1]= seqLongii5;
1170 
1171 	Sequence< Sequence< Sequence< sal_Int32> > >  seq3ii(2);
1172 	seq3ii[0]=seq2ii;
1173 	seq3ii[1]=seq2ii2;
1174 	seqAny<<= seq3ii;
1175 	inv->invoke( OUString(L"inMulDimArrayLong2"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut);
1176 
1177 	// inMulDimArrayByte2
1178 	sal_Int8 arByteii1[]={1,2,3};
1179 	sal_Int8 arByteii2[]={4,5,6,7};
1180 	sal_Int8 arByteii3[]={8,9,10,11,12};
1181 	sal_Int8 arByteii4[]={13,14,15,16};
1182 	sal_Int8 arByteii5[]={17,18,19};
1183 
1184 	Sequence<sal_Int8> seqByteii1( arByteii1, 3);
1185 	Sequence<sal_Int8> seqByteii2( arByteii2, 4);
1186 	Sequence<sal_Int8> seqByteii3( arByteii3, 5);
1187 	Sequence<sal_Int8> seqByteii4( arByteii4, 4);
1188 	Sequence<sal_Int8> seqByteii5( arByteii5, 3);
1189 
1190 	Sequence< Sequence< sal_Int8 > > seq2Byteii(3);
1191 	Sequence< Sequence< sal_Int8> > seq2Byteii2(2);
1192 	seq2Byteii[0]= seqByteii1;
1193 	seq2Byteii[1]= seqByteii2;
1194 	seq2Byteii[2]= seqByteii3;
1195 
1196 	seq2Byteii2[0]= seqByteii4;
1197 	seq2Byteii2[1]= seqByteii5;
1198 
1199 	Sequence< Sequence< Sequence< sal_Int8> > >  seq3Byteii(2);
1200 	seq3Byteii[0]=seq2Byteii;
1201 	seq3Byteii[1]=seq2Byteii2;
1202 	seqAny<<= seq3Byteii;
1203 	inv->invoke( OUString(L"inMulDimArrayByte2"),Sequence< Any > ( &seqAny, 1), seqIndices, seqOut);
1204 
1205 
1206 
1207 	//###################################################################################
1208 	//###################################################################################
1209 	//###################################################################################
1210 	//	Tests with a MFC ActiveX control, ( pure dispinterface)
1211 	//###################################################################################
1212 
1213 	//###################################################################################
1214 	//	in parameter MFC ActiveX
1215 	//###################################################################################
1216 	// unsigned char is not supported by MFC
1217 	//	aAny <<= ( sal_Int8) 127;
1218 	//	invMfc->invoke( OUString(L"inByte"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1219 	if ( ! invMfc.is())
1220 		return hr;
1221 	aAny <<= static_cast<sal_Int16>(-1);
1222 	aAny= invMfc->invoke( OUString(L"inShort"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1223 
1224 //
1225 	aAny <<= ( sal_Int32) 1234567;
1226 	aAny=invMfc->invoke( OUString(L"inLong"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1227 	sal_Int32 retLong= *(sal_Int32*)aAny.getValue();
1228 
1229 	OUString str_1(L" this is clientTest.exe");
1230 	aAny <<= str_1;
1231 	aAny=invMfc->invoke( OUString(L"inString"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1232 	aAny>>= str_1;
1233 
1234 	aAny <<= ( float) 3.14;
1235 	aAny=invMfc->invoke( OUString(L"inFloat"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1236 
1237 	aAny <<= ( double) 3.145;
1238 	aAny=invMfc->invoke( OUString(L"inDouble"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1239 
1240 	aAny <<= OUString( L" A string in an any");
1241 	aAny=invMfc->invoke( OUString(L"inVariant"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1242 
1243 	// Tests with Sequences later.
1244 	//	OUString arStr4[]= {L"string0", L"string1", L"string2"};
1245 	//	Sequence<OUString> seqStr4( arStr4, 3);
1246 	//	aAny <<= seqStr4;
1247 	//	invMfc->invoke( OUString(L"inArray"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1248 
1249 
1250 	Reference < XInvocation > inv5= getComObject(L"AxTestComponents.Basic");
1251 	Any anyVal4;
1252 	anyVal4 <<= OUString(L"this is the value of prpString");
1253 	inv5->setValue( OUString(L"prpString"), anyVal4);
1254 	aAny <<= inv5;
1255 	aAny=invMfc->invoke( OUString(L"inObject"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1256 //
1257 //	//###################################################################################
1258 //	//	out parameter MFC ActiveX
1259 //	//###################################################################################
1260 //
1261 //	// outShort
1262 	aAny= invMfc->invoke( OUString(L"outShort"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1263 	anyOut<<= seqOut[0];
1264 	sprintf(buff, "MFC outShort %d",  *(sal_Int16*)anyOut.getValue());
1265 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1266 
1267 	// outLong
1268 	aAny= invMfc->invoke( OUString(L"outLong"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1269 	anyOut<<= seqOut[0];
1270 	sprintf(buff, "MFC outLong %d",  *(sal_Int32*)anyOut.getValue());
1271 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1272 
1273 	// outString
1274 	aAny= invMfc->invoke( OUString(L"outString"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1275 	anyOut<<= seqOut[0];
1276 	sprintf(buff, "MFC outString %S",  ((OUString*)anyOut.getValue())->getStr());
1277 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1278 
1279 	// outFloat
1280 	aAny= invMfc->invoke( OUString(L"outFloat"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1281 	anyOut<<= seqOut[0];
1282 	sprintf(buff, "MFC outFloat %f",  *(float*)anyOut.getValue());
1283 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1284 
1285 	// outDouble
1286 	aAny= invMfc->invoke( OUString(L"outDouble"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1287 	anyOut<<= seqOut[0];
1288 	sprintf(buff, "MFC outFloat %f",  *(double*)anyOut.getValue());
1289 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1290 
1291 	// outVariant
1292 	// we expect a string!! ( VT_BSTR)
1293 	aAny= invMfc->invoke( OUString(L"outVariant"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1294 	anyOut<<= seqOut[0];
1295 	sprintf(buff, "MFC outVariant %S", ((OUString*)anyOut.getValue())->getStr());
1296 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1297 
1298 	// outDouble
1299 	aAny= invMfc->invoke( OUString(L"outObject"), Sequence< Any > ( &aAny, 1), seqIndices, seqOut);
1300 	Reference<XInvocation> invOut5;
1301 	seqOut[0]>>= invOut5;
1302 	// we assume that an object of AxTestControls.Basic is being returned.
1303 	anyOut= invOut5->getValue( OUString(L"prpString"));
1304 	OUString tmpStr;
1305 	anyOut>>=tmpStr;
1306 	sprintf(buff, "MFC outObject, property:  %S",  tmpStr.getStr());
1307 	MessageBox( NULL, buff, _T("clientTest"), MB_OK);
1308 
1309 
1310 	//###################################################################################
1311 	//	Sequence parameter MFC ActiveX
1312 	//###################################################################################
1313 	// Sequences are not directly supported.
1314 
1315 
1316 	delete pWin;
1317 	return hr;
1318 
1319 }
1320 
1321 
1322 
1323 //VARIANT_TRUE VT_UI1
1324 
1325 
1326