installationservices/swi/source/plan/application.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/plan/application.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,509 @@
+/*
+* 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: 
+* Definition of the CApplication
+*
+*/
+
+
+/**
+ @file 
+*/
+
+#include "application.h"
+#include "userselections.h"
+#include "sisregistryfiledescription.h"
+#include "siscontroller.h"
+#include "sisregistrypackage.h"
+#include "hashcontainer.h"
+#include "secutils.h"
+#include "securityinfo.h"
+
+using namespace Swi;
+
+
+EXPORT_C CApplication* CApplication::NewL()
+	{
+	CApplication* self=NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+EXPORT_C CApplication* CApplication::NewLC()
+	{
+	CApplication* self = new (ELeave) CApplication();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// CApplication
+
+CApplication::CApplication() 
+	: iShutdown(EFalse),
+	  iCanPropagate(ETrue),
+	  iPropagateDrive('!'),
+	  iDeletablePreinstalled(EFalse)
+	{
+	}
+
+CApplication::~CApplication()
+	{
+	// do not destroy, these are only pointers, there are not owned by this class
+	iProperties.Reset();
+
+	// owned by this class
+	iFilesToAdd.ResetAndDestroy();
+	iFilesToDisplayOnInstall.ResetAndDestroy();
+	iFilesToRunOnInstall.ResetAndDestroy();
+	iFilesToRemove.ResetAndDestroy();
+	iFilesToDisplayOnUninstall.ResetAndDestroy();
+	iFilesToRunOnUninstall.ResetAndDestroy();
+	iFilesToSkipOnInstall.ResetAndDestroy();
+	
+	iEmbeddedApplications.ResetAndDestroy();
+	iDeviceSupportedLanguages.Close();
+	iMatchingDeviceLanguages.Close();
+	delete iUserSelections;
+	delete iUid;
+	delete iPackage;
+	}
+
+
+void CApplication::ConstructL()
+	{
+	iUserSelections = CUserSelections::NewL();
+	}
+
+
+EXPORT_C void CApplication::AddSisStubFileL(const CSisRegistryFileDescription& aFileDescription)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription);
+	User::LeaveIfError(iFilesToAdd.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C void CApplication::AddFileL(const Sis::CFileDescription& aFileDescription, TChar aDrive)
+	{
+	aDrive.Fold();
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription, aDrive, iIsStub);
+	User::LeaveIfError(iFilesToAdd.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	
+	// Update the propagation status
+	
+	if (iCanPropagate)
+		{
+		TChar drive = fileDescription->Target()[0];
+		drive.Fold();
+		if (iPropagateDrive != '!')
+			{
+			// This is not the first file description, check the drive letter against the first
+			iCanPropagate = (iPropagateDrive == drive);
+			}
+		else
+			{
+			// This is the first file description, just update the drive
+			iPropagateDrive = (drive == '!' ? aDrive : drive);
+			}
+		}
+	
+	}
+
+EXPORT_C void CApplication::RemoveFileL(const CSisRegistryFileDescription& aFileDescription)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription);
+	User::LeaveIfError(iFilesToRemove.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C void CApplication::RemoveFileL(const TDesC& aFileName)
+	{
+	// Create dummy CSisRegistryFileDescription for a file to be removed based
+	// solely on the file name.
+
+	CHashContainer* hashContainer = CHashContainer::NewLC(CMessageDigest::ESHA1, KNullDesC8);
+
+	Sis::TSISFileOperationOptions options = static_cast<Sis::TSISFileOperationOptions>(0);
+
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	
+	// If the file is an EXE get the SID otherwise use KNullUid
+	TUid sid(KNullUid);
+	if (SecUtils::IsExeL(aFileName))
+		{
+		TSecurityInfo info;
+		SecurityInfo::RetrieveExecutableSecurityInfoL(fs, aFileName, info);
+		sid.iUid = info.iSecureId.iId;
+		}
+	
+	// get the file length, this is used later for the progress bar	
+	TEntry entry;
+	User::LeaveIfError(fs.Entry( aFileName, entry ));	
+	TInt64 length = entry.iSize;
+		
+	CSisRegistryFileDescription* fileDescription = 
+		CSisRegistryFileDescription::NewL(*hashContainer,
+											aFileName,
+											KNullDesC,
+											Sis::EOpNull,
+											options,
+											length,
+											0,
+											sid);
+	CleanupStack::PushL(fileDescription);
+	User::LeaveIfError(iFilesToRemove.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	CleanupStack::PopAndDestroy(2);  		// fs, hashContainer
+	}
+
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToAdd() const
+	{
+	return iFilesToAdd;
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToRemove() const
+	{
+	return iFilesToRemove;
+	}
+
+EXPORT_C void CApplication::RunFileOnInstallL(const Sis::CFileDescription& aFileDescription, TChar aDrive)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription, aDrive, iIsStub);
+	User::LeaveIfError(iFilesToRunOnInstall.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C void CApplication::RunFileOnUninstallL(const CSisRegistryFileDescription& aFileDescription)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription);
+	User::LeaveIfError(iFilesToRunOnUninstall.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToRunOnInstall() const
+	{
+	return iFilesToRunOnInstall;
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToRunOnUninstall() const
+	{
+	return iFilesToRunOnUninstall;
+	}
+
+EXPORT_C void CApplication::DisplayFileOnInstallL(const Sis::CFileDescription& aFileDescription, TChar aDrive)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription, aDrive, iIsStub);
+	User::LeaveIfError(iFilesToDisplayOnInstall.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C void CApplication::DisplayFileOnUninstallL(const CSisRegistryFileDescription& aFileDescription)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription);
+	User::LeaveIfError(iFilesToDisplayOnUninstall.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToDisplayOnInstall() const
+	{
+	return iFilesToDisplayOnInstall;
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToDisplayOnUninstall() const
+	{
+	return iFilesToDisplayOnUninstall;
+	}
+
+EXPORT_C TBool CApplication::IsUpgrade() const
+	{
+	return iFlags & EUpgrade;
+	}
+
+EXPORT_C void CApplication::SetUpgrade(const Sis::CController& aController)
+	{
+	iFlags |= EUpgrade;
+	SetController(aController);
+	}
+
+EXPORT_C TBool CApplication::IsInstall() const
+	{
+	return iFlags & EInstall;
+	}
+
+EXPORT_C void CApplication::SetInstall(const Sis::CController& aController)
+	{
+	iFlags |= EInstall;
+	SetController(aController);
+	}
+
+EXPORT_C TBool CApplication::IsUninstall() const
+	{
+	return iFlags & EUninstall;
+	}
+
+EXPORT_C void CApplication::SetUninstallL(const CSisRegistryPackage& aPackage)
+	{
+	iFlags |= EUninstall;
+	SetPackageL(aPackage);
+	}
+
+EXPORT_C TBool CApplication::IsAugmentation() const
+	{
+	return iFlags & EAugmentation;
+	}
+
+EXPORT_C void CApplication::SetAugmentation(const Sis::CController& aController)
+	{
+	iFlags |= EAugmentation;
+	SetController(aController);
+	}
+
+EXPORT_C TBool CApplication::IsPartialUpgrade() const
+	{
+	return iFlags & EPartialUpgrade;
+	}
+
+EXPORT_C void CApplication::SetPartialUpgrade(const Sis::CController& aController)
+	{
+	iFlags |= EPartialUpgrade;
+	SetController(aController);
+	}
+	
+EXPORT_C TBool CApplication::IsPreInstalledPatch() const
+	{
+	return iFlags & EPreInstalledPatch;
+	}
+
+EXPORT_C void CApplication::SetPreInstalledPatch(const Sis::CController& aController)
+	{
+	iFlags |= EPreInstalledPatch;
+	SetController(aController);
+	}
+
+EXPORT_C void CApplication::SetPreInstalledPatch()
+ 	{
+ 	iFlags |= EPreInstalledPatch;
+ 	}
+
+EXPORT_C TBool CApplication::IsPreInstalledApp() const
+	{
+	return iFlags & EPreInstalledApp;
+	}
+
+EXPORT_C void CApplication::SetPreInstalledApp(const Sis::CController& aController)
+	{
+	iFlags |= EPreInstalledApp;
+	SetController(aController);
+	}
+
+EXPORT_C void CApplication::SetPreInstalledApp()
+ 	{
+ 	iFlags |= EPreInstalledApp;
+ 	}
+
+EXPORT_C TBool CApplication::IsInROM(void) const
+	{
+	return iFlags & EInRom;
+	}
+
+EXPORT_C void CApplication::SetInROM(void)
+	{
+	iFlags |= EInRom;
+	}
+	
+EXPORT_C void CApplication::AddPropertyL(const TProperty& aProperty)
+	{
+	User::LeaveIfError(iProperties.Append(aProperty));
+	}
+
+EXPORT_C const RArray<CApplication::TProperty>& CApplication::Properties() const
+	{
+	return iProperties;
+	}
+
+EXPORT_C const CSisRegistryPackage& CApplication::PackageL() const
+	{
+	if (!iPackage)
+		{
+		User::Leave(KErrGeneral);
+		}
+	return *iPackage;
+	}
+
+EXPORT_C void CApplication::SetPackageL(const CSisRegistryPackage& aPackage)
+	{
+	delete iPackage;
+	iPackage=0;
+	iPackage=CSisRegistryPackage::NewL(aPackage);
+	}
+
+EXPORT_C const Sis::CController& CApplication::ControllerL(void) const
+	{
+	if (!iController)
+		{
+		User::Leave(KErrGeneral);
+		}
+	return (*iController);
+	}
+
+EXPORT_C void CApplication::SetController(TUid aUid)
+	{
+	delete iUid;
+	iUid=new(ELeave) TUid(aUid);
+	}   
+	
+
+EXPORT_C void CApplication::SetController(const Sis::CController& aController)
+	{
+	iController=&aController;
+	}
+
+
+EXPORT_C const RPointerArray<CApplication>& CApplication::EmbeddedApplications() const
+	{
+	return iEmbeddedApplications;
+	}
+
+EXPORT_C void CApplication::AddEmbeddedApplicationL(CApplication* aApplication)
+	{
+	User::LeaveIfError(iEmbeddedApplications.Append(aApplication));
+	}
+	
+EXPORT_C TBool CApplication::CanPropagate() const
+	{
+	return iCanPropagate && (iPropagateDrive != '!');
+	}
+	
+EXPORT_C TChar CApplication::StubDrive() const
+	{
+	return iPropagateDrive;
+	}
+	
+EXPORT_C void CApplication::CopyDeviceSupportedLanguagesL(const RArray<TInt> &aDeviceSupportedLanguages)
+	{
+	TInt size = aDeviceSupportedLanguages.Count();
+	while (size--)
+		User::LeaveIfError(iDeviceSupportedLanguages.Append(aDeviceSupportedLanguages[size]));
+	}
+
+EXPORT_C void CApplication::PopulateMatchingDeviceLanguagesL(TInt aLanguageId)
+	{
+	TRAPD(error,iMatchingDeviceLanguages.InsertInOrderL(aLanguageId))
+	if ( error != KErrNone && error != KErrAlreadyExists)
+		{
+		User::Leave(error);
+		}
+	}
+
+EXPORT_C const RArray<TInt>& CApplication::GetMatchingDeviceLanguages(void)
+	{
+	return iMatchingDeviceLanguages;
+	}
+
+EXPORT_C TBool CApplication::IsDeviceMatchingLanguage(TInt aLangId)const
+	{
+		TInt found = iDeviceSupportedLanguages.Find(aLangId);
+		if ( found == KErrNotFound )
+			{						
+			return EFalse;
+			}
+		
+		return ETrue;
+     }
+
+ EXPORT_C TBool CApplication::IsInstallSuCertBased() const
+	{
+	return iFlags & EInstallSuCertBased;	
+	}
+	
+EXPORT_C void CApplication::SetInstallSuCertBased()
+	{
+	iFlags |= EInstallSuCertBased;	
+	}
+
+EXPORT_C const RPointerArray<CSisRegistryFileDescription>& CApplication::FilesToSkipOnInstall() const
+	{
+	return iFilesToSkipOnInstall;
+	}
+	
+EXPORT_C void CApplication::SkipFileOnInstallL(const Sis::CFileDescription& aFileDescription, TChar aDrive)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription, aDrive, iIsStub);
+	User::LeaveIfError(iFilesToSkipOnInstall.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+	}
+
+EXPORT_C void CApplication::AddFileL(const CSisRegistryFileDescription& aFileDescription)
+	{
+	CSisRegistryFileDescription* fileDescription = CSisRegistryFileDescription::NewLC(aFileDescription);
+	User::LeaveIfError(iFilesToAdd.Append(fileDescription));
+	CleanupStack::Pop(fileDescription);
+		
+	// Update the propagation status
+	
+	if (iCanPropagate)
+		{
+		TChar drive = fileDescription->Target()[0];
+		drive.Fold();
+		if (iPropagateDrive != '!')
+			{
+			// This is not the first file description, check the drive letter against the first
+			iCanPropagate = (iPropagateDrive == drive);
+			}
+		else
+			{
+			// This is the first file description, just update the drive
+			iPropagateDrive = drive;
+			}
+		}
+		
+	}
+
+EXPORT_C void CApplication::SetSisHelper(const RSisHelper& aSisHelper)
+	{
+	iSisHelper = &aSisHelper;
+	}
+
+EXPORT_C RSisHelper& CApplication::GetSisHelper()
+	{
+	return (const_cast <RSisHelper&> (*iSisHelper));
+	}
+
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+EXPORT_C void CApplication::SetDrmProtected(TBool aIsDrmProtected)
+	{
+	iIsDrmProtected = aIsDrmProtected;
+	}
+#else
+EXPORT_C void CApplication::SetDrmProtected(TBool /*aIsDrmProtected*/)
+	{
+	__ASSERT_ALWAYS(EFalse, User::Invariant());
+	}
+#endif
+
+EXPORT_C TBool CApplication::IsDrmProtected() const
+	{
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	return iIsDrmProtected;
+#else
+	__ASSERT_ALWAYS(EFalse, User::Invariant());
+	return EFalse;
+#endif
+	}
+