First public contribution.
1 // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
20 // Implementation of LOCAL functions - helper functions
24 template<class HBufCType, class TPtrCType, class TDelimitedParserType>
25 TInt DoDelimitedDataParsingL(const TDelimitedParserType& aParser, VA_LIST& aSegments)
27 // Loop through the list
28 TPtrCType parseSegment;
29 HBufCType* pExpected = GetNextArgLC<HBufCType>(aSegments);
32 // Get the parsed segment - test GetNext()
33 if( aParser.GetNext(parseSegment) == KErrNotFound )
35 // Should have found something - error!
36 CleanupStack::PopAndDestroy(pExpected); // pExpected
39 // Got the segment - compare against expected
40 if( parseSegment.Compare(*pExpected) != 0 )
42 CleanupStack::PopAndDestroy(pExpected); // pExpected
46 if( aParser.Dec() != KErrNone )
48 CleanupStack::PopAndDestroy(pExpected); // pExpected
52 if( aParser.Peek(parseSegment) == KErrNotFound )
54 // Should have found something - error!
55 CleanupStack::PopAndDestroy(pExpected); // pExpected
58 // Got the segment - compare against expected
59 if( parseSegment.Compare(*pExpected) != 0 )
61 CleanupStack::PopAndDestroy(pExpected); // pExpected
65 if( aParser.Inc() != KErrNone )
67 CleanupStack::PopAndDestroy(pExpected); // pExpected
70 // Ok get next expected segment
71 CleanupStack::PopAndDestroy(pExpected); // pExpected
72 pExpected = GetNextArgLC<HBufCType>(aSegments);
74 // Got to the end - should parse no more segments
75 if( aParser.GetNext(parseSegment) != KErrNotFound )
77 // Should not have found something - error!
81 if( aParser.Dec() != KErrNone )
86 if( aParser.Peek(parseSegment) == KErrNotFound )
88 // Should have found something - error!
92 if( aParser.Inc() != KErrNone )
97 if( !aParser.Eos() != KErrNone )
104 template<class HBufCType>
105 HBufCType* GetNextArgLC(VA_LIST& aList)
107 const TDesC* arg = VA_ARG(aList, const TDesC*);
112 HBufCType* buf = HBufCType::NewLC(arg->Length());
113 buf->Des().Copy(*arg);
117 template<class TDelimitedParserType>
118 TInt DoDelimiterPresenceTest(const TDelimitedParserType& aParser, TBool aFrontDelim, TBool aBackDelim)
120 TBool frontDelim = aParser.FrontDelimiter();
121 if( (!frontDelim && aFrontDelim) | (frontDelim && !aFrontDelim) )
125 TBool backDelim = aParser.BackDelimiter();
126 if( (!backDelim && aBackDelim) | (backDelim && !aBackDelim) )
133 template<class HBufCType, class TPtrCType, class TDelimitedParserType>
134 TInt DoDelimitedDataRemainderTestL(const TDelimitedParserType& aParser, VA_LIST& aRemainders)
136 // Loop through the list
137 TPtrCType parseRemainder;
138 HBufCType* pExpected = GetNextArgLC<HBufCType>(aRemainders);
141 // Get the remaining data
142 if( aParser.Remainder(parseRemainder) == KErrNotFound )
144 // Should have found something - error!
145 CleanupStack::PopAndDestroy(pExpected); // pExpected
148 // Got the remainder - compare against expected
149 if( parseRemainder.Compare(*pExpected) != 0 )
151 CleanupStack::PopAndDestroy(pExpected); // pExpected
154 // Ok, parse the to the next segment...
155 if( aParser.Inc() != KErrNone )
157 CleanupStack::PopAndDestroy(pExpected); // pExpected
160 // Ok get next expected remainder
161 CleanupStack::PopAndDestroy(pExpected); // pExpected
162 pExpected = GetNextArgLC<HBufCType>(aRemainders);
164 // Got to the end - should get no remainder
165 if( aParser.Remainder(parseRemainder) != KErrNotFound )
167 // Should not have found something - error!
173 template<class TDelimitedParserType, class TDesCType>
174 TInt DoDelimitedDataDes(const TDelimitedParserType& aParser, const TDesCType& aDelimitedData)
176 if( aParser.Des().Compare(aDelimitedData) != 0)
183 template<class HBufCType, class CDelimitedDataType>
184 TInt DoDelimitedDataPushFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
186 // Loop through the list
187 TInt error = KErrNone;
188 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
189 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
190 while( pExpected && pData )
193 TRAP(error, aParser->PushFrontL(*pData));
194 if( error != KErrNone )
196 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
199 // Check against expected
200 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
202 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
205 // Ok get next set of data
206 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
207 pData = GetNextArgLC<HBufCType>(aData);
208 pExpected = GetNextArgLC<HBufCType>(aData);
213 template<class HBufCType, class CDelimitedDataType>
214 TInt DoDelimitedDataPushBackL(CDelimitedDataType* aParser, VA_LIST& aData)
216 // Loop through the list
217 TInt error = KErrNone;
218 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
219 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
220 while( pExpected && pData )
223 TRAP(error, aParser->PushBackL(*pData));
224 if( error != KErrNone )
226 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
229 // Check against expected
230 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
232 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
235 // Ok get next set of data
236 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
237 pData = GetNextArgLC<HBufCType>(aData);
238 pExpected = GetNextArgLC<HBufCType>(aData);
243 template<class HBufCType, class CDelimitedDataType>
244 TInt DoDelimitedDataPopFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
246 // Loop through the list
247 TInt error = KErrNone;
248 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
252 TRAP(error, aParser->PopFrontL());
253 if( error != KErrNone )
255 CleanupStack::PopAndDestroy(pExpected); // pExpected
258 // Check against expected
259 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
261 CleanupStack::PopAndDestroy(pExpected); // pExpected
264 // Ok get next set of data
265 CleanupStack::PopAndDestroy(pExpected); // pExpected
266 pExpected = GetNextArgLC<HBufCType>(aData);
271 template<class HBufCType, class CDelimitedDataType>
272 TInt DoDelimitedDataPopBackL(CDelimitedDataType* aParser, VA_LIST& aData)
274 // Loop through the list
275 TInt error = KErrNone;
276 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
280 TRAP(error, aParser->PopBackL());
281 if( error != KErrNone )
283 CleanupStack::PopAndDestroy(pExpected); // pExpected
286 // Check against expected
287 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
289 CleanupStack::PopAndDestroy(pExpected); // pExpected
292 // Ok get next set of data
293 CleanupStack::PopAndDestroy(pExpected); // pExpected
294 pExpected = GetNextArgLC<HBufCType>(aData);
299 template<class CDelimitedDataType>
300 TInt DoDelimitedDataAddAndTrimFrontAndBackDelimiterL(CDelimitedDataType* aParser)
302 TInt error = KErrNone;
303 // Add front delimiter
304 TRAP(error, aParser->AddFrontDelimiterL());
305 if( error != KErrNone )
309 if( !aParser->Parser().FrontDelimiter() )
313 // Trim front delimiter
314 TRAP(error, aParser->TrimFrontDelimiterL());
315 if( error != KErrNone )
319 if( aParser->Parser().FrontDelimiter() )
323 // Add back delimiter
324 TRAP(error, aParser->AddBackDelimiterL());
325 if( error != KErrNone )
329 if( !aParser->Parser().BackDelimiter() )
333 // Trim back delimiter
334 TRAP(error, aParser->TrimBackDelimiterL());
335 if( error != KErrNone )
339 if( aParser->Parser().BackDelimiter() )
346 template<class CDelimitedDataType>
347 TInt DoDelimitedDataParseToPosition(CDelimitedDataType* aParser, TInt aStartPos)
349 // Parse to correct place - initial parse must have been done
351 while( i < aStartPos && !aParser->Parser().Eos() )
353 aParser->Parser().Inc();
363 template<class HBufCType, class TPtrCType, class CDelimitedDataType>
364 TInt DoDelimitedDataInsertL(CDelimitedDataType* aParser, VA_LIST& aData)
366 // Loop through the list and insert!
367 TInt error = KErrNone;
368 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
369 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
370 while( pExpected && pData )
372 // Get copy of current segment
374 aParser->Parser().Peek(seg);
375 HBufCType* segCopy = seg.AllocLC();
377 TRAP(error, aParser->InsertCurrentL(*pData));
378 if( error != KErrNone )
380 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
383 // Check against expected
384 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
386 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
389 // Check that the current segment hasn't changed
390 aParser->Parser().Peek(seg);
391 if( segCopy->Compare(seg) != 0 )
393 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
396 // Ok get next set of data
397 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
398 pData = GetNextArgLC<HBufCType>(aData);
399 pExpected = GetNextArgLC<HBufCType>(aData);
404 template<class HBufCType, class TPtrCType, class CDelimitedDataType>
405 TInt DoDelimitedDataRemoveL(CDelimitedDataType* aParser, VA_LIST& aData)
407 // Loop through the list
408 TInt error = KErrNone;
409 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
413 TRAP(error, aParser->RemoveCurrentL());
414 if( error != KErrNone )
416 CleanupStack::PopAndDestroy(pExpected); // pExpected
419 // Check against expected
420 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
422 CleanupStack::PopAndDestroy(pExpected); // pExpected
425 // Ok get next set of data
426 CleanupStack::PopAndDestroy(pExpected); // pExpected
427 pExpected = GetNextArgLC<HBufCType>(aData);
432 template<class HBufCType, class TPtrCType, class CDelimitedDataType>
433 TInt DoDelimitedDataInsertAndEscapeL(CDelimitedDataType* aParser, VA_LIST& aData)
435 // Loop through the list and insert!
436 TInt error = KErrNone;
437 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
438 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
439 while( pExpected && pData )
441 // Get copy of current segment
443 aParser->Parser().Peek(seg);
444 HBufCType* segCopy = seg.AllocLC();
446 TRAP(error, aParser->InsertAndEscapeCurrentL(*pData));
447 if( error != KErrNone )
449 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
452 // Check against expected
453 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
455 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
458 // Check that the current segment hasn't changed
459 aParser->Parser().Peek(seg);
460 if( segCopy->Compare(seg) != 0 )
462 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
465 // Ok get next set of data
466 CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy
467 pData = GetNextArgLC<HBufCType>(aData);
468 pExpected = GetNextArgLC<HBufCType>(aData);
473 template<class HBufCType, class CDelimitedDataType>
474 TInt DoDelimitedDataPushAndEscapeFrontL(CDelimitedDataType* aParser, VA_LIST& aData)
476 // Loop through the list
477 TInt error = KErrNone;
478 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
479 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
480 while( pExpected && pData )
483 TRAP(error, aParser->PushAndEscapeFrontL(*pData));
484 if( error != KErrNone )
486 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
489 // Check against expected
490 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
492 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
495 // Ok get next set of data
496 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
497 pData = GetNextArgLC<HBufCType>(aData);
498 pExpected = GetNextArgLC<HBufCType>(aData);
503 template<class HBufCType, class CDelimitedDataType>
504 TInt DoDelimitedDataPushAndEscapeBackL(CDelimitedDataType* aParser, VA_LIST& aData)
506 // Loop through the list
507 TInt error = KErrNone;
508 HBufCType* pData = GetNextArgLC<HBufCType>(aData);
509 HBufCType* pExpected = GetNextArgLC<HBufCType>(aData);
510 while( pExpected && pData )
513 TRAP(error, aParser->PushAndEscapeBackL(*pData));
514 if( error != KErrNone )
516 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
519 // Check against expected
520 if( aParser->Parser().Des().Compare(*pExpected) != 0 )
522 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
525 // Ok get next set of data
526 CleanupStack::PopAndDestroy(2, pData); // pData, pExpected
527 pData = GetNextArgLC<HBufCType>(aData);
528 pExpected = GetNextArgLC<HBufCType>(aData);