--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/ViewerSrc/Msgmailcharactersethandler.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,272 @@
+/*
+* 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: Character set handler
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "Msgmailcharactersethandler.h"
+#include <featmgr.h>
+#include <bldvariant.hrh>
+#include <charconv.h>
+#include <eikmenup.h>
+#include <coemain.h>
+
+#include <StringLoader.h>
+#include <MsgMailViewer.rsg>
+#include <msgmailviewer.hrh>
+
+// CONSTANTS
+enum TVariationFlag
+ {
+ EDefault,
+ EJapaneseVariant,
+ EChineseVariant
+ };
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::CMsgMailCharacterSetHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMsgMailCharacterSetHandler::CMsgMailCharacterSetHandler()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMsgMailCharacterSetHandler::ConstructL()
+ {
+ if( FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
+ {
+ iVariationFlag = EJapaneseVariant;
+ }
+ else if( FeatureManager::FeatureSupported( KFeatureIdChinese ) )
+ {
+ iVariationFlag = EChineseVariant;
+ }
+ else
+ {
+ iVariationFlag = EDefault;
+ }
+
+ iFirstFreeCommandId = 0;
+ AppendItemsToItemArrayL();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMsgMailCharacterSetHandler* CMsgMailCharacterSetHandler::NewL(
+ TInt aFirstFreeCommandId )
+ {
+ CMsgMailCharacterSetHandler* self = new(
+ ELeave ) CMsgMailCharacterSetHandler;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ self->iFirstFreeCommandId = aFirstFreeCommandId;
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+
+// Destructor
+CMsgMailCharacterSetHandler::~CMsgMailCharacterSetHandler()
+ {
+ iItems.Close();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::SetCharacterSetSubMenuItemsL
+// Set filtered list of available characterset to menupane
+// -----------------------------------------------------------------------------
+//
+void CMsgMailCharacterSetHandler::SetCharacterSetSubMenuItemsL(
+ CEikMenuPane& aMenuPane, TUint aActiveCharacterSet)
+ {
+ for (TInt i=0; i<iItems.Count(); i++)
+ {
+ // Hide active characterset from options
+ if (iItems[i].iCharacterSetId != aActiveCharacterSet)
+ {
+ CEikMenuPaneItem::SData data;
+
+ data.iCommandId = iFirstFreeCommandId + iItems[i].iCommandId;
+ data.iCascadeId = NULL;
+ data.iFlags = NULL;
+ data.iText = iItems[i].iText;
+ data.iExtraText = KNullDesC;
+
+ aMenuPane.AddMenuItemL(data);
+ }
+ }
+
+ }
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::GetCharacterSetId
+// Get character set id
+// -----------------------------------------------------------------------------
+//
+TBool CMsgMailCharacterSetHandler::GetCharacterSetId(
+ TInt aCommandId, TUint& aCharacterSetId)
+ {
+ TBool retVal(EFalse);
+ aCharacterSetId = 0;
+ for (TInt i=0; i<iItems.Count(); i++)
+ {
+ if (aCommandId == iItems[i].iCommandId + iFirstFreeCommandId)
+ {
+ aCharacterSetId = iItems[i].iCharacterSetId;
+ retVal = ETrue;
+ }
+ }
+ return retVal;
+ }
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::CharacterSetCount
+// -----------------------------------------------------------------------------
+//
+void CMsgMailCharacterSetHandler::SetCharacterSetMenuItemL(
+ CEikMenuPane& aMenuPane)
+ {
+ if ( iItems.Count() )
+ {
+ if ( iVariationFlag == EJapaneseVariant )
+ {
+ CEikMenuPaneItem::SData& charecterSetItem =
+ aMenuPane.ItemData(EMsgMailViewerCmdCharSet);
+
+ HBufC* text = StringLoader::LoadLC(R_QTN_JPN_MAIL_OM_CHARSET);
+ charecterSetItem.iText =
+ (*text).Left(charecterSetItem.ENominalTextLength);
+ CleanupStack::PopAndDestroy(); // text
+ }
+ aMenuPane.SetItemDimmed(EMsgMailViewerCmdCharSet, EFalse);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::IsAcceptedCharacterSet
+// -----------------------------------------------------------------------------
+//
+TBool CMsgMailCharacterSetHandler::IsAcceptedCharacterSet(
+ TUint aCharacterSetId)
+ {
+ switch(aCharacterSetId)
+ {
+ // For China variant
+ case KCharacterSetIdentifierBig5: // FALLTHROUGH
+ case KCharacterSetIdentifierGb2312:
+ return (iVariationFlag == EChineseVariant);
+ // For Japan variant
+ case KCharacterSetIdentifierShiftJis: // FALLTHROUGH
+ case KCharacterSetIdentifierEucJpPacked:// FALLTHROUGH
+ case KCharacterSetIdentifierIso2022Jp:
+ return (iVariationFlag == EJapaneseVariant);
+
+ default:
+ return EFalse;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailCharacterSetHandler::AppendItemsToItemArrayL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailCharacterSetHandler::AppendItemsToItemArrayL()
+ {
+ RFs& fs = CCoeEnv::Static()->FsSession();
+
+ CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* charSets =
+ CCnvCharacterSetConverter::CreateArrayOfCharacterSetsAvailableLC( fs );
+
+ for (TInt i=0; i<charSets->Count(); i++)
+ {
+ const TUint identifier = (*charSets)[i].Identifier();
+ if ( IsAcceptedCharacterSet( identifier ) )
+ {
+ TData data;
+ data.iCommandId = i;
+ data.iCharacterSetId = identifier;
+
+ HBufC* buf = NULL;
+ // China
+ if ( identifier == KCharacterSetIdentifierGb2312 )
+ {
+ buf = StringLoader::LoadL(R_QTN_CHI_MAIL_SM_GB2312);
+ }
+ else if ( identifier == KCharacterSetIdentifierBig5 )
+ {
+ buf = StringLoader::LoadL(R_QTN_CHI_MAIL_SM_BIG5);
+ }
+ // Japanice
+ else if ( identifier == KCharacterSetIdentifierIso2022Jp )
+ {
+ buf = StringLoader::LoadL(R_QTN_JPN_MAIL_SM_CHARSET_ISO2022JP);
+ }
+ else if ( identifier == KCharacterSetIdentifierEucJpPacked )
+ {
+ buf = StringLoader::LoadL(R_QTN_JPN_MAIL_SM_CHARSET_EUCJP);
+ }
+ else if ( identifier == KCharacterSetIdentifierShiftJis )
+ {
+ buf = StringLoader::LoadL(R_QTN_JPN_MAIL_SM_CHARSET_SHIFTJIS);
+ }
+ else
+ {
+ // Ask name from charconv
+ CCnvCharacterSetConverter* charConv =
+ CCnvCharacterSetConverter::NewLC();
+ HBufC8* name = charConv->
+ ConvertCharacterSetIdentifierToStandardNameL(
+ identifier, fs);
+ if ( name )
+ {
+ CleanupStack::PushL( name );
+ // cleanupstack is not needed here since
+ // the code cannot leave before deleting this buffer
+ buf = HBufC::NewL( name->Length() ); // CSI: 35 # see comment above
+ buf->Des().Copy( *name );
+ CleanupStack::PopAndDestroy(); // name
+ }
+ CleanupStack::PopAndDestroy(); // charConv
+ }
+
+ if (!buf)
+ {
+ buf = KNullDesC().AllocL();
+ }
+ data.iText.Copy(buf->Left(data.ENominalTextLength));
+ delete buf;
+ buf = NULL;
+
+ User::LeaveIfError( iItems.Append(data) );
+ }
+ }
+ CleanupStack::PopAndDestroy(); // charSets
+ }
+
+// End of File