/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_stoc.hxx"

#include <sal/main.h>
#include <osl/diagnose.h>
#include <rtl/ustrbuf.hxx>
#include <cppuhelper/servicefactory.hxx>

#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/script/XTypeConverter.hpp>
#include <com/sun/star/reflection/FieldAccessMode.hpp>
#include <com/sun/star/registry/XImplementationRegistration.hpp>

#include <float.h>
#include <stdio.h>


using namespace rtl;
using namespace cppu;
using namespace osl;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::script;
using namespace com::sun::star::reflection;
using namespace com::sun::star::registry;

const double MIN_DOUBLE		= -DBL_MAX;
const double MAX_DOUBLE		= DBL_MAX;
const double MIN_FLOAT		= -FLT_MAX;
const double MAX_FLOAT		= FLT_MAX;

//==================================================================================================
static void printValue( const Any & rVal )
{
	// print value
	OString aStr( OUStringToOString( rVal.getValueType().getTypeName(), RTL_TEXTENCODING_ISO_8859_1 ) );
	printf( "(%s)", aStr.getStr() );

	switch (rVal.getValueTypeClass())
	{
	case TypeClass_VOID:
		printf( "void" );
		break;
	case TypeClass_ANY:
		if (rVal.hasValue())
			printValue( *(Any *)rVal.getValue() );
		break;
	case TypeClass_BOOLEAN:
		printf( "%s", (*(sal_Bool *)rVal.getValue() ? "true" : "false") );
		break;
	case TypeClass_CHAR:
	{
		char ar[2];
		ar[0] = (char)*(sal_Unicode *)rVal.getValue();
		ar[1] = 0;
		printf( ar );
		break;
	}
	case TypeClass_BYTE:
		printf( "%x", (int)*(sal_Int8 *)rVal.getValue() );
		break;
	case TypeClass_SHORT:
		printf( "%x", *(sal_Int16 *)rVal.getValue() );
		break;
	case TypeClass_UNSIGNED_SHORT:
		printf( "%x", *(sal_uInt16 *)rVal.getValue() );
		break;
	case TypeClass_LONG:
		printf( "%lx", static_cast<long>(*(sal_Int32 *)rVal.getValue()) );
		break;
	case TypeClass_UNSIGNED_LONG:
		printf( "%lx", static_cast<unsigned long>(*(sal_uInt32 *)rVal.getValue()) );
		break;
	case TypeClass_HYPER:
		printf( "%lx", (long)*(sal_Int64 *)rVal.getValue() );
		break;
	case TypeClass_UNSIGNED_HYPER:
		printf( "%lx", (unsigned long)*(sal_uInt64 *)rVal.getValue() );
		break;
	case TypeClass_FLOAT:
		printf( "%f", *(float *)rVal.getValue() );
		break;
	case TypeClass_DOUBLE:
		printf( "%g", *(double *)rVal.getValue() );
		break;
	case TypeClass_STRING:
	{
		OString aStr2( OUStringToOString( *(OUString *)rVal.getValue(), RTL_TEXTENCODING_ISO_8859_1 ) );
		printf( aStr2.getStr() );
		break;
	}
	case TypeClass_ENUM:
	{
		typelib_EnumTypeDescription * pEnumTD = 0;
		TYPELIB_DANGER_GET( (typelib_TypeDescription **)&pEnumTD, rVal.getValueTypeRef() );

		for ( sal_Int32 nPos = pEnumTD->nEnumValues; nPos--; )
		{
			if (pEnumTD->pEnumValues[nPos] == *(int *)rVal.getValue())
			{
				printf( OUStringToOString(pEnumTD->ppEnumNames[nPos]->buffer, RTL_TEXTENCODING_ASCII_US).getStr() );
				TYPELIB_DANGER_RELEASE( (typelib_TypeDescription *)pEnumTD );
				return;
			}
		}
		TYPELIB_DANGER_RELEASE( (typelib_TypeDescription *)pEnumTD );
		printf( ">ENUM not found!<" );
		break;
	}
	case TypeClass_SEQUENCE:
	{
		uno_Sequence * pSeq = *(uno_Sequence **)rVal.getValue();
		typelib_TypeDescription * pSeqTD = 0;
		TYPELIB_DANGER_GET( &pSeqTD, rVal.getValueTypeRef() );
		typelib_TypeDescription * pElemTD = 0;
		TYPELIB_DANGER_GET( &pElemTD, ((typelib_IndirectTypeDescription *)pSeqTD)->pType );

		sal_Int32 nLen = pSeq->nElements;
		if (nLen)
		{
			printf( "{ " );
			for ( sal_Int32 nPos = 0; nPos < nLen; ++nPos )
			{
				printValue( Any( ((char *)pSeq->elements) + (nPos * pElemTD->nSize), pElemTD ) );
				if (nPos < (nLen-1))
					printf( ", " );
			}
			printf( " }" );
		}

		TYPELIB_DANGER_RELEASE( pElemTD );
		TYPELIB_DANGER_RELEASE( pSeqTD );
		break;
	}

	default:
		printf( ">not printable<" );
		break;
	}
}

