eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp
branchRCL_3
changeset 46 c74b3d9f6b9e
parent 45 bad0cc58d154
--- a/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp	Tue Aug 31 15:16:37 2010 +0300
+++ b/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp	Wed Sep 01 12:23:57 2010 +0100
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: %
+* %version: 31 %
 */
 
 // This is enumeration of EAPOL source code.
@@ -32,8 +32,7 @@
 
 #include "EapTlsPeapCertFetcher.h"
 #include <EapTlsPeapUiCertificates.h>
-#include <EapTraceSymbian.h>
-#include <AbsEapCertificateFetcher.h>
+#include "eap_am_trace_symbian.h"
 
 #include <x509cert.h>
 #include <X509CertNameParser.h>
@@ -42,11 +41,8 @@
 
 // ================= MEMBER FUNCTIONS =======================
 
-CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher* const aParent)
+CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CEapTlsPeapUiCertificates* const aParent)
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher)\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher)\n"));
-
 	CEapTlsPeapCertFetcher* self = new(ELeave) CEapTlsPeapCertFetcher(aParent);
 	CleanupStack::PushL(self);
 	self->ConstructL();
@@ -59,9 +55,6 @@
 // DON'T USE THIS FUNCTION. THIS IS ONLY FOR EapTlsPeapUtils. 	
 CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL()
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::NewL()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::NewL()\n"));
-
 	CEapTlsPeapCertFetcher* self = new(ELeave) CEapTlsPeapCertFetcher();
 	CleanupStack::PushL(self);
 
@@ -90,18 +83,12 @@
 
 //--------------------------------------------------
 
-CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher* const aParent)
+CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CEapTlsPeapUiCertificates* const aParent)
 : CActive(CActive::EPriorityStandard)
-, iState(EGetCertificatesNone)
 , iParent(aParent)
 , iEncodedCertificate(0)
 , iCertPtr(0,0)
-, iOwnertype(EUserCertificate)
-, iCertInfoIndex(0)
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher)\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher)\n"));
-
 }
 
 //--------------------------------------------------
@@ -109,25 +96,16 @@
 // DON'T USE THIS FUNCTION. THIS IS ONLY FOR EapTlsPeapUtils. 	
 CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()
 : CActive(CActive::EPriorityStandard)
-, iState(EGetCertificatesNone)
 , iParent(NULL)
 , iEncodedCertificate(0)
 , iCertPtr(0,0)
-, iOwnertype(EUserCertificate)
-, iCertInfoIndex(0)
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()\n"));
-
 }
 
 //--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::ConstructL()
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::ConstructL()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::ConstructL()\n"));
-
 	User::LeaveIfError(iFs.Connect());
 
 	CActiveScheduler::Add(this);
@@ -141,9 +119,6 @@
 
 CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()\n"));
-
 	// Delete iCertInfos
 	for (TInt i = 0; i < iCertInfos.Count(); i++)
 	{
@@ -151,19 +126,16 @@
 	}
 	iCertInfos.Reset();
 
-	iCACerts.ResetAndDestroy();
-
-	iUserCerts.ResetAndDestroy();
-
-	delete iCertFilter;
-	iCertFilter = 0;
+	iCACerts.Reset();
 
+	iUserCerts.Reset();
+		
+	delete iCertFilter;
+	
 	delete iCertStore;
-	iCertStore = 0;
-
-	delete iEncodedCertificate;
-	iEncodedCertificate = 0;
-
+	
+	delete iEncodedCertificate;	
+	
 	iFs.Close();
 
 	if(IsActive())
