<!--***********************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 ***********************************************************-->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Developer Studio">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>Document Title</TITLE>
</HEAD>
<BODY id=theBody>

<script language="JScript">
function callOleTest(	 id)
{   
	var factory= new ActiveXObject("com.sun.star.ServiceManager");
	var oletest= factory.createInstance("oletest.OleTest");
//	alert(oletest);
		
	switch( id)
	{
		case 1: // Test simple call of JScript object function from UNO
		oletest.testInterface( new XCallback_Impl, 1);
		break;

		case 2:
		// return value is the parameter object
		oletest.testInterface( new XCallback_Impl, 2);
		break;
		//##################################################
		// OUT parameter
		//##################################################
		case 3: // Test out parameter of type interface
		oletest.testInterface( new XCallback_Impl, 3);
		break;
		case 4: // Test out parameter of type struct
		oletest.testInterface( new XCallback_Impl, 4);
		break;
		case 5: // Test out parameter of type enum
		oletest.testInterface( new XCallback_Impl, 5);
		break;
		case 6: // Test out parameter of type sequence<any>
		oletest.testInterface( new XCallback_Impl, 6);
		break;
		case 7: // Test out parameter of type any
		oletest.testInterface( new XCallback_Impl, 7);
		break;
		case 8: // Test out parameter of type bool
		oletest.testInterface( new XCallback_Impl, 8);
		break;
		case 9: // Test out parameter of type char
		oletest.testInterface( new XCallback_Impl, 9);
		break;
		case 10: // Test out parameter of type string
		oletest.testInterface( new XCallback_Impl, 10);
		break;
		case 11: // Test out parameter of type float
		oletest.testInterface( new XCallback_Impl, 11);
		break;
		case 12: // Test out parameter of type double
		oletest.testInterface( new XCallback_Impl, 12);
		break;
		case 13: // Test out parameter of type byte
		oletest.testInterface( new XCallback_Impl, 13);
		break;
		case 14: // Test out parameter of type short
		oletest.testInterface( new XCallback_Impl, 14);
		break;
		case 15: // Test out parameter of type long
		oletest.testInterface( new XCallback_Impl, 15);
		break;
		case 30: //  outValuesMixed
		oletest.testInterface( new XCallback_Impl, 30);
		break;
		case 31: //  outValuesAll
		oletest.testInterface( new XCallback_Impl, 31);
		break;
		//##################################################
		// IN/OUT parameter
		//##################################################

		case 100: // inoutInterface
		oletest.testInterface( new XCallback_Impl, 100);
		break;
		case 101: // inoutStruct
		oletest.testInterface( new XCallback_Impl, 101);
		break;
		case 102: // inoutEnum
		oletest.testInterface( new XCallback_Impl, 102);
		break;
		case 103: // inoutSeqAny
		oletest.testInterface( new XCallback_Impl, 103);
		break;
		case 104: // inoutAny
		oletest.testInterface( new XCallback_Impl, 104);
		break;
		case 105: // inoutBool
		oletest.testInterface( new XCallback_Impl, 105);
		break;
		case 106: // inoutChar
		oletest.testInterface( new XCallback_Impl, 106);
		break;
		case 107: // inoutString
		oletest.testInterface( new XCallback_Impl, 107);
		break;
		case 108: // inoutFloat
		oletest.testInterface( new XCallback_Impl, 108);
		break;
		case 109: // inoutDouble
		oletest.testInterface( new XCallback_Impl, 109);
		break;
		case 110: // inoutByte
		oletest.testInterface( new XCallback_Impl, 110);
		break;
		case 111: // inoutShort
		oletest.testInterface( new XCallback_Impl, 111);
		break;
		case 112: // inoutLong
		oletest.testInterface( new XCallback_Impl, 112);
		break;
		case 120: // inoutValuesAll
		oletest.testInterface( new XCallback_Impl, 120);
		break;
		case 200: // inValues
		oletest.testInterface( new XCallback_Impl, 200);
		break;

		// Call a COM object that has not been passed as parameter to a UNO component and
		// hence no type information are available in the COM wrapper
//		case 300:
		//##################################################
		// Attributes
		//##################################################
		case 400:
		oletest.testInterface( new XCallback_Impl, 400);
		break;

		case 1000:
		oletest.testInterface2(new MultiInterface(), 0);
		break;
	}

}



