cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,754 +1,755 @@
-/*
-* Copyright (c) 2005-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: 
-*
-*/
-
-
-
-
-/**
- @file
-*/
-
-#include "t_unifiedcertstoreremove.h"
-#include "t_certstoredefs.h"
-#include "t_input.h"
-#include "t_certstoreout.h"
-#include <ccertattributefilter.h>
-
-
-/////////////////////////////////////////////////////////////////////////////////
-//CDeleteCertificate
-/////////////////////////////////////////////////////////////////////////////////
-
-
-CTestAction* CDeleteCertificate::NewL(RFs& aFs,
-										CConsoleBase& aConsole, 
-										Output& aOut,
-										const TTestActionSpec& aTestActionSpec)
-	{
-	CDeleteCertificate* self = new(ELeave) CDeleteCertificate(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CDeleteCertificate::CDeleteCertificate(RFs& aFs, CConsoleBase& aConsole, 
-									   Output& aOut)
-: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle),iCertDeleteType(NULL)
-	{
-	}
-
-void CDeleteCertificate::PerformAction(TRequestStatus& aStatus)
-	{
-	if (aStatus != KErrNone)
-		{
-		iState = EFinished;
-		}
-	
-	switch (iState)
-		{
-		case EIdle:
-			//get the certs
-			if (iCertInfos.Count() > 0)
-				{
-				iCertInfos.Close();	//	JCS added for multiple delete case
-				}
-
-			iState = EGettingCerts;
-			//get the certs
-			GetCerts(aStatus);
-			break;
-			
-		case EGettingCerts:
-			{
- 			if (iNotificationSubscribed)
- 				{
- 				if (!iNotifier)
- 					{
-	 				iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
- 					iNotifier->StartNotification();			
- 					}
- 				iState = ECheckNotification;
- 				}
- 			else
- 				{
- 				iState = EFinished;
- 				}
-			DeleteCert(aStatus);
-			}
-			break;
-
- 		case ECheckNotification:
- 			{
- 			TInt ret=KErrNone;
- 			if (!iNotifierFlag)
- 				{
- 				ret=KErrGeneral;
- 				}
- 			iState = EFinished;
- 			TRequestStatus* status = &aStatus;
- 			User::RequestComplete(status, ret);
- 			}
- 			break;
-			
-		case EFinished:
-			{
-			if (aStatus == iExpectedResult)
-				{
-				iResult = ETrue;
-				}
-			else
-				{
-				iResult = EFalse;
-				}
-			if (aStatus == KErrNoMemory)
-				{	
-				iState = EIdle;
-				}
-			else
-				{
-				iFinished = ETrue;
-				}
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
-			}
-			break;
-			
-		default:
-			User::Invariant();
-		}
-	}
-
-void CDeleteCertificate::PerformCancel()
-	{
-	switch (iState)
-		{
-		case EGettingCerts:
-			CertStore().CancelList();
-			break;
-		case ECheckNotification:
-		case EIdle:
-		case EFinished:
-			// We /may/ be deleting a cert in these states - fortunately cancel is lenient
-			UnifiedCertStore().CancelRemove();
-			break;
-
-		default:
-			User::Invariant();
-		}
-	}
-
-void CDeleteCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CSubscriberAction::ConstructL(aTestActionSpec);
-
-	iFilter = CCertAttributeFilter::NewL();
-	TInt pos = 0;
-	TInt err1 = KErrNone;
-	
-	TPtrC8 pLabel1 = Input::ParseElement(aTestActionSpec.iActionBody, KCertTypeStart, KCertTypeEnd, pos, err1);
-	
-	if(err1 == KErrNone)
-		{
-		iCertDeleteType = HBufC8::NewL(pLabel1.Size());
-		*iCertDeleteType = pLabel1;
-		}
-		
-	pos=0;
-	TInt err2 = KErrNone;
-	TPtrC8 pLabel2 = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err2);
-	if (err2 != KErrNone)
-		{
-		User::Leave(err2);
-		}
-	
-	iCertLabel.Copy(pLabel2);
-	if (iCertLabel.Compare(_L("*.*"))==0)	//	delete all certs
-	{//	Check that the flag has been set
-		TPtrC8 pDeleteAll = Input::ParseElement(aTestActionSpec.iActionBody, KDeleteAllStart, KDeleteAllEnd, pos, err1);
-		if (pDeleteAll!=KNullDesC8)
-		{
-			TLex8 lexer(pDeleteAll);
-			TInt boolVal = 0;
-			lexer.Val(boolVal);
-			iDeleteAllCerts = (boolVal > 0) ? ETrue : EFalse;
-		}
-	}
-	else if( err1 != KErrNone && err1 != KErrNotFound)
-		{
-		User::Leave(err1);
-		}
-
-	// Set expected result
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-	}
-
-void CDeleteCertificate::GetCerts(TRequestStatus& aStatus)
-	{
-	CertStore().List(iCertInfos, *iFilter, aStatus);
-	}
-
-CDeleteCertificate::~CDeleteCertificate()
-	{
-	delete iCertDeleteType;
-	iCertInfos.Close();
-	delete iFilter;
-	}
-
-void CDeleteCertificate::DeleteCert(TRequestStatus& aStatus)
-	{
-	TInt ix = KErrNotFound;
-	TInt count = iCertInfos.Count();
-	for (TInt i = count-1; i >= 0 ; i--)
-		{
-		if (iDeleteAllCerts)
-			{//	Just delete the first one we come across
-			if (i>=0)					//	Still some certificates to delete
-				{							//	Set the state back to continue
-				iState = EIdle;	
-				}
-
-			ix = i;
-			break;
-			}
-		//	Only delete if there's a label match and the certificate is of specified type
-		else if (iCertInfos[i]->Label() == iCertLabel && CheckCertType(*iCertInfos[i]) )
-			{
-			ix = i;
-			break;
-			}
-		}
-	
-	TRequestStatus* status = &aStatus;
-	if (ix == KErrNotFound)
-		{
-		TInt result = KErrNone;
-		
-		if(iDeleteAllCerts) 
-			result = KErrNone; 
-		else if(iCertDeleteType == NULL)
-			result = KErrNotSupported;
-		else
-			result = KErrNotFound;
-		
-		User::RequestComplete(status, result);
-		}	
-	else
-		{
-		iCertInfoToDelete = iCertInfos[ix];
-		UnifiedCertStore().Remove(*iCertInfos[ix], aStatus);
-		}
-	}
-
-TBool CDeleteCertificate::CheckCertType( CCTCertInfo& aCertInfo )
-	{
-	if(iCertDeleteType == NULL)
-		return EFalse;
-	
-	TBool returnValue = EFalse;
-	switch(aCertInfo.CertificateOwnerType())
-		{
-		case ECACertificate:
-			if(iCertDeleteType->Compare(KCACert) == 0 )
-				returnValue = ETrue;
-			break;
-		case EUserCertificate:
-			if(iCertDeleteType->Compare(KUserCert) == 0 )
-				returnValue = ETrue;
-			break;
-		case EPeerCertificate:
-			if(iCertDeleteType->Compare(KPeerCert) == 0 )
-				returnValue = ETrue;
-			break;
-		}
-	return returnValue;
-	}
-
-void CDeleteCertificate::DoReportAction()
-	{
-	iOut.writeString(_L("Deleting certificate..."));
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tLabel = "));
-	iOut.writeString(iCertLabel);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-	}
-
-void CDeleteCertificate::DoCheckResult(TInt aError)
-	{
-	if (iFinished)
-		{
-		if (aError == KErrNone && iCertInfoToDelete)
-			{
-			switch (iCertInfoToDelete->CertificateOwnerType())
-				{
-			case ECACertificate:
-				iConsole.Write(_L("\tCA certificate deleted successfully\n"));
-				iOut.writeString(_L("\tCA certificate deleted successfully"));
-				break;
-
-			case EUserCertificate:
-				iConsole.Write(_L("\tUser certificate deleted successfully\n"));
-				iOut.writeString(_L("\tUser certificate deleted successfully"));
-				break;
-			
-			case EPeerCertificate:
-				iConsole.Write(_L("\tPeer certificate deleted successfully\n"));
-				iOut.writeString(_L("\tPeer certificate deleted successfully"));
-				break;
-			default:
-				iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
-				iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
-				break;
-				}
-			}
-		iOut.writeNewLine();
-		iOut.writeNewLine();
-		}
-	}
-
-void CDeleteCertificate::Reset()
-	{
-	iState = EIdle;
-	iCertInfos.Close();
-	}
-
-
-/////////////////////////////////////////////////////////////////////////////////
-//CDeleteRetrieveCertificate
-/////////////////////////////////////////////////////////////////////////////////
-CDeleteRetrieveCertificate::CDeleteRetrieveCertificate(RFs& aFs, CConsoleBase& aConsole, 
-													   Output& aOut)
-: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle)
-	{
-	}
-
-void CDeleteRetrieveCertificate::PerformAction(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	switch (iState)
-		{
-		case EIdle:
-			//get the certs
-			iState = EDeletingCert;
-			//get the certs
-			GetCerts(aStatus);
-			if (aStatus == KErrNoMemory)
-				{
-				iState = EFinished;
-				}
-			break;
-
-		case EDeletingCert:
-			{
- 			if (iNotificationSubscribed)
- 				{
- 				iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
- 				iNotifier->StartNotification();
- 				iState = ECheckNotification;
- 				}
- 			else
- 				{
- 				iState = EGettingCerts;
- 				}
-			//delete the cert
-			DeleteCert(aStatus);
-			break;
-			}
-
- 		case ECheckNotification:
- 			{
- 			TInt ret=KErrNone;
- 			if (!iNotifierFlag)
- 				{
- 				ret=KErrGeneral;
- 				}
- 			if (ret!=KErrNone)
- 				{
- 				iState = EFinished;	
- 				}
- 			else
- 				{
- 				iState = EGettingCerts;
- 				}
- 			TRequestStatus* status = &aStatus;
- 			User::RequestComplete(status, ret);
- 			}
- 			break;
-		case EGettingCerts:
-			{
-			iState = EFinished;
-			//get the cert
-			RetrieveCerts(aStatus);
-			break;
-			}
-		case EFinished:
-			{
-			if (aStatus == iExpectedResult)
-				{
-				iResult = ETrue;
-				}
-			else
-				{
-				iResult = EFalse;
-				}
-			if (aStatus == KErrNoMemory)
-				{	
-				iState = EIdle;
-				}
-			else
-				{
-				iFinished = ETrue;
-				}
-			User::RequestComplete(status, aStatus.Int());
-			}
-			break;
-		default:
-			{
-			//some kind of error behaviour
-			}
-		}
-	}
-
-void CDeleteRetrieveCertificate::PerformCancel()
-	{
-	}
-
-void CDeleteRetrieveCertificate::Reset()
-	{
-	__ASSERT_DEBUG(EFalse, User::Panic(_L("CDeleteRetrieveCertificate::Reset()"), 1));
-	}
-
-////////////////////////////////////////////////////////////////////////////////
-//CDeleteCACertificate
-//////////////////////////////////////////////////////////////////////////////////
-
-CTestAction* CDeleteRetrieveCACertificate::NewL(RFs& aFs,
-												CConsoleBase& aConsole, 
-												Output& aOut,
-												const TTestActionSpec& aTestActionSpec)
-	{
-	CDeleteRetrieveCACertificate* self = 
-		new(ELeave) CDeleteRetrieveCACertificate(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CDeleteRetrieveCACertificate::CDeleteRetrieveCACertificate(RFs& aFs, CConsoleBase& aConsole, 
-														   Output& aOut)
-	:CDeleteRetrieveCertificate(aFs, aConsole, aOut)
-	{
-	}
-
-void CDeleteRetrieveCACertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CSubscriberAction::ConstructL(aTestActionSpec);
-	iCertlisted = new(ELeave) RPointerArray<HBufC8>;
-	iFilter = CCertAttributeFilter::NewL();
-	TInt pos = 0;
-	TInt err = KErrNone;
-	TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
-	if (err != KErrNone)
-		{
-		User::Leave(err);
-		}
-	iCertLabel.Copy(pLabel);
-
-	// Set expected result
-	pos = 0;
-	
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-	}
-
-void CDeleteRetrieveCACertificate::GetCerts(TRequestStatus& aStatus)
-	{
-	CertStore().List(iCertInfos, *iFilter, aStatus);
-	}
-
-void CDeleteRetrieveCACertificate::RetrieveCerts(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	TInt ix = KErrNotFound;
-	TInt count = iCertInfos.Count();
-	for (TInt i = 0; i < count; i++)
-		{
-		if (iCertInfos[i]->Label() == iCertLabel)
-			{
-			ix = i;
-			break;
-			}
-		}
-	if (ix == KErrNotFound)
-		{
-		User::RequestComplete(status, ix);
-		}	
-	else
-		{
-		iCertInfoToRetrieve = iCertInfos[ix];
-
-		HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
-		User::LeaveIfError(iCertlisted->Append(buf));
-		CleanupStack::Pop();//buf
-		__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
-		iBuf = new(ELeave) TPtr8(buf->Des());
-		CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
-		}
-	}
-
-CDeleteRetrieveCACertificate::~CDeleteRetrieveCACertificate()
-	{
-	iCertInfos.Close();
-	delete iFilter;
-	if (iCertlisted)
-		{
-		iCertlisted->ResetAndDestroy();
-		delete iCertlisted;
-		}
-	delete iBuf;
-	}
-	
-void CDeleteRetrieveCACertificate::DeleteCert(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	TInt ix = KErrNotFound;
-	TInt count = iCertInfos.Count();
-	for (TInt i = 0; i < count; i++)
-		{
-		if (iCertInfos[i]->Label() == iCertLabel)
-			{
-			ix = i;
-			break;
-			}
-		}
-	if (ix == KErrNotFound)
-		{
-		User::RequestComplete(status, ix);
-		}	
-	else
-		{
-		iCertInfoToDelete = iCertInfos[ix];
-		UnifiedCertStore().Remove(*iCertInfoToDelete, aStatus);
-		}
-	}
-
-void CDeleteRetrieveCACertificate::DoReportAction()
-	{
-	iOut.writeString(_L("Deleting certificate..."));
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tLabel = "));
-	iOut.writeString(iCertLabel);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-	}
-
-void CDeleteRetrieveCACertificate::DoCheckResult(TInt aError)
-	{
-	if (iFinished)
-		{
-		if (aError == KErrNone && iResult)
-			{
-			switch (iCertInfoToDelete->CertificateOwnerType())
-				{
-			case ECACertificate:
-				iConsole.Write(_L("\tCA certificate deleted successfully\n"));
-				iOut.writeString(_L("\tCA certificate deleted successfully"));
-				break;
-
-			case EUserCertificate:
-				iConsole.Write(_L("\tUser certificate deleted successfully\n"));
-				iOut.writeString(_L("\tUser certificate deleted successfully"));
-				break;
-
-			default:
-				iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
-				iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
-				break;
-				}
-			}
-		else
-			{
-			if (iResult)
-				{
-				iConsole.Write(_L("\tCA OK\n"));
-				iOut.writeString(_L("\tCA OK"));
-				}
-			}
-		iOut.writeNewLine();
-		iOut.writeNewLine();
-		}
-	}
-
-////////////////////////////////////////////////////////////////////////////////
-//CDeleteUserCertificate
-//////////////////////////////////////////////////////////////////////////////////
-CTestAction* CDeleteRetrieveUserCertificate::NewL(RFs& aFs, 
-												  CConsoleBase& aConsole,
-												  Output& aOut, 
-												  const TTestActionSpec& aTestActionSpec)
-	{
-	CDeleteRetrieveUserCertificate* self = 
-		new(ELeave) CDeleteRetrieveUserCertificate(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CDeleteRetrieveUserCertificate::CDeleteRetrieveUserCertificate(RFs& aFs, CConsoleBase& aConsole, 
-															   Output& aOut)
-	:CDeleteRetrieveCertificate(aFs, aConsole, aOut)
-	{
-	}
-
-void CDeleteRetrieveUserCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CSubscriberAction::ConstructL(aTestActionSpec);
-	iCertlisted = new(ELeave) RPointerArray<HBufC8>;
-	iFilter = CCertAttributeFilter::NewL();
-	TInt pos = 0;
-	TInt err = KErrNone;
-	TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
-	if (err != KErrNone)
-		{
-		User::Leave(err);
-		}
-	iCertLabel.Copy(pLabel);
-
-	// Set expected result
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-	}
-
-void CDeleteRetrieveUserCertificate::GetCerts(TRequestStatus& aStatus)
-	{
-	CertStore().List(iCertInfos, *iFilter, aStatus);
-	}
-
-void CDeleteRetrieveUserCertificate::RetrieveCerts(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	TInt ix = KErrNotFound;
-	TInt count = iCertInfos.Count();
-	for (TInt i = 0; i < count; i++)
-		{
-		if (iCertInfos[i]->Label() == iCertLabel)
-			{
-			ix = i;
-			break;
-			}
-		}
-	if (ix == KErrNotFound)
-		{
-		User::RequestComplete(status, ix);
-		}	
-	else
-		{
-		iCertInfoToRetrieve = iCertInfos[ix];
-
-		HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
-		User::LeaveIfError(iCertlisted->Append(buf));
-		CleanupStack::Pop();//buf
-		//__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
-		iBuf = new(ELeave) TPtr8(buf->Des());
-		CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
-		}
-	}
-
-CDeleteRetrieveUserCertificate::~CDeleteRetrieveUserCertificate()
-	{
-	iCertInfos.Close();
-	delete iFilter;
-	if (iCertlisted)
-		{
-		iCertlisted->ResetAndDestroy();
-		delete iCertlisted;
-		}
-	delete iBuf;
-	}
-	
-void CDeleteRetrieveUserCertificate::DeleteCert(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	TInt ix = KErrNotFound;
-	TInt count = iCertInfos.Count();
-	for (TInt i = 0; i < count; i++)
-		{
-		if (iCertInfos[i]->Label() == iCertLabel)
-			{
-			ix = i;
-			break;
-			}
-		}
-	if (ix == KErrNotFound)
-		{
-		User::RequestComplete(status, ix);
-		}	
-	else
-		{
-		CCTCertInfo* certInfo = iCertInfos[ix];
-		UnifiedCertStore().Remove(*certInfo, aStatus);
-		}
-	}
-
-void CDeleteRetrieveUserCertificate::DoReportAction()
-	{
-	iOut.writeString(_L("Deleting user certificate..."));
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tLabel = "));
-	iOut.writeString(iCertLabel);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-	}
-
-void CDeleteRetrieveUserCertificate::DoCheckResult(TInt aError)
-	{
-	if (iFinished)
-		{
-		if (aError == KErrNone && iResult)
-			{
-			iConsole.Write(_L("\tuser cert deleted successfully\n"));
-			iOut.writeString(_L("\tuser cert deleted successfully"));
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		else
-			{
-			if (iResult)
-				{
-				iConsole.Write(_L("\tnot retrieved but expected\n"));
-				iOut.writeString(_L("\tCA OK"));
-				}
-			else
-				{
-				iConsole.Write(_L("\tuser cert deleted successfully\n"));
-				iOut.writeString(_L("\tuser cert deleted successfully"));
-				iOut.writeNewLine();
-				iOut.writeNewLine();
-				}
-			}
-		}
-	}
+/*
+* Copyright (c) 2005-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: 
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "t_unifiedcertstoreremove.h"
+#include "t_certstoredefs.h"
+#include "t_input.h"
+#include "t_certstoreout.h"
+#include <ccertattributefilter.h>
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//CDeleteCertificate
+/////////////////////////////////////////////////////////////////////////////////
+
+
+CTestAction* CDeleteCertificate::NewL(RFs& aFs,
+										CConsoleBase& aConsole, 
+										Output& aOut,
+										const TTestActionSpec& aTestActionSpec)
+	{
+	CDeleteCertificate* self = new(ELeave) CDeleteCertificate(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDeleteCertificate::CDeleteCertificate(RFs& aFs, CConsoleBase& aConsole, 
+									   Output& aOut)
+: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle),iCertDeleteType(NULL)
+	{
+	}
+
+void CDeleteCertificate::PerformAction(TRequestStatus& aStatus)
+	{
+	if (aStatus != KErrNone)
+		{
+		iState = EFinished;
+		}
+	
+	switch (iState)
+		{
+		case EIdle:
+			//get the certs
+			if (iCertInfos.Count() > 0)
+				{
+				iCertInfos.Close();	//	JCS added for multiple delete case
+				}
+
+			iState = EGettingCerts;
+			//get the certs
+			GetCerts(aStatus);
+			break;
+			
+		case EGettingCerts:
+			{
+ 			if (iNotificationSubscribed)
+ 				{
+ 				if (!iNotifier)
+ 					{
+	 				iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
+ 					iNotifier->StartNotification();			
+ 					}
+ 				iState = ECheckNotification;
+ 				}
+ 			else
+ 				{
+ 				iState = EFinished;
+ 				}
+			DeleteCert(aStatus);
+			}
+			break;
+
+ 		case ECheckNotification:
+ 			{
+ 			iState = EFinished;
+ 			if (iNotifierFlag)
+	 			{
+ 				TRequestStatus* status = &aStatus;
+ 				User::RequestComplete(status, KErrNone);
+	 			}
+			else
+				{
+				iNotifier->SetCompleteStatus(&aStatus);
+				}			
+ 			}
+
+ 			break;
+
+		case EFinished:
+			{
+			if (aStatus == iExpectedResult)
+				{
+				iResult = ETrue;
+				}
+			else
+				{
+				iResult = EFalse;
+				}
+			if (aStatus == KErrNoMemory)
+				{	
+				iState = EIdle;
+				}
+			else
+				{
+				iFinished = ETrue;
+				}
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, aStatus.Int());
+			}
+			break;
+			
+		default:
+			User::Invariant();
+		}
+	}
+
+void CDeleteCertificate::PerformCancel()
+	{
+	switch (iState)
+		{
+		case EGettingCerts:
+			CertStore().CancelList();
+			break;
+		case ECheckNotification:
+		case EIdle:
+		case EFinished:
+			// We /may/ be deleting a cert in these states - fortunately cancel is lenient
+			UnifiedCertStore().CancelRemove();
+			break;
+
+		default:
+			User::Invariant();
+		}
+	}
+
+void CDeleteCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CSubscriberAction::ConstructL(aTestActionSpec);
+
+	iFilter = CCertAttributeFilter::NewL();
+	TInt pos = 0;
+	TInt err1 = KErrNone;
+	
+	TPtrC8 pLabel1 = Input::ParseElement(aTestActionSpec.iActionBody, KCertTypeStart, KCertTypeEnd, pos, err1);
+	
+	if(err1 == KErrNone)
+		{
+		iCertDeleteType = HBufC8::NewL(pLabel1.Size());
+		*iCertDeleteType = pLabel1;
+		}
+		
+	pos=0;
+	TInt err2 = KErrNone;
+	TPtrC8 pLabel2 = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err2);
+	if (err2 != KErrNone)
+		{
+		User::Leave(err2);
+		}
+	
+	iCertLabel.Copy(pLabel2);
+	if (iCertLabel.Compare(_L("*.*"))==0)	//	delete all certs
+	{//	Check that the flag has been set
+		TPtrC8 pDeleteAll = Input::ParseElement(aTestActionSpec.iActionBody, KDeleteAllStart, KDeleteAllEnd, pos, err1);
+		if (pDeleteAll!=KNullDesC8)
+		{
+			TLex8 lexer(pDeleteAll);
+			TInt boolVal = 0;
+			lexer.Val(boolVal);
+			iDeleteAllCerts = (boolVal > 0) ? ETrue : EFalse;
+		}
+	}
+	else if( err1 != KErrNone && err1 != KErrNotFound)
+		{
+		User::Leave(err1);
+		}
+
+	// Set expected result
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+	}
+
+void CDeleteCertificate::GetCerts(TRequestStatus& aStatus)
+	{
+	CertStore().List(iCertInfos, *iFilter, aStatus);
+	}
+
+CDeleteCertificate::~CDeleteCertificate()
+	{
+	delete iCertDeleteType;
+	iCertInfos.Close();
+	delete iFilter;
+	}
+
+void CDeleteCertificate::DeleteCert(TRequestStatus& aStatus)
+	{
+	TInt ix = KErrNotFound;
+	TInt count = iCertInfos.Count();
+	for (TInt i = count-1; i >= 0 ; i--)
+		{
+		if (iDeleteAllCerts)
+			{//	Just delete the first one we come across
+			if (i>=0)					//	Still some certificates to delete
+				{							//	Set the state back to continue
+				iState = EIdle;	
+				}
+
+			ix = i;
+			break;
+			}
+		//	Only delete if there's a label match and the certificate is of specified type
+		else if (iCertInfos[i]->Label() == iCertLabel && CheckCertType(*iCertInfos[i]) )
+			{
+			ix = i;
+			break;
+			}
+		}
+	
+	TRequestStatus* status = &aStatus;
+	if (ix == KErrNotFound)
+		{
+		TInt result = KErrNone;
+		
+		if(iDeleteAllCerts) 
+			result = KErrNone; 
+		else if(iCertDeleteType == NULL)
+			result = KErrNotSupported;
+		else
+			result = KErrNotFound;
+		
+		User::RequestComplete(status, result);
+		}	
+	else
+		{
+		iCertInfoToDelete = iCertInfos[ix];
+		UnifiedCertStore().Remove(*iCertInfos[ix], aStatus);
+		}
+	}
+
+TBool CDeleteCertificate::CheckCertType( CCTCertInfo& aCertInfo )
+	{
+	if(iCertDeleteType == NULL)
+		return EFalse;
+	
+	TBool returnValue = EFalse;
+	switch(aCertInfo.CertificateOwnerType())
+		{
+		case ECACertificate:
+			if(iCertDeleteType->Compare(KCACert) == 0 )
+				returnValue = ETrue;
+			break;
+		case EUserCertificate:
+			if(iCertDeleteType->Compare(KUserCert) == 0 )
+				returnValue = ETrue;
+			break;
+		case EPeerCertificate:
+			if(iCertDeleteType->Compare(KPeerCert) == 0 )
+				returnValue = ETrue;
+			break;
+		}
+	return returnValue;
+	}
+
+void CDeleteCertificate::DoReportAction()
+	{
+	iOut.writeString(_L("Deleting certificate..."));
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tLabel = "));
+	iOut.writeString(iCertLabel);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+	}
+
+void CDeleteCertificate::DoCheckResult(TInt aError)
+	{
+	if (iFinished)
+		{
+		if (aError == KErrNone && iCertInfoToDelete)
+			{
+			switch (iCertInfoToDelete->CertificateOwnerType())
+				{
+			case ECACertificate:
+				iConsole.Write(_L("\tCA certificate deleted successfully\n"));
+				iOut.writeString(_L("\tCA certificate deleted successfully"));
+				break;
+
+			case EUserCertificate:
+				iConsole.Write(_L("\tUser certificate deleted successfully\n"));
+				iOut.writeString(_L("\tUser certificate deleted successfully"));
+				break;
+			
+			case EPeerCertificate:
+				iConsole.Write(_L("\tPeer certificate deleted successfully\n"));
+				iOut.writeString(_L("\tPeer certificate deleted successfully"));
+				break;
+			default:
+				iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
+				iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
+				break;
+				}
+			}
+		iOut.writeNewLine();
+		iOut.writeNewLine();
+		}
+	}
+
+void CDeleteCertificate::Reset()
+	{
+	iState = EIdle;
+	iCertInfos.Close();
+	}
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//CDeleteRetrieveCertificate
+/////////////////////////////////////////////////////////////////////////////////
+CDeleteRetrieveCertificate::CDeleteRetrieveCertificate(RFs& aFs, CConsoleBase& aConsole, 
+													   Output& aOut)
+: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle)
+	{
+	}
+
+void CDeleteRetrieveCertificate::PerformAction(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	switch (iState)
+		{
+		case EIdle:
+			//get the certs
+			iState = EDeletingCert;
+			//get the certs
+			GetCerts(aStatus);
+			if (aStatus == KErrNoMemory)
+				{
+				iState = EFinished;
+				}
+			break;
+
+		case EDeletingCert:
+			{
+ 			if (iNotificationSubscribed)
+ 				{
+ 				iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
+ 				iNotifier->StartNotification();
+ 				iState = ECheckNotification;
+ 				}
+ 			else
+ 				{
+ 				iState = EGettingCerts;
+ 				}
+			//delete the cert
+			DeleteCert(aStatus);
+			break;
+			}
+
+ 		case ECheckNotification:
+ 			{
+ 			TInt ret=KErrNone;
+ 			if (!iNotifierFlag)
+ 				{
+ 				ret=KErrGeneral;
+ 				}
+ 			if (ret!=KErrNone)
+ 				{
+ 				iState = EFinished;	
+ 				}
+ 			else
+ 				{
+ 				iState = EGettingCerts;
+ 				}
+ 			TRequestStatus* status = &aStatus;
+ 			User::RequestComplete(status, ret);
+ 			}
+ 			break;
+		case EGettingCerts:
+			{
+			iState = EFinished;
+			//get the cert
+			RetrieveCerts(aStatus);
+			break;
+			}
+		case EFinished:
+			{
+			if (aStatus == iExpectedResult)
+				{
+				iResult = ETrue;
+				}
+			else
+				{
+				iResult = EFalse;
+				}
+			if (aStatus == KErrNoMemory)
+				{	
+				iState = EIdle;
+				}
+			else
+				{
+				iFinished = ETrue;
+				}
+			User::RequestComplete(status, aStatus.Int());
+			}
+			break;
+		default:
+			{
+			//some kind of error behaviour
+			}
+		}
+	}
+
+void CDeleteRetrieveCertificate::PerformCancel()
+	{
+	}
+
+void CDeleteRetrieveCertificate::Reset()
+	{
+	__ASSERT_DEBUG(EFalse, User::Panic(_L("CDeleteRetrieveCertificate::Reset()"), 1));
+	}
+
+////////////////////////////////////////////////////////////////////////////////
+//CDeleteCACertificate
+//////////////////////////////////////////////////////////////////////////////////
+
+CTestAction* CDeleteRetrieveCACertificate::NewL(RFs& aFs,
+												CConsoleBase& aConsole, 
+												Output& aOut,
+												const TTestActionSpec& aTestActionSpec)
+	{
+	CDeleteRetrieveCACertificate* self = 
+		new(ELeave) CDeleteRetrieveCACertificate(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDeleteRetrieveCACertificate::CDeleteRetrieveCACertificate(RFs& aFs, CConsoleBase& aConsole, 
+														   Output& aOut)
+	:CDeleteRetrieveCertificate(aFs, aConsole, aOut)
+	{
+	}
+
+void CDeleteRetrieveCACertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CSubscriberAction::ConstructL(aTestActionSpec);
+	iCertlisted = new(ELeave) RPointerArray<HBufC8>;
+	iFilter = CCertAttributeFilter::NewL();
+	TInt pos = 0;
+	TInt err = KErrNone;
+	TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
+	if (err != KErrNone)
+		{
+		User::Leave(err);
+		}
+	iCertLabel.Copy(pLabel);
+
+	// Set expected result
+	pos = 0;
+	
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+	}
+
+void CDeleteRetrieveCACertificate::GetCerts(TRequestStatus& aStatus)
+	{
+	CertStore().List(iCertInfos, *iFilter, aStatus);
+	}
+
+void CDeleteRetrieveCACertificate::RetrieveCerts(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	TInt ix = KErrNotFound;
+	TInt count = iCertInfos.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iCertInfos[i]->Label() == iCertLabel)
+			{
+			ix = i;
+			break;
+			}
+		}
+	if (ix == KErrNotFound)
+		{
+		User::RequestComplete(status, ix);
+		}	
+	else
+		{
+		iCertInfoToRetrieve = iCertInfos[ix];
+
+		HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
+		User::LeaveIfError(iCertlisted->Append(buf));
+		CleanupStack::Pop();//buf
+		__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
+		iBuf = new(ELeave) TPtr8(buf->Des());
+		CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
+		}
+	}
+
+CDeleteRetrieveCACertificate::~CDeleteRetrieveCACertificate()
+	{
+	iCertInfos.Close();
+	delete iFilter;
+	if (iCertlisted)
+		{
+		iCertlisted->ResetAndDestroy();
+		delete iCertlisted;
+		}
+	delete iBuf;
+	}
+	
+void CDeleteRetrieveCACertificate::DeleteCert(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	TInt ix = KErrNotFound;
+	TInt count = iCertInfos.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iCertInfos[i]->Label() == iCertLabel)
+			{
+			ix = i;
+			break;
+			}
+		}
+	if (ix == KErrNotFound)
+		{
+		User::RequestComplete(status, ix);
+		}	
+	else
+		{
+		iCertInfoToDelete = iCertInfos[ix];
+		UnifiedCertStore().Remove(*iCertInfoToDelete, aStatus);
+		}
+	}
+
+void CDeleteRetrieveCACertificate::DoReportAction()
+	{
+	iOut.writeString(_L("Deleting certificate..."));
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tLabel = "));
+	iOut.writeString(iCertLabel);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+	}
+
+void CDeleteRetrieveCACertificate::DoCheckResult(TInt aError)
+	{
+	if (iFinished)
+		{
+		if (aError == KErrNone && iResult)
+			{
+			switch (iCertInfoToDelete->CertificateOwnerType())
+				{
+			case ECACertificate:
+				iConsole.Write(_L("\tCA certificate deleted successfully\n"));
+				iOut.writeString(_L("\tCA certificate deleted successfully"));
+				break;
+
+			case EUserCertificate:
+				iConsole.Write(_L("\tUser certificate deleted successfully\n"));
+				iOut.writeString(_L("\tUser certificate deleted successfully"));
+				break;
+
+			default:
+				iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
+				iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
+				break;
+				}
+			}
+		else
+			{
+			if (iResult)
+				{
+				iConsole.Write(_L("\tCA OK\n"));
+				iOut.writeString(_L("\tCA OK"));
+				}
+			}
+		iOut.writeNewLine();
+		iOut.writeNewLine();
+		}
+	}
+
+////////////////////////////////////////////////////////////////////////////////
+//CDeleteUserCertificate
+//////////////////////////////////////////////////////////////////////////////////
+CTestAction* CDeleteRetrieveUserCertificate::NewL(RFs& aFs, 
+												  CConsoleBase& aConsole,
+												  Output& aOut, 
+												  const TTestActionSpec& aTestActionSpec)
+	{
+	CDeleteRetrieveUserCertificate* self = 
+		new(ELeave) CDeleteRetrieveUserCertificate(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDeleteRetrieveUserCertificate::CDeleteRetrieveUserCertificate(RFs& aFs, CConsoleBase& aConsole, 
+															   Output& aOut)
+	:CDeleteRetrieveCertificate(aFs, aConsole, aOut)
+	{
+	}
+
+void CDeleteRetrieveUserCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CSubscriberAction::ConstructL(aTestActionSpec);
+	iCertlisted = new(ELeave) RPointerArray<HBufC8>;
+	iFilter = CCertAttributeFilter::NewL();
+	TInt pos = 0;
+	TInt err = KErrNone;
+	TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
+	if (err != KErrNone)
+		{
+		User::Leave(err);
+		}
+	iCertLabel.Copy(pLabel);
+
+	// Set expected result
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+	}
+
+void CDeleteRetrieveUserCertificate::GetCerts(TRequestStatus& aStatus)
+	{
+	CertStore().List(iCertInfos, *iFilter, aStatus);
+	}
+
+void CDeleteRetrieveUserCertificate::RetrieveCerts(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	TInt ix = KErrNotFound;
+	TInt count = iCertInfos.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iCertInfos[i]->Label() == iCertLabel)
+			{
+			ix = i;
+			break;
+			}
+		}
+	if (ix == KErrNotFound)
+		{
+		User::RequestComplete(status, ix);
+		}	
+	else
+		{
+		iCertInfoToRetrieve = iCertInfos[ix];
+
+		HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
+		User::LeaveIfError(iCertlisted->Append(buf));
+		CleanupStack::Pop();//buf
+		//__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
+		iBuf = new(ELeave) TPtr8(buf->Des());
+		CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
+		}
+	}
+
+CDeleteRetrieveUserCertificate::~CDeleteRetrieveUserCertificate()
+	{
+	iCertInfos.Close();
+	delete iFilter;
+	if (iCertlisted)
+		{
+		iCertlisted->ResetAndDestroy();
+		delete iCertlisted;
+		}
+	delete iBuf;
+	}
+	
+void CDeleteRetrieveUserCertificate::DeleteCert(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	TInt ix = KErrNotFound;
+	TInt count = iCertInfos.Count();
+	for (TInt i = 0; i < count; i++)
+		{
+		if (iCertInfos[i]->Label() == iCertLabel)
+			{
+			ix = i;
+			break;
+			}
+		}
+	if (ix == KErrNotFound)
+		{
+		User::RequestComplete(status, ix);
+		}	
+	else
+		{
+		CCTCertInfo* certInfo = iCertInfos[ix];
+		UnifiedCertStore().Remove(*certInfo, aStatus);
+		}
+	}
+
+void CDeleteRetrieveUserCertificate::DoReportAction()
+	{
+	iOut.writeString(_L("Deleting user certificate..."));
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tLabel = "));
+	iOut.writeString(iCertLabel);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+	}
+
+void CDeleteRetrieveUserCertificate::DoCheckResult(TInt aError)
+	{
+	if (iFinished)
+		{
+		if (aError == KErrNone && iResult)
+			{
+			iConsole.Write(_L("\tuser cert deleted successfully\n"));
+			iOut.writeString(_L("\tuser cert deleted successfully"));
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		else
+			{
+			if (iResult)
+				{
+				iConsole.Write(_L("\tnot retrieved but expected\n"));
+				iOut.writeString(_L("\tCA OK"));
+				}
+			else
+				{
+				iConsole.Write(_L("\tuser cert deleted successfully\n"));
+				iOut.writeString(_L("\tuser cert deleted successfully"));
+				iOut.writeNewLine();
+				iOut.writeNewLine();
+				}
+			}
+		}
+	}