installationservices/swi/source/sisregistry/server/sisregistryserversession.cpp
branchRCL_3
changeset 25 7333d7932ef7
parent 0 ba25891c3a9e
child 26 8b7f4e561641
--- a/installationservices/swi/source/sisregistry/server/sisregistryserversession.cpp	Thu Aug 19 10:02:49 2010 +0300
+++ b/installationservices/swi/source/sisregistry/server/sisregistryserversession.cpp	Tue Aug 31 15:21:33 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2004-2010 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"
@@ -31,12 +31,11 @@
 #include <swi/sistruststatus.h>
 #include <swi/sisregistrylog.h>
 #include <scs/ipcstream.h>
+#include <startupdomainpskeys.h>
+#include <e32const.h>
 
-#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
 #include "sislauncherclient.h"
 #include "swtypereginfo.h"
-#endif
-
 #include "scrhelperutil.h"
 #include "scrdbconstants.h"
 #include "log.h"
@@ -66,12 +65,14 @@
 #include "sisinstallblock.h"
 #include "sisregistryfiledescription.h"
 #include "sisregistrywritablesession.h"  
+#include "securitycheckutil.h"
 
 using namespace Swi;
 using namespace Usif;
 
 const TInt KUidHexLength = 8;
 _LIT(KSWIRegFirstInitFile, "\\sys\\install\\sisregistry\\swiregfirstinit.log");
+_LIT(KApparcRegFileNameFormat, "*10003a3f*");
 
 // Function to panic an offending client
 void CSisRegistrySession::PanicClient(const RMessagePtr2& aMessage, Swi::TSisRegistryPanic aPanic)
@@ -92,21 +93,45 @@
 	// Create a session with the Software Component Registry
 	User::LeaveIfError(iScrSession.Connect());
 
+	iIsFirstInit = IsFirstInvocationL();
+	
+#ifdef __WINSCW__
+	_LIT_SECURE_ID(KAppArcSID, 0x10003A3F);
+	if (KAppArcSID.iId == iClientSid.iId)
+	    {
+        DEBUG_PRINTF(_L8("SIS Registry Server: Init for a connection from AppArc"));
+        ProcessApplicationsL();
+	    }
+	else
+	    {
+        if (iIsFirstInit)
+            {
+            DEBUG_PRINTF2(_L8("SIS Registry Server: Init for a connection from SID 0x%X"), iClientSid.iId);
+            ProcessRomStubsL();
+            }
+	    }
+#else
 	TInt res = KErrNone;
 	TRAP(res , res = IsFirmwareUpdatedL());
-	
-	if (IsFirstInvocationL() || res )
+		
+	if (iIsFirstInit || res)
 		{
-		isFwUpdated = ETrue;
+		if (res)
+		    {
+		    iIsFwUpdated = ETrue;
+		    }
+
 		FirstInvocationInitL();
+		if (iIsFwUpdated)
+		    {
+			TRAP(res, UpdateRecentFWVersionL());
+			if (res != KErrNone)
+                {
+                DEBUG_PRINTF2(_L8("Updating recent Firmware Version failed with error code = %d."), res);
+                }
+		    }		
 		}
-		
-    TRAP(res, UpdateRecentFWVersionL(););
-    if (res != KErrNone)
-        {
-        // log that
-        DEBUG_PRINTF2(_L8("Updating recent Firmware Version failed with error code = %d."), res);
-        }
+#endif
 	}
 
 CSisRegistrySession::~CSisRegistrySession()
@@ -138,29 +163,118 @@
 	return firstInvocation;
 	}
 
+void CSisRegistrySession::ProcessRomStubsL()
+    {
+    DEBUG_PRINTF(_L8("SIS Registry Server - Starting processing of ROM Stub sis files"));
+    iScrSession.CreateTransactionL();
+    ProcessRomDriveL();
+    iScrSession.CommitTransactionL();       
+        
+    // Create a file in <systemdrive>:\sys to mark a successful initialization
+    // so that we don't come here again (unless firmware is upgraded in which case <systemdrive>:\sys 
+    // should be cleaned
+    RBuf fileName;
+    CleanupClosePushL(fileName);
+    fileName.CreateL(KMaxPath);
+    TDriveUnit drive(iSystemDrive);
+    fileName = drive.Name();
+    fileName.Append(KSWIRegFirstInitFile);
+    RFile file;
+    CleanupClosePushL(file);
+    file.Replace(iFs, fileName, EFileWrite | EFileShareAny);
+    CleanupStack::PopAndDestroy(2, &fileName);  // file
+    
+    DEBUG_PRINTF(_L8("SIS Registry Server - Completed processing of ROM Stub sis files"));
+    }
+
+void CSisRegistrySession::ProcessApplicationsL()
+    {
+    TComponentId compId = 0;
+    DEBUG_PRINTF(_L8("SIS Registry Server - Deleteing all existing ROM applications."));
+    ScrHelperUtil::DeleteApplicationEntriesL(iScrSession, compId);
+    
+    //Register all apps found in \private\10003a3f\apps
+    TDriveUnit romDrive(SisRegistryUtil::SystemRomDrive());
+    RBuf apparcRegFilePath;
+    apparcRegFilePath.CreateL(romDrive.Name(), KMaxPath);
+    CleanupClosePushL(apparcRegFilePath);
+    apparcRegFilePath.Append(KApparcRegFilePath);
+    
+	//Create a single transaction to register all in rom apps
+	iScrSession.CreateTransactionL();
+	RegisterAllAppL(apparcRegFilePath);
+
+    //Register all apps found in \private\10003a3f\import\apps
+    apparcRegFilePath = romDrive.Name();
+    apparcRegFilePath.Append(KApparcRegFileImportPath);
+    RegisterAllAppL(apparcRegFilePath);
+    
+	//Register all apps found in UDA
+	TDriveUnit systemDrive(iSystemDrive);
+
+	//Register all apps found in <systemdrive>\private\10003a3f\apps
+	apparcRegFilePath = systemDrive.Name();	
+	apparcRegFilePath.Append(KApparcRegFilePath);
+	RegisterAllAppL(apparcRegFilePath);
+
+	//Register all apps found in <systemdrive>\private\10003a3f\import\apps
+    apparcRegFilePath = systemDrive.Name();
+    apparcRegFilePath.Append(KApparcRegFileImportPath);
+    RegisterAllAppL(apparcRegFilePath);
+	
+	iScrSession.CommitTransactionL();    
+	
+	CleanupStack::PopAndDestroy(&apparcRegFilePath);
+    
+    DEBUG_PRINTF(_L8("SIS Registry Server - Completed processing of all existing ROM applications."));
+    }
+
 // Does initialization required when run after very first boot of phone (or after firmware upgrade)
-// Method is only invoked when such a state is detected
+// Method is only invoked when such a state is detected (only in device, NOT in emulator)
 // Leaves behind a file in <systemdrive>:\sys to mark a successful initialization 
 void CSisRegistrySession::FirstInvocationInitL()
 	{
 	// Add the ROM installed stub details to SCR
 	// Create an SCR transaction, so that entries won't be added to the SCR if the function leaves
-	iScrSession.CreateTransactionL();
-	ProcessRomDriveL();
-	iScrSession.CommitTransactionL();
-	// Create a file in <systemdrive>:\sys to mark a successful initialization
-	// so that we don't come here again (unless firmware is upgraded in which case <systemdrive>:\sys 
-	// should be cleaned
-	RBuf fileName;
-	CleanupClosePushL(fileName);
-	fileName.CreateL(KMaxPath);
-	TDriveUnit drive(iSystemDrive);
-	fileName = drive.Name();
-	fileName.Append(KSWIRegFirstInitFile);
-	RFile file;
-	CleanupClosePushL(file);
-	file.Replace(iFs, fileName, EFileWrite | EFileShareAny);
-	CleanupStack::PopAndDestroy(2, &fileName);	// file
+    TInt value(EIdlePhase1NOK);
+    TInt ret = RProperty::Get(KPSUidStartup, KPSIdlePhase1Ok, value);
+	
+    TBool isFromSWIDaemon = EFalse;
+    _LIT_SECURE_ID(KSWIDaemonSID, 0x10202DCE);
+    if (KSWIDaemonSID.iId == iClientSid.iId)
+        { 
+        isFromSWIDaemon = ETrue;
+        }
+	
+	//If the image is NCP 'KPSUidStartup' property is not set, hence settig it explicitly for processing stubs
+	if(ret == KErrNotFound)
+		{
+		DEBUG_PRINTF(_L8("SIS Registry Server - 'KPSUidStartup' property is not set"));
+		value = EIdlePhase1Ok;
+		}
+	else
+		{
+		DEBUG_PRINTF(_L8("SIS Registry Server - 'KPSUidStartup' property is set"));
+		}
+	if ((value == EIdlePhase1Ok || isFromSWIDaemon) && iIsFirstInit)
+	    {
+        ProcessRomStubsL();
+	    }
+
+	if (iIsFwUpdated)
+	    {
+		// Delete the SisRegistry marker file
+        RBuf fileName;
+        CleanupClosePushL(fileName);
+        fileName.CreateL(KMaxPath);
+        TDriveUnit drive(iSystemDrive);
+        fileName = drive.Name();
+        fileName.Append(KSWIRegFirstInitFile);
+        iFs.Delete(fileName);
+        CleanupStack::PopAndDestroy(&fileName);
+
+        ProcessApplicationsL();
+	    }
 	}
 
 //
@@ -332,6 +446,12 @@
 	case EAddSoftwareTypeEntry:
 		RegisterEntryL(aMessage, ETrue, ETrue);
 		break;
+    case EAddAppRegEntry:
+        AppRegInfoEntryL(aMessage);
+        break;
+    case EUpdateAppRegEntry:
+        AppRegInfoEntryL(aMessage);
+        break;
 	case EUpdateEntry:
 		RegisterEntryL(aMessage, EFalse, EFalse);
 		break;
