diff -r 000000000000 -r 72b543305e3a email/imap4mtm/imapsession/test/src/ctestimapatombuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imapsession/test/src/ctestimapatombuilder.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,207 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#include "ctestimapatombuilder.h" + +#include + +#include "cimapatom.h" +#include "cimapatomparser.h" +#include "cimapatomwalker.h" +#include "cimaplogger.h" + +CTestImapAtomBuilder::CTestImapAtomBuilder() + : iAtomParser(NULL) + {} + +CTestImapAtomBuilder::~CTestImapAtomBuilder() + { + delete iAtomParser; + } + +void CTestImapAtomBuilder::SetupL() + { + iAtomParser = CImapAtomParser::NewL(EFalse, KDefaultLog); + } + +void CTestImapAtomBuilder::TearDownL() + { + delete iAtomParser; + iAtomParser = NULL; + } + +// Tests +void CTestImapAtomBuilder::TestAtomParserL() + { + INFO_PRINTF1(_L("TestL")); + + _LIT8(KLine, "sugar (one (two \"33 () three\" )) apple wibble"); + TPtrC8 ptrLine = KLine(); + TBool wantMore = iAtomParser->ProcessLineL(ptrLine); + + ASSERT_FALSE(wantMore); + + CImapAtom* root = iAtomParser->RootAtom(); + RPointerArray stack; + stack.AppendL(root); + + CImapAtom* current = root; + + while(current!=NULL) + { + TPtrC8 ptrAtom = current->Atom(EFalse); + TInt topOfStack = stack.Count() - 1; + + // Log the data (SendDataReq is non-leaving, so avoid leaving. Hence no cleanup stack) + HBufC16* unicodeAtom = NULL; + TRAPD(err, + unicodeAtom = CnvUtfConverter::ConvertToUnicodeFromUtf8L(ptrAtom); + ); + + if (err == KErrNone) + { + INFO_PRINTF3(_L("%d [%S]"), topOfStack, unicodeAtom); + } + + delete unicodeAtom; + unicodeAtom=NULL; + + // Try going down + CImapAtom* candidateAtom = current->Child(); + if (candidateAtom != NULL) + { + stack.AppendL(candidateAtom); + ++topOfStack; + } + // Try going along + else + { + candidateAtom = current->Next(); + // Try going back-up-and-along + while (candidateAtom == NULL && topOfStack > 0) + { + stack.Remove(topOfStack); + --topOfStack; + candidateAtom = stack[topOfStack]; + candidateAtom = candidateAtom->Next(); + } + + stack[topOfStack] = candidateAtom; + } + + // Could use a table (or at least tables - need repeats) to parse different BODYSTRUCTURE's !!! + current = candidateAtom; + } + + stack.Reset(); + + INFO_PRINTF1(_L("Complete")); + } + +void CTestImapAtomBuilder::TestWalkerL() + { + INFO_PRINTF1(_L("TestWalkerL")); + +// _LIT8(KLine, "spandex (one (two \"33 () three\" )) arse wibble (apple ((pear) banana) cherry) dog"); +// TPtrC8 ptrLine = KLine(); +// TBool wantMore = iAtomParser->ProcessLineL(ptrLine); +// ASSERT_FALSE(wantMore); + + _LIT8(KLine1, "(TEXT PLAIN (name1 value1 name2 value2) ID {25}"); + _LIT8(KLit2, "first line\r\nsecond line\r\n"); +// _LIT8(KLine3, "encoding size lines"); +// _LIT8(KLine3, "encoding size \"missing quote"); // and missing end bracket! + _LIT8(KLine3, "encoding size lines) Stuff at the end that we're not interested in"); +// _LIT8(KLine3, "encoding size lines)"); + + TBool wantMore = iAtomParser->ProcessLineL(KLine1); + ASSERT_TRUE(wantMore); + iAtomParser->ProcessLiteralBlockL(KLit2); + wantMore = iAtomParser->ProcessLineL(KLine3); + ASSERT_FALSE(wantMore); + + DumpAtomTreeL(iAtomParser->RootAtom()); + + TPtrC8 unparsed = iAtomParser->UnparsedData(); + TInt len = unparsed.Length(); + } + +void CTestImapAtomBuilder::DumpAtomTreeL(CImapAtom* aRoot) + { + CImapAtomWalker* atomWalker = CImapAtomWalker::NewL(KDefaultLog); + CleanupStack::PushL(atomWalker); + atomWalker->SetRootL(aRoot); + + TBool bFound = ETrue; + + while(bFound) + { + TPtrC8 ptrAtom = atomWalker->CurrentDes(EFalse); + + // Log the data (SendDataReq is non-leaving, so avoid leaving. Hence no cleanup stack) + HBufC16* unicodeAtom = NULL; + TRAPD(err, + unicodeAtom = CnvUtfConverter::ConvertToUnicodeFromUtf8L(ptrAtom); + ); + + if (err == KErrNone) + { + INFO_PRINTF3(_L("%d [%S]"), atomWalker->StackCount(), unicodeAtom); + } + + delete unicodeAtom; + unicodeAtom=NULL; + + // Try going down + if (atomWalker->PeekDown() == NULL) + { + // Try going across + if (atomWalker->WalkAcrossL(EFalse) == NULL) + { + // Might not find something on the way up + bFound = EFalse; + + // Try going up + while (atomWalker->StackCount() > 1) + { + atomWalker->WalkUpL(); + CImapAtom* upAtom = atomWalker->Current(); + + if (upAtom && atomWalker->WalkAcrossL(EFalse) != NULL) + { + // found something! + bFound = ETrue; + break; + } + } + } + } + else + { + atomWalker->WalkDownL(); + } + } + + CleanupStack::PopAndDestroy(atomWalker); + + INFO_PRINTF1(_L("Complete")); + } +CTestSuite* CTestImapAtomBuilder::CreateSuiteL(const TDesC& aName) +// static + { + SUB_SUITE; + ADD_TEST_STEP(TestWalkerL); + END_SUITE; + }