installationservices/refswinstallationplugin/source/sifrefinstallertask.cpp
branchRCL_3
changeset 26 8b7f4e561641
parent 25 7333d7932ef7
child 27 e8965914fac7
--- a/installationservices/refswinstallationplugin/source/sifrefinstallertask.cpp	Tue Aug 31 15:21:33 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1017 +0,0 @@
-/*
-* Copyright (c) 2008-2010 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: 
-* This  file implements Reference Install tasks for getting ComponentInfo, installation, uninstallation and activation/deactivation.
-*
-*/
-
-
-#include "sifrefinstallertask.h"
-#include "sifrefbinpkgextractor.h"
-#include "usiflog.h"
-#include <usif/usiferror.h>
-
-using namespace Usif;
-
-_LIT(KRefInstPrivateDir, "c:\\private\\1028634e\\");
-
-/**
-A set of helper functions for Reference Installer tasks.
-*/
-namespace InstallHelper
-	{
-	_LIT(KSifReferenceSoftwareType, "reference");
-	_LIT(KUiConfirmationQuestion, "Are you sure you want to %S component: %S, vendor: %S");
-	_LIT(KParamNameErrDesc, "Error Description");
-	_LIT(KErrFileAlreadyExists, "File already exists: ");
-	_LIT(KUiConfirmationTypeInstall, "install");
-	_LIT(KUiConfirmationTypeUpgrade, "upgrade");
-	_LIT(KUiConfirmationTypeUninstall, "uninstall");
-	_LIT(KUiParserErrorDesc, "Installer encountered a problem when parsing a package file.");
-	const TInt KMaxConfirmationTypeLengh = KUiConfirmationTypeUninstall.iTypeLength;
-
-	// This Reference Installer uses Component Name and Vendor Name in order to
-	// identify a component in the SCR database. This identification scheme doesn't provide
-	// unique ids and its results depend on the current language. Hence, a real installer
-	// must use the Unique Id mechanism provided by the SCR.
-	void FindComponentL(RSoftwareComponentRegistry& aScr, TComponentSearchData& aCompSearchData, const CSifRefPkgParser& aParser)
-		{
-		DEBUG_PRINTF(_L8("InstallHelper::FindComponentL()"));
-		
-		// Get the index of the current language
-		const TLanguage curLang = User::Language();
-		TInt langIndex = aParser.GetLanguageIndex(curLang);
-		if (langIndex == KErrNotFound)
-			{
-			ASSERT(aParser.Languages().Count() > 0); // The parser should have already rejected packages without languages
-			langIndex = 0;
-			}
-
-		// Data for CComponentInfo
-		aCompSearchData.iName = aParser.ComponentNames()[langIndex];
-		aCompSearchData.iVersion = aParser.Version().Name();
-		aCompSearchData.iVendor = aParser.VendorNames()[langIndex];
-		aCompSearchData.iScomoState = EDeactivated;
-		aCompSearchData.iInstallStatus = ENewComponent;
-		aCompSearchData.iComponentId = 0;
-
-		RSoftwareComponentRegistryView scrView;
-		CComponentFilter* filter = CComponentFilter::NewLC();
-		filter->SetNameL(*aCompSearchData.iName);
-		filter->SetVendorL(*aCompSearchData.iVendor);
-		filter->SetSoftwareTypeL(KSifReferenceSoftwareType);
-
-		scrView.OpenViewL(aScr, filter);
-		CleanupClosePushL(scrView);
-
-		// Iterate over matching components in order to determine the status of the package being processed.
-		CComponentEntry* component = NULL;
-		while ((component = scrView.NextComponentL()) != NULL)
-			{
-			const TDesC& installedVersion = component->Version();
-			const TInt cmp = RSoftwareComponentRegistry::CompareVersionsL(installedVersion, aCompSearchData.iVersion);
-			if (cmp > 0)
-				{
-				aCompSearchData.iInstallStatus = ENewerVersionAlreadyInstalled;
-				aCompSearchData.iScomoState = component->ScomoState();
-				aCompSearchData.iComponentId = component->ComponentId();
-				delete component;
-				break;
-				}
-			else if (cmp == 0 && aCompSearchData.iInstallStatus < EAlreadyInstalled)
-				{
-				aCompSearchData.iInstallStatus = EAlreadyInstalled;
-				aCompSearchData.iScomoState = component->ScomoState();
-				aCompSearchData.iComponentId = component->ComponentId();
-				}
-			else if (cmp < 0 && aCompSearchData.iInstallStatus < EUpgrade)
-				{
-				aCompSearchData.iInstallStatus = EUpgrade;
-				aCompSearchData.iScomoState = component->ScomoState();
-				aCompSearchData.iComponentId = component->ComponentId();
-				}
-			delete component;
-			}
-		CleanupStack::PopAndDestroy(2, filter);
-		}
-
-	TBool UnregisterAndDeleteFileL(RSoftwareComponentRegistry& aScr, RSoftwareComponentRegistryFilesList& aFileList, RStsSession& aSts, TComponentId aComponentId)
-		{
-		DEBUG_PRINTF(_L8("InstallHelper::UnregisterAndDeleteFileL()"));
-		
-		// Get next file
-		HBufC* file = aFileList.NextFileL();
-		if (file != NULL)
-			{
-			// and remove it from the file system
-			CleanupStack::PushL(file);
-			aSts.RemoveL(*file);
-			CleanupStack::PopAndDestroy(file);
-			}
-		else
-			{
-			// Remove the component from the SCR if there are no files left
-			aFileList.Close();
-			aScr.DeleteComponentL(aComponentId);
-			
-			// Copying complete
-			return ETrue;
-			}
-
-		// Copying in progress
-		return EFalse;
-		}
-
-	MInstallerUIHandler* CreateUiHandlerL(const COpaqueNamedParams* aCustomArguments, TInstallerUIHandlerFactory aUiHandlerFactory)
-		{
-		DEBUG_PRINTF(_L8("InstallHelper::CreateUiHandlerL()"));
-		
-		// Instantiate a UI handler for non-silent requests
-		if (aCustomArguments != NULL)
-			{
-			TInt silent = EFalse;
-			aCustomArguments->GetIntByNameL(_L("Silent"), silent);
-			if (silent)
-				{
-				return NULL;
-				}
-			}
-
-		return aUiHandlerFactory();
-		}
-
-	enum TConfirmationType
-		{
-		EConfirmationInstall,
-		EConfirmationUpgrade,
-		EConfirmationUninstall
-		};
-
-	void userConfirmationL(TConfirmationType aType, MInstallerUIHandler& uiHandler, const TDesC& aComponent, const TDesC& aVendor)
-		{
-		DEBUG_PRINTF(_L8("InstallHelper::userConfirmationL()"));
-		
-		const TInt maxLen = KUiConfirmationQuestion.iTypeLength + KMaxConfirmationTypeLengh + aComponent.Length() + aVendor.Length();
-		HBufC* info = HBufC::NewLC(maxLen);
-		TPtr bufInfo(info->Des());
-		
-		switch (aType)
-			{
-			case EConfirmationInstall:
-				bufInfo.Format(KUiConfirmationQuestion, &KUiConfirmationTypeInstall, &aComponent, &aVendor);
-				break;
-
-			case EConfirmationUpgrade:
-				bufInfo.Format(KUiConfirmationQuestion, &KUiConfirmationTypeUpgrade, &aComponent, &aVendor);
-				break;
-
-			case EConfirmationUninstall:
-				bufInfo.Format(KUiConfirmationQuestion, &KUiConfirmationTypeUninstall, &aComponent, &aVendor);
-				break;
-
-			default:
-				User::Leave(KErrArgument);
-			}
-
-		if (!uiHandler.ConfirmationUIHandler(*info))
-			{
-			User::Leave(KErrCancel);
-			}
-
-		CleanupStack::PopAndDestroy(info);
-		}
-	}
-
-// =============================================================================================================
-
-CSifRefGetComponentInfoTask* CSifRefGetComponentInfoTask::NewL(TTransportTaskParams& aParams)
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::NewL()"));
-	
-	// Validate the arguments first.
-	if ((aParams.iFileName == NULL && aParams.iFileHandle == NULL) || aParams.iComponentInfo == NULL)
-		{
-		User::Leave(KErrArgument);
-		}
-		
-	CSifRefGetComponentInfoTask* self = new (ELeave) CSifRefGetComponentInfoTask(aParams);
-	return self;
-	}
-
-CSifRefGetComponentInfoTask::CSifRefGetComponentInfoTask(TTransportTaskParams& aParams)
-: CSifTransportTask(aParams, EFalse), iStep(EExtractEmbeddedPkgs)
-	{
-	}
-
-CSifRefGetComponentInfoTask::~CSifRefGetComponentInfoTask()
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::~CSifRefGetComponentInfoTask()"));
-	
-	iFile.Close();
-	iFs.Close();
-	iScr.Close();
-	iSts.Close();
-	iEmbeddedComponents.Close();
-	if (iSifRequestInProgress)
-		{
-		iSif.CancelOperation();
-		}
-	iSif.Close();
-	delete iParser;
-	delete iComponentInfo;
-	}
-
-TBool CSifRefGetComponentInfoTask::ExecuteImplL()
-	{
-	DEBUG_PRINTF2(_L8("Exiting from CSifRefGetComponentInfoTask::ExecuteImplL(), iStep = %d"), iStep);
-	
-	TBool done = EFalse;
-	
-	switch (iStep)
-		{
-		case EExtractEmbeddedPkgs:
-			ExtractEmbeddedPkgsL();
-			++iStep;
-			break;
-
-		case EParsePkgFile:
-			iStep = ParsePkgFileL();
-			break;
-
-		case EFindComponent:
-			InstallHelper::FindComponentL(iScr, iCompSearchData, *iParser);
-			++iStep;
-			break;
-
-		case ECreateComponentInfoNode:
-			iStep = CreateComponentInfoNodeL();
-			break;
-
-		case ESetComponentInfo:
-			SetComponentInfoL();
-			done = ETrue;
-			break;
-
-		default:
-			User::Leave(KErrGeneral);
-		}
-
-	if (!iSifRequestInProgress)
-		{
-		TRequestStatus* status(RequestStatus());
-		User::RequestComplete(status, KErrNone);
-		}
-	
-	DEBUG_PRINTF3(_L8("Exiting from CSifRefGetComponentInfoTask::ExecuteImplL(), done = %d, iStep = %d"), done, iStep);
-	
-	return done;
-	}
-
-void CSifRefGetComponentInfoTask::ExtractEmbeddedPkgsL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::ExtractEmbeddedPkgsL()"));
-	
-	// Start an STS transaction. The extraction of a package requires creation of temporary
-	// files that must be deleted when the GetComponentInfo requiest is complete. This is why
-	// we need this STS transaction here.
-	iSts.CreateTransactionL();
-
-	if (FileName())
-		{
-		SifRefBinPkgExtractor::BuildPkgTreeL(iSts, *FileName(), KRefInstPrivateDir, iEmbeddedComponents);
-		}
-	else if (FileHandle())
-		{
-		SifRefBinPkgExtractor::BuildPkgTreeL(iSts, *FileHandle(), KRefInstPrivateDir, iEmbeddedComponents);
-		}
-	else
-		{
-		ASSERT(0);
-		}
-	
-	// Connect to the SCR. The installer needs this session to check if a component being queried
-	// is already installed and, if yes, obtain its detials.
-	User::LeaveIfError(iScr.Connect());
-	}
-
-TInt CSifRefGetComponentInfoTask::ParsePkgFileL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::ParsePkgFileL()"));
-	
-	delete iParser;
-	iParser = NULL;
-
-	// Check if the next component is of the type our installer supports. If yes, add it to the list of
-	// the components to be processed. If not, use the SIF API to obtain its details.
-	const SifRefBinPkgExtractor::CAuxNode& node = *iEmbeddedComponents[iCurrentComponent];
-	if (node.Foreign())
-		{
-		// Connect to the SIF server
-		iComponentInfo = CComponentInfo::NewL();
-		User::LeaveIfError(iSif.Connect());
-
-		// Our installer keeps temporary files under its private folder and therefore we have to
-		// pass a file handle to the SIF API.
-		User::LeaveIfError(iFs.Connect());
-		iFs.ShareProtected();
-		User::LeaveIfError(iFile.Open(iFs, node.FileNameL(), EFileShareReadersOnly));
-
-		// Submit a SIF request 
-		iSif.GetComponentInfo(iFile, *iComponentInfo, *RequestStatus());
-		
-		iSifRequestInProgress = ETrue;
-
-		return ECreateComponentInfoNode;
-		}
-	else
-		{
-		iParser = CSifRefPkgParser::NewL(node.FileNameL());
-		return EFindComponent;
-		}
-	}
-
-TInt CSifRefGetComponentInfoTask::CreateComponentInfoNodeL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::CreateComponentInfoNodeL()"));
-	
-	SifRefBinPkgExtractor::CAuxNode& auxNode = *iEmbeddedComponents[iCurrentComponent];
-
-	if (iSifRequestInProgress)
-		{
-		iSif.Close();
-		iFile.Close();
-		iFs.Close();
-		
-		iSifRequestInProgress = EFalse;
-		
-		// Add the root node of iComponentInfo to the tree
-		User::LeaveIfError(RequestStatus()->Int());
-		auxNode.SetCompInfoL(iComponentInfo);
-		iComponentInfo = NULL;
-		}
-	else
-		{
-		// This reference installer uses the KExampleFileSize const value to calculate the maximum size of the installed
-		// component on a phone. This is because the reference package file carries only the list of the files to be installed
-		// without the files themselves. A real installer should use the size of the files to be installed.
-		const TInt KExampleFileSize = 1024;
-		const TInt maxInstalledSize = iParser->Files().Count() * KExampleFileSize;
-		const TBool hasExe = EFalse;
-		const TBool driveSelectionRequired = EFalse;
-		RPointerArray<Usif::CComponentInfo::CApplicationInfo>* applications = NULL;
-		// The example capabilities below are hardcoded due to the same reason. The reference package file doesn't contain
-		// user grantable capabilities but a real package file should provide them.
-		TCapabilitySet userGrantableCaps(ECapabilityReadUserData, ECapabilityWriteUserData);
-	
-		// Create a ComponentInfo node and set it as a root node.
-		CComponentInfo::CNode* compInfoNode = CComponentInfo::CNode::NewLC(InstallHelper::KSifReferenceSoftwareType,
-							*iCompSearchData.iName, iCompSearchData.iVersion, *iCompSearchData.iVendor,
-							iCompSearchData.iScomoState, iCompSearchData.iInstallStatus, iCompSearchData.iComponentId,
-							*iCompSearchData.iName, ENotAuthenticated, userGrantableCaps, maxInstalledSize, hasExe, driveSelectionRequired, applications);
-		
-		auxNode.SetNodeL(compInfoNode);
-		CleanupStack::Pop(compInfoNode);
-		}
-	
-	return (++iCurrentComponent < iEmbeddedComponents.Count()) ? EParsePkgFile : ESetComponentInfo;
-	}
-
-void CSifRefGetComponentInfoTask::SetComponentInfoL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefGetComponentInfoTask::SetComponentInfoL()"));
-	
-	// At least one node must exist, otherwise we can't reach this point.
-	ASSERT (iEmbeddedComponents.Count() > 0);
-	
-	// Build a real tree of the nodes from iEmbeddedComponents which is a flat list
-	for (TInt i=iEmbeddedComponents.Count()-1; i>=1; --i)
-		{
-		iEmbeddedComponents[i]->RegisterChildToParentL();
-		}
-	
-	// Set the tree built above as the root node of ComponentInfo().
-	iEmbeddedComponents[0]->SetAsRootNodeL(*ComponentInfo());
-	}
-
-// =============================================================================================================
-
-CSifRefInstallTask* CSifRefInstallTask::NewL(TTransportTaskParams& aParams, TInstallerUIHandlerFactory aUiHandlerFactory)
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::NewL()"));
-	
-	CSifRefInstallTask* self = new (ELeave) CSifRefInstallTask(aParams);
-	CleanupStack::PushL(self);
-	self->ConstructL(aUiHandlerFactory);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CSifRefInstallTask::CSifRefInstallTask(TTransportTaskParams& aParams)
-: CSifTransportTask(aParams, EFalse), iStep(EExtractEmbeddedPkgs)
-	{
-	}
-
-CSifRefInstallTask::~CSifRefInstallTask()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::~CSifRefInstallTask()"));
-	
-	iFileList.Close();
-	iFile.Close();
-	iFs.Close();
-	iScr.Close();
-	iSts.Close();
-	iEmbeddedComponents.Close();
-	if (iSifRequestInProgress)
-		{
-		iSif.CancelOperation();
-		}
-	iSif.Close();
-	delete iParser;
-	delete iUiHandler;
-	delete iOpaqueArguments;
-	delete iOpaqueResults;
-	}
-
-void CSifRefInstallTask::ConstructL(TInstallerUIHandlerFactory aUiHandlerFactory)
-	{
-	if ((FileName() == NULL && FileHandle() == NULL) ||
-		CustomArguments() == NULL ||
-		CustomResults() == NULL)
-		{
-		User::Leave(KErrArgument);
-		}
-
-	iUiHandler = InstallHelper::CreateUiHandlerL(CustomArguments(), aUiHandlerFactory);
-	}
-
-TBool CSifRefInstallTask::ExecuteImplL()
-	{
-	DEBUG_PRINTF2(_L8("Exiting from CSifRefInstallTask::ExecuteImplL(), iStep = %d"), iStep);
-	
-	TBool done = EFalse;
-	
-	switch (iStep)
-		{
-		case EExtractEmbeddedPkgs:
-			ExtractEmbeddedPkgsL();
-			++iStep;
-			break;
-
-		case EParsePkgFile:
-			iStep = ParsePkgFileL();
-			break;
-
-		case ELaunchForeignInstall:
-			LaunchForeignInstallL();
-			++iStep;
-			break;
-
-		case EFinishForeignInstall:
-			FinishForeignInstallL();
-			iStep = EParsePkgFile;
-			break;
-
-		case EFindAndCheckComponent:
-			// Next step differs for ENewComponent and EUpgrade
-			iStep = FindAndCheckComponentL();
-			break;
-
-		case EGetInstalledFileList:
-			GetInstalledFileListL();
-			++iStep;
-			break;
-
-		case EUnregisterAndDeleteFile:
-			if (UnregisterAndDeleteFileL())
-				{
-				++iStep;
-				}
-			break;
-
-		case ERegisterComponent:
-			RegisterComponentL();
-			++iStep;
-			break;
-
-		case ECopyFile:
-			if (CopyFileL())
-				{
-				++iStep;
-				}
-			break;
-
-		case ESetScomoState:
-			iStep = SetScomoStateL();
-			break;
-
-		case ECommit:
-			CommitL();
-			done = ETrue;
-			break;
-
-		default:
-			User::Leave(KErrGeneral);
-		}
-
-	if (!iSifRequestInProgress)
-		{
-		TRequestStatus* status(RequestStatus());
-		User::RequestComplete(status, KErrNone);
-		}
-	
-	DEBUG_PRINTF3(_L8("Exiting from CSifRefInstallTask::ExecuteImplL(), done = %d, iStep = %d"), done, iStep);
-	
-	return done;
-	}
-
-namespace
-	{
-	TInt AuxNodeSorter(const SifRefBinPkgExtractor::CAuxNode& aLeft, const SifRefBinPkgExtractor::CAuxNode& aRight)
-		{
-		const TBool l = aLeft.Foreign();
-		const TBool r = aRight.Foreign();
-		if (l == r)
-			{
-			return 0;
-			}
-		else if (!l && r)
-			{
-			return 1;
-			}
-		else
-			{
-			return -1;
-			}
-		}
-	}
-
-void CSifRefInstallTask::ExtractEmbeddedPkgsL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::ExtractEmbeddedPkgsL()"));
-	
-	// Start an STS transaction
-	iSts.CreateTransactionL();
-
-	if (FileName())
-		{
-		SifRefBinPkgExtractor::BuildPkgTreeL(iSts, *FileName(), KRefInstPrivateDir, iEmbeddedComponents);
-		}
-	else if (FileHandle())
-		{
-		SifRefBinPkgExtractor::BuildPkgTreeL(iSts, *FileHandle(), KRefInstPrivateDir, iEmbeddedComponents);
-		}
-	else
-		{
-		ASSERT(0);
-		}
-	
-	// Sort the list of the embedded components in order to install foreign packages first
-	 const TLinearOrder<SifRefBinPkgExtractor::CAuxNode> sortOrder(AuxNodeSorter);
-	iEmbeddedComponents.Sort(sortOrder);
-	}
-
-TInt CSifRefInstallTask::ParsePkgFileL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::ParsePkgFileL()"));
-	
-	TInt nextStep = -1;
-	TRAPD(err, nextStep = ParsePkgFileImplL());
-	if (err != KErrNone)
-		{
-		if (iUiHandler)
-			{
-			iUiHandler->ErrorDescriptionUIHandler(InstallHelper::KUiParserErrorDesc);
-			}
-		User::Leave(err);
-		}
-	
-	return nextStep;
-	}
-
-TInt CSifRefInstallTask::ParsePkgFileImplL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::ParsePkgFileImplL()"));
-	
-	delete iParser;
-	iParser = NULL;
-
-	// Check if the next component is of the type our installer supports. If yes, add it to the list of
-	// the components to be processed. If not, use the SIF API to install it.
-	const SifRefBinPkgExtractor::CAuxNode& node = *iEmbeddedComponents[iCurrentComponent];
-	if (node.Foreign())
-		{
-		return ELaunchForeignInstall;
-		}
-	else
-		{
-		iParser = CSifRefPkgParser::NewL(node.FileNameL());
-		return EFindAndCheckComponent;
-		}
-	}
-
-void CSifRefInstallTask::LaunchForeignInstallL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::LaunchForeignInstallL()"));
-	
-	const SifRefBinPkgExtractor::CAuxNode& node = *iEmbeddedComponents[iCurrentComponent];
-	
-	// Connect to the SIF server
-	User::LeaveIfError(iSif.Connect());
-
-	// Our installer keeps temporary files under its private folder and therefore we have to
-	// pass a file handle to the SIF API.
-	User::LeaveIfError(iFs.Connect());
-	iFs.ShareProtected();
-	User::LeaveIfError(iFile.Open(iFs, node.FileNameL(), EFileShareReadersOnly));
-
-	// Submit a SIF request 
-	iOpaqueArguments = COpaqueNamedParams::NewL();
-	iOpaqueResults = COpaqueNamedParams::NewL();
-	iSif.Install(iFile, *iOpaqueArguments, *iOpaqueResults, *RequestStatus(), EFalse);
-
-	iSifRequestInProgress = ETrue;
-	}
-
-void CSifRefInstallTask::FinishForeignInstallL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::FinishForeignInstallL()"));
-	
-	iSif.Close();
-	iFile.Close();
-	iFs.Close();
-	delete iOpaqueArguments;
-	iOpaqueArguments = NULL;
-	delete iOpaqueResults;
-	iOpaqueResults = NULL;
-	
-	// Check the result of the concurrent installation
-	iSifRequestInProgress = EFalse;
-	User::LeaveIfError(RequestStatus()->Int());
-	
-	// There must be at least one component left because we install foreign components first
-	++iCurrentComponent;
-	}
-
-TInt CSifRefInstallTask::FindAndCheckComponentL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::FindAndCheckComponentL()"));
-	
-	// Connect to the SCR and create a new transaction to continue the installation of our own type
-	if (!iScrTransaction)
-		{
-		User::LeaveIfError(iScr.Connect());
-		iScr.CreateTransactionL();
-		iScrTransaction = ETrue;
-		}
-	
-	// Exit code
-	TInt nextStep = ERegisterComponent;
-	
-	// Check if already installed
-	InstallHelper::FindComponentL(iScr, iCompSearchData, *iParser);
-	switch (iCompSearchData.iInstallStatus)
-		{
-		case ENewComponent:
-			// nextStep already set to ERegisterComponent
-			break;
-
-		case EUpgrade:
-			// Uninstall the previous version
-			nextStep = EGetInstalledFileList;
-			break;
-
-		case EAlreadyInstalled:
-			User::Leave(KErrSifSameVersionAlreadyInstalled);
-			break;
-
-		case ENewerVersionAlreadyInstalled:
-			User::Leave(KErrSifNewerVersionAlreadyInstalled);
-			break;
-
-		default:
-			ASSERT(0);
-		}
-
-	// Ask the user for the confirmation
-	if (iUiHandler != NULL)
-		{
-		userConfirmationL(iCompSearchData.iInstallStatus == ENewComponent ? InstallHelper::EConfirmationInstall : InstallHelper::EConfirmationUpgrade, *iUiHandler, *iCompSearchData.iName, *iCompSearchData.iVendor);
-		}
-
-	return nextStep;
-	}
-
-void CSifRefInstallTask::GetInstalledFileListL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::GetInstalledFileListL()"));
-	
-	// Get a list of files to be deleted
-	iFileList.OpenListL(iScr, iCompSearchData.iComponentId);
-	}
-
-TBool CSifRefInstallTask::UnregisterAndDeleteFileL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::UnregisterAndDeleteFileL()"));
-	
-	return InstallHelper::UnregisterAndDeleteFileL(iScr, iFileList, iSts, iCompSearchData.iComponentId);
-	}
-
-void CSifRefInstallTask::RegisterComponentL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::RegisterComponentL()"));
-	
-	// Register a new component in the SCR
-	RCPointerArray<CLocalizableComponentInfo> componentInfoArray;
-	CleanupClosePushL(componentInfoArray);
-
-	// ...for each language
-	const RLanguageArray& languages = iParser->Languages();
-	const TInt langCount = languages.Count();
-	for (TInt i=0; i<langCount; ++i)
-		{
-		const TDesC& locName = *iParser->ComponentNames()[i];
-		const TDesC& locVendor = *iParser->VendorNames()[i];
-		CLocalizableComponentInfo* componentInfo = CLocalizableComponentInfo::NewLC(locName, locVendor, languages[i]);
-		componentInfoArray.AppendL(componentInfo);
-		CleanupStack::Pop(componentInfo);
-		}
-	iCompSearchData.iComponentId = iScr.AddComponentL(componentInfoArray, InstallHelper::KSifReferenceSoftwareType);
-
-	// Set the version of a new component
-	iScr.SetComponentVersionL(iCompSearchData.iComponentId, iCompSearchData.iVersion);
-
-	CleanupStack::PopAndDestroy(&componentInfoArray);
-
-	iCopyFileIndex = 0;
-	iComponentSize = 0;
-	
-	// Send the id if the installed component to the client. If this is a compound package we send the id of the root component only.
-	if (iEmbeddedComponents[iCurrentComponent]->Root())
-		{
-		CustomResults()->AddIntL(KSifOutParam_ComponentId, iCompSearchData.iComponentId);
-		}
-	}
-
-namespace
-	{
-	TBool CheckPathExistenceL(const TDesC& filePath)
-		{
-		TBool exists = EFalse;
-
-		RFs fs;
-		User::LeaveIfError(fs.Connect());
-		CleanupClosePushL(fs);
-		TEntry entry;
-		TInt error = fs.Entry(filePath, entry);
-		if (error == KErrNone)
-			{
-			exists = ETrue;
-			}
-		else if (error != KErrPathNotFound && error != KErrNotFound)
-			{
-			User::Leave(error);
-			}
-		
-		CleanupStack::PopAndDestroy(&fs);
-		
-		return exists;
-		}
-	}
-
-TBool CSifRefInstallTask::CopyFileL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::CopyFileL()"));
-	
-	// List of files to be copied from a package file 
-	const RCHBufCArray& files = iParser->Files();
-
-	// Register and copy a file if any left
-	if (iCopyFileIndex < files.Count())
-		{
-		// The name of the current file
-		const TDesC& filePath = *files[iCopyFileIndex];
-
-		// Check if filePath already exists
-		if (CheckPathExistenceL(filePath))
-			{
-			// Add a custom result describing the error
-			HBufC* desc = HBufC::NewLC(InstallHelper::KErrFileAlreadyExists.iTypeLength + filePath.Length());
-			TPtr bufDesc = desc->Des();
-			bufDesc.Copy(InstallHelper::KErrFileAlreadyExists);
-			bufDesc.Copy(filePath);
-			CustomResults()->AddStringL(InstallHelper::KParamNameErrDesc, *desc);
-			CleanupStack::PopAndDestroy(desc);
-			}
-
-		// Register the file in the SCR
-		iScr.RegisterComponentFileL(iCompSearchData.iComponentId, filePath);
-
-		// Copy the current file
-		RFile file;
-		iSts.CreateNewL(filePath, file, TFileMode(EFileShareExclusive |EFileWrite));
-		_LIT8(KReferenceFootprint, "This file belongs to the SIF reference component.\n");
-		const TInt numLines = 100; // The operation must take a while to simulate real copying
-		for (TInt i=0; i<numLines; ++i)
-			{
-			User::LeaveIfError(file.Write(KReferenceFootprint));
-			}
-		iComponentSize += KReferenceFootprint.iTypeLength*numLines;
-		file.Close();
-
-		++iCopyFileIndex;
-		}
-	else
-		{
-		// Set the size of the component in the SCR
-		iScr.SetComponentSizeL(iCompSearchData.iComponentId, iComponentSize);
-
-		// Step complete, all the files have been copied
-		return ETrue;
-		}
-
-	// Step not complete, there are still files left
-	
-	DEBUG_PRINTF(_L8("Exiting from CSifRefInstallTask::CopyFileL()"));
-	
-	return EFalse;
-	}
-
-TInt CSifRefInstallTask::SetScomoStateL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::SetScomoStateL()"));
-	
-	// Activate the newly added component
-	TInt inactive = EFalse;
-	if (!CustomArguments()->GetIntByNameL(_L("InstallInactive"), inactive) || !inactive)
-		{
-		iScr.SetScomoStateL(iCompSearchData.iComponentId, EActivated);
-		}
-	
-	// Check if there are any components to be installed left
-	return (++iCurrentComponent < iEmbeddedComponents.Count()) ? EParsePkgFile : ECommit;
-	}
-
-void CSifRefInstallTask::CommitL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefInstallTask::CommitL()"));
-	
-	// Commit the STS & SCR transactions
-	iSts.CommitL();
-	iScr.CommitTransactionL();
-	}
-
-// =============================================================================================================
-
-CSifRefUninstallTask* CSifRefUninstallTask::NewL(TTransportTaskParams& aParams, TInstallerUIHandlerFactory aUiHandlerFactory)
-	{
-	DEBUG_PRINTF(_L8("CSifRefUninstallTask::NewL()"));
-	
-	CSifRefUninstallTask* self = new (ELeave) CSifRefUninstallTask(aParams);
-	CleanupStack::PushL(self);
-	self->ConstructL(aUiHandlerFactory);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CSifRefUninstallTask::CSifRefUninstallTask(TTransportTaskParams& aParams)
-: CSifTransportTask(aParams), iStep(EGetFileList)
-	{
-	}
-
-void CSifRefUninstallTask::ConstructL(TInstallerUIHandlerFactory aUiHandlerFactory)
-	{
-	if (ComponentId() == NULL || CustomArguments() == NULL || CustomResults() == NULL)
-		{
-		User::Leave(KErrArgument);
-		}
-
-	iUiHandler = InstallHelper::CreateUiHandlerL(CustomArguments(), aUiHandlerFactory);
-	}
-
-CSifRefUninstallTask::~CSifRefUninstallTask()
-	{
-	DEBUG_PRINTF(_L8("CSifRefUninstallTask::~CSifRefUninstallTask()"));
-	
-	// Make sure to close sub-session before the session
-	iFileList.Close();	
-	iScr.Close();
-	iSts.Close();
-	delete iUiHandler;
-	}
-
-TBool CSifRefUninstallTask::ExecuteImplL()
-	{
-	DEBUG_PRINTF2(_L8("CSifRefInstallTask::ExecuteImplL(), iStep = %d"), iStep);
-	
-	switch (iStep)
-		{
-		case EGetFileList:
-			GetFileListL();
-			break;
-
-		case EUnregisterAndDeleteFile:
-			if (!UnregisterAndDeleteFileL())
-				{
-				return EFalse;
-				}
-			break;
-
-		case ECommit:
-			CommitL();
-			return ETrue;
-
-		default:
-			User::Leave(KErrGeneral);
-		}
-
-	++iStep;
-
-	DEBUG_PRINTF2(_L8("Exiting from CSifRefInstallTask::ExecuteImplL(), iStep = %d"), iStep);
-	
-	return EFalse;
-	}
-
-void CSifRefUninstallTask::GetFileListL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefUninstallTask::GetFileListL()"));
-	
-	// Connect to the SCR and start a transaction
-	User::LeaveIfError(iScr.Connect());
-	iScr.CreateTransactionL();
-
-	// Ask the user for confirmation
-	if (iUiHandler != NULL)
-		{
-		CComponentEntry* entry = CComponentEntry::NewLC();
-		if (!iScr.GetComponentL(ComponentId(), *entry))
-			{
-			User::Leave(KErrNotFound);
-			}
-		userConfirmationL(InstallHelper::EConfirmationUninstall, *iUiHandler, entry->Name(), entry->Vendor());
-		CleanupStack::PopAndDestroy(entry);
-		}
-
-	// Get a list of files to be deleted
-	iFileList.OpenListL(iScr, ComponentId());
-
-	// Start an STS transaction
-	iSts.CreateTransactionL();
-	}
-
-TBool CSifRefUninstallTask::UnregisterAndDeleteFileL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefUninstallTask::UnregisterAndDeleteFileL()"));
-	
-	return InstallHelper::UnregisterAndDeleteFileL(iScr, iFileList, iSts, ComponentId());
-	}
-
-void CSifRefUninstallTask::CommitL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefUninstallTask::CommitL()"));
-	
-	// Commit the STS & SCR transactions
-	iSts.CommitL();
-	iScr.CommitTransactionL();
-	}
-
-// =============================================================================================================
-
-CSifRefActivateDeactivateTask::CSifRefActivateDeactivateTask(TTransportTaskParams& aParams, TScomoState aScomoState)
-: CSifTransportTask(aParams), iScomoState(aScomoState)
-	{
-	DEBUG_PRINTF(_L8("CSifRefActivateDeactivateTask::CSifRefActivateDeactivateTask()"));
-	}
-
-CSifRefActivateDeactivateTask::~CSifRefActivateDeactivateTask()
-	{
-	DEBUG_PRINTF(_L8("CSifRefActivateDeactivateTask::~CSifRefActivateDeactivateTask()"));
-	
-	iScr.Close();
-	}
-
-TBool CSifRefActivateDeactivateTask::ExecuteImplL()
-	{
-	DEBUG_PRINTF(_L8("CSifRefActivateDeactivateTask::ExecuteImplL()"));
-	
-	if (ComponentId() == NULL)
-		{
-		User::Leave(KErrArgument);
-		}
-
-	// Connect to SCR and activate/deactivate component
-	User::LeaveIfError(iScr.Connect());
-	iScr.SetScomoStateL(ComponentId(), iScomoState);
-
-	return ETrue;
-	}