secureswitools/swisistools/source/interpretsislib/installer.cpp
branchRCL_3
changeset 25 7333d7932ef7
parent 24 5cc91383ab1e
child 26 8b7f4e561641
--- a/secureswitools/swisistools/source/interpretsislib/installer.cpp	Thu Aug 19 10:02:49 2010 +0300
+++ b/secureswitools/swisistools/source/interpretsislib/installer.cpp	Tue Aug 31 15:21:33 2010 +0300
@@ -21,6 +21,7 @@
 #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 
 #include "dbhelper.h" 
+#include "dirparse.h"
 #ifndef __TOOLS2_LINUX__
 #include <windows.h>
 #endif 
@@ -346,6 +347,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);
 
@@ -353,8 +359,33 @@
 
 	InstallFiles(installable, iParamList.SystemDriveLetter());
 
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 	UpdateRegistry(file, installable, aInstallSISFile, aInstallSISFile.iSUFlag);
+#else
+	try {
+
+		UpdateRegistry(file, installable, aInstallSISFile, aInstallSISFile.iSUFlag);
+	}
+	catch  (InterpretSisError& e)
+	{
+		RestoreAll(file, installable, iBackupFlag);
+
+		LERROR(L"\t" << string2wstring(e.what()));
+		int result =  e.GetErrorCode();
+		return result;
 	
+	}
+	catch  (...)
+	{//Update Registry Failed. UnInstall the files.
+
+		RestoreAll(file, installable, iBackupFlag);
+		return RSC_PARSING_ERROR;
+	}
+
+	if(iBackupFlag)
+		RemoveBackup(file, installable);
+#endif
+
 	if (aInstallSISFile.iGenerateStub)
 	{
 		CreateStubSisFile(aInstallSISFile, file);
@@ -482,6 +513,182 @@
 	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();
+				std::wstring temp = itargetBackupFile.c_str();
+				temp.append(L"_backup");
+				itargetBackupFile = temp;
+
+
+				int pos =0;
+				#ifdef __LINUX__
+				std::wstring sysBin = L"/sys/bin/";
+				#else
+				std::wstring sysBin = L"\\sys\\bin\\";
+				#endif
+
+				if((pos = itargetBackupFile.find(sysBin, 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();
+			std::wstring temp = itargetBackupFile.c_str();
+			temp.append(L"_backup");
+			itargetBackupFile = temp;
+			
+			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;
+				#ifdef __LINUX__
+				std::wstring sysBin = L"/sys/bin/";
+				#else
+				std::wstring sysBin = L"\\sys\\bin\\";
+				#endif
+
+				if((pos = itargetBackupFile.find(sysBin, 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 ");
+			}
+		}
+	}
+}
+
+void Installer::RestoreAll(const SisFile& aFile, InstallableFiles& aInstallable, TBool& aBackupFlag)
+{
+	InstallableFiles::const_iterator filedesIter; 
+	std::wstring itargetLocalFile;
+
+	for(filedesIter = aInstallable.begin() ; filedesIter != aInstallable.end(); ++filedesIter)
+	{
+		itargetLocalFile = (*filedesIter)->GetLocalTarget();
+		
+		if (FileExists(itargetLocalFile))
+		{
+			RemoveFile(itargetLocalFile);
+			RemoveHashForFile(itargetLocalFile, iParamList.SystemDriveLetter(), iParamList.SystemDrivePath());
+		}
+	}
+	Restore(aFile, aInstallable, aBackupFlag);
+	FreeInstallableFiles(aInstallable);
+}
+
+#endif
 
 struct CheckDependencyMet
 {
@@ -812,7 +1019,7 @@
 				// hash file is always created on the system drive
 				reghashdir[0] = iSystemDrive;
 
-				LINFO(L"\tCreating hash: " << reghashdir << basename.c_str());				
+				LINFO(L"\tCreating hash: " << reghashdir << basename);				
 				std::wstring hash = hashdir + basename;
 				HANDLE hFile = MakeSISOpenFile(hash.c_str(), GENERIC_WRITE, CREATE_ALWAYS);		
 				if( INVALID_HANDLE_VALUE == hFile )
@@ -1337,6 +1544,7 @@
 					std::wostringstream os;
 					os << target.c_str() << L" eclipses file from ROM" << std::endl;
 					iProblemFiles.append(os.str());
+
 					iError = ECLIPSING_VIOLATION;
 					continue;
 				}