cryptoservices/certificateandkeymgmt/pkixcertbase/pkixvalidationresult.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/pkixcertbase/pkixvalidationresult.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,208 @@
+/*
+* Copyright (c) 1998-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: 
+*
+*/
+
+
+#include "pkixvalidationresult.h"
+
+//validationresult
+EXPORT_C CPKIXValidationResultBase* CPKIXValidationResultBase::NewL()
+	{
+	CPKIXValidationResultBase* s = CPKIXValidationResultBase::NewLC();
+	CleanupStack::Pop();//s
+	return s;
+	}
+
+EXPORT_C CPKIXValidationResultBase* CPKIXValidationResultBase::NewLC()
+	{
+	CPKIXValidationResultBase* s = new(ELeave) CPKIXValidationResultBase;
+	CleanupStack::PushL(s);
+	s->ConstructL();
+	return s;
+	}
+
+EXPORT_C CPKIXValidationResultBase::~CPKIXValidationResultBase()
+	{
+	delete iWarnings;
+	if (iPolicies != NULL)
+		{
+		iPolicies->ResetAndDestroy();
+		}
+	delete iPolicies;
+	iCertWarnings.ResetAndDestroy();
+	}
+
+EXPORT_C CPKIXValidationResultBase::CPKIXValidationResultBase()
+	:iError(EChainHasNoRoot, 0)
+	{
+	}
+
+EXPORT_C void CPKIXValidationResultBase::ConstructL()
+	{
+#ifdef _DEBUG
+	// In OOM we don't want the size of the arrays to change because this will
+	// cause a change in the numbers of allocated cells
+	iWarnings = new(ELeave) CArrayFixFlat<TValidationStatus> (100);
+	iPolicies = new(ELeave) CArrayPtrFlat<CX509CertPolicyInfo> (100);
+	iPolicies->AppendL(0);
+	iPolicies->ResetAndDestroy();
+#else
+	iWarnings = new(ELeave) CArrayFixFlat<TValidationStatus> (1);
+	iPolicies = new(ELeave) CArrayPtrFlat<CX509CertPolicyInfo> (1);
+#endif
+	}
+
+EXPORT_C const TValidationStatus CPKIXValidationResultBase::Error() const
+	{
+	return iError;
+	}
+
+EXPORT_C const CArrayFixFlat<TValidationStatus>& CPKIXValidationResultBase::Warnings() const
+	{
+	return *iWarnings;
+	}
+
+EXPORT_C const CArrayPtrFlat<CX509CertPolicyInfo>& CPKIXValidationResultBase::Policies() const
+	{
+	return *iPolicies;
+	}
+
+void CPKIXValidationResultBase::Reset()
+	{
+	iError = TValidationStatus(EChainHasNoRoot, 0);
+	iWarnings->Reset();
+	RemovePolicies();
+	}
+
+void CPKIXValidationResultBase::SetErrorAndLeaveL(const TValidationError aError, const TInt aCert)
+	{
+	SetError(aError, aCert);
+	User::Leave(KErrGeneral);
+	}
+
+void CPKIXValidationResultBase::SetError(const TValidationError aError, const TInt aCert)
+	{
+	iError.iReason = aError;
+	iError.iCert = aCert;
+	}
+
+void CPKIXValidationResultBase::AppendWarningL(TValidationStatus aWarning)
+	{
+	iWarnings->AppendL(aWarning);
+
+	if (aWarning.iReason != ECriticalExtendedKeyUsage && aWarning.iReason != ECriticalPolicyMapping && 
+		aWarning.iReason != ECriticalDeviceId && aWarning.iReason != ECriticalSid &&
+		aWarning.iReason != ECriticalVid && aWarning.iReason != ECriticalCapabilities)
+		{
+		(*iCertWarnings[iCertWarnings.Count()-1]).AppendWarningL(aWarning);
+		}
+	}
+
+void CPKIXValidationResultBase::AppendPolicyL(CX509CertPolicyInfo& aPolicy)
+	{
+	iPolicies->AppendL(&aPolicy);
+	}
+
+void CPKIXValidationResultBase::RemovePolicies()
+	{
+	iPolicies->ResetAndDestroy();
+	}
+
+EXPORT_C void CPKIXValidationResultBase::ExternalizeL(RWriteStream& aStream) const
+	{
+	// iError
+	aStream.WriteL(TPckgC<TValidationStatus>(iError));
+
+	// iWarnings
+	aStream.WriteInt32L(iWarnings->Count());
+	TInt32 i;
+	for (i = 0;i < iWarnings->Count(); ++i)
+		{
+		aStream.WriteL(TPckgC<TValidationStatus>((*iWarnings)[i]));
+		}
+
+	// iPolicies
+	aStream.WriteInt32L(iPolicies->Count());
+	for (i = 0;i < iPolicies->Count(); ++i)
+		{
+		(*iPolicies)[i]->ExternalizeL(aStream);
+		}
+	
+	// iCertWarnings
+	aStream.WriteInt32L(iCertWarnings.Count());
+	for (i = 0;i< iCertWarnings.Count(); ++i)
+		{
+		(*iCertWarnings[i]).ExternalizeL(aStream);
+		}
+	}
+
+EXPORT_C void CPKIXValidationResultBase::InternalizeL(RReadStream& aStream)
+	{
+	// iError
+	TPckg<TValidationStatus> pckg(iError);
+	aStream.ReadL(pckg);
+
+	// iWarnings
+	iWarnings->Reset();
+	
+	TInt32 count=aStream.ReadInt32L();
+	TInt32 i;
+	for (i = 0;i < count; ++i)
+		{
+		TValidationStatus warning(EValidatedOK,0);
+		TPckg<TValidationStatus> pckg(warning);
+		aStream.ReadL(pckg);
+		iWarnings->AppendL(warning);
+		}
+
+	// iPolicies
+	iPolicies->ResetAndDestroy();
+
+	count=aStream.ReadInt32L();
+	for (i = 0;i < count; ++i)
+		{
+		CX509CertPolicyInfo* certPolicyInfo=CX509CertPolicyInfo::NewLC(aStream); 
+		iPolicies->AppendL(certPolicyInfo);
+		CleanupStack::Pop(certPolicyInfo);
+		}
+	
+	// iCertWarnings
+	iCertWarnings.Reset();
+
+	count=aStream.ReadInt32L();
+	for (i = 0;i < count; ++i)
+		{
+		CCertificateValidationWarnings* certWarning=CCertificateValidationWarnings::InternalizeL(aStream);
+		CleanupStack::PushL(certWarning);
+		iCertWarnings.AppendL(certWarning);
+		CleanupStack::Pop(certWarning);
+		}
+	}
+
+EXPORT_C const RPointerArray<CCertificateValidationWarnings>& CPKIXValidationResultBase::ValidationWarnings() const
+	{
+	return iCertWarnings;
+	}
+
+EXPORT_C void CPKIXValidationResultBase::AppendCertificateValidationObjectL(const CCertificateValidationWarnings& aCertWarning)
+	{
+	iCertWarnings.AppendL(&aCertWarning);
+	}
+
+EXPORT_C void CPKIXValidationResultBase::AppendCriticalExtensionWarningL(TDesC& aCriticalExt)
+	{
+	(*iCertWarnings[iCertWarnings.Count()-1]).AppendCriticalExtensionWarningL(aCriticalExt);
+	}