os/ossrv/genericservices/httputils/Test/t_uriparser/TDelimitedDataCommon.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <e32base.h>
sl@0
    17
sl@0
    18
//
sl@0
    19
//
sl@0
    20
//	Implementation of LOCAL functions - helper functions
sl@0
    21
//
sl@0
    22
//
sl@0
    23
sl@0
    24
template<class HBufCType, class TPtrCType, class TDelimitedParserType>
sl@0
    25
TInt DoDelimitedDataParsingL(const TDelimitedParserType& aParser, VA_LIST& aSegments)
sl@0
    26
	{
sl@0
    27
	// Loop through the list
sl@0
    28
	TPtrCType parseSegment;
sl@0
    29
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aSegments);
sl@0
    30
	while( pExpected )
sl@0
    31
		{
sl@0
    32
		// Get the parsed segment - test GetNext()
sl@0
    33
		if( aParser.GetNext(parseSegment) == KErrNotFound )
sl@0
    34
			{
sl@0
    35
			// Should have found something - error!
sl@0
    36
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    37
			return KErrNotFound;
sl@0
    38
			}
sl@0
    39
		// Got the segment - compare against expected
sl@0
    40
		if( parseSegment.Compare(*pExpected) != 0 )
sl@0
    41
			{
sl@0
    42
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    43
			return KErrNotFound;
sl@0
    44
			}
sl@0
    45
		// Ok, test Dec()...
sl@0
    46
		if( aParser.Dec() != KErrNone )
sl@0
    47
			{
sl@0
    48
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    49
			return KErrNotFound;
sl@0
    50
			}
sl@0
    51
		// Test Peek()
sl@0
    52
		if( aParser.Peek(parseSegment) == KErrNotFound )
sl@0
    53
			{
sl@0
    54
			// Should have found something - error!
sl@0
    55
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    56
			return KErrNotFound;
sl@0
    57
			}
sl@0
    58
		// Got the segment - compare against expected
sl@0
    59
		if( parseSegment.Compare(*pExpected) != 0 )
sl@0
    60
			{
sl@0
    61
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    62
			return KErrNotFound;
sl@0
    63
			}
sl@0
    64
		// Ok, test Inc()...
sl@0
    65
		if( aParser.Inc() != KErrNone )
sl@0
    66
			{
sl@0
    67
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    68
			return KErrNotFound;
sl@0
    69
			}
sl@0
    70
		// Ok get next expected segment
sl@0
    71
		CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
    72
		pExpected = GetNextArgLC<HBufCType>(aSegments);
sl@0
    73
		}
sl@0
    74
	// Got to the end - should parse no more segments
sl@0
    75
	if( aParser.GetNext(parseSegment) != KErrNotFound )
sl@0
    76
		{
sl@0
    77
		// Should not have found something - error!
sl@0
    78
		return KErrNotFound;
sl@0
    79
		}
sl@0
    80
	// Ok, test Dec()...
sl@0
    81
	if( aParser.Dec() != KErrNone )
sl@0
    82
		{
sl@0
    83
		return KErrNotFound;
sl@0
    84
		}
sl@0
    85
	// Test Peek()
sl@0
    86
	if( aParser.Peek(parseSegment) == KErrNotFound )
sl@0
    87
		{
sl@0
    88
		// Should have found something - error!
sl@0
    89
		return KErrNotFound;
sl@0
    90
		}
sl@0
    91
	// Ok, test Inc()...
sl@0
    92
	if( aParser.Inc() != KErrNone )
sl@0
    93
		{
sl@0
    94
		return KErrNotFound;
sl@0
    95
		}
sl@0
    96
	// Ok, test Eos()
sl@0
    97
	if( !aParser.Eos() != KErrNone )
sl@0
    98
		{
sl@0
    99
		return KErrNotFound;
sl@0
   100
		}
sl@0
   101
	return KErrNone;
sl@0
   102
	}
sl@0
   103
sl@0
   104
template<class HBufCType>
sl@0
   105
HBufCType* GetNextArgLC(VA_LIST& aList)
sl@0
   106
	{
sl@0
   107
	const TDesC* arg = VA_ARG(aList, const TDesC*);
sl@0
   108
	if( arg == NULL )
sl@0
   109
		{
sl@0
   110
		return NULL;
sl@0
   111
		}
sl@0
   112
	HBufCType* buf = HBufCType::NewLC(arg->Length());
sl@0
   113
	buf->Des().Copy(*arg);
sl@0
   114
	return buf;
sl@0
   115
	}
