--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/csdagt/script/SCHCONV.CPP Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,294 @@
+// Copyright (c) 2003-2009 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:
+// Character conversion class definitions
+//
+//
+
+/**
+ @file Schconv.cpp
+*/
+
+#include "SCHCONV.H"
+#include <utf.h>
+#include "ND_STD.H"
+
+_LIT(KUnicodeType1,"ISO-10646-UCS-2"); //< 3 names for UNICODE
+_LIT(KUnicodeType2,"csUnicode");
+_LIT(KUnicodeType3,"UNICODE-1-1");
+_LIT(KIso88591Type1,"ISO-8859-1"); //< 3 name for ISO-8859-1
+
+/*
+_LIT(KIso88591Type2,"ISO_8859-1");
+_LIT(KIso88591Type3,"latin1");
+*/
+
+// CScriptCharacterConverter definitions
+
+CScriptCharacterConverter* CScriptCharacterConverter::NewL()
+/**
+2 phased constructor for CScriptCharacterConverter, first phase.
+
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CScriptCharacterConverter object.
+*/
+ {
+ CScriptCharacterConverter* r=new(ELeave) CScriptCharacterConverter();
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CScriptCharacterConverter::CScriptCharacterConverter()
+ : iDefaultCharSet(KIso88591Type1)
+/**
+Private constructor for CScriptCharacterConverter, used in the first phase of construction.
+*/
+ {}
+
+void CScriptCharacterConverter::ConstructL()
+/**
+Instantiates member variables.
+
+@exception Leaves if file server Connect() fails or CCnvCharacterSetConverter::NewL() leaves.
+*/
+ {
+ User::LeaveIfError(iFs.Connect());
+ iConverter=CCnvCharacterSetConverter::NewL();
+ }
+
+CScriptCharacterConverter::~CScriptCharacterConverter()
+/**
+Destructor.
+Closes file server.
+Deletes iConverter.
+*/
+ {
+ iFs.Close();
+ delete iConverter;
+ }
+
+HBufC8* CScriptCharacterConverter::ConvertL(const TDesC8& aString, const TDesC& aCharSet)
+/**
+Calls ConvertLC.
+*/
+ {
+ HBufC8* buf;
+ buf=ConvertLC(aString,aCharSet);
+ CleanupStack::Pop(); //buf
+ return buf;
+ }
+
+HBufC8* CScriptCharacterConverter::ConvertL(const TDesC16& aString, const TDesC& aCharSet)
+/**
+Calls ConvertLC.
+*/
+ {
+ HBufC8* buf;
+ buf=ConvertLC(aString,aCharSet);
+ CleanupStack::Pop(); //buf
+ return buf;
+ }
+
+HBufC8* CScriptCharacterConverter::ConvertLC(const TDesC8& aString, const TDesC& aCharSet)
+/**
+Converts from ISO-8859-1 to aCharSet or if aCharSet is empty to the default
+character set. Returns the result in the form of an 8-bit buffer ready for sending
+to comm port. Leaves with KErrCharacterConversionError if there is an error in
+conversion.
+*/
+ {
+ TBuf<KMaxCharacterTypeLength> type=aCharSet;
+ if (type.Length()==0)
+ type.Copy(iDefaultCharSet);
+
+ HBufC8* buf=HBufC8::NewLC(aString.Length()); // must put this on the cleanup stack first as we're leaving it there
+
+// first convert to unicode
+ if (iConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierIso88591,iFs)!=CCnvCharacterSetConverter::EAvailable)
+ User::Leave(KErrCharacterSetDoesNotExist);
+ HBufC16* buf16=HBufC16::NewLC(aString.Length());
+ TPtr16 unicode(buf16->Des());
+ TInt state=CCnvCharacterSetConverter::KStateDefault;
+ TInt ret=iConverter->ConvertToUnicode(unicode,aString,state);
+ if (ret!=KErrNone) // this conversion is from ISO-8859-1 to unicode, so we know the length
+ User::Leave(KErrCharacterConversionError);
+
+ if (IsUnicode(type))
+ {
+ TPtr8 resString(buf->Des());
+ CopyToEightBitDataL(resString,unicode);
+ }
+ else
+ {
+ PrepareToConvertL(type);
+ TPtrC16 remainingUnicode(unicode);
+ TInt state=CCnvCharacterSetConverter::KStateDefault;
+ FOREVER
+ {
+ TPtr8 resString(buf->Des());
+ ret=iConverter->ConvertFromUnicode(resString,remainingUnicode,state);
+ if (ret<KErrNone)
+ {
+ User::Leave(KErrCharacterConversionError);
+ break;
+ }
+ else
+ {
+ if (ret==KErrNone)
+ break;
+ buf->ReAllocL(buf->Length()+ret);
+ }
+ remainingUnicode.Set(remainingUnicode.Right(ret));
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // buf16
+ return buf;
+ }
+
+HBufC8* CScriptCharacterConverter::ConvertLC(const TDesC16& aString, const TDesC& aCharSet)
+/**
+Converts from UNICODE to aCharSet or if aCharSet is empty to the default
+character set. Returns the result in th form of an 8-bit buffer ready for sending
+to comm port. Leaves with KErrCharacterConversionError if there is an error in
+conversion.
+*/
+ {
+ TBuf<KMaxCharacterTypeLength> type=aCharSet;
+ if (type.Length()==0)
+ type.Copy(iDefaultCharSet);
+
+ HBufC8* buf=HBufC8::NewLC(aString.Length());;
+ TPtrC16 remainingUnicode(aString);
+ TInt ret=KErrNone;
+
+ if (IsUnicode(type))
+ {
+ TPtr8 resString(buf->Des());
+ CopyToEightBitDataL(resString,aString);
+ }
+ else // other types
+ {
+ PrepareToConvertL(type);
+ TInt state=CCnvCharacterSetConverter::KStateDefault;
+ FOREVER
+ {
+ TPtr8 resString(buf->Des());
+ ret=iConverter->ConvertFromUnicode(resString,remainingUnicode,state);
+ if (ret<KErrNone)
+ {
+ User::Leave(KErrCharacterConversionError);
+ break;
+ }
+ else
+ {
+ if (ret==KErrNone)
+ break;
+ buf->ReAllocL(buf->Length()+ret);
+ }
+ remainingUnicode.Set(remainingUnicode.Right(ret));
+ }
+ }
+
+ return buf;
+ }
+
+void CScriptCharacterConverter::ConvertFromDefaultL(const TDesC8& aSrc,TDes16& aTrg)
+/**
+Converts aString from the default character to set to Unicode
+Should have been passed a big enough buffer for the conversion to happen in one go
+so leaves if the return value from the conversion is not 0
+*/
+ {
+ DoConvertFromDefaultToUnicodeL(aSrc,aTrg);
+ }
+
+void CScriptCharacterConverter::SetDefaultCharSet(const TDesC& aCharSet)
+/**
+Sets default character set.
+*/
+ {
+ iDefaultCharSet=aCharSet;
+ }
+
+void CScriptCharacterConverter::PrepareToConvertL(const TDesC& aNameToMatch)
+/**
+Prepares to convert.
+*/
+ {
+ TBuf8<KMaxCharacterTypeLength> type;
+ type.Copy(aNameToMatch);
+ const TInt charSetId=iConverter->ConvertStandardNameOfCharacterSetToIdentifierL(type,iFs);
+ if ((charSetId==0) || (iConverter->PrepareToConvertToOrFromL(charSetId,iFs)!=CCnvCharacterSetConverter::EAvailable))
+ User::Leave(KErrCharacterSetDoesNotExist);
+ }
+
+void CScriptCharacterConverter::CopyToEightBitDataL(TDes8& aTrg, const TDesC16& aSrc)
+/**
+Copies to eight bit.
+*/
+ {
+ TInt len=aSrc.Length()*2;
+ if (len>aTrg.MaxLength())
+ User::Leave(KErrOverflow);
+ TUint8* ptrToBuf=(TUint8*)aSrc.Ptr();
+ aTrg.Copy(ptrToBuf,len);
+ }
+
+void CScriptCharacterConverter::CopyFromEightBitDataL(TDes16& aTrg, const TDesC8& aSrc)
+
+ {
+ TInt len=aSrc.Length()/2; // if source length is odd then we can't use the last 8 bits anyway
+ if (len>aTrg.MaxLength())
+ User::Leave(KErrOverflow);
+ TUint16* ptrToBuf=(TUint16*)aSrc.Ptr();
+ aTrg.Copy(ptrToBuf,len);
+ }
+
+void CScriptCharacterConverter::DoConvertFromDefaultToUnicodeL(const TDesC8& aSrc,TDes16& aTrg)
+/**
+Converts aString from the default character to set to unicode
+*/
+ {
+ __ASSERT_DEBUG(aSrc.Length()<=KRxBufferSize, User::Invariant());
+ __ASSERT_DEBUG(aTrg.MaxLength()>=KRxBufferSize, User::Invariant());
+
+ TInt state=CnvUtfConverter::KStateDefault;
+ TInt ret=KErrNone;
+ aTrg.SetLength(0);
+
+ if (IsUnicode(iDefaultCharSet))
+ CopyFromEightBitDataL(aTrg,aSrc);
+ else
+ {
+ PrepareToConvertL(iDefaultCharSet);
+ ret=iConverter->ConvertToUnicode(aTrg,aSrc,state);
+ }
+
+ if (ret!=KErrNone)
+ User::Leave(KErrCharacterConversionError);
+ }
+
+TBool CScriptCharacterConverter::IsUnicode(const TDesC& aType) const
+/**
+Checks if type is unicode.
+*/
+ {
+ if ((aType.CompareF(KUnicodeType1)==KErrNone)
+ || (aType.CompareF(KUnicodeType2)==KErrNone)
+ || (aType.CompareF(KUnicodeType3)==KErrNone))
+ return ETrue;
+ return EFalse;
+ }