email/imap4mtm/imaputils/src/cimapcharconv.cpp
changeset 0 72b543305e3a
--- /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;
+	}
+