@@ -176,13 +148,6 @@
 
 void CEapTlsPeapCertFetcher::GetCertificatesL()
 {	
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::GetCertificatesL()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::GetCertificatesL()\n"));
-
-	iCACerts.ResetAndDestroy();
-
-	iUserCerts.ResetAndDestroy();
-
 	iState = EGetCertificatesInitStore;
 	if (iCertStore == 0)
 	{
@@ -197,145 +162,149 @@
 	SetActive();
 }
 
-//--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::DoCancel()
 {
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::DoCancel()\n")));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::DoCancel()\n"));
-
-}
-
-//--------------------------------------------------
-
-void CEapTlsPeapCertFetcher::InitializeQuery()
-{
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::InitializeQuery(): iOwnertype=%d\n"),
-		iOwnertype));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::InitializeQuery()\n"));
-
-	// Delete iCertInfos
-	for (TInt i = 0; i < iCertInfos.Count(); i++)
-	{
-		iCertInfos[i]->Release();
-	}
-	iCertInfos.Reset();
-
-	delete iCertFilter;
-	iCertFilter = 0;
-
-	TRAPD(error, iCertFilter = CCertAttributeFilter::NewL());
-	if (error != KErrNone)
-	{
-		// Complete with empty lists
-		EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::InitializeQuery() -  Complete with empty lists Error:%d, iUserCerts.Count()=%d, iCACerts.Count()=%d\n"),
-			error,
-			iUserCerts.Count(),
-			iCACerts.Count()) );
-		TRAP(error, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
-		return;
-	}
-	iCertFilter->SetFormat(EX509Certificate);
-
-	iCertFilter->SetOwnerType(iOwnertype);
-
-	iCertInfoIndex = 0;
-
-	iState = EGetCertificatesGetCertList;
-
-	iCertStore->List(
-		iCertInfos,
-		*iCertFilter, 
-		iStatus);
-
-	SetActive();		
 }
 
 //--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::RunL()
 {	
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - iStatus.Int()=%d, iState=%d \n"),
-		iStatus.Int() , iState));
-	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::RunL()\n"));
-
-	//int i;
-	TInt error(KErrNone);
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL - iStatus.Int()=%d, iState=%d \n"),
+	iStatus.Int() , iState));
+	if( iState == EGetSymbianSubjectKeyId )
+	{
+		// Only for GetSymbianSubjectKeyIdL.
+		iWait.AsyncStop(); // This is needed to continue the execution after Wait.Start()
+		return; // No need to proceed further.
+	}
+	
+	if( iState == EGetCertificatesRetrieveCert)
+	{
+		// This is executed when certificate details are being retrieved.
+		iWait.AsyncStop(); // This is needed to continue the execution after Wait.Start()
+		return; // No need to proceed further.
+	}
+	
+	int i;
+	TInt err(KErrNone);
 		
 	// This causes panic if leaves
 	if (iStatus.Int() != KErrNone)
 	{
-		EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() -- don't leave...")));
+RDebug::Print(_L("CEapTlsPeapCertFetcher::RunL() -- don't leave..."));
 	}
 	
 	switch (iState)
 	{
 	case EGetCertificatesInitStore:
 		{
-			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesInitStore\n")));
+			// Delete iCertInfos
+			for (TInt i = 0; i < iCertInfos.Count(); i++)
+			{
+				iCertInfos[i]->Release();
+			}
+			iCertInfos.Reset();
+		
+			delete iCertFilter;
+			iCertFilter = 0;
+		
+			TRAP(err, iCertFilter = CCertAttributeFilter::NewL());
+			if (err != KErrNone)
+			{
+				// Complete with empty lists
+				TInt err(KErrNone);
+				TRAP(err, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
+				break;
+			}
+			iCertFilter->SetFormat(EX509Certificate);
 
-			// First get the User certificates.
-			iOwnertype = EUserCertificate;
-			InitializeQuery();
+			iState = EGetCertificatesGetCertList;
+			iCertStore->List(
+				iCertInfos,
+				*iCertFilter, 
+				iStatus);
+			SetActive();		
 		}
 		break;
 
-	case EGetCertificatesRetrieveCert:
+	case EGetCertificatesGetCertList:
 		{			
-			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesRetrieveCert - Symbian cert store found %d certs in device\n"),
-				iCertInfos.Count()));
-
-			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - iWait.Start() returned, iStatus.Int()=%d \n"),iStatus.Int() ) );
-
-			CCTCertInfo* CertInfo = iCertInfos[iCertInfoIndex];
-			CCertificate* cert = NULL;
+			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL - EGetCertificatesGetCertList - Symbian cert store found %d certs in device\n"),
+			iCertInfos.Count()));
+		
+			if(0 == iCertInfos.Count())
+			{
+				EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR : CEapTlsPeapCertFetcher::RunL - SERIOUS PROBLEM - Symbian cert store couldn't find any certs in device\n")));				
+			}
+		
+			for (i = 0; i < iCertInfos.Count(); i++)
+			{				
+			    CCTCertInfo* CertInfo;
+				CertInfo = iCertInfos[i];
+				iEncodedCertificate->Des().SetLength(0);
+				
+				TRAPD(err, iEncodedCertificate = iEncodedCertificate->ReAllocL(iCertInfos[i]->Size()));
+				if (err != KErrNone)
+				{
+					EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), err ) );
+				}		
+				iCertPtr.Set(iEncodedCertificate->Des());
 