static Reference< XTypeConverter > s_xConverter;

//==================================================================================================
static sal_Bool convertTo( const Type & rDestType, const Any & rVal, sal_Bool bExpectSuccess )
{
	sal_Bool bCanConvert = sal_False;
	Any aRet;

	OString aExcMsg;

	try
	{
		aRet = s_xConverter->convertTo( rVal, rDestType );
		bCanConvert = sal_True;
	}
	catch (Exception & rExc)
	{
		aExcMsg = OUStringToOString( rExc.Message, RTL_TEXTENCODING_ASCII_US );
	}

	if (bExpectSuccess && !bCanConvert)
	{
		printf( "# conversion of " );
		printValue( rVal );
		printf( " to " );
		printf( OUStringToOString(rDestType.getTypeName(), RTL_TEXTENCODING_ASCII_US).getStr() );
		printf( " failed, but success was expected! [" );
		printf( aExcMsg.getStr() );
		printf( "]\n" );
		aRet = s_xConverter->convertTo( rVal, rDestType );
#if OSL_DEBUG_LEVEL > 1
		// for debugging, to trace again
		try
		{
			aRet = s_xConverter->convertTo( rVal, rDestType );
		}
		catch (Exception &)
		{
		}
#endif
		return sal_False;
	}
	if (!bExpectSuccess && bCanConvert)
	{
		printf( "# conversion of " );
		printValue( rVal );
		printf( " to " );
		printValue( aRet );
		printf( " was successful, but was not expected to be!\n" );
#if OSL_DEBUG_LEVEL > 1
		// for debugging, to trace again
		aRet = s_xConverter->convertTo( rVal, rDestType );
#endif
		return sal_False;
	}

#ifdef __RECONVERSION_OUTPUT__
//= re-conversion output =
	if (bCanConvert)
	{
		// re convert to original type
		sal_Bool bReConvert = sal_False;
		Any aRet2;

		try
		{
			aRet2 = s_xConverter->convertTo( aRet, rVal.getValueType() );
			bReConvert = sal_True;
		}
		catch (Exception & rExc)
		{
			aExcMsg = OUStringToOString( rExc.Message, RTL_TEXTENCODING_ISO_8859_1 );
		}

		if (bReConvert)
		{
			if (rVal != aRet2)
			{
				printf( "# re-conversion of " );
				printValue( rVal );
				printf( " to " );
				printValue( aRet );
				printf( " to " );
				printValue( aRet2 );
				printf( ": first and last do not match!\n" );
			}
		}
		else
		{
			printf( "# re-conversion of " );
			printValue( aRet );
			printf( " to " );
			printf( rVal.getValueType().getTypeName().getStr() );
			printf( " failed! [" );
			printf( aExcMsg.getStr() );
			printf( "]\n" );
		}
	}
#endif

	return sal_True;
}