// The class --------------------------------------------

function XCallback_Impl()
{
	
	// XCallback
	this._environment= "JScript";

	this.func1= XCallback_Impl_func1;
	this.returnInterface= XCallback_Impl_returnInterface;
	// #################################################
	// OUT parameter
	//###################################################
	this.outInterface= XCallback_Impl_outInterface;
	this.outStruct= XCallback_Impl_outStruct;
	this.outEnum= XCallback_Impl_outEnum;
	this.outSeqAny= XCallback_Impl_outSeqAny;
	this.outAny= XCallback_Impl_outAny;
	this.outBool= XCallback_Impl_outBool;
	this.outChar= XCallback_Impl_outChar;
	this.outString= XCallback_Impl_outString;
	this.outFloat= XCallback_Impl_outFloat;
	this.outDouble= XCallback_Impl_outDouble;
	this.outByte= XCallback_Impl_outByte;
	this.outShort= XCallback_Impl_outShort;
	this.outLong= XCallback_Impl_outLong;
	this.outValuesMixed= XCallback_Impl_outValuesMixed;
	this.outValuesAll= XCallback_Impl_outValuesAll;
	// #################################################
	// IN/ OUT parameter
	//###################################################
	this.inoutInterface= XCallback_Impl_inoutInterface;
	this.inoutStruct= XCallback_Impl_inoutStruct;
	this.inoutEnum= XCallback_Impl_inoutEnum;
	this.inoutSeqAny= XCallback_Impl_inoutSeqAny;
	this.inoutAny= XCallback_Impl_inoutAny;
	this.inoutBool= XCallback_Impl_inoutBool;
	this.inoutChar= XCallback_Impl_inoutChar;
	this.inoutString= XCallback_Impl_inoutString;
	this.inoutFloat= XCallback_Impl_inoutFloat;
	this.inoutDouble= XCallback_Impl_inoutDouble;
	this.inoutByte= XCallback_Impl_inoutByte;
	this.inoutShort= XCallback_Impl_inoutShort;
	this.inoutLong= XCallback_Impl_inoutLong;
	this.inoutValuesAll= XCallback_Impl_inoutValuesAll;
	// #################################################
	// IN parameter
	//##################################################
	this.inValues= XCallback_Impl_inValues;

	// #################################################
	// Attributes
	//##################################################
	this.simple= new XSimple_Impl();


}


function XCallback_Impl_func1()
{
	alert("XCallback_Impl_func1");
}
function XCallback_Impl_returnInterface()
{
	alert("XCallback::returnInterface called");
	return new XSimple_Impl();
}

function XCallback_Impl_outInterface( outVal)
{
	outVal[0]= new XSimple_Impl();
}

function XCallback_Impl_outLong( outVal)
{
	alert("outLong");
}
function XCallback_Impl_outStruct( outVal)
{
	var factory= new ActiveXObject("com.sun.star.ServiceManager");
    var starCoreReflection = factory.createInstance("com.sun.star.reflection.CoreReflection");
    var structClass = starCoreReflection.forName("oletest.SimpleStruct");
	var outParam= new Array();
	structClass.createObject(outParam);
	var aStruct= outParam[0];
	aStruct.message= "a Struct created in JScript";
	outVal[0]= aStruct;

}
function XCallback_Impl_outEnum( outVal)
{
	outVal[0]= 2;
}
function XCallback_Impl_outSeqAny( outVal)
{
	var ar= new Array(1,2,3);
	outVal[0]= ar;
}
function XCallback_Impl_outAny( outVal)
{
	outVal[0]= "this is an Any";
}
function XCallback_Impl_outBool( outVal)
{
	outVal[0]= true;
} 
function XCallback_Impl_outChar( outVal)
{
	outVal[0]= "a";
}
function XCallback_Impl_outString( outVal)
{
	outVal[0]= "This string was created in JScript";
}
function XCallback_Impl_outFloat( outVal)
{
	outVal[0]= 3.14;
}
function XCallback_Impl_outDouble( outVal)
{
	outVal[0]= 3.145;
}
function XCallback_Impl_outByte( outVal)
{
	outVal[0]= 100;
}
function XCallback_Impl_outShort( outVal)
{
	outVal[0]= 1000;
}
function XCallback_Impl_outLong( outVal)
{
	outVal[0]= 1000000;
}
function XCallback_Impl_outValuesMixed( inLong, outLong, inString)
{
	alert("inVal long: " + inLong +" inString:" + inString);
	outLong[0]= inLong + 1;
}
function XCallback_Impl_outValuesAll( xSimple, aSimpleStruct, aSimpleEnum, seqAny, aAny, aBool,
				aChar, aString, aFloat, aDouble, aByte, aShort, aLong)
{
	this.outInterface( xSimple);
	this.outStruct( aSimpleStruct);
	this.outEnum( aSimpleEnum);
	this.outSeqAny( seqAny);
	this.outAny( aAny);
	this.outBool( aBool);
	this.outChar( aChar);
	this.outString( aString);
	this.outFloat( aFloat);
	this.outDouble( aDouble);
	this.outByte( aByte);
	this.outShort( aShort);
	this.outLong( aLong);
}

