sl@0: // Copyright (c) 2001-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 "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: #include "CTextUtilsTest.h"
sl@0: 
sl@0: #include <uriutilscommon.h>
sl@0: #include <inetprottextutils.h>
sl@0: 
sl@0: #include "TextUtilsTestCommon.h"
sl@0: #include "TextUtilsTests.h"
sl@0: 
sl@0: CTextUtilsTest* CTextUtilsTest::NewLC(CIpuTestHarness* aTestHarness)
sl@0: 	{
sl@0: 	CTextUtilsTest* self = new (ELeave) CTextUtilsTest(aTestHarness);
sl@0: 	CleanupStack::PushL(self);
sl@0: 	self->ConstructL();
sl@0: 	return self;
sl@0: 	}
sl@0: 
sl@0: CTextUtilsTest* CTextUtilsTest::NewL(CIpuTestHarness* aTestHarness)
sl@0: 	{
sl@0: 	CTextUtilsTest* self = CTextUtilsTest::NewLC(aTestHarness);
sl@0: 	CleanupStack::Pop(self);
sl@0: 	return self;
sl@0: 	}
sl@0: 
sl@0: CTextUtilsTest::CTextUtilsTest(CIpuTestHarness* aTestHarness)
sl@0: : iTestHarness(aTestHarness)
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::ConstructL()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: CTextUtilsTest::~CTextUtilsTest()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::DoTestsL()
sl@0: 	{
sl@0: 
sl@0: 	TestTextUtilsRemoveL(KRemove0_base, KRemove0_left, KRemove0_left_consumed,
sl@0: 						KRemove0_right, KRemove0_right_consumed,
sl@0: 						KRemove0_both, KRemove0_both_consumed);
sl@0: 
sl@0: 	TestTextUtilsDesToIntConversionL(KDecRep0, KNumericValue0, KIsValid0);
sl@0: 	TestTextUtilsDesToIntConversionL(KDecRep1, KNumericValue1, KIsValid1);
sl@0: 	TestTextUtilsDesToIntConversionL(KDecRep2, KNumericValue2, KIsValid2);
sl@0: 	TestTextUtilsDesToIntConversionL(KDecRep3, KNumericValue3, KIsValid3);
sl@0: 	
sl@0: 	TestTextUtilsIntToDesConversionL(KNumericValue0, KDecRep0);
sl@0: 	TestTextUtilsIntToDesConversionL(KNumericValue1, KDecRep1);
sl@0: 
sl@0: 	_LIT(KWhiteSpace," \t");
sl@0: 	TestTextUtilsDesToHexConversionL(KWhiteSpace, 0, EFalse);
sl@0: 
sl@0: 	TestTextUtilsDesToHexConversionL(KHexRep0, KNumericValue0, KIsValid0);
sl@0: 	TestTextUtilsDesToHexConversionL(KHexRep1, KNumericValue1, KIsValid1);
sl@0: 	TestTextUtilsDesToHexConversionL(KHexRep2, KNumericValue2, KIsValid2);
sl@0: 	TestTextUtilsDesToHexConversionL(KHexRep3, KNumericValue3, KIsValid3);
sl@0: 
sl@0: 	TestTextUtilsHexToDesConversionL(KNumericValue0, KHexRep0);
sl@0: 	TestTextUtilsHexToDesConversionL(KNumericValue1, KHexRep1);
sl@0: 
sl@0: 	TestTextUtilsExtractQuotedStringL(KQuotedBuffer0, KQuotedString0, KQuotedRemainder0, KExpectedError0);
sl@0: 	TestTextUtilsExtractQuotedStringL(KQuotedBuffer1, KQuotedString1, KQuotedRemainder1, KExpectedError1);
sl@0: 	TestTextUtilsExtractQuotedStringL(KQuotedBuffer2, KQuotedString2, KQuotedRemainder2, KExpectedError2);
sl@0: 	TestTextUtilsExtractQuotedStringL(KQuotedBuffer3, KQuotedString3, KQuotedRemainder3, KExpectedError3);
sl@0: 
sl@0: 	TestTextUtilsExtractTokenFromListL(
sl@0: 									  KListBuffer0,
sl@0: 									  KListToken0_0,
sl@0: 									  KListToken0_1,
sl@0: 									  KListToken0_2,
sl@0: 									  KListRemainder0,
sl@0: 									  KListSeparator0
sl@0: 									  );
sl@0: 
sl@0: 	TestTextUtilsExtractTokenFromListL(
sl@0: 									  KListBuffer1,
sl@0: 									  KListToken1_0,
sl@0: 									  KListToken1_1,
sl@0: 									  KListToken1_2,
sl@0: 									  KListRemainder1,
sl@0: 									  KListSeparator1
sl@0: 									  );
sl@0: 
sl@0: 	TestTextUtilsExtractTokenFromListL(
sl@0: 									  KListBuffer2,
sl@0: 									  KListToken2_0,
sl@0: 									  KListToken2_1,
sl@0: 									  KListToken2_2,
sl@0: 									  KListRemainder2,
sl@0: 									  KListSeparator2
sl@0: 									  );
sl@0: 
sl@0: 	TestTextUtilsExtractTokenFromListL(
sl@0: 									  KListBuffer3,
sl@0: 									  KListToken3_0,
sl@0: 									  KListToken3_1,
sl@0: 									  KListToken3_2,
sl@0: 									  KListRemainder3,
sl@0: 									  KListSeparator3
sl@0: 									  );
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsRemoveL(const TDesC& aBase, 
sl@0: 										  const TDesC& aRemoveLeft, TInt aConsumedLeft,
sl@0: 										  const TDesC& aRemoveRight, TInt aConsumedRight,
sl@0: 										  const TDesC& aRemoveBoth, TInt aConsumedBoth)
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils Remove (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsRemove<TPtrC16>(aBase, aRemoveLeft, aConsumedLeft,
sl@0: 												aRemoveRight, aConsumedRight,
sl@0: 												aRemoveBoth, aConsumedBoth);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* baseBuf = HBufC8::NewLC(aBase.Length());
sl@0: 	TPtr8 base8Bit = baseBuf->Des();
sl@0: 	base8Bit.Copy(aBase);
sl@0: 
sl@0: 	HBufC8* removeLeftBuf = HBufC8::NewLC(aRemoveLeft.Length());
sl@0: 	TPtr8 removeLeft8Bit = removeLeftBuf->Des();
sl@0: 	removeLeft8Bit.Copy(aRemoveLeft);
sl@0: 
sl@0: 	HBufC8* removeRightBuf = HBufC8::NewLC(aRemoveRight.Length());
sl@0: 	TPtr8 removeRight8Bit = removeRightBuf->Des();
sl@0: 	removeRight8Bit.Copy(aRemoveRight);
sl@0: 
sl@0: 	HBufC8* removeBothBuf = HBufC8::NewLC(aRemoveBoth.Length());
sl@0: 	TPtr8 removeBoth8Bit = removeBothBuf->Des();
sl@0: 	removeBoth8Bit.Copy(aRemoveBoth);
sl@0: 
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils Remove (8-bit)"));
sl@0: 
sl@0: 	error = DoTestTextUtilsRemove<TPtrC8>(base8Bit, removeLeft8Bit, aConsumedLeft,
sl@0: 											removeRight8Bit, aConsumedRight,
sl@0: 											removeBoth8Bit, aConsumedBoth);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(4, baseBuf);	// baseBuf, removeLeftBuf, removeRightBuf, removeBothBuf
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsDesToIntConversionL(const TDesC& aDes, TInt aInt, TBool aValid)
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertDescriptorToInt (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsDesToIntConversion(aDes, aInt, aValid);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* desBuf = HBufC8::NewLC(aDes.Length());
sl@0: 	TPtr8 des8Bit = desBuf->Des();
sl@0: 	des8Bit.Copy(aDes);
sl@0: 	
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertDescriptorToInt (8-bit)"));
sl@0: 
sl@0: 	error = DoTestTextUtilsDesToIntConversion(des8Bit, aInt, aValid);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(desBuf);	// desBuf
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsIntToDesConversionL(TInt aInt, const TDesC& aDes)
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertIntToDescriptor (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsIntToDesConversion<HBufC16>(aInt, aDes);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* desBuf = HBufC8::NewLC(aDes.Length());
sl@0: 	TPtr8 des8Bit = desBuf->Des();
sl@0: 	des8Bit.Copy(aDes);
sl@0: 	
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertIntToDescriptor (8-bit)"));
sl@0: 
sl@0: 	error = DoTestTextUtilsIntToDesConversion<HBufC8>(aInt, des8Bit);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(desBuf);	// desBuf
sl@0: 	}
sl@0: 
sl@0: 
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsDesToHexConversionL(const TDesC& aDes, TInt aHexNumber, TBool aValid)
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertDescriptorToHex (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsDesToHexConversion(aDes, aHexNumber, aValid);
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Test 8 bit version
sl@0: 	TestTextUtilsDesToHexConversion8L(aDes, aHexNumber, aValid);
sl@0: 	}
sl@0: 	
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsDesToHexConversion8L(const TDesC& aDes, TInt aHexNumber, TBool aValid)
sl@0: 	{
sl@0: 	HBufC8* desBuf = HBufC8::NewLC(aDes.Length());
sl@0: 	TPtr8 des8Bit = desBuf->Des();
sl@0: 	des8Bit.Copy(aDes);
sl@0: 	
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertDescriptorToHex (8-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsDesToHexConversion(des8Bit, aHexNumber, aValid);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(desBuf);	// desBuf
sl@0: 	}
sl@0: 	
sl@0: 
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsHexToDesConversionL(TInt aHex, const TDesC& aDes)
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertHexToDescriptor (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestTextUtilsHexToDesConversion<HBufC16>(aHex, aDes);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* desBuf = HBufC8::NewLC(aDes.Length());
sl@0: 	TPtr8 des8Bit = desBuf->Des();
sl@0: 	des8Bit.Copy(aDes);
sl@0: 	
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ConvertHexToDescriptor (8-bit)"));
sl@0: 
sl@0: 	error = DoTestTextUtilsHexToDesConversion<HBufC8>(aHex, des8Bit);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(desBuf);	// desBuf
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsExtractQuotedStringL(
sl@0: 													  const TDesC&	aBuffer, 
sl@0: 													  const TDesC&	aString, 
sl@0: 													  const TDesC&	aRemainder,
sl@0: 													  TInt			aExpectedError
sl@0: 													  )
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractQuotedStringL (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoTestExtractQuotedStringL<TPtrC>(aBuffer, aString, aRemainder, aExpectedError);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* buffer = HBufC8::NewLC(aBuffer.Length());
sl@0: 	buffer->Des().Copy(aBuffer);
sl@0: 
sl@0: 	HBufC8* string = HBufC8::NewLC(aString.Length());
sl@0: 	string->Des().Copy(aString);
sl@0: 
sl@0: 	HBufC8* remainder = HBufC8::NewLC(aRemainder.Length());
sl@0: 	remainder->Des().Copy(aRemainder);
sl@0: 
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractQuotedStringL (8-bit)"));
sl@0: 
sl@0: 	error = DoTestExtractQuotedStringL<TPtrC8>(*buffer, *string, *remainder, aExpectedError);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(3, buffer);
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsExtractTokenFromListL(
sl@0: 													   const TDesC& aBuffer,
sl@0: 													   const TDesC& aToken0,
sl@0: 													   const TDesC& aToken1,
sl@0: 													   const TDesC& aToken2,
sl@0: 													   const TDesC& aRemainder,
sl@0: 													   const TDesC& aSeparator
sl@0: 													   )
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractTokenFromList, multiple separator (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoExtractTokenFromListMultipleSeparator<TPtrC>(aBuffer, aToken0, aToken1, aToken2, aRemainder, aSeparator);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* buffer = HBufC8::NewLC(aBuffer.Length());
sl@0: 	buffer->Des().Copy(aBuffer);
sl@0: 
sl@0: 	HBufC8* token0 = HBufC8::NewLC(aToken0.Length());
sl@0: 	token0->Des().Copy(aToken0);
sl@0: 
sl@0: 	HBufC8* token1 = HBufC8::NewLC(aToken1.Length());
sl@0: 	token1->Des().Copy(aToken1);
sl@0: 
sl@0: 	HBufC8* token2 = HBufC8::NewLC(aToken2.Length());
sl@0: 	token2->Des().Copy(aToken2);
sl@0: 
sl@0: 	HBufC8* remainder = HBufC8::NewLC(aRemainder.Length());
sl@0: 	remainder->Des().Copy(aRemainder);
sl@0: 
sl@0: 	HBufC8* separator = HBufC8::NewLC(aSeparator.Length());
sl@0: 	separator->Des().Copy(aSeparator);
sl@0: 
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractTokenFromList, multiple separator (8-bit)"));
sl@0: 
sl@0: 	error = DoExtractTokenFromListMultipleSeparator<TPtrC8>(*buffer, *token0, *token1, *token2, *remainder, *separator);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(6, buffer);
sl@0: 	}
sl@0: 
sl@0: void CTextUtilsTest::TestTextUtilsExtractTokenFromListL(
sl@0: 													   const TDesC& aBuffer,
sl@0: 													   const TDesC& aToken0,
sl@0: 													   const TDesC& aToken1,
sl@0: 													   const TDesC& aToken2,
sl@0: 													   const TDesC& aRemainder,
sl@0: 													   TChar		aSeparator
sl@0: 													   )
sl@0: 	{
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractTokenFromList, single separator (16-bit)"));
sl@0: 
sl@0: 	TInt error = DoExtractTokenFromListSingleSeparator<TPtrC>(aBuffer, aToken0, aToken1, aToken2, aRemainder, aSeparator);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	// Make 8-bit copy
sl@0: 	HBufC8* buffer = HBufC8::NewLC(aBuffer.Length());
sl@0: 	buffer->Des().Copy(aBuffer);
sl@0: 
sl@0: 	HBufC8* token0 = HBufC8::NewLC(aToken0.Length());
sl@0: 	token0->Des().Copy(aToken0);
sl@0: 
sl@0: 	HBufC8* token1 = HBufC8::NewLC(aToken1.Length());
sl@0: 	token1->Des().Copy(aToken1);
sl@0: 
sl@0: 	HBufC8* token2 = HBufC8::NewLC(aToken2.Length());
sl@0: 	token2->Des().Copy(aToken2);
sl@0: 
sl@0: 	HBufC8* remainder = HBufC8::NewLC(aRemainder.Length());
sl@0: 	remainder->Des().Copy(aRemainder);
sl@0: 
sl@0: 	iTestHarness->StartTestL(_L("Test TextUtils ExtractTokenFromList, single separator (8-bit)"));
sl@0: 
sl@0: 	error = DoExtractTokenFromListSingleSeparator<TPtrC8>(*buffer, *token0, *token1, *token2, *remainder, aSeparator);
sl@0: 
sl@0: 	iTestHarness->EndTest(error);
sl@0: 
sl@0: 	CleanupStack::PopAndDestroy(5, buffer);
sl@0: 	}
sl@0: 
sl@0: /*
sl@0:  *	Local methods
sl@0:  */
sl@0: 
sl@0: template<class TPtrCType, class TDesCType>
sl@0: LOCAL_C TInt DoTestTextUtilsRemove(const TDesCType& aBase, 
sl@0: 								   const TDesCType& aRemoveLeft, TInt aConsumedLeft,
sl@0: 								   const TDesCType& aRemoveRight, TInt aConsumedRight,
sl@0: 								   const TDesCType& aRemoveBoth, TInt aConsumedBoth)
sl@0: 	{
sl@0: 	// Do remove left...
sl@0: 	TPtrCType data = aBase;
sl@0: 	TInt consumed = InetProtTextUtils::RemoveWhiteSpace(data, InetProtTextUtils::ERemoveLeft);
sl@0: 	// Check...
sl@0: 	if( data.Compare(aRemoveLeft) != 0 || consumed != aConsumedLeft )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// Do remove right...
sl@0: 	data.Set(aBase);
sl@0: 	consumed = InetProtTextUtils::RemoveWhiteSpace(data, InetProtTextUtils::ERemoveRight);
sl@0: 	// Check...
sl@0: 	if( data.Compare(aRemoveRight) != 0 || consumed != aConsumedRight )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// Do remove both...
sl@0: 	data.Set(aBase);
sl@0: 	consumed = InetProtTextUtils::RemoveWhiteSpace(data, InetProtTextUtils::ERemoveBoth);
sl@0: 	// Check...
sl@0: 	if( data.Compare(aRemoveBoth) != 0 || consumed != aConsumedBoth )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class TDesCType>
sl@0: LOCAL_C TInt DoTestTextUtilsDesToIntConversion(const TDesCType& aDes, TInt aInt, TBool aValid)
sl@0: 	{
sl@0: 	TInt theInt;
sl@0: 	TInt error = InetProtTextUtils::ConvertDescriptorToInt(aDes, theInt);
sl@0: 	if( (error < KErrNone && aValid) || (error >= KErrNone && !aValid) )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	if( aValid && theInt != aInt )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class HBufCType, class TDesCType>
sl@0: LOCAL_C TInt DoTestTextUtilsIntToDesConversion(TInt aInt, const TDesCType& aDes)
sl@0: 	{
sl@0: 	HBufCType* theDes = NULL;
sl@0: 	TRAPD(error, InetProtTextUtils::ConvertIntToDescriptorL(aInt, theDes));
sl@0: 	if( error != KErrNone )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	if( theDes->CompareF(aDes) != 0 )
sl@0: 		{
sl@0: 		delete theDes;
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	delete theDes;
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class TDesCType>
sl@0: LOCAL_C TInt DoTestTextUtilsDesToHexConversion(const TDesCType& aDes, TInt aHex, TBool aValid)
sl@0: 	{
sl@0: 	TInt theHex;
sl@0: 	TInt error = InetProtTextUtils::ConvertDescriptorToHex(aDes, theHex);
sl@0: 	if( (error < KErrNone && aValid) || (error >= KErrNone && !aValid) )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	if( aValid && theHex != aHex )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class HBufCType, class TDesCType>
sl@0: LOCAL_C TInt DoTestTextUtilsHexToDesConversion(TInt aHex, const TDesCType& aDes)
sl@0: 	{
sl@0: 	HBufCType* theDes = NULL;
sl@0: 	TRAPD(error, InetProtTextUtils::ConvertHexToDescriptorL(aHex, theDes));
sl@0: 	if( error != KErrNone )
sl@0: 		{
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	if( theDes->CompareF(aDes) != 0 )
sl@0: 		{
sl@0: 		delete theDes;
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	delete theDes;
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class TPtrCType, class TDesCType>
sl@0: LOCAL_C TInt DoTestExtractQuotedStringL(const TDesCType& aBuffer, const TDesCType& aString, const TDesCType& aRemainder, TInt aExpectedError)
sl@0: 	{
sl@0: 	TPtrCType buffer(aBuffer);
sl@0: 	TPtrCType string;
sl@0: 	TRAPD( error, InetProtTextUtils::ExtractQuotedStringL(buffer, string) );
sl@0: 
sl@0: 	if( error == KErrNone && aExpectedError == KErrNone)
sl@0: 		{
sl@0: 		if( aString.Compare(string) == 0 && aRemainder.Compare(buffer) == 0 )
sl@0: 			{
sl@0: 			// Passed
sl@0: 			return KErrNone;
sl@0: 			}
sl@0: 		else
sl@0: 			{
sl@0: 			// Failed
sl@0: 			return KErrNotFound;
sl@0: 			}
sl@0: 		}
sl@0: 	else if( error == aExpectedError )
sl@0: 		{
sl@0: 		// Got expected error - passed
sl@0: 		return KErrNone;
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: template<class TPtrCType, class TDesCType>
sl@0: LOCAL_C TInt DoExtractTokenFromListMultipleSeparator(
sl@0: 												const TDesCType& aBuffer,
sl@0: 												const TDesCType& aToken0,
sl@0: 												const TDesCType& aToken1,
sl@0: 												const TDesCType& aToken2,
sl@0: 												const TDesCType& aRemainder,
sl@0: 												const TDesCType& aSeparator
sl@0: 												)
sl@0: 	{
sl@0: 	// get the first token...
sl@0: 	TPtrCType buffer = aBuffer;
sl@0: 	TPtrCType token;
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken0) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// get the second token
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken1) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// get the third token
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken2) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// Check that the remainder is correct
sl@0: 	if( buffer.Compare(aRemainder) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	return KErrNone;
sl@0: 	}
sl@0: 
sl@0: template<class TPtrCType, class TDesCType>
sl@0: LOCAL_C TInt DoExtractTokenFromListSingleSeparator(
sl@0: 												const TDesCType& aBuffer,
sl@0: 												const TDesCType& aToken0,
sl@0: 												const TDesCType& aToken1,
sl@0: 												const TDesCType& aToken2,
sl@0: 												const TDesCType& aRemainder,
sl@0: 												TChar			 aSeparator
sl@0: 												)
sl@0: 	{
sl@0: 	// get the first token...
sl@0: 	TPtrCType buffer = aBuffer;
sl@0: 	TPtrCType token;
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken0) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// get the second token
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken1) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// get the third token
sl@0: 	InetProtTextUtils::ExtractNextTokenFromList(buffer, token, aSeparator);
sl@0: 
sl@0: 	// Is it correct?
sl@0: 	if( token.Compare(aToken2) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	// Check that the remainder is correct
sl@0: 	if( buffer.Compare(aRemainder) != 0 )
sl@0: 		{
sl@0: 		// Failed
sl@0: 		return KErrNotFound;
sl@0: 		}
sl@0: 	return KErrNone;
sl@0: 	}