diff -r 000000000000 -r 72b543305e3a email/mail/ViewerSrc/MsgMailViewerCharConv.cpp --- /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 +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#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 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 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