diff -r b183ec05bd8c -r 19bba8228ff0 omaprovisioning/provisioning/ProvisioningBC/Src/CWPSaver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omaprovisioning/provisioning/ProvisioningBC/Src/CWPSaver.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,338 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include "CWPSaver.h" + +// CONSTANTS +const TInt KMaxWaitTime = 2000000; +const TInt KRetryCount = 5; + +// CLASS DECLARATION + +// ========================== MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// C++ default constructor. +// ---------------------------------------------------------------------------- +CWPSaver::CWPSaver( CWPEngine& aEngine, TBool aSetAsDefault ) + : CActive( EPriorityStandard ), + iEngine( aEngine ), + iSetAsDefault( aSetAsDefault ), + iCurrentItem( 0 ), + iResult( KErrNone ), + iNumAccessDenied(0) + { + } + +// ---------------------------------------------------------------------------- +// CWPSaver::PrepareLC +// ---------------------------------------------------------------------------- +// +void CWPSaver::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_SAVE); + CEikProgressInfo* progressInfo = iDialog->GetProgressInfoL(); + progressInfo->SetAndDraw(iCurrentItem); + progressInfo->SetFinalValue(iEngine.ItemCount()); + } + +// ---------------------------------------------------------------------------- +// CWPSaver::ExecuteLD +// ---------------------------------------------------------------------------- +// +TInt CWPSaver::ExecuteLD( TInt& aNumSaved ) + { + 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 ); + aNumSaved = iCurrentItem; + CleanupStack::PopAndDestroy(); // this + + return result; + } + +// ---------------------------------------------------------------------------- +// Destructor +// ---------------------------------------------------------------------------- +CWPSaver::~CWPSaver() + { + Cancel(); + + delete iApDbNotifier; + + if( iFavouritesNotifier ) + { + iFavouritesNotifier->Cancel(); + delete iFavouritesNotifier; + } + + iBookmarkDb.Close(); + iSession.Close(); + delete iRetryTimer; + } + +// ---------------------------------------------------------------------------- +// CWPSaver::DoCancel +// ---------------------------------------------------------------------------- +// +void CWPSaver::DoCancel() + { + } + +// ---------------------------------------------------------------------------- +// CWPSaver::RunL +// ---------------------------------------------------------------------------- +// +void CWPSaver::RunL() + { + // Choose whether to save or set as default + TInt err( KErrNone ); + if( iSetAsDefault ) + { + TRAP( err, + if( iEngine.CanSetAsDefault( iCurrentItem ) ) + { + iEngine.SetAsDefaultL( iCurrentItem ); + } ); + } + else + { + TRAP( err, iEngine.SaveL( iCurrentItem ) ); + } + + // If CommsDB or BookmarkDB are locked, schedule a retry + if( err == EWPCommsDBLocked || err == KErrLocked) + { + iWaitCommsDb = ETrue; + DelayedCompleteRequestL(); + return; + } + else if( err == EWPBookmarksLocked ) + { + iWaitFavourites = ETrue; + DelayedCompleteRequestL(); + return; + } + else if( err == KErrNone || err == KErrAccessDenied) + { + if( err == KErrAccessDenied) + { + TInt aNumAccessDenied = GetNumAccessDenied(); + aNumAccessDenied++; + SetNumAccessDenied(aNumAccessDenied); + iEngine.SetAccessDenied(ETrue); + } + + // Succesful save, so reset retry count + iRetryCount = 0; + + // Normal progress + if( iCurrentItem == iEngine.ItemCount()-1 ) + { + iDialog->ProcessFinishedL(); + } + else + { + CEikProgressInfo* progressInfo = iDialog->GetProgressInfoL(); + iCurrentItem++; + progressInfo->SetAndDraw(iCurrentItem); + CompleteRequest(); + } + } + else + { + // For all other errors, pass them through. + User::LeaveIfError( err ); + } + } + +// ---------------------------------------------------------------------------- +// CWPSaver::RunError +// ---------------------------------------------------------------------------- +// +TInt CWPSaver::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; + } + +// ---------------------------------------------------------------------------- +// CWPSaver::DialogDismissedL +// ---------------------------------------------------------------------------- +// +void CWPSaver::DialogDismissedL( TInt aButtonId ) + { + if( aButtonId < 0 ) + { + iResult = KErrCancel; + } + + iWait.AsyncStop(); + } + +// ---------------------------------------------------------------------------- +// CWPSaver::CompleteRequest +// ---------------------------------------------------------------------------- +// +void CWPSaver::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 ); + } + +// ---------------------------------------------------------------------------- +// CWPSaver::DelayedCompleteRequestL +// ---------------------------------------------------------------------------- +// +void CWPSaver::DelayedCompleteRequestL() + { + if( iRetryCount < KRetryCount ) + { + // Schedule a delayed complete. Cancel first in case + // an immediate request was scheduled. + iRetryTimer->Cancel(); + iRetryTimer->Start( KMaxWaitTime, KMaxTInt32, TCallBack( Timeout, this ) ); + iRetryCount++; + } + else + { + User::Leave( KErrTimedOut ); + } + } + +// ---------------------------------------------------------------------------- +// CWPSaver::Retry +// ---------------------------------------------------------------------------- +// +void CWPSaver::Retry() + { + // Immediate retry. Mark that we're not waiting + // for an event and complete request. + iWaitCommsDb = EFalse; + iWaitFavourites = EFalse; + CompleteRequest(); + } + +// ---------------------------------------------------------------------------- +// CWPSaver::Timeout +// ---------------------------------------------------------------------------- +// +TInt CWPSaver::Timeout(TAny* aSelf) + { + // There was a time-out. Retry saving even though we + // didn't get a notify from database. + CWPSaver* self = static_cast( aSelf ); + self->Retry(); + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CWPSaver::HandleApDbEventL +// ---------------------------------------------------------------------------- +// +void CWPSaver::HandleApDbEventL( TEvent aEvent ) + { + // We received an event from CommsDB. Retry if we're + // waiting for it. + if( iWaitCommsDb && aEvent == EDbAvailable ) + { + Retry(); + } + } + +// ---------------------------------------------------------------------------- +// CWPSaver::HandleFavouritesDbEventL +// ---------------------------------------------------------------------------- +// +void CWPSaver::HandleFavouritesDbEventL( RDbNotifier::TEvent /*aEvent*/ ) + { + // We received an event from BookmarkDB. Retry if we're + // waiting for it. + if( iWaitFavourites ) + { + Retry(); + } + } + +// ---------------------------------------------------------------------------- +// CWPSaver::GetNumAccessDenied +// ---------------------------------------------------------------------------- +// + +TInt CWPSaver::GetNumAccessDenied() + { + return iNumAccessDenied; + } + +// ---------------------------------------------------------------------------- +// CWPSaver::SetNumAccessDenied +// ---------------------------------------------------------------------------- +// + +void CWPSaver::SetNumAccessDenied(TInt aNumAccessDenied ) + { + iNumAccessDenied = aNumAccessDenied; + } +// End of File