@@ -394,13 +514,31 @@
  		break;	
 	case ESetComponentState:
  		SetComponentStateL(aMessage);
- 		break;	
+ 		break;
+	case ESetComponentPresence:
+	    SetComponentPresenceL(aMessage);
+	    break;
 	case EIsFileRegistered:
  		IsFileRegisteredL(aMessage);
  		break;			
 	case EComponentIdForUid:
 		GetComponentIdForUidL(aMessage);
 		break;
+	case EComponentIdForPackage:
+        GetComponentIdForPackageL(aMessage);
+        break;
+	case EAppUidsForComponent:
+	    GetAppUidsForComponentL(aMessage);
+        break;
+	case EComponentIdsForPackageUid:	    
+        GetComponentIdsForUidL(aMessage);        
+        break;
+	case EAddAppRegInfo:
+	    AddAppRegInfoL(aMessage);
+	    break;
+	case ERemoveAppRegInfo:
+	    RemoveAppRegInfoL(aMessage);
+	    break;
 	default:
 		PanicClient(aMessage,EPanicIllegalFunction);
 		break;
@@ -553,31 +691,13 @@
 	readStream.Open(aMessage, 3);
 	CleanupClosePushL(readStream);
 	
-	RCPointerArray<CSoftwareTypeRegInfo> swTypeRegInfoArray;
+	RCPointerArray<Usif::CSoftwareTypeRegInfo> swTypeRegInfoArray;
 	CleanupClosePushL(swTypeRegInfoArray);
 	SoftwareTypeRegInfoUtils::UnserializeArrayL(readStream, swTypeRegInfoArray);
 	
 	for (TInt i=0; i<swTypeRegInfoArray.Count(); ++i)
 		{
-		const CSoftwareTypeRegInfo& info = *swTypeRegInfoArray[i];
-		const RPointerArray<CLocalizedSoftwareTypeName>& locSwTypeNames = info.LocalizedSoftwareTypeNames();
-		RCPointerArray<Usif::CLocalizedSoftwareTypeName> scrSwTypeNames;
-		CleanupClosePushL(scrSwTypeNames);
-		for (TInt i=0; i<locSwTypeNames.Count(); ++i)
-			{
-			scrSwTypeNames.AppendL(Usif::CLocalizedSoftwareTypeName::NewLC(locSwTypeNames[i]->Name(), locSwTypeNames[i]->Locale()));
-			CleanupStack::Pop();
-			}
-
-		DEBUG_PRINTF2(_L("Sis Registry Server - Adding software type: %S"), &info.UniqueSoftwareTypeName());
-
-		iScrSession.AddSoftwareTypeL(info.UniqueSoftwareTypeName(),
-									 info.SifPluginUid(),
-									 info.InstallerSecureId(),
-									 info.ExecutionLayerSecureId(),
-									 info.MimeTypes(),
-									 &scrSwTypeNames);
-		CleanupStack::PopAndDestroy(&scrSwTypeNames);
+		iScrSession.AddSoftwareTypeL(*swTypeRegInfoArray[i]);
 		}
 	
 	RBuf uniqueNames;
@@ -667,13 +787,13 @@
 			// DEF085506 fix. remove control files (Previous SA and any of PUs) also while SA upgrading.
 			if (object->InstallType() == Sis::EInstInstallation)
 				{
-				RemoveEntryL(*existingObject);
+				RemoveEntryL(compId);
 				RemoveCleanupInfrastructureL(*existingObject, stsSession);	
 				}
 			else // PartialUpgarde case remove only registry file.
 				{
 				// Essentially, this is an uninstall except we leave the controller file intact.
-				RemoveEntryL(*existingObject);
+				RemoveEntryL(compId);
 				}
 			CleanupStack::PopAndDestroy(existingObject);
 			}
@@ -796,32 +916,40 @@
 	TInt64 transactionID;
 	TPckg<TInt64> pkgTransactionID(transactionID);
 	aMessage.ReadL(EIpcArgument2, pkgTransactionID);
-	
-	// create a integrity service object
-	Usif::RStsSession stssession;
-	stssession.OpenTransactionL(transactionID);
-	CleanupClosePushL(stssession);
+		
+	DeleteEntryL(*object, transactionID, ETrue);
 	
-	RemoveEntryL(*object);
-	RemoveCleanupInfrastructureL(*object, stssession);
-
-	// If removal is for ROM upgrade type, after removing the existing registry entry set,
-	// regenerate the Registry Entry Cache. 
-	// If any of the ROM based stub doesn't have its registry set 
-	// in appropriate path, it will create them (SCR entry & . ctl) 
-	// from the ROM based stub sis file.	
-	if ((object->InstallType() == Sis::EInstInstallation || 
-		 object->InstallType() == Sis::EInstPartialUpgrade) &&	
-		SisRegistryUtil::RomBasedPackageL(object->Uid()))
-		{	
-		// Re-add the ROM installed stub details to SCR (only those missing will be added)
-		ProcessRomDriveL();
-		}
- 	CleanupStack::PopAndDestroy(2, object);// STS 
+ 	CleanupStack::PopAndDestroy(object);
 	
 	aMessage.Complete(KErrNone);
 	}
 
