diff -r b183ec05bd8c -r 19bba8228ff0 omaprovisioning/provisioning/ProvisioningCx/Src/CWPCxDeleter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omaprovisioning/provisioning/ProvisioningCx/Src/CWPCxDeleter.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,291 @@ +/* +* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Helper class for saving Provisioning settings. Provides a progress note. +* +*/ + + +// INCLUDE FILES +#include "CWPCxDeleter.h" +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +const TInt KMaxWaitTime = 2000000; +const TInt KRetryCount = 5; + +// CLASS DECLARATION + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor. +CWPCxDeleter::CWPCxDeleter( CWPEngine& aEngine, TUint32 aContext ) +: CActive( EPriorityStandard ), iEngine( aEngine ), + iContext( aContext ), + iCurrentItem( 0 ), iResult( KErrNone ) + { + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::ExecuteLD +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::PrepareLC() + { + // Assume ownership of this. + CleanupStack::PushL( this ); + + iApDbNotifier = CActiveApDb::NewL( EDatabaseTypeIAP ); + iApDbNotifier->AddObserverL( this ); + + User::LeaveIfError( iSession.Connect() ); + User::LeaveIfError( iBookmarkDb.Open( iSession, KBrowserBookmarks ) ); + iFavouritesNotifier = new(ELeave) CActiveFavouritesDbNotifier( iBookmarkDb, *this ); + + iFavouritesNotifier->Start(); + + iRetryTimer = CPeriodic::NewL( EPriorityStandard ); + + // Set up the dialog and callback mechanism. + iDialog = new(ELeave)CAknProgressDialog( + reinterpret_cast(&iDialog), EFalse ); + iDialog->SetCallback( this ); + iDialog->ExecuteLD(R_WAITNOTE_DELETE); + CEikProgressInfo* progressInfo = iDialog->GetProgressInfoL(); + progressInfo->SetAndDraw(iCurrentItem); + progressInfo->SetFinalValue(iEngine.ContextDataCountL(iContext)); + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::ExecuteLD +// ---------------------------------------------------------------------------- +// +TInt CWPCxDeleter::ExecuteLD( TInt& aNumDeleted ) + { + PrepareLC(); + + // Add us to active scheduler and make sure RunL() gets called. + CActiveScheduler::Add( this ); + CompleteRequest(); + iWait.Start(); + + // Progress note has been finished/cancelled. Cache the result + // and delete this. + TInt result( iResult ); + aNumDeleted = iCurrentItem; + CleanupStack::PopAndDestroy(); // this + + return result; + } + +// Destructor +CWPCxDeleter::~CWPCxDeleter() + { + Cancel(); + + delete iApDbNotifier; + + if( iFavouritesNotifier ) + { + iFavouritesNotifier->Cancel(); + delete iFavouritesNotifier; + } + + iBookmarkDb.Close(); + iSession.Close(); + + delete iRetryTimer; + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::DoCancel +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::DoCancel() + { + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::RunL +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::RunL() + { + // Choose whether to save or set as default + TBool more( EFalse ); + TRAPD( err, more = iEngine.DeleteContextDataL( iContext ) ); + + // If CommsDB or BookmarkDB are locked, schedule a retry + if( err == EWPCommsDBLocked ) + { + iWaitCommsDb = ETrue; + DelayedCompleteRequestL(); + return; + } + else if( err == EWPBookmarksLocked ) + { + iWaitFavourites = ETrue; + DelayedCompleteRequestL(); + return; + } + else if( err != KErrNone ) + { + // For all other errors, pass them through. + User::LeaveIfError( err ); + } + // Succesful save, so reset retry count + iRetryCount = 0; + + // Normal progress + if( !more ) + { + iDialog->ProcessFinishedL(); + } + else + { + CEikProgressInfo* progressInfo = iDialog->GetProgressInfoL(); + iCurrentItem++; + progressInfo->SetAndDraw(iCurrentItem); + CompleteRequest(); + } + } + +// --------------------------------------------------------- +// CWPCxDeleter::RunError +// --------------------------------------------------------- +// +TInt CWPCxDeleter::RunError( TInt aError ) + { + // There was a leave in RunL(). Store the error and + // stop the dialog. + iResult = aError; + iWait.AsyncStop(); + delete iDialog; + iDialog = NULL; + + return KErrNone; + } + +// --------------------------------------------------------- +// CWPCxDeleter::DialogDismissedL +// --------------------------------------------------------- +// +void CWPCxDeleter::DialogDismissedL( TInt aButtonId ) + { + if( aButtonId < 0 ) + { + iResult = KErrCancel; + } + + iWait.AsyncStop(); + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::CompleteRequest +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::CompleteRequest() + { + // Schedule an immediate complete. Make sure that there + // is no timer alive first + Cancel(); + iRetryTimer->Cancel(); + + SetActive(); + TRequestStatus* sp = &iStatus; + User::RequestComplete( sp, KErrNone ); + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::DelayedCompleteRequestL +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::DelayedCompleteRequestL() + { + if( iRetryCount < KRetryCount ) + { + // Schedule a delayed complete. + iRetryTimer->Cancel(); + iRetryTimer->Start( KMaxWaitTime, KMaxTInt32, TCallBack( Timeout, this ) ); + iRetryCount++; + } + else + { + User::Leave( KErrTimedOut ); + } + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::Retry +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::Retry() + { + // Immediate retry. Mark that we're not waiting + // for an event and complete request. + + iWaitCommsDb = EFalse; + iWaitFavourites = EFalse; + CompleteRequest(); + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::Timeout +// ---------------------------------------------------------------------------- +// +TInt CWPCxDeleter::Timeout(TAny* aSelf) + { + // There was a time-out. Retry saving even though we + // didn't get a notify from database. + CWPCxDeleter* self = STATIC_CAST(CWPCxDeleter*, aSelf); + self->Retry(); + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::HandleApDbEventL +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::HandleApDbEventL( TEvent aEvent ) + { + // We received an event from CommsDB. Retry if we're + // waiting for it. + if( iWaitCommsDb && aEvent == EDbAvailable ) + { + Retry(); + } + } + +// ---------------------------------------------------------------------------- +// CWPCxDeleter::HandleFavouritesDbEventL +// ---------------------------------------------------------------------------- +// +void CWPCxDeleter::HandleFavouritesDbEventL( RDbNotifier::TEvent /*aEvent*/ ) + { + // We received an event from BookmarkDB. Retry if we're + // waiting for it. + if( iWaitFavourites ) + { + Retry(); + } + } + +// End of File +