sl@0: /* sl@0: * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "pkixvalidationresult.h" sl@0: sl@0: //validationresult sl@0: EXPORT_C CPKIXValidationResultBase* CPKIXValidationResultBase::NewL() sl@0: { sl@0: CPKIXValidationResultBase* s = CPKIXValidationResultBase::NewLC(); sl@0: CleanupStack::Pop();//s sl@0: return s; sl@0: } sl@0: sl@0: EXPORT_C CPKIXValidationResultBase* CPKIXValidationResultBase::NewLC() sl@0: { sl@0: CPKIXValidationResultBase* s = new(ELeave) CPKIXValidationResultBase; sl@0: CleanupStack::PushL(s); sl@0: s->ConstructL(); sl@0: return s; sl@0: } sl@0: sl@0: EXPORT_C CPKIXValidationResultBase::~CPKIXValidationResultBase() sl@0: { sl@0: delete iWarnings; sl@0: if (iPolicies != NULL) sl@0: { sl@0: iPolicies->ResetAndDestroy(); sl@0: } sl@0: delete iPolicies; sl@0: iCertWarnings.ResetAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C CPKIXValidationResultBase::CPKIXValidationResultBase() sl@0: :iError(EChainHasNoRoot, 0) sl@0: { sl@0: } sl@0: sl@0: EXPORT_C void CPKIXValidationResultBase::ConstructL() sl@0: { sl@0: #ifdef _DEBUG sl@0: // In OOM we don't want the size of the arrays to change because this will sl@0: // cause a change in the numbers of allocated cells sl@0: iWarnings = new(ELeave) CArrayFixFlat (100); sl@0: iPolicies = new(ELeave) CArrayPtrFlat (100); sl@0: iPolicies->AppendL(0); sl@0: iPolicies->ResetAndDestroy(); sl@0: #else sl@0: iWarnings = new(ELeave) CArrayFixFlat (1); sl@0: iPolicies = new(ELeave) CArrayPtrFlat (1); sl@0: #endif sl@0: } sl@0: sl@0: EXPORT_C const TValidationStatus CPKIXValidationResultBase::Error() const sl@0: { sl@0: return iError; sl@0: } sl@0: sl@0: EXPORT_C const CArrayFixFlat& CPKIXValidationResultBase::Warnings() const sl@0: { sl@0: return *iWarnings; sl@0: } sl@0: sl@0: EXPORT_C const CArrayPtrFlat& CPKIXValidationResultBase::Policies() const sl@0: { sl@0: return *iPolicies; sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::Reset() sl@0: { sl@0: iError = TValidationStatus(EChainHasNoRoot, 0); sl@0: iWarnings->Reset(); sl@0: RemovePolicies(); sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::SetErrorAndLeaveL(const TValidationError aError, const TInt aCert) sl@0: { sl@0: SetError(aError, aCert); sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::SetError(const TValidationError aError, const TInt aCert) sl@0: { sl@0: iError.iReason = aError; sl@0: iError.iCert = aCert; sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::AppendWarningL(TValidationStatus aWarning) sl@0: { sl@0: iWarnings->AppendL(aWarning); sl@0: sl@0: if (aWarning.iReason != ECriticalExtendedKeyUsage && aWarning.iReason != ECriticalPolicyMapping && sl@0: aWarning.iReason != ECriticalDeviceId && aWarning.iReason != ECriticalSid && sl@0: aWarning.iReason != ECriticalVid && aWarning.iReason != ECriticalCapabilities) sl@0: { sl@0: (*iCertWarnings[iCertWarnings.Count()-1]).AppendWarningL(aWarning); sl@0: } sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::AppendPolicyL(CX509CertPolicyInfo& aPolicy) sl@0: { sl@0: iPolicies->AppendL(&aPolicy); sl@0: } sl@0: sl@0: void CPKIXValidationResultBase::RemovePolicies() sl@0: { sl@0: iPolicies->ResetAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CPKIXValidationResultBase::ExternalizeL(RWriteStream& aStream) const sl@0: { sl@0: // iError sl@0: aStream.WriteL(TPckgC(iError)); sl@0: sl@0: // iWarnings sl@0: aStream.WriteInt32L(iWarnings->Count()); sl@0: TInt32 i; sl@0: for (i = 0;i < iWarnings->Count(); ++i) sl@0: { sl@0: aStream.WriteL(TPckgC((*iWarnings)[i])); sl@0: } sl@0: sl@0: // iPolicies sl@0: aStream.WriteInt32L(iPolicies->Count()); sl@0: for (i = 0;i < iPolicies->Count(); ++i) sl@0: { sl@0: (*iPolicies)[i]->ExternalizeL(aStream); sl@0: } sl@0: sl@0: // iCertWarnings sl@0: aStream.WriteInt32L(iCertWarnings.Count()); sl@0: for (i = 0;i< iCertWarnings.Count(); ++i) sl@0: { sl@0: (*iCertWarnings[i]).ExternalizeL(aStream); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CPKIXValidationResultBase::InternalizeL(RReadStream& aStream) sl@0: { sl@0: // iError sl@0: TPckg pckg(iError); sl@0: aStream.ReadL(pckg); sl@0: sl@0: // iWarnings sl@0: iWarnings->Reset(); sl@0: sl@0: TInt32 count=aStream.ReadInt32L(); sl@0: TInt32 i; sl@0: for (i = 0;i < count; ++i) sl@0: { sl@0: TValidationStatus warning(EValidatedOK,0); sl@0: TPckg pckg(warning); sl@0: aStream.ReadL(pckg); sl@0: iWarnings->AppendL(warning); sl@0: } sl@0: sl@0: // iPolicies sl@0: iPolicies->ResetAndDestroy(); sl@0: sl@0: count=aStream.ReadInt32L(); sl@0: for (i = 0;i < count; ++i) sl@0: { sl@0: CX509CertPolicyInfo* certPolicyInfo=CX509CertPolicyInfo::NewLC(aStream); sl@0: iPolicies->AppendL(certPolicyInfo); sl@0: CleanupStack::Pop(certPolicyInfo); sl@0: } sl@0: sl@0: // iCertWarnings sl@0: iCertWarnings.Reset(); sl@0: sl@0: count=aStream.ReadInt32L(); sl@0: for (i = 0;i < count; ++i) sl@0: { sl@0: CCertificateValidationWarnings* certWarning=CCertificateValidationWarnings::InternalizeL(aStream); sl@0: CleanupStack::PushL(certWarning); sl@0: iCertWarnings.AppendL(certWarning); sl@0: CleanupStack::Pop(certWarning); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C const RPointerArray& CPKIXValidationResultBase::ValidationWarnings() const sl@0: { sl@0: return iCertWarnings; sl@0: } sl@0: sl@0: EXPORT_C void CPKIXValidationResultBase::AppendCertificateValidationObjectL(const CCertificateValidationWarnings& aCertWarning) sl@0: { sl@0: iCertWarnings.AppendL(&aCertWarning); sl@0: } sl@0: sl@0: EXPORT_C void CPKIXValidationResultBase::AppendCriticalExtensionWarningL(TDesC& aCriticalExt) sl@0: { sl@0: (*iCertWarnings[iCertWarnings.Count()-1]).AppendCriticalExtensionWarningL(aCriticalExt); sl@0: }