--- a/ipsservices/ipssosplugin/src/ipsplgmsgiterator.cpp Fri Jul 02 15:55:16 2010 +0300
+++ b/ipsservices/ipssosplugin/src/ipsplgmsgiterator.cpp Fri Jul 09 12:17:13 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<TFSMailSortCriteria>& 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<TFSMailSortCriteria>& 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);
+ }
+ }
+