sl@0
   116
sl@0
   117
template<class TDelimitedParserType>
sl@0
   118
TInt DoDelimiterPresenceTest(const TDelimitedParserType& aParser, TBool aFrontDelim, TBool aBackDelim)
sl@0
   119
	{
sl@0
   120
	TBool frontDelim = aParser.FrontDelimiter();
sl@0
   121
	if( (!frontDelim && aFrontDelim) | (frontDelim && !aFrontDelim) )
sl@0
   122
		{
sl@0
   123
		return KErrNotFound;
sl@0
   124
		}
sl@0
   125
	TBool backDelim = aParser.BackDelimiter();
sl@0
   126
	if( (!backDelim && aBackDelim) | (backDelim && !aBackDelim) )
sl@0
   127
		{
sl@0
   128
		return KErrNotFound;
sl@0
   129
		}
sl@0
   130
	return KErrNone;
sl@0
   131
	}
sl@0
   132
sl@0
   133
template<class HBufCType, class TPtrCType, class TDelimitedParserType>
sl@0
   134
TInt DoDelimitedDataRemainderTestL(const TDelimitedParserType& aParser, VA_LIST& aRemainders)
sl@0
   135
	{
sl@0
   136
	// Loop through the list
sl@0
   137
	TPtrCType parseRemainder;
sl@0
   138
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aRemainders);
sl@0
   139
	while( pExpected )
sl@0
   140
		{
sl@0
   141
		// Get the remaining data
sl@0
   142
		if( aParser.Remainder(parseRemainder) == KErrNotFound )
sl@0
   143
			{
sl@0
   144
			// Should have found something - error!
sl@0
   145
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   146
			return KErrNotFound;
sl@0
   147
			}
sl@0
   148
		// Got the remainder - compare against expected
sl@0
   149
		if( parseRemainder.Compare(*pExpected) != 0 )
sl@0
   150
			{
sl@0
   151
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   152
			return KErrNotFound;
sl@0
   153
			}
sl@0
   154
		// Ok, parse the to the next segment...
sl@0
   155
		if( aParser.Inc() != KErrNone )
sl@0
   156
			{
sl@0
   157
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   158
			return KErrNotFound;
sl@0
   159
			}
sl@0
   160
		// Ok get next expected remainder
sl@0
   161
		CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   162
		pExpected = GetNextArgLC<HBufCType>(aRemainders);
sl@0
   163
		}
sl@0
   164
	// Got to the end - should get no remainder
sl@0
   165
	if( aParser.Remainder(parseRemainder) != KErrNotFound )
sl@0
   166
		{
sl@0
   167
		// Should not have found something - error!
sl@0
   168
		return KErrNotFound;
sl@0
   169
		}
sl@0
   170
	return KErrNone;
sl@0
   171
	}
sl@0
   172
sl@0
   173
template<class TDelimitedParserType, class TDesCType>
sl@0
   174
TInt DoDelimitedDataDes(const TDelimitedParserType& aParser, const TDesCType& aDelimitedData)
sl@0
   175
	{
sl@0
   176
	if( aParser.Des().Compare(aDelimitedData) != 0)
sl@0
   177
		{
sl@0
   178
		return KErrNotFound;
sl@0
   179
		}
sl@0
   180
	return KErrNone;
sl@0
   181
	}
sl@0
   182
sl@0
   183
template<class HBufCType, class CDelimitedDataType>
sl@0
   184
TInt DoDelimitedDataPushFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   185
	{
sl@0
   186
	// Loop through the list
sl@0
   187
	TInt error = KErrNone;
sl@0
   188
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   189
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   190
	while( pExpected && pData )
sl@0
   191
		{
sl@0
   192
		// Push front
sl@0
   193
		TRAP(error, aParser->PushFrontL(*pData));
sl@0
   194
		if( error != KErrNone )
sl@0
   195
			{
sl@0
   196
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   197
			return error;
sl@0
   198
			}
sl@0
   199
		// Check against expected
sl@0
   200
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   201
			{
sl@0
   202
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   203
			return KErrNotFound;
sl@0
   204
			}
sl@0
   205
		// Ok get next set of data
sl@0
   206
		CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   207
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   208
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   209
		}
sl@0
   210
	return KErrNone;
sl@0
   211
	}