function XCallback_Impl_inoutInterface( val)
{
	val[0].func("calling on in parameter");
	val[0]= new XSimple_Impl();
}
function XCallback_Impl_inoutStruct( val)
{
	alert( val[0].message);
	val[0].message= "property message changed in JScript";
}
function XCallback_Impl_inoutEnum(val)
{
	alert("enum value +" + val);
	val[0]= 2;
}
function XCallback_Impl_inoutSeqAny( val)
{
	var vbar = new VBArray(val[0]);
	var seq= vbar.toArray();
	alert( seq[0] +" "+seq[1] +" " +seq[2]);
	val[0]= new Array("jscript1", "jscript2","jscript3");
}
function XCallback_Impl_inoutAny(val)
{
	alert( "JScript in any: " + val[0]);
	val[0]= "a string from JScript";
}
function XCallback_Impl_inoutBool(val)
{
	alert( "JScript in bool: " + val[0]);
	val[0]= true;
}
function XCallback_Impl_inoutChar(val)
{
	alert( "JScript in char: " + val[0]);
	val[0]= 'b';
}
function XCallback_Impl_inoutString(val)
{
	alert( "JScript in string: " + val[0]);
	val[0]= " a JScript string";
}
function XCallback_Impl_inoutFloat(val)
{
	alert( "JScript in float: " + val[0]);
	val[0]= 4.14;
}
function XCallback_Impl_inoutDouble(val)
{
	alert( "JScript in double: " + val[0]);
	val[0]= 4.145;
}

function XCallback_Impl_inoutByte(val)
{
	alert( "JScript in byte: " + val[0]);
	val[0]= 100;
}
function XCallback_Impl_inoutShort(val)
{
	alert( "JScript in short: " + val[0]);
	val[0]= 1000;
}
function XCallback_Impl_inoutLong(val)
{
	alert( "JScript in long: " + val[0]);
	val[0]= 100000;
}
function XCallback_Impl_inoutValuesAll(aXSimple, aStruct, aEnum, aSeq, 
			aAny, aBool, aChar, aString,  aFloat, aDouble, 
			aByte, aShort,  aLong )
{
	this.inoutInterface( aXSimple);
	this.inoutStruct( aStruct);
	this.inoutEnum( aEnum);
	this.inoutSeqAny( aSeq);
	this.inoutAny( aAny);
	this.inoutBool( aBool);
	this.inoutChar( aChar);
	this.inoutString( aString);
	this.inoutFloat( aFloat);
	this.inoutDouble( aDouble);
	this.inoutByte( aByte);
	this.inoutShort( aShort);
	this.inoutLong( aLong);
}

function XCallback_Impl_inValues( aChar, aLong, aString)
{
	alert( "char : " + aChar + " long: " + aLong + " string: " + aString);
}


//################################################################
// class MultiInterface implements XSimple, XSimple2, XSimple3
//################################################################
function MultiInterface()
{
	this._environment= "JScript";
	this._implementedInterfaces= new Array( "oletest.XSimple", "oletest.XSimple2", "oletest.XSimple3");
	// XSimple ---------------
	this.getName= MultiInterface_getName;
	this.func= MultiInterface_func;
	this.func2= MultiInterface_func2;
	this.func3= MultiInterface_func3;
	// XSimple2
	this.getName2= MultiInterface_getName2;	
	// XSimple3
	this.getName3= MultiInterface_getName3;
}


