email/mail/ViewerSrc/Msgmailcharactersethandler.cpp
changeset 0 72b543305e3a
--- /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