//==================================================================================================
typedef struct _ConvBlock
{
	Any			_value;
	sal_Bool	_toString, _toDouble, _toFloat;
	sal_Bool	_toUINT32, _toINT32, _toUINT16, _toINT16, _toBYTE, _toBOOL, _toChar;
	sal_Bool	_toTypeClass, _toSeqINT16, _toSeqAny;

	_ConvBlock()
	{
	}
	_ConvBlock( const Any & rValue_,
				sal_Bool toString_, sal_Bool toDouble_, sal_Bool toFloat_,
				sal_Bool toUINT32_, sal_Bool toINT32_, sal_Bool toUINT16_, sal_Bool toINT16_,
				sal_Bool toBYTE_, sal_Bool toBOOL_, sal_Bool toChar_,
				sal_Bool toTypeClass_, sal_Bool toSeqINT16_, sal_Bool toSeqAny_ )
		: _value( rValue_ )
		, _toString( toString_ ), _toDouble( toDouble_ ), _toFloat( toFloat_ )
		, _toUINT32( toUINT32_ ), _toINT32( toINT32_ ), _toUINT16( toUINT16_ ), _toINT16( toINT16_ )
		, _toBYTE( toBYTE_ ), _toBOOL( toBOOL_ ), _toChar( toChar_ )
		, _toTypeClass( toTypeClass_ ), _toSeqINT16( toSeqINT16_ ), _toSeqAny( toSeqAny_ )
	{
	}
} ConvBlock;


