email/mail/ViewerSrc/MsgMailViewerCharConv.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/ViewerSrc/MsgMailViewerCharConv.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2002 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: 
+*     Implements character converter for application.
+*
+*/
+
+
+// INCLUDE FILES
+#include <bldvariant.hrh>
+#include <eikenv.h>
+#include <miutconv.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include <cimconvertcharconv.h>
+#endif
+#include "MsgMailViewerCharConv.h"
+
+// CONSTANTS
+const TInt KBlockSize = 64;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Default constructor
+CMsgMailViewerCharConv::CMsgMailViewerCharConv()
+: iState( CCnvCharacterSetConverter::KStateDefault )
+    { 
+    }
+
+// destructor
+CMsgMailViewerCharConv::~CMsgMailViewerCharConv()
+    {
+    delete iCharConv;
+    delete iImCharConv;
+    delete iTarget8;
+    delete iTarget16;
+    }
+
+// Symbian OS default constructor can leave.
+void CMsgMailViewerCharConv::ConstructL( TUint aCharSet )
+    {
+    if (aCharSet > 0)
+        {
+        iCharConv = CCnvCharacterSetConverter::NewL();
+        iImCharConv = CImConvertCharconv::NewL(
+            *iCharConv, CEikonEnv::Static()->FsSession());			// CSI: 27 # Must be used because of iEikEnv 
+																	// is not accessible.
+        TBool found = iImCharConv->PrepareToConvertToFromOurCharsetL(aCharSet);
+        if (!found)
+            {
+            User::Leave( KErrNotFound );
+            }
+        }
+    }
+
+// Two-phased constructor.
+CMsgMailViewerCharConv* CMsgMailViewerCharConv::NewL(
+        TUint aCharSet )     // CMsgMailViewerApp reference
+    {
+    CMsgMailViewerCharConv* self = new (ELeave) CMsgMailViewerCharConv();
+    CleanupStack::PushL( self );
+    self->ConstructL( aCharSet );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+void CMsgMailViewerCharConv::PrepareToConvertFromUnicodeL( const TDesC16& aSource )
+    {
+    iSource16.Set( aSource );
+
+    delete iTarget8;
+    iTarget8 = NULL;
+    iTarget8 = HBufC8::NewL( iSource16.Length()*2 );		// CSI: 47 # For conversion.
+
+    iFromUnicode = ETrue;
+    iFailCount = 0;
+    }
+
+void CMsgMailViewerCharConv::PrepareToConvertToUnicodeL( const TDesC8& aSource )
+    {
+    iSource8.Set( aSource );
+
+    delete iTarget16;
+    iTarget16 = NULL;
+    iTarget16 = HBufC16::NewL( iSource8.Length() );
+
+    iFromUnicode = EFalse;
+    }
+
+HBufC16* CMsgMailViewerCharConv::GetUnicodeText()
+    {
+    HBufC16* result = iTarget16;
+    iTarget16 = NULL;
+
+    return result;
+    }
+    
+HBufC8* CMsgMailViewerCharConv::GetForeignText()
+    {
+    HBufC8* result = iTarget8;
+    iTarget8 = NULL;
+
+    return result;
+    }
+
+TInt CMsgMailViewerCharConv::GetFailedCount() const
+    {
+    return iFailCount;
+    }
+    
+void CMsgMailViewerCharConv::AppendTextL( const TDesC16& aData )
+    {
+    TPtr target( iTarget16->Des() );
+    TInt length = target.Length() + aData.Length();
+    if( length > target.MaxLength() )
+        {
+        iTarget16 = iTarget16->ReAllocL( length );
+        target.Set( iTarget16->Des() );
+        }
+
+    target.Append( aData );
+    }
+
+void CMsgMailViewerCharConv::AppendTextL( const TDesC8& aData )
+    {
+    TPtr8 target( iTarget8->Des() );
+    TInt length = target.Length() + aData.Length();
+    if( length > target.MaxLength() )
+        {
+        iTarget8 = iTarget8->ReAllocL( length );
+        target.Set( iTarget8->Des() );
+        }
+
+    target.Append( aData );
+    }
+
+void CMsgMailViewerCharConv::StepL()
+    {
+    if( iFromUnicode )
+        {
+        StepFromUnicodeL();
+        }
+    else
+        {
+        StepToUnicodeL();
+        }
+    }
+
+void CMsgMailViewerCharConv::StepFromUnicodeL()
+    {
+    if (iImCharConv)
+        {
+        TBuf8<KBlockSize> buf;
+        TInt firstUnconvertdChar;
+        TInt numUnconvertedChars;
+        
+        TInt length (iImCharConv->ConvertFromOurCharsetL( iSource16, buf, 
+            numUnconvertedChars, 
+            firstUnconvertdChar));
+        
+        iFailCount += numUnconvertedChars;
+        User::LeaveIfError( length );
+        
+        iSource16.Set( iSource16.Right( length ) );
+        
+        AppendTextL( buf );
+        }
+    else
+        {
+        // No converter, just copy source to target
+        iTarget8->Des().Copy(iSource16);
+        iSource16.Set( KNullDesC() );
+        }
+    }
+
+void CMsgMailViewerCharConv::StepToUnicodeL()
+    {
+    if (iImCharConv)
+        {
+        TBuf16<KBlockSize> buf;
+        TInt firstUnconvertdChar;
+        TInt numUnconvertedChars;
+        
+        TInt length (iImCharConv->ConvertToOurCharsetL( iSource8, buf, 
+            numUnconvertedChars, 
+            firstUnconvertdChar));
+        
+        User::LeaveIfError( length );
+        
+        iSource8.Set( iSource8.Right( length ) );
+        
+        AppendTextL( buf );
+        }
+    else
+        {
+        // just copy source to target
+        iTarget16->Des().Copy(iSource8);
+        iSource8.Set( KNullDesC8() );
+        }
+    }
+
+
+TBool CMsgMailViewerCharConv::IsProcessDone() const
+    {
+    TBool ret( EFalse );
+
+    if( iFromUnicode )
+        {
+        ret = iSource16.Length() == 0;
+        }
+    else
+        {
+        ret = iSource8.Length() == 0;
+        }
+
+    return ret;
+    }
+
+// End of File