diff -r 6a20128ce557 -r ebfee66fde93 email/imap4mtm/imaputils/src/cimapcharconv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imaputils/src/cimapcharconv.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,183 @@ +// Copyright (c) 2007-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: +// + +#include "cimapcharconv.h" +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "cimconvertcharconv.h" +#include "cimconvertheader.h" +#endif +const TInt KBufSize = 100; + +CImapCharconv* CImapCharconv::NewL(RFs& aFs) + { + CImapCharconv* self = new (ELeave) CImapCharconv(); + CleanupStack::PushL(self); + self->ConstructL(aFs); + CleanupStack::Pop(); + return self; + } + +CImapCharconv::CImapCharconv() + { + } + +void CImapCharconv::ConstructL(RFs& aFs) + { + iCharacterConverter = CCnvCharacterSetConverter::NewL(); + iCharConv = CImConvertCharconv::NewL(*iCharacterConverter, aFs); + iHeaderConverter = CImConvertHeader::NewL(*iCharConv); + } + +CImapCharconv::~CImapCharconv() + { + delete iHeaderConverter; + delete iCharConv; + delete iCharacterConverter; + } + +/** +Converts the supplied Imap-Utf7 encoded string into Unicode, allocating sufficient buffer space for the Unicode string. +@return a heap buffer containing the Unicode string +*/ +EXPORT_C HBufC16* CImapCharconv::ConvertToUnicodeFromImapUtf7L(const TDesC8& aImapUtf7) +// This code is based on CnvUtfConverter::ConvertToUnicodeFromUtf7L() + { + // If aImapUtf7 is an empty string return + if (aImapUtf7.Length()==0) + { + HBufC16* hBuf = HBufC16::NewL(1); + return hBuf; + } + + // else convert aImapUtf7 to Unicode storing the result in a buffer, reallocating + // it when needed. + TInt length = aImapUtf7.Length(); + + iCharConv->PrepareToConvertToFromOurCharsetL(KCharacterSetIdentifierImapUtf7); + + TPtrC8 utf7 (aImapUtf7); + TBuf buf; + HBufC16* hBuf = HBufC16::NewLC(length); + TPtr unicode = hBuf->Des(); + + // Dummy parameters for the call to ConvertToOurCharsetL() + // Note that they don't actually get updated by this method. + // In particular, numUnconvertedChars does not get updated. + // So we use the return value (assigned to "unconverted") instead. + TInt numUnconvertedChars=0; + TInt indexFirstUnconvertedChar=0; + + FOREVER + { + TInt unconverted = iCharConv->ConvertToOurCharsetL(utf7, buf, numUnconvertedChars, indexFirstUnconvertedChar); + if(unconverted == CnvUtfConverter::EErrorIllFormedInput || unconverted < 0) + { + User::Leave(KErrCorrupt); + } + + if (unicode.Length() + buf.Length() > unicode.MaxLength()) + { + // Reallocate hBuf + hBuf = hBuf->ReAllocL(unicode.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf); + unicode.Set(hBuf->Des()); + } + + unicode.Append(buf); + if (unconverted == 0) + { + break; + } + + utf7.Set(utf7.Right(unconverted)); + } + + CleanupStack::Pop(hBuf); + return hBuf; + } + +/** +Converts the supplied Unicode string into a Imap-Utf7 encoded string, allocating sufficient buffer space for the Imap-Utf7 string. +@return a heap buffer containing the Imap-Utf7 encoded string +*/ +EXPORT_C HBufC8* CImapCharconv::ConvertFromUnicodeToImapUtf7L(const TDesC16& aUnicode) +// This code is based on CnvUtfConverter::ConvertFromUnicodeToImapUtf7L() + { + // If aUnicode is Null string, return an empty HBufC + if (aUnicode.Length() == 0) + { + HBufC8* hBuf8 = HBufC8::NewL(1); + return hBuf8; + } + + // Otherwise, convert and store result in a buffer, reallocating that buffer if needed. + TInt length = aUnicode.Length(); + + iCharConv->PrepareToConvertToFromOurCharsetL(KCharacterSetIdentifierImapUtf7); + + TPtrC16 unicode (aUnicode); + TBuf8 buf; + HBufC8* hBuf8 = HBufC8::NewLC(length); + TPtr8 utf7 = hBuf8->Des(); + + // Dummy parameters for the call to ConvertFromOurCharsetL() + // Note that they don't actually get updated by this method. + // In particular, numUnconvertedChars does not get updated. + // So we use the return value (assigned to "unconverted") instead. + TInt numUnconvertedChars=0; + TInt indexFirstUnconvertedChar=0; + + FOREVER + { + TInt unconverted = iCharConv->ConvertFromOurCharsetL(unicode, buf, numUnconvertedChars, indexFirstUnconvertedChar); + if(unconverted == CnvUtfConverter::EErrorIllFormedInput || unconverted < 0) + { + User::Leave(KErrCorrupt); + } + + if (utf7.Length() + buf.Length() > utf7.MaxLength()) + { + // Reallocate the hBuf8 + hBuf8 = hBuf8->ReAllocL(utf7.Length() + buf.Length()); + CleanupStack::Pop(); + CleanupStack::PushL(hBuf8); + utf7.Set(hBuf8->Des()); + } + utf7.Append(buf); + if (unconverted == 0) + { + break; + } + unicode.Set(unicode.Right(unconverted)); + } + CleanupStack::Pop(); + return hBuf8; + } + + + +/** +Gets the header converter + +@return Header converter +*/ +EXPORT_C CImConvertHeader& CImapCharconv::HeaderConverter() + { + return *iHeaderConverter; + } +