secureswitools/swisistools/source/interpretsislib/installer.cpp
changeset 25 98b66e4fb0be
parent 24 84a16765cd86
child 33 8110bf1194d1
--- a/secureswitools/swisistools/source/interpretsislib/installer.cpp	Fri Mar 19 09:33:35 2010 +0200
+++ b/secureswitools/swisistools/source/interpretsislib/installer.cpp	Fri Apr 16 15:05:20 2010 +0300
@@ -21,7 +21,10 @@
 #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 
 #include "dbhelper.h" 
-
+#include "dirparse.h"
+#ifndef __TOOLS2_LINUX__
+#include <windows.h>
+#endif 
 #endif //SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 #include <exception>
 #include <sstream>
@@ -283,6 +286,11 @@
 	InstallableFiles installable;
 	GetInstallableFiles(file, installable, *iExpressionEvaluator, aInstallSISFile.iTargetDrive);
 
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+	TBool iBackupFlag = false;
+	Backup(file, installable, iBackupFlag);
+#endif
+
 	// Uninstall the same package (if found) prior to any installation
 	UninstallPkg(file);
 
@@ -290,8 +298,37 @@
 
 	InstallFiles(installable, iParamList.SystemDriveLetter());
 
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 	UpdateRegistry(file, installable, aInstallSISFile, aInstallSISFile.iSUFlag);
-	
+#else
+	try {
+
+		UpdateRegistry(file, installable, aInstallSISFile, aInstallSISFile.iSUFlag);
+	}
+	catch  (...)
+	{//Update Registry Failed. UnInstall the files.
+		InstallableFiles::const_iterator filedesIter; 
+		std::wstring itargetLocalFile;
+
+		for(filedesIter = installable.begin() ; filedesIter != installable.end(); ++filedesIter)
+		{
+		    itargetLocalFile = (*filedesIter)->GetLocalTarget();
+			
+			if (FileExists(itargetLocalFile))
+			{
+				RemoveFile(itargetLocalFile);
+				RemoveHashForFile(itargetLocalFile, iParamList.SystemDriveLetter(), iParamList.SystemDrivePath());
+			}
+		}
+		Restore(file, installable, iBackupFlag);
+		FreeInstallableFiles(installable);
+		return RSC_PARSING_ERROR;
+	}
+
+	if(iBackupFlag)
+		RemoveBackup(file, installable);
+#endif
+
 	if (aInstallSISFile.iGenerateStub)
 	{
 		CreateStubSisFile(aInstallSISFile, file);
@@ -419,6 +456,145 @@
 	iRegistry.GenerateStubRegistry();
 }
 
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+// Backup all installed files for this Uid's packages and all the SisRegistry Entries
+void Installer::Backup(const SisFile& aFile, InstallableFiles& aInstallable, TBool& aBackupFlag)
+{
+	TUint32 uid = aFile.GetPackageUid();
+	TUint32 installType = aFile.GetInstallType();
+
+	// Check to see the SA is installed, else backup is not required.
+	if (iRegistry.IsInstalled(uid) && ((installType == CSISInfo::EInstInstallation) || (installType == CSISInfo::EInstPartialUpgrade)))
+	{
+		aBackupFlag = true;
+		int err = 0;
+		LINFO(L"Backup package \"" << aFile.GetPackageName() << L"\" prior to re-installation");
+
+		// Backup all installed files for this Uid's packages and all the SisRegistry Entries
+		iRegistry.BackupCtl(uid);
+
+		//Backup SCR DB
+		std::string DbPath = iRegistry.GetDbPath();
+		if (FileExists(string2wstring(DbPath)))
+		{	
+			std::string BackupDb(DbPath);
+			BackupDb.append("_backup");
+
+		 	err=FileCopyA(DbPath.c_str(),BackupDb.c_str(),0);
+			if (err == 0)
+				LERROR(L"Failed to Backup Database scr.db ");
+		}
+
+		// Backup all installed files for this Uid's packages and all the SisRegistry Entries
+		InstallableFiles::const_iterator filedesIter; 
+		//Backup files
+		for(filedesIter = aInstallable.begin() ; filedesIter != aInstallable.end(); ++filedesIter)
+		{
+			std::wstring itargetLocalFile = (*filedesIter)->GetLocalTarget();
+			if (FileExists(itargetLocalFile))
+			{
+				std::wstring itargetBackupFile = (*filedesIter)->GetLocalTarget();
+				itargetBackupFile.append(L"_backup");
+				int pos =0;
+				if((pos = itargetBackupFile.find(L"\\sys\\bin\\", 0)) != std::wstring::npos)
+				{
+					BackupHashForFile(itargetLocalFile, iParamList.SystemDriveLetter(), iParamList.SystemDrivePath());
+				}
+
+				std::string iLocalFile = wstring2string(itargetLocalFile);
+				std::string iBackupFile = wstring2string(itargetBackupFile);
+
+				err=FileCopyA(iLocalFile.c_str(),iBackupFile.c_str(),0);
+				if (err == 0)
+					LERROR(L"Failed to Backup installable file ");
+			}
+		}
+	}
+}
+
+// Remove Backup of all installed files for this Uid's packages and all the SisRegistry Entries
+void Installer::RemoveBackup(const SisFile& aFile, InstallableFiles& aInstallable)
+{
+	TUint32 uid = aFile.GetPackageUid();
+	TUint32 installType = aFile.GetInstallType();
+
+	// Check to see the SA is installed, else backup is not required.
+	if (iRegistry.IsInstalled(uid) && ((installType == CSISInfo::EInstInstallation) || (installType == CSISInfo::EInstPartialUpgrade)))
+	{
+		LINFO(L"Remove Backup of package \"" << aFile.GetPackageName() << L"\" after re-installation success");
+		// Remove all installed files for this Uid's packages and all the SisRegistry Entries
+		iRegistry.RemoveCtlBackup(uid);
+
+		//Remove Backup SCR DB
+		std::string DbPath = iRegistry.GetDbPath();
+		std::string BackupDb(DbPath);
+		BackupDb.append("_backup");
+		std::wstring DbBackup = string2wstring(BackupDb);
+
+		if (FileExists(DbBackup))
+			RemoveFile(DbBackup);
+	
+		// Remove all installed files for this Uid's packages and all the SisRegistry Entries
+		InstallableFiles::const_iterator filedesIter; 
+		std::wstring itargetLocalFile;
+		std::wstring itargetBackupFile;
+
+		for(filedesIter = aInstallable.begin() ; filedesIter != aInstallable.end(); ++filedesIter)
+		{
+		    itargetLocalFile = (*filedesIter)->GetLocalTarget();
+			itargetBackupFile = (*filedesIter)->GetLocalTarget();
+			itargetBackupFile.append(L"_backup");
+			
+			if (FileExists(itargetBackupFile))
+			{
+				RemoveFile(itargetBackupFile);
+				RemoveHashForFile(itargetBackupFile, iParamList.SystemDriveLetter(), iParamList.SystemDrivePath());
+			}
+		}
+	}
+}
+
+// Restore all installed files for this Uid's packages and all the SisRegistry Entries
+void Installer::Restore(const SisFile& aFile, InstallableFiles& aInstallable, TBool& aBackupFlag)
+{
+	TUint32 uid = aFile.GetPackageUid();
+	TUint32 installType = aFile.GetInstallType();
+
+	// Check to see the SA is installed, else backup is not required.
+	if((installType == CSISInfo::EInstInstallation) || (installType == CSISInfo::EInstPartialUpgrade))
+	{
+		LINFO(L"Restoring Installed Package ");
+
+		// Restore all .ctl file for this Uid's packages and all the SisRegistry Entries
+		iRegistry.RestoreCtl(uid, aBackupFlag);
+
+		// Restore all installed files for this Uid's packages and all the SisRegistry Entries
+		InstallableFiles::const_iterator filedesIter; 
+		for(filedesIter = aInstallable.begin() ; filedesIter != aInstallable.end(); ++filedesIter)
+		{
+			std::wstring itargetLocalFile = (*filedesIter)->GetLocalTarget();
+			std::wstring itargetBackupFile = (*filedesIter)->GetLocalTarget();
+			itargetBackupFile.append(L"_backup");
+			if (FileExists(itargetBackupFile))
+			{
+				int pos =0;
+				if((pos = itargetBackupFile.find(L"\\sys\\bin\\", 0)) != std::wstring::npos)
+				{
+					RestoreHashForFile(itargetLocalFile, iParamList.SystemDriveLetter(), iParamList.SystemDrivePath());
+				}
+
+				std::string iLocalFile = wstring2string(itargetLocalFile);
+				std::string iBackupFile = wstring2string(itargetBackupFile);
+				
+				int err = FileMoveA(iBackupFile.c_str(),iLocalFile.c_str());
+
+				if (err == 0)
+					LERROR(L"Failed to Restore file ");
+			}
+		}
+	}
+}
+#endif
 
 struct CheckDependencyMet
 {