+void CSisRegistrySession::DeleteEntryL(const CSisRegistryObject& aObject, TInt64 aTransactionId, TBool aCleanupRequired/*=ETrue*/)
+    {
+    // create a integrity service object
+    Usif::RStsSession stssession;
+    stssession.OpenTransactionL(aTransactionId);
+    CleanupClosePushL(stssession);
+        
+    RemoveEntryL(aObject);
+    RemoveCleanupInfrastructureL(aObject, stssession);
+    
+    // If removal is for ROM upgrade type, after removing the existing registry entry set,
+    // regenerate the Registry Entry Cache. 
+    // If any of the ROM based stub doesn't have its registry set 
+    // in appropriate path, it will create them (SCR entry & . ctl) 
+    // from the ROM based stub sis file.    
+    if ((aObject.InstallType() == Sis::EInstInstallation || 
+            aObject.InstallType() == Sis::EInstPartialUpgrade) &&  
+                SisRegistryUtil::RomBasedPackageL(aObject.Uid()) && 
+                    aCleanupRequired)
+        {   
+        // Re-add the ROM installed stub details to SCR (only those missing will be added)
+        ProcessRomDriveL();
+        }    
+    CleanupStack::PopAndDestroy(&stssession);
+    }
+
 void CSisRegistrySession::OpenRegistryUidEntryL(const RMessage2& aMessage)
 	{
 	// expects a UID as an arg 0
@@ -932,8 +1060,6 @@
 // The output will be based on the request parameters (operational mode) sent as input.
 void CSisRegistrySession::RequestStubFileEntriesL(const RMessage2& aMessage)
 	{
-	TBool stubNotFound(ETrue);
-	
 	TUid tUid;	
 	TPckg<TUid> packageUid(tUid);
 	aMessage.ReadL(EIpcArgument0, packageUid, 0);
@@ -942,117 +1068,188 @@
 	TPckg<TStubExtractionMode> packageMode(tMode);
 	aMessage.ReadL(EIpcArgument1, packageMode, 0);
 	
-	// Prepare the stub file path.
-	TDriveUnit romDrive(EDriveZ);
-	RBuf romRegistryPath;
-	romRegistryPath.CreateL(romDrive.Name(), KMaxPath);
-	CleanupClosePushL(romRegistryPath);
-	romRegistryPath.Append(KPreInstalledPath);	
-
-	RFs tFs;
-	CDir* dir;
+	TInt startingFileNo = 0;
+	if (tMode == EGetFiles)
+	    {
+        TPckg<TInt> start(startingFileNo);
+        aMessage.ReadL(EIpcArgument2, start, 0);
+	    }
 	
-	// Get stub files under the ROM stub directory (Z:\system\install\).
-	User::LeaveIfError(tFs.Connect());
-	CleanupClosePushL(tFs);
-		
-	TInt err = tFs.GetDir(romRegistryPath, KEntryAttMatchExclude | KEntryAttDir, ESortNone, dir);
+	TInt fileCount = 0;
+	RPointerArray<HBufC> fileNames;
+	CleanupResetAndDestroy<RPointerArray<HBufC> >::PushL(fileNames);
+	                    
+	TRAPD(errCode, GetStubFileInfoL(tUid, tMode, startingFileNo, fileCount, fileNames));
+	if (KErrNone == errCode)
+	    {
+	    if (tMode == EGetFiles)
+	        {
+	        // Stream via multiple IPC writes instead of
+	        // copying to a buffer and streaming from there.
+	        RIpcWriteStream ipcstream;
+	        ipcstream.Open(aMessage, EIpcArgument3);
+	        CleanupClosePushL(ipcstream);
+	        ExternalizePointerArrayL(fileNames,ipcstream);
+	        ipcstream.CommitL();
+	        aMessage.Complete(KErrNone);
+	        CleanupStack::PopAndDestroy(&ipcstream);
+	        }
+	    else if (tMode == EGetCount)
+	        {
+	        TPckgBuf<TInt> fileCnt(fileCount);
+	        aMessage.WriteL(EIpcArgument2, fileCnt);
+            aMessage.Complete(KErrNone);      
+	        }
+	    }
+	else
+	    {
+	    aMessage.Complete(errCode);
+	    }
+	CleanupStack::PopAndDestroy();
+	}
 
-	if (err == KErrNone)
-		{
-		CleanupStack::PushL(dir);	
-		TInt count(dir->Count());
-		RBuf controllerFileName;
-		controllerFileName.CreateL(KMaxFileName);
-		CleanupClosePushL(controllerFileName);
-		for (TInt index = 0; index < count; ++index)
-			{
-			controllerFileName = romRegistryPath;
-			controllerFileName.Append((*dir)[index].iName);
+void CSisRegistrySession::GetStubFilesL(const TDesC& aFileName, RPointerArray<HBufC>& aFileNames)
+    {
+    // Read the ROM stub controller
+    CFileSisDataProvider* fileProvider = CFileSisDataProvider::NewLC(iFs, aFileName);
+    Swi::Sis::CController* stubController = NULL;
+    TRAPD(errCode, stubController = Swi::Sis::CController::NewL(*fileProvider));
+    if (errCode != KErrNone)
+        {
+        // Ignore the broken stub file under the ROM stub directory.
+        DEBUG_PRINTF2(_L8("Sis Registry Server - Failed to read the stub controller. Error code %d."), errCode);
+        CleanupStack::PopAndDestroy(fileProvider);
+        User::Leave(errCode);
+        }
+    CleanupStack::PushL(stubController);
+    const RPointerArray<Sis::CFileDescription>& filesArray = stubController->InstallBlock().FileDescriptions();
+    TInt totalFileCount = filesArray.Count();
+    // Populate the files in to a temporary array.
+    for(TInt fileCount = 0; fileCount < totalFileCount; ++fileCount )
+        {
+        HBufC* fileName = filesArray[fileCount]->Target().Data().AllocLC();
+        // Adding drive letter of rom if not mentioned in stub sis file
+        TPtr a=fileName->Des();
+        if (a[0] == '!')
+            {
+            TChar driveChar;
+            User::LeaveIfError(iFs.DriveToChar(EDriveZ, driveChar));
+            a[0] = driveChar;
+            }
+
+		aFileNames.AppendL(fileName);
+		CleanupStack::Pop(fileName);
+		}
+    CleanupStack::PopAndDestroy(2, fileProvider);
+    }
+
+void CSisRegistrySession::GetStubFileInfoL(TUid aUid, TStubExtractionMode aMode, TInt aStartingFileNo, TInt& aFileCount, RPointerArray<HBufC>& aFileNames)
+    {
+    TBool stubNotFound(ETrue);
+    
+    // Prepare the stub file path.
+    TDriveUnit romDrive(EDriveZ);
+    RBuf romRegistryPath;
+    romRegistryPath.CreateL(romDrive.Name(), KMaxPath);
+    CleanupClosePushL(romRegistryPath);
+    romRegistryPath.Append(KPreInstalledPath);  
 
-			// Read the ROM stub controller
-  			CFileSisDataProvider* fileProvider = CFileSisDataProvider::NewLC(tFs, controllerFileName);
-  			Swi::Sis::CController* stubController = NULL;
-  			TRAPD(errCode, stubController = Swi::Sis::CController::NewL(*fileProvider));
-  			if (errCode != KErrNone)
-	  			{
-	  			// Ignore the broken stub file under the ROM stub directory.
-	  			DEBUG_PRINTF2(_L8("Sis Registry Server - Failed to read the stub controller. Error code %d."), errCode);
-	  			CleanupStack::PopAndDestroy(fileProvider);
-	  			continue;
-	  			}
-  			CleanupStack::PushL(stubController);
-  			
-  			// If the UID in a stub file matches the current package's UID,
-  			// populate the list of eclipsable files from the same stub file.
-  			if ( stubController->Info().Uid().Uid() == tUid )
-  				{
-  				stubNotFound = EFalse;
-  				const RPointerArray<Sis::CFileDescription>& depArray = stubController->InstallBlock().FileDescriptions();
-  				// Get as many number of files as possible that can be accomodate in client allocated buffer.
-  				if (tMode == EGetFiles)
-  					{
-  					TInt sizeRed = 0;
-  					TInt startingFileNo;	
-					TPckg<TInt> start(startingFileNo);
-					aMessage.ReadL(EIpcArgument2, start, 0);
-  						
-  					RPointerArray<TPtrC> fileNames;
-  					CleanupResetAndDestroy<RPointerArray<TPtrC> >::PushL(fileNames);
+    RFs tFs;
+    CDir* dir;
+        
+    // Get stub files under the ROM stub directory (Z:\system\install\).
+    User::LeaveIfError(tFs.Connect());
+    CleanupClosePushL(tFs);
+    
+    TInt err = tFs.GetDir(romRegistryPath, KEntryAttMatchExclude | KEntryAttDir, ESortNone, dir);
+
+    if (err == KErrNone)
+        {
+        CleanupStack::PushL(dir);   
+        TInt count(dir->Count());
+        RBuf controllerFileName;
+        controllerFileName.CreateL(KMaxFileName);
+        CleanupClosePushL(controllerFileName);
+        for (TInt index = 0; index < count; ++index)
+            {
+            controllerFileName = romRegistryPath;
+            controllerFileName.Append((*dir)[index].iName);
 
-  					TInt totalDepArrayCount = depArray.Count();
-  					// Populate the files in to a temporary array.
-  					for(TInt fileCount = startingFileNo; fileCount < totalDepArrayCount; ++fileCount )
-  						{
-  						sizeRed += depArray[fileCount]->Target().Data().Size();
-  						// If amount of data red exceeds the client buffer size, break reading.
-  						if (sizeRed > KDefaultBufferSize)
-  							{
-  							break;
-  							}
-  							
-  						// Only create a TPtrC when we know we have space available
-  						TPtrC* fileName = new(ELeave) TPtrC(depArray[fileCount]->Target().Data());
-  						CleanupStack::PushL(fileName);
-  						fileNames.AppendL(fileName);
-  						CleanupStack::Pop(fileName);   						
-	  					}	  	
-  					// Stream via multiple IPC writes instead of
-  					// copying to a buffer and streaming from there.
-  					RIpcWriteStream ipcstream;
-  					ipcstream.Open(aMessage, EIpcArgument3);
-  					CleanupClosePushL(ipcstream);
-  					ExternalizePointerArrayL(fileNames,ipcstream);
-  					ipcstream.CommitL();
-  					aMessage.Complete(KErrNone);
-  					CleanupStack::PopAndDestroy(&ipcstream);
-  					CleanupStack::PopAndDestroy(&fileNames);					
-  					}
-  				// If only the count needed, send the stub file's total entrie's count.
-  				else if (tMode == EGetCount)
-  					{
-  					TPckgBuf<TInt> fileCount(depArray.Count());
-					aMessage.WriteL(EIpcArgument2, fileCount);
-					aMessage.Complete(KErrNone);					
-  					}  				
-	  			CleanupStack::PopAndDestroy(2, fileProvider);
-	  			break;	
-  				}
-  			CleanupStack::PopAndDestroy(2, fileProvider);  		
-			}
-		CleanupStack::PopAndDestroy(2, dir); // controllerFileName
-		// If the stub file itself not found, leave with the same error info'
-		if (stubNotFound)
-  			{
-  			aMessage.Complete(KErrNotFound);
-  			}		
-		}
-	else if(err != KErrPathNotFound)
-		{
-		aMessage.Complete(err);		
-		}
-	CleanupStack::PopAndDestroy(2, &romRegistryPath); // tFs
-	}
+            // Read the ROM stub controller
+            CFileSisDataProvider* fileProvider = CFileSisDataProvider::NewLC(tFs, controllerFileName);
+            Swi::Sis::CController* stubController = NULL;
+            TRAPD(errCode, stubController = Swi::Sis::CController::NewL(*fileProvider));
+            if (errCode != KErrNone)
+                {
+                // Ignore the broken stub file under the ROM stub directory.
+                DEBUG_PRINTF2(_L8("Sis Registry Server - Failed to read the stub controller. Error code %d."), errCode);
+                CleanupStack::PopAndDestroy(fileProvider);
+                continue;
+                }
+            CleanupStack::PushL(stubController);
+                
+            // If the UID in a stub file matches the current package's UID,
+            // populate the list of eclipsable files from the same stub file.
+            if ( stubController->Info().Uid().Uid() == aUid )
+                {
+                stubNotFound = EFalse;
+                const RPointerArray<Sis::CFileDescription>& filesArray = stubController->InstallBlock().FileDescriptions();
+                // Get as many number of files as possible that can be accomodate in client allocated buffer.
+                if (aMode == EGetFiles)
+                    {
+                    TInt sizeRed = 0;
+                    TInt totalFileCount = filesArray.Count();
+                    // Populate the files in to a temporary array.
+                    for(TInt fileCount = aStartingFileNo; fileCount < totalFileCount; ++fileCount )
+                        {
+                        sizeRed += filesArray[fileCount]->Target().Data().Size();
+                        // If amount of data red exceeds the client buffer size, break reading.
+                        if (sizeRed > KDefaultBufferSize)
+                            {
+                            break;
+                            }
+                                
+                        // Only create a TPtrC when we know we have space available
+                        HBufC* fileName = filesArray[fileCount]->Target().Data().AllocLC();
+						// Adding drive letter of rom if not mentioned in stub sis file
+                        TPtr a=fileName->Des();
+                        if (a[0] == '!')
+                            {
+                            TChar driveChar;
+                            User::LeaveIfError(iFs.DriveToChar(EDriveZ, driveChar));
+                            a[0] = driveChar;
+                            }                        
+                       
+                        aFileNames.AppendL(fileName);
+                        CleanupStack::Pop(fileName);                        
+                        } 
+                    }
+                // If only the count needed, send the stub file's total entrie's count.
+                else if (aMode == EGetCount)
+                    {
+                    aFileCount = filesArray.Count();
+                    }               
+                CleanupStack::PopAndDestroy(2, fileProvider);
+                break;  
+                }
+            CleanupStack::PopAndDestroy(2, fileProvider);       
+            }
+        CleanupStack::PopAndDestroy(2, dir); // controllerFileName
+        // If the stub file itself not found, leave with the same error info'
+        
+        if (stubNotFound)
+            {  
+			CleanupStack::PopAndDestroy(2, &romRegistryPath); // tFs          
+            User::Leave(KErrNotFound);
+            }       
+        }
+    else if(err != KErrPathNotFound)
+        {     
+		CleanupStack::PopAndDestroy(2, &romRegistryPath); // tFs   
+		User::Leave(err);
+        }
+	CleanupStack::PopAndDestroy(2, &romRegistryPath); // tFs	
+    }
 
 void CSisRegistrySession::RequestRegistryEntryL(const RMessage2& aMessage)
 	{
@@ -1074,15 +1271,86 @@
 
 void CSisRegistrySession::AddDriveL(const RMessage2& aMessage)
 	{
-	TInt drive;
-	TPckg<TInt> pkgDrive(drive);
+	TInt addedDrive;
+	TPckg<TInt> pkgDrive(addedDrive);
 	aMessage.ReadL(EIpcArgument0, pkgDrive);
 
-	DEBUG_PRINTF2(_L8("Sis Registry Server - Removable drive %d added."), drive);
+	DEBUG_PRINTF2(_L8("Sis Registry Server - Removable drive %d added."), addedDrive);
+	    
+	// Get the drive character.
+	TChar drive;
+	User::LeaveIfError(iFs.DriveToChar(addedDrive, drive));
+	TUint driveChar(drive);
+	    
+	// Retrieve drive info.
+	TDriveInfo driveInfo;
+	User::LeaveIfError(iFs.Drive(driveInfo, addedDrive));
+#ifndef __WINSCW__	   
+	if(driveInfo.iDriveAtt & KDriveAttLogicallyRemovable)
+#endif	    
+	    {
+	    /*
+	    In case a logically removable drive is added,
+	    Look for the presence of the first boot marker file corresponding to it in the sisregistry private
+	    folder in C drive. If absent, assume first boot and create the marker file. 
+	    Also added a marker file in the <drive>\sys\install directory which would be used to detect a format. 
+	         
+	    Subsequent boots would look for the drive format marker to check if a format has occured and delete
+	    the registry entries.
+	    */
+	    
+	    // Create first boot marker path.
+	    _LIT(KFirstBootMarkerFilePath, "%c:%SfirstBootMarkerFileFor%c");
+	    RBuf privatePath;
+		privatePath.CreateL(KMaxPath);
+	    CleanupClosePushL(privatePath);
+	    User::LeaveIfError(iFs.PrivatePath(privatePath));
+
+	    RBuf firstBootMarkerFilePath;
+		firstBootMarkerFilePath.CreateL(KMaxPath);
+	    CleanupClosePushL(firstBootMarkerFilePath);
 
+	    TChar systemDrive = RFs::GetSystemDriveChar();
+	    firstBootMarkerFilePath.Format(KFirstBootMarkerFilePath, static_cast<TUint>(systemDrive), &privatePath, driveChar); 
+	        
+	    // Create drive format marker path.
+	    _LIT(KFormatMarkerPath, "%c:\\sys\\install\\formatMarkerFile");
+	    
+		RBuf formatMarkerPath;
+		formatMarkerPath.CreateL(KMaxPath);
+	    CleanupClosePushL(formatMarkerPath);
+		formatMarkerPath.Format(KFormatMarkerPath, driveChar); 
+	       
+		// The drive marker files are marked hidden and read-only.
+        TUint fileAttributes = KEntryAttReadOnly | KEntryAttHidden;
+
+	    if(!SisRegistryUtil::FileExistsL(iFs, firstBootMarkerFilePath))
+	        {
+	        // First boot detected. Add the first boot marker file as well as the format marker on the drive.
+	        SisRegistryUtil::CreateFileWithAttributesL(iFs, firstBootMarkerFilePath);
+	        TRAPD(err,SisRegistryUtil::CreateFileWithAttributesL(iFs, formatMarkerPath, fileAttributes);)
+			if (err != KErrNone && err != KErrAlreadyExists)
+				{
+				User::Leave(err);
+				}   
+	        }
+	    else
+	        {
+	        // Subsequent boot. Check for the presence of a marker file <drive>\sys\install directory.
+	        // If absent, assume format.
+	        if(!SisRegistryUtil::FileExistsL(iFs, formatMarkerPath))
+	            {
+	            DriveFormatDetectedL(TDriveUnit(addedDrive));
+	            //Add missing format marker file
+	            SisRegistryUtil::CreateFileWithAttributesL(iFs, formatMarkerPath, fileAttributes);
+	            }           
+	        }
+		CleanupStack::PopAndDestroy(3, &privatePath);
+	    }
+	    
 	// Find flagging controllers for non-preinstalled packages on
 	// this drive and do cleanup if necessary
-	ProcessRemovableDriveL(drive);
+	ProcessRemovableDriveL(addedDrive);
 
 	aMessage.Complete(KErrNone);
 	}
@@ -1094,33 +1362,32 @@
 	
 	aMessage.ReadL(EIpcArgument0, executableSid);
 
-	// componentId and index of the first matching Sid in CompSID<index> array gets populated 
-	// by call to GetCompIdAndCompSidIndexL().The value of index is redundant here.
-	TComponentId componentId = 0;
-	TInt index = 0;
-	GetCompIdAndCompSidIndexL(sid, componentId, index);
+	// Retrieve the component Id's list for the Sid.
+	RArray<TComponentId> componentIdList;
+	CleanupClosePushL(componentIdList);
 	
-	if(componentId == KErrNotFound)
+	GetComponentIdsForSidL(sid, componentIdList);
+	
+	if(componentIdList.Count() == 0)
 		{
 		User::Leave(KErrNotFound);
 		}
 		
 	CSisRegistryPackage *package = NULL;
-	ScrHelperUtil::ReadFromScrL(iScrSession, componentId, package);
+	ScrHelperUtil::ReadFromScrL(iScrSession, componentIdList[0], package);
 	CleanupStack::PushL(package);
 	
 	DEBUG_PRINTF5(_L("Sis Registry Server - SID 0x%08x is owned by package UID: 0x%08x, Name: %S, Vendor: %S."),
 		sid.iUid, package->Uid().iUid, &(package->Name()), &(package->Vendor()));
 	
 	SisRegistryUtil::SendDataL(aMessage, *package, EIpcArgument1);
-	CleanupStack::PopAndDestroy(package);
+	CleanupStack::PopAndDestroy(2, &componentIdList);
 	
 	}
 
 void CSisRegistrySession::RequestSidToFileNameL(const RMessage2& aMessage)
 	{
 	TInt thirdParameter; 
-	TDriveUnit expectedDrive;
 	TUid sid;
 	TPckg<TUid> fileSid(sid);
 
@@ -1133,19 +1400,13 @@
 
 	// Obtain the componentId and array index of CompSID<index> custom property matching a given aSid.
 	TComponentId componentId = 0;
-	TInt index = 0;
-	GetCompIdAndCompSidIndexL(sid, componentId, index, thirdParameter);
+	HBufC* fileName = SidToFileNameL(sid, componentId, thirdParameter);
 	
 	if(componentId == KErrNotFound)
 		{
 		User::Leave(KErrNotFound);
 		}
-
-  	// retrieve the CompSidFileName property value , based on the index obtained.
-  	TBuf<KSmlBufferSize> compSidFileName(KEmptyString);
-  	compSidFileName.Format(KCompSidFileNameFormat, index);
-		
-	HBufC* fileName = GetStrPropertyValueL(iScrSession, componentId, compSidFileName);
+	
 	CleanupStack::PushL(fileName);
 	DEBUG_PRINTF3(_L("Sis Registry Server - SID 0x%08x maps to file '%S'."),
 		sid.iUid, fileName);
@@ -1222,8 +1483,8 @@
 	TPckgC<Usif::TComponentId> componentIdPckg(componentId);
 	aMessage.WriteL(EIpcArgument1, componentIdPckg);
 	aMessage.Complete(KErrNone);
-	}
-	
+	}	
+
 void CSisRegistrySession::RequestHashL(const RMessage2& aMessage)
 	{
 	// get file name
@@ -1280,17 +1541,18 @@
 	aMessage.ReadL(EIpcArgument0, uid);
 	
 	TBool isPresent = EFalse;
-	TComponentId componentId = 0;
-	TInt index = 0;
+	RArray<TComponentId> componentIdList;
+	CleanupClosePushL(componentIdList);
 	
-	// If the supplied SID is present in SCR, then a call to GetCompIdAndCompSidIndexL succeeds.
-	// Else the componenetId will result in KErrNotFound.	
-	GetCompIdAndCompSidIndexL(uid(), componentId, index);
-	if(componentId != KErrNotFound)
+	// If the supplied SID is present in SCR, then a call to GetComponentIdsForSidL succeeds.
+	// Else componentIdList would be empty.	
+	GetComponentIdsForSidL(uid(), componentIdList);
+	
+	if(componentIdList.Count() != 0)
 		{
 		isPresent = ETrue;
 		}
-
+	CleanupStack::PopAndDestroy(&componentIdList);
 	DEBUG_CODE_SECTION(
 		if (isPresent)
 			{
@@ -1381,6 +1643,16 @@
 	aMessage.Complete(KErrNone);
 	}
 
+void CSisRegistrySession::SetComponentPresenceL(const RMessage2& aMessage)
+    {
+    TPckgBuf<Usif::TComponentId> componentId;
+    TPckgBuf<TBool> componentPresence;
+    aMessage.ReadL(EIpcArgument0, componentId, 0);
+    aMessage.ReadL(EIpcArgument1, componentPresence, 0);
+    iScrSession.SetIsComponentPresentL(componentId(), componentPresence());
+    aMessage.Complete(KErrNone);
+    }
+
 // Helper methods
 
 TBool CSisRegistrySession::IsRegisteredL(const TUid& aUid)
@@ -1440,6 +1712,13 @@
 	return ScrHelperUtil::IsUidAndNamePresentL(iScrSession, aUid, aPackageName);
 	}
 
+
+void CSisRegistrySession::RemoveEntryL(const TComponentId aCompId)
+    {
+    iScrSession.DeleteApplicationEntriesL(aCompId);
+    iScrSession.DeleteComponentL(aCompId);
+    }
+
 void CSisRegistrySession::RemoveEntryL(const CSisRegistryPackage& aPackage)
 	{
 	DEBUG_PRINTF4(_L("Sis Registry Server - Removing the entry from Software Component Registry of package : UID: 0x%08x, Name: %S, Vendor: %S ."),
@@ -1454,8 +1733,8 @@
 			aPackage.Uid().iUid, &aPackage.Name(), &aPackage.Vendor());
 		User::Leave(KErrNotFound);
 		}
-
-	iScrSession.DeleteComponentL(compId);
+	
+	RemoveEntryL(compId);
 	}
 
 void CSisRegistrySession::RemoveCleanupInfrastructureL(const CSisRegistryObject& aObject, RStsSession& aStsSession)
