--- /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
+