diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/updater/src/iaupdaterinstaller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/updater/src/iaupdaterinstaller.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,379 @@ +/* +* Copyright (c) 2007-2008 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: Installs self update. +* +*/ + + + +#include "iaupdaterinstaller.h" +#include "iaupdatermngr.h" +#include "iaupdatersilentlauncher.h" +#include "iaupdaterdefs.h" +#include "iaupdatedebug.h" + + +// ======== LOCAL FUNCTIONS ========= + +// ======== MEMBER FUNCTIONS ======== + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::NewL +// Two phased construction +// ----------------------------------------------------------------------------- +// +CIAUpdaterInstaller* CIAUpdaterInstaller::NewL( + RFs& aFs, + CIAUpdaterMngr& aIAUpdater ) + { + CIAUpdaterInstaller* self = + new (ELeave) CIAUpdaterInstaller( aFs, aIAUpdater ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::CIAUpdaterInstaller() +// C++ constructor +// ----------------------------------------------------------------------------- +// +CIAUpdaterInstaller::CIAUpdaterInstaller( + RFs& aFs, + CIAUpdaterMngr& aIAUpdater ) + : CActive( CActive::EPriorityStandard ), + iFs( aFs ), + iIAUpdater( aIAUpdater ), + iState( EDSisInstallerStateIdle ), + iInstallErr( KErrNone ), + iFileIndex( 0 ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::~CIAUpdaterInstaller() +// Install Request destructor +// ----------------------------------------------------------------------------- +// +CIAUpdaterInstaller::~CIAUpdaterInstaller() + { + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::~CIAUpdaterInstaller begin"); + + CancelOperation(); + + iTimer.Close(); + + iFilesToInstall.ResetAndDestroy(); + delete iInstallLauncher; + + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::~CIAUpdaterInstaller end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::ConstructL() +// Constructior +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::ConstructL() + { + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::ConstructL begin"); + User::LeaveIfError( iTimer.CreateLocal() ); + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::ConstructL end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::AddFileToInstallL() +// Set the path of all sis files. +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::AddFileToInstallL( const TDesC& aFileName ) + { + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::AddFileToInstallL begin"); + HBufC* fileName = aFileName.AllocLC(); + IAUPDATE_TRACE_1("[IAUpdater] fileName: %S", fileName); + iFilesToInstall.AppendL( fileName ); + CleanupStack::Pop( fileName ); + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::AddFileToInstallL end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::StartInstallingL() +// Start installing +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::StartInstallingL() + { + IAUPDATE_TRACE("[IAUpdater] Installer::StartInstallingL begin"); + + if ( !iFilesToInstall.Count() ) + { + IAUPDATE_TRACE_1("[IAUpdater] Error No file to install: %d", KErrAbort ); + User::Leave( KErrAbort ); + } + + if ( iState != EDSisInstallerStateIdle ) + { + // Leave, because installation operation is already on. + User::Leave( KErrInUse ); + } + + if ( !iInstallLauncher ) + { + IAUPDATE_TRACE("[IAUpdater] Create install launcher"); + iInstallLauncher = CIAUpdaterSilentLauncher::NewL( iFs ); + } + + + // Reset the error + IAUPDATE_TRACE("[IAUpdater] Reset error and complete self"); + iInstallErr = KErrNone; + CompleteSelf(); + + + // Notice, that this will not return before + // CActiveSchedulerWait::AsyncStop() is called. + // So, active object may do its job above + // and the code will continue after they + // are finished and AsyncStop is called. + IAUPDATE_TRACE("[IAUpdater] Active scheduler start waiting begins"); + iWaiter.Start(); + IAUPDATE_TRACE("[IAUpdater] Active scheduler start waiting ends"); + + IAUPDATE_TRACE("[IAUpdater] Installer::StartInstallingL end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::CompleteSelf() +// Complete the request manually +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::CompleteSelf() + { + IAUPDATE_TRACE("[IAUpdater] Installer::CompleteSelf begin"); + + if ( !IsActive() ) + { + IAUPDATE_TRACE("[IAUpdater] SetActive"); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + + IAUPDATE_TRACE("[IAUpdater] Installer::CompleteSelf end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::CancelOperation() +// Cancel the active request and stop waiter. +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::CancelOperation() + { + IAUPDATE_TRACE("[IAUpdater] Installer::CancelOperation begin"); + + // Use normal cancel to cancel possible active operation. + Cancel(); + + // Stop active scheduler + if ( iWaiter.IsStarted() ) + { + IAUPDATE_TRACE("[IAUpdater] Stop waiter."); + iWaiter.AsyncStop(); + } + + IAUPDATE_TRACE("[IAUpdater] Installer::CancelOperation end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::DoCancel() +// Cancel the active request. +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::DoCancel() + { + IAUPDATE_TRACE("[IAUpdater] Installer::DoCancel begin"); + + iTimer.Cancel(); + + iFileIndex = 0; + iFilesToInstall.ResetAndDestroy(); + + if ( iState == EDSisInstallerStateInstalling ) + { + iInstallLauncher->Cancel(); + } + + TRAP_IGNORE( iIAUpdater.SetProcessParametersL( KErrCancel ) ); + + IAUPDATE_TRACE("[IAUpdater] Installer::DoCancel end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::RunL() +// +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::RunL() + { + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::RunL() begin"); + IAUPDATE_TRACE_1("[IAUpdater] RunL(): iStatus = %d", iStatus.Int() ); + + switch ( iState ) + { + // Reached when installation is completed. Check result. + case EDSisInstallerStateInstalling: + { + IAUPDATE_TRACE("[IAUpdater] RunL() Sis Inst. state INSTALLING"); + + if ( iStatus.Int() == SwiUI::KSWInstErrBusy ) + { + IAUPDATE_TRACE("[IAUpdater] RunL() SWInstaller Busy"); + + // User might be installing something, wait before retrying + TTimeIntervalMicroSeconds32 time( + IAUpdaterDefs::KInstallRetryWaitTime ); + iTimer.After( iStatus, time ); + iState = EDSisInstallerStateInstallerBusy; + SetActive(); + break; + } + else if ( (iStatus.Int() == SwiUI::KSWInstErrSecurityFailure && + iInstallErr == KErrNone) || + (iStatus.Int() != KErrNone && + iStatus.Int() != SwiUI::KSWInstErrSecurityFailure) ) + { + IAUPDATE_TRACE("[IAUpdater] RunL() Ins. err or sec. failure"); + + iInstallErr = iStatus.Int(); + } + + // Check if we have more to install + if ( iFileIndex < iFilesToInstall.Count() ) + { + IAUPDATE_TRACE("[IAUpdater] RunL() Start next installation"); + + iState = EDSisInstallerStateIdle; + CompleteSelf(); + } + else + { + InstallationCompleted( iInstallErr ); + } + } + break; + + // Install a file + case EDSisInstallerStateIdle: + { + IAUPDATE_TRACE("[IAUpdater] RunL() Sis Inst. state IDLE"); + + if ( iFileIndex < iFilesToInstall.Count() ) + { + iSisFile.Copy( *iFilesToInstall[iFileIndex] ); + ++iFileIndex; + + IAUPDATE_TRACE_1("[IAUpdater] RunL() Start install %S", &iSisFile ); + iInstallLauncher->InstallL( iSisFile, iStatus ); + iState = EDSisInstallerStateInstalling; + SetActive(); + } + else + { + InstallationCompleted( iInstallErr ); + } + } + break; + + case EDSisInstallerStateInstallerBusy: + { + IAUPDATE_TRACE("[IAUpdater] RunL() Sis Inst. state INSTALLER BUSY"); + IAUPDATE_TRACE_1("[IAUpdater] RunL() Start install for %S", &iSisFile ); + + iInstallLauncher->InstallL( iSisFile, iStatus ); + iState = EDSisInstallerStateInstalling; + + SetActive(); + } + break; + + // Active object in unknown state + default: + IAUPDATE_TRACE("[IAUpdater] RunL() Active object in unknown state"); + User::Panic( IAUpdaterDefs::KIAUpdaterInstaller, KErrNotSupported ); + break; + } + + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::RunL() end"); + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::RunError() +// If RunL leaves then ignore errors +// ----------------------------------------------------------------------------- +// +TInt CIAUpdaterInstaller::RunError( TInt aError ) + { + IAUPDATE_TRACE_1("[IAUpdater] CIAUpdaterInstaller::RunError() error = %d", aError ); + TInt err( KErrNone ); + InstallationCompleted( aError ); + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::RunError() end"); + return err; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdaterInstaller::InstallationCompleted() +// Stop active scheduler and stop installation. +// ----------------------------------------------------------------------------- +// +void CIAUpdaterInstaller::InstallationCompleted( TInt aResult ) + { + IAUPDATE_TRACE_1("[IAUpdater] Installation is completed. result = %d", aResult); + + TRAP_IGNORE( iIAUpdater.SetProcessParametersL( aResult ) ); + + iState = EDSisInstallerStateIdle; + iInstallErr = KErrNone; + delete iInstallLauncher; + iInstallLauncher = NULL; + + IAUPDATE_TRACE("[IAUpdater] Stop active scheduler"); + + // Cancel outstanding requests. + CancelOperation(); + + IAUPDATE_TRACE("[IAUpdater] CIAUpdaterInstaller::InstallationCompleted() end"); + } + +// ======== GLOBAL FUNCTIONS ======== + +//EOF + + + + +