-			if ( iStatus.Int() == KErrNone )
-			{
-				switch ( CertInfo->CertificateFormat() )
-				{
-				case EX509Certificate:
-					{
-						TRAPD(error, cert = CX509Certificate::NewL( iCertPtr ));
-						if (error != KErrNone)
-						{
-							EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from CX509Certificate::NewL Label:%S Error:%d\n"),
-							&(CertInfo->Label()),
-							error ) );
+				EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - Retreiving cert %d\n"), i ) );
+				
+			    iCertStore->Retrieve( *CertInfo, iCertPtr, iStatus);
+			    
+			    iState = EGetCertificatesRetrieveCert;
+
+			    SetActive();
+			    iWait.Start();
+			 	
+				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - iWait.Start() returned, iStatus.Int()=%d \n"),iStatus.Int() ) );
+
+			 	CCertificate* cert = NULL;
 
-							cert = NULL;
-						}
-					break;
-					}
-				default:
-					{
-		                // Only  X509 type of certificates are supported at the moment.
-		                // This won't be happening ever since we have used a filter while getting the certificate list.
-						EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - Unsupported Certificate - Not X509\n") ) );
-						
-						cert = NULL;
-					}
-				}
-			}
-			else
-			{
-				EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - Error from Certificate retrieve, iStatus.Int()=%d\n"), iStatus.Int() ) );
-			}
+			    if ( iStatus.Int() == KErrNone )
+		        {
+			        switch ( CertInfo->CertificateFormat() )
+		            {
+		            case EX509Certificate:
+		                {
+		                TRAPD(err, cert = CX509Certificate::NewL( iCertPtr ));
+			            if (err != KErrNone)
+			               	EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from CX509Certificate::NewL Label:%S Error:%d\n"),&(CertInfo->Label()), err ) );
+			            break;
+		                }
+		            default:
+		                {
+		                	// Only  X509 type of certificates are supported at the moment.
+		                	// This won't be happening ever since we have used a filter while getting the certificate list.
+							EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Unsupported Certificate - Not X509\n") ) );
+							
+			                break;
+		                }
+		            }
+		        }
+		        else
+		        {
+					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Error from Certificate retrieve, iStatus.Int()=%d\n"), iStatus.Int() ) );
+		        }
 
-			if( cert != NULL )
-			{
-				HBufC* pri = NULL;
-				HBufC* sec = NULL;
+				if( cert == NULL )
+				{
+					// Some problem above. Skip the below and go for the next certificate.
+					continue;
+				}							
 			
-				CleanupStack::PushL(cert);
+                HBufC* pri = NULL;
+                HBufC* sec = NULL;
+			
+				CleanupStack::PushL( cert );
 				
-				X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label());
+                X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label());
 	
-				CleanupStack::PopAndDestroy(cert);
-
-				CleanupStack::PushL(pri);
-				CleanupStack::PushL(sec);
-
+				CleanupStack::PopAndDestroy(); // cert		
 
 				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Label=%S, Pri name=%S,Length=%d, Sec name=%S,Length=%d\n"),
 					 &(CertInfo->Label()), pri, pri->Length(), sec, sec->Length() ) );
@@ -343,120 +312,45 @@
 				EAP_TRACE_DATA_DEBUG_SYMBIAN( ( "CEapTlsPeapCertFetcher::RunL() - Sub Key Id:", (CertInfo->SubjectKeyId().Ptr()), 
 						(CertInfo->SubjectKeyId().Size()) ) );
 
-				EapCertificateEntry * const certEntry = new EapCertificateEntry;
-				if (certEntry == 0)
-				{
-					User::Leave(KErrNoMemory);
-				}
-				CleanupStack::PushL(certEntry);
-
-				certEntry->SetLabel(CertInfo->Label());
-				certEntry->SetSubjectKeyId(CertInfo->SubjectKeyId());
-
+				SCertEntry certEntry;
+							
+				certEntry.iLabel.Copy(iCertInfos[i]->Label());
+				certEntry.iSubjectKeyId.Copy(iCertInfos[i]->SubjectKeyId());
+				
 				// Copy the new fields. Primary and secondary name.				
