diff -r b5fbb9b25d57 -r 67369d1b217f emailuis/emailui/src/ceuiexitguardian.cpp --- a/emailuis/emailui/src/ceuiexitguardian.cpp Tue May 11 15:57:15 2010 +0300 +++ b/emailuis/emailui/src/ceuiexitguardian.cpp Tue May 25 12:23:16 2010 +0300 @@ -19,21 +19,22 @@ #include "ceuiexitguardian.h" #include "emailtrace.h" + // --------------------------------------------------------------------------- // CEUiExitGuardian::NewL // // --------------------------------------------------------------------------- // CEUiExitGuardian* CEUiExitGuardian::NewL( CFreestyleEmailUiAppUi& aAppUi ) - { + { FUNC_LOG; - CEUiExitGuardian* self = new (ELeave) CEUiExitGuardian(aAppUi); - CleanupStack::PushL(self); + CEUiExitGuardian* self = new (ELeave) CEUiExitGuardian( aAppUi ); + CleanupStack::PushL( self ); self->ConstructL(); - CleanupStack::Pop(self); + CleanupStack::Pop( self ); return self; - } + } // --------------------------------------------------------------------------- // CEUiExitGuardian::CEUiExitGuardian @@ -41,7 +42,7 @@ // --------------------------------------------------------------------------- // CEUiExitGuardian::CEUiExitGuardian( CFreestyleEmailUiAppUi& aAppUi ) - : iAppUi(aAppUi) + : iAppUi( aAppUi ) { FUNC_LOG; } @@ -55,9 +56,14 @@ { FUNC_LOG; - delete iIdle; + if ( iPeriodicTimer ) + { + iPeriodicTimer->Cancel(); + delete iPeriodicTimer; + } } + // --------------------------------------------------------------------------- // CEUiExitGuardian::ConstructL // @@ -67,86 +73,52 @@ { FUNC_LOG; - iIdle = CIdle::NewL(CActive::EPriorityStandard); + iPeriodicTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + iPeriodicTimerStarted = EFalse; } + // --------------------------------------------------------------------------- -// CEUiExitGuardian::EnterLC +// CEUiExitGuardian::PeriodicCallBack // // --------------------------------------------------------------------------- // -void CEUiExitGuardian::EnterLC() - { - FUNC_LOG; - - if (iExitPending) - { - User::Leave(KErrNotReady); - } - iEnterCount++; - CleanupStack::PushL(TCleanupItem(Exit, this)); - } - -// --------------------------------------------------------------------------- -// CEUiExitGuardian::Exit -// -// --------------------------------------------------------------------------- -// -void CEUiExitGuardian::Exit(TAny* aPtr) - { - FUNC_LOG; - - reinterpret_cast(aPtr)->DoExit(); - } - -// --------------------------------------------------------------------------- -// CEUiExitGuardian::DoExit -// -// --------------------------------------------------------------------------- -// -void CEUiExitGuardian::DoExit() +TInt CEUiExitGuardian::PeriodicCallBack( TAny* aPtr ) { FUNC_LOG; - iEnterCount--; - if (iExitPending && !iEnterCount && !iIdle->IsActive()) - { - // Start async exit processing to rewind recursion before the actual - // exit - iIdle->Start( TCallBack( IdleCallBack, this ) ); - } + reinterpret_cast(aPtr)->TryExitApplication(); + return KErrNone; } + // --------------------------------------------------------------------------- -// CEUiExitGuardian::IdleCallBack +// CEUiExitGuardian::TryExitApplication // // --------------------------------------------------------------------------- // -TInt CEUiExitGuardian::IdleCallBack( TAny* aPtr ) +TInt CEUiExitGuardian::TryExitApplication() { FUNC_LOG; - - reinterpret_cast( aPtr )->iAppUi.ExitNow(); - return KErrNone; - } + const TInt KDelay = 200*1000; // 200 ms + + TInt ret = KRequestPending; -// --------------------------------------------------------------------------- -// CEUiExitGuardian::ExitApplication -// -// --------------------------------------------------------------------------- -// -TInt CEUiExitGuardian::ExitApplication() - { - FUNC_LOG; - - TInt result( KRequestPending ); - iExitPending = ETrue; - if (!iEnterCount) + CActiveScheduler* scheduler = CActiveScheduler::Current(); + TInt nestedLevelCount = scheduler->StackDepth(); + if ( nestedLevelCount == 1 ) { - result = KErrNone; + iPeriodicTimer->Cancel(); iAppUi.ExitNow(); + ret = KErrNone; } - return result; + else if ( !iPeriodicTimerStarted ) + { + iPeriodicTimer->Start( KDelay, KDelay, TCallBack(PeriodicCallBack, this) ); + iPeriodicTimerStarted = ETrue; + } + + return ret; } // end of file