#include <utf.h>
#include "UTFConverter.h"
void CUTFConverter::ConvertFromUnicodeToUtf8L(CBufSeg *aUtf8,const TDesC16 &aUnicode)
{
TInt retVal=KErrNone;
HBufC *uniText=HBufC16::NewLC(aUnicode.Length());
*uniText=aUnicode;
TPtr ptrUniText=uniText->Des();
TBuf8<20> outBuf;
TInt convValue=0;
for(;;)
{
convValue=CnvUtfConverter::ConvertFromUnicodeToUtf8(outBuf,ptrUniText);
if(convValue==CnvUtfConverter::EErrorIllFormedInput)
{
retVal=KErrCorrupt;
break;
}
else if(convValue<0)
{
retVal=KErrGeneral;
break;
}
aUtf8->InsertL(aUtf8->Size(),outBuf);
if(convValue==0)
break;
ptrUniText.Delete(0,ptrUniText.Length()-convValue);
}
CleanupStack::PopAndDestroy();
if(retVal!=KErrNone)
User::Leave(retVal);
}
void CUTFConverter::ConvertFromUtf8ToUnicodeL(TDes16& aUnicode,CBufSeg* aUtf8)
{
TBuf16<128> outBuffer;
HBufC8* utf8BufC=HBufC8::NewLC(aUtf8->Size());
TPtr8 utf8Ptr=utf8BufC->Des();
aUtf8->Read(0,utf8Ptr,aUtf8->Size());
TPtrC8 remainderOfUtf8(*utf8BufC);
TInt leaveCode=KErrNone;
for(;;)
{
const TInt returnValue=CnvUtfConverter::ConvertToUnicodeFromUtf8(outBuffer,remainderOfUtf8);
if(returnValue==CnvUtfConverter::EErrorIllFormedInput)
{
leaveCode=KErrCorrupt;
break;
}
else if(returnValue<0)
{
leaveCode=KErrGeneral;
break;
}
aUnicode.Append(outBuffer);
if(returnValue==0)
break;
remainderOfUtf8.Set(remainderOfUtf8.Right(returnValue));
}
CleanupStack::PopAndDestroy();
if(leaveCode!=KErrNone)
User::Leave(leaveCode);
}