diff -r 000000000000 -r ba25891c3a9e installationservices/swi/source/plan/application.cpp --- /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(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& CApplication::FilesToAdd() const + { + return iFilesToAdd; + } + +EXPORT_C const RPointerArray& 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& CApplication::FilesToRunOnInstall() const + { + return iFilesToRunOnInstall; + } + +EXPORT_C const RPointerArray& 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& CApplication::FilesToDisplayOnInstall() const + { + return iFilesToDisplayOnInstall; + } + +EXPORT_C const RPointerArray& 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::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::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 &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& 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& 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 (*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 + } +