diff -r 67369d1b217f -r 6b8f3b30d0ec emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Tue May 25 12:23:16 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Wed Jun 09 09:22:57 2010 +0300 @@ -54,7 +54,8 @@ CMailCpsHandler::CMailCpsHandler( MFSNotificationHandlerMgr& aOwner ): CFSNotificationHandlerBase( aOwner ), iWaitingForNewMailbox( NULL ), - iWaitingForNewWidget() + iWaitingForNewWidget(), + iUpdateHelper( NULL ) { FUNC_LOG; iWaitingForNewWidget.SetPluginId( KNullUid ); @@ -108,6 +109,7 @@ CMailCpsHandler::~CMailCpsHandler() { FUNC_LOG; + delete iUpdateHelper; delete iLiwIf; delete iSettings; iAccountsArray.ResetAndDestroy(); @@ -350,6 +352,20 @@ void CMailCpsHandler::UpdateFullL() { FUNC_LOG; + if ( !iUpdateHelper ) + { + iUpdateHelper = CMailCpsUpdateHelper::NewL( this ); + } + iUpdateHelper->UpdateL(); + } + +// --------------------------------------------------------- +// CMailCpsHandler::DoUpdateFullL +// --------------------------------------------------------- +// +void CMailCpsHandler::DoUpdateFullL() + { + FUNC_LOG; for (TInt instance = 0; instance < iLiwIf->GetWidgetInstanceCount(); instance++) { if ( iLiwIf->AllowedToPublish(instance) ) @@ -981,13 +997,6 @@ User::Leave( KErrArgument ); } - // Find mailbox instance from array - CMailMailboxDetails* mailbox = FindMailboxDetails( aMailbox ); - if ( !mailbox ) - { - return; - } - // typecast param2 TFSMailMsgId* parentFolder = static_cast( aParam2 ); @@ -1018,6 +1027,7 @@ // Loop through message array TFSMailMsgId msgId; CFSMailMessage* msg( NULL ); + CMailMailboxDetails* mailbox; for ( TInt ii = 0; ii < iiMax; ii++ ) { msgId = (*newEntries)[ii]; @@ -1038,6 +1048,15 @@ continue; } + // Find mailbox instance from array + mailbox = FindMailboxDetails( aMailbox ); + if ( !mailbox ) + { + CleanupStack::PopAndDestroy( msg ); + CleanupStack::PopAndDestroy( newEntries ); + return; + } + // Check if message is duplicate if ( IsDuplicate( *mailbox, msgId ) ) { @@ -1992,3 +2011,103 @@ } return backupOrRestore; } + +// ---------------------------------------------------------------------------- +// class CMailCpsUpdateHelper : public CTimer +// Used to limit the rate of updates to Homescreen widget +// ---------------------------------------------------------------------------- +// + +CMailCpsUpdateHelper::CMailCpsUpdateHelper( + CMailCpsHandler *aHandler ) + : CTimer( EPriorityStandard ) // Could be EPriorityLow + , iCpsHandler( aHandler ) + , iPending( EFalse ) + { + FUNC_LOG; + } + +CMailCpsUpdateHelper* CMailCpsUpdateHelper::NewLC( CMailCpsHandler* aHandler ) + { + FUNC_LOG; + CMailCpsUpdateHelper* self = new ( ELeave ) CMailCpsUpdateHelper( aHandler ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CMailCpsUpdateHelper* CMailCpsUpdateHelper::NewL( CMailCpsHandler *aHandler ) + { + FUNC_LOG; + CMailCpsUpdateHelper* self = CMailCpsUpdateHelper::NewLC( aHandler ); + CleanupStack::Pop( self ); + return self; + } + +void CMailCpsUpdateHelper::ConstructL() + { + FUNC_LOG; + CTimer::ConstructL(); + CActiveScheduler::Add( this ); + } + +CMailCpsUpdateHelper::~CMailCpsUpdateHelper() + { + FUNC_LOG; + iCpsHandler = NULL; // Not owned + Cancel(); // Stop any pending request + Deque(); // Remove from CActiveScheduler + } + +// Notification that Homescreen widget(s) should be updated +void CMailCpsUpdateHelper::UpdateL() + { + FUNC_LOG; + if ( IsActive() ) + { + // Timer is running, so just flag that an update should be sent when + // the timer expires. + iPending = ETrue; + } + else + { + // Timer is not running, so perform an update and set the timer + // running. + DoUpdateL(); + } + } + +// Actually perform an update of the Homescreen widget. Also sets the timer +// running and clears the pending flag. +void CMailCpsUpdateHelper::DoUpdateL() + { + FUNC_LOG; + // Set the timer running. + After( KMailCpsHandlerUpdateDelay ); + // Clear the pending flag. + iPending = EFalse; + // Do the update. + iCpsHandler->DoUpdateFullL(); + } + +void CMailCpsUpdateHelper::RunL() + { + FUNC_LOG; + if ( iPending ) + { + // There was an update request since the last update, so do another + // update (and set the timer running again, etc.). + DoUpdateL(); + } + } + +TInt CMailCpsUpdateHelper::RunError( TInt aError ) + { + FUNC_LOG; + if ( KErrNone != aError ) + { + Cancel(); // Stop any pending request + } + return KErrNone; // Don't panic the thread + } +