persistentstorage/centralrepository/cenrepsrv/srvrepos_noc.cpp
changeset 55 44f437012c90
parent 40 b8bdbc8f59c7
--- a/persistentstorage/centralrepository/cenrepsrv/srvrepos_noc.cpp	Mon Sep 27 11:59:56 2010 +0100
+++ b/persistentstorage/centralrepository/cenrepsrv/srvrepos_noc.cpp	Tue Oct 19 16:26:13 2010 +0100
@@ -1,4 +1,4 @@
-// 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 "Eclipse Public License v1.0"
@@ -53,6 +53,13 @@
         }
 	}
 
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+TInt8 CServerRepository::KeyspaceType()
+    {
+    return iRepository->iSimRep->KeyspaceType();
+    }
+#endif
+
 void CServerRepository::Close()
 	{
 	iRepository = NULL;
@@ -223,6 +230,14 @@
 
 TInt CServerRepository::ResetL(TUint32 aId)
 	{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC 
+	// A protected repository should never be modified during a reset.   
+    if ( ( iRepository->iSimRep->KeyspaceType() ) == EPMAKeyspace )
+        {
+        return KErrNotSupported;
+        }
+#endif    
+   
 	// not yet supported in transactions
 	ASSERT(!IsInTransaction());
 
@@ -415,7 +430,7 @@
 					    User::LeaveNoMemory();
 					    }
 				      else
-					    {//Dont stop processing the rest of the persisted repositories becos one has a problem.
+					    {// Dont stop processing the rest of the persisted repositories because one has a problem.
 					     __CENTREP_TRACE1("CENTREP: CServerRepository::ProcessPersistsRepositoriesL - Error = %d", err);
 					    }
 				      }
@@ -433,6 +448,11 @@
 
 TInt CServerRepository::RFSRepositoryL()
 	{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC 
+	// A protected repository should never be modified during RFS.
+    ASSERT( ( iRepository->iSimRep->KeyspaceType() ) != EPMAKeyspace );
+#endif
+    
 	// for each key in combined ROM/Install restore
 	TUid uid = iRepository->Uid();
 
@@ -535,6 +555,11 @@
 	
 TInt CServerRepository::HandleReflashofRepositoryL()
 	{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+    // A protected repository should not reach this point, due to an earlier check. 
+    __ASSERT_DEBUG( ( iRepository->iSimRep->KeyspaceType() ) == ENonPMAKeyspace, User::Invariant() );
+#endif
+
 	// for each key in persists repository
 	TUid uid = iRepository->Uid();
 
@@ -589,6 +614,14 @@
 
 TInt CServerRepository::ResetAllL()
 	{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC    
+	// A protected repository should never be modified during a reset.
+    if ( ( iRepository->iSimRep->KeyspaceType() ) == EPMAKeyspace )
+        {
+        return KErrNotSupported;
+        }
+#endif  
+
 	// not yet supported in transactions
 	ASSERT(!IsInTransaction());
 	// fail all sessions' transactions first
@@ -651,13 +684,36 @@
 void CServerRepository::HandleSWIUpdateL(TUid aUid, TTime aModified, CSessionNotifier &aNotifier)
 	{		
 	// A file create or update has just occurred in the SWI directory. 
-	// Need to check if this is a new install. 
+
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC    
+    // A protected repository should never be modified during SWI.
+	if ( TServerResources::iPMADriveRepositories.FindInOrder( aUid, TLinearOrder<TUid>(TServerResources::CompareUids) ) != KErrNotFound )
+	    {
+        TServerResources::DeleteCentrepFileL(aUid, EInstall, EIni);
+	    TServerResources::DeleteCentrepFileL(aUid, EInstall, ECre);
+        User::Leave(KErrNotSupported);
+	    }
+#endif
 	
+	// Need to check if this is an update to an existing repository.
 	if(TServerResources::PersistsFileExistsL(aUid) ||
 	   TServerResources::RomFileExistsL(aUid))
 		{	
-		// Create a rep using the ROM or persists file
+		// Create a repository using the ROM or persists file.
 		OpenL(aUid, aNotifier);
+		
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+        // Although unlikely, we need to check incase there is a protected
+		// repository in the ROM, but not in the protected area. 
+        if ( ( iRepository->iSimRep->KeyspaceType() ) == EPMAKeyspace )
+            {
+            Close();
+            TServerResources::DeleteCentrepFileL(aUid, EInstall, EIni);
+            TServerResources::DeleteCentrepFileL(aUid, EInstall, ECre);
+            User::Leave(KErrNotSupported);
+            }
+#endif
+		
 		if(iRepository->IsTransactionActive())			
 			{
 			// Fail transactions on any currently open session
@@ -666,6 +722,9 @@
 			
 		// Create install rep for merging
  		CSharedRepository *installRep = 0;
+ 		
+ 		// If the repository in the install directory is marked as 'protected',
+ 		//  it will be deleted and KErrNotSupported will be returned.
  		TRAPD( err, TServerResources::iObserver->LoadRepositoryLC(aUid, ETrue, installRep, CIniFileIn::EInstallOnly); CleanupStack::Pop(installRep) );
 	
 		if (err == KErrNone)
@@ -680,10 +739,16 @@
         Close();
         User::LeaveIfError(err);
 		}
-	else	// No ROM or persists
+	else	// No ROM or persists repository, installing a new repository.
 		{
-		// Create install rep for persisting
+		// Create install repository for persisting. If the repository in the
+	    // install directory is marked as 'protected', it will be deleted and
+	    // return KErrNotSupported. As protected repositories can installed 
+		// during software install.
 		OpenL(aUid, aNotifier);
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+		__ASSERT_DEBUG(iRepository->iSimRep->KeyspaceType() != EPMAKeyspace, User::Invariant());
+#endif
 		TRAPD(err, iRepository->CommitChangesL());
 	    Close();
 	    User::LeaveIfError(err);
@@ -693,7 +758,13 @@
 
 // Handle install directory file delete 
 void CServerRepository::HandleSWIDeleteL(TUid aUid, CSessionNotifier &aNotifier)
-	{			
+	{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+    // Protected repository files can not be installed, so there should never be
+    // anything to uninstall. 
+    __ASSERT_DEBUG( (TServerResources::iPMADriveRepositories.FindInOrder( aUid, TLinearOrder<TUid>(TServerResources::CompareUids) ) == KErrNotFound), User::Invariant() );
+#endif
+
 	// A file delete has just occurred in the SWI directory. If there is no ROM file
 	// this is a complete uninstall, so delete persists file.Otherwise, do downgrade
 	// merge.
@@ -708,7 +779,7 @@
 			return;
 			}
 			
-		// Create a rep using the persists file
+		// Create a repository using the persists file.
 		OpenL(aUid, aNotifier);
 		if(iRepository->IsTransactionActive())			
 			{
@@ -716,13 +787,20 @@
 			iRepository->FailAllTransactions(NULL);
 			}
 		
-		// Create ROM rep for merging
+		// Create a ROM repository for merging.
 	 	CSharedRepository *romRep = 0;
 		TRAPD( err, TServerResources::iObserver->LoadRepositoryLC(aUid, ETrue, romRep, CIniFileIn::ERomOnly); CleanupStack::Pop(romRep) );
-
+		
 		if (err == KErrNone)
-		    {
-            // Perform merge
+		    {    
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+            // Need to check incase it is a protected repository.
+            if ( romRep->iSimRep->KeyspaceType() == EPMAKeyspace )
+                {
+                User::Leave(KErrNotSupported);
+                }
+#endif  
+            // Perform merge of the persists and ROM repositories.
             TRAP( err, iRepository->HandleDeleteMergeL(*romRep) );
 		    }
 		if (romRep!=NULL)
@@ -1008,10 +1086,18 @@
 void CServerRepository::BackupInstallRepositoryL(TUid aUid, CStreamStore& aStore, TStreamId& aSettingStreamId)
 	{
 	TServerResources::iObserver->LoadRepositoryLC(aUid, EFalse, iRepository, CIniFileIn::EInstallOnly);
-	iUid = aUid;
-	StoreRepositorySettingValuesL(aStore, aSettingStreamId);	
-	CleanupStack::PopAndDestroy(iRepository);
-	iRepository = NULL;
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+	// Protected repositories should not be part of Backup and Restore.
+    if (iRepository->iSimRep->KeyspaceType() != EPMAKeyspace)
+        {
+#endif
+        iUid = aUid;
+        StoreRepositorySettingValuesL(aStore, aSettingStreamId);  
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+        }  
+#endif
+        CleanupStack::PopAndDestroy(iRepository);
+        iRepository = NULL;
 	}
 
 TInt CServerRepository::CheckAccessPolicyBeforeMoving(const TClientRequest& aMessage, const TServerSetting* aSourceSetting,