secureswitools/swisistools/source/interpretsislib/sisregistryobject.cpp
changeset 0 ba25891c3a9e
child 12 7ca52d38f8c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/interpretsislib/sisregistryobject.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,842 @@
+/*
+* Copyright (c) 2006-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: 
+*
+*/
+
+
+#pragma warning (disable: 4786)
+#include "sisregistryobject.h"
+
+// System includes
+#include <openssl/sha.h>
+#include <iostream>
+
+// SisX Includes
+#include "sisdatetime.h"
+#include "sisstring.h"
+#include "sisfiledata.h"
+#include "sisproperties.h"
+#include "sisproperty.h"
+#include "sisdependency.h"
+#include "sisprerequisites.h"
+#include "sisinstallblock.h"
+#include "sisfiledescription.h"
+#include "sissupportedlanguages.h"
+#include "sislanguage.h"
+#include "siscapabilities.h"
+#include "sisversion.h"
+
+// User includes
+#include "symbiantypes.h"
+#include "is_utils.h"
+#include "deserialiser.h"
+#include "sisfile.h"
+#include "installablefile.h"
+#include "serialiser.h"
+#include "hashcontainer.h"
+#include "errors.h"
+#include "rommanager.h"
+#include "stringutils.h"
+
+// Type definitions
+typedef int TInt;
+typedef bool TBool;
+
+
+
+// from swi/sispackaGetrust.h
+const TUint32 SisRegistryObject::KSisPackageCertificateChainValidatedToTrustAnchor = 200;
+const TUint32 SisRegistryObject::KSisPackageBuiltIntoRom = 500;
+
+const TInt KExecutableImageUidValue=0x1000007a;
+
+const TUint32 KDriveZ = 1 << 25;
+const TUint32 KDriveC = 1 << 2;
+
+
+
+Deserialiser& operator>>(Deserialiser& aInput, std::vector<CSISString*>& val)
+    {
+    TUint32 size = 0;
+    aInput>> size;
+    val.resize(size);
+    for (TUint32 i = 0; i < size ; ++i)
+        {
+         std::wstring *tmpString = new std::wstring();
+         aInput >> *tmpString;
+         val[i] = new CSISString(*tmpString);
+         delete tmpString;
+        }
+    return aInput;
+    }
+
+Serialiser& operator<<(Serialiser& aOutput, std::vector<CSISString*>& val)
+    {
+    TUint32 size = val.size();
+    aOutput << size;
+    for (TUint32 i = 0; i < size ; ++i)
+        {
+        std::wstring tmpStr = val[i]->GetString();
+        aOutput << tmpStr;
+        }
+    return aOutput;
+    }
+
+
+
+SisRegistryObject::SisRegistryObject (ConfigManager& aConfigManager):iConfigManager(aConfigManager)
+	{
+	iVendorLocalizedName = new std::wstring();
+	iTrustStatus = new TrustStatus();
+	}
+
+
+SisRegistryObject::SisRegistryObject(const SisFile& aSis,
+									 const InstallableFiles& aFiles,
+									 const TInt aTargetDrive,
+									 const TUint16 aRegistryFileMajorVersion,
+									 const TUint16 aRegistryFileMinorVersion,
+									 const bool aSUFlag,
+									 ConfigManager& aConfigManager)
+	: SisRegistryToken(
+	  	aSis.GetIndex(),
+		aSis.GetVendorName(),
+		aSis.GetPackageName(),
+		aSis.GetPackageUid(),
+		aTargetDrive,
+		aSis.GetLanguage(),
+		aSis.GetVersion(),
+		aSis.GetControllerInfo(aRegistryFileMajorVersion,aRegistryFileMinorVersion),
+		KDriveC),
+	  iVendorLocalizedName(new std::wstring(aSis.GetVendorLocalName())),iConfigManager(aConfigManager)
+{
+	for( InstallableFiles::const_iterator curr = aFiles.begin(); curr != aFiles.end(); ++curr )
+	{	
+		InstallableFile* installableFile= *curr;		
+		FileDescription* f = new FileDescription(*installableFile->FileDescription() , installableFile->Sid(), aTargetDrive, installableFile->GetTarget());
+		iFileDescriptions.push_back(f);
+	}
+
+	iTrustStatus = new TrustStatus();
+	TUint64 x = 0;
+	iTrustStatus->SetLastCheckDate(x);
+	iTrustStatus->SetQuaratined((TUint32)0);
+	iTrustStatus->SetQuaratinedDate(x);
+	iTrustStatus->SetResultDate(x);
+	iTrustStatus->SetRevocationStatus(TrustStatus::KOcspNotPerformed);
+	iTrustStatus->SetValidationStatus(TrustStatus::KValidatedToAnchor);
+
+	const CSISProperties::SISPropertyArray& props =	aSis.GetProperties()->Properties();
+
+	for (int i = 0; i < props.size(); ++i)
+		{
+		SisRegistryProperty* p = new SisRegistryProperty(props[i]);
+		iProperties.push_back(p);
+		}
+
+	const const CSISArray<CSISDependency, CSISFieldRoot::ESISDependency>& deps =
+		aSis.GetDependencies()->DependencyList();
+
+	for(i = 0; i < deps.size(); ++i)
+		{
+			SisRegistryDependency* p = new SisRegistryDependency(deps[i]);
+			iDependencies.push_back(p);
+		}
+
+	iFileMajorVersion = aRegistryFileMajorVersion;
+	iFileMinorVersion = aRegistryFileMinorVersion;
+
+	iInstallType = aSis.GetInstallType();
+	iInRom = false;
+	if (iInstallType == CSISInfo::EInstPreInstalledApp)
+		{
+		iDeletablePreInstalled = true;
+		}
+	else
+		{
+		iDeletablePreInstalled = false;
+		}
+	iSigned	= aSis.GetSigned();
+	iTrust = KSisPackageCertificateChainValidatedToTrustAnchor;
+	iRemoveWithLastDependent = 0;
+	iTrustTimeStamp = 0;
+	iInstallChainIndices = aSis.GetAllInstallChainIndices();
+	if(iFileMajorVersion == 4)
+		iIsRemovable = true;
+	else
+		iIsRemovable = !(aSis.GetInstallFlags() & CSISInfo::EInstFlagNonRemovable);
+	
+	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK	
+	iIsHidden = !(!(aSis.GetInstallFlags() & CSISInfo::EInstFlagHide));
+	#endif
+
+	Sids sids;
+	GetSidsFromInstallable(aFiles, sids);
+	TUint32 drives = 0;
+	if (!iFileDescriptions.empty())
+		drives = 1 << (aTargetDrive - 'A');
+
+	SetSids(sids);
+	SetDrives(drives);
+
+	iSignedBySuCert = aSUFlag;
+
+	// Set Localized Package Names and Vendor Names
+	std::vector<int> matchingDeviceLanguagesArray = iConfigManager.GetMatchingSupportedLanguages();
+	TInt matchingLanguageCount = matchingDeviceLanguagesArray.size();
+	
+	for (TInt i=0; i < matchingLanguageCount; i++)
+		{
+		TInt languageId = matchingDeviceLanguagesArray.at(i);
+		CSISController sisController = aSis.GetController();
+		TInt supportedLanguageCount = sisController.LanguageCount();
+	
+		for ( TInt j=0; j < supportedLanguageCount; j++ )
+			{
+			if ( sisController.Language(j) == languageId)
+				{
+				iSupportedLanguageIds.push_back(languageId);
+				iLocalizedVendorNames.push_back(new CSISString(sisController.SISInfo().VendorName(j)));
+				iLocalizedPackageNames.push_back(new CSISString(sisController.SISInfo().PackageName(j)));
+				break;
+				}
+			}
+		}
+}
+
+SisRegistryObject::SisRegistryObject(CSISController& aSisController,
+									 RomManager& aRomManager,
+									 const TUint16 aRegistryFileMajorVersion,
+									 const TUint16 aRegistryFileMinorVersion,
+									 ConfigManager& aConfigManager)
+	: SisRegistryToken(),
+	iFileMajorVersion(aRegistryFileMajorVersion),
+	iFileMinorVersion(aRegistryFileMinorVersion),
+	iInRom(true),
+	iDeletablePreInstalled(false),
+	iIsRemovable(false),
+	iConfigManager(aConfigManager)
+	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	,iIsHidden(false)
+	#endif
+{
+	//*** SisRegistryPackage ***//
+
+	// UID
+	const CSISInfo& info = aSisController.SISInfo();
+	TUint32 uid = info.UID1();
+	SetUid(uid);
+
+	// Vendor Name
+	std::wstring vendorName = aSisController.SISInfo().UniqueVendorName();
+   	SetVendorName(vendorName);
+
+	// Package Name
+	std::wstring packageName;
+	if (aSisController.SISInfo().PackageNameCount() > 0 )
+		{
+		packageName = aSisController.SISInfo().PackageName(0);
+		SetPackageName(packageName);
+		}
+	else
+		{
+		std::string error = "can not retrieve package name";
+		throw InvalidSis("", error, INVALID_SIS);
+		}
+
+	// Index
+	TInt dataIndex = aSisController.DataIndex();
+	SetIndex(dataIndex);
+
+	//*** SisRegistryToken ***//
+
+	// Language
+	TInt lang = aSisController.Language(0);
+	SetLanguage(lang);
+
+	// Version
+	const CSISVersion& sisVersion = aSisController.SISInfo().SISVersion();
+	Version version = Version(sisVersion.Major(), sisVersion.Minor(), sisVersion.Build());
+	SetVersion(version);
+
+	// Controller Info
+	ControllerInfo* ci = new ControllerInfo();
+	ci->CalculateAndSetHash(aSisController,aRegistryFileMajorVersion,aRegistryFileMinorVersion);
+	ci->SetVersion(version);
+	ci->SetOffset(0);
+
+	Controllers controllers;
+
+	controllers.push_back(ci);
+
+	// Embedded SIS controllers
+	TControllerMap embeddedCtls;
+	aSisController.InstallBlock().GetEmbeddedControllers(embeddedCtls, false);
+	for (TControllerMapConstIter iter = embeddedCtls.begin(); iter != embeddedCtls.end(); ++iter)	
+		{
+		const CSISController& ctrl = *iter->second;
+		ControllerInfo* ctlInfo = new ControllerInfo();
+
+		ctlInfo->SetVersion(version);
+		ctlInfo->CalculateAndSetHash(ctrl, aRegistryFileMajorVersion, aRegistryFileMinorVersion);
+		ctlInfo->SetOffset(0);
+
+		controllers.push_back(ctlInfo);
+		}
+
+	SetControllerInfo(controllers);
+
+	// Drives
+	SetDrives(KDriveZ);
+
+	// Selected Drive
+	int drive = 0;
+	SetSelectedDrive(drive);
+
+	//*** SisRegistryObject ***//
+	iInstallType = aSisController.SISInfo().InstallationType();
+
+	int signatureCount = aSisController.SignatureCount();
+	iSigned = (signatureCount == 0)? false:true;
+
+	TInt index = 0;
+	for(index = 0; index < signatureCount; ++index)
+		{
+		iInstallChainIndices.push_back(index);
+		}
+	iTrust = KSisPackageBuiltIntoRom;
+	iRemoveWithLastDependent = 0;
+
+	iTrustTimeStamp = 0;
+	iTrustStatus = new TrustStatus();
+	TUint64 x = 0;
+	iTrustStatus->SetLastCheckDate(x);			///< the last date a revocation check was
+												///< attempted
+	iTrustStatus->SetQuaratined((TUint32)0);	///< true if quarantined.
+												///< Not used currently
+	iTrustStatus->SetQuaratinedDate(x);			///< date entry was quarantined.
+												///< Not used currently
+	iTrustStatus->SetResultDate(x);				///< the last date a successful revocation
+												///< check was performed
+	iTrustStatus->SetRevocationStatus(TrustStatus::KOcspNotPerformed);
+	iTrustStatus->SetValidationStatus(TrustStatus::KPackageInRom);
+
+	// Properties
+	const CSISProperties::SISPropertyArray& props = aSisController.Properties().Properties();
+	for (int i = 0; i < props.size(); ++i)
+		{
+		SisRegistryProperty* p = new SisRegistryProperty(props[i]);
+			iProperties.push_back(p);
+		}
+
+	// File descriptions and SIDs
+	Sids aSids;
+	int fileCount = aSisController.InstallBlock().FileCount();
+	int value = fileCount;
+	for(i = 0; i < aSisController.InstallBlock().FileCount(); ++i)
+		{
+		TUint32 aSid = 0;
+		const CSISFileDescription& fileDesc =aSisController.InstallBlock().FileDescription(i);
+
+		std::wstring target = std::wstring(fileDesc.Target().GetString());
+
+			// if the target name contains wildchars, do not open to check SID, it is for eclipsing
+			if ((target.find(L"?") == std::wstring::npos) || (target.find(L"*") == std::wstring::npos))
+			{
+				std::wstring::size_type index = target.rfind(L".");
+
+				if (index != std::wstring::npos)
+				{
+					std::wstring extOfString = StringUtils::ToUpper(target.substr(index+1));
+
+					const bool fileExists = aRomManager.RomFileExists( target );
+					if  ( fileExists )
+					{
+						SBinarySecurityInfo info;
+						const TInt err = aRomManager.ReadSecurityInfo( info, target );
+
+						// SID is only applicable to an exe
+						if (!err && (extOfString == L"EXE"))
+						{
+							aSid = info.iSecureId;
+						}
+					}
+				}
+				
+				if(aSid)
+				{
+					aSids.push_back(aSid);
+				}
+			}
+
+			FileDescription* aFileDescription = new FileDescription(fileDesc, aSid, L'Z', fileDesc.Target().GetString());
+			iFileDescriptions.push_back(aFileDescription);
+		}
+		SetSids(aSids);
+
+	// Dependencies
+	const CSISPrerequisites::TDependencyList& deps = aSisController.Prerequisites().DependencyList();
+	for (i = 0; i < deps.size(); ++i)
+		{
+		SisRegistryDependency* p = new SisRegistryDependency(deps[i]);
+			iDependencies.push_back(p);
+		}
+
+	// Vendor Localized Name
+	if ( aSisController.SISInfo().VendorNameCount() > 0 )
+		{
+		iVendorLocalizedName = new std::wstring(aSisController.SISInfo().VendorName(0));
+		}
+	else
+	{
+		std::string x;
+		std::string error = "can not retrieve localized vendor name";
+		throw InvalidSis(Ucs2ToUtf8((std::wstring)packageName,x), error, INVALID_SIS);
+	}
+
+	// Signed by SU cert
+	iSignedBySuCert = false;
+	
+	// Set Localized Package Names and Vendor Names
+	std::vector<int> matchingDeviceLanguagesArray = iConfigManager.GetMatchingSupportedLanguages();
+	TInt matchingLanguageCount = matchingDeviceLanguagesArray.size();
+	
+	for (TInt i=0; i < matchingLanguageCount; i++)
+		{
+		TInt languageId = matchingDeviceLanguagesArray.at(i);
+		TInt supportedLanguageCount = aSisController.LanguageCount();
+	
+		for ( TInt j=0; j < supportedLanguageCount; j++ )
+			{
+			if ( aSisController.Language(j) == languageId)
+				{
+				iSupportedLanguageIds.push_back(languageId);
+				iLocalizedVendorNames.push_back(new CSISString(aSisController.SISInfo().VendorName(j)));
+				iLocalizedPackageNames.push_back(new CSISString(aSisController.SISInfo().PackageName(j)));
+				}
+			}
+		}	
+}
+
+SisRegistryObject::~SisRegistryObject ()
+	{
+
+	delete iTrustStatus;
+	TInt i;
+	for (i = 0 ; i < iFileDescriptions.size() ; ++i)
+		delete iFileDescriptions[i];
+	for (i = 0 ; i < iProperties.size() ; ++i)
+		delete iProperties[i];
+	for (i = 0 ; i < iEmbeddedPackages.size() ; ++i)
+		delete iEmbeddedPackages[i];
+	for (i = 0 ; i < iDependencies.size() ; ++i)
+		delete iDependencies[i];
+
+	for (i = 0 ; i < iLocalizedPackageNames.size() ; ++i)
+		delete iLocalizedPackageNames[i];
+	for (i = 0 ; i < iLocalizedVendorNames.size() ; ++i)
+		delete iLocalizedVendorNames[i];
+
+	iSupportedLanguageIds.clear();
+	delete iVendorLocalizedName;
+
+	}
+
+void SisRegistryObject::Internalize(Deserialiser& des)
+	{
+	SisRegistryToken::Internalize(des);
+
+	des >> iFileMajorVersion
+		>> iFileMinorVersion
+		>> *iVendorLocalizedName
+		>> iInstallType
+		>> iInRom
+		>> iDeletablePreInstalled
+		>> iSigned
+		>> iTrust
+		>> iRemoveWithLastDependent
+	    >> iTrustTimeStamp
+		>> iDependencies
+		>> iEmbeddedPackages
+		>> iProperties
+		>> iFileDescriptions
+		>> *iTrustStatus
+	    >> iInstallChainIndices;
+	if(iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion > 0))
+		des >> iIsRemovable;
+	else	
+		iIsRemovable = true;
+
+	if(iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion >= 3))
+		des >> iSignedBySuCert;
+	else
+		iSignedBySuCert = false;
+	if(iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion >= 4))
+		{
+		des >> iSupportedLanguageIds;
+		
+		des >> iLocalizedPackageNames;
+		
+		des >> iLocalizedVendorNames;
+
+		}
+	}
+
+void SisRegistryObject::Externalize(Serialiser& ser)
+	{
+	SisRegistryToken::Externalize(ser);
+	ser << iFileMajorVersion
+		<< iFileMinorVersion
+		<< *iVendorLocalizedName
+		<< iInstallType
+		<< iInRom
+		<< iDeletablePreInstalled
+		<< iSigned
+		<< iTrust
+		<< iRemoveWithLastDependent
+		<< iTrustTimeStamp
+		<< iDependencies
+		<< iEmbeddedPackages
+		<< iProperties
+		<< iFileDescriptions
+		<< *iTrustStatus
+		<< iInstallChainIndices;
+	if(iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion > 0))
+		ser << iIsRemovable;
+
+	if (iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion >= 3))
+		ser << iSignedBySuCert;
+	if (iFileMajorVersion > 5 || (iFileMajorVersion == 5 && iFileMinorVersion >= 4))
+		{
+		ser << iSupportedLanguageIds;
+		
+		ser << iLocalizedPackageNames;
+		
+		ser << iLocalizedVendorNames;
+
+		}
+	}
+
+
+FileDescription const * SisRegistryObject::GetFile(const std::wstring& aFile) const
+{
+ 	FileDescriptions::const_iterator end = iFileDescriptions.end();
+	for (FileDescriptions::const_iterator curr = iFileDescriptions.begin() ;
+		 curr != end; ++curr)
+		{
+			 if (  FoldedCompare((*curr)->GetTarget(), aFile) == 0)
+			 {
+				 return *curr;
+			 }
+		}
+	return 0;
+}
+
+FileDescription const * SisRegistryObject::GetFile(TUint32 aSid) const
+{
+	FileDescriptions::const_iterator end = iFileDescriptions.end();
+	for (FileDescriptions::const_iterator curr = iFileDescriptions.begin() ;
+		 curr != end; ++curr)
+		{
+			 if (  (*curr)->GetSid() == aSid)
+			 {
+				 return *curr;
+			 }
+		}
+	return 0;
+}
+
+
+std::wstring SisRegistryObject::GetRegistryDir( const std::wstring& aDrivePath ) const
+{
+    const TUint32 uid = GetUid();
+    std::wstring ret = StringUtils::MakePathFromSID( aDrivePath + L"/sys/install/sisregistry/", uid );
+	return ret;
+}
+
+int SisRegistryObject::NextSisRegistryIndex(const std::wstring& aDrivePath) const
+{
+    const TUint32 uid = GetUid();
+    std::wstring regPath = GetRegistryDir(aDrivePath);
+
+	for (int index = 0; index < 0xFFFFFFFF; index++)
+	{
+		std::wstring fileName = regPath + StringUtils::BuildSisRegistryFileName( index );
+
+		if ( !FileExists(fileName) )
+		{
+			// return the next available index
+			return index;
+		}
+	}
+
+	return 0;
+}
+
+int SisRegistryObject::NextSisControllerIndex(const std::wstring& aDrivePath) const
+{
+    const TUint32 uid = GetUid();
+    std::wstring regPath = GetRegistryDir(aDrivePath);
+
+	for (int index = 0; index < 0xFFFFFFFF; index++)
+	{
+		std::wstring fileName = regPath + StringUtils::BuildControllerFileName(GetIndex(), index);
+
+		if ( !FileExists(fileName) )
+		{
+			// return the next available index
+			return index;
+		}
+	}
+
+	return 0;
+}
+
+void SisRegistryObject::UpgradeEntry(const SisFile& aSis, const InstallableFiles& aFiles, TInt aInstallDrive, const bool aSUFlag, ConfigManager& aConfigManager)
+{
+	// Version
+	iVersion = aSis.GetVersion();
+	
+	// Controller Info. Update the controller info using the same SIS Registry version as the base package
+	StoreControllerInfo(aSis.GetControllerInfo(iFileMajorVersion,iFileMinorVersion));
+
+	iInstallType = aSis.GetInstallType();
+
+	iSelectedDrive = toupper(aInstallDrive);
+
+	// With interpretsis, SisFile is default to true
+	iSigned = aSis.GetSigned();
+
+	iSignedBySuCert = aSUFlag;
+
+	iTrust = KSisPackageCertificateChainValidatedToTrustAnchor;
+
+	iTrustTimeStamp = 0;
+
+	TUint64 x = 0;
+	iTrustStatus->SetLastCheckDate(x);
+	iTrustStatus->SetQuaratined((TUint32)0);
+	iTrustStatus->SetQuaratinedDate(x);
+	iTrustStatus->SetResultDate(x);
+	iTrustStatus->SetRevocationStatus(TrustStatus::KOcspNotPerformed);
+	iTrustStatus->SetValidationStatus(TrustStatus::KValidatedToAnchor);
+
+	iRemoveWithLastDependent = 0;
+
+	std::vector<TInt> indices = aSis.GetAllInstallChainIndices();
+
+ 	std::vector<TInt>::const_iterator end = indices.end();
+	int size = indices.size();
+	for (std::vector<TInt>::const_iterator curr = indices.begin() ;
+		 curr != end; ++curr)
+		{
+		int w = *curr;
+		iInstallChainIndices.push_back(*curr);
+		}
+
+	// Properties
+	TInt i = 0;
+	for (i = 0 ; i < iProperties.size() ; ++i)
+		delete iProperties[i];
+
+	const CSISProperties::SISPropertyArray& props = aSis.GetProperties()->Properties();
+
+	for(i = 0; i < props.size(); ++i)
+		{
+		SisRegistryProperty* p = new SisRegistryProperty(props[i]);
+		iProperties.push_back(p);
+		}
+
+	// Dependencies
+	for (i = 0 ; i < iDependencies.size() ; ++i)
+		delete iDependencies[i];
+
+	const CSISPrerequisites::TDependencyList& deps = aSis.GetDependencies()->DependencyList();
+
+	for(i = 0; i < deps.size(); ++i)
+		{
+		SisRegistryDependency* p = new SisRegistryDependency(deps[i]);
+		iDependencies.push_back(p);
+		}
+
+	RemoveFiles(aFiles);
+	AddFiles(aFiles);
+	UpdateDrives();
+	
+	// Set Localized Package Names and Vendor Names
+	std::vector<int> matchingDeviceLanguagesArray = iConfigManager.GetMatchingSupportedLanguages();
+	TInt matchingLanguageCount = matchingDeviceLanguagesArray.size();
+	
+	for (TInt i=0; i < matchingLanguageCount; i++)
+		{
+		TInt languageId = matchingDeviceLanguagesArray.at(i);
+		CSISController sisController = aSis.GetController();
+		TInt supportedLanguageCount = sisController.LanguageCount();
+	
+		for ( TInt j=0; j < supportedLanguageCount; j++ )
+			{
+			if ( sisController.Language(j) == languageId)
+				{
+				iSupportedLanguageIds.push_back(languageId);
+				iLocalizedVendorNames.push_back(new CSISString(sisController.SISInfo().VendorName(j)));
+				iLocalizedPackageNames.push_back(new CSISString(sisController.SISInfo().PackageName(j)));
+				break;
+				}
+			}
+		}
+
+}
+
+void SisRegistryObject::UpdateDrives()
+{
+	TUint32 drives = 0;
+ 	FileDescriptions::const_iterator end = iFileDescriptions.end();
+	for (FileDescriptions::const_iterator curr = iFileDescriptions.begin() ;
+		 curr != end; ++curr)
+		{
+		std::wstring target = (*curr)->GetTarget();
+		// At this stage, '!' has already been assigned, so no need to worry about it...
+		if (StringUtils::StartsWithDrive(target))
+			{
+			drives |= 1 << (target.at(0) - 'A');
+			}
+		}
+	SetDrives(drives);
+}
+
+void SisRegistryObject::AddFiles(const InstallableFiles& aFiles)
+{
+	for(InstallableFiles::const_iterator curr = aFiles.begin(); curr != aFiles.end(); ++curr )
+	{	
+		InstallableFile* installableFile= *curr;
+		TUint32 sid = installableFile->Sid();
+		FileDescription* f = new FileDescription(*installableFile->FileDescription() , sid, iSelectedDrive, installableFile->GetTarget());
+		iFileDescriptions.push_back(f);
+
+		// If the SID is there already there is no reason to add it again
+		if (installableFile->IsExe())
+		{
+			if (std::find(iSids.begin(), iSids.end(), sid) == iSids.end())
+			{
+			iSids.push_back(sid);
+			}
+		}
+	}
+}
+
+void SisRegistryObject::RemoveFiles(const InstallableFiles& aFiles)
+{
+	// Check the new files to determine which files we need to remove prior to installing them
+	for(InstallableFiles::const_iterator curr = aFiles.begin(); curr != aFiles.end(); ++curr )
+	{	
+		InstallableFile* installableFile= *curr;
+		TUint32 sid = installableFile->Sid();
+		FileDescription f = FileDescription(*installableFile->FileDescription(), sid,
+											iSelectedDrive, installableFile->GetTarget());
+		
+		FileDescriptions::const_iterator end = iFileDescriptions.end();
+		for (FileDescriptions::iterator curr2 = iFileDescriptions.begin();
+			curr2 != end; ++curr2)
+		{
+			if (f.GetTarget() == (*curr2)->GetTarget())
+			{
+				// If the file to remove is an .exe, remove it's associated SID 
+				if (sid)
+				{
+					Sids::iterator i = std::find(iSids.begin(), iSids.end(), sid);		
+					if (i != iSids.end())
+					{
+						iSids.erase(i);
+					}
+				}
+			
+				delete *curr2;
+				iFileDescriptions.erase(curr2);
+				break;
+			}
+		}
+	}
+}
+
+void SisRegistryObject::SetFileDescriptions(const FileDescriptions& aFileDescriptions)
+	{
+	iFileDescriptions.resize(aFileDescriptions.size());
+	FileDescriptions::const_iterator scurr = aFileDescriptions.begin();
+	FileDescriptions::const_iterator end   = aFileDescriptions.end();
+
+	FileDescriptions::iterator dcurr = iFileDescriptions.begin();
+
+	while (scurr != end)
+		{
+		*dcurr++ = new FileDescription(**scurr++);
+		}
+	}
+
+void SisRegistryObject::SetProperties(const Properties& aProperties)
+	{
+	iProperties.resize(aProperties.size());
+	Properties::const_iterator scurr = aProperties.begin();
+	Properties::const_iterator end   = aProperties.end();
+
+	Properties::iterator dcurr = iProperties.begin();
+
+	while (scurr != end)
+		{
+		*dcurr++ = new SisRegistryProperty(**scurr++);
+		}
+}
+
+void SisRegistryObject::SetEmbeddedPackages(const Packages& aEmbeddedPackages)
+	{
+	iEmbeddedPackages.resize(aEmbeddedPackages.size());
+	Packages::const_iterator scurr = aEmbeddedPackages.begin();
+	Packages::const_iterator end   = aEmbeddedPackages.end();
+
+	Packages::iterator dcurr = iEmbeddedPackages.begin();
+
+	while (scurr != end)
+		{
+		*dcurr++ = new SisRegistryPackage(**scurr++);
+		}
+	}
+
+void SisRegistryObject::SetDependencies(const Dependencies& aDependencies)
+	{
+	iDependencies.resize(aDependencies.size());
+	Dependencies::const_iterator scurr = aDependencies.begin();
+	Dependencies::const_iterator end   = aDependencies.end();
+
+	Dependencies::iterator dcurr = iDependencies.begin();
+
+	while (scurr != end)
+		{
+		*dcurr++ = new SisRegistryDependency(**scurr++);
+		}
+	}
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+void SisRegistryObject::SetValidationStatus(bool aOriginVerificationStatus)
+	{
+	// Set the validation status based on the input parameter preference.
+	if(aOriginVerificationStatus)
+		{
+		iTrustStatus->SetValidationStatus(TrustStatus::KValidatedToAnchor);
+		}
+	else
+		{
+		iTrustStatus->SetValidationStatus(TrustStatus::KValidationStatusUnknown);
+		}
+	}
+#endif