sl@0
   212
sl@0
   213
template<class HBufCType, class CDelimitedDataType>
sl@0
   214
TInt DoDelimitedDataPushBackL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   215
	{
sl@0
   216
	// Loop through the list
sl@0
   217
	TInt error = KErrNone;
sl@0
   218
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   219
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   220
	while( pExpected && pData )
sl@0
   221
		{
sl@0
   222
		// Push front
sl@0
   223
		TRAP(error, aParser->PushBackL(*pData));
sl@0
   224
		if( error != KErrNone )
sl@0
   225
			{
sl@0
   226
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   227
			return error;
sl@0
   228
			}
sl@0
   229
		// Check against expected
sl@0
   230
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   231
			{
sl@0
   232
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   233
			return KErrNotFound;
sl@0
   234
			}
sl@0
   235
		// Ok get next set of data
sl@0
   236
		CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   237
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   238
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   239
		}
sl@0
   240
	return KErrNone;
sl@0
   241
	}
sl@0
   242
sl@0
   243
template<class HBufCType, class CDelimitedDataType>
sl@0
   244
TInt DoDelimitedDataPopFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   245
	{
sl@0
   246
	// Loop through the list
sl@0
   247
	TInt error = KErrNone;
sl@0
   248
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   249
	while( pExpected )
sl@0
   250
		{
sl@0
   251
		// Push front
sl@0
   252
		TRAP(error, aParser->PopFrontL());
sl@0
   253
		if( error != KErrNone )
sl@0
   254
			{
sl@0
   255
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   256
			return error;
sl@0
   257
			}
sl@0
   258
		// Check against expected
sl@0
   259
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   260
			{
sl@0
   261
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   262
			return KErrNotFound;
sl@0
   263
			}
sl@0
   264
		// Ok get next set of data
sl@0
   265
		CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   266
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   267
		}
sl@0
   268
	return KErrNone;
sl@0
   269
	}
sl@0
   270
sl@0
   271
template<class HBufCType, class CDelimitedDataType>
sl@0
   272
TInt DoDelimitedDataPopBackL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   273
	{
sl@0
   274
	// Loop through the list
sl@0
   275
	TInt error = KErrNone;
sl@0
   276
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   277
	while( pExpected )
sl@0
   278
		{
sl@0
   279
		// Push front
sl@0
   280
		TRAP(error, aParser->PopBackL());
sl@0
   281
		if( error != KErrNone )
sl@0
   282
			{
sl@0
   283
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   284
			return error;
sl@0
   285
			}
sl@0
   286
		// Check against expected
sl@0
   287
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   288
			{
sl@0
   289
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   290
			return KErrNotFound;
sl@0
   291
			}
sl@0
   292
		// Ok get next set of data
sl@0
   293
		CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   294
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   295
		}
sl@0
   296
	return KErrNone;
sl@0
   297
	}
sl@0
   298
sl@0
   299
template<class CDelimitedDataType>
sl@0
   300
TInt DoDelimitedDataAddAndTrimFrontAndBackDelimiterL(CDelimitedDataType* aParser)
sl@0
   301
	{
sl@0
   302
	TInt error = KErrNone;
sl@0
   303
	// Add front delimiter
sl@0
   304
	TRAP(error, aParser->AddFrontDelimiterL());
sl@0
   305
	if( error != KErrNone )
sl@0
   306
		{
sl@0
   307
		return KErrNotFound;
sl@0
   308
		}
sl@0
   309
	if( !aParser->Parser().FrontDelimiter() )
sl@0
   310
		{
sl@0
   311
		return KErrNotFound;
sl@0
   312
		}
sl@0
   313
	// Trim front delimiter
sl@0
   314
	TRAP(error, aParser->TrimFrontDelimiterL());
sl@0
   315
	if( error != KErrNone )
sl@0
   316
		{
sl@0
   317
		return KErrNotFound;
sl@0
   318
		}
sl@0
   319
	if( aParser->Parser().FrontDelimiter() )
sl@0
   320
		{
sl@0
   321
		return KErrNotFound;
sl@0
   322
		}
sl@0
   323
	// Add back delimiter
sl@0
   324
	TRAP(error, aParser->AddBackDelimiterL());
sl@0
   325
	if( error != KErrNone )
sl@0
   326
		{
sl@0
   327
		return KErrNotFound;
sl@0
   328
		}
sl@0
   329
	if( !aParser->Parser().BackDelimiter() )
sl@0
   330
		{
sl@0
   331
		return KErrNotFound;
sl@0
   332
		}
sl@0
   333
	// Trim back delimiter
sl@0
   334
	TRAP(error, aParser->TrimBackDelimiterL());
sl@0
   335
	if( error != KErrNone )
sl@0
   336
		{
sl@0
   337
		return KErrNotFound;
sl@0
   338
		}
sl@0
   339
	if( aParser->Parser().BackDelimiter() )
sl@0
   340
		{
sl@0
   341
		return KErrNotFound;
sl@0
   342
		}
sl@0
   343
	return KErrNone;
sl@0
   344
	}