@@ -1628,12 +1907,79 @@
 	// Store the SIS Registry Object in to the Software Component Registry.
 	TComponentId compId = 0;
 	ScrHelperUtil::AddComponentL(iScrSession, compId, aObject, aOpType);
+	
+	
+	
 	// Set SCOMO state to activated - when SWI Registry supports de-activation, should be changed accordingly
 	iScrSession.SetScomoStateL(compId, EActivated);
 	
 	return compId;
 	}
 	
+void CSisRegistrySession::AddAppsFromStubL(TComponentId aCompId, const TDesC& aFileName)
+    {
+    RPointerArray<HBufC> romFiles;
+    CleanupResetAndDestroy<RPointerArray<HBufC> >::PushL(romFiles);
+    GetStubFilesL(aFileName, romFiles);
+    RPointerArray<HBufC> apparcRegFiles;
+    CleanupResetAndDestroy<RPointerArray<HBufC> >::PushL(apparcRegFiles);
+       
+    for(TInt i=0; i< romFiles.Count(); i++)
+        {
+        TInt ret = romFiles[i]->Match(KApparcRegFileNameFormat);
+        
+        TBuf<100> fileName(*romFiles[i]);
+        if (KErrNotFound != ret)
+            {
+            HBufC* file = romFiles[i]->AllocL();
+            apparcRegFiles.Append(file);
+            }
+        }
+             
+	const TInt appCount = apparcRegFiles.Count();
+	if (appCount)
+		{
+		RSisLauncherSession launcher;
+		CleanupClosePushL(launcher);
+		User::LeaveIfError(launcher.Connect());
+		RFs fs;
+		CleanupClosePushL(fs);
+		User::LeaveIfError(fs.Connect());
+		User::LeaveIfError(fs.ShareProtected());
+		RArray<TLanguage> appLanguages;
+		CleanupClosePushL(appLanguages);
+		appLanguages.AppendL(User::Language());
+    
+		for (TInt i=0; i<appCount; ++i)
+			{
+			TInt bufLen = apparcRegFiles[i]->Size();
+			HBufC* buf = HBufC::NewLC(bufLen);
+			TPtr appFile = buf->Des();
+			appFile.Format(_L("%S"), apparcRegFiles[i]);
+			appFile.Replace(0, 1, _L("z"));
+			
+			RFile file;
+			CleanupClosePushL(file);
+			User::LeaveIfError(file.Open(fs, appFile, EFileRead));
+			Usif::CApplicationRegistrationData* appRegData  = launcher.SyncParseResourceFileL(file, appLanguages);
+			CleanupStack::PushL(appRegData);
+			
+			TRAPD(err, ScrHelperUtil::AddApplicationEntryL(iScrSession, aCompId, *appRegData));
+			if (err == KErrAlreadyExists)
+                {
+                // Delete the existing application entry, which is not associated with any package 
+                ScrHelperUtil::DeleteApplicationEntryL(iScrSession, appRegData->AppUid());
+                ScrHelperUtil::AddApplicationEntryL(iScrSession, aCompId, *appRegData);
+                }
+			
+			CleanupStack::PopAndDestroy(appRegData);
+			CleanupStack::PopAndDestroy(2, buf);
+			}
+		CleanupStack::PopAndDestroy(3, &launcher); 
+		}
+	CleanupStack::PopAndDestroy(2, &romFiles);        
+    }
+
 void CSisRegistrySession::AddControllerL(const CSisRegistryObject& aObject, 
 							RStsSession& aStsSession, const TDesC8& aBuffer, const TInt aDrive)		
 	{
@@ -2097,66 +2443,91 @@
 	CleanupStack::PopAndDestroy(&entryList);
 	}
 
