--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omaprovisioning/provisioning/ProvisioningBC/Src/CWPSaver.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -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 <AknQueryDialog.h>
+#include <eikprogi.h>
+#include <ProvisioningBC.rsg>
+#include <commdb.h>
+#include <CWPEngine.h>
+#include <CWPAdapter.h>
+#include <ActiveFavouritesDbNotifier.h>
+#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<CEikDialog**>(&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<CWPSaver*>( 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