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