--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fotaapplication/fotaserver/FotaServer/src/fotadownload.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1939 @@
+/*
+* Copyright (c) 2005 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: downloads upd pkg
+*
+*/
+
+
+
+// INCLUDES
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_enum_internal.h>
+#endif
+#include <centralrepository.h>
+#include <f32file.h>
+#include <AknWaitDialog.h>
+#include <fotaserver.rsg>
+#include <eikprogi.h>
+#include <eikenv.h>
+#include <apgtask.h>
+#include <apgwgnam.h>
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_sock.h>
+#else
+#include <es_sock.h>
+#include <es_sock_partner.h>
+#endif
+#include <es_enum.h>
+#include <NSmlDMSync.rsg> //OMA DM UI for reading resource
+#include <bautils.h>
+#include <StringLoader.h>
+#include <DevManInternalCRKeys.h> //for reading san feature
+#include <e32property.h>
+#include "fotastorage.h"
+#include "FotaSrvApp.h"
+#include "fotadownload.h"
+#include "fotaserverPrivatePSKeys.h"
+#include "FotaNetworkRegStatus.h"
+#include <startupdomainpskeys.h> //globalrfsstates
+#define __LEAVE_IF_ERROR(x) if(KErrNone!=x) {FLOG(_L("LEAVE in %s: %d"), __FILE__, __LINE__); User::Leave(x); }
+#define __LEAVE(x) {FLOG(_L("LEAVE in %s: %d"), __FILE__, __LINE__); User::Leave(x); }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::NewL
+// --------------------------------------------------------------------------
+CFotaDownload* CFotaDownload::NewL (CFotaServer* aServer)
+ {
+ __ASSERT_ALWAYS( aServer, User::Panic(KFotaPanic, KErrArgument) );
+ CFotaDownload* ao = new (ELeave) CFotaDownload();
+ ao->iFotaServer = aServer;
+ return ao;
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::RunL
+// Do operations started in HandleDmgrEvent
+// --------------------------------------------------------------------------
+void CFotaDownload::RunL()
+ {
+ FLOG(_L( "[FotaServer] CFotaDownload::RunL() >>"));
+ CancelDownload( ETrue );
+ CreateDownloadL();
+ FLOG(_L( "[FotaServer] CFotaDownload::RunL() <<" ) );
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::DoCancel()
+// Cancel notifier request
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::DoCancel()
+ {
+ FLOG(_L("CFotaDownload::DoCancel() >>"));
+ FLOG(_L("CFotaDownload::DoCancel() <<"));
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::RunError(TInt aError)
+// Handle active object run error.
+// --------------------------------------------------------------------------
+//
+TInt CFotaDownload::RunError(TInt aError)
+ {
+ if(aError)
+ {
+ FLOG(_L(" CFotaDownload::RunError err %d"), aError );
+ }
+ return aError;
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::CFotaDownload()
+// --------------------------------------------------------------------------
+//
+CFotaDownload::CFotaDownload() : CActive(EPriorityNormal)
+ , iUpdateAfterDownload (EFalse), iUrl( NULL ),
+ iDownload (NULL),
+ iDownloadedContentSize(0),
+ iPreviousContentSize ( 0 ), iShowOMACDUI(EFalse), iShowDLPrgUI(EFalse),
+ iDownloadResumable (EFalse),
+ iFMSEnabled (EFalse),
+ iDownloadActive (EFalse),
+ iFreshDL(ETrue),
+ iUserInitiatedResume(EFalse),
+ iSanValue(KErrNotFound),
+ iDownloadFinalized(EFalse)
+ {
+ CActiveScheduler::Add( this );
+ FLOG(_L("CFotaDownload::CFotaDownload()"));
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::~CFotaDownload()
+// --------------------------------------------------------------------------
+//
+CFotaDownload::~CFotaDownload()
+ {
+ FLOG(_L("CFotaDownload::~CFotaDownload() >>"));
+ Cancel();
+
+ //Sets download state inactive if accidently closed. This is anyhow taken care in FinalizeDownload in Server.
+ SetDownloadActive(EFalse);
+ CancelDownload( ETrue );
+ if ( iUrl )
+ {
+ delete iUrl; iUrl=NULL;
+ }
+/* if ( iNotifHandler ) Deleted at server
+ {
+ iNotifHandler->Cancel();
+ delete iNotifHandler;
+ }*/
+ if ( iDLProgressDlg )
+ {
+ delete iDLProgressDlg; iDLProgressDlg=NULL;
+ }
+
+ if (iDownloadMgr.Handle())
+ iDownloadMgr.Close();
+ //don't delete iFotaServer as it doesn't belong here.
+
+ FLOG(_L("CFotaDownload::~CFotaDownload() <<"));
+}
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::CancelDownload
+// Cancel download
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::CancelDownload( const TBool aCancelProgressBar )
+ {
+ FLOG(_L("CFotaDownload::CancelDownload() >>"));
+
+ if( iDownloadMgr.Handle() )
+ {
+ iDownloadMgr.Close();
+ }
+
+ if ( aCancelProgressBar && iDLProgressDlg )
+ {
+ TRAPD(err, iDLProgressDlg->ProcessFinishedL() ) ;// deletes
+ if(err); // remove compiler warning
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ FLOG(_L("CFotaDownload::CancelDownload() <<"));
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::CreateDownloadL
+// Create download
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::CreateDownloadL()
+ {
+ FLOG(_L("CFotaDownload::CreateDownloadL() >>") );
+ __ASSERT_ALWAYS( iDownloadMgr.Handle()==0, User::Leave(KErrAlreadyExists) );
+ RHttpDownload* d(NULL);
+ iDLNeedsReset = EFalse;
+ TBool created;
+ iDownloadMgr.ConnectL( TUid::Uid(KFotaServerUid) , *this, EFalse);
+ FLOG(_L("CFotaDownload::CreateDownloadL, Stage 1") );
+ iDownloadMgr.DeleteAll();
+
+ TRAPD(err, d = &iDownloadMgr.CreateDownloadL( *iUrl, created ) );
+ RFs fs;
+ if(fs.Connect() == KErrNone)
+ {
+ RFile file;
+ CleanupClosePushL( fs );
+ CleanupClosePushL( file );
+ err=fs.MkDir(KDDDirPath);
+ FLOG(_L("creating directory err as %d"),err);
+ err=fs.SetSessionPath(KDDDirPath);
+ FLOG(_L("setting session path err as %d"),err);
+ err=fs.ShareProtected();
+ FLOG(_L("ShareProtected err as %d"),err);
+ err = file.Replace(fs,KDDFilename, EFileWrite|EFileShareAny);
+ FLOG(_L("creating rfile err as %d"),err);
+ err = d->SetFileHandleAttribute(file);
+ FLOG(_L("setting dlmgr destfile attrib err as %d"),err);
+ CleanupStack::PopAndDestroy( &file );
+ CleanupStack::PopAndDestroy( &fs );
+ }
+ FLOG(_L("CFotaDownload::CreateDownloadL, Stage 2. err %d"),err);
+ if ( err == KErrArgument ) User::Leave( KErrNotFound );
+ else if( err !=KErrNone) User::Leave( err );
+
+ if ( iDLState.iIapId > KErrNotFound )
+ {
+ FLOG(_L(" Using internet access point iapid: %d"), iDLState.iIapId);
+ err = iDownloadMgr.SetIntAttribute( EDlMgrIap, iDLState.iIapId); // IAP id
+ User::LeaveIfError( err );
+ //At this point the iIapId used in the SyncML Session is presumed working. Hence
+ //the same is stored in database for use during download.
+ FLOG(_L("Setting IAPID=%d is FotaState"),iDLState.iIapId);
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBIapId );
+ iFotaServer->iDatabase->CloseAndCommitDB();
+ }
+ FLOG(_L("CFotaDownload::CreateDownloadL, Stage 3") );
+ User::LeaveIfError( d->SetIntAttribute(EDlAttrFotaPckgId ,iDLState.iPkgId) );
+ FLOG(_L("CFotaDownload::CreateDownloadL, Stage 4") );
+ User::LeaveIfError( d->SetBoolAttribute(EDlAttrNoContentTypeCheck,ETrue) );
+
+ // If ui hidden or download restarting, do not show descriptor
+ if ( !iShowOMACDUI || iRestartCounter > 0 )
+ {
+ FLOG(_L("setting DD to hidden"));
+ User::LeaveIfError(iDownloadMgr.SetBoolAttribute( EDlMgrSilentMode,ETrue )) ;
+ }
+ //It's a fresh download
+ iFreshDL = ETrue;
+
+ // Start download
+ User::LeaveIfError(iDownloadMgr.StartAll());
+ FLOG(_L("CFotaDownload::CreateDownloadL, Stage 5") );
+ iDLProgress = EStarted;
+
+ //This P&S Key is used to notify DM UI on any download event. key=0 for idle and key=1 for download
+ err = RProperty::Set( TUid::Uid(KOmaDMAppUid),
+ KFotaDMRefresh,
+ ETrue );
+ FLOG(_L("RProperty KFotaDMRefresh Set Etrue, err = %d"), err);
+
+ SetDownloadActive(ETrue);
+
+ User::LeaveIfError(err);
+ FLOG(_L("[FotaServer] CFotaDownload::CreateDownloadL <<"));
+}
+
+ // --------------------------------------------------------------------------
+ // CFotaDownload::DownloadL
+ // Start download of swupd package.
+ // --------------------------------------------------------------------------
+ //
+void CFotaDownload::DownloadL(TDownloadIPCParams aParams,const TDesC8& aPkgURL
+ ,TBool aUpdateAfterDownload,const TInt aIapid,const TInt aRestartDownload)
+ {
+ FLOG(_L("[FotaServer] CFotaDownload::DownloadL >> restart %d"),aRestartDownload);
+
+ TInt err = RProperty::Define( TUid::Uid(KOmaDMAppUid),
+ KFotaDMRefresh,
+ RProperty::EInt,KReadPolicy,KWritePolicy);
+ FLOG(_L("RProperty KFotaDMRefresh Define, err = %d"), err);
+ if (err != KErrAlreadyExists )
+ {
+ User::LeaveIfError(err);
+
+ err = RProperty::Set( TUid::Uid(KOmaDMAppUid),
+ KFotaDMRefresh,
+ KErrNotFound );
+
+ FLOG(_L("RProperty KFotaDMRefresh Set KErrNotFound, err = %d"), err);
+ User::LeaveIfError(err);
+ }
+
+ if ( iUrl ) {delete iUrl; iUrl=NULL;}
+ iUrl = aPkgURL.Alloc();
+ iUpdateAfterDownload = aUpdateAfterDownload;
+ iRestartCounter = aRestartDownload;
+
+ iDLState = aParams;
+ FLOG(_L("CFotaDownload::DownloadL, Stage 1") );
+
+ // Set state -------------------------------------------------------------
+ iDLState.iState = RFotaEngineSession::EStartingDownload;
+
+ iDLState.iResult = KErrNotFound;
+ iDLState.iUpdateLtr = aUpdateAfterDownload;
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL( iDLState, *iUrl,EFDBState|EFDBResult
+ | EFDBProfileId|EFDBPkgUrl|EFDBPkgName|EFDBVersion|EFDBUpdateLtr);
+ iFotaServer->iDatabase->CloseAndCommitDB();
+ FLOG(_L("CFotaDownload::DownloadL, Stage 2, pkgid:%d"),iDLState.iPkgId);
+
+ // 2. Get Iap Id to use for download. This would be set in iDLState.iIapId.
+ SetIapToUseL(aParams, aIapid);
+
+ // 3. Determine whether download should be visible or not
+ // Autoaccepted profile?
+
+ SetDownloadUiBehavior(ETrue);
+
+ CancelDownload( ETrue );
+
+ FLOG(_L("Setting SessionType=%d in FotaState"),iDLState.iSessionType);
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBSessionType );
+ iFotaServer->iDatabase->CloseAndCommitDB();
+ FLOG(_L("CFotaDownload::DownloadL, Stage 3") );
+ //Called to read the download variations in Fota (resume support & FMS)
+ CheckDownloadVariations();
+
+ //Create the download
+ CreateDownloadL( );
+ FLOG(_L("[FotaServer] CFotaDownload::DownloadL <<"));
+ }
+
+// ---------------------------------------------------------------------------
+// CFotaDownload::HandleDLProgressDialogExitL
+// Handle canceling of download
+// ---------------------------------------------------------------------------
+TBool CFotaDownload::HandleDLProgressDialogExitL( TInt aButtonId )
+ {
+ FLOG(_L("CFotaDownload::HandleDLProgressDialogExitL %d, note = %d >>"),aButtonId, iDLProgressDlg->iNoteType);
+ // Cancel clicked during download
+ if ( aButtonId == KErrNotFound )
+ {
+ iRestartCounter = -1;
+ FLOG(_L("[FotaServer] CFotaDownload::HandleDLProgressDialogExitL Hiding UI"));
+ iFotaServer->iParentApp->SetUIVisibleL ( EFalse, ETrue );
+ iUpdateAfterDownload = EFalse;
+
+ iDLState.iResult = RFotaEngineSession::EResUserCancelled;
+
+ if (iDLProgressDlg->iNoteType == EConnectingNote)
+ {
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+
+ TInt active (KErrNotFound);
+ RProperty::Get( TUid::Uid(KOmaDMAppUid), KFotaDownloadActive, active );
+ FLOG(_L("active = %d"),active);
+
+ if (active) //Resume operation has just begun and download request is submitted to dlmgr. Hence need to suspend.
+ {
+ RunDownloadSuspendL(RFotaEngineSession::EResUserCancelled, ETrue);
+ }
+ else //Resume operation has just begun, but download request is not submitted to dlmgr
+ {
+ LaunchNotifierL( ESyncMLFwUpdOmaDLPostponed, EFalse, EFalse );
+ iFotaServer->FinalizeDownloadL( iDLState );
+ }
+ }
+ else if (iDLProgressDlg->iNoteType == EDownloadingNote)
+ {
+ if (iDownloadResumable)
+ {
+ //Resume is supported. Query user whether to postpone or cancel download.
+ FLOG(_L("User pressed cancel. Resume is supported; hence pause download and query user if download has to be postponed or cancelled permanently."));
+ RunDownloadSuspendL(RFotaEngineSession::EResUserCancelled);
+ }
+ else
+ {
+ //Resume is not supported. Download is cancelled
+ FLOG(_L("User pressed cancel. Resume is not supported & hence download has to be cancelled"));
+ RunDownloadCancelL(RFotaEngineSession::EResUserCancelled);
+ }
+ }
+ }
+ FLOG(_L("CFotaDownload::HandleDLProgressDialogExitL <<"));
+ return ETrue;
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::DoHandleDMgrEventL
+// Handles download events. Updates package state accordingly
+// --------------------------------------------------------------------------
+void CFotaDownload::DoHandleDMgrEventL( RHttpDownload* aDownload
+ , THttpDownloadEvent aEvent )
+ {
+ __ASSERT_ALWAYS( aDownload, User::Panic(KFotaPanic, KErrArgument) );
+ TInt32 sysErrorId( KErrNone );
+ TInt32 contentsize;
+ TInt32 downloadedsize;
+
+ TInt32 tmp;
+ THttpDownloadMgrError dlErrorId;
+ iDownload = aDownload;
+ // If DL is in final state (complete/fail), there's an error id available.
+ User::LeaveIfError( aDownload->GetIntAttribute( EDlAttrGlobalErrorId
+ ,sysErrorId ) );
+ User::LeaveIfError( aDownload->GetIntAttribute( EDlAttrDownloadedSize
+ ,downloadedsize ) );
+ User::LeaveIfError( aDownload->GetIntAttribute( EDlAttrLength
+ ,contentsize ) );
+ User::LeaveIfError( aDownload->GetIntAttribute( EDlAttrErrorId
+ ,tmp ) );
+ dlErrorId = (THttpDownloadMgrError)tmp;
+
+
+ // Update progress dlg progress
+ if ( !iDLProgressDlg && iRestartCounter>0)
+ {
+ FLOG(_L("reshowing progress..."));
+ iDLProgressDlg = new(ELeave) CFotaDLProgressDlg((CEikDialog** ) &iDLProgressDlg , EFalse, this, EDownloadingNote );
+ iDLProgressDlg->PrepareLC( R_FOTASERVER_DL_PROGRESS_DIALOG );
+ iDLProgressDlg->RunLD();
+ }
+ if (iDLProgressDlg)
+ {
+ CEikProgressInfo* progressInfo = iDLProgressDlg->GetProgressInfoL();
+ __ASSERT_ALWAYS( progressInfo, User::Panic(KFotaPanic, KErrBadHandle) );
+ if ( iPreviousContentSize!=contentsize )
+ {
+ iPreviousContentSize = contentsize;
+ if ( contentsize > 0 )
+ {
+ progressInfo->SetFinalValue( contentsize );
+ }
+ }
+ TInt incr = downloadedsize - iDownloadedContentSize;
+ if (incr<=0) incr=0; //Protection
+ progressInfo->IncrementAndDraw(incr);
+ iDownloadedContentSize = downloadedsize;
+ }
+ FLOG(_L("CFotaDownload::HandleDMgrEventL() >> DLstate:%d ProgressSt:%d\
+ globErr: %d DLError: %d (%d/%d)"),aEvent.iDownloadState
+ ,aEvent.iProgressState,sysErrorId,dlErrorId,downloadedsize,contentsize );
+
+ if ( sysErrorId <= -25000) { FLOG(_L(" error %d interpreted as http \
+ error %d") , sysErrorId, sysErrorId + 25000 ); }
+
+ switch ( aEvent.iDownloadState )
+ {
+ case EHttpDlCreated: // 1
+ {
+ FLOG(_L("Download State: EHttpDlCreated"));
+ }
+ break;
+ case EHttpDlInprogress: // 2
+ {
+ FLOG(_L("Download State: EHttpDlProgress"));
+
+
+ if (aEvent.iProgressState == EHttpProgCodDescriptorDownloaded)
+ {
+ if (iShowOMACDUI || iShowDLPrgUI)
+ {
+ iFotaServer->iParentApp->SetUIVisibleL ( ETrue, EFalse);
+ }
+ }
+
+ // Is ECodLoadEnd optimized out?
+ if ( aEvent.iProgressState == EHttpProgCodLoadEnd ) // 2503
+ {
+ TInt err;
+ err = aDownload->Start(); // PPAR-6FRHFY fixed
+ if(err)
+ {
+ FLOG(_L(" ERROR when restarting DL %d"),err);
+ User::Leave(err);
+ }
+ FLOG( _L(" DL restarted") );
+ }
+
+ // Should tell user to free disk space. But how do we know that disk space is about be exceeded?
+
+ if ( iDLNeedsReset )
+ {
+ FLOG(_L("aDownload->Reset();"));
+ iDLNeedsReset = EFalse;
+ iStatus = KRequestPending;
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ User::LeaveIfError( aDownload->Reset() );
+ }
+
+ // Body data of descriptor or payload pkg
+ if ( aEvent.iProgressState == EHttpProgResponseBodyReceived && iDLProgress==EDescriptorDownloaded/*2500*/)
+ {
+ // Now pkg size can be retrieved. must check size.
+ iDLState.iPkgSize = contentsize;
+ FLOG(_L("Setting PkgSize=%d in FotaState"),contentsize);
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBPkgSize );
+ iFotaServer->iDatabase->CloseAndCommitDB();
+
+
+ TInt contentsize2 = contentsize;
+
+ TInt dlsize (KErrNone);
+ TInt tlsize (KErrNone);
+
+ TRAPD(err, iFotaServer->GetDownloadUpdatePackageSizeL(iDLState.iPkgId, dlsize,tlsize));
+ if(err); // remove compiler warning
+ contentsize2 -= dlsize;
+ FLOG(_L("check pkg size = %d"),contentsize2 );
+
+ CFotaStorage::TFreeSpace avail = iFotaServer->StoragePluginL()->IsPackageStoreSizeAvailableL(contentsize2);
+
+ iDLProgress = ESizeChecked;
+
+ if ( avail==CFotaStorage::EDoesntFitToFileSystem )
+ {
+ FLOG(_L("CFotaStorage::EDoesntFitToFileSystem"));
+ if (iFreshDL)
+ {
+ if ( iShowDLPrgUI )
+ {
+ FLOG(_L("iDLNeedsReset = ETrue;"));
+ iDLNeedsReset = ETrue;
+ LaunchNotifierL( ESyncMLFwUpdOmaDLNotEnoughMemory, KErrDiskFull,contentsize2 );
+ }
+ else
+ {
+ iDLState.iResult = RFotaEngineSession::EResDLFailDueToDeviceOOM;
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ iUpdateAfterDownload = EFalse;
+ LaunchNotifierL( ESyncMLFwUpdErrorNote, KErrGeneral, contentsize2,ETrue );
+ }
+ }
+ else //resuming download
+ {
+ FLOG(_L("Memory need in order to resume. Notify user..."));
+ LaunchNotifierL( ESyncMLFwUpdOmaDLNotEnoughMemory, KErrDiskFull,contentsize2 );
+ RunDownloadSuspendL(RFotaEngineSession::EResDLFailDueToDeviceOOM);
+ }
+
+ }
+ }
+
+ // OMA DD download completed , must hide progress
+ if ( aEvent.iProgressState == EHttpProgContentTypeChanged ) // 2055
+ {
+ if ( iDLProgressDlg )
+ {
+ iDLProgressDlg->ProcessFinishedL(); // deletes itself
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ }
+ // OMA DD accepted,show progress
+ if ( aEvent.iProgressState == EHttpProgCodDescriptorAccepted ) // 2502
+
+ {
+ iDLProgress = EDescriptorDownloaded;
+ if ( iShowDLPrgUI )
+ {
+ FLOG(_L("SHOW PROGRESS"));
+ if ( iDLProgressDlg )
+ {
+ FLOG(_L("Removing Connecting progress note..."));
+ iDLProgressDlg->ProcessFinishedL();
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ if (!iDLProgressDlg)
+ {
+
+ FLOG(_L("Creating iDLProgressDlg"));
+ iDLProgressDlg = new(ELeave) CFotaDLProgressDlg((CEikDialog** ) &iDLProgressDlg , EFalse, this, EDownloadingNote );
+ iDLProgressDlg->PrepareLC( R_FOTASERVER_DL_PROGRESS_DIALOG );
+ iDLProgressDlg->RunLD();
+ }
+ CEikProgressInfo* progressInfo = iDLProgressDlg->GetProgressInfoL();
+ progressInfo->SetFinalValue( 500 );
+ iPreviousContentSize = -1;
+ iDownloadedContentSize = 0;
+ iFotaServer->iParentApp->SetUIVisibleL ( ETrue , EFalse );
+ }
+ if (iDownloadResumable)
+ {
+ FLOG(_L("Setting download as resumable"));
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ iFotaServer->SetStartupReason(EFotaDownloadInterrupted);
+ }
+ else
+ {
+ FLOG(_L("Setting download as non resumable"));
+ iDLState.iState = RFotaEngineSession::EDownloadProgressing;
+ iFotaServer->SetStartupReason(EFotaPendingGenAlert);
+ }
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBState );
+ iFotaServer->iDatabase->CloseAndCommitDB();
+
+
+ if (iDLState.iIapId <= 0) //Read the IAP ID when not known, and set it into db.
+ {
+ TInt32 usedapid (KErrNotFound);
+ TInt er = iDownloadMgr.GetIntAttribute( EDlMgrIap, usedapid);
+ iDLState.iIapId = usedapid;
+ FLOG(_L("Setting IAPID=%d is FotaState"),iDLState.iIapId);
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBIapId );
+ iFotaServer->iDatabase->CloseAndCommitDB();
+ }
+ }
+ }
+ break;
+ case EHttpDlCompleted: // 4
+ {
+ FLOG(_L("Download State: EHttpDlCompleted"));
+
+ iRestartCounter = -1;
+ if ( iDLProgressDlg )
+ {
+ iDLProgressDlg->ProcessFinishedL(); // deletes itself
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ iDLState.iState = RFotaEngineSession::EDownloadComplete;
+
+ if (iUpdateAfterDownload)
+ iDLState.iResult = KErrNotFound;
+ else
+ iDLState.iResult = RFotaEngineSession::EResSuccessful;
+ iFotaServer->FinalizeDownloadL( iDLState );
+ }
+ break;
+ case EHttpDlPaused: //Event thrown for any resumable download
+ case EHttpDlFailed: //Event thrown for any non-resumable download or critical error on resumable download
+ {
+
+ if (aEvent.iProgressState != EHttpProgNone) //Accepting only events from COD
+ return;
+
+ if (aEvent.iDownloadState == EHttpDlPaused)
+ {
+ FLOG(_L("Download State: EHttpDlPaused"));
+ if (iDownloadResumable)
+ {
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ }
+ else
+ {
+ // iDownloadResumable remains 0 even for resumable download.
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ }
+ }
+ else //aEvent.iDownloadState = EHttpDlFailed
+ {
+ FLOG(_L("Download State: EHttpDlFailed"));
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ iDownloadResumable = EFalse;
+ }
+ //Remove the download progress bar
+ if ( iDLProgressDlg && (iDLState.iResult != RFotaEngineSession::EResUserCancelled ))
+ {
+ FLOG(_L("Shd not come in EResUserCancelled"));
+ iDLProgressDlg->ProcessFinishedL(); // deletes itself
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ // This is restarted download => decrement counter
+ if ( iRestartCounter > 0 )
+ {
+ --iRestartCounter;
+ if ( iRestartCounter <=0 ) iRestartCounter = -1;
+ FLOG(_L(" iRestartCounter to %d"),iRestartCounter );
+ }
+ /*****************************/
+ //Handling all errors now...//
+ /****************************/
+ TInt notifType (KErrNotFound);
+ TInt notifParam (KErrNotFound);
+ //Handling User Cancel of Download Descriptor
+ if ( dlErrorId == EGeneral && (sysErrorId == KErrAbort || sysErrorId == KErrCancel ))
+ {
+ FLOG(_L("Reason: User cancelled download descriptor"));
+ //LaunchNotifierL(ESyncMLFwUpdOmaDLCancelled, EFalse, EFalse);
+ iRestartCounter = -1;
+ iDLState.iResult = RFotaEngineSession::EResUserCancelled;
+ notifType = ESyncMLFwUpdOmaDLCancelled;
+ notifParam = KErrNone;
+ }
+ //Handling User Cancel
+ else if ( iDLState.iResult == RFotaEngineSession::EResUserCancelled ) //This variable is set in RunDownloadCancelL or RunDownloadSuspendL
+ {
+ iRestartCounter = -1;
+ //If initial pause is successful, query user if he wants to postpone or cancel permanently.
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL(iDLState,KNullDesC8, EFDBState);
+ iFotaServer->iDatabase->CloseAndCommitDB();
+
+ if (iDownloadResumable)
+ {
+ if (!iSilentOpn)
+ {
+ FLOG(_L("Download has been paused successful. Query user if he wants to postpone or cancel permanently"));
+ LaunchNotifierL(ESyncMLFwUpdOmaDLUserCancel, KErrNone, KErrNone);
+ break;
+ }
+ else
+ {
+ notifType = ESyncMLFwUpdOmaDLPostponed;
+ notifParam = KErrNone;
+ }
+ }
+ else
+ {
+ FLOG(_L("Error while initial pausing...%d Hence download has to be cancelled permanently!"));
+ RunDownloadCancelL(RFotaEngineSession::EResUserCancelled);
+ notifType = ESyncMLFwUpdOmaDLCancelled;
+ notifParam = KErrNone;
+ }
+ }
+ else if ( iDLState.iResult == RFotaEngineSession::EResDLFailDueToDeviceOOM )
+ {
+ FLOG(_L("Reason: Not enough memory to perform resume"));
+ iRestartCounter = -1;
+
+ if (iDownloadResumable)
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ else
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ }
+ //Handling user cancel IAP selection popup
+ else if ( dlErrorId == EConnectionFailed && sysErrorId == KErrCancel)
+ {
+ FLOG(_L("Reason: User canceled IAP selection popup"));
+ iDLState.iResult = RFotaEngineSession::EResUserCancelled;
+ iRestartCounter = -1;
+
+ notifType = ESyncMLFwUpdOmaDLPostponed;
+ notifParam = KErrNone;
+ }
+ //Handling temproary network timeout. This may either try resume or restart based on download.
+/* else if ( dlErrorId == EGeneral && sysErrorId == KErrTimedOut )
+ {
+ FLOG(_L("Reason: Network timeout"));
+ // No restart issued yet, this is 1st download attempt
+ if ( iRestartCounter == 0 )
+ {
+ iRestartCounter = KFotaDownloadTimeoutRestartCount;
+ iDLState.iState = RFotaEngineSession::EIdle;
+ FLOG(_L("Trying to restart download (iRestartCounter=%d)"),iRestartCounter );
+ }
+
+ }*/
+ //Handling all Network interrupts
+ else if ( (dlErrorId == EConnectionFailed && sysErrorId == KErrCommsLineFail)||
+ dlErrorId == ETransactionFailed ||
+ (dlErrorId == KErrCodWapConnectionDropped && sysErrorId == KErrGeneral) ||
+ (dlErrorId == EGeneral && sysErrorId == KErrTimedOut) ||
+ (dlErrorId == EConnectionFailed && sysErrorId == KErrGprsServicesNotAllowed ) ||
+ (dlErrorId == EConnectionFailed && sysErrorId == KErrGsmMMNetworkFailure ) ||
+ (dlErrorId == EConnectionFailed && sysErrorId == KErrWlanNetworkNotFound )
+ )
+ {
+ FLOG(_L("Reason: Network breakage"));
+ iRestartCounter = -1;
+ notifType = ESyncMLFwUpdErrorNote;
+ if (iDownloadResumable)
+ {
+ notifParam = KErrCommsLineFail2;
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ iDLState.iResult = RFotaEngineSession::EResDLFailDueToNWIssues;
+ }
+ else
+ {
+ notifParam = KErrCommsLineFail;
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ iDLState.iResult = RFotaEngineSession::EResDLFailDueToNWIssues;
+ }
+ }
+ //Handling Out Of Memory interrupt
+ else if ((dlErrorId == EGeneral && sysErrorId == KErrDiskFull ) || sysErrorId == KErrCodInsufficientSpace)
+ {
+ FLOG(_L("Reason: Disk full"));
+ iRestartCounter = -1;
+ notifType = KErrNotFound;
+ notifParam = KErrNotFound; // don't show anything
+ iDLState.iResult = RFotaEngineSession::EResDLFailDueToDeviceOOM;
+ }
+ //Handle unclassified (general) interrupts
+ else
+ {
+ iRestartCounter = -1;
+
+
+ RProperty prop;
+ TInt val = KErrNone;
+
+ TInt err = prop.Get(KPSUidStartup, KPSGlobalSystemState, val);
+ if (err==KErrNone && val!=ESwStateShuttingDown)
+ {
+ notifType = ESyncMLFwUpdErrorNote;
+ }
+ else
+ {
+ FLOG(_L("Phone is powering down..."));
+ }
+
+ if (iDownloadResumable)
+ {
+ notifParam = KErrGeneralResume;
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ }
+ else
+ {
+ notifParam = KErrGeneralNoResume;
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ }
+
+
+ SetDLResultdlErrorId(dlErrorId ,sysErrorId );
+
+
+ }
+ if ( iRestartCounter <= 0)
+ {
+ iUpdateAfterDownload = EFalse;
+ SetDownloadActive(EFalse);
+ if ( iDLState.iSessionType!= ESanSilent && notifType!=KErrNotFound )
+ {
+ if ( iShowDLPrgUI )
+ LaunchNotifierL( (TSyncMLFwUpdNoteTypes)notifType, notifParam,0 );
+ else
+ LaunchNotifierL( (TSyncMLFwUpdNoteTypes)notifType, notifParam,0, ETrue);
+ }
+ FLOG(_L("Should come here for nonpausable "));
+ iDownloadFinalized = ETrue;
+ iFotaServer->FinalizeDownloadL( iDLState );
+ }
+ else
+ {
+ if (iDownloadResumable)
+ {
+ FLOG(_L("Resuming download..."));
+ iDownload->Start();
+ }
+ else
+ {
+ FLOG(_L("Restarting download..."));
+ iFotaServer->FinalizeDownloadL( iDLState );
+ }
+ }
+ }
+ break;
+
+ case EHttpDlPausable:
+ {
+ FLOG(_L("Download State: EHttpDlPausable"));
+ if (iDownloadResumable) //This is initially set by IsDownloadSuspendResumeSupported()
+ {
+ FLOG(_L("Download Suspend/Resume is supported!"));
+ }
+ else
+ {
+ FLOG(_L("Download Server support Suspend/Resume, but Fota doesn't!"));
+ //retain the state iDownloadResumable = EOmaDLResumeNotSupported;
+ }
+ }
+ break;
+
+ case EHttpDlNonPausable:
+ {
+ FLOG(_L("Download State: EHttpDlNonPausable"));
+ if (iDownloadResumable) //This is initially set by CheckDownloadVariations()
+ {
+ FLOG(_L("Download Server doesn't support Suspend/Resume, but Fota does!"));
+ //Reset the state to not supported.
+ iDownloadResumable = EFalse;
+ }
+ else
+ {
+ FLOG(_L("Download Server doesn't support Suspend/Resume, neither does Fota!"));
+ }
+ }
+ break;
+ case EHttpDlDeleting: //13
+ {
+ FLOG(_L("Download State: EHttpDlDeleting"));
+ }
+ break;
+ case EHttpDlDeleted: //11
+ {
+ FLOG(_L("Download State: EHttpDlDeleted"));
+ }
+ break;
+ default:
+ {
+ FLOG(_L("Default. No action performed for this Download State"));
+ }
+ break;
+ }
+ FLOG(_L("CFotaDownload::HandleDMgrEventL() <<"));
+ }
+
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::SetDLResultdlErrorId
+// Sets the appropriate error
+// --------------------------------------------------------------------------
+//
+
+void CFotaDownload::SetDLResultdlErrorId( THttpDownloadMgrError adlErrorId, TInt32 asysErrorId)
+{
+ if ( adlErrorId == EInternal)
+ {
+ FLOG(_L("Reason: error EInternal"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EContentFileIntegrity)
+ {
+ FLOG(_L("Reason: error EContentFileIntegrity"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EMMCRemoved)
+ {
+ FLOG(_L("Reason: error EMMCRemoved,"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EBadUrl)
+ {
+ FLOG(_L("Reason: error EBadUrl"));
+ iDLState.iResult = RFotaEngineSession::EResMalformedOrBadURL;
+ }
+ else if ( adlErrorId == EHttpUnhandled)
+ {
+ FLOG(_L("Reason: error EHttpUnhandled, check global error id!"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EHttpAuthenticationFailed)
+ {
+ FLOG(_L("Reason: error EHttpAuthenticationFailed"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EObjectNotFound)
+ {
+ FLOG(_L("Reason: error EObjectNotFound"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EPartialContentModified)
+ {
+ FLOG(_L("Reason: error EPartialContentModified"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EContentExpired)
+ {
+ FLOG(_L("Reason: error EContentExpired"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( adlErrorId == EHttpRestartFailed)
+ {
+ FLOG(_L("Reason: error EHttpRestartFailed"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+ else if ( asysErrorId == KErrCodInvalidDescriptor )
+ {
+ FLOG(_L("Reason: error KErrCodInvalidDescriptor"));
+ iDLState.iResult = RFotaEngineSession::EResMalformedOrBadURL;
+ }
+ else
+ {
+ FLOG(_L("Reason: unknown, check dlError!"));
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ }
+
+}
+
+// --------------------------------------------------------------------------
+// CFotaDownload::HandleDMgrEventL
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::HandleDMgrEventL( RHttpDownload& aDownload
+ , THttpDownloadEvent aEvent )
+ {
+ DoHandleDMgrEventL(&aDownload,aEvent);
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::LaunchNotifierL
+// Launches notifier. This method is also used to finalize erronous DL
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::LaunchNotifierL( const TSyncMLFwUpdNoteTypes aNotetype
+ ,const TInt aIntParam
+ ,const TInt aMemoryNeeded
+ ,TBool aFinishOnly )
+ {
+ if ( iNotifHandler ) iNotifHandler->Cancel();
+ else iNotifHandler = CFotaDownloadNotifHandler::NewL(this);
+ iNotifHandler->LaunchNotifierL( aNotetype,aIntParam,aMemoryNeeded
+ ,aFinishOnly );
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::CheckDownloadVariations
+// Reads download variations - fota suspend & resume bahavior & FMS from cenrep keys
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::CheckDownloadVariations()
+ {
+ FLOG(_L("CFotaDownload::CheckDownloadVariations >>"));
+
+ CRepository* centrep( NULL);
+ TRAPD(err, centrep = CRepository::NewL( KCRUidFotaServer ) );
+ if (err) FLOG(_L("Error reading FotaServer cenrep... %d"),err);
+ TInt supported(KErrNone);
+ if (centrep )
+ {
+ err = centrep->Get( KSuspendResumeFeatureSupported, supported );
+ if (err) FLOG(_L("Error reading cenrep key... %d"),err);
+ iDownloadResumable = (supported==1)? ETrue:EFalse;
+
+ supported = KErrNone;
+ centrep->Get( KFotaMonitoryServiceEnabled, supported );
+ if (err) FLOG(_L("Error reading cenrep key... %d"),err);
+ iFMSEnabled = (supported > 0)? ETrue:EFalse;
+
+ delete centrep;
+ centrep = NULL;
+ }
+
+ FLOG(_L("Susp&Resume feature supported = %d, FMS feature supported = %d"),iDownloadResumable,iFMSEnabled);
+ FLOG(_L("CFotaDownload::CheckDownloadVariations <<"));
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::RunDownloadCancelL
+// Starts to cancel the download operation
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::RunDownloadCancelL(const TInt aReason, TBool aSilent)
+ {
+ FLOG(_L("CFotaDownload::RunDownloadCancelL, reason = %d, silent = %d >>"), aReason, aSilent);
+
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ iDLState.iResult = aReason;
+ iSilentOpn = aSilent;
+
+ iRestartCounter = -1;
+ iUpdateAfterDownload = EFalse;
+
+ if (!iDownload)
+ {
+ //iDownload is null when user cancels the download permanently when prompted to resume.
+ //hence retrieve the download object first
+ iDownload = RetrieveDownloadL();
+ }
+ TInt err = iDownload->Delete(); //or Cancel or Reset?
+ FLOG(_L("Error = %d"),err);
+
+ if(iDownloadFinalized == EFalse)
+ {
+ iFotaServer->FinalizeDownloadL( iDLState );
+ FLOG(_L("Should not come here fro nopausable "));
+ if (aReason == RFotaEngineSession::EResUserCancelled)
+ LaunchNotifierL(ESyncMLFwUpdOmaDLCancelled, EFalse, EFalse);
+ else if (aReason == RFotaEngineSession::EResUndefinedError)
+ LaunchNotifierL(ESyncMLFwUpdErrorNote, KErrGeneralNoResume, EFalse );
+ }
+ FLOG(_L("CFotaDownload::RunDownloadCancelL <<"));
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::RunDownloadSuspendL
+// Starts to suspend the download operation
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::RunDownloadSuspendL(const TInt aReason, TBool aSilent)
+ {
+ FLOG(_L("CFotaDownload::RunDownloadSuspendL, reason = %d, silent = %d >>"), aReason, aSilent);
+
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ iDLState.iResult = aReason;
+ iSilentOpn = aSilent;
+ //First pause download, and later ask for user action.
+ TInt err = iDownload->Pause();
+
+ if (err)
+ {
+ //initial pausing becomes a problem.
+ FLOG(_L("Error while initial pausing...%d Hence download has to be cancelled permanently!"),err);
+ RunDownloadCancelL(aReason);
+ }
+
+ FLOG(_L("CFotaDownload::RunDownloadSuspendL <<"));
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::TryResumeDownloadL
+// Tries to resume the download operation
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::TryResumeDownloadL(TBool aUserInitiated)
+ {
+ FLOG(_L("CFotaDownload::TryResumeDownloadL >>"));
+
+ iUserInitiatedResume = aUserInitiated;
+ TInt err = RProperty::Define( TUid::Uid(KOmaDMAppUid),
+ KFotaDMRefresh,
+ RProperty::EInt,KReadPolicy,KWritePolicy);
+ FLOG(_L("RProperty KFotaDMRefresh Define, err = %d"), err);
+ if (err != KErrAlreadyExists )
+ {
+ User::LeaveIfError(err);
+ }
+ //This P&S Key is used to notify DM UI on any download event. key=0 for idle and key=1 for download
+ err = RProperty::Set( TUid::Uid(KOmaDMAppUid),
+ KFotaDMRefresh,
+ ETrue );
+ FLOG(_L("RProperty KFotaDMRefresh Set ETrue, err = %d"), err);
+
+ //Called to read the download variations in Fota (resume support & FMS)
+ CheckDownloadVariations();
+ if (IsFMSEnabled() && iUserInitiatedResume)
+ iFotaServer->CancelFmsL();
+
+ //Query based on the type of DM session used earlier.
+ if (iUserInitiatedResume || iDLState.iSessionType != ESanSilent)
+ {
+ //Query user for resume
+ FLOG(_L("Quering user for resume..."));
+ if (iFotaServer->iNotifHandler)
+ {
+ iFotaServer->iNotifHandler->Cancel();
+ delete iFotaServer->iNotifHandler;
+ iFotaServer->iNotifHandler = NULL;
+ }
+ iNotifHandler = CFotaDownloadNotifHandler::NewL(this);
+
+ iNotifHandler->LaunchNotifierL(ESyncMLFwUpdOmaDLResume, EFalse, EFalse);
+ }
+ else //Only FMS initiated Silent Session download
+ {
+ //Resume directly
+ FLOG(_L("Resuming automatically..."));
+ ResumeDownloadL();
+ }
+ FLOG(_L("CFotaDownload::TryResumeDownloadL <<"));
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::ResumeDownloadL
+// Resume the download operation
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::ResumeDownloadL()
+ {
+ FLOG(_L("CFotaDownload::ResumeDownloadL >>"));
+ TBool toresetdl (EFalse);
+ TBool downloadiapvalid (ETrue);
+ //Find the download ui behavior from fota cenrep
+ TInt behavior(KErrNotFound);
+ CRepository* centrep = NULL;
+ TRAPD(err, centrep = CRepository::NewL( KCRUidFotaServer ) );
+ if (( centrep ) && ( err == KErrNone))
+ {
+ centrep->Get( KSilentOmaDlUIBehavior, behavior );
+ delete centrep;
+ }
+ centrep = NULL;
+
+ if (iUserInitiatedResume ||
+ (behavior == EOmacdOffdlprgOn || behavior == EOmacdOndlprgOn))
+ {
+ FLOG(_L("Showing Connecting progress note..."));
+ iFotaServer->iParentApp->SetUIVisibleL ( ETrue , EFalse );
+
+ if ( !iDLProgressDlg )
+ {
+ iDLProgressDlg = new(ELeave) CFotaDLProgressDlg((CEikDialog** ) &iDLProgressDlg , EFalse, this, EConnectingNote );
+ iDLProgressDlg->PrepareLC( R_CONNECTION_NOTE );
+ }
+ // Load the resource files
+ TInt err = KErrNone;
+
+ // Localize the file name, and load the SCP resources
+ TFileName resFile;
+ resFile.Copy( KDriveZ );
+ resFile.Append( KSCPResourceFilename );
+
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), resFile );
+
+ TInt Res1(KErrNone);
+ TRAP( err, Res1 =CCoeEnv::Static()->AddResourceFileL( resFile ) );
+
+ HBufC* buf = StringLoader::LoadLC(R_SYNCSTATUS_SYNC_CONN);
+
+ if( Res1 )
+ {
+ iFotaServer->GetEikEnv()->DeleteResourceFile( Res1 );
+ }
+ FLOG(_L("Reading txt as: %S"), &buf->Des());
+ iDLProgressDlg->SetTextL(buf->Des());
+ CleanupStack::PopAndDestroy(buf);
+
+ iDLProgressDlg->RunLD();
+ }
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 1"));
+
+ iDownload = RetrieveDownloadL();
+ if (iDownload)
+ {
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 2: Successfully retrieved download object >>"));
+
+ SetIapToUseL(iDLState, iDLState.iIapId);
+
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 3: Using iapid %d for resume..."), iDLState.iIapId);
+ downloadiapvalid = iFotaServer->CheckIapExistsL(iDLState.iIapId);
+ if (iDLState.iIapId > 0 && downloadiapvalid)
+ {
+ if (!iMonitor)
+ {
+ iMonitor = CFotaNetworkRegStatus::NewL (iFotaServer);
+ }
+ TBool val = iMonitor->IsConnectionPossibleL(iDLState.iIapId);
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 4"));
+ delete iMonitor; iMonitor = NULL;
+
+#if defined(__WINS__)
+ val =ETrue;
+#endif
+ if (!val)
+ {
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 5.1: Disallowing resume operation as connection not possible"));
+
+ if ( !iShowDLPrgUI && iDLProgressDlg )
+ {
+ FLOG(_L("Removing Connecting progress note..."));
+
+ iDLProgressDlg->ProcessFinishedL();
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ if (iUserInitiatedResume || iDLState.iSessionType!=ESanSilent)
+ LaunchNotifierL(ESyncMLFwUpdErrorNote, KErrCommsLineFail2,0);
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ iDLState.iResult = RFotaEngineSession::EResDLFailDueToNWIssues;
+ iUpdateAfterDownload = EFalse;
+ iFotaServer->FinalizeDownloadL(iDLState);
+ return;
+ }
+ }
+
+ if (iDLState.iIapId == KErrNotFound || !downloadiapvalid )
+ {
+ iDLState.iIapId = KErrNotFound;
+ User::LeaveIfError( iDownloadMgr.SetIntAttribute( EDlMgrIap, 0)); // Download mgr interprets 0 for Always Ask
+ }
+ else
+ User::LeaveIfError( iDownloadMgr.SetIntAttribute( EDlMgrIap, iDLState.iIapId)); // IAP id
+
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 5.2"));
+ SetDownloadUiBehavior(EFalse);
+
+ if ( !iShowDLPrgUI && iDLProgressDlg )
+ {
+ FLOG(_L("Removing Connecting progress note..."));
+
+ iDLProgressDlg->ProcessFinishedL();
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ TInt dlsize, tlsize;
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 6"));
+ iFotaServer->GetDownloadUpdatePackageSizeL(iDLState.iPkgId, dlsize,tlsize);
+ iDownloadedContentSize = dlsize; //for progress bar update only
+ iUpdateAfterDownload = iDLState.iUpdateLtr; //should update after reboot?
+ iRestartCounter = 0;
+
+ //Set right states in fota db
+ iDLState.iState = RFotaEngineSession::EDownloadProgressingWithResume;
+ iDLState.iResult = KErrNotFound;
+
+ iFotaServer->iDatabase->OpenDBL();
+ iFotaServer->iDatabase->SetStateL( iDLState, KNullDesC8, EFDBState|EFDBResult);
+ iFotaServer->iDatabase->CloseAndCommitDB();
+ iFreshDL = EFalse;
+ FLOG(_L("CFotaDownload::ResumeDownloadL, Stage 6: Starting to resume download now..."));
+ TInt err = iDownload->Start();
+ if (err == KErrNone)
+ {
+ //Set the P&S Key to active...
+ FLOG(_L("Resume operation is success!"));
+ SetDownloadActive(ETrue);
+ }
+ else
+ {
+ FLOG(_L("An error occured during resume, err = %d"),err);
+ toresetdl = ETrue;
+ }
+ }
+ else
+ {
+ FLOG(_L("Failed to get the paused download object"));
+ if ( iDLProgressDlg )
+ {
+ FLOG(_L("Removing Connecting progress note..."));
+ iDLProgressDlg->ProcessFinishedL(); // deletes itself
+ delete iDLProgressDlg;
+ iDLProgressDlg = NULL;
+ }
+ toresetdl = ETrue;
+ }
+ ReSetDownloadL( toresetdl);
+
+ FLOG(_L("CFotaDownload::ResumeDownloadL <<"));
+ }
+// --------------------------------------------------------------------------
+// CFotaDownload::ReSetDownloadL
+// Sets the download state to failed
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::ReSetDownloadL(TBool atoresetdl)
+{
+if (atoresetdl)
+ {
+ FLOG(_L("Resetting fota download !!!"));
+ if (iUserInitiatedResume || iDLState.iSessionType!=ESanSilent)
+ LaunchNotifierL(ESyncMLFwUpdErrorNote, KErrGeneralNoResume,0);
+ iDLState.iState = RFotaEngineSession::EDownloadFailed;
+ iDLState.iResult = RFotaEngineSession::EResUndefinedError;
+ iUpdateAfterDownload = EFalse;
+ iFotaServer->FinalizeDownloadL(iDLState);
+ }
+}
+
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::IsFMSEnabled
+// Returns FMS enabled state
+// --------------------------------------------------------------------------
+//
+TBool CFotaDownload::IsFMSEnabled()
+ {
+ FLOG(_L("CFotaDownload::IsFMSEnabled, iFMSEnabled = %d <<"), iFMSEnabled);
+ return iFMSEnabled;
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::IsDownloadResumable
+// Returns whether the download is resumable or not.
+// --------------------------------------------------------------------------
+//
+TBool CFotaDownload::IsDownloadResumable()
+ {
+ FLOG(_L("CFotaDownload::IsDownloadResumable, iDownloadResumable = %d <<"), iDownloadResumable);
+ return iDownloadResumable;
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::SetIapToUseL
+// Sets the IAP ID to use. This menthod is used in fresh and resume download.
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::SetIapToUseL(TPackageState aParams, const TInt aIapid)
+ {
+ FLOG(_L("CFotaDownload::SetIapToUseL >>"));
+
+ RSyncMLSession sml;
+ TInt profIapid( KErrNotFound );
+ TInt sockIapid( KErrNotFound );
+ TSmlServerAlertedAction saa(ESmlConfirmSync);
+
+ CleanupClosePushL( sml );
+ sml.OpenL();
+ iFotaServer->GetProfileDataL(&sml,aParams.iProfileId, profIapid, saa
+ ,iIsjobStartedFromUI, iSanValue );
+ CleanupStack::PopAndDestroy( &sml );
+
+ // 2/3 GET IAP FROM ESOCK ----------------------------------------------
+ // resolve which accespoint is used for current DM session
+ if ( profIapid == KErrNotFound && aIapid==KErrNotFound)
+ {
+ RSocketServ serv;
+ CleanupClosePushL( serv );
+ User::LeaveIfError( serv.Connect() );
+
+ RConnection conn;
+ CleanupClosePushL( conn );
+ User::LeaveIfError( conn.Open( serv ) );
+
+ TUint count( 0 );
+ User::LeaveIfError( conn.EnumerateConnections ( count ) );
+ // enumerate connections
+ for( TUint idx=1; idx<=count; ++idx )
+ {
+ TConnectionInfo connectionInfo;
+ TConnectionInfoBuf connInfo( connectionInfo );
+
+ TInt err = conn.GetConnectionInfo( idx, connInfo ); // iapid
+ if( err != KErrNone )
+ {
+ CleanupStack::PopAndDestroy( 2 ); // conn, serv
+ User::Leave( err );
+ }
+ // enumerate connectionclients
+ TConnectionEnumArg conArg;
+ conArg.iIndex = idx;
+ TConnEnumArgBuf conArgBuf(conArg);
+ err=conn.Control(KCOLConnection,KCoEnumerateConnectionClients
+ ,conArgBuf);
+ if( err != KErrNone )
+ {
+ CleanupStack::PopAndDestroy( 2 ); // conn, serv
+ User::Leave( err );
+ }
+ TInt cliCount = conArgBuf().iCount;
+ for ( TUint j=1; j<=cliCount ;++j )
+ {
+ TConnectionGetClientInfoArg conCliInfo;
+ conCliInfo.iIndex = j;
+ TConnGetClientInfoArgBuf conCliInfoBuf(conCliInfo);
+ err=conn.Control(KCOLConnection, KCoGetConnectionClientInfo
+ , conCliInfoBuf);
+
+ if( err != KErrNone )
+ {
+ CleanupStack::PopAndDestroy( 2 ); // conn, serv
+ User::Leave( err );
+ }
+ TConnectionClientInfo conCliInf = conCliInfoBuf().iClientInfo;
+ TUid uid = conCliInf.iUid;
+ if ( uid == TUid::Uid(KSosServerUid) )
+ {
+ sockIapid = connInfo().iIapId;
+ FLOG(_L("[FotaServer] IAP found %x"),sockIapid);
+ }
+
+ FLOG(_L("[FotaServer] CFotaDownload::DownloadL uid %x")
+ ,uid.iUid);
+ }
+ }
+ CleanupStack::PopAndDestroy( 2 ); // conn, serv
+ }
+ TInt newIapid( KErrNotFound );
+ if ( sockIapid!=KErrNotFound ) newIapid = sockIapid;
+ if ( profIapid!=KErrNotFound ) newIapid = profIapid;
+ if ( aIapid !=KErrNotFound ) newIapid = aIapid;
+
+ //Do some intelligent work during resume
+ /* Some rules..
+ * 1. If IAP is always ask in DM profile, use the earlier set during FMS trigger
+ * 2. If IAP is always ask in DM profile, query user for IAP during user trigger
+ * 3. If IAP has changed in DM profile after suspend, use the newer one during resume
+ * 4.
+ */
+ TInt active (KErrNotFound);
+ RProperty::Get( TUid::Uid(KOmaDMAppUid), KFotaDownloadActive, active );
+ FLOG(_L("active = %d"),active);
+ if (active==EFalse && iDLState.iState == RFotaEngineSession::EDownloadProgressingWithResume)
+ {
+ //Actual resume only
+ if (!iUserInitiatedResume && profIapid == KErrNotFound )
+ {
+ //FMS triggered resume, apply Rule 1
+ newIapid = iDLState.iIapId;
+ }
+ else if (profIapid == KErrNotFound)
+ {
+ //User triggered resume, apply Rule 2
+ newIapid = KErrNotFound;
+ }
+ else if (profIapid != iDLState.iIapId)
+ {
+ //IAP has changed in DM profile, apply Rule 3
+ newIapid = profIapid;
+ }
+ }
+ iDLState.iIapId = newIapid;
+
+
+ FLOG(_L("CFotaDownload::SetIapToUseL, iap = %d <<"), iDLState.iIapId);
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::SetDownloadUiBehavior
+// Sets Download UI behavior. ex: DD display and Progress note
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::SetDownloadUiBehavior(TBool aFreshDL)
+ {
+ FLOG(_L("CFotaDownload::SetDownloadUiBehavior, aFreshDL = %d >>"),aFreshDL);
+
+ if (aFreshDL) //Fresh download
+ {
+ iDLState.iSessionType = iSanValue;
+ }
+ else //resuming download
+ {
+ iSanValue = iDLState.iSessionType;
+ }
+
+ if ( !iIsjobStartedFromUI && iRestartCounter==0 ) //iRestartCounter to ensure that the UI behavior is read only once.
+ {
+ TInt behavior(KErrNotFound);
+ TInt sansupported(KErrNone);
+
+ //Find whether SAN is supported or not
+ CRepository* centrep = NULL;
+
+ TRAPD( err, centrep = CRepository::NewL( KCRUidDeviceManagementInternalKeys) );
+ if( centrep ) centrep->Get( KDevManSANUIBitVariation, sansupported );
+ delete centrep; centrep = NULL;
+ FLOG(_L("...1..."));
+ if (sansupported != 1) sansupported = 0;
+
+ //Find the download ui behavior from fota cenrep
+ TRAP(err, centrep = CRepository::NewL( KCRUidFotaServer ) );
+ if ( centrep ) centrep->Get( KSilentOmaDlUIBehavior, behavior );
+ delete centrep; centrep = NULL;
+
+ FLOG(_L("Values are... SAN enabled: %d, session type: %d, downloadbehavior: %d"),sansupported, iDLState.iSessionType,behavior);
+
+ if (sansupported) //SAN is supported
+ {
+
+ DetermineUISANON(behavior) ;
+
+ }
+ else //SAN not supported
+ {
+ DetermineUISANOFF(behavior);
+
+ }
+ }
+ else// if (iRestartCounter==0) //Started from DM UI, but not retry
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = ETrue;
+ if (aFreshDL)
+ iDLState.iSessionType = KErrNotFound;
+ }
+
+TInt value (EFotaUpdateDM);
+TInt err = RProperty::Get( KPSUidNSmlDMSyncApp, KNSmlCurrentFotaUpdateAppName, value );
+if (!err && ((value == EFotaUpdateNSC) || (value == EFotaUpdateNSCBg)))
+{
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = ETrue;
+ FLOG(_L("CFotaDownload::DownloadL UI will not be shown!"));
+}
+ FLOG(_L("UI Behavior: OMA DD Display = %d, Download Progress = %d"),iShowOMACDUI,iShowDLPrgUI);
+
+ FLOG(_L("CFotaDownload::SetDownloadUiBehavior <<"));
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::DetermineUISANON
+// Determine UI when SAN is ON
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::DetermineUISANON(TInt aBehavior)
+{
+ switch (aBehavior)
+ {
+ case EOmacdOffdlprgOff: //0
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = EFalse;
+ }
+ break;
+ case EOmacdOffdlprgOn: //1
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = ETrue;
+ }
+ break;
+ case EOmacdOndlprgOff: //2
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = EFalse;
+ }
+ break;
+ case EOmacdOndlprgOn: //3
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = ETrue;
+ }
+ break;
+ default: //includes EChooseFromSan
+ {
+ if(iSanValue == ESanSilent)
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = EFalse;
+ }
+ else if (iSanValue == ESanInformative)
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = ETrue;
+ }
+ else //includes ESanInteractive, ESanNotSpecified
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = ETrue;
+ }
+ }
+ break;
+ }
+
+
+}
+
+// --------------------------------------------------------------------------
+// CFotaDownload::DetermineUISANOFF
+// Determine UI when SAN is OFF
+// --------------------------------------------------------------------------
+//
+
+void CFotaDownload::DetermineUISANOFF(TInt aBehavior)
+{
+ if (iSanValue==EAcceptedYes) //Accepted is Yes in Profile
+ {
+ switch (aBehavior)
+ {
+ case EOmacdOffdlprgOff: //0
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = EFalse;
+ }
+ break;
+ case EOmacdOffdlprgOn: //1
+ {
+ iShowOMACDUI = EFalse;
+ iShowDLPrgUI = ETrue;
+ }
+ break;
+ case EOmacdOndlprgOff: //2
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = EFalse;
+ }
+ break;
+ default: //includes EOmacdOndlprgOn
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = ETrue;
+ }
+ break;
+ }
+ }
+ else // includes iSanValue = EAcceptedNo (Accepted is No in profile)
+ {
+ iShowOMACDUI = ETrue;
+ iShowDLPrgUI = ETrue;
+ }
+}
+
+
+
+
+
+
+
+// --------------------------------------------------------------------------
+// CFotaDownload::RetrieveDownloadL
+// Retrieves the RHttpDownload object from download manager during resume
+// --------------------------------------------------------------------------
+//
+RHttpDownload* CFotaDownload::RetrieveDownloadL()
+ {
+ FLOG(_L("CFotaDownload::RetrieveDownloadL >>"));
+ //Retrieve RHttpDownload object for the suspended download from Download Mgr.
+ if (!iDownloadMgr.Handle())
+ iDownloadMgr.ConnectL( TUid::Uid(KFotaServerUid) , *this, EFalse);
+ const CDownloadArray& downloads = iDownloadMgr.CurrentDownloads();
+
+ TBuf8<KMaxPath> url8;
+ TInt32 val (KErrNone);
+
+ RHttpDownload* aDownload (NULL);
+ for (TInt i = 0; i < downloads.Count(); i++ )
+ {
+ User::LeaveIfError( downloads[i]->GetStringAttribute( EDlAttrCurrentUrl, url8 ));
+ User::LeaveIfError( downloads[i]->GetIntAttribute( EDlAttrFotaPckgId, val));
+
+ FLOG(_L("Current download(s) as per download mgr: %d, url = %S, pkgid = %d"), i+1, &url8, val);
+
+ if (iDLState.iPkgId == val)
+ {
+ FLOG(_L("Successfully found the paused download object"));
+ aDownload = downloads[i];
+ if ( iUrl ) {delete iUrl; iUrl=NULL;}
+ iUrl = url8.Alloc();
+
+ }
+ }
+ FLOG(_L("CFotaDownload::RetrieveDownloadL <<"));
+ return aDownload;
+ }
+
+// --------------------------------------------------------------------------
+// CFotaDownload::SetDownloadActive
+// Sets the download activity state P&S key
+// --------------------------------------------------------------------------
+//
+void CFotaDownload::SetDownloadActive(TBool aValue)
+ {
+ FLOG(_L("CFotaDownload::SetDownloadActive, aValue = %d"),aValue);
+ iDownloadActive = aValue;
+ TBool val (EFalse);
+ TInt err = RProperty::Get(TUid::Uid(KOmaDMAppUid), KFotaDownloadActive, val );
+
+ if (err == KErrNone && val != aValue)
+ {
+ err = RProperty::Set(TUid::Uid(KOmaDMAppUid), KFotaDownloadActive, aValue );
+ FLOG(_L("RProperty KFotaDownloadActive Set %d, err = %d"), aValue, err);
+ }
+
+ FLOG(_L("CFotaDownload::SetDownloadActive <<"));
+ }
+
+// --------------------------------------------------------------------------
+// IsDownloadActive
+// Returns the activeness of the download
+// --------------------------------------------------------------------------
+//
+
+TBool CFotaDownload::IsDownloadActive()
+ {
+ FLOG(_L("CFotaDownload::IsDownloadActive, value = %d"),iDownloadActive);
+ return iDownloadActive;
+ }
+
+
+// --------------------------------------------------------------------------
+// CFotaDownloadNotifHandler::NewL
+// --------------------------------------------------------------------------
+//
+CFotaDownloadNotifHandler* CFotaDownloadNotifHandler::NewL (CFotaDownload* aDownload)
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::NewL"));
+ __ASSERT_ALWAYS( aDownload, User::Panic(KFotaPanic, KErrArgument) );
+ CFotaDownloadNotifHandler* h=new (ELeave)CFotaDownloadNotifHandler;
+ h->iDownload = aDownload;
+ h->iDownload->iFotaServer->iNotifHandler = h;
+ return h;
+ }
+
+// --------------------------------------------------------------------------
+CFotaDownloadNotifHandler::CFotaDownloadNotifHandler() : CActive(EPriorityNormal)
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::CFotaDownloadNotifHandler()"));
+ CActiveScheduler::Add( this );
+ }
+
+// --------------------------------------------------------------------------
+CFotaDownloadNotifHandler::~CFotaDownloadNotifHandler()
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::~CFotaDownloadNotifHandler >>"));
+ iNotifier.Close();
+ Cancel();
+ FLOG(_L("CFotaDownloadNotifHandler::~CFotaDownloadNotifHandler <<"));
+ }
+
+// --------------------------------------------------------------------------
+void CFotaDownloadNotifHandler::RunL()
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::RunL() note:%d, param:%d" ),iNotifParams.iNoteType, iNotifParams.iIntParam);
+
+ TBool reset (ETrue);
+
+ iNotifier.Close();
+
+ iDownload->SetDownloadActive(EFalse);
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdErrorNote ) // 1
+ {
+ //do nothing here
+ }
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdOmaDLNotEnoughMemory ) // 7
+ {
+ //To be active as Flexible mem is in action.
+ if (iDownload->iFreshDL)
+ iDownload->SetDownloadActive(ETrue);
+ }
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdOmaDLUserCancel )
+ {
+ //At this point Download Mgr has already paused the download successfully.
+ if (iStatus.Int() == KErrCancel) //RSK Press
+ {
+ //User wants to cancel download permanently.
+ FLOG(_L("User choose to cancel download permanently!"));
+ iDownload->RunDownloadCancelL(RFotaEngineSession::EResUserCancelled);
+ }
+ else
+ {
+ //Other keys pressed, like LSK or Call termination key
+ FLOG(_L("User choose to resume download later, key press = %d"),iStatus.Int());
+ iDownload->iFotaServer->FinalizeDownloadL( iDownload->iDLState );
+ if (iStatus.Int() == KErrNone) //RSK is pressed
+ {
+ LaunchNotifierL(ESyncMLFwUpdOmaDLPostponed, EFalse, EFalse);
+ reset = EFalse;
+ }
+ else
+ iDownload->iFotaServer->ShutApp();
+ }
+ }
+
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdOmaDLPostponed )
+ {
+ //Nothing to do
+ }
+
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdOmaDLCancelled )
+ {
+ //Nothing to do
+ }
+
+ if ( iNotifParams.iNoteType == ESyncMLFwUpdOmaDLResume )
+ {
+ if (iStatus.Int() == KErrNone) // LSK Press
+ {
+ FLOG(_L("User choose to continue download now."));
+ iNotifParams.iNoteType = ESyncMLFwUpdUnknown;
+ iNotifParams.iIntParam = 0;
+ iDownload->ResumeDownloadL();
+ reset = EFalse;
+ }
+ else //RSK or any other key
+ {
+ FLOG(_L("User cancelled to continue download now, key press = %d."),iStatus.Int());
+ if (iStatus.Int() == KErrCancel) //RSK is pressed
+ {
+ iDownload->iDLState.iResult = RFotaEngineSession::EResUserCancelled;
+ LaunchNotifierL(ESyncMLFwUpdOmaDLUserCancel, EFalse, EFalse);
+ reset = EFalse;
+ }
+ else
+ iDownload->iFotaServer->ShutApp();
+ }
+ }
+
+ if (reset)
+ {
+ iNotifParams.iNoteType = ESyncMLFwUpdUnknown;
+ iNotifParams.iIntParam = 0;
+ }
+ }
+
+// --------------------------------------------------------------------------
+TInt CFotaDownloadNotifHandler::RunError(TInt aError)
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::RunError %d"),aError);
+ return aError;
+ }
+
+// --------------------------------------------------------------------------
+void CFotaDownloadNotifHandler::DoCancel()
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::DoCancel >>"));
+ if (iNotifier.Handle())
+ {
+ iNotifier.CancelNotifier( KSyncMLFwUpdNotifierUid );
+ iNotifier.Close();
+ }
+ FLOG(_L("CFotaDownloadNotifHandler::DoCancel <<"));
+ }
+
+// --------------------------------------------------------------------------
+void CFotaDownloadNotifHandler::LaunchNotifierL( const TSyncMLFwUpdNoteTypes aNotetype
+ ,const TInt aIntParam
+ , const TInt aMemoryNeeded
+ ,TBool aFinishOnly)
+ {
+ FLOG(_L("CFotaDownloadNotifHandler::LaunchNotifierL, aNoteType=%d, aParam=%d, aMemoryNeeded=%d aFinishOnly=%d >> "), aNotetype, aIntParam, aMemoryNeeded, aFinishOnly?1:0);
+
+ __ASSERT_ALWAYS( iNotifier.Handle()==0, User::Leave(KErrAlreadyExists) );
+ __ASSERT_ALWAYS( aMemoryNeeded>=0, User::Leave(KErrArgument) );
+
+
+ // Launch notifier
+ TSyncMLFwUpdNotifParams params;
+ FLOG(_L(" 1"));
+ params.iNoteType = aNotetype;
+ params.iIntParam = aIntParam;
+
+ TInt rem = 0;
+ rem = aMemoryNeeded % 1024 ;
+ if (rem)
+ {
+ params.iMemoryNeeded = (aMemoryNeeded /1024) + 1;
+ }
+ else
+ {
+ params.iMemoryNeeded = (aMemoryNeeded /1024) ;
+ }
+
+ // #endif
+ TSyncMLFwUpdNotifParamsPckg pckg(params);
+ iNotifParams.iNoteType = params.iNoteType;
+ iNotifParams.iIntParam = params.iIntParam;
+
+ iNotifParams.iMemoryNeeded = params.iMemoryNeeded;
+
+ iDummyResponsePckg = TSyncMLFwUpdNotifRetValPckg();
+ FLOG(_L(" 2"));
+ if ( !aFinishOnly )
+ {
+ User::LeaveIfError( iNotifier.Connect() );
+ iNotifier.StartNotifierAndGetResponse( iStatus, KSyncMLFwUpdNotifierUid
+ , pckg, iDummyResponsePckg );
+ SetActive();
+ }
+ else
+ {
+ iStatus = KRequestPending;
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ }
+ FLOG(_L(" 3 %d"),iStatus.Int());
+ FLOG(_L("CFotaDownloadNotifHandler::LaunchNotifierL() <<"));
+ }
+
+TBool CFotaDownloadNotifHandler::IsOpen()
+ {
+ FLOG(_L("Handle = %d"), iNotifier.Handle());
+ return (iNotifier.Handle())? ETrue:EFalse;
+ }