diff -r 7333d7932ef7 -r 8b7f4e561641 installationservices/swi/source/daemon/daemoninstaller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/source/daemon/daemoninstaller.cpp Wed Sep 01 12:22:02 2010 +0100 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + + +#include +#include "daemoninstaller.h" +#include "swispubsubdefs.h" +#include "log.h" + +const static TInt KAppListRetryWaitTime = 5000000; // 5 secs +_LIT(KMCSisInstaller,"Daemon-Installer"); // Minor-Component name + +namespace Swi + { + // Two phased construction + + CSisInstaller* CSisInstaller::NewL(MDaemonInstallBehaviour* aDaemonBehaviour) + { + CSisInstaller* self = new (ELeave) CSisInstaller(aDaemonBehaviour); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + // Install Request constructor + + CSisInstaller::CSisInstaller(MDaemonInstallBehaviour* aDaemonBehaviour) : CActive(CActive::EPriorityStandard), + iDaemonBehaviour(aDaemonBehaviour), + iState(MDaemonInstallBehaviour::EStateVerifyAppCacheList), + iFileIndex(0), + iTimeStep(KAppListRetryWaitTime) + { + CActiveScheduler::Add(this); + } + + // Install Request destructor + + CSisInstaller::~CSisInstaller() + { + Cancel(); + iTimer.Close(); + iProperty.Close(); + iFilesToInstall.ResetAndDestroy(); + iFilesToInstall.Close(); + } + + // 2nd phase construction + + void CSisInstaller::ConstructL() + { + User::LeaveIfError(iTimer.CreateLocal()); + User::LeaveIfError(iProperty.Attach(KUidSystemCategory,KUidSoftwareInstallKey)); + } + + // Set the location of all sis files and the list of them + // also take ownership of the pointers to memory + + void CSisInstaller::AddFileToInstallL(const TDesC& aFileName) + { + DEBUG_PRINTF2(_L("SWI Daemon - Queueing presintalled SIS file '%S' for processing"), + &aFileName); + + HBufC* fileName = aFileName.AllocLC(); + iFilesToInstall.AppendL(fileName); + CleanupStack::Pop(fileName); + } + + // Start the request to process the Sisx file + + void CSisInstaller::StartInstallingL() + { + if(iFilesToInstall.Count() > 0) + { + iState = MDaemonInstallBehaviour::EStateVerifyAppCacheList; + ReRequestL(); + } + } + + // Requesting an asyncronous timer/subscrive event + + void CSisInstaller::ReRequestL() + { + switch (iState) + { + // Verify the app cache list at time intervals + case MDaemonInstallBehaviour::EStateVerifyAppCacheList: + iTimer.Cancel(); + iTimer.After(iStatus,iTimeStep); + SetActive(); + break; + + // Verify software installer property + case MDaemonInstallBehaviour::EStateVerifySwisProperty: + CompleteSelf(); + break; + + case MDaemonInstallBehaviour::EStateVerifySwisIdle: + iProperty.Subscribe(iStatus); + SetActive(); + break; + + case MDaemonInstallBehaviour::EStateInstall: + CompleteSelf(); + break; + + default: + // SisInstaller in an incorrect state + User::Panic(KMCSisInstaller,KErrNotSupported); + break; + } + } + + // Complete the request manually + + void CSisInstaller::CompleteSelf() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status,KErrNone); + SetActive(); + } + + // Cancel the active request + + void CSisInstaller::DoCancel() + { + iProperty.Cancel(); + iTimer.Cancel(); + } + + void CSisInstaller::Reset() + { + Cancel(); + iFileIndex = 0; + iFilesToInstall.ResetAndDestroy(); + } + + // When the software installer has changed state + // attemp to install a sisx file + + void CSisInstaller::RunL() + { + if (iStatus.Int() != KErrNone) + { + User::Leave(iStatus.Int()); // Invoke RunError + } + + switch (iState) + { + // Check the cached list of applications + case MDaemonInstallBehaviour::EStateVerifyAppCacheList: + iState = iDaemonBehaviour->VerifyAppCacheListL(); + ReRequestL(); + break; + + case MDaemonInstallBehaviour::EStateVerifySwisProperty: + iState = iDaemonBehaviour->VerifySwisPropertyL(); + ReRequestL(); + break; + + // Check the software installer is not busy + case MDaemonInstallBehaviour::EStateVerifySwisIdle: + iState = iDaemonBehaviour->VerifySwisIdleL(); + ReRequestL(); + break; + + // Install a file + case MDaemonInstallBehaviour::EStateInstall: + { + iSisFile.Copy(*iFilesToInstall[iFileIndex]); + iDaemonBehaviour->DoInstallRequestL(iSisFile); + if (++iFileIndex < iFilesToInstall.Count()) + { + iState = MDaemonInstallBehaviour::EStateVerifySwisProperty; + CompleteSelf(); + } + else + { + // All done + iDaemonBehaviour->DoNotifyMediaProcessingComplete(); + } + + break; + } + + // Active object in unknown state + default: + User::Panic(KMCSisInstaller,KErrNotSupported); + break; + } + } + + // If RunL leaves then ignore errors + + TInt CSisInstaller::RunError(TInt aError) + { + DEBUG_PRINTF3(_L8("SWI Daemon - Daemon failed in state %d with code %d"), + iState, aError); + + Reset(); + TInt err(KErrNone); + if (aError == KErrCancel) + { + iState = MDaemonInstallBehaviour::EStateVerifyAppCacheList; + } + return err; + } + }