mobilemessaging/smum/src/SMSI.CPP
changeset 0 72b543305e3a
child 17 caea42e26caa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smum/src/SMSI.CPP	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,612 @@
+/*
+* Copyright (c) 2002-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: SMSI.CPP*
+*/
+
+
+
+
+// Standard includes
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <mtmuidsdef.hrh>
+#endif
+#include <mtmdef.h>     // MTM specific definitions for constants
+#include <eikon.rsg>    // Standard resources
+// Messaging includes
+#include <msvuids.h>    // Msv UIDs
+// Specific includes
+#include <MtmExtendedCapabilities.hrh>
+#include <SMUM.rsg>                     // for resource IDs
+#include <muiu.mbg>                     // bitmaps
+#include <avkon.rsg>                    // for resource IDs
+#include <StringLoader.h>               // stringloader
+#include "SMSI.H"                       
+#include "SMSU.HRH"                     // for KMtmUiFunctionSimDialog
+#include "smsui.pan"                    // for panics
+
+#include <AknUtils.h>
+#include <AknsUtils.h>
+#include <AknsConstants.h>//skinned icon ids
+#include <data_caging_path_literals.hrh>
+
+#include <csmsaccount.h>
+#include <centralrepository.h>
+#include <messaginginternalcrkeys.h>
+#include <smutset.h>                    // CSmsSettings
+
+
+//For logging
+#include "SmumLogging.h"
+
+//  LOCAL CONSTANTS AND MACROS
+const TInt KSmsViewerUid = 0x100058bd;
+const TInt KSmsiNumberOfZoomStates = 2; // Nothing to do with zoomstates, picture + mask = 2
+//const TUid KUidMsgTypeSMS = {0x1000102C};// already defined in <smut.h>
+const TInt KTBuf80Length=80;
+// Impossible for the next two figures to be accurate - sizes of messages
+// etc. depend greatly on the encoding/compression used on the message
+// Approximated to be 30 submessages long default 7 bit encoded sms.
+// Note : Rarely or newer used
+const TInt KSmsiMaxTotalMsgSize = 153 * 30;  
+
+_LIT(KSmsiResourceFile, "SMUM");
+// Correct path is added to literal when it is used.
+_LIT(KBitmapFile, "muiu.MBM");
+
+//  MEMBER FUNCTIONS
+
+// Factory constructor function
+CSmsMtmUiData* CSmsMtmUiData::NewL( CRegisteredMtmDll& aRegisteredDll )
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::NewL");
+    CSmsMtmUiData* smsmtmuidata=new ( ELeave ) CSmsMtmUiData( aRegisteredDll );
+    CleanupStack::PushL( smsmtmuidata );
+    smsmtmuidata->ConstructL();
+    CleanupStack::Pop();
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::NewL");
+    return smsmtmuidata;
+    }
+
+// C++ constructor can NOT contain any code, that
+// might leave.
+CSmsMtmUiData::CSmsMtmUiData( CRegisteredMtmDll& aRegisteredDll ):
+    CBaseMtmUiData( aRegisteredDll )
+    {
+    }
+
+// Symbian OS default constructor can leave.
+void CSmsMtmUiData::ConstructL()
+    {
+    CBaseMtmUiData::ConstructL();
+    //Initalize SMS Settings for the first time
+    TInt timeStamp = 0;
+    CSmsSettings* serviceSettings = CSmsSettings::NewL();
+    CleanupStack::PushL( serviceSettings );
+    CSmsAccount* smsAccount = CSmsAccount::NewLC();
+    CRepository* cenRepSession = CRepository::NewLC( KCRUidSmum );
+
+    if ( cenRepSession->Get( KSmumShowSMSCTimeStamp, timeStamp ) != KErrNone )
+        {
+        //In case of any error,set the default value to 0, so that device timestamp is used
+        timeStamp = 0;
+        SMUMLOGGER_WRITE("CSmsMtmUiData::ConstructL: cenRep get error");
+        }
+    SMUMLOGGER_WRITE_FORMAT("CSmsMtmUiData::ConstructL: cenRep timesatmp value:%d", timeStamp);
+    smsAccount->LoadSettingsL( *serviceSettings );
+    serviceSettings->SetUseServiceCenterTimeStampForDate(timeStamp);
+
+    TRAPD( err, smsAccount->SaveSettingsL( *serviceSettings ) );
+    if( err != KErrNone)
+        {
+        SMUMLOGGER_WRITE_FORMAT("CSmsMtmUiData::ConstructL: Settings saving error status: %d", err);
+        }
+    CleanupStack::PopAndDestroy( 3, serviceSettings ); // serviceSettings, smsAccount, cenRepSession
+    }
+
+// Destructor
+CSmsMtmUiData::~CSmsMtmUiData()
+    {
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::ContextIcon
+//
+// ---------------------------------------------------------
+const CBaseMtmUiData::CBitmapArray& CSmsMtmUiData::ContextIcon(
+    const TMsvEntry& aContext, 
+    TInt /*aStateFlags*/ ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::ContextIcon");
+    __ASSERT_DEBUG(aContext.iMtm==KUidMsgTypeSMS, Panic(ESmsiWrongMtm));
+    __ASSERT_DEBUG(aContext.iType.iUid!=KUidMsvFolderEntryValue, Panic(ESmsiFoldersNotSupported));
+    __ASSERT_DEBUG(aContext.iType.iUid!=KUidMsvAttachmentEntryValue, Panic(ESmsiNoIconForAttachment));
+
+    //    Return the set of icons appropriate to the current context
+    TInt bmpIndex; 
+    if (aContext.iBioType!=0)
+        {
+        bmpIndex = aContext.Unread() ? 
+            EMbmMuiuQgn_prop_mce_smart_unread : EMbmMuiuQgn_prop_mce_smart_read;
+        }
+    else
+        {
+        bmpIndex = aContext.Unread() ? 
+            EMbmMuiuQgn_prop_mce_sms_unread : EMbmMuiuQgn_prop_mce_sms_read;
+        }
+
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::ContextIcon");
+
+    return *iIconArrays->At(( bmpIndex - EMbmMuiuQgn_prop_mce_sms_read ) / KSmsiNumberOfZoomStates );
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::OperationSupportedL
+//
+// ---------------------------------------------------------
+TInt CSmsMtmUiData::OperationSupportedL( TInt aOperationId, const TMsvEntry& aContext ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::OperationSupportedL");
+    //    SMS mtm client only has two functions which may be of use to the user
+    //    NB as this implies, there are other functions.
+    switch (aOperationId)
+        {
+        case KMtmUiFunctionSimDialog:
+            return NULL;
+        case KMtmUiFunctionMessageInfo:
+            if (aContext.iType==KUidMsvMessageEntry)
+                {
+                return NULL;
+                }
+            break;
+        default:
+            break;
+        }
+
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::OperationSupportedL");
+    return R_EIK_TBUF_NOT_AVAILABLE;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::QueryCapability
+//
+// ---------------------------------------------------------
+TInt CSmsMtmUiData::QueryCapability( TUid aFunctionId, TInt& aResponse ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::QueryCapability");
+    TInt retVal = KErrNone;
+    switch ( aFunctionId.iUid )
+        {
+        case KUidMsvMtmUiQueryMessagingInitialisation:
+            aResponse = ETrue;
+            break;
+
+        case KUidMtmQuerySupportsBioMsgValue:   // Supports sending of Bio messages
+            aResponse = ETrue;
+            break;
+
+        case KUidMtmQueryMaxBodySizeValue:
+            aResponse = KSmsiMaxTotalMsgSize;        //    See notes at the definition
+            break;
+
+        case KUidMtmQueryMaxTotalMsgSizeValue:
+            aResponse = KSmsiMaxTotalMsgSize;        //    See notes at the definition
+            break;
+        case KUidMtmQuerySupportedBodyValue:
+            aResponse = KMtm7BitBody | KMtm8BitBody | KMtm16BitBody;
+            break;
+
+        case KUidMsvMtmQueryViewerUidValue:
+            aResponse = KSmsViewerUid;
+            break;
+            
+        case KMtmUiFunctionMessageInfo: 
+            aResponse = KErrNone;
+            break;
+
+        case KUidMtmQueryCanSendMsgValue:        
+        case KUidMtmQueryCanReceiveMsgValue:
+            break;
+
+        default:
+            retVal=KErrNotSupported;
+            break;
+        }
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::QueryCapability");
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::PopulateArraysL
+//
+// ---------------------------------------------------------
+void CSmsMtmUiData::PopulateArraysL()
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::PopulateArraysL");
+    // Read additional functions
+    ReadFunctionsFromResourceFileL( R_SMSI_FUNCTION_ARRAY );
+    CreateSkinnedBitmapsL( KSmsiNumberOfZoomStates );
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::PopulateArraysL");
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::GetResourceFileName
+//
+// ---------------------------------------------------------
+void CSmsMtmUiData::GetResourceFileName( TFileName& aFileName ) const
+    {
+    aFileName = KSmsiResourceFile;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanCreateEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanCreateEntryL(
+    const TMsvEntry& aParent, 
+    TMsvEntry& aNewEntry, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::CanCreateEntryL");
+    __ASSERT_DEBUG( aNewEntry.iMtm == KUidMsgTypeSMS, Panic( ESmsiWrongMtm ));
+
+    //    We can create an entry if it is a message under the local service
+    if( aNewEntry.iType == KUidMsvMessageEntry && 
+        aNewEntry.iMtm == KUidMsgTypeSMS && 
+        aParent.iType == KUidMsvFolderEntry )
+        {
+        aReasonResourceId = NULL;
+        return ETrue;
+        }
+
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::CanCreateEntryL");
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanDeleteServiceL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanDeleteServiceL(
+    const TMsvEntry& /*aService*/, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::CanDeleteServiceL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    SMUMLOGGER_LEAVEFN("CSmsMtmUiData::CanDeleteServiceL");
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanReplyToEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanReplyToEntryL(
+    const TMsvEntry& aContext,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::CanReplyToEntryL");
+    __ASSERT_DEBUG( aContext.iMtm == KUidMsgTypeSMS, Panic( ESmsiWrongMtm ));
+    if ( aContext.iMtm == KUidMsgTypeSMS
+        && aContext.iType == KUidMsvMessageEntry
+        && aContext.ReadOnly()
+        && !aContext.iBioType )
+        {
+        return ETrue;
+        }
+    else
+        {
+        aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+        return EFalse;
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanForwardEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanForwardEntryL(
+    const TMsvEntry& aContext,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN("CSmsMtmUiData::CanForwardEntryL");
+    __ASSERT_DEBUG( aContext.iMtm == KUidMsgTypeSMS, Panic( ESmsiWrongMtm ));
+    if ( aContext.iMtm == KUidMsgTypeSMS
+        && aContext.iType == KUidMsvMessageEntry
+        && aContext.ReadOnly()
+        && !aContext.iBioType )
+        {
+        return ETrue;
+        }
+    else
+        {
+        aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+        return EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanEditEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanEditEntryL(
+    const TMsvEntry& /*aContext*/,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanEditEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanViewEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanViewEntryL(
+    const TMsvEntry& /*aContext*/,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanViewEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanOpenEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanOpenEntryL(
+    const TMsvEntry& /*aContext*/,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanOpenEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanCloseEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanCloseEntryL(
+    const TMsvEntry& /*aContext*/,
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanCloseEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanDeleteFromEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanDeleteFromEntryL(
+    const TMsvEntry& /*aContext*/, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanDeleteFromEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanCopyMoveToEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanCopyMoveToEntryL(
+    const TMsvEntry& /*aContext*/, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanCopyMoveToEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanCopyMoveFromEntryL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanCopyMoveFromEntryL(
+    const TMsvEntry& /*aContext*/, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanCopyMoveFromEntryL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CanCancelL
+//
+// ---------------------------------------------------------
+TBool CSmsMtmUiData::CanCancelL(
+    const TMsvEntry& /*aContext*/, 
+    TInt& aReasonResourceId ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CanCancelL");
+    // these CanXXX functions not used in Series 60, except 
+    // CanCreateEntryL, CanReplyToEntryL, CanForwardEntryL and 
+    // CanUnDeleteFromEntryL 
+    aReasonResourceId = R_EIK_TBUF_NOT_AVAILABLE;
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::StatusTextL
+//
+// ---------------------------------------------------------
+HBufC* CSmsMtmUiData::StatusTextL( const TMsvEntry& aContext ) const
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::StatusTextL");
+
+    TInt res = 0;
+    TUint sendingState = aContext.SendingState();
+    switch( sendingState )
+        {
+        case KMsvSendStateFailed:
+            res = R_QTN_MCE_OUTBOX_STATUS_FAILED;
+            break;
+
+        case KMsvSendStateUponRequest: // Mapped to be the same
+        case KMsvSendStateSuspended:
+            res = R_QTN_MCE_OUTBOX_STATUS_SUSPENDED;
+            break;
+        
+        case KMsvSendStateScheduled: // Mapped to be the same
+        case KMsvSendStateWaiting:
+            res = R_QTN_MCE_OUTBOX_STATUS_WAITING;
+            break;
+            
+        case KMsvSendStateResend:
+            res = R_QTN_MCE_OUTBOX_STATUS_RETRY_AT;
+            break;
+            
+        case KMsvSendStateSending:
+            res = R_QTN_MCE_OUTBOX_STATUS_SENDING;
+            break;
+        
+        case KMsvSendStateSent:
+        case KMsvSendStateNotApplicable:
+            res = 0;
+            break;
+            
+            // Unknown 
+        case KMsvSendStateUnknown:
+        default:
+#ifdef _DEBUG
+            Panic( ESmsiMtmUdUnknownMsgStatus );
+#endif
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    
+        if (!res)
+            {
+            return HBufC::NewL(0);
+            }
+      
+        if ( sendingState == KMsvSendStateResend )
+            {
+            TBuf<KTBuf80Length> bufTimeFormat;
+            TBuf<KTBuf80Length> bufTimeFormatted;
+            StringLoader::Load( 
+                bufTimeFormat, R_QTN_TIME_USUAL_WITH_ZERO, iCoeEnv );
+                
+            TTime localTime = aContext.iDate;
+            TLocale locale;
+    	    // Add time difference
+            localTime += locale.UniversalTimeOffset();
+    	    if (locale.QueryHomeHasDaylightSavingOn())          
+    		    { // and possible daylight saving time
+    		    TTimeIntervalHours daylightSaving(1);          
+    		    localTime += daylightSaving;
+    		    }
+    		localTime.FormatL( bufTimeFormatted, bufTimeFormat );
+    		AknTextUtils::LanguageSpecificNumberConversion( bufTimeFormatted );
+    	    SMUMLOGGER_LEAVEFN(" CSmsMtmUiData::StatusTextL - 1");
+            return StringLoader::LoadL( 
+                R_QTN_MCE_OUTBOX_STATUS_RETRY_AT, bufTimeFormatted, iCoeEnv );
+            }
+        else
+            {
+            SMUMLOGGER_LEAVEFN(" CSmsMtmUiData::StatusTextL - 2");
+            return StringLoader::LoadL( res, iCoeEnv );
+            }
+    }
+
+// ---------------------------------------------------------
+// CSmsMtmUiData::CreateSkinnedBitmapsL
+//
+// ---------------------------------------------------------
+void CSmsMtmUiData::CreateSkinnedBitmapsL( TInt aNumZoomStates )
+    {
+    SMUMLOGGER_ENTERFN(" CSmsMtmUiData::CreateSkinnedBitmapsL");
+
+    MAknsSkinInstance* skins = AknsUtils::SkinInstance();
+    TAknsItemID id;
+    CFbsBitmap* bitmap;
+    CFbsBitmap* bitmapMask;
+    TBool found = ETrue;
+    
+    for( TInt i=EMbmMuiuQgn_prop_mce_sms_read; i<EMbmMuiuQgn_prop_mce_smart_unread_mask+1; i++ )
+        {
+        found = ETrue;
+        switch( i )
+            {
+            // Add to iIconArrays in this order
+            case EMbmMuiuQgn_prop_mce_sms_read:
+                id.Set( KAknsIIDQgnPropMceSmsRead );
+                break;
+            case EMbmMuiuQgn_prop_mce_sms_unread:
+                id.Set( KAknsIIDQgnPropMceSmsUnread );
+                break;
+            case EMbmMuiuQgn_prop_mce_smart_read:
+                id.Set( KAknsIIDQgnPropMceSmartRead );
+                break;
+            case EMbmMuiuQgn_prop_mce_smart_unread:
+                id.Set( KAknsIIDQgnPropMceSmartUnread );
+                break;
+            default:
+                found = EFalse;
+                break;
+            }
+            if( found )
+                {
+                CArrayPtrFlat<CFbsBitmap>* array = 
+                    new (ELeave) CArrayPtrFlat<CFbsBitmap>( aNumZoomStates );
+                CleanupStack::PushL( array );
+                array->SetReserveL( aNumZoomStates ); // AppendLs will not LEAVE
+                TParse tp;
+                tp.Set( KBitmapFile, &KDC_APP_BITMAP_DIR, NULL );
+
+                AknsUtils::CreateIconL( skins, id, bitmap,
+                    bitmapMask, tp.FullName(), i, i + 1 );
+                    
+                array->AppendL(bitmap);
+                array->AppendL(bitmapMask);
+                iIconArrays->AppendL(array);
+
+                CleanupStack::Pop();//array
+                }
+                
+        }
+    SMUMLOGGER_LEAVEFN(" CSmsMtmUiData::CreateSkinnedBitmapsL");
+    }
+//  End of File