sl@0
   345
sl@0
   346
template<class CDelimitedDataType>
sl@0
   347
TInt DoDelimitedDataParseToPosition(CDelimitedDataType* aParser, TInt aStartPos)
sl@0
   348
	{
sl@0
   349
	// Parse to correct place - initial parse must have been done
sl@0
   350
	TInt i=0;
sl@0
   351
	while( i < aStartPos && !aParser->Parser().Eos() )
sl@0
   352
		{
sl@0
   353
		aParser->Parser().Inc();
sl@0
   354
		++i;
sl@0
   355
		}
sl@0
   356
	if( i != aStartPos )
sl@0
   357
		{
sl@0
   358
		return KErrNotFound;
sl@0
   359
		}
sl@0
   360
	return KErrNone;
sl@0
   361
	}
sl@0
   362
sl@0
   363
template<class HBufCType, class TPtrCType, class CDelimitedDataType>
sl@0
   364
TInt DoDelimitedDataInsertL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   365
	{
sl@0
   366
	// Loop through the list and insert!
sl@0
   367
	TInt error = KErrNone;
sl@0
   368
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   369
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   370
	while( pExpected && pData )
sl@0
   371
		{
sl@0
   372
		// Get copy of current segment
sl@0
   373
		TPtrCType seg;
sl@0
   374
		aParser->Parser().Peek(seg);
sl@0
   375
		HBufCType* segCopy = seg.AllocLC();
sl@0
   376
		// Insert current
sl@0
   377
		TRAP(error, aParser->InsertCurrentL(*pData));
sl@0
   378
		if( error != KErrNone )
sl@0
   379
			{
sl@0
   380
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   381
			return error;
sl@0
   382
			}
sl@0
   383
		// Check against expected
sl@0
   384
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   385
			{
sl@0
   386
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   387
			return KErrNotFound;
sl@0
   388
			}
sl@0
   389
		// Check that the current segment hasn't changed
sl@0
   390
		aParser->Parser().Peek(seg);
sl@0
   391
		if( segCopy->Compare(seg) != 0 )
sl@0
   392
			{
sl@0
   393
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   394
			return KErrNotFound;
sl@0
   395
			}
sl@0
   396
		// Ok get next set of data
sl@0
   397
		CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   398
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   399
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   400
		}
sl@0
   401
	return KErrNone;
sl@0
   402
	}
sl@0
   403
sl@0
   404
template<class HBufCType, class TPtrCType, class CDelimitedDataType>
sl@0
   405
TInt DoDelimitedDataRemoveL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   406
	{
sl@0
   407
	// Loop through the list
sl@0
   408
	TInt error = KErrNone;
sl@0
   409
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   410
	while( pExpected )
sl@0
   411
		{
sl@0
   412
		// Remove current
sl@0
   413
		TRAP(error, aParser->RemoveCurrentL());
sl@0
   414
		if( error != KErrNone )
sl@0
   415
			{
sl@0
   416
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   417
			return error;
sl@0
   418
			}
sl@0
   419
		// Check against expected
sl@0
   420
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   421
			{
sl@0
   422
			CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   423
			return KErrNotFound;
sl@0
   424
			}
sl@0
   425
		// Ok get next set of data
sl@0
   426
		CleanupStack::PopAndDestroy(pExpected);	// pExpected
sl@0
   427
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   428
		}
sl@0
   429
	return KErrNone;
sl@0
   430
	}