-				certEntry->SetPrimaryName(pri->Des().Left(KMaxCertNameLength));
-				certEntry->SetSecondaryName(sec->Des().Left(KMaxCertNameLength));
-
-				if (CertInfo->CertificateOwnerType() == ECACertificate)
-				{
-					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - CA certificate\n")));
-
-					certEntry->SetCertType(EapCertificateEntry::ECA);
-					error = iCACerts.Append(certEntry);	
-				}
-				else if (CertInfo->CertificateOwnerType() == EUserCertificate)
+				certEntry.iPrimaryName.Copy( pri->Des().Left(KMaxNameLength ) );
+				certEntry.iSecondaryName.Copy( sec->Des().Left(KMaxNameLength ) );
+				
+				delete pri;
+				delete sec;
+				
+				if (iCertInfos[i]->CertificateOwnerType() == ECACertificate)
 				{
-					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - User certificate\n")));
-
-					certEntry->SetCertType(EapCertificateEntry::EUser);
-					error = iUserCerts.Append(certEntry);
-				}
-				else
-				{
-					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - Unknown certificate\n")));
-				}
-
-				if (error == KErrNone)
-				{
-					CleanupStack::Pop(certEntry);
+					iCACerts.Append(certEntry);	
 				}
-				else
+				else if (iCertInfos[i]->CertificateOwnerType() == EUserCertificate)
 				{
-					CleanupStack::PopAndDestroy(certEntry);
-				}
-
-				CleanupStack::PopAndDestroy(sec);
-				CleanupStack::PopAndDestroy(pri);
-
+					iUserCerts.Append(certEntry);
+				}				
 			}
-
-			++iCertInfoIndex;
-		}
-
-		// Here MUST NOT be break. State EGetCertificatesGetCertList is run after the state EGetCertificatesRetrieveCert.
+			delete iCertFilter;
+			iCertFilter = 0;
 
-	case EGetCertificatesGetCertList:
-		{			
-			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesGetCertList - Symbian cert store found %d certs in device, iCertInfoIndex=%d\n"),
-				iCertInfos.Count(),
-				iCertInfoIndex));
-		
-			if (iCertInfoIndex < iCertInfos.Count())
-			{				
-				CCTCertInfo* CertInfo = iCertInfos[iCertInfoIndex];
-
-				iEncodedCertificate->Des().SetLength(0);
-				
-				TRAPD(error, iEncodedCertificate = iEncodedCertificate->ReAllocL(CertInfo->Size()));
-				if (error != KErrNone)
-				{
-					EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), error ) );
-				}		
-				iCertPtr.Set(iEncodedCertificate->Des());
-
-				EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - Retreiving cert %d\n"), iCertInfoIndex ) );
-				
-				iState = EGetCertificatesRetrieveCert;
-
-				iCertStore->Retrieve( *CertInfo, iCertPtr, iStatus);
-
-				SetActive();
+			// Delete iCertInfos
+			for (TInt i = 0; i < iCertInfos.Count(); i++)
+			{
+				iCertInfos[i]->Release();
 			}
-			else if (iOwnertype == EUserCertificate)
-			{
-				// Next get the CA certificates.
-				iOwnertype = ECACertificate;
-				InitializeQuery();
-				return;
-			}
-			else
-			{
-				delete iCertFilter;
-				iCertFilter = 0;
-
-				// Delete iCertInfos
-				for (TInt i = 0; i < iCertInfos.Count(); i++)
-				{
-					iCertInfos[i]->Release();
-				}
-				iCertInfos.Reset();
-
-				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - Complete list, iUserCerts.Count()=%d, iCACerts.Count()=%d\n"),
-					iUserCerts.Count(),
-					iCACerts.Count()) );
-
-				TRAP(error, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
-				// Ignore error on purpose.			
-			}
+			iCertInfos.Reset();
+			TRAP(err, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
+			// Ignore error on purpose.			
 		}
 		break;
 	
 	default:
-		EAP_TRACE_DEBUG_SYMBIAN((_L("WARNING: CEapTlsPeapCertFetcher::RunL(): - default\n")));
 		break;
 	}
 	return;
 }
 
-//--------------------------------------------------
 // End of file