--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/daemon/daemoninstaller.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -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 <apgcli.h>
+#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;
+ }
+ }