/**************************************************************
 * 
 * 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_dtrans.hxx"

//------------------------------------------------------------------------
// includes
//------------------------------------------------------------------------
#include <osl/diagnose.h>
#include "TxtCnvtHlp.hxx"
#include "DTransHelper.hxx"
#include "..\misc\ImplHelper.hxx"

using namespace ::com::sun::star::datatransfer;
using namespace ::com::sun::star::uno;

//------------------------------------------------------------------
// assuming a '\0' terminated string if no length specified
//------------------------------------------------------------------

int CalcBuffSizeForTextConversion( UINT code_page, LPCSTR lpMultiByteString, int nLen = -1 )
{
	return ( MultiByteToWideChar( code_page,
								0,
								lpMultiByteString,
								nLen,
								NULL,
								0 ) * sizeof( sal_Unicode ) );
}

//------------------------------------------------------------------
// assuming a '\0' terminated string if no length specified
//------------------------------------------------------------------

int CalcBuffSizeForTextConversion( UINT code_page, LPCWSTR lpWideCharString, int nLen = -1 )
{
	return WideCharToMultiByte( code_page,
								0,
								lpWideCharString,
								nLen,
								NULL,
								0,
								NULL,
								NULL );
}

//------------------------------------------------------------------
// converts text in one code page into unicode text
// automatically calculates the necessary buffer size and allocates
// the buffer
//------------------------------------------------------------------

int MultiByteToWideCharEx( UINT cp_src, 
						   LPCSTR lpMultiByteString, 
						   sal_uInt32 lenStr,
						   CStgTransferHelper& refDTransHelper,
						   BOOL bEnsureTrailingZero )
{
	OSL_ASSERT( IsValidCodePage( cp_src ) );
	OSL_ASSERT( NULL != lpMultiByteString );

	// calculate the required buff size 
	int reqSize = CalcBuffSizeForTextConversion( cp_src, lpMultiByteString, lenStr );
	
	if ( bEnsureTrailingZero )
		reqSize += sizeof( sal_Unicode );

	// initialize the data-transfer helper
	refDTransHelper.init( reqSize );

	// setup a global memory pointer
	CRawHGlobalPtr ptrHGlob( refDTransHelper );

	// do the converssion an return 
	return MultiByteToWideChar( cp_src, 
								0, 
								lpMultiByteString,
								lenStr,
								static_cast< LPWSTR >( ptrHGlob.GetMemPtr( ) ),
								ptrHGlob.MemSize( ) );
}

//------------------------------------------------------------------
// converts unicode text into text of the specified code page
// automatically calculates the necessary buffer size and allocates
// the buffer
//------------------------------------------------------------------

int WideCharToMultiByteEx( UINT cp_dest, 
						   LPCWSTR lpWideCharString, 
						   sal_uInt32 lenStr,
						   CStgTransferHelper& refDTransHelper,
						   BOOL bEnsureTrailingZero )
{
	OSL_ASSERT( IsValidCodePage( cp_dest ) );
	OSL_ASSERT( NULL != lpWideCharString );

	// calculate the required buff size 
	int reqSize = CalcBuffSizeForTextConversion( cp_dest, lpWideCharString, lenStr );

	if ( bEnsureTrailingZero )
		reqSize += sizeof( sal_Int8 );

	// initialize the data-transfer helper
	refDTransHelper.init( reqSize );

	// setup a global memory pointer
	CRawHGlobalPtr ptrHGlob( refDTransHelper );

	// do the converssion an return 
	return WideCharToMultiByte( cp_dest,
								0,
								lpWideCharString,
								lenStr,
								static_cast< LPSTR >( ptrHGlob.GetMemPtr( ) ),
								ptrHGlob.MemSize( ),
								NULL,
								NULL );
}