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 sl@0: sl@0: // sl@0: // sl@0: // Implementation of LOCAL functions - helper functions sl@0: // sl@0: // sl@0: sl@0: template sl@0: TInt DoDelimitedDataParsingL(const TDelimitedParserType& aParser, VA_LIST& aSegments) sl@0: { sl@0: // Loop through the list sl@0: TPtrCType parseSegment; sl@0: HBufCType* pExpected = GetNextArgLC(aSegments); sl@0: while( pExpected ) sl@0: { sl@0: // Get the parsed segment - test GetNext() sl@0: if( aParser.GetNext(parseSegment) == KErrNotFound ) sl@0: { sl@0: // Should have found something - error! sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Got the segment - compare against expected sl@0: if( parseSegment.Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, test Dec()... sl@0: if( aParser.Dec() != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Test Peek() sl@0: if( aParser.Peek(parseSegment) == KErrNotFound ) sl@0: { sl@0: // Should have found something - error! sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Got the segment - compare against expected sl@0: if( parseSegment.Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, test Inc()... sl@0: if( aParser.Inc() != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next expected segment sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: pExpected = GetNextArgLC(aSegments); sl@0: } sl@0: // Got to the end - should parse no more segments sl@0: if( aParser.GetNext(parseSegment) != KErrNotFound ) sl@0: { sl@0: // Should not have found something - error! sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, test Dec()... sl@0: if( aParser.Dec() != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: // Test Peek() sl@0: if( aParser.Peek(parseSegment) == KErrNotFound ) sl@0: { sl@0: // Should have found something - error! sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, test Inc()... sl@0: if( aParser.Inc() != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, test Eos() sl@0: if( !aParser.Eos() != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: HBufCType* GetNextArgLC(VA_LIST& aList) sl@0: { sl@0: const TDesC* arg = VA_ARG(aList, const TDesC*); sl@0: if( arg == NULL ) sl@0: { sl@0: return NULL; sl@0: } sl@0: HBufCType* buf = HBufCType::NewLC(arg->Length()); sl@0: buf->Des().Copy(*arg); sl@0: return buf; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimiterPresenceTest(const TDelimitedParserType& aParser, TBool aFrontDelim, TBool aBackDelim) sl@0: { sl@0: TBool frontDelim = aParser.FrontDelimiter(); sl@0: if( (!frontDelim && aFrontDelim) | (frontDelim && !aFrontDelim) ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: TBool backDelim = aParser.BackDelimiter(); sl@0: if( (!backDelim && aBackDelim) | (backDelim && !aBackDelim) ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataRemainderTestL(const TDelimitedParserType& aParser, VA_LIST& aRemainders) sl@0: { sl@0: // Loop through the list sl@0: TPtrCType parseRemainder; sl@0: HBufCType* pExpected = GetNextArgLC(aRemainders); sl@0: while( pExpected ) sl@0: { sl@0: // Get the remaining data sl@0: if( aParser.Remainder(parseRemainder) == KErrNotFound ) sl@0: { sl@0: // Should have found something - error! sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Got the remainder - compare against expected sl@0: if( parseRemainder.Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok, parse the to the next segment... sl@0: if( aParser.Inc() != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next expected remainder sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: pExpected = GetNextArgLC(aRemainders); sl@0: } sl@0: // Got to the end - should get no remainder sl@0: if( aParser.Remainder(parseRemainder) != KErrNotFound ) sl@0: { sl@0: // Should not have found something - error! sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataDes(const TDelimitedParserType& aParser, const TDesCType& aDelimitedData) sl@0: { sl@0: if( aParser.Des().Compare(aDelimitedData) != 0) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPushFrontL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PushFrontL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPushBackL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PushBackL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPopFrontL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PopFrontL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPopBackL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PopBackL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataAddAndTrimFrontAndBackDelimiterL(CDelimitedDataType* aParser) sl@0: { sl@0: TInt error = KErrNone; sl@0: // Add front delimiter sl@0: TRAP(error, aParser->AddFrontDelimiterL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: if( !aParser->Parser().FrontDelimiter() ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: // Trim front delimiter sl@0: TRAP(error, aParser->TrimFrontDelimiterL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: if( aParser->Parser().FrontDelimiter() ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: // Add back delimiter sl@0: TRAP(error, aParser->AddBackDelimiterL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: if( !aParser->Parser().BackDelimiter() ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: // Trim back delimiter sl@0: TRAP(error, aParser->TrimBackDelimiterL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: if( aParser->Parser().BackDelimiter() ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataParseToPosition(CDelimitedDataType* aParser, TInt aStartPos) sl@0: { sl@0: // Parse to correct place - initial parse must have been done sl@0: TInt i=0; sl@0: while( i < aStartPos && !aParser->Parser().Eos() ) sl@0: { sl@0: aParser->Parser().Inc(); sl@0: ++i; sl@0: } sl@0: if( i != aStartPos ) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataInsertL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list and insert! sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Get copy of current segment sl@0: TPtrCType seg; sl@0: aParser->Parser().Peek(seg); sl@0: HBufCType* segCopy = seg.AllocLC(); sl@0: // Insert current sl@0: TRAP(error, aParser->InsertCurrentL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return KErrNotFound; sl@0: } sl@0: // Check that the current segment hasn't changed sl@0: aParser->Parser().Peek(seg); sl@0: if( segCopy->Compare(seg) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataRemoveL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected ) sl@0: { sl@0: // Remove current sl@0: TRAP(error, aParser->RemoveCurrentL()); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(pExpected); // pExpected sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataInsertAndEscapeL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list and insert! sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Get copy of current segment sl@0: TPtrCType seg; sl@0: aParser->Parser().Peek(seg); sl@0: HBufCType* segCopy = seg.AllocLC(); sl@0: // Insert current sl@0: TRAP(error, aParser->InsertAndEscapeCurrentL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return KErrNotFound; sl@0: } sl@0: // Check that the current segment hasn't changed sl@0: aParser->Parser().Peek(seg); sl@0: if( segCopy->Compare(seg) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(3, pData); // pData, pExpected, segCopy sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPushAndEscapeFrontL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PushAndEscapeFrontL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: template sl@0: TInt DoDelimitedDataPushAndEscapeBackL(CDelimitedDataType* aParser, VA_LIST& aData) sl@0: { sl@0: // Loop through the list sl@0: TInt error = KErrNone; sl@0: HBufCType* pData = GetNextArgLC(aData); sl@0: HBufCType* pExpected = GetNextArgLC(aData); sl@0: while( pExpected && pData ) sl@0: { sl@0: // Push front sl@0: TRAP(error, aParser->PushAndEscapeBackL(*pData)); sl@0: if( error != KErrNone ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return error; sl@0: } sl@0: // Check against expected sl@0: if( aParser->Parser().Des().Compare(*pExpected) != 0 ) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: return KErrNotFound; sl@0: } sl@0: // Ok get next set of data sl@0: CleanupStack::PopAndDestroy(2, pData); // pData, pExpected sl@0: pData = GetNextArgLC(aData); sl@0: pExpected = GetNextArgLC(aData); sl@0: } sl@0: return KErrNone; sl@0: }