sl@0
   431
sl@0
   432
template<class HBufCType, class TPtrCType, class CDelimitedDataType>
sl@0
   433
TInt DoDelimitedDataInsertAndEscapeL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   434
	{
sl@0
   435
	// Loop through the list and insert!
sl@0
   436
	TInt error = KErrNone;
sl@0
   437
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   438
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   439
	while( pExpected && pData )
sl@0
   440
		{
sl@0
   441
		// Get copy of current segment
sl@0
   442
		TPtrCType seg;
sl@0
   443
		aParser->Parser().Peek(seg);
sl@0
   444
		HBufCType* segCopy = seg.AllocLC();
sl@0
   445
		// Insert current
sl@0
   446
		TRAP(error, aParser->InsertAndEscapeCurrentL(*pData));
sl@0
   447
		if( error != KErrNone )
sl@0
   448
			{
sl@0
   449
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   450
			return error;
sl@0
   451
			}
sl@0
   452
		// Check against expected
sl@0
   453
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   454
			{
sl@0
   455
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   456
			return KErrNotFound;
sl@0
   457
			}
sl@0
   458
		// Check that the current segment hasn't changed
sl@0
   459
		aParser->Parser().Peek(seg);
sl@0
   460
		if( segCopy->Compare(seg) != 0 )
sl@0
   461
			{
sl@0
   462
			CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   463
			return KErrNotFound;
sl@0
   464
			}
sl@0
   465
		// Ok get next set of data
sl@0
   466
		CleanupStack::PopAndDestroy(3, pData);	// pData, pExpected, segCopy
sl@0
   467
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   468
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   469
		}
sl@0
   470
	return KErrNone;
sl@0
   471
	}
sl@0
   472
sl@0
   473
template<class HBufCType, class CDelimitedDataType>
sl@0
   474
TInt DoDelimitedDataPushAndEscapeFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   475
	{
sl@0
   476
	// Loop through the list
sl@0
   477
	TInt error = KErrNone;
sl@0
   478
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   479
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   480
	while( pExpected && pData )
sl@0
   481
		{
sl@0
   482
		// Push front
sl@0
   483
		TRAP(error, aParser->PushAndEscapeFrontL(*pData));
sl@0
   484
		if( error != KErrNone )
sl@0
   485
			{
sl@0
   486
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   487
			return error;
sl@0
   488
			}
sl@0
   489
		// Check against expected
sl@0
   490
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   491
			{
sl@0
   492
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   493
			return KErrNotFound;
sl@0
   494
			}
sl@0
   495
		// Ok get next set of data
sl@0
   496
		CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   497
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   498
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   499
		}
sl@0
   500
	return KErrNone;
sl@0
   501
	}
sl@0
   502
sl@0
   503
template<class HBufCType, class CDelimitedDataType>
sl@0
   504
TInt DoDelimitedDataPushAndEscapeBackL(CDelimitedDataType* aParser, VA_LIST& aData)
sl@0
   505
	{
sl@0
   506
	// Loop through the list
sl@0
   507
	TInt error = KErrNone;
sl@0
   508
	HBufCType* pData = GetNextArgLC<HBufCType>(aData);
sl@0
   509
	HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   510
	while( pExpected && pData )
sl@0
   511
		{
sl@0
   512
		// Push front
sl@0
   513
		TRAP(error, aParser->PushAndEscapeBackL(*pData));
sl@0
   514
		if( error != KErrNone )
sl@0
   515
			{
sl@0
   516
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   517
			return error;
sl@0
   518
			}
sl@0
   519
		// Check against expected
sl@0
   520
		if( aParser->Parser().Des().Compare(*pExpected) != 0 )
sl@0
   521
			{
sl@0
   522
			CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   523
			return KErrNotFound;
sl@0
   524
			}
sl@0
   525
		// Ok get next set of data
sl@0
   526
		CleanupStack::PopAndDestroy(2, pData);	// pData, pExpected
sl@0
   527
		pData = GetNextArgLC<HBufCType>(aData);
sl@0
   528
		pExpected = GetNextArgLC<HBufCType>(aData);
sl@0
   529
		}
sl@0
   530
	return KErrNone;
sl@0
   531
	}