--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imaputils/src/cimapcharconv.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -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 <miutconv.h>
+#include <imcvcodc.h>
+#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<KBufSize> 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<KBufSize> 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;
+ }
+