diff -r 84d9eb65b26f -r 2981cb3aa489 messagingappbase/mce/src/MceBitmapResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/mce/src/MceBitmapResolver.cpp Wed Nov 03 09:52:46 2010 +0530 @@ -0,0 +1,1117 @@ +/* +* 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: +* Handles different mce bitmaps. +* First collects all the bitmaps from different mtm's and also local +* folder's bitmaps to icon array. +* +*/ + + + +// INCLUDE FILES +#include // cbasemtmuidata +#include "MtmRegistryObserver.h" // mmtmuidataregistryobserver +#include +#include // fixed entry ids +#include // cmtmstore +#include +#include // CGulIcon +#include // cakniconarray +#include // CFbsFont +#include // bitmap enums +#include // bitmap enums +#include // EMtudEntryStateOpen +#include // mtm uids +#include +#include +#include "MceUtils.h" +#include "MceListItem.h" +#include "MceBitmapResolver.h" +#include "MceIds.h" //kmcedocumentsentryid +#include +// security data caging +#include +#include + + +// LOCAL CONSTANTS AND MACROS + +_LIT( KMceDirAndFileMuiu,"muiu.mbm" ); + +const TInt KMceIconArrayGranularity = 10; + +// ================= MEMBER FUNCTIONS ======================= + +CMceBitmapResolver* CMceBitmapResolver::NewL( + CMsvSessionPtr aSession, + MMtmUiDataRegistryObserver& aRegObserver, + TBool aLargeIcons ) + { // static + CMceBitmapResolver* self=new(ELeave) CMceBitmapResolver( + aSession, aRegObserver, aLargeIcons ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CMceBitmapResolver::CMceBitmapResolver( + CMsvSessionPtr aSession, + MMtmUiDataRegistryObserver& aRegObserver, + TBool aLargeIcons) : + iRegObserver(aRegObserver), + iSession( aSession), + iLargeIcons( aLargeIcons ), + iBitmapsLoaded( 0 ), + iDescriptionLength( KMceVisibleTextLength ) + { + } + +CMceBitmapResolver::~CMceBitmapResolver() + { + if ( iIcons ) + { + iIcons->ResetAndDestroy(); + } + delete iIcons; + delete iIconIndexes; + // iSession deleted by Ui class. + } + + +// ---------------------------------------------------- +// CMceBitmapResolver::ConstructL +// ---------------------------------------------------- +void CMceBitmapResolver::ConstructL() + { + // security data caging + TParse fp; + fp.Set( AknIconUtils::AvkonIconFileName(), &KDC_RESOURCE_FILES_DIR , NULL ); + iFilenameAvkon = fp.FullName(); + + fp.Set( KMceDirAndFileMuiu, &KDC_APP_BITMAP_DIR , NULL ); + iFilenameMuiu = fp.FullName(); + + iIcons = new(ELeave) CAknIconArray( KMceIconArrayGranularity ); + iIconIndexes = new(ELeave) CArrayFixFlat( + KMceIconArrayGranularity ); + + TMceBitmapListItem listItem; + listItem.iExtraItem = EFalse; + listItem.iMtm.iUid = KUidMsvLocalServiceMtmValue; + listItem.iType.iUid = KUidMsvFolderEntryValue; + + listItem.iId = KErrNone; + listItem.iExtraItem = ETrue; + + CreateAndAppendIconL( KAknsIIDQgnIndiMarkedAdd, iFilenameAvkon, EMbmAvkonQgn_indi_marked_add, &listItem ); + + CreateAndAppendIconL( KAknsIIDQgnPropMceWriteSub, EMbmMuiuQgn_prop_mce_write_sub, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropMceRemoteSub, EMbmMuiuQgn_prop_mce_remote_sub, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropMceRemoteNewSub, EMbmMuiuQgn_prop_mce_remote_new_sub, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropMceDrSub, EMbmMuiuQgn_prop_mce_dr_sub, &listItem ); + + listItem.iExtraItem = EFalse; + listItem.iId = KMsvGlobalInBoxIndexEntryId; + CreateAndAppendIconL( KAknsIIDQgnPropMceInboxSub, EMbmMuiuQgn_prop_mce_inbox_sub, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropMceInboxNewSub, EMbmMuiuQgn_prop_mce_inbox_new_sub, &listItem ); + + listItem.iId = KMceDocumentsEntryId; + CreateAndAppendIconL( KAknsIIDQgnPropMceDocumentsSub, EMbmMuiuQgn_prop_mce_documents_sub, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropMceDocumentsNewSub, EMbmMuiuQgn_prop_mce_documents_new_sub, &listItem ); + + listItem.iId = KMsvDraftEntryId; + CreateAndAppendIconL( KAknsIIDQgnPropMceDraftsSub, EMbmMuiuQgn_prop_mce_drafts_sub, &listItem ); + listItem.iId = KMsvSentEntryId; + CreateAndAppendIconL( KAknsIIDQgnPropMceSentSub, EMbmMuiuQgn_prop_mce_sent_sub, &listItem ); + listItem.iId = KMsvGlobalOutBoxIndexEntryId; + CreateAndAppendIconL( KAknsIIDQgnPropMceOutboxSub, EMbmMuiuQgn_prop_mce_outbox_sub, &listItem ); + + listItem.iId = KErrNone; + CreateAndAppendIconL( KAknsIIDQgnPropMceUnknownRead, EMbmMuiuQgn_prop_mce_unknown_read, &listItem ); + + CreateAndAppendIconL( KAknsIIDQgnPropMceTemplate, iFilenameAvkon, EMbmAvkonQgn_prop_folder_temp, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropFolderSmall, iFilenameAvkon, EMbmAvkonQgn_prop_folder_small, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropFolderSmallNew, iFilenameAvkon, EMbmAvkonQgn_prop_folder_small_new, &listItem ); + CreateAndAppendIconL( KAknsIIDQgnIndiAttachementAdd, iFilenameMuiu, EMbmMuiuQgn_indi_attach_add, &listItem, ETrue ); + CreateAndAppendIconL( KAknsIIDQgnIndiConnectionOnAdd, iFilenameMuiu, EMbmMuiuQgn_indi_connection_on_add, &listItem, ETrue ); + + CreateAndAppendIconL( KAknsIIDQgnIndiConnectionAlwaysAdd, iFilenameMuiu, EMbmMuiuQgn_indi_connection_always_add, &listItem, ETrue ); + CreateAndAppendIconL( KAknsIIDQgnIndiConnectionInactiveAdd, iFilenameMuiu, EMbmMuiuQgn_indi_connection_inactive_add, &listItem, ETrue ); + CreateAndAppendIconL( KAknsIIDQgnIndiConnectionInactiveAdd, iFilenameMuiu, EMbmMuiuQgn_indi_connection_on_roam_add, &listItem, ETrue ); + CreateAndAppendIconL( KAknsIIDQgnIndiMcePriorityHigh, iFilenameAvkon, EMbmAvkonQgn_indi_mce_priority_high, &listItem, ETrue ); + CreateAndAppendIconL( KAknsIIDQgnIndiMcePriorityLow, iFilenameAvkon, EMbmAvkonQgn_indi_mce_priority_low, &listItem, ETrue ); + + _LIT( KMceExtraIconsDirAndFile,"MceExtraIcons.mbm" ); + TParse cvfp; + cvfp.Set( KMceExtraIconsDirAndFile, &KDC_APP_BITMAP_DIR , NULL ); + + listItem.iExtraItem = ETrue; + CreateAndAppendIconL( KAknsIIDQgnPropImIbox, cvfp.FullName(), EMbmMceextraiconsQgn_prop_im_ibox , &listItem ); + CreateAndAppendIconL( KAknsIIDQgnPropImIboxNew, cvfp.FullName(), EMbmMceextraiconsQgn_prop_im_ibox_new , &listItem ); + // add one dummy item which will be replaced when querying message items icons + CreateAndAppendIconL( KAknsIIDQgnPropMceUnknownRead, EMbmMuiuQgn_prop_mce_unknown_read ); + + iDescriptionLength = MceUtils::DescriptionLengthL(); + FeatureManager::InitializeLibL(); + iEmailFramework = EFalse; + if ( FeatureManager::FeatureSupported( KFeatureIdFfEmailFramework ) ) + { + iEmailFramework = ETrue; + } + FeatureManager::UnInitializeLib(); + } + +// ---------------------------------------------------- +// CMceBitmapResolver::CreateAndAppendIconL +// ---------------------------------------------------- +void CMceBitmapResolver::CreateAndAppendIconL( TAknsItemID aId, TInt aBitmapIndex, const TMceBitmapListItem* aListItem /* = NULL */ ) + { + CreateAndAppendIconL( aId, iFilenameMuiu, aBitmapIndex, aListItem ); + } + +// ---------------------------------------------------- +// CMceBitmapResolver::CreateAndAppendIconL +// ---------------------------------------------------- +void CMceBitmapResolver::CreateAndAppendIconL( + TAknsItemID aId, + const TDesC& aFileName, + TInt aBitmapIndex, + const TMceBitmapListItem* aListItem /* = NULL */, + TBool aColorSkinnedIcon /*= EFalse */ ) + { + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + if ( aListItem && + aListItem->iExtraItem && + aListItem->iType.iUid > 0 && + aListItem->iType.iUid != KUidMsvFolderEntryValue + ) + { + // this is extra item and it has application uid, try to load it! + TUid uid = aListItem->iType; + AknsUtils::CreateAppIconLC( + skins, + uid, + EAknsAppIconTypeList, + bitmap, + mask ); + CleanupStack::Pop(2); + } + + if ( !bitmap ) + { + if ( aColorSkinnedIcon ) + { + AknsUtils::CreateColorIconL( + skins, + aId, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, + mask, + aFileName, + aBitmapIndex, + aBitmapIndex + 1, + KRgbBlack); + } + else + { + AknsUtils::CreateIconL( skins, aId, bitmap, + mask, aFileName, aBitmapIndex, aBitmapIndex + 1 ); + } + } + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + + CleanupStack::PushL( icon ); + if ( aListItem && aListItem->iExtraItem && aListItem->iId >= KMceFirstExtraItemId ) + { + iIcons->InsertL( iIconIndexes->Count(), icon ); + } + else + { + iIcons->AppendL( icon ); + } + CleanupStack::Pop( icon ); + + if ( aListItem ) + { + iIconIndexes->AppendL( *aListItem ); + } + iBitmapsLoaded = iIconIndexes->Count(); + } + + +// ---------------------------------------------------- +// CMceBitmapResolver::IconArray +// ---------------------------------------------------- +CArrayPtrFlat* CMceBitmapResolver::IconArray() + { + return iIcons; + } + +// ---------------------------------------------------- +// CMceBitmapResolver::BitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::BitmapIndex( const TMceBitmapListItem& aItem ) const + { + TInt foundIndex = KErrNotFound; + if ( aItem.iExtraItem ) + { + if ( aItem.iId == KMceWriteMessageId ) + { + foundIndex = EMceBitmapIndexWrite; + } + else if ( aItem.iId == KMceDeliveryReportsId ) + { + foundIndex = EMceBitmapIndexDr; + } + else if ( aItem.iId == KMceNoMailboxesListId ) + { + foundIndex = EMceBitmapIndexRemote; + } + else + { + const TInt count = iIconIndexes->Count(); + for ( TInt i = 0; i < count; i++) + { + const TMceBitmapListItem item = (*iIconIndexes)[i]; + if ( (*iIconIndexes)[i].iId == aItem.iId ) + { + foundIndex = i; + } + } + if ( foundIndex == KErrNotFound ) + { + foundIndex = EMceBitmapIndexUnknown; + } + } + } + if ( foundIndex == KErrNotFound && + aItem.iMtm.iUid == KUidMsvLocalServiceMtmValue && + aItem.iType.iUid == KUidMsvFolderEntryValue ) + { + foundIndex = LocalEntryBitmapIndex( aItem.iId ); + } + + if ( foundIndex == KErrNotFound && + aItem.iType.iUid == KUidMsvServiceEntryValue ) + { + // item is service entry (remote mailbox usually) so this + // icon is loaded from mtm uid data when needed and + // its index is last in icon array + foundIndex = iIcons->Count()-1; + } + + return ( foundIndex == KErrNotFound ? + EMceBitmapIndexUnknown : + foundIndex ); + } + +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT +// ---------------------------------------------------- +// CMceBitmapResolver::BitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::BitmapIndex( const TMsvEntry& aEntry ) + { + TInt foundIndex = KErrNotFound; + const TMsvId id = aEntry.Id(); + if ( aEntry.iMtm == KUidMsvLocalServiceMtm && + aEntry.iType == KUidMsvFolderEntry ) + { + foundIndex = LocalEntryBitmapIndex( id ); + + // check if folder has unread messages + if ( id == KMsvGlobalInBoxIndexEntryId || + id == KMceDocumentsEntryId || + id >= KFirstFreeEntryId + ) + { + TBool unreadMessages = EFalse; + TRAPD(err, ( unreadMessages = HasUnreadMessagesL( id ) ) ); + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + } + + // special handling for remote mailboxes to make main view appear faster in startup + if ( aEntry.iType == KUidMsvServiceEntry && + ( aEntry.iMtm == KSenduiMtmImap4Uid || + aEntry.iMtm == KSenduiMtmPop3Uid ) + ) + { + foundIndex = EMceBitmapIndexRemote; + TBool unreadMessages = EFalse; + TRAPD(err, ( unreadMessages = HasUnreadMessagesL( id ) ) ); + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + + if ( foundIndex == KErrNotFound ) + { + TRAPD(err, ( foundIndex = LoadBitmapL( aEntry ) ) ); + if (err != KErrNone ) + { + foundIndex = KErrNotFound; + } + } + + return ( foundIndex == KErrNotFound ? + EMceBitmapIndexUnknown : foundIndex ); + } + +#else +// ---------------------------------------------------- +// CMceBitmapResolver::BitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::BitmapIndex( const TMsvEntry& aEntry ) + { + TInt messageCount = 0; + return BitmapIndex( aEntry, messageCount ); + } +// ---------------------------------------------------- +// CMceBitmapResolver::BitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::BitmapIndex( const TMsvEntry& aEntry, TInt& aMessageCount ) + { + TInt foundIndex = KErrNotFound; + aMessageCount = 0; + TInt unreadCount = 0; + TBool unreadMessages = EFalse; + const TMsvId id = aEntry.Id(); + if ( aEntry.iMtm == KUidMsvLocalServiceMtm && + aEntry.iType == KUidMsvFolderEntry ) + { + foundIndex = LocalEntryBitmapIndex( id ); + + //Get count and check if inbox folder has unread messages + if ( id == KMsvGlobalInBoxIndexEntryId || + id == KMceDocumentsEntryId || + id == KMsvDraftEntryIdValue || + id == KMsvSentEntryIdValue || + id == KMsvGlobalOutBoxIndexEntryIdValue || + id >= KFirstFreeEntryId + ) + { + // In case of inbox, need to know message count and is + // there at least one unread message. + // No need of unread count and sub folder checking + + if(id == KMsvGlobalInBoxIndexEntryId ) + { + TRAPD(err, aMessageCount = + FindVisibleCountWithUnreadMessageL(id, unreadMessages)); + + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + // for Draft/outbox/sent no need to go for sub folder checking + // and unread count checking + else if(id == KMsvDraftEntryIdValue || + id == KMsvSentEntryIdValue || + id == KMsvGlobalOutBoxIndexEntryIdValue) + { + TRAP_IGNORE(aMessageCount = FindVisibleCountL(id)); + } + + else if(id == KMceDocumentsEntryId) + { + // no logic change for draft + // need total count, including sub folder count + // need unread message info also to show proper icon. + TRAPD(err, ( unreadMessages = HasUnreadMessagesL( id, aMessageCount, unreadCount ) ) ); + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + } + } + + // special handling for remote mailboxes to make main view appear faster in startup + if ( aEntry.iType == KUidMsvServiceEntry && + ( aEntry.iMtm == KSenduiMtmImap4Uid || + aEntry.iMtm == KSenduiMtmPop3Uid ) + ) + { + foundIndex = EMceBitmapIndexRemote; + TRAPD(err, ( unreadMessages = HasUnreadMessagesL( id, aMessageCount, unreadCount ) ) ); + if (err == KErrNone && unreadMessages ) + { + foundIndex++; + } + } + + if ( foundIndex == KErrNotFound ) + { + TInt err = KErrNone; + if ( aEntry.iType == KUidMsvServiceEntry || + aEntry.iType == KUidMsvFolderEntry) + { + TRAP(err, ( unreadMessages = HasUnreadMessagesL( id, aMessageCount, unreadCount ) ) ); + } + TRAP(err, ( foundIndex = LoadBitmapL( aEntry, unreadCount ) ) ); + if (err != KErrNone ) + { + foundIndex = KErrNotFound; + } + } + + return ( foundIndex == KErrNotFound ? + EMceBitmapIndexUnknown : foundIndex ); + } +#endif // RD_MSG_NAVIPANE_IMPROVEMENT +// ---------------------------------------------------- +// CMceBitmapResolver::LoadBitmapL +// ---------------------------------------------------- +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT +TInt CMceBitmapResolver::LoadBitmapL( const TMsvEntry& aEntry, TInt aPriority ) +#else +TInt CMceBitmapResolver::LoadBitmapL( const TMsvEntry& aEntry, TBool aHasUnreadMessages ) +#endif + { + CBaseMtmUiData* uiData=iRegObserver.GetMtmUiDataL( aEntry.iMtm ); + if ( uiData ) + { + TInt flags = 0; + if ( aEntry.iType == KUidMsvServiceEntry || + aEntry.iType == KUidMsvFolderEntry) + { + TBool unreadMessages = EFalse; + TInt err = KErrNone; +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT + TRAP( err, ( unreadMessages = HasUnreadMessagesL( aEntry.Id() ) ) ); +#else + unreadMessages = aHasUnreadMessages; +#endif // RD_MSG_NAVIPANE_IMPROVEMENT + + // leave error codes are filtered, because it is not important to know + // if there are unread messages or not, + // just different icon would be displayed + if (err == KErrNone && unreadMessages ) + { + flags = EMtudEntryStateOpen; // includes unread messages + } + + //check for sub folders + + TMsvSelectionOrdering selectionOrdering( KMsvGroupByType, EMsvSortByNone, ETrue ); + CMsvEntry* entry = iSession->GetEntryL( aEntry.Id() ); + entry->SetSortTypeL( selectionOrdering ); + CleanupStack::PushL( entry ); + TInt index = entry->Count()-1; + while ( ( index>=0 ) && ( (*entry)[index].iType != KUidMsvFolderEntry ) ) + { + index--; + } + CleanupStack::PopAndDestroy( entry ); + if( index != -1 ) + { + flags |= EMtudEntryStateSubFolder; + } + + } + + const CBaseMtmUiData::CBitmapArray* bitmaps = NULL; + +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT + if ( aPriority == KMceMmsPriority ) + { + bitmaps = &uiData->ContextIcon( aEntry, ETrue ); + } + else + { + bitmaps = &uiData->ContextIcon( aEntry, flags ); + } +#else + bitmaps = &uiData->ContextIcon( aEntry, flags ); + +#endif + + if ( bitmaps ) + { + CGulIcon* tempBmp = NULL; + + if ( bitmaps->Count() == 1 ) + { + tempBmp = CGulIcon::NewL( bitmaps->At( 0 ) ); + } + else if ( bitmaps->Count() > 1 ) + { + tempBmp = CGulIcon::NewL( bitmaps->At( 0 ), bitmaps->At( 1 ) ); + } + + if ( tempBmp ) + { + CleanupStack::PushL( tempBmp ); + tempBmp->SetBitmapsOwnedExternally( ETrue ); + +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT + if ( aPriority == KMceMmsPriority ) + { + iIcons->AppendL( tempBmp ); + } + else + { + TInt index = iIcons->Count() - 1; + iIcons->AppendL( tempBmp ); // Array will be of count 22 + // index greater than 20 so 21 or 22 + if ( index > iBitmapsLoaded ) + { + while ( iIcons->Count() != iBitmapsLoaded+1 ) + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + index--; + } + } + else + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + } + } +#else + TInt index = iIcons->Count() - 1; + iIcons->AppendL( tempBmp ); // Array will be of count 22 + // index greater than 20 so 21 or 22 + if ( index > iBitmapsLoaded ) + { + while ( iIcons->Count() != iBitmapsLoaded+1 ) + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + index--; + } + } + else + { + CGulIcon* iconToBeDelete = iIcons->At( index ); + iIcons->Delete( index ); + delete iconToBeDelete; + } + + +#endif + CleanupStack::Pop(); // tempBmp + } + } + else + { + return KErrNotFound; + } + } + else + { + // something is wrong + return EMceBitmapIndexUnknown; + } + return iIcons->Count() - 1; + } + +#ifndef RD_MSG_NAVIPANE_IMPROVEMENT +// ---------------------------------------------------- +// CMceBitmapResolver::HasUnreadMessagesL +// ---------------------------------------------------- +TBool CMceBitmapResolver::HasUnreadMessagesL( const TMsvId aId ) + { + TBool unreadMessages = EFalse; + CMsvEntry* entry = iSession->GetEntryL( aId ); + CleanupStack::PushL( entry ); + + const TInt count = entry->Count(); + for ( TInt loop = 0; !unreadMessages && loop < count; loop++ ) + { + if ( (*entry)[loop].iType.iUid == KUidMsvFolderEntryValue ) + { + unreadMessages = HasUnreadMessagesL( (*entry)[loop].Id() ); + } + else + { + unreadMessages = (*entry)[loop].Unread(); + } + } + + CleanupStack::PopAndDestroy( entry ); + + return unreadMessages; + } +#else + +// ---------------------------------------------------- +// CMceBitmapResolver::HasUnreadMessagesL +// ---------------------------------------------------- +TBool CMceBitmapResolver::HasUnreadMessagesL( + const TMsvId aFolderId, TInt& aMessages, TInt& aUnreadMessages ) + { + CMsvEntry* entry = iSession->GetEntryL( aFolderId ); + CleanupStack::PushL( entry ); + + const TInt count = entry->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + const TMsvEntry& tEntry = (*entry)[loop]; + if ( tEntry.iType == KUidMsvFolderEntry ) + { + HasUnreadMessagesL( tEntry.Id(), aMessages, aUnreadMessages ); + } + else if ( tEntry.iType == KUidMsvMessageEntry ) + { + aMessages++; + if ( tEntry.Unread() ) + { + aUnreadMessages++; + } + } + } + + CleanupStack::PopAndDestroy(entry); // entry + return aUnreadMessages; + } + +#endif // RD_MSG_NAVIPANE_IMPROVEMENT + +// ---------------------------------------------------- +// CMceBitmapResolver::LocalEntryBitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::LocalEntryBitmapIndex( TMsvId aEntryId ) const + { + TInt foundIndex = EMceBitmapIndexFolderSmall; + switch( aEntryId ) + { + case KMsvGlobalInBoxIndexEntryId: + foundIndex = EMceBitmapIndexInbox; + break; + case KMsvGlobalOutBoxIndexEntryId: + foundIndex = EMceBitmapIndexOutbox; + break; + case KMsvDraftEntryId: + foundIndex = EMceBitmapIndexDrafts; + break; + case KMsvSentEntryId: + foundIndex = EMceBitmapIndexSent; + break; + case KMceDocumentsEntryId: + foundIndex = EMceBitmapIndexDocuments; + break; + case KMceTemplatesEntryId: + foundIndex = EMceBitmapIndexFolderTemp; + break; + default: + // set in foundIndex declaration + break; + } + return foundIndex; + } + +// ---------------------------------------------------- +// CMceBitmapResolver::ChangeBitmapInIconArrayL +// ---------------------------------------------------- +void CMceBitmapResolver::ChangeBitmapInIconArrayL( ) + { + TBool colorSkinnedBitmap = EFalse; + TAknsItemID id; + id.iMajor = 0; + id.iMinor = 0; + TMceBitmapListItem bitmapListItem; + + TInt count = iIcons->Count(); + TInt bitmapIndex = 0; + TPtrC fileName( iFilenameMuiu ); + MAknsSkinInstance* skins = AknsUtils::SkinInstance(); + + for ( TInt cc=count; --cc>=0; ) + { + colorSkinnedBitmap = EFalse; + switch( cc ) + { + case EMceBitmapIndexWrite: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_write_sub; + id = KAknsIIDQgnPropMceWriteSub; + break; + case EMceBitmapIndexRemote: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_remote_sub; + id = KAknsIIDQgnPropMceRemoteSub; + break; + case EMceBitmapIndexRemoteNew: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_remote_new_sub; + id = KAknsIIDQgnPropMceRemoteNewSub; + break; + case EMceBitmapIndexDr: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_dr_sub; + id = KAknsIIDQgnPropMceDrSub; + break; + case EMceBitmapIndexInbox: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_inbox_sub; + id = KAknsIIDQgnPropMceInboxSub; + break; + case EMceBitmapIndexInboxNew: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_inbox_new_sub; + id = KAknsIIDQgnPropMceInboxNewSub; + break; + case EMceBitmapIndexDocuments: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_documents_sub; + id = KAknsIIDQgnPropMceDocumentsSub; + break; + case EMceBitmapIndexDocumentsNew: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_documents_new_sub; + id = KAknsIIDQgnPropMceDocumentsNewSub; + break; + case EMceBitmapIndexDrafts: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_drafts_sub; + id = KAknsIIDQgnPropMceDraftsSub; + break; + case EMceBitmapIndexSent: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_sent_sub; + id = KAknsIIDQgnPropMceSentSub; + break; + case EMceBitmapIndexOutbox: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_outbox_sub; + id = KAknsIIDQgnPropMceOutboxSub; + break; + case EMceBitmapIndexUnknown: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_unknown_read; + id = KAknsIIDQgnPropMceUnknownRead; + break; + case EMceBitmapIndexFolderTemp: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_prop_folder_temp; + id = KAknsIIDQgnPropMceTemplate; + break; + case EMceBitmapIndexFolderSmall: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_prop_folder_small; + id = KAknsIIDQgnPropFolderSmall; + break; + case EMceBitmapIndexFolderSmallNew: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_prop_folder_small_new; + id = KAknsIIDQgnPropFolderSmallNew; + break; + case EMceBitmapIndexAttachment: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_indi_attach_add; + id = KAknsIIDQgnIndiAttachementAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexMailboxConnectionOn: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_indi_connection_on_add; + id = KAknsIIDQgnIndiConnectionOnAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexMessageSelected: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_indi_marked_add; + id = KAknsIIDQgnIndiMarkedAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexAlwaysAdd: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_indi_connection_always_add; + id = KAknsIIDQgnIndiConnectionAlwaysAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexAlwaysRoaming: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_indi_connection_on_roam_add; + id = KAknsIIDQgnIndiConnectionInactiveAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexPriorityHigh: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_indi_mce_priority_high; + id = KAknsIIDQgnIndiMcePriorityHigh; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexPriorityLow: + fileName.Set( iFilenameAvkon ); + bitmapIndex = EMbmAvkonQgn_indi_mce_priority_low; + id = KAknsIIDQgnIndiMcePriorityLow; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexInactiveAdd: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_indi_connection_inactive_add; + id = KAknsIIDQgnIndiConnectionInactiveAdd; + colorSkinnedBitmap = ETrue; + break; + case EMceBitmapIndexConversation: + { + _LIT( KMceExtraIconsDirAndFile,"MceExtraIcons.mbm" ); + TParse cvfp; + cvfp.Set(KMceExtraIconsDirAndFile, &KDC_APP_BITMAP_DIR, NULL ); + fileName.Set(cvfp.FullName()); + bitmapIndex = EMbmMceextraiconsQgn_prop_im_ibox; + id = KAknsIIDQgnPropImIbox; + colorSkinnedBitmap = EFalse; + } + break; + + case EMceBitmapIndexConversationNew: + { + _LIT( KMceExtraIconsDirAndFile,"MceExtraIcons.mbm" ); + TParse cvfp; + cvfp.Set(KMceExtraIconsDirAndFile, &KDC_APP_BITMAP_DIR, NULL ); + fileName.Set(cvfp.FullName()); + bitmapIndex = EMbmMceextraiconsQgn_prop_im_ibox_new; + id = KAknsIIDQgnPropImIboxNew; + colorSkinnedBitmap = EFalse; + } + break; + case EMceBitmapIndexReplaceMtmIcon: + default: + fileName.Set( iFilenameMuiu ); + bitmapIndex = EMbmMuiuQgn_prop_mce_unknown_read; + id = KAknsIIDQgnPropMceUnknownRead; + break; + } + + if ( cc < iIconIndexes->Count() ) + { + bitmapListItem = (*iIconIndexes)[cc]; + } + else + { + bitmapListItem.iExtraItem = EFalse; + } + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + if ( bitmapListItem.iExtraItem && + bitmapListItem.iId >= KMceFirstExtraItemId + ) + { + if ( bitmapListItem.iType.iUid > 0 && + bitmapListItem.iType.iUid != KUidMsvFolderEntryValue ) + { + // this is extra item and it has application uid, try to load it! + TUid uid = bitmapListItem.iType; + AknsUtils::CreateAppIconLC( + skins, + uid, + EAknsAppIconTypeList, + bitmap, + mask ); + CleanupStack::Pop(2); + } + else + { + // do no changes, this is extremly dirty way but once in the lifetime... + continue; + } + } + + if ( !bitmap ) + { + if ( colorSkinnedBitmap ) + { + TRgb rgb; // What to add here? + + AknsUtils::CreateColorIconL( + skins, + id, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG13, + bitmap, + mask, + fileName, + bitmapIndex, + bitmapIndex + 1, + rgb ); + + } + else + { + AknsUtils::CreateIconL( skins, id, bitmap, + mask, fileName, bitmapIndex, bitmapIndex + 1 ); + } + } + + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + + CleanupStack::PushL( icon ); + CGulIcon* iconToBeDelete = iIcons->At( cc ); + iIcons->At( cc ) = icon; + delete iconToBeDelete; + iconToBeDelete = NULL; + + CleanupStack::Pop( icon ); + + } + } + +// ---------------------------------------------------- +// CMceBitmapResolver::LocalEntryBitmapIndex +// ---------------------------------------------------- +TInt CMceBitmapResolver::MtmIconIndex() + { + return iBitmapsLoaded; + } + +// ---------------------------------------------------- +// CMceBitmapResolver::DescriptionLength +// ---------------------------------------------------- +TInt CMceBitmapResolver::DescriptionLength() + { + return iDescriptionLength; + } + +#ifdef RD_MSG_NAVIPANE_IMPROVEMENT +// ---------------------------------------------------- +// CMceBitmapResolver::FindVisibleCountL +// ---------------------------------------------------- +TInt CMceBitmapResolver::FindVisibleCountL(TMsvId aFolderId ) const + { + // This function can be optimzied further + // after the new optimized API from message store + // This is applicable for Draft\sent\outbox + + TInt visiblecount=0; + TInt emailcount=0; + TInt itemcount; + + // Cmail message count needs to be filtered + CMsvEntry* entry = iSession->GetEntryL( aFolderId ); + CleanupStack::PushL( entry ); + itemcount=entry->Count(); + + //Find email messages + CMsvEntrySelection *smtpselection = entry->ChildrenWithMtmL( KUidMsgTypeSMTP ); + CleanupStack::PushL( smtpselection ); + + CMsvEntrySelection *pop3selection = NULL; + CMsvEntrySelection *imapselection = NULL ; + CMsvEntrySelection *cmailselection = NULL ; + + if(!iEmailFramework) + { + pop3selection = entry->ChildrenWithMtmL( KUidMsgTypePOP3 ); + CleanupStack::PushL( pop3selection ); + imapselection = entry->ChildrenWithMtmL( KUidMsgTypeIMAP4 ); + CleanupStack::PushL( imapselection ); + } + else + { + cmailselection = entry->ChildrenWithMtmL( + TUid::Uid(KUidMsgTypeFsMtmVal)); + CleanupStack::PushL( cmailselection ); + } + + if ( smtpselection!=0 && smtpselection->Count()>0 ) + { + emailcount=emailcount+smtpselection->Count(); + } + + if(!iEmailFramework) + { + if ( pop3selection!=0 && pop3selection->Count()>0 ) + { + emailcount=emailcount+pop3selection->Count(); + } + if ( imapselection!=0 && imapselection->Count()>0 ) + { + emailcount=emailcount+imapselection->Count(); + } + } + else + { + if ( cmailselection!=0 && cmailselection->Count()>0 ) + { + emailcount=emailcount+cmailselection->Count(); + } + } + + visiblecount = itemcount - emailcount; + + if(iEmailFramework) + { + CleanupStack::PopAndDestroy( cmailselection ); + } + else + { + CleanupStack::PopAndDestroy(imapselection); + CleanupStack::PopAndDestroy( pop3selection ); + } + CleanupStack::PopAndDestroy( smtpselection ); + CleanupStack::PopAndDestroy( entry ); + return visiblecount; + } + +// ---------------------------------------------------- +// CMceBitmapResolver::FindVisibleCountWithUnreadMessageL +// ---------------------------------------------------- +TInt CMceBitmapResolver::FindVisibleCountWithUnreadMessageL(TMsvId aFolderId + , TBool& aUnreadMessages) const + { + // This function can be optimzied further + // after the new optimized API from message store + // This is applicable for Inbox + + aUnreadMessages = EFalse; + TInt itemcount; + CMsvEntry* entry = iSession->GetEntryL( aFolderId ); + CleanupStack::PushL( entry ); + itemcount=entry->Count(); + + // No need of cmail filtering, because Mailbox has its own + // Inbox folder + // Check at least one Unread message + for ( TInt loop = 0; loop < itemcount; loop++ ) + { + const TMsvEntry& tEntry = (*entry)[loop]; + if ( tEntry.iType == KUidMsvMessageEntry ) + { + if ( tEntry.Unread() ) + { + aUnreadMessages= ETrue; + break; + } + } + } + CleanupStack::PopAndDestroy( entry ); + + return itemcount; + } + +#endif //RD_MSG_NAVIPANE_IMPROVEMENT +// End of File