//==================================================================================================
static sal_Int32 initBlocks( ConvBlock * pTestBlocks )
{
	Any aVal;

	sal_uInt32 nElems = 0;

	// ==BYTE==
	aVal <<= OUString::createFromAscii( "0xff" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "255" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_Int8)0xffu;
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "0x80" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "128" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_Int8)( 0x80u );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "0x7f" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "127" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= (sal_Int8)( 0x7f );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "5" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "+5" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= (sal_Int8)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "-5" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int8)( -5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "256" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==UINT16==
	aVal <<= OUString::createFromAscii( "65535" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0xffff" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt16)( 0xffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "32768" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt16)( 0x8000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "32767" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0x7fff" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt16)( 0x7fff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "256" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0x100" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt16)( 0x100 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_uInt16)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_uInt16)( -5 ); // is 0xfffb
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==INT16==
	aVal <<= (sal_Int16)( -1 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int16)( -0x8000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int16)( 0x7fff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int16)( 0x100 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int16)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int16)( -5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==UINT32==
	aVal <<= OUString::createFromAscii( "+4294967295" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "4294967295" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0xffffffff" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt32)( 0xffffffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "-2147483648" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "-0x80000000" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_uInt32)( 0x80000000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "2147483647" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0x7fffffff" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt32)( 0x7fffffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "65536" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= OUString::createFromAscii( "0x10000" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt32)( 0x10000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_uInt32)( 0x8000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_uInt32)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "0xfffffffb" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (sal_uInt32)( -5 ); // is 0xfffffffb
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==INT32==
	aVal <<= (sal_Int32)( 0xffffffff ); // is -1
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( 0x80000000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( 0x7fffffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( 0x10000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( -0x8001 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (sal_Int32)( -5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==FLOAT==
	aVal <<= OUString::createFromAscii( "-3.4e+38" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (float)( MIN_FLOAT );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "+3.4e+38" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (float)( MAX_FLOAT );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "9e-20" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= (float)( 9e-20 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "+.7071067811865" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= (float)( .7071067811865 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "3.14159265359" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
	aVal <<= (float)( 3.14159265359 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (float)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==DOUBLE==
	aVal <<= OUString::createFromAscii( "-1.7976931348623155e+308" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (double)( MIN_DOUBLE );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "1.7976931348623155e+308" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
	aVal <<= (double)( MAX_DOUBLE );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( MIN_FLOAT );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( MAX_FLOAT );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( -((double)0x80000000) );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( -((double)0x80000001) );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( 0x7fffffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( 0x80000000 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( 0xffffffff );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "0x100000000" );
    pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
#ifndef OS2
	aVal <<= (double)( SAL_CONST_INT64(0x100000000) );
    pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
#endif
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= (double)( 5 );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==CHAR==
	sal_Unicode c = 'A';
	aVal.setValue( &c, ::getCharCppuType() );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "A" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==BOOL==
	aVal <<= OUString::createFromAscii( "0" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "1" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "False" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "true" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa

	sal_Bool bTmp = sal_True;
	aVal.setValue( &bTmp, getBooleanCppuType() );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==ZERO STRINGS==
	aVal <<= OUString();
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "-" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "-0" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==TYPECLASS ENUM==
	aVal <<= OUString::createFromAscii( "eNuM" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal <<= OUString::createFromAscii( "DOUBLE" );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	int e = 1;
	aVal.setValue( &e, ::getCppuType( (const TypeClass *)0 ) );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	aVal.setValue( &e, ::getCppuType( (const FieldAccessMode *)0 ) );
	pTestBlocks[nElems++] = ConvBlock( aVal, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==SEQ of INT==
	Sequence< sal_Int32 > aINT32Seq( 3 ), aINT32Seq2( 3 );
	sal_Int32 * pINT32Seq = aINT32Seq.getArray();
	pINT32Seq[0]	 = -32768;
	pINT32Seq[1]	 = 0;
	pINT32Seq[2]	 = 32767;
	aVal <<= aINT32Seq;
	pTestBlocks[nElems++] = ConvBlock( aVal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	pINT32Seq = aINT32Seq2.getArray();
	pINT32Seq[0]	 = -32768;
	pINT32Seq[1]	 = -32769;
	pINT32Seq[2]	 = 32767;
	aVal <<= aINT32Seq2;
	pTestBlocks[nElems++] = ConvBlock( aVal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	// ==SEQ of ANY==
	Sequence< Any > aAnySeq( 2 ), aAnySeq2( 2 ), aAnySeq3( 2 );
	Any * pAnySeq	 = aAnySeq.getArray();
	pAnySeq[0]		 = makeAny( aINT32Seq );
	pAnySeq[1]		 = makeAny( OUString::createFromAscii("lala") );
	aVal <<= aAnySeq;
	pTestBlocks[nElems++] = ConvBlock( aVal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	pAnySeq = aAnySeq2.getArray();
	pAnySeq[0]		 <<= (sal_Int32)4711;
	pAnySeq[1]		 <<= OUString::createFromAscii("0815");
	aVal <<= aAnySeq2;
	pTestBlocks[nElems++] = ConvBlock( aVal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	pAnySeq = aAnySeq3.getArray();
	pAnySeq[0]		 <<= OUString::createFromAscii("TypeClass_UNION");
	pAnySeq[1]		 <<= OUString::createFromAscii("TypeClass_ENUM");
	aVal <<= aAnySeq3;
	pTestBlocks[nElems++] = ConvBlock( aVal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 );
										 // st,do,fl,u3,i3,u1,i1,by,bo,ch,tc,si,sa
	return nElems;
}

//==================================================================================================
static void test_Conversion( const Reference< XMultiServiceFactory > & xMgr )
{
	printf( "test_Conversion(): start...\n" );

	Reference< XTypeConverter > xConverter( xMgr->createInstance(
		OUString::createFromAscii( "com.sun.star.script.Converter" ) ), UNO_QUERY );

	ConvBlock * pTestBlocks = new ConvBlock[256];
	sal_Int32 nPos = initBlocks( pTestBlocks );

	s_xConverter = xConverter;
	while (nPos--)
	{
		const ConvBlock& rBlock = pTestBlocks[nPos];
		const Any & rVal		= rBlock._value;

		convertTo( ::getCppuType( (const OUString *)0 ), rVal, rBlock._toString );
		convertTo( ::getCppuType( (const float *)0 ), rVal, rBlock._toFloat );
		convertTo( ::getCppuType( (const double *)0 ), rVal, rBlock._toDouble );
		convertTo( ::getCppuType( (const sal_uInt32 *)0 ), rVal, rBlock._toUINT32 );
		convertTo( ::getCppuType( (const sal_Int32 *)0 ), rVal, rBlock._toINT32 );
		convertTo( ::getCppuType( (const sal_uInt16 *)0 ), rVal, rBlock._toUINT16 );
		convertTo( ::getCppuType( (const sal_Int16 *)0 ), rVal, rBlock._toINT16 );
		convertTo( ::getCppuType( (const sal_Int8 *)0 ), rVal, rBlock._toBYTE );
		convertTo( ::getBooleanCppuType(), rVal, rBlock._toBOOL );
		convertTo( ::getCharCppuType(), rVal, rBlock._toChar );
		convertTo( ::getCppuType( (const TypeClass *)0 ), rVal, rBlock._toTypeClass );
		convertTo( ::getCppuType( (const Sequence< sal_Int16 > *)0 ), rVal, rBlock._toSeqINT16 );
		convertTo( ::getCppuType( (const Sequence< Any > *)0 ), rVal, rBlock._toSeqAny );

		convertTo( ::getVoidCppuType(), rVal, sal_True ); // anything converts to void
	}
	s_xConverter.clear();

	delete [] pTestBlocks;

	Any aRet;
	aRet = xConverter->convertTo( Any( &xMgr, ::getCppuType( (const Reference< XMultiServiceFactory > *)0 ) ),
								  ::getCppuType( (const Reference< XServiceInfo > *)0 ) );
	aRet = xConverter->convertTo( aRet, ::getCppuType( (const Reference< XMultiServiceFactory > *)0 ) );
	aRet = xConverter->convertTo( aRet, ::getCppuType( (const Reference< XServiceInfo > *)0 ) );
	aRet <<= SAL_CONST_INT64(0x7fffffffffffffff);
	aRet = xConverter->convertTo( aRet, ::getCppuType( (const sal_uInt64 *)0 ) );
	OSL_ASSERT( *(const sal_uInt64 *)aRet.getValue() == SAL_CONST_UINT64(0x7fffffffffffffff) );
	aRet <<= SAL_CONST_UINT64(0xffffffffffffffff);
	aRet = xConverter->convertTo( aRet, ::getCppuType( (const sal_uInt64 *)0 ) );
	OSL_ASSERT( *(const sal_uInt64 *)aRet.getValue() == SAL_CONST_UINT64(0xffffffffffffffff) );
	aRet <<= SAL_CONST_INT64(-1);
	aRet = xConverter->convertTo( aRet, ::getCppuType( (const sal_Int8 *)0 ) );
	OSL_ASSERT( *(const sal_Int8 *)aRet.getValue() == (-1) );
	printf( "test_Conversion(): end.\n" );
}

SAL_IMPLEMENT_MAIN()
{
	Reference< XMultiServiceFactory > xMgr( createRegistryServiceFactory( OUString::createFromAscii("stoctest.rdb") ) );

	try
	{
		Reference< XImplementationRegistration > xImplReg(
			xMgr->createInstance( OUString::createFromAscii("com.sun.star.registry.ImplementationRegistration") ), UNO_QUERY );
		OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
		
		OUString aLibName(
            RTL_CONSTASCII_USTRINGPARAM("stocservices.uno" SAL_DLLEXTENSION) );
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			aLibName, Reference< XSimpleRegistry >() );

		test_Conversion( xMgr );
	}
	catch (Exception & rExc)
	{
		OSL_ENSURE( sal_False, "### exception occured!" );
		OString aMsg( OUStringToOString( rExc.Message, RTL_TEXTENCODING_ASCII_US ) );
		OSL_TRACE( "### exception occured: " );
		OSL_TRACE( aMsg.getStr() );
		OSL_TRACE( "\n" );
	}

	Reference< XComponent >( xMgr, UNO_QUERY )->dispose();
	return 0;
}