function MultiInterface_getName()
{
	return "JScript XSimple called";
}
function MultiInterface_func( message)
{
	alert("JScript object (XSimple)-- " + message);
}

function MultiInterface_getName2()
{
	return "JScript XSimple2 called";
}
function MultiInterface_func2( message)
{
	alert("JScript object (XSimple2) -- " + message);
}

function MultiInterface_getName3()
{
	return "JScript XSimple3 called";
}
function MultiInterface_func3( message)
{
	alert("JScript object (XSimple3) -- " + message);
}




//XCallback_Impl_outValuesMixed( val1, outval, val2)
//{
//}
//XCallback_Impl_outValuesAll( xSimple, aSimpleStruct, aSimpleEnum, seqAny, aAny, aBool,
//				aChar, aString, aFloat, aDouble, aByte, aShort, aLong, aUShort, aULong)
//{
//	
//}



//  class XSimple_Impl----------------------------------------------------------------------
function XSimple_Impl()
{
	//XSimple
	this.func= XSimple_Impl_func;
}	
function XSimple_Impl_func( message)
{
	alert( "XSimple called." + message);
}


</script>



<h2> Object in JScript</h2>

This test passes a XCallback to an UNO function of the UNO test control.
XCallback is implemented by the JScript class XCallback_Impl. The function
XCallback::func1 is then called from the UNO test control.
<br>
<button onclick='callOleTest( 1)'>go</Button>
<br>
On the UNO object the function testInterface is called which takes
a XCallback as parameter. XCallback is implemented in a JScript object.The function
returns a XSimple Interface. Then the UNO object calls XSimple::notify. This test shall
verify the correct conversion of the return value( IDispatch JScript object) to an XSimple object.<br>
<button onclick='callOleTest( 2)'>go</Button>
<br>
<h1> out parameter </h1>
The a JScript object of class XCallback_Impl is passed to the UNO OleTest Control as parameter. 
According to the buttons the OleTest object calls a function on XCallback_Impl that has appropriate type
as out parameter.<br>
<button onclick='callOleTest( 3)'>interface</Button>
<button onclick='callOleTest( 4)'>struct</Button>
<button onclick='callOleTest( 5)'>enum</Button>
<button onclick='callOleTest( 6)'>sequence&lt;any&gt;</Button>
<button onclick='callOleTest( 7)'>any</Button>
<button onclick='callOleTest( 8)'>bool</Button>
<button onclick='callOleTest( 9)'>char</Button>
<button onclick='callOleTest( 10)'>string</Button>
<button onclick='callOleTest( 11)'>float</Button>
<button onclick='callOleTest( 12)'>double</Button>
<button onclick='callOleTest( 13)'>byte</Button>
<button onclick='callOleTest( 14)'>short</Button>
<button onclick='callOleTest( 15)'>long</Button>
<br>
Other test with out parameters <br>
<button onclick='callOleTest( 30)'>outValuesMixed</Button>
<button onclick='callOleTest( 31)'>outValuesAll</Button>
<h1> in out parameter </h1>
<button onclick='callOleTest( 100)'>interface</Button>
<button onclick='callOleTest( 101)'>struct</Button>
<button onclick='callOleTest( 102)'>enum</Button>
<button onclick='callOleTest( 103)'>seqence&lt;any&gt;</Button>
<button onclick='callOleTest( 104)'>any</Button>
<button onclick='callOleTest( 105)'>bool</Button>
<button onclick='callOleTest( 106)'>char</Button>
<button onclick='callOleTest( 107)'>string</Button>
<button onclick='callOleTest( 108)'>float</Button>
<button onclick='callOleTest( 109)'>double</Button>
<button onclick='callOleTest( 110)'>byte</Button>
<button onclick='callOleTest( 111)'>short</Button>
<button onclick='callOleTest( 112)'>long</Button>
<br>
<h1> Attributes </h1>
<button onclick='callOleTest( 400)'>getting XSimple</Button>
<br>

Other tests with inout parameters <br>
<button onclick='callOleTest( 120)'>inoutValuesAll</Button>
<h1>in parameters </h1>
<button onclick='callOleTest( 200)'>inValues</Button>

<h1> JScript object implements several interfaces </h1>
<button onclick='callOleTest( 1000)'>go</Button>




</body>
</html>