/*
* 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 "tpkixcertval.h"
#include "tcertutils.h"
#include "t_input.h"

//tags for elements in specification file
_LIT(KRootStart, "<root>");
_LIT(KRootEnd, "</root>");
_LIT(KCertificateStart, "<certificate>");
_LIT(KCertificateEnd, "</certificate>");
_LIT(KLabelStart, "<label>");
_LIT(KLabelEnd, "</label>");
_LIT(KEEStart, "<ee>");
_LIT(KEEEnd, "</ee>");
_LIT(KInterStart, "<inter>");
_LIT(KInterEnd, "</inter>");
_LIT(KIPoliciesStart, "<ipolicies>");
_LIT(KIPoliciesEnd, "</ipolicies>");
_LIT(KIPolicyStart, "<ipolicy>");
_LIT(KIPolicyEnd, "</ipolicy>");
_LIT(KOResultStart, "<oresult>");
_LIT(KOResultEnd, "</oresult>");
_LIT(KOPoliciesStart, "<opolicies>");
_LIT(KOPoliciesEnd, "</opolicies>");
_LIT(KOPolicyStart, "<opolicy>");
_LIT(KOPolicyEnd, "</opolicy>");

//const TUint KUnicodeMarker = 0xfeff;

//**Cert Chain**//
CTestChain* CTestChain::NewL(const TDesC& aBuf)
	{
	CTestChain* self = CTestChain::NewLC(aBuf);
	CleanupStack::Pop();
	return self;
	}

CTestChain* CTestChain::NewLC(const TDesC& aBuf)
	{
	CTestChain* self = new(ELeave) CTestChain;
	CleanupStack::PushL(self);
	self->ConstructL(aBuf);
	return self;
	}

CTestChain::~CTestChain()
	{
	delete iIntermediateCertsFileName;
	delete iIntermediateCertsLabel;
	}

CTestChain::CTestChain()
	{
	}

void CTestChain::ConstructL(const TDesC& aBuf)
	{
	TInt pos = 0;
	TInt err = KErrNone;
	TPtrC rootCert(Input::ParseElement(aBuf, KRootStart, KRootEnd, pos, err));
	TInt dummyPos = 0;
	iRootCertFileName = Input::ParseElement(rootCert, KCertificateStart, 
		KCertificateEnd, dummyPos, err);
	iRootCertLabel = Input::ParseElement(rootCert, KLabelStart,
		KLabelEnd, dummyPos, err);
	if (iRootCertLabel == KNullDesC)
		{
		User::Leave(KErrNotFound);
		}

	TPtrC EECert(Input::ParseElement(aBuf, KEEStart, KEEEnd, pos));
	dummyPos = 0;
	iEECertFileName = Input::ParseElement(EECert, KCertificateStart,
		KCertificateEnd, dummyPos);
	iEECertLabel = Input::ParseElement(EECert, KLabelStart,
		KLabelEnd, dummyPos);

	iIntermediateCertsFileName = new(ELeave) CDesCArrayFlat(1);
	iIntermediateCertsLabel = new(ELeave) CDesCArrayFlat(1);
	while(AddInter(aBuf, pos))
		{
		}
	}

TBool CTestChain::AddInter(const TDesC& aBuf, TInt& aPos)
	{
	TPtrC interBuf = Input::ParseElement(aBuf, KInterStart, KInterEnd, aPos);
	TInt dummyPos = 0;
	if (interBuf != KNullDesC)
		{
		iIntermediateCertsFileName->AppendL(Input::ParseElement(interBuf, 
			KCertificateStart, KCertificateEnd, dummyPos));
		iIntermediateCertsLabel->AppendL(Input::ParseElement(interBuf,
			KLabelStart, KLabelEnd, dummyPos));
		return ETrue;
		}
	return EFalse;
	}

//**Policy Input/Output**//
CTestParameters* CTestParameters::NewL(const TDesC& aBuf)
	{
	CTestParameters* self = CTestParameters::NewLC(aBuf);
	CleanupStack::Pop();
	return self;
	}

CTestParameters* CTestParameters::NewLC(const TDesC& aBuf)
	{
	CTestParameters* self = new(ELeave) CTestParameters;
	CleanupStack::PushL(self);
	self->ConstructL(aBuf);
	return self;
	}

CTestParameters::~CTestParameters()
	{
	delete iWarnings;
	delete iPolicyInput;
	delete iExpectedPolicyOutput;
	}

CTestParameters::CTestParameters()
	:iIPoliciesSet(ETrue), iOPoliciesSet(ETrue), iOWarningsSet(ETrue)
	{
	}

void CTestParameters::ConstructL(const TDesC& aBuf)
	{
	iWarnings = new(ELeave)CArrayFixFlat<TValidationStatus> (1);
	iPolicyInput = new(ELeave) CDesCArrayFlat (1);
	iExpectedPolicyOutput = new(ELeave) CDesCArrayFlat (1);

	TInt pos = 0;
	TInt err = KErrNone;
	TPtrC iIPolicyBuf = Input::ParseElement(aBuf, KIPoliciesStart, KIPoliciesEnd, pos, err);
	if (err != KErrNone)
		{
		iIPoliciesSet = EFalse;//input policies are optional
		}
	pos = 0;
	while(AddPolicy(iIPolicyBuf, KIPolicyStart, KIPolicyEnd,pos, *iPolicyInput))
		{
		}	
	iError = Input::ParseElement(aBuf, KOResultStart, KOResultEnd, pos);
	TPtrC iOPolicyBuf = Input::ParseElement(aBuf, KOPoliciesStart, KOPoliciesEnd, pos, err);
	if (err != KErrNone)
		{
		iOPoliciesSet = EFalse;//output policies are optional
		}
	pos = 0;
	while(AddPolicy(iOPolicyBuf, KOPolicyStart, KOPolicyEnd, pos, *iExpectedPolicyOutput))
		{
		}	
	}

TBool CTestParameters::AddPolicy(const TDesC& aBuf, const TDesC& aStart, const TDesC& aEnd, TInt& aPos, CDesCArray& aPolicySet)
	{
	TPtrC policyBuf = Input::ParseElement(aBuf, aStart, aEnd, aPos);
	if (policyBuf != KNullDesC)
		{
		aPolicySet.AppendL(policyBuf);
		return ETrue;
		}
	return EFalse;
	}
