diff -r 997a02608b3a -r 16ed8d08d0b1 ipsservices/ipssosplugin/src/ipsplgmsgiterator.cpp --- a/ipsservices/ipssosplugin/src/ipsplgmsgiterator.cpp Tue Jul 06 14:04:34 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgmsgiterator.cpp Wed Aug 18 09:37:47 2010 +0300 @@ -33,8 +33,7 @@ { FUNC_LOG; CIpsPlgMsgIterator* self = - new( ELeave ) CIpsPlgMsgIterator( aPlugin, aMailboxId, aDetails, - aSorting ); + new( ELeave ) CIpsPlgMsgIterator( aPlugin, aMailboxId, aDetails ); CleanupStack::PushL( self ); self->ConstructL( aMsvSession, aFolderId, aSorting ); CleanupStack::Pop( self ); @@ -53,8 +52,7 @@ { FUNC_LOG; CIpsPlgMsgIterator* self = - new( ELeave ) CIpsPlgMsgIterator( aPlugin, aMailboxId, aDetails, - aSorting ); + new( ELeave ) CIpsPlgMsgIterator( aPlugin, aMailboxId, aDetails ); CleanupStack::PushL( self ); self->ConstructL( aFolderEntry, aSorting ); CleanupStack::Pop( self ); @@ -73,6 +71,8 @@ delete iMsgMapper; delete iMsgSortKey; delete iMsgSwapper; + delete iMessages; + iSortingCriteria.Reset(); } // --------------------------------------------------------------------------- @@ -89,15 +89,16 @@ TBool result = EFalse; TInt baseIndex; - // Messages are sorted always before reading the messages - Sort(); - - CMsvEntrySelection* messages = FilterMessagesL(); - CleanupStack::PushL( messages ); + if ( !iMessages ) + { + // Messages are sorted before first reading the messages + Sort(); + iMessages = FilterMessagesL(); + } if ( !aCurrentMessageId.IsNullId() ) { - baseIndex = messages->Find( aCurrentMessageId.Id() ); + baseIndex = iMessages->Find( aCurrentMessageId.Id() ); // aCurrentMessageId is not included to the result set if ( baseIndex != KErrNotFound ) @@ -112,12 +113,11 @@ } if ( ( baseIndex != KErrNotFound ) && - ( baseIndex < messages->Count() ) ) + ( baseIndex < iMessages->Count() ) ) { - result = NextL(baseIndex, messages, aCount, aMessages); + result = NextL(baseIndex, iMessages, aCount, aMessages); } - CleanupStack::PopAndDestroy(messages); return result; } @@ -136,20 +136,20 @@ TInt status; TInt baseIndex; - // Messages are sorted always before reading the messages - Sort(); + if ( !iMessages ) + { + // Messages are sorted before first reading the messages + Sort(); + iMessages = FilterMessagesL(); + } - CMsvEntrySelection* messages = FilterMessagesL(); - CleanupStack::PushL( messages ); - - status = SearchL( messages, aStartWith, baseIndex ); + status = SearchL( iMessages, aStartWith, baseIndex ); if ( status == KErrNone ) { - result = NextL(baseIndex, messages, aCount, aMessages); + result = NextL( baseIndex, iMessages, aCount, aMessages ); } - CleanupStack::PopAndDestroy(messages); return result; } @@ -168,15 +168,16 @@ TBool result = EFalse; TInt baseIndex; - // Messages are sorted always before reading the messages - Sort(); - - CMsvEntrySelection* messages = FilterMessagesL(); - CleanupStack::PushL(messages); + if ( !iMessages ) + { + // Messages are sorted before first reading the messages + Sort(); + iMessages = FilterMessagesL(); + } if ( !aCurrentMessageId.IsNullId() ) { - baseIndex = messages->Find(aCurrentMessageId.Id()); + baseIndex = iMessages->Find(aCurrentMessageId.Id()); // aCurrentMessageId is not included to the result set if ( baseIndex != KErrNotFound ) @@ -188,7 +189,7 @@ { // check whether we should start from the end of // the message list in the case of a NULL ID - baseIndex = messages->Count() - 1; + baseIndex = iMessages->Count() - 1; } // Actually, if the matching message is the first one, baseIndex is equal @@ -198,10 +199,9 @@ if ( ( baseIndex != KErrNotFound ) && ( baseIndex >= 0 ) ) { - result = PreviousL(baseIndex, messages, aCount, aMessages); + result = PreviousL(baseIndex, iMessages, aCount, aMessages); } - CleanupStack::PopAndDestroy(messages); return result; } @@ -231,14 +231,13 @@ CMsvEntrySelection* messages = FilterMessagesL(); CleanupStack::PushL( messages ); - status = SearchL( messages, aStartWith, baseIndex ); + status = SearchL( iMessages, aStartWith, baseIndex ); if ( status == KErrNone ) { - result = PreviousL(baseIndex, messages, aCount, aMessages); + result = PreviousL(baseIndex, iMessages, aCount, aMessages); } - CleanupStack::PopAndDestroy(messages); return result; } @@ -267,7 +266,7 @@ { fsMsg = iMsgMapper->GetMailMessageL( iMailboxId, entry, iRequestedDetails ); - aMessages.Append( fsMsg ); + aMessages.AppendL( fsMsg ); counter++; } i++; @@ -307,7 +306,7 @@ { fsMsg = iMsgMapper->GetMailMessageL( iMailboxId, entry, iRequestedDetails ); - aMessages.Insert( fsMsg, 0 ); + aMessages.InsertL( fsMsg, 0 ); counter++; } i--; @@ -323,10 +322,9 @@ CIpsPlgMsgIterator::CIpsPlgMsgIterator( CIpsPlgSosBasePlugin& aPlugin, const TFSMailMsgId& aMailboxId, - const TFSMailDetails aDetails, - const RArray& aSorting ) + const TFSMailDetails aDetails ) : iPlugin( aPlugin ), iRequestedDetails( aDetails ), - iSortingCriteria( aSorting ), iMailboxId( aMailboxId ) + iMailboxId( aMailboxId ) { FUNC_LOG; // none @@ -344,7 +342,9 @@ { FUNC_LOG; iFolderEntry = aMsvSession.GetEntryL( aFolderId.Id() ); - iMsgSortKey = new (ELeave) TIpsPlgMsgKey( *iFolderEntry, aSorting ); + + StoreSortCriteriaL(aSorting); + iMsgSortKey = new (ELeave) TIpsPlgMsgKey( *iFolderEntry, iSortingCriteria ); iMsgSwapper = new (ELeave) TIpsPlgMsgSwap( *iFolderEntry ); iSortingOn = ( aSorting.Count() > 0 ) && ( aSorting[0].iField != EFSMailDontCare); @@ -363,7 +363,8 @@ { FUNC_LOG; iFolderEntry = aFolderEntry; - iMsgSortKey = new (ELeave) TIpsPlgMsgKey( *iFolderEntry, aSorting ); + StoreSortCriteriaL(aSorting); + iMsgSortKey = new (ELeave) TIpsPlgMsgKey( *iFolderEntry, iSortingCriteria ); iMsgSwapper = new (ELeave) TIpsPlgMsgSwap( *iFolderEntry ); iSortingOn = ( aSorting.Count() > 0 ) && ( aSorting[0].iField != EFSMailDontCare); @@ -482,3 +483,19 @@ return filteredEntries; } +// ----------------------------------------------------------------------------- +// stores sort criteria given by user +// ----------------------------------------------------------------------------- +void CIpsPlgMsgIterator::StoreSortCriteriaL( + const RArray& aSorting ) + { + for ( TInt i=0; i < aSorting.Count(); i++ ) + { + const TFSMailSortCriteria& criteria = aSorting[i]; + TFSMailSortCriteria fsCriteria; + fsCriteria.iField = criteria.iField; + fsCriteria.iOrder = criteria.iOrder; + iSortingCriteria.AppendL(fsCriteria); + } + } +