authenticationservices/authenticationserver/test/reftestplugin/pinplugin/pinplugindb.cpp
changeset 102 deec7e509f66
parent 94 0e6c5a9328b5
child 108 ca9a0fc2f082
--- a/authenticationservices/authenticationserver/test/reftestplugin/pinplugin/pinplugindb.cpp	Thu Aug 19 11:18:56 2010 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-/*
-* Copyright (c) 2006-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: 
-* CPinPluginDB pin plugin data store implementation
-*
-*/
-
-
-/**
- @file 
-*/
-
-#include "pinplugindb.h"
-
-_LIT(KPluginStoreName, "plugin.store");
-_LIT(KFileDrive, "c:");
-
-using namespace AuthServer;
-
-CPinPluginDB* CPinPluginDB::NewL()
-	{
-	CPinPluginDB* self = CPinPluginDB::NewLC();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CPinPluginDB* CPinPluginDB::NewLC()
-	{
-	CPinPluginDB* self = new(ELeave) CPinPluginDB();
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	return self;
-	}
-	
-CPinPluginDB::CPinPluginDB() :
-	iRootStreamId(KNullStreamId),
-	iIdentityStreamId(KNullStreamId)
-	{
-	}
-
-CPinPluginDB::~CPinPluginDB()
-	{
-	if (iFileStore)
-		{
-		CompactStore();
-		delete iFileStore;
-		}
-
-	iFile.Close(); 
-	iFs.Close();
-
-	iId.Reset();
-	iId.Close();
-	iIdKeyHash.ResetAndDestroy();
-	iIdKeyHash.Close();
-	}
-	
-		
-void CPinPluginDB::ConstructL()
-	{
-	User::LeaveIfError(iFs.Connect());
-	
-	TFileName privatePath;
-	iFs.PrivatePath(privatePath);
-	iPluginDBName.Copy(KFileDrive);
-	iPluginDBName.Append(privatePath);
-	iPluginDBName.Append(KPluginStoreName);
-	OpenStoreL();
-	
-	ReadIdKeysFromStoreL();
-	}
-
-
-void CPinPluginDB::AddPinL(const TIdentityId& aId, const TDesC8& aIdentityKeyHash)
-	{
-	if(IdIndex(aId) == KErrNotFound && IsUniquePin(aIdentityKeyHash))
-		{
-		// Add the IdentityId to the array, rewrite the identitystream and 
-		// Only then commit the store
-		HBufC8* keyHash = aIdentityKeyHash.AllocLC();
-		TInt err = KErrNone;
-		iIdKeyHash.AppendL(keyHash);
-		err = iId.Append(aId);
-		if(err != KErrNone)
-			{
-			iIdKeyHash.Remove(iIdKeyHash.Count() - 1);
-			User::Leave(err);
-			}
-		TCleanupItem cleanupStore(RevertStore, iFileStore);
-		// write the idkeys to the store.
-		TRAP(err,
-			CleanupStack::PushL(cleanupStore);
-			WriteIdKeysToStoreL();
-			CleanupStack::Pop(iFileStore));
-
-		if (err != KErrNone)
-			{
-			iId.Remove(iId.Count() - 1);
-			iIdKeyHash.Remove(iIdKeyHash.Count() - 1);
-			User::Leave(err);
-			}
-		CleanupStack::Pop(keyHash); 
-		}
-	else
-		{
-		User::Leave(KErrAlreadyExists);
-		}
- 	}
-
-void CPinPluginDB::UpdatePinL(const TIdentityId& aId, const TDesC8& aIdentityKeyHash)
-	{
-	if(IdIndex(aId) != KErrNotFound)
-		{
-		// Get the index of the existing id and key hash
-		TInt index = IdIndex(aId);
-		TInt err = KErrNone;
-		HBufC8* keyHash = aIdentityKeyHash.AllocLC();
-		// delete the old keyHash and store the new keyHash to the index
-		delete iIdKeyHash[index];
-		iIdKeyHash[index] = keyHash;
-
-		TCleanupItem cleanupStore(RevertStore, iFileStore);
-		// write the idkeys to the store.
-		TRAP(err ,
-			CleanupStack::PushL(cleanupStore);
-			WriteIdKeysToStoreL();
-			CleanupStack::Pop(iFileStore));
-		if (err!= KErrNone)
-			{
-			CleanupStack::Pop(keyHash);
-			ReadIdKeysFromStoreL();
-			User::Leave(err);
-			}
-		CleanupStack::Pop(keyHash);
-		}
-	else
-		{
-		User::Leave(KErrNotFound);
-		}
-	}
-	
-void CPinPluginDB::RemovePinL(const TIdentityId& aId)
-	{
-	if(IdIndex(aId) != KErrNotFound)
-		{
-		TInt err = KErrNone;
-		TInt index = IdIndex(aId);
-
-		// Delete the IdentityId from the array, rewrite the identitystream and 
-	   	// Only then commit the store
-		delete iIdKeyHash[index];
-  		iIdKeyHash.Remove(index);
-   		iId.Remove(index);
- 
-		TCleanupItem cleanupStore(RevertStore, iFileStore);
-		// write the idkeys to the store.
-		TRAP(err, 
-			CleanupStack::PushL(cleanupStore);
-			WriteIdKeysToStoreL();
-			CleanupStack::Pop(iFileStore));
-		if(err != KErrNone)
-			{
-			ReadIdKeysFromStoreL();
-   			User::Leave(err);
-			}
-		}
-	else
-		{
-		User::Leave(KErrNotFound);
-		}
-	}
-	
-TBool CPinPluginDB::IsUniquePin(const TDesC8& aIdentityKeyHash) const
-	{
-	//	Check each iIdKeyHash in the store to determine if aIdentityId already exists
-	TInt count = iIdKeyHash.Count();
-	TBool isUnique = ETrue;
-	for (TInt index = 0; index < count; ++index)
-		{
-		if (aIdentityKeyHash.CompareF(*iIdKeyHash[index]) == 0)
-			{
-			isUnique = EFalse;
-			break;
-			}
-		}
-	return isUnique;
-	}
-	
-TInt CPinPluginDB::IdIndex(const TIdentityId& aId) const
-	{
-	TInt count = iId.Count();
-	for (TInt index = 0; index < count; ++index)
-		{
-		if (aId == iId[index])
-			{
-			return index;
-			}
-		}
-	return KErrNotFound;
-	}
-	
-TIdentityId CPinPluginDB::IdFromPin(const TDesC8& aIdentityKeyHash) const
-	{
-	TInt count = iIdKeyHash.Count();
-	for (TInt index = 0; index < count; ++index)
-		{
-		if (aIdentityKeyHash.CompareF(*iIdKeyHash[index]) == 0)
-			{
-			return iId[index];
-			}
-		}
-	return KUnknownIdentity;
-	}
-	
-void CPinPluginDB::OpenStoreL()
-	{
-	//	Tries to Open a plugin store file on the private path of the process. 
-	//	If it cannot find one, create a file with permanent file store
-	//	it should initialise iFileStore unless it cannot
-	//	create the file/store/streams
-	
-	TRAPD(result, OpenStoreInFileL(iPluginDBName));
-
-	if (result == KErrNotFound || result == KErrPathNotFound) 
-		{		
-		// Not yet opened a valid store, either no file to be found, or no valid
-		// store in it.
-		CreateStoreInFileL(iPluginDBName);
-		}
-	else if (result != KErrNone)
-		{
-		// DB gets corrupted or File may be in use. Abort startup.
-		User::Leave(result);
-		}
-	}
-
-
-void CPinPluginDB::CreateStoreInFileL(const TDesC& aFile)
-	{
-	TInt r = iFs.MkDirAll(aFile);
-	if ((r!=KErrNone) && (r!=KErrAlreadyExists))
-		{
-		User::Leave(r);
-		}
-	
-	delete iFileStore;
-	iFileStore = NULL;
-
-	iFileStore = CPermanentFileStore::ReplaceL(iFs, aFile, EFileRead | EFileWrite | EFileStream | EFileShareExclusive);
-	iFileStore->SetTypeL(KPermanentFileStoreLayoutUid);
-
-	TCleanupItem cleanupStore(RevertStore, iFileStore);
-	CleanupStack::PushL(cleanupStore);
-	
-	// Create Identity stream - Currently no Identity created, and no IdentityKeyHash
-	RStoreWriteStream identityStream;
-	iIdentityStreamId = identityStream.CreateLC(*iFileStore);
-	identityStream.WriteUint32L(KNullStreamId.Value()); //contains the id of dataStream
-	identityStream.WriteUint32L(0); // Write IdentityId count of zero
-	identityStream.CommitL();
-	CleanupStack::PopAndDestroy(&identityStream);
-
-	// Create root stream - just contains id of Identity stream
-	RStoreWriteStream rootStream;
-	iRootStreamId = rootStream.CreateLC(*iFileStore);
-	iFileStore->SetRootL(iRootStreamId);
-	rootStream.WriteUint32L(iIdentityStreamId.Value());		
-	rootStream.CommitL();
-	CleanupStack::PopAndDestroy(&rootStream);
-	
-	iFileStore->CommitL();
-	CleanupStack::Pop(iFileStore); 
-	}
-
-void CPinPluginDB::OpenStoreInFileL(const TDesC& aFile)
-	{
-	// Make sure the file isn't write protected
-	User::LeaveIfError(iFs.SetAtt(aFile, 0, KEntryAttReadOnly));
-	
-	User::LeaveIfError(iFile.Open(iFs, aFile, EFileRead | EFileWrite | EFileStream | EFileShareExclusive));
-	
-	delete iFileStore;
-	iFileStore = NULL;
-
-	iFileStore = CPermanentFileStore::FromL(iFile);		
-
-	// Get the root StreamId
-	iRootStreamId = iFileStore->Root();
-	if (iRootStreamId == KNullStreamId)
-		{
-		User::Leave(KErrCorrupt);
-		}
-	
-	RStoreReadStream rootStream;
-	rootStream.OpenLC(*iFileStore, iRootStreamId);
-	iIdentityStreamId = (TStreamId)(rootStream.ReadUint32L());
-	CleanupStack::PopAndDestroy(&rootStream);
-	}
-
-// Rewrites the Identity stream (ie the array of IdentityId) to the store
-void CPinPluginDB::WriteIdKeysToStoreL()
-	{
-	TInt count = iId.Count();
-	TInt hashCount = iIdKeyHash.Count();
-	if (count != hashCount)
-		{
-		User::Leave(KErrCorrupt);
-		}
-	
-	TStreamId dataStreamId = KNullStreamId;
-	if (count > 0)
-		{
-		RStoreWriteStream dataStream;
-		dataStreamId = dataStream.CreateLC(*iFileStore);
-		//write the Identity Id key to a data stream
-		for (TInt index = 0; index < count; ++index)
-			{
-			dataStream.WriteUint32L(iId[index]);
-			dataStream.WriteUint32L((*iIdKeyHash[index]).Length());
-			dataStream.WriteL(*iIdKeyHash[index]);
-			}
-		dataStream.CommitL();
-		CleanupStack::PopAndDestroy(&dataStream); 	
-		}
-	RStoreReadStream readStream;
-	readStream.OpenLC(*iFileStore, iIdentityStreamId);
-	TStreamId oldDataStreamId = (TStreamId)(readStream.ReadInt32L());
-	CleanupStack::PopAndDestroy(&readStream);
-		
-	iFileStore->DeleteL(oldDataStreamId);
-	
-	RStoreWriteStream writeStream;
-	writeStream.OpenLC(*iFileStore, iIdentityStreamId);
-	writeStream.WriteUint32L(dataStreamId.Value());
-	writeStream.WriteInt32L(count);
-	writeStream.CommitL();
-	CleanupStack::PopAndDestroy(&writeStream); 	
-	iFileStore->CommitL();
-	CompactStore();
-	}
-	
-void CPinPluginDB::ReadIdKeysFromStoreL()
-	{
-	iId.Reset();
-	iIdKeyHash.ResetAndDestroy();
-	
-	RStoreReadStream readStream;
-	readStream.OpenLC(*iFileStore, iIdentityStreamId);
-	TStreamId dataStreamId = (TStreamId)(readStream.ReadInt32L());
-	TInt count = readStream.ReadInt32L();
-	CleanupStack::PopAndDestroy(&readStream);
-	
-	if (count > 0)
-		{
-		RStoreReadStream dataStream;
-		dataStream.OpenLC(*iFileStore, dataStreamId);
-		for (TInt index = 0; index < count; ++index)
-			{
-			TIdentityId identityId = (TIdentityId)(dataStream.ReadInt32L());
-			iId.AppendL(identityId);
-			TInt length = dataStream.ReadInt32L();
-			HBufC8* idKeyHash = HBufC8::NewMaxLC(length);
-			TPtr8 idKeyHashPtr = idKeyHash->Des();
-			dataStream.ReadL(idKeyHashPtr, length);
-			iIdKeyHash.AppendL(idKeyHash);
-			CleanupStack::Pop(idKeyHash);
-			}
-		CleanupStack::PopAndDestroy(&dataStream);
-		}
-	}
-
-void CPinPluginDB::RevertStore(TAny* aStore)
-	{
-	CPermanentFileStore* store = reinterpret_cast<CPermanentFileStore*>(aStore);
-	TRAP_IGNORE(store->RevertL());
-	// We're ignoring the leave code from this becuase there's no way we can
-	// handle this sensibly.  This shouldn't be a problem in practice - this
-	// will leave if for example the file store is on removable which is
-	// unexpectedly remove, and this is never the case for us.
-	}
-
-
-void CPinPluginDB::CompactStore()
-	{
-	ASSERT(iFileStore);
-	TRAP_IGNORE(iFileStore->ReclaimL(); iFileStore->CompactL());
-	}
-
-
-
-