omaprovisioning/provisioning/ProvisioningBC/Src/CWPSaver.cpp
changeset 0 b497e44ab2fc
child 2 5594fba90824
--- /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