syncmlfw/common/syncagent/src/nsmlunicodeconverter.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/syncagent/src/nsmlunicodeconverter.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,142 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  UNICODE conversion
+*
+*/
+
+
+#include <utf.h>
+#include <nsmlunicodeconverter.h>
+#include "nsmlcliagconstants.h"
+// ---------------------------------------------------------
+// NSmlUnicodeConverter::HBufC8InUTF8LC()
+// Converts Unicode data to UTF-8
+// No size limitations, this function re-allocates memory
+// when needed. Note that a pointer given as a parameter is updated.
+// ---------------------------------------------------------
+EXPORT_C TInt NSmlUnicodeConverter::HBufC8InUTF8LC( const TDesC& aUnicodeData, HBufC8*& aUTF8Data )
+	{
+	TPtr8 outputBuffer = HBufC8::NewLC( KNSmlConvBufferSize )->Des(); 
+	TPtrC16 remainderOfUnicodeText( aUnicodeData );
+	TInt convertedDataLength( 0 );
+	HBufC8* convertedData = HBufC8::NewL( aUnicodeData.Length() );
+	HBufC8* oldPointer = NULL;
+	TInt returnValue( 0 );
+	TInt pushed( 0 );
+	do
+		{
+		returnValue = CnvUtfConverter::ConvertFromUnicodeToUtf8( outputBuffer, remainderOfUnicodeText );
+		if ( returnValue==CnvUtfConverter::EErrorIllFormedInput )
+			{
+			delete convertedData;
+            User::Leave( KErrCorrupt );
+			}
+        else if ( returnValue < 0 ) 
+			{
+            delete convertedData;
+			User::Leave( KErrGeneral );
+			}
+		if ( outputBuffer.Size() > 0 )
+			{
+			convertedDataLength += outputBuffer.Length();
+			if ( convertedDataLength > convertedData->Des().MaxLength() )
+				{
+				oldPointer = convertedData;
+				convertedData = convertedData->ReAlloc( convertedDataLength );
+				if ( convertedData == NULL )
+					{
+					delete oldPointer;
+					User::Leave( KErrNoMemory );
+					}
+				}
+			convertedData->Des().Append( outputBuffer );
+			}
+		if ( returnValue > 0 )
+			{
+			remainderOfUnicodeText.Set( remainderOfUnicodeText.Right( returnValue ) );
+			}
+		}
+		while ( returnValue > 0 ); 
+	CleanupStack::PopAndDestroy(); //outputBuffer
+	aUTF8Data = convertedData;
+	CleanupStack::PushL( aUTF8Data );
+	pushed++;
+	return pushed;
+	}
+// ---------------------------------------------------------
+// NSmlUnicodeConverter::HBufC16InUnicodeL()
+// 
+// ---------------------------------------------------------
+EXPORT_C TInt NSmlUnicodeConverter::HBufC16InUnicodeL( const TDesC8& aUtf8, HBufC*& aUnicodeData )
+	{
+	TInt pushed;
+	pushed = HBufC16InUnicodeLC( aUtf8, aUnicodeData );
+	CleanupStack::Pop();
+	return pushed;
+	}
+// ---------------------------------------------------------
+// TNSmlUnicodeConverter::HBufC16InUnicodeLC()
+// Converts UTF-8 data to Unicode.
+// No size limitations, this function re-allocates memory
+// when needed. Note that a pointer given as a parameter is updated.
+// ---------------------------------------------------------
+EXPORT_C TInt NSmlUnicodeConverter::HBufC16InUnicodeLC( const TDesC8& aUtf8, HBufC*& aUnicodeData )
+	{
+	TPtr outputBuffer = HBufC::NewLC( KNSmlConvBufferSize )->Des(); 
+	TPtrC8 remainderOfUtf8 (aUtf8 );
+	TInt convertedDataLength( 0 );
+	HBufC16* convertedData = HBufC16::NewL( aUtf8.Length() / 2 );
+	HBufC16* oldPointer = NULL;
+	TInt returnValue( 0 );
+	TInt pushed( 0 );
+	do
+		{
+		returnValue = CnvUtfConverter::ConvertToUnicodeFromUtf8( outputBuffer, remainderOfUtf8 );
+		if (returnValue == CnvUtfConverter::EErrorIllFormedInput )
+			{
+            delete convertedData;
+			User::Leave( KErrCorrupt );
+			}
+		else if ( returnValue < 0 ) // future-proof against "TError" expanding
+			{
+            delete convertedData;
+			User::Leave( KErrGeneral );
+			}   
+		if ( outputBuffer.Size() > 0 )
+			{
+			convertedDataLength += outputBuffer.Length();
+			if ( convertedDataLength > convertedData->Des().MaxLength() )
+				{
+				oldPointer = convertedData;
+				convertedData = convertedData->ReAlloc( convertedDataLength );
+				if ( convertedData == NULL )
+					{
+					delete oldPointer;
+					User::Leave( KErrNoMemory );
+					}
+				}
+			convertedData->Des().Append( outputBuffer );
+			}
+		if ( returnValue > 0 )
+			{
+			remainderOfUtf8.Set( remainderOfUtf8.Right( returnValue ) );
+			}
+		}
+	while ( returnValue > 0 );
+	CleanupStack::PopAndDestroy(); //outputBuffer
+	aUnicodeData = convertedData;
+	CleanupStack::PushL( aUnicodeData );
+	pushed++;
+	return pushed;
+	}