installationservices/swi/source/sisregistry/server/sisregistryutil.cpp
changeset 0 ba25891c3a9e
child 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/sisregistry/server/sisregistryutil.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,233 @@
+/*
+* 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: 
+* SisRegistryUtil class - implementation
+* A collection of static functions to provide useful functionality to a the sisregistryserver as a whole 	
+*
+*/
+
+
+/**
+ @file 
+ @released
+ @internalComponent
+*/
+#include "sisregistryutil.h"
+#include <s32file.h>
+#include "log.h"
+#include "sisregistryserverconst.h"
+#include "dessisdataprovider.h"
+#include "sisregistryobject.h"
+#include "sisinstallblock.h"
+#include "sisregistryfiledescription.h"
+#include "sisinfo.h"
+#include "filesisdataprovider.h"
+#include "sisuid.h"
+
+using namespace Swi;
+
+const TInt KStubSisPUidPos = 0x18;
+
+HBufC* SisRegistryUtil::BuildControllerFileNameLC(TUid aUid, TInt aIndex, TInt aController, TInt aDrive)
+	{
+	TDriveUnit drive(aDrive);
+	TDriveName driveName = drive.Name();
+	HBufC *filename = HBufC::NewMaxLC(KMaxFileName);
+	TPtr filenamePtr(filename->Des());
+	filenamePtr.Format(KControllerFileNameFormat, &driveName, &KRegistryPath, aUid.iUid,
+					aIndex, aController);
+	return filename;
+	}
+
+HBufC* SisRegistryUtil::BuildStubFilesPathLC(TInt aDrive)
+	{
+	TDriveUnit drive(aDrive);
+	TDriveName driveName = drive.Name();
+	HBufC *filePath = HBufC::NewMaxLC(KMaxFileName);
+	TPtr filePathPtr(filePath->Des());
+	filePathPtr.Format(_L("%S%S"), &driveName, &KSwiDaemonPrivateDirectory);
+	return filePath;
+	}
+
+HBufC* SisRegistryUtil::BuildControllerFileNameLC(TUid aUid, TInt aIndex, TInt aController)
+	{
+	return BuildControllerFileNameLC(aUid, aIndex, aController, RFs::GetSystemDrive());
+	}
+
+HBufC* SisRegistryUtil::BuildUninstallLogFileNameLC(TUid aUid, TInt aIndex, TChar aDriveLetter)
+	{
+	TDriveUnit systemDrive(RFs::GetSystemDrive());
+	TDriveName systemDriveName = systemDrive.Name();
+	HBufC *filename = HBufC::NewMaxLC(KMaxFileName);
+	TPtr filenamePtr(filename->Des());
+	filenamePtr.Format(KUninstallLogPathFormat, (TUint)systemDriveName[0], aUid.iUid, aIndex, (TUint)aDriveLetter);	
+	return filename;
+	}
+
+TBool SisRegistryUtil::FileExistsL(RFs& aFs, const TDesC& aFullPath)
+	{
+	TBool found = EFalse;
+	TEntry entry;
+	TInt err = aFs.Entry(aFullPath, entry);
+	if (err == KErrNone)
+		{
+		return  ETrue;
+		}
+	else if (err != KErrNotFound && err != KErrPathNotFound)
+		{
+		User::Leave(err);
+		}
+	
+	return found;
+	}
+
+void SisRegistryUtil::EnsureDirExistsL(RFs& aFs, const TDesC& aPath)
+	{
+	TInt err = aFs.MkDirAll(aPath);
+	if (err != KErrNone && err != KErrAlreadyExists)
+		{
+		User::LeaveIfError(err);
+		}
+	}
+
+// Processes the ROM stub files. Retuns ETrue if the aUid or aName
+// is found in any of the ROM stub files, else returns EFalse.
+TBool SisRegistryUtil::RomBasedPackageL(const TUid& aUid)
+	{	
+	TBool isInRom = EFalse;
+	
+	RFs fileServer;
+	User::LeaveIfError(fileServer.Connect());
+	CleanupClosePushL(fileServer);
+	
+	CDir* stubList = NULL;
+	_LIT(KRomStubPath, "z:\\system\\install\\%S");
+	_LIT(KRomStubWildCard,"z:\\system\\install\\*.sis");
+	
+	TEntry stubEntry;
+	RBuf stubFileName;
+	stubFileName.CreateL(KMaxFileName);
+	CleanupClosePushL(stubFileName);
+	//Iterates through the stub files in the ROM calling CheckIfMatchingStubFileL() 
+	//to search for the presence of the package name ignoring any SIS parsing errors.
+	if (fileServer.GetDir(KRomStubWildCard,KEntryAttNormal, ESortByName, stubList)==KErrNone)
+		{		
+		CleanupStack::PushL(stubList);		
+		for (TInt stubCount = 0; stubCount < stubList->Count(); stubCount++)
+			{			
+			stubEntry = (*stubList)[stubCount];
+			stubFileName.Format(KRomStubPath, &(stubEntry.iName));		
+			
+			
+			TRAPD(err, isInRom = SisRegistryUtil::CheckIfMatchingStubPUidL(aUid,  fileServer, stubFileName));
+			
+			if ((err >= KErrSISNotEnoughSpaceToInstall)  && (err <= KErrSISFieldIdMissing))
+  				{
+  				//Error reading SIS stub details, skip this one and continue searching the list.
+  				DEBUG_PRINTF3(_L("ERROR: Stub file in ROM failed to parse. Filename: %S. Error code: %d."), &stubEntry.iName, err);
+  				}
+  			else if (err != KErrNone)
+  				{
+  				User::Leave(err);
+  				}
+  			else if (isInRom)
+  				{
+				break;
+  				}
+			}
+		CleanupStack::PopAndDestroy(stubList);
+		}			
+	CleanupStack::PopAndDestroy(2, &fileServer); // stubFileName
+	return isInRom;
+	}
+
+ HBufC* SisRegistryUtil::BuildLogFileNameLC()
+ 	{
+ 	HBufC *filename = HBufC::NewMaxLC(KMaxFileName);
+ 	TPtr filenamePtr(filename->Des());
+ 	TDriveUnit sysDrive(RFs::GetSystemDrive());
+ 	filenamePtr = sysDrive.Name();
+ 	filenamePtr.Append(KLogDir);
+ 	return filename;
+ 	}
+
+TUid SisRegistryUtil::IdentifyUidFromSisFileL(RFs& aFs, TDesC& aFilename)
+	{
+	// Returns the package UID read from the symbian header in the specified
+	// file.  Note that there is no check to ensure that it is a valid sisx
+	// file, but it will leave if the file is too short.
+	RFile file;
+	User::LeaveIfError(file.Open(aFs, aFilename, EFileRead | EFileStream));
+	CleanupClosePushL(file);
+	TUid packageUid;
+	TUid uid1;
+	TUid uid2;
+	ReadSymbianHeaderL(file, uid1, uid2, packageUid);
+	CleanupStack::PopAndDestroy(&file);
+	return packageUid;
+	}
+
+void SisRegistryUtil::ReadSymbianHeaderL(RFile& aFile, TUid& aUid1, TUid& aUid2, TUid& aUid3)
+	{
+	// Read the first 3 32-bit values from the file as UIDs 1 to 3, leave with
+	// KErrUnderflow if the file is too short.
+	TInt uidLen = sizeof(TInt32);
+
+	TPckg<TInt32> uid1(aUid1.iUid);
+	User::LeaveIfError(aFile.Read(uid1, uidLen));
+	if (uid1.Length() != uidLen)
+		{
+		User::Leave(KErrUnderflow);
+		}
+
+	TPckg<TInt32> uid2(aUid2.iUid);
+	User::LeaveIfError(aFile.Read(uid2, uidLen));
+	if (uid1.Length() != uidLen)
+		{
+		User::Leave(KErrUnderflow);
+		}
+
+	TPckg<TInt32> uid3(aUid3.iUid);
+	User::LeaveIfError(aFile.Read(uid3, uidLen));
+	if (uid1.Length() != uidLen)
+		{
+		User::Leave(KErrUnderflow);
+		}
+	}
+
+/**
+Reads the pUid of stub sis file from a given position in the file.
+and match it with aUid
+@param aName The file name being searched for.
+@param aUid  The package uid being searched for.
+@param aFileServer Handle to the file server to use.
+@param aStubFileName Complete path and filename of the stub file being checked.
+@return ETrue if the package uid or the pkg name is found, EFalse otherwise.
+*/
+TBool SisRegistryUtil::CheckIfMatchingStubPUidL(const TUid& aUid, RFs& aFileServer, const TFileName& aStubFileName)
+	{
+	
+	RFile sisFile;
+	User::LeaveIfError(sisFile.Open(aFileServer, aStubFileName, EFileRead));
+	CleanupClosePushL(sisFile);
+	RFileReadStream sisFileReadStream(sisFile, KStubSisPUidPos);
+	CleanupClosePushL(sisFileReadStream);
+	
+	TUid packageUid = TUid::Uid(sisFileReadStream.ReadUint32L());
+	
+	CleanupStack::PopAndDestroy(2,&sisFile); //readstream, file
+	return (aUid == packageUid);
+	
+	}
+