diff -r e64954c2c8e2 -r e8f259fad141 emailservices/emailstore/base_plugin/src/baseplugindelayedops.cpp --- a/emailservices/emailstore/base_plugin/src/baseplugindelayedops.cpp Tue Apr 27 16:20:14 2010 +0300 +++ b/emailservices/emailstore/base_plugin/src/baseplugindelayedops.cpp Tue May 11 15:57:15 2010 +0300 @@ -18,7 +18,6 @@ #include "baseplugindelayedops.h" #include "baseplugindelayedopsprivate.h" -#include "NestedAO.h" /////////////////////////////////////////////////// // CDelayedOp // @@ -46,9 +45,21 @@ /** * */ +/*public*/ EXPORT_C void CDelayedOp::StartOp() + { + iStatus = KRequestPending; + SetActive(); + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrNone ); + } + +/** + * + */ /*protected*/ EXPORT_C CDelayedOp::CDelayedOp() - : CAsyncOneShot( CActive::EPriorityIdle ) + : CActive( CActive::EPriorityIdle ) { + CActiveScheduler::Add( this ); } /** @@ -57,7 +68,9 @@ /*private virtual*/ EXPORT_C void CDelayedOp::RunL() { __LOG_ENTER_SUPPRESS( "Run" ); - TRAPD( err, ExecuteOpL() ); + TBool again( EFalse ); + + TRAPD( err, again = ExecuteOpL() ); if ( KErrNone != err ) { @@ -65,9 +78,16 @@ "Error while executing delayed operation: %d.", err ); } - //self-destroy. - iManager->DequeueOp( *this ); - delete this; + if ( again ) + { + StartOp(); + } + else + { + //self-destroy. + iManager->DequeueOp( *this ); + delete this; + } } /** @@ -123,7 +143,7 @@ { iDelayedOps.AppendL( aOp ); aOp->SetContext( iPlugin, *this ); - aOp->Call(); + aOp->StartOp(); } /** @@ -231,63 +251,6 @@ /** * */ -/*public virtual*/TBool CDelayedDeleteMessagesOp::DeleteMessagesInChunksL( TInt aStartIndex ) - { - __LOG_ENTER( "DeleteMessagesInChunksL" ); - TBool done=EFalse; - TInt endIndex; - if( aStartIndex + KSizeOfChunk < iMessages.Count() ) - { - endIndex = aStartIndex + KSizeOfChunk; - } - else - { - endIndex = iMessages.Count(); - done=ETrue; - } - CMailboxInfo& mailBoxInfo - = GetPlugin().GetMailboxInfoL( iMailBoxId ); - CMsgStoreMailBox& mailBox = mailBoxInfo(); - - for ( TInt i = aStartIndex; i < endIndex; ++i ) - { - TMsgStoreId msgId = iMessages[i]; - - if ( EFalse == iImmediateDelete ) - { - //try to find the message in the deleted items folder. - CMsgStoreMessage* theMessage = NULL; - TRAP_IGNORE( theMessage = mailBox.FetchMessageL( - msgId, mailBoxInfo.iRootFolders.iFolders[EFSDeleted] ) ); - - if ( NULL == theMessage ) - { - //if not in deleted items then move it there. - __LOG_WRITE8_FORMAT1_INFO("Moving message 0x%X to the deleted items.", msgId ); - mailBox.MoveMessageL( - msgId, KMsgStoreInvalidId, - mailBoxInfo.iRootFolders.iFolders[EFSDeleted] ); - } - else - { - //in deleted items, really delete it. - __LOG_WRITE8_FORMAT1_INFO( "Deleting message 0x%X.", msgId ); - - delete theMessage; - mailBox.DeleteMessageL( msgId, iFolderId ); - } - } - else - { - mailBox.DeleteMessageL( msgId, iFolderId ); - } - } - __LOG_EXIT; - return done; - } -/** - * - */ /*private*/ void CDelayedDeleteMessagesOp::ConstructL( const RArray& aMessages ) @@ -320,33 +283,67 @@ TMsgStoreId aMailBoxId, TMsgStoreId aFolderId ) : - iMailBoxId( aMailBoxId ), iFolderId( aFolderId ), - iImmediateDelete( EFalse ), iState ( EFree ) + iMailBoxId( aMailBoxId ), iFolderId( aFolderId ) { } /** * */ -/*private*/ void CDelayedDeleteMessagesOp::ExecuteOpL() +/*private*/ TBool CDelayedDeleteMessagesOp::ExecuteOpL() { __LOG_ENTER( "ExecuteOpL" ); - if ( iState != EFree ) + + //Maximum number of messages deleted in one go + const TInt KNumOfDeletesBeforeYield = 30; + + TBool runAgain = ETrue; + TInt endIndex = iIndex + KNumOfDeletesBeforeYield; + + if( endIndex >= iMessages.Count() ) { - //this code becomes re-entrant now because we use nested AS. - // so if we are already authenticating, return right away. - return; + endIndex = iMessages.Count(); + runAgain = EFalse; // last time, no need to run again. } - iState=EInProgress; - CNestedAO* nestedAO = CNestedAO::NewL( *this ); - //this is a blocking call with nested active scheduler - //This method makes a callback periodically to DeleteMessagesInChunks - //to delete the messages one chunk at a time - nestedAO->DeleteMessagesAsync(); - //continue execution here - delete nestedAO; - iState = EFree; + + CMailboxInfo& mailBoxInfo = GetPlugin().GetMailboxInfoL( iMailBoxId ); + CMsgStoreMailBox& mailBox = mailBoxInfo(); + + for ( ; iIndex < endIndex; iIndex++ ) + { + TMsgStoreId msgId = iMessages[iIndex]; + + if ( EFalse == iImmediateDelete ) + { + //try to find the message in the deleted items folder. + CMsgStoreMessage* theMessage = NULL; + TRAP_IGNORE( theMessage = mailBox.FetchMessageL( + msgId, mailBoxInfo.iRootFolders.iFolders[ EFSDeleted ] ) ); + + if ( NULL == theMessage ) + { + //if not in deleted items then move it there. + __LOG_WRITE8_FORMAT1_INFO("Moving message 0x%X to the deleted items.", msgId ); + mailBox.MoveMessageL( msgId, KMsgStoreInvalidId, + mailBoxInfo.iRootFolders.iFolders[ EFSDeleted ] ); + } + else + { + //in deleted items, really delete it. + __LOG_WRITE8_FORMAT1_INFO( "Deleting message 0x%X.", msgId ); + + delete theMessage; + mailBox.DeleteMessageL( msgId, iFolderId ); + } + } + else + { + mailBox.DeleteMessageL( msgId, iFolderId ); + } + } + __LOG_EXIT; + return runAgain; } @@ -419,7 +416,7 @@ /** * CDelayedOp::ExecuteOpL */ -/*public virtual*/ void CDelayedSetContentOp::ExecuteOpL() +/*public virtual*/ TBool CDelayedSetContentOp::ExecuteOpL() { __LOG_ENTER( "ExecuteOpL" ) @@ -446,8 +443,10 @@ "Updated the properties of part 0x%X.", part->Id() ) } - CleanupStack::PopAndDestroy( part ); + CleanupStack::PopAndDestroy( part ); + __LOG_EXIT + return EFalse; } /**