-void CSisRegistrySession::GetCompIdAndCompSidIndexL(const TUid& aSid, TComponentId& aComponentId, TInt& aIndex, TInt aExpectedDrive)
-	{
+void CSisRegistrySession::GetComponentIdsForSidL(TUid aSid, RArray<TComponentId>& aComponentIds)
+	{   
+    _LIT(KComponentSidPropertyRegex, "CompSid%");
 	CComponentFilter* componentFilter = CComponentFilter::NewLC();
 	componentFilter->SetSoftwareTypeL(KSoftwareTypeNative);	
-	componentFilter->AddPropertyL(KCompSidsPresent, 1);
-		
-	// Retrieve the componentId of all the components with SIDs from the SCR.
-	RArray<TComponentId> componentIdList;
-	CleanupClosePushL(componentIdList);
-	iScrSession.GetComponentIdsL(componentIdList, componentFilter);
-		
-	TInt componentCount = componentIdList.Count();
-	RArray<TUid> sidArray;
-	CleanupClosePushL(sidArray);
-	TBool sidMatchFound = EFalse;
-
-	for(TInt i = 0; i < componentCount && !sidMatchFound; ++i)
-		{
-		TComponentId componentId = componentIdList[i];
-		sidArray.Reset();
-		ScrHelperUtil::InternalizeSidArrayL(iScrSession, componentId, sidArray);
-		
-		// index of the first matching SID in the array.
-		aIndex = sidArray.Find(aSid);	
-		if(aIndex == KErrNotFound)
-			continue;
+	componentFilter->AddPropertyL(KComponentSidPropertyRegex, static_cast<TUint>(aSid.iUid), CComponentFilter::ELike, CComponentFilter::EEqual);		
+	
+	// Retrieve all component Id's 
+	iScrSession.GetComponentIdsL(aComponentIds, componentFilter);
+	
+	CleanupStack::PopAndDestroy(componentFilter);
+	}
+	
 
-		// If the search is narrowed to a particular drive, get the file name and check whether it matches the drive
-		if (aExpectedDrive != -1)
-			{
-			TBuf<KSmlBufferSize> compSidFileName(KEmptyString);
-			compSidFileName.Format(KCompSidFileNameFormat, aIndex);
+HBufC* CSisRegistrySession::SidToFileNameL(TUid aSid, TComponentId& aComponentId, TInt aExpectedDrive)
+    {    
+    aComponentId = KErrNotFound;
+    RArray<TComponentId> componentIdList;
+    CleanupClosePushL(componentIdList);
+    
+    // Retrieve the component Id's.
+    GetComponentIdsForSidL(aSid, componentIdList);
+    
+    if(componentIdList.Count() == 0)
+        {
+        CleanupStack::PopAndDestroy(&componentIdList);
+        return NULL;
+        }
+    
+    RArray<TUid> sidArray;
+    CleanupClosePushL(sidArray);
+    TInt index(0);
+    TBuf<KSmlBufferSize> compSidFileName(KEmptyString);
+    HBufC* fileName = NULL;
+    
+    
+    if(aExpectedDrive == -1)
+        {
+        // No drive specified, just return the first component Id and the corresponding Sid index.  
+        aComponentId = componentIdList[0];
+        sidArray.Reset();
+        ScrHelperUtil::InternalizeSidArrayL(iScrSession, aComponentId, sidArray);
+        index = sidArray.Find(aSid);   
+        compSidFileName.Format(KCompSidFileNameFormat, index);   
+        fileName = GetStrPropertyValueL(iScrSession, aComponentId, compSidFileName); 
+        }
+    else
+        {
+        // If the search is narrowed to a particular drive, get the file name and check whether it matches the drive
+    
+        for(TInt i=0; i<componentIdList.Count(); ++i)
+            {
+            sidArray.Reset();
+            ScrHelperUtil::InternalizeSidArrayL(iScrSession, componentIdList[i], sidArray);
+            index = sidArray.Find(aSid);
+            
+            compSidFileName.Format(KCompSidFileNameFormat, index); 
+            fileName = GetStrPropertyValueL(iScrSession, componentIdList[i], compSidFileName);   
+			CleanupStack::PushL(fileName);
+          
+            if (fileName->Length() == 0)
+                {
+				 CleanupStack::PopAndDestroy(fileName);
+                 fileName = NULL;
+                 continue;
+                }
+            
+            TInt drive; 
+            User::LeaveIfError(RFs::CharToDrive((*fileName)[0], drive));
+            if(drive != aExpectedDrive)
+                {
+                CleanupStack::PopAndDestroy(fileName);
+                fileName = NULL;
+                continue;
+                }        
+            
+            //Expected drive found !
+            aComponentId = componentIdList[i];
+			CleanupStack::Pop(fileName);
+            break;
+            }     
+        } 	
+	CleanupStack::PopAndDestroy(2, &componentIdList);	
+	return fileName; // Ownership with caller.
 			
-			HBufC* fileName = GetStrPropertyValueL(iScrSession, componentId, compSidFileName);
-			CleanupStack::PushL(fileName);			
-			if (fileName->Length() == 0)
-				{
-				CleanupStack::PopAndDestroy(fileName);
-				continue;
-				}
-			TInt drive; 
- 			User::LeaveIfError(RFs::CharToDrive((*fileName)[0], drive));
- 			if(drive != aExpectedDrive)
- 				{
-				CleanupStack::PopAndDestroy(fileName);
- 				continue;
- 				}			
-			CleanupStack::PopAndDestroy(fileName);
-			}
-			
-		aComponentId = componentId;
-		sidMatchFound = ETrue;
-		}
-	
-	CleanupStack::PopAndDestroy(3, componentFilter); // componentIdList and sidArray.
-	if(!sidMatchFound)
-		{
-		// No component contains aSid.
-		aComponentId = KErrNotFound;
-		}
 	}
 
 TBool CSisRegistrySession::ModifiableL(const TDesC& aFileName)
@@ -2337,12 +2708,11 @@
 	TBool overwriteRegEntry = EFalse;
 	
     TBool isStubRegistered = IsRegisteredL(object->Uid(), object->Name());
-    if ( isFwUpdated && isStubRegistered )
+    if ( iIsFirstInit && isStubRegistered )
 	    {
 		TComponentId compId = ScrHelperUtil::GetComponentIdL(iScrSession, object->Uid(), object->Index());
 		TSisPackageTrust trustStatus;
 		trustStatus = static_cast<TSisPackageTrust>(GetIntPropertyValueL(iScrSession, compId, KCompTrust,  EFalse, KDefaultTrustValue));
-		//ScrHelperUtil::ReadFromScrL(iSession.ScrSession(), iComponentId, trustStatus);
 	    if ( ESisPackageBuiltIntoRom == trustStatus )
 	        {
             DEBUG_PRINTF2(_L8("Sis Registry Server - Attempting to delete registry entry 0x%08x as a firmware update detected"), object->Uid().iUid);
@@ -2350,16 +2720,9 @@
             // If the component being removed has registered software types, unregister them now.
             // This operation deletes MIME types mapping from AppArc and therefore is not transactional.
             UnregisterSoftwareTypesL(compId);
-
-            CSisRegistryObject* object = CSisRegistryObject::NewLC();
-            ScrHelperUtil::GetComponentL(iScrSession, compId, *object);
+                
+            RemoveEntryL(compId);           
 
-            DEBUG_PRINTF4(_L("Sis Registry Server - Removing package registry entry for UID: %08x, Name: %S, Vendor %S."),
-                object->Uid().iUid, &(object->Name()), &(object->Vendor()));
-                
-            RemoveEntryL(*object);           
-
-            CleanupStack::PopAndDestroy();
             overwriteRegEntry = ETrue;
 	        }
 	    }
@@ -2368,7 +2731,8 @@
 	if ( !isStubRegistered || overwriteRegEntry )
 		{
 		// update cache or just call refresh
-		AddEntryL(*object, Usif::EScrCompHidden); // EScrCompHidden is supplied not to create any log for the ROM controller on the SCR side.
+		TComponentId compId = AddEntryL(*object, Usif::EScrCompHidden); // EScrCompHidden is supplied not to create any log for the ROM controller on the SCR side.
+		AddAppsFromStubL(compId, aFileName);
 		
 		// store a copy of the controller
 		HBufC* name = SisRegistryUtil::BuildControllerFileNameLC(object->Uid(), object->Index(),
@@ -2634,27 +2998,562 @@
 
 void CSisRegistrySession::UpdateRecentFWVersionL()
     {
-        //Write a cache of the ROM version to a separate stream
-        //Build the filename for the cache file
-        TChar sysDrive = RFs::GetSystemDriveChar();
-        TInt maxSizeofFileName = KROMVersionStringCacheDir().Length() + KROMVersionStringCacheFileName().Length() + 1;
-        RBuf romVersionCacheFileName;
-        romVersionCacheFileName.CreateL(maxSizeofFileName);
-        romVersionCacheFileName.CleanupClosePushL();
-        romVersionCacheFileName.Append(sysDrive);
-        romVersionCacheFileName.Append(KROMVersionStringCacheDir());
-        romVersionCacheFileName.Append(KROMVersionStringCacheFileName());
+    //Write a cache of the ROM version to a separate stream
+    //Build the filename for the cache file
+    TChar sysDrive = RFs::GetSystemDriveChar();
+    TInt maxSizeofFileName = KROMVersionStringCacheDir().Length() + KROMVersionStringCacheFileName().Length() + 1;
+    RBuf romVersionCacheFileName;
+    romVersionCacheFileName.CreateL(maxSizeofFileName);
+    romVersionCacheFileName.CleanupClosePushL();
+    romVersionCacheFileName.Append(sysDrive);
+    romVersionCacheFileName.Append(KROMVersionStringCacheDir());
+    romVersionCacheFileName.Append(KROMVersionStringCacheFileName());
+    
+    iFs.MkDirAll(romVersionCacheFileName);
+    //Read the length & value from it, if any.
+    RFileWriteStream romVerStream;
+    User::LeaveIfError(romVerStream.Replace(iFs,romVersionCacheFileName,EFileWrite));
+    CleanupClosePushL(romVerStream);
+    TBuf<KInfoBufLength> version;
+    GetSWVersion(version);
+
+    // Write even if SysUtil returns err since all conditions are taken care during restore.
+    romVerStream.WriteUint32L(version.Length());
+    romVerStream.WriteL(version);
+    CleanupStack::PopAndDestroy(2); //romVerStream, romVersionCacheFileName
+    }
+
+void CSisRegistrySession::AppRegInfoEntryL(const RMessage2& aMessage)
+    {
+    Usif::TComponentId componentId = aMessage.Int0();
+
+	RIpcReadStream stream;
+	CleanupClosePushL(stream);
+	stream.Open(aMessage, 1);
+	CApplicationRegistrationData *applicationData = CApplicationRegistrationData::NewL(stream);
+	CleanupStack::PopAndDestroy(&stream);
+	CleanupStack::PushL(applicationData);
+
+    TRAPD(err, ScrHelperUtil::AddApplicationEntryL(iScrSession, componentId, *applicationData));
+    if (err == KErrAlreadyExists)
+        {
+        //Delete the existing application
+        ScrHelperUtil::DeleteApplicationEntryL(iScrSession, applicationData->AppUid());
+        err = KErrNone;
+        TRAP(err, ScrHelperUtil::AddApplicationEntryL(iScrSession, componentId, *applicationData));
+        }
+    aMessage.Complete(err);
+    CleanupStack::PopAndDestroy(applicationData);
+    }
+
+void CSisRegistrySession::GetComponentIdForPackageL(const RMessage2& aMessage)
+    {
+    Usif::TComponentId componentId(0);
+    TInt strLen = aMessage.GetDesLengthL(EIpcArgument0);
+    HBufC* packageName = HBufC::NewLC(strLen);
+    TPtr pkgname = packageName->Des();
+    aMessage.ReadL(EIpcArgument0, pkgname, 0);
+    
+    strLen = aMessage.GetDesLengthL(EIpcArgument1);
+    HBufC* vendorName = HBufC::NewLC(strLen);
+    TPtr vndrname = vendorName->Des();
+    aMessage.ReadL(EIpcArgument1, vndrname, 0);
+    componentId = ScrHelperUtil::GetComponentIdL(iScrSession, *packageName, *vendorName);
+    if (!componentId)
+        {
+        DEBUG_PRINTF2(_L8("Sis Registry Server - Component id for package Name %S was not found."), packageName);
+        User::Leave(KErrNotFound);
+        } 
+    CleanupStack::PopAndDestroy(2, packageName); //vendorName
+    TPckgC<Usif::TComponentId> componentIdPckg(componentId);
+    aMessage.WriteL(EIpcArgument2, componentIdPckg);
+    aMessage.Complete(KErrNone);
+    }
+
+void CSisRegistrySession::GetAppUidsForComponentL(const RMessage2& aMessage)
+    {
+    Usif::TComponentId compId;
+    TPckg<Usif::TComponentId> componentId(compId);
+    RArray<TUid> appUids;
+    CleanupClosePushL(appUids);
+    aMessage.ReadL(EIpcArgument0, componentId);
+    iScrSession.GetAppUidsForComponentL(compId, appUids);        
+    SisRegistryUtil::SendDataArrayL(aMessage, appUids, EIpcArgument1);        
+    CleanupStack::PopAndDestroy(&appUids);
+    }
+
+void CSisRegistrySession::GetComponentIdsForUidL(const RMessage2& aMessage)
+    {
+    TUid Uid;
+    TPckg<TUid> pkgUid(Uid);
+    aMessage.ReadL(EIpcArgument0, pkgUid);
+    
+    // Setup a filter based on the input parameters
+    Usif::CComponentFilter* compFilter = Usif::CComponentFilter::NewLC();
+    compFilter->AddPropertyL(KCompUid, Uid.iUid);   
+    compFilter->SetSoftwareTypeL(Usif::KSoftwareTypeNative);    
+    RArray<Usif::TComponentId> componentIdList;
+    CleanupClosePushL(componentIdList);
+    iScrSession.GetComponentIdsL(componentIdList, compFilter);    
+    if(componentIdList.Count() == 0)
+        {
+        // No components are found in the SCR. So, return false
+        CleanupStack::PopAndDestroy(2, compFilter); // componentIdList
+        DEBUG_PRINTF2(_L8("Sis Registry Server - Unable to find component for UID: %x"), Uid.iUid);  
+        SisRegistryUtil::SendDataArrayL(aMessage, componentIdList, EIpcArgument1);
+        return;
+        }
+    SisRegistryUtil::SendDataArrayL(aMessage, componentIdList, EIpcArgument1);        
+    CleanupStack::PopAndDestroy(2, compFilter);    
+    }
+
+void CSisRegistrySession::RegisterAllAppL(RBuf& aApparcRegFilePath)
+    {
+	CDir* dir;
+	TInt err = iFs.GetDir(aApparcRegFilePath, KEntryAttMatchExclude | KEntryAttDir, ESortNone, dir);	
+	DEBUG_PRINTF3(_L("Sis Registry Server - Reading apparc registration file directory(%S) returned %d."), &aApparcRegFilePath, err);
+	
+	if (err == KErrNone)
+		{
+		CleanupStack::PushL(dir);
+
+		TInt count(dir->Count());
+		RBuf appRegFileName;
+		appRegFileName.CreateL(KMaxFileName);
+		CleanupClosePushL(appRegFileName);
+		RSisLauncherSession launcher;
+		CleanupClosePushL(launcher);
+		User::LeaveIfError(launcher.Connect());
+		RFs fs;
+		CleanupClosePushL(fs);
+		User::LeaveIfError(fs.Connect());
+		User::LeaveIfError(fs.ShareProtected());
+		RArray<TLanguage> appLanguages;
+		CleanupClosePushL(appLanguages);
+		appLanguages.AppendL(User::Language());
+		for (TInt index = 0; index < count; ++index)
+			{
+			appRegFileName = TParsePtrC(aApparcRegFilePath).DriveAndPath();
+			appRegFileName.Append((*dir)[index].iName);
+			RFile file;
+			CleanupClosePushL(file);
+			User::LeaveIfError(file.Open(fs, appRegFileName, EFileRead));
+			
+			Usif::CApplicationRegistrationData* appRegData = NULL;			
+			TRAPD(result, appRegData = launcher.SyncParseResourceFileL(file, appLanguages));
+			if (result == KErrNone)
+			    {
+                CleanupStack::PushL(appRegData);
+                TComponentId compId = 0; // ROM application
+                TRAPD(res, ScrHelperUtil::AddApplicationEntryL(iScrSession, compId, *appRegData););
+                if (res != KErrNone)
+                    {
+                    // log it only, we cannot stop as the next might be ok
+                    DEBUG_PRINTF3(_L("Sis Registry Server - Failed to register in ROM application %S. Error code %d."), &appRegFileName, res);
+                    }
+                CleanupStack::PopAndDestroy(appRegData);
+			    }
+			else
+			    DEBUG_PRINTF2(_L8("Sis Registry Server - Parsing in ROM application . Error code %d."), result);
+			                
+			CleanupStack::PopAndDestroy(&file);
+			}
+
+		CleanupStack::PopAndDestroy(5, dir); // appRegFileName, launcher, fs, appLanguages
+		}
+	else if(err != KErrPathNotFound)
+		{
+		User::Leave(err);
+		}
+    }
+
+void CSisRegistrySession::DriveFormatDetectedL(TDriveUnit aDrive)
+    {
+    DEBUG_PRINTF2(_L("Sis Registry Server - Drive format detected for drive %d"), static_cast<TInt>(aDrive));
+    
+    Usif::RStsSession stsSession;
+    TInt64 transactionId = stsSession.CreateTransactionL();
+    CleanupClosePushL(stsSession);
+    
+	//Create SCR Transaction
+    iScrSession.CreateTransactionL();
+    
+    RArray<TComponentId> foundComponentIds;
+    CleanupClosePushL(foundComponentIds);
         
-        //Read the length & value from it, if any.
-        RFileWriteStream romVerStream;
-        User::LeaveIfError(romVerStream.Replace(iFs,romVersionCacheFileName,EFileWrite));
-        CleanupClosePushL(romVerStream);
-        TBuf<KInfoBufLength> version;
-        GetSWVersion(version);
+    TDriveList filterFormatDrive;
+    filterFormatDrive.FillZ(KMaxDrives);
+    filterFormatDrive[static_cast<TInt>(aDrive)] = 1;
+    
+    CComponentFilter* componentFilter = CComponentFilter::NewLC();
+    componentFilter->SetInstalledDrivesL(filterFormatDrive);
+        
+    iScrSession.GetComponentIdsL(foundComponentIds, componentFilter);
+    
+    TBool processRomDrive = EFalse;
+    for(TInt i=0; i < foundComponentIds.Count(); ++i)
+        {
+        CSisRegistryObject* object = CSisRegistryObject::NewLC();
+        ScrHelperUtil::GetComponentL(iScrSession, foundComponentIds[i], *object);
+        TUint installedDrives = object->Drives();
+            
+        if(installedDrives & (1 << aDrive))
+            {
+            if (!processRomDrive && 
+                    (object->InstallType() == Sis::EInstInstallation || object->InstallType() == Sis::EInstPartialUpgrade) &&
+                        SisRegistryUtil::RomBasedPackageL(object->Uid()))
+                {   
+                processRomDrive = ETrue;                   
+                }  
+                    
+            // Retrieve all the associated files.
+            RPointerArray<CSisRegistryFileDescription>& fileDescriptions = object->FileDescriptions();
+            _LIT(KHashPathFormat, "%c:\\sys\\hash\\%S");
+            for(TInt j=0; j<fileDescriptions.Count(); ++j)
+                {
+                const TDesC& targetPath = fileDescriptions[j]->Target();
+                        
+                // Get the drive on which the file is present.
+                TInt drive; 
+                User::LeaveIfError(RFs::CharToDrive(targetPath[0], drive));
+                        
+                // If the file is a binary ( present in \sys\bin), delete the corresponding hash present in 
+                // C:\sys\hash
+                        
+                if(KErrNotFound != targetPath.FindF(KBinPath))
+                    {
+                    // Retrieve the filename from the target path.
+                    TParsePtrC parser(targetPath);
+					HBufC* fileName = parser.NameAndExt().AllocLC();
+                    
+                    TChar systemDrive = RFs::GetSystemDriveChar();
+                    
+					// Create the hash file path.
+                    RBuf hashFilePath;
+                    hashFilePath.CreateL(KMaxPath);
+                    CleanupClosePushL(hashFilePath);
+                    hashFilePath.Format(KHashPathFormat, static_cast<TUint>(systemDrive), fileName);
+                            
+                    // Delete hash file.
+                    SisRegistryUtil::DeleteFile(iFs, hashFilePath); //Ignore return code.
+                    
+					CleanupStack::PopAndDestroy(2, fileName);
+					}
+                        
+                if(aDrive == TDriveUnit(drive))
+                    {
+                    // File does not exist on disk as the drive is assumed to have been formatted.
+                    continue;
+                    }
+                SisRegistryUtil::DeleteFile(iFs, targetPath); //Ignore return code.           
+                }
+                    
+            DeleteEntryL(*object, transactionId, EFalse);
+            CleanupStack::PopAndDestroy(object);
+            }
+        }
 
-        // Write even if SysUtil returns err since all conditions are taken care during restore.
-        romVerStream.WriteUint32L(version.Length());
-        romVerStream.WriteL(version);
-        CleanupStack::PopAndDestroy(2); //romVerStream, romVersionCacheFileName
+    if(processRomDrive)
+        {
+        // Re-add the ROM installed stub details to SCR (only those missing will be added)
+        ProcessRomDriveL();
+        }
+    
+    //Commit the changes.
+    stsSession.CommitL();
+    iScrSession.CommitTransactionL();
+
+    CleanupStack::PopAndDestroy(3, &stsSession);
     }
 
+void CSisRegistrySession::AddAppRegInfoL(const RMessage2& aMessage)
+    {   
+    //This API is for use during development/debug use only; not used in production software
+    
+    TUint regFileNameLen = aMessage.GetDesLengthL(EIpcArgument0);
+    HBufC* regFileName = HBufC::NewLC(regFileNameLen);
+    TPtr namePtr = regFileName->Des();
+    aMessage.ReadL(EIpcArgument0, namePtr);
+    
+    Usif::CApplicationRegistrationData* appRegData = NULL;
+    //Check if the file name passed is valid reg file or not , if valid then parse
+    TRAPD(result, ValidateAndParseAppRegFileL(*regFileName, appRegData, EFalse));
+    
+    if (result == KErrNone)
+        {
+        CleanupStack::PushL(appRegData);
+        TComponentId compId = 0; 
+        TUid appUid = appRegData->AppUid();
+        //Check if component exists for the appUid, if then append the app reg info to the same compId(base)        
+        TRAP_IGNORE(compId = iScrSession.GetComponentIdForAppL(appUid));
+        TRAPD(res, ScrHelperUtil::AddApplicationEntryL(iScrSession, compId, *appRegData));
+        if (res != KErrNone && res != KErrAlreadyExists )
+            {
+            DEBUG_PRINTF2(_L("Sis Registry Server - Failed to add app registration data of in the SCR . Error code %d."), res);
+            CleanupStack::PopAndDestroy(2, regFileName); //appRegData
+            aMessage.Complete(res);
+            return;
+            }        
+        else if (res == KErrAlreadyExists)
+            {   
+            // Delete the existing application entry, which is not associated with any package 
+            ScrHelperUtil::DeleteApplicationEntryL(iScrSession, appUid);            
+            ScrHelperUtil::AddApplicationEntryL(iScrSession, compId, *appRegData);
+            }
+        
+        //Notify Apparc of the new app
+        RSisLauncherSession launcher;
+        CleanupClosePushL(launcher);
+        User::LeaveIfError(launcher.Connect());
+        TAppUpdateInfo newAppInfo;
+        RArray<TAppUpdateInfo> affectedApps;    
+        CleanupClosePushL(affectedApps);
+        newAppInfo = TAppUpdateInfo(appUid, EAppInstalled);
+        affectedApps.AppendL(newAppInfo);
+        launcher.NotifyNewAppsL(affectedApps);
+        CleanupStack::PopAndDestroy(3, appRegData); // affectedApps, launcher
+        }
+    else
+        {
+        DEBUG_PRINTF2(_L8("Sis Registry Server - Parsing application registration info. Error code %d."), result);
+        }
+    
+    CleanupStack::PopAndDestroy(regFileName);
+    aMessage.Complete(result);
+    }
+
+void CSisRegistrySession::RemoveAppRegInfoL(const RMessage2& aMessage)
+    {
+    //This API is for use during development/debug use only; not used in production software
+    
+    TUint regFileNameLen = aMessage.GetDesLengthL(EIpcArgument0);
+    HBufC* regFileName = HBufC::NewLC(regFileNameLen);
+    TPtr namePtr = regFileName->Des();
+    aMessage.ReadL(EIpcArgument0, namePtr);
+    
+    Usif::CApplicationRegistrationData* appRegData = NULL;
+    // Check if the file name passed is valid reg file or not , if valid then parse it
+    TRAPD(result, ValidateAndParseAppRegFileL(*regFileName, appRegData, EFalse));
+    
+    if(result == KErrNone)
+        {
+        TUid appUid = appRegData->AppUid();
+        delete appRegData;
+        appRegData = NULL;
+    
+        // Check if component exists for the appUid
+        TComponentId compId(0);
+        TRAPD(err,compId = iScrSession.GetComponentIdForAppL(appUid));
+        
+        // Check if appUid(reg file data to be removed) is registered with scr 
+        if(err != KErrNone)
+            {
+            DEBUG_PRINTF2(_L8("Sis Registry Server -Reg file (%S) not registered with scr"), &regFileName);
+            User::Leave(KErrNotFound);
+            }
+        
+        TBool isAppReRegistered(ETrue);
+        if(compId == 0)                                   // If component Id is 0 i.e. for in-rom *_reg.rsc files(without stub association) or inserted using AddAppRegInfoL().
+            {                        
+            TDriveUnit romDrive(SisRegistryUtil::SystemRomDrive());
+            RBuf romRegFilesPath;
+            CleanupClosePushL(romRegFilesPath);
+            romRegFilesPath.CreateL(romDrive.Name(), KMaxPath);            
+            romRegFilesPath.Append(KApparcRegFilePath);
+           
+            /* Scan the reg files in apparc's pvt folder's in rom, and compare their app uid with the uid of the reg file to be removed, 
+             * if found register the reg file present in rom replacing the existing app
+             */
+            TRAPD(err, ReRegisterAppRegFileL(romRegFilesPath, appUid));
+            CleanupStack::PopAndDestroy(&romRegFilesPath);
+                        
+            if(err == KErrNotFound)                       //If reg file is not found, search it in under "\\private\\10003a3f\\import\\apps\\*.rsc" path
+                {
+                RBuf romRegImportFilesPath;
+                CleanupClosePushL(romRegImportFilesPath);
+                romRegImportFilesPath.CreateL(romDrive.Name(), KMaxPath);                
+                romRegImportFilesPath.Append(KApparcRegFileImportPath);
+                err = 0; 
+                TRAP(err, ReRegisterAppRegFileL(romRegImportFilesPath,appUid));
+                CleanupStack::PopAndDestroy(&romRegImportFilesPath);
+                }
+            
+            if(err == KErrNotFound)                       // Since _reg.rsc file doesn't exists in rom and it is registered in scr, remove it                        
+                {
+                // Delete the existing application entry, which is not associated with any package 
+                ScrHelperUtil::DeleteApplicationEntryL(iScrSession, appUid); 
+                isAppReRegistered = EFalse;
+                }   
+            
+            else if(err != KErrNone && err != KErrNotFound)     
+                {
+                DEBUG_PRINTF2(_L8("Sis Registry Server - Error in removing reg file (%S)"), &regFileName);
+                User::Leave(err);
+                }                                            
+            }
+        else           // else if compId is not 0 i.e. either appUid is associated with stub in rom or any other package in other drive
+            {            
+            CSisRegistryObject* object = CSisRegistryObject::NewLC();
+            ScrHelperUtil::GetComponentL(iScrSession, compId, *object);            
+            if (object->InRom())            // If its a rom based pkg which has not been eclipsed then we can go back to the stubs
+                {   
+                RemoveEntryL(compId);
+                // Re-add the ROM installed stub details to SCR (only those missing will be added)
+                ProcessRomDriveL();
+                }    
+            else
+                {
+                // Delete the existing application entry, which is not associated with any package 
+                ScrHelperUtil::DeleteApplicationEntryL(iScrSession, appUid);
+                // Register the reg files of the applications, only the unregistered reg file data will be added(the association of reg file with stub will be lost) 
+                ProcessApplicationsL();
+                }
+            CleanupStack::PopAndDestroy(object);
+            }
+        
+        //Notify Apparc of the app being removed      
+        RSisLauncherSession launcher;
+        CleanupClosePushL(launcher);
+        User::LeaveIfError(launcher.Connect());
+        RArray<TAppUpdateInfo> affectedApps; 
+        CleanupClosePushL(affectedApps);
+        TAppUpdateInfo newAppInfo;
+        if(isAppReRegistered)       // If App reg data in rom is registerted again(i.e overwrites the existing one) we notify apparc of Installed app else Uninstalled app
+            {
+            newAppInfo = TAppUpdateInfo(appUid, EAppInstalled);
+            }
+        else
+            {
+            newAppInfo = TAppUpdateInfo(appUid, EAppUninstalled);
+            }
+        affectedApps.AppendL(newAppInfo);        
+        launcher.NotifyNewAppsL(affectedApps);
+        CleanupStack::PopAndDestroy(2, &launcher); // affectedApps        
+        }
+    else
+        {
+        DEBUG_PRINTF2(_L8("Sis Registry Server - Parsing application registration info. Error code %d."), result);
+        }
+    CleanupStack::PopAndDestroy(regFileName);
+    aMessage.Complete(result);
+    }
+
+void CSisRegistrySession::ValidateAndParseAppRegFileL(const TDesC& aRegFileName, Usif::CApplicationRegistrationData*& aAppRegData,TBool aInternal)
+    {
+    
+    TParsePtrC filename(aRegFileName);
+    if(!aInternal)                               //check if called for API and regFile path is "\\private\\10003a3f\\import\\apps\\"
+        {
+        if (filename.Path().Left(KApparcRegImportDir().Length()).CompareF(KApparcRegImportDir) != 0)
+            {
+            User::Leave(KErrNotSupported);
+            }
+        }
+    
+    RFs fs;
+    CleanupClosePushL(fs);
+    User::LeaveIfError(fs.Connect());
+    User::LeaveIfError(fs.ShareProtected());
+    RFile file;
+    CleanupClosePushL(file);
+    User::LeaveIfError(file.Open(fs, aRegFileName, EFileRead));
+    
+    // Reading the TUidType information fron the reg rsc file header
+    TBuf8<sizeof(TCheckedUid)> uidBuf;
+    TInt err = file.Read(0, uidBuf, sizeof(TCheckedUid));
+    if (err != KErrNone)
+        {
+        CleanupStack::PopAndDestroy(2, &fs);  //file
+        User::Leave(KErrNotSupported);
+        }
+    
+    if(uidBuf.Size() != sizeof(TCheckedUid))
+        {
+        DEBUG_PRINTF(_L("The file is not a valid registration resource file"));
+        CleanupStack::PopAndDestroy(2, &fs);  // file
+        User::Leave(KErrNotSupported);
+        }
+    TCheckedUid uid(uidBuf);
+    
+    //check the uid of the reg file to be parsed 
+    if(!(uid.UidType()[1] == KUidAppRegistrationFile))
+        {
+        CleanupStack::PopAndDestroy(2, &fs);  //file
+        User::Leave(KErrNotSupported);
+        }
+    
+    RSisLauncherSession launcher;
+    CleanupClosePushL(launcher);
+    User::LeaveIfError(launcher.Connect());
+    RArray<TLanguage> appLanguages;
+    CleanupClosePushL(appLanguages);
+    appLanguages.AppendL(User::Language());         
+    aAppRegData = launcher.SyncParseResourceFileL(file, appLanguages);
+    CleanupStack::PopAndDestroy(4, &fs);  //appLanguages, launcher, file
+    }
+
+void CSisRegistrySession::ReRegisterAppRegFileL(const TDesC& aRegFileDrivePath, const TUid& aAppUid)
+    {
+    /* 
+     * Reads and parses the *_reg.rsc files in the aRegFileDrivePath path and compare uid of each with the aAppUid, if matched remove the existing i.e. aAppUid
+     * and register the one found in the path.
+     */
+    
+    // open the directory
+    CDir* dir;
+    TInt err = iFs.GetDir(aRegFileDrivePath, KEntryAttMatchExclude | KEntryAttDir, ESortNone, dir);
+    
+    if (err == KErrNone)
+        {
+        CleanupStack::PushL(dir);
+        TInt count(dir->Count());
+        TBool foundAndReplaced(EFalse);
+        // scan through all the *_reg.rsc files
+        for (TInt index = 0; index < count; ++index)
+            {
+            RBuf regResourceFileName;
+            CleanupClosePushL(regResourceFileName);
+            regResourceFileName.CreateL(KMaxFileName);            
+            //construct the app reg file present in rom
+            regResourceFileName = TParsePtrC(aRegFileDrivePath).DriveAndPath();
+            regResourceFileName.Append((*dir)[index].iName);
+           //validate and parse the app reg file
+            Usif::CApplicationRegistrationData* appRegData = NULL;
+            TRAPD(res,ValidateAndParseAppRegFileL(regResourceFileName, appRegData, ETrue));
+            CleanupStack::PopAndDestroy(&regResourceFileName); 
+            CleanupStack::PushL(appRegData);
+            
+            if(res != KErrNone)
+                {
+                // log it only, we cannot stop as the next might be ok
+                DEBUG_PRINTF2(_L8("Sis Registry Server - Failed to register in ROM controller. Error code %d."), res); 
+                CleanupStack::Pop(appRegData);
+                continue;
+                }
+            
+            /* If appuid of the current processing reg file is same as of the reg file to be removed, delete existing app reg data and 
+             * add the reg entry of _reg.rsc file currently processed.
+             */
+            if(aAppUid == appRegData->AppUid())
+                {                        
+                TComponentId compId(0);
+                // Delete the existing application entry, which is not associated with any package 
+                ScrHelperUtil::DeleteApplicationEntryL(iScrSession, aAppUid); 
+                ScrHelperUtil::AddApplicationEntryL(iScrSession, compId, *appRegData);    
+                CleanupStack::PopAndDestroy(appRegData);
+                foundAndReplaced = ETrue;
+                break;
+                }    
+            CleanupStack::PopAndDestroy(appRegData); 
+            }
+        if(!foundAndReplaced)
+            {
+            User::Leave(KErrNotFound);
+            }
+        CleanupStack::PopAndDestroy(dir); 
+        }
+    else
+    	{
+    	User::Leave(KErrNotFound);
+    	}
+    }