pnpmobileservices/pnpms/PnP/PnpProvisioningAppSrc/PnpProvisioningSaver.cpp
changeset 0 3ce708148e4d
child 2 a5fecba4b1e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pnpmobileservices/pnpms/PnP/PnpProvisioningAppSrc/PnpProvisioningSaver.cpp	Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,408 @@
+/*
+* 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 <PnpProvisioning.rsg>
+#include <commdb.h>
+#include <CWPEngine.h>
+#include <CWPAdapter.h>
+#include <ActiveFavouritesDbNotifier.h>
+
+#include "PnpProvisioningSaver.h"
+#include "PnpLogger.h"
+#include "cwaitdialogmonitor.h"
+
+// CONSTANTS
+const TInt KMaxWaitTime = 1000000;
+
+// CLASS DECLARATION
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor.
+CPnpProvisioningSaver::CPnpProvisioningSaver( CWPEngine& aEngine, TBool aSetAsDefault )
+: CActive( EPriorityStandard ), iEngine( aEngine ), 
+  iSetAsDefault( aSetAsDefault ),
+  iCurrentItem( 0 ), iResult( KErrNone ),iEndKeyPressed(EFalse)
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::ExecuteLD
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::PrepareLC()
+    {
+    // Assume ownership of this.
+    CleanupStack::PushL( this );
+
+    iApDbNotifier = CActiveApDb::NewL( EDatabaseTypeIAP );
+    iApDbNotifier->AddObserverL( this );
+
+    iRetryTimer = CPeriodic::NewL( EPriorityStandard );
+
+    LOGSTRING("Constructing dialog");
+    
+    // Set up the dialog and callback mechanism.
+    ShowWaitNoteL();
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::ExecuteLD
+// ---------------------------------------------------------
+//
+TInt CPnpProvisioningSaver::ExecuteLD( TInt& aNumSaved )
+    {
+    LOGSTRING( "ExecuteLD" );
+    PrepareLC();
+
+    // make sure RunL() gets called.
+    CompleteRequest();
+    iWait.Start();
+
+    LOGSTRING("iWait.Start done");
+    // Progress note has been finished/cancelled. Cache the result
+    // and delete this.
+    TInt result( iResult );
+    aNumSaved = iCurrentItem;
+    CleanupStack::PopAndDestroy( this ); // this
+    LOGSTRING( "PopAndDestroy( this ), done" );
+
+    return result;
+    }
+
+// Destructor
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::~CPnpProvisioningSaver
+// ---------------------------------------------------------
+//
+CPnpProvisioningSaver::~CPnpProvisioningSaver()
+    {
+    LOGSTRING( "~CPnpProvisioningSaver" );
+
+    if( IsActive() )
+        {
+        Cancel();
+        }
+
+    if( iApDbNotifier )
+        {
+        iApDbNotifier->RemoveObserver( this );
+        delete iApDbNotifier;
+        }
+
+    if( iRetryTimer )
+        {
+        if( iRetryTimer->IsActive() )
+            {
+            iRetryTimer->Cancel();
+            }
+        delete iRetryTimer;
+        }
+        
+    
+    if( iGlobalWaitNote )
+        {
+        delete iGlobalWaitNote;
+        }
+        
+    if( iWaitDialogMonitor )
+        {
+        iWaitDialogMonitor->Cancel();
+        delete iWaitDialogMonitor;
+        }
+        
+    LOGSTRING( "~CPnpProvisioningSaver - done" );
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::DoCancel
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::DoCancel()
+    {
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::RunL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::RunL()
+    {
+    // Choose whether to save or set as default
+    TInt err( KErrNone );
+    if( iSetAsDefault )
+        {
+        TRAP( err, 
+            if( iEngine.CanSetAsDefault( iCurrentItem ) )
+                {
+                iEngine.SetAsDefaultL( iCurrentItem );
+                } );
+        }
+    else
+        {
+        if(iWaitDialogMonitor->iStatus != KErrCancel)
+        	{
+        LOGSTRING2("Saving item: %i", iCurrentItem );
+        TRAP( err, iEngine.SaveL( iCurrentItem ) );
+        	}
+        else
+        	{
+        	iEndKeyPressed = ETrue; //means End key or cancel pressed before saving some sttings
+        	LOGSTRING2("item: %i not saved", iCurrentItem );
+        	}
+        }
+
+    // If CommsDB or BookmarkDB are locked, schedule a retry
+    if( err == EWPCommsDBLocked )
+        {
+        LOGSTRING( "CPnpProvisioningSaver: EWPCommsDBLocked" );
+        iWaitCommsDb = ETrue;
+        DelayedCompleteRequest();
+        return;
+        }
+    else if( err == EWPBookmarksLocked )
+        {
+        LOGSTRING( "CPnpProvisioningSaver: EWPBookmarksLocked" );
+        iWaitFavourites = ETrue;
+        DelayedCompleteRequest();
+        return;
+        }
+    else if( err == KErrLocked )
+        {
+        LOGSTRING( "CPnpProvisioningSaver: KErrLocked" );
+        // Assume that commsdb caused the error
+        iWaitCommsDb = ETrue;
+        DelayedCompleteRequest();
+        return;
+        }
+    // For all other errors, pass them through.
+    User::LeaveIfError( err );
+
+    // Normal progress
+    if( iCurrentItem == iEngine.ItemCount()-1 )
+        {
+        LOGSTRING("All saved");
+        LOGSTRING2( "Saver RunL iWaitDialogMonitor->iStatus %i", iWaitDialogMonitor->iStatus.Int() );        
+        ProcessFinishedL();
+        }
+    else
+        {
+        LOGSTRING2( "Saver RunL 2nd iWaitDialogMonitor->iStatus %i", iWaitDialogMonitor->iStatus.Int() );
+        iCurrentItem++;
+        CompleteRequest();
+        }
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::ProcessFinishedL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::ProcessFinishedL()
+    {
+    LOGSTRING2( "Saver iWaitDialogMonitor->iStatus %i", iWaitDialogMonitor->iStatus.Int() );
+    //End key or cancel pressed after saving settings
+    if(iWaitDialogMonitor->iStatus == KErrCancel)
+    	{
+    	iEndKeyPressed = ETrue;
+    	}
+    if( iGlobalWaitNote )
+        {
+        delete iGlobalWaitNote;
+        iGlobalWaitNote = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::RunError
+// ---------------------------------------------------------
+//
+TInt CPnpProvisioningSaver::RunError( TInt aError )
+    {
+    LOGSTRING2( "RunError: %i", aError );
+    // There was a leave in RunL(). Store the error and
+    // stop the dialog.
+    iResult = aError;
+    TInt err(KErrNone);
+    TRAP( err, ProcessFinishedL() );
+
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::ShowWaitNoteL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::ShowWaitNoteL()
+    {
+    HBufC* msgText = CEikonEnv::Static()->
+        AllocReadResourceLC( R_TEXT_WAIT_SAVING ); 
+
+    if (iWaitDialogMonitor)
+        {
+        iWaitDialogMonitor->Cancel();
+        delete iWaitDialogMonitor;
+        iWaitDialogMonitor = NULL;
+        }
+    // instantiate the active object CGlobalConfirmationObserver
+    iWaitDialogMonitor = CWaitDialogMonitor::NewL( *this );
+    
+    // SetActive
+    iWaitDialogMonitor->Start();
+    
+    if (!iGlobalWaitNote)
+        {
+        iGlobalWaitNote = CAknGlobalNote::NewL();
+        }
+        
+    iGlobalWaitNote->SetSoftkeys( R_AVKON_SOFTKEYS_EMPTY);
+
+    iGlobalWaitNote->ShowNoteL(
+        iWaitDialogMonitor->iStatus,
+        EAknGlobalWaitNote,
+        *msgText );
+    
+    CleanupStack::PopAndDestroy( msgText );
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::WaitDialogDismissedL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::WaitDialogDismissedL( const TInt aStatusCode )
+    {
+    LOGSTRING( "DialogDismissedL" );
+    if( aStatusCode == EAknSoftkeyCancel || aStatusCode == EAknSoftkeyExit )
+        {
+        LOGSTRING( "setting to KErrCancel" );  
+        iResult = KErrCancel;
+        }
+    //pressed end key and not all settings saved
+    if( aStatusCode== KErrCancel && iEndKeyPressed )
+    	{
+    	LOGSTRING( "End key pressed" );    	
+        iResult = KErrCancel;
+        }
+
+    iWait.AsyncStop();
+    }
+    
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::CompleteRequest
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::CompleteRequest()
+    {
+    // Schedule an immediate complete. Make sure that there
+    // is no timer alive first
+    if( IsActive() )
+        {
+        Cancel();
+        }
+    if( iRetryTimer->IsActive() )
+        {
+        iRetryTimer->Cancel();
+        }
+    SetActive();
+    TRequestStatus* sp = &iStatus;
+    User::RequestComplete( sp, KErrNone );
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::DelayedCompleteRequest
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::DelayedCompleteRequest()
+    {
+    // Schedule a delayed complete. Cancel first in case
+    // an immediate request was scheduled.
+    if( IsActive() )
+        {
+        Cancel();
+        }
+    if( iRetryTimer->IsActive() )
+        {
+        iRetryTimer->Cancel();
+        }
+
+    iRetryTimer->Start( KMaxWaitTime, 0, TCallBack( Timeout, this ) );
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::Retry
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::Retry()
+    {
+    // Immediate retry. Mark that we're not waiting
+    // for an event and complete request.
+    iWaitCommsDb = EFalse;
+    iWaitFavourites = EFalse;
+    CompleteRequest();
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::Timeout
+// ---------------------------------------------------------
+//
+TInt CPnpProvisioningSaver::Timeout(TAny* aSelf)
+    {
+    // There was a time-out. Retry saving even though we
+    // didn't get a notify from database.
+    CPnpProvisioningSaver* self = STATIC_CAST(CPnpProvisioningSaver*, aSelf);
+    self->Retry();
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::HandleApDbEventL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::HandleApDbEventL( TEvent aEvent )
+    {
+    // We received an event from CommsDB. Retry if we're
+    // waiting for it.
+    if( iWaitCommsDb && aEvent == EDbAvailable )
+        {
+        Retry();
+        }
+    }
+
+// ---------------------------------------------------------
+// CPnpProvisioningSaver::HandleFavouritesDbEventL
+// ---------------------------------------------------------
+//
+void CPnpProvisioningSaver::HandleFavouritesDbEventL( RDbNotifier::TEvent /*aEvent*/ )
+    {
+    // We received an event from BookmarkDB. Retry if we're
+    // waiting for it.
+    if( iWaitFavourites )
+        {
+        Retry();
+        }
+    }